基于AidLux平台和七牛云、喵提醒工具实现课室人头计数系统

本文正在参加『In AidLux,To AIoT』AI应用案例征集活动

**导读:**说起人工智能,首先映入眼帘的,一定会是:1997年国际象棋机器“深蓝”战胜世界冠军卡斯帕罗夫和2016年围棋棋王柯洁三次被AlphaGo击败的场景。这两次人工智能历史上的标识性事件,让人们开始感叹,人工智能的发展已经越来越接近各种机器人的电影大片了。人工智能应用在语音识别,图像人脸识别、智慧安防、工业视觉、无人驾驶等方面越来越接近人们的生活。本文也将走进生活,用YOLOv5算法和AidLux平台来实现课室人头计数系统。

一、AidLux平台介绍

2017年开始,“AIoT”开始逐渐被大众所熟知。边缘计算设备作为分析处理数据的基础支撑,在该领域中的作用也日益凸显。凭借小体积、高性能、低功耗等先天优势,ARM在边缘计算兴起这波浪潮中发展迅速,并汇集了苹果、高通、联发科等企业在移动智能设备市场“大杀四方”。但跟移动设备市场不同,AIoT领域存在着严重的应用场景碎片化问题,软件适配、优化成本和AI项目开发、迁移的门槛居高不下。导致强如高通这样的企业,在该领域内的应用落地案例也屈指可数。如今,这样的困扰不复存在。AidLux针对高通平台进行了深度适配和全面优化,在软件层面补足和提升了高通芯片在AIoT方面的能力,助力企业快速切入AIoT万亿市场。

AI开发依赖开发环境和框架,AidLux集成了全球10大主流AI框架(TensorFlow、PaddlePaddle、NCNN、TNN、MNN、PyTorch、Caffe、MXNet、MindSpore、OpenCV)和AI应用所依赖的各种科学计算库,并做了全面的环境部署、适配和整合优化,无需配置。

此外,AidLux进行CPU资源调度优化,多进程开展模型的预处理、AI推理和后处理,多进程推理多模型任务,使用CPU+GPU并行处理,并提供CPU+GPU+NPU综合调度,支持算子补全,兼容更多的模型转换和加速处理。AidLux还拥有统一编程接口,将不同框架实现和不同厂商硬件调用进行解耦合,仅用Python一门语言即可开发部署AI应用。统一接口和低代码开发能够降低编程门槛,有效地解决异构模型转化繁琐和开发复杂问题,显著减少学习成本和项目开发、迁移成本,大幅缩短项目落地周期。

结合可视化性能监控平台,用户可直观查看YOLOv5、movenet、resnet50、mobilenetv2等模型在基于高通SoC的硬件上加速效果。

二、项目简介

在实际生活中,为了准确的统计出人数貌似是一件费时费力的事,例如在课堂上统计出勤人数,一个个点名十分占用课堂时间,并且经常会出现一人分饰多角的情况,往往统计结果和实际出勤有很大的出入,因此运用AI视觉技术,再基于AidLux平台部署实现实时的人数统计将会有很大的应用需求。从可行性分析,操作流程十分的简单,不需要专门的技术人员进行部署,只需要准备一台闲置的安卓手机,并且下载AidLux平台,注册七牛云个人账户,再关注喵提醒公众号,便可实时统计人数,实时收到短信提醒,也可为十分的方便了,具体流程如下:

三、具体步骤

1)准备代码&下载依赖

1、代码下载地址:

GitHub:https://github.com/Daniel4805/YOLOv5-statistics.git

百度云网盘:https://pan.baidu.com/s/1KYibXoZTSDdAa0_pHkHApA?pwd=brjo

2、根据代码中requirements.txt文件说明,下载依赖库:

pip install -r requirements.txt

2)修改参数

1、打开train_code/get_labels.py,修改数据集路径:(最好使用绝对路径,不容易出错)

运行后就可以看到类别数,以及标注的类别框的数量。

2、打开train_code/main.py文件,修改训练数据的路劲:

运行main.py文件,可以显示一些画有人头框的图片:

其中,0.2表示80%的数据进行训练,20%的数据进行验证:

3、在data文件夹下,新建一个head.yaml文件,作为训练人头数据集的参数设置:

4、修改train.py参数:

5、修改yolov5s.yaml:

3)开始训练模型

1、运行train.py文件,既可开始训练:

可以看到一共要训练299个模型,训练速度跟电脑显存有很大关系

如果出现以下提示信息报错:

可能说明电脑磁盘没有分配虚拟空间给模型测试,我们可以打开高级系统设置,根据提示配置

