本文正在参加『In AidLux,To AIoT』AI应用案例征集活动
背景
- 伴随着中国计划生育政策的实施,传统的核心家庭结构发生变化,4-2-1的家庭结构成为主流,家庭规模日趋小型化,打破了传统上的三代人甚至四代人同居的家庭模式。同时现代社会中老人和子女都要求有自己的“自由空间”,因此纯老家庭和独居老人的社会现象成为社会各届关注的焦点。家庭养老的功能日益削弱,原来由家庭承担的老人赡养功能转向社会养老服务,独居老人成为一类社会问题而倍受关注。
- 在智能视频监控技术领域中,对于老年人摔倒的检测是计算机视觉的难点问题。在监控场景中,及时发现老年人的摔倒并提醒相关人员处理,能够有效减轻老年人因为意外摔倒带来的后果,更好的保护老年人的人身安全,最大程度减低突发事件所带来的伤害
- 本人最近因为公司需要,开始入门深度学习领域,随着一点点的深入,感觉深度学习是十分有意思的一个学科。关注了很多从事机器学习,深度学习这方面的博客,公众号等。在学习过程中,学习到了江大白老师的《万字长文手把手教你YoloV5制作家庭安防告警系统》,满满的干货,里面的技术要点清晰明了,对于刚入门深度学习的技术人员十分友好。因此利用其中的技术点,把之前的一些想法落地,本篇博文记录一下开发过程中是如何一步步实现人体姿态摔倒检测
运行环境
硬件环境 | 软件环境 |
---|---|
Windows系统电脑 | LabelImg |
安卓手机 | YOLOV5 |
七牛云平台SDK | |
喵提醒SDK | |
Aidiux |
需求设计
总体功能
该系统实现的主要功能需求如下:
(1)数据采集与预处理:
Yolov5 目标检测有部署简单、速度快、易上手等优点。本系统选择 Yolov5 系列中深度最小,特征图宽度最小的 Yolov5s。本系统需要实现对复杂场景中的行人跌倒视频进行采集,数据来源有两部分,一部分是使用安卓手机的摄像机进行实时录像和检测,还有一部分是从网络中收集的针对摔倒检测的公开数据集,然后使用labelImg对采集得到的照片进行摔倒姿态和非摔倒姿态的标注然后将标注完成的数据输入YOLOv5目标检测模型中,提取人体行为特征,训练得到跌倒检测模型。
(2)跌倒检测:
本模块主要是使用上一步得到的摔倒检测模型进行推理,检测到跌倒之后,把照片中的人标注出跌倒的状态,保存并上传七牛云做数据存储。
(3)结果展示:
最后通过喵提醒SDK,把摔倒的图片实时推送的相关人员的微信上,进行快速的响应及处理
⒉软件流程
功能模块设计
(1)LabelImg
Labelimg是一款可视化图片标注工具,YOLOV5目标检测网络所需要的摔倒数据集,均需要借此工具标定图像中的目标,生成的txt文件是遵循YOLOV5格式的。从github上下载源码后,安装PyQt+lxml,运行labelimg.py即可打开窗口,进行数据标注工作。
(2)YOLOV5
YOLOV5是在 COCO 数据集上预训练的一系列对象检测架构和模型,代表Ultralytics 对未来视觉 AI 方法的开源研究(官方解释)。从github上下载源码后,安装requirements.txt文件中程序运行所依赖的python包后,导入自定义训练数据集,调整对应的参数后,运行train.py和detect.py进行自定义模型的训练及推理,运行export可以转换为多种类型的模型文件。
(3)七牛云
在七牛云平台使用对象存储Kodo功能存储后端数据,注册完成后,点击左侧,选中“对象存储”。
点击空间管理,新建空间输入名称,并将其设置为公开访问。
创建完成后,点击进入刚刚创建的空间,点击进入文件管理,上传一张本地文件测试效果。
上传完成后,点击图片详情,可以找到上传图片的外网链接,将其复制到手机或者电脑端的浏览器中打开预览
完成后可以通过七牛云SDK,填入刚才注册的空间的配置信息,即可通过代码完成上传功能
(4)喵提醒
完成外网存储照片后,需要一个工具将外网存储的照片推送到相应人员的手机上,能实时收到应急消息,这个功能可以通过喵提醒公众号来实现,喵提醒是一个提供提醒服务的微信公众号。用户在这创建提醒后可以得到一个网址,将网址交给提供服务的开发者,开发者只需访问这个网址就能给用户发送手机提醒,十分的方便。
(5)AidLux
是基于ARM架构的跨生态(Android/鸿蒙+Linux)一站式AIoT应用快速开发和部署平台APP。通过共享 Linux 内核实现Android 和 Linux 生态融合,为单一设备同时提供Android和Linux运行环境,集成国际主流AI框架和多种开发环境、后台服务程序、编译器及图形开发组件,无须配置开箱即用,极大地简化了开发步骤;自主研发的AI智能加速技术可实现CPU+GPU+NPU智能加速,大幅提高AI应用运行效率;平台广泛而深度的适配外设接口,省去大量调试工作;内置完整的跨平台桌面和命令行终端连接(SSH),一个平台完成多终端协同开发、测试、部署。将上述整合后的代码上传后,运行即可。
此时调用手机摄像头开始监控,当检测到老年人摔倒后,会接收到一条告警信息,同时点击照片地址,就可以查看详细情况
完整代码
``` # 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
配置七牛云信息
access_key = “ToegUwuWKGV5RujGM_R4dnluF-Gy8-QkN8sSBLf2”
secret_key = “dkrQ6Y70nOZEJ5Lx7lk_lVctSBvlMI6Z1NBgZ2-M”
bucket_name = “aidlux2022”
bucket_url = “rgcr52hj7.hn-bkt.clouddn.com”
access_key = “fpvMVRBlnPGL4g9ZY7io21svbI0xF6UqWL31sWC9”
secret_key = “5MTklQebT48iWeaX0D4fdy9kMJRQmPfo_OdDY4BL”
bucket_name = “sun2407”
bucket_url = “rh3iwyndv.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(“detect_image.jpg”, res_img)
person = 0
需要上传到七牛云上面的图片的路径
image_up_name = “detect_image.jpg”
上传到七牛云后,保存成的图片名称
timestr = time.strftime(“%H%M%S”)
image_qiniu_name = f"detect_image_{timestr}.jpg"
#image_qiniu_name = “detect_image_2023.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 = ‘tCCe5mP’
填写喵提醒中,发送的消息,这里放上前面提到的图片外链
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)
cvs.imshow(res_img)
<h1>总结</h1>
<p>感谢江大白老师在过程中的答疑解惑,最后祝大家练得好丹</p>