2、修改三个参数,运行detect.py,对训练结果进行测试,在runs/detect/exp最后一个文件夹中得到检测的效果图片:

4)七牛云注册并创建空间

1、登录七牛云官网:https://www.qiniu.com/,注册一个账号。

2、点击左上角的折叠栏,选择“对象存储Kodo”:

3、进入对象存储的管理页面,再点击左面的“空间管理”,点击新建空间,并输入“存储空间名称”,访问控制修改为“公开”。

4、编写代码接口qiniu_test.py:

先下载qiniu库,再按如下修改qiniu配置参数,将access_ksy,secret_key,bucket_name修改成自己的。

pip install qiniu

对应位置如下:

填写上相应的信息后,在Pycharm软件中运行qiniu_test.py文件,可以得到上传的图片的url信息。

复制URL,可在网页中打开,查看图片:

图片也会上传至七牛云平台:

5)设置微信提醒:喵提醒

目前为止,我们已经训练好了YOLOv5的人头检测的模型,并且可以将本地的图片上传至云空间,获得图片的外链,此时,我们还需要将统计人数的信息发送至手机微信,这样才能方便查看统计结果,所以我们可以使用微信公众号喵提醒来查看统计后的结果。

1、先注册个人账户

2、然后给公众号发信息(什么信息都可以,目的是激活服务):

3、新建提醒:

写好标题和描述,通知方式选公众号(因为是免费的),喵码是自动生成的:

4、编写miaotixing_test.py接口:

import time
import requests
import numpy
# import detect
from detect import *

填写对应的喵码

id = ‘tjXvHO4’

填写喵提醒中,发送的消息,这里放上前面提到的图片外链

ts = str(time.time()) # 时间戳
type = ‘json’ # 返回内容格式
request_url = "http://miaotixing.com/trigger?"

count = count

获取detect.py统计人数的值

for c in count:
c = c.cuda().data.cpu().numpy()
print(c)
headers = {
‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.47’}

text = "人头计数:" + "http://rhdbeqgut.hn-bkt.clouddn.com/head_test.jpg" + "\n" + "总人数:" + str(c)

result = requests.post(
    url=request_url + "id=" + id + "&text=" + text + "&ts=" + ts + "&type=" + type,
    headers=headers,
)
print(result)

值得注意的是,这里我们需要获取detect.py中统计出的人数再发送到手机上:

for c in count:
    c = c.cuda().data.cpu().numpy()
    print(c)
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.47'}
text = "人头计数:" + "http://rhdbeqgut.hn-bkt.clouddn.com/head_test.jpg" + "\n" + "总人数:" + str(c)

5、运行miaotixing_test.py,我们手机上就可以收到信息啦:

6)Android系统部署Aidlux平台:

上面的流程基本上是在PC端完成的,但是在实际的应用场景中,移动端肯定是比PC端更便捷的,那么如何将PC端的代码嫁接到移动端呢?Aidlux(https://aidlux.com/)就是一个能很好的将PC端和移动端连接起来的平台,其中最主要的好处是可以将PC端上写的python代码直接部署到移动端,不需要再将python转java或者c++,十分的方便,大大的节省了算法的部署。通过搭载AidLux,高通芯片可以直接用于AIoT领域,用户仅使用Python即可根据需求单独调用CPU、GPU和DSP/NPU。

1、下载aidlux软件:

需要准备一台Android系统的手机,然后在应用商城中搜索aidlux即可下载,不过软件本身占用的空间比较大,所以要保证自己的手机有足够的空间可以下载。

2、将移动端的aidlux与PC端的web连接:(注意移动端要和PC端连接同一个WiFi才行)

打开aidlux软件后,点击cloud_ip后,可以看到手机界面上会跳出可以在电脑上登录的IP网址。在电脑的浏览器上,随便输入一个IP,可以跳出Aidlux的登录页面,默认登录密码是“aidlux”。登录后就可将手机的系统投影到电脑上,任何操作和代码编写都是完全数据共通的,这样我们就可以将PC端的操作,直接应用到Aidlux的App中了。

3、将PC端的代码迁移到移动端:

打开文件管理器 ---> 进入home文件目录 ---> 点击右上角“upload” ---> 选择“Folder” ---> 将yolov5-master文件全部上传

4、安装相应的依赖包

打开终端,输入如下命令,就可以下载qiniu库:

pip3 install qiniu  -i https://pypi.tuna.tsinghua.edu.cn/simple

5、运行代码

打开刚刚上传的yolov5-master文件,找到aidlux文件,运行其中的yolov5.py

点击右上角的build ---> run now

# aidlux相关
from cvs import *
import aidlite_gpu
from utils import detect_postprocess, preprocess_img, draw_detect_res

七牛云相关

from qiniu import Auth, put_file
from qiniu import CdnManager
import time
import requests
import cv2

#喵提醒相关
from detect import *

配置七牛云信息

access_key = "DHualkKeHbMwvE2QqHLMcPS06NFB2kGLyXNDw8sa"
secret_key = "f9mEPo2snQrfHFx2nsjQuh-pCF_c1nnxgvVWGIZw"
bucket_name = "aidlux-statistics"
bucket_url = "rgumncpam.hn-bkt.clouddn.com"
q = Auth(access_key, secret_key)
cdn_manager = CdnManager(q)

将本地图片上传到七牛云中

def upload_img(bucket_name, file_name, file_path):
# generate token
token = q.upload_token(bucket_name, file_name)
put_file(token, file_name, file_path)

获得七牛云服务器上file_name的图片外链

def get_img_url(bucket_url, file_name):
img_url = ‘http://%s/%s’ % (bucket_url, file_name)
return img_url

加载模型

model_path = ‘yolov5s-fp16.tflite’

定义输入输出shape

in_shape = [1 * 640 * 640 * 3 * 4]
out_shape = [1 * 25200 * 85 * 4, 1 * 3 * 80 * 80 * 85 * 4, 1 * 3 * 40 * 40 * 85 * 4, 1 * 3 * 20 * 20 * 85 * 4]

载入模型

aidlite = aidlite_gpu.aidlite()

载入yolov5检测模型

aidlite.ANNModel(model_path, in_shape, out_shape, 4, 0)

cap = cvs.VideoCapture(0)
person = 0
while True:
frame = cap.read()
if frame is None:
continue

# 预处理
img = preprocess_img(frame, target_shape=(640, 640), div_num=255, means=None, stds=None)

aidlite.setInput_Float32(img, 640, 640)
# 推理
aidlite.invoke()
pred = aidlite.getOutput_Float32(0)
pred = pred.reshape(1, 25200, 85)[0]
pred = detect_postprocess(pred, frame.shape, [640, 640, 3], conf_thres=0.5, iou_thres=0.45)
res_img, person = draw_detect_res(frame, pred, person)

if person == 1:
    cv2.imwrite("runs/detect/exp/head_test.jpg", res_img)
    person = 0
    # 需要上传到七牛云上面的图片的路径
    image_up_name = "runs/detect/exp/head_test.jpg"
    # 上传到七牛云后,保存成的图片名称
    image_qiniu_name = "head_test.jpg"
    # 将图片上传到七牛云,并保存成image_qiniu_name的名称
    upload_img(bucket_name, image_qiniu_name, image_up_name)
    # 取出和image_qiniu_name一样名称图片的url
    url_receive = get_img_url(bucket_url, image_qiniu_name)
    print(url_receive)
    # 需要刷新的文件链接,由于不同时间段上传的图片有缓存,因此需要CDN清除缓存,
    urls = [url_receive]
    # URL刷新缓存链接,一天有500次的刷新缓存机会
    refresh_url_result = cdn_manager.refresh_urls(urls)

    # 填写对应的喵码
    id = 'tePqfHO'
    # 填写喵提醒中,发送的消息,这里放上前面提到的图片外链
    text = "告警图片:" + url_receive
    ts = str(time.time())  # 时间戳
    type = 'json'  # 返回内容格式
    request_url = "http://miaotixing.com/trigger?"

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.47'}

    result = requests.post(request_url + "id=" + id + "&text=" + text + "&ts=" + ts + "&type=" + type,
                           headers=headers)
    print(result)
cvs.imshow(res_img)

手机上就可以收到信息啦。

四、总结

本人也是刚毕业,刚接触AI行业,在机缘巧合下认识了大白老师,在大白老师的带领下参加了此次的活动,因为很多知识都不懂,经过了无数次对大白老师的骚扰下才勉强的写出这篇文章,记得大白老师说的最多的话就是“你是真的小白啊”,其实真的是小白,真的很多东西都不懂,但是遇到问题大白老师都能认真的回答,所以在这里十分感谢大白老师!文章中肯定有很多写的不好的地方,本人也还在不断的探索当中,也希望大家能够见谅,最后不管结果怎么样,也感谢举办方和大白老师能给我这次机会,我也会不断的努力,希望在AI行业能立足下去!

你好博主,请问编程零基础学这个难度大吗

感谢楼主

大神,想问一下编程难不难,准备开学了,我选的专业就是计算机

大神啊~说得好详细啊,求带啊!!!

大神,学成你这样要掉多少头发

真厉害,动起手来