背景

  • 之前通过公众号了解到了Aidlux,机缘巧合的情况下参加了『In AidLux,To AIoT』AI应用案例征集活动,在活动过程中,初识了Aidlux平台,该平台可以极大的方便深度学习落地,为智慧工厂,智慧交通等提供了快捷的落地方案。
  • 本人最近因为公司需要,开始入门深度学习领域,随着一点点的深入,感觉深度学习是十分有意思的一个学科。关注了很多从事机器学习,深度学习这方面的博客,公众号等。在学习过程中,学习到了江大白老师的《万字长文手把手教你YoloV5制作家庭安防告警系统》,满满的干货,里面的技术要点清晰明了,对于刚入门深度学习的技术人员十分友好。随着学习的深入,参加了最近Aidlux组织,由江大白老师主讲的Aidlux&AI实战训练营,在本次学习中学习了越界识别功能,由人体检测+人体追踪+目标检测组成,本篇博文记录一下开发过程中是如何一步步实现越界识别功能

运行环境

硬件环境 软件环境
Windows系统电脑 LabelImg
安卓手机 YOLOV5
喵提醒SDK
Aidiux

总体功能

该系统实现的主要功能需求如下:

(1)数据采集与预处理:

Yolov5 目标检测有部署简单、速度快、易上手等优点。本系统选择 Yolov5 系列中深度最小,特征图宽度最小的 Yolov5n。本系统需要实现对复杂场景中的行人视频进行采集,数据来源有两部分,一部分是使用安卓手机的摄像机进行实时录像和检测,还有一部分是从网络中收集的MOT16视频数据集-东京街道人流量统计的公开数据集(注:来源于旷视的Crowdhuman数据集),然后使用labelImg对采集得到的照片标注然后将标注完成的数据输入YOLOv5目标检测模型中,提取人体特征,训练得到行人模型。

(2)行人检测:

本模块主要是使用上一步得到的行人模型进行推理。

(3)人体轨迹追踪:

常规来说,⽬标追踪主要分成两个类别:⼀种是多⽬标追踪,⼀种是单⽬标追踪。 两者的区别从字⾯意思上也很好理解,多⽬标追踪主要是针对视频中所有的⽬标都进⾏检测+追踪分析。本博文讲的越界识别,主要是监测视频画⾯中,某⼀个区域是否有⼈越界的情况。并且这时的相机采⽤ 的主要是固定枪机摄像头,相机⻆度是不变的,且监测的是多个⼈,因此我们主要采⽤多⽬标检测的方法,即MOT(Multi-Object Tracking)。

(3)结果展示:

最后通过喵提醒SDK,把越界的人员数量实时推送的相关人员的微信上,进行快速的响应及处理

功能模块设计

(1)LabelImg

Labelimg是一款可视化图片标注工具,YOLOV5目标检测网络所需要的人体数据集,均需要借此工具标定图像中的目标,生成的txt文件是遵循YOLOV5格式的。从github上下载源码后,安装PyQt+lxml,运行labelimg.py即可打开窗口,进行数据标注工作。本次使用的labelImg,进行了二次开发,优化了整体布局样式,汉化了界面,新增了自动标注,格式转换等新功能(想要的伙伴,可以关注我一下,私信获取)

(2)YOLOV5

YOLOV5模型框架图

YOLOV5是在 COCO 数据集上预训练的一系列对象检测架构和模型,代表Ultralytics 对未来视觉 AI 方法的开源研究(官方解释)。从github上下载源码后,安装requirements.txt文件中程序运行所依赖的python包后,导入自定义训练数据集,调整对应的参数后,运行train.py和detect.py进行自定义模型的训练及推理,运行export可以转换为多种类型的模型文件。(最新YOLOV5版本已更新至V6.2版本,新增图片分类模型,及训练代码)

训练完成后,推理效果

(3)多目标检测:

多目标追踪算法包括:sort多目标算法、deepsort多目标检测算法、Bytetrack多目标检测算法。该博文中我们使用最后一个多目标检测算法-Bytetrack,该算法会尽量减少人物之间的遮挡而带来的目标的丢失
三者多⽬标追踪其中涉及了⼤量的逻辑⽅式,⼤家感兴趣也可以好好研究下,也找了⼀些不错的⽂章,可以参考:
(1)带你⼊⻔多⽬标跟踪(⼀)领域概述 7
(2)带你⼊⻔多⽬标跟踪(⼆)SORT&DeepSORT
(3)带你⼊⻔多⽬标跟踪(三)匈⽛利算法&KM算法
(4)带你⼊⻔多⽬标跟踪(四)外观模型 Appearance Model
(5)ByteTrack: Multi-Object Tracking by Associating Every Detection Box阅读笔记
当然,客观来说,多⽬标追踪在遮挡情况下,还存在很多的交错丢失的问题,这也是业内⽬前的⼀个研究瓶颈。

以越界识别为例子,我们主要是设置一个感兴趣的区域,比如下图中绿色区域,当感兴趣的区域内识别到人体的时候,就要重点关注,完成技术功能,(可以使用画图功能,确定区域在图片中的坐标信息)

当⼈体在线段的下⽅时,⼈体状态是-1 。当⼈体在线段的上⽅时,⼈体状态是 1。我们这⾥主要统计从- 1 ,到 1 区域的⼈流的数量。

(4)喵提醒

完成越界人员统计后,需要一个工具将数据信息推送到相应人员的手机上,能实时收到应急消息,这个功能可以通过喵提醒公众号来实现,喵提醒是一个提供提醒服务的微信公众号。用户在这创建提醒后可以得到一个网址,将网址交给提供服务的开发者,开发者只需访问这个网址就能给用户发送手机提醒,十分的方便。

(5)AidLux

是基于ARM架构的跨生态(Android/鸿蒙+Linux)一站式AIoT应用快速开发和部署平台APP。通过共享 Linux 内核实现Android 和 Linux 生态融合,为单一设备同时提供Android和Linux运行环境,集成国际主流AI框架和多种开发环境、后台服务程序、编译器及图形开发组件,无须配置开箱即用,极大地简化了开发步骤;自主研发的AI智能加速技术可实现CPU+GPU+NPU智能加速,大幅提高AI应用运行效率;平台广泛而深度的适配外设接口,省去大量调试工作;内置完整的跨平台桌面和命令行终端连接(SSH),一个平台完成多终端协同开发、测试、部署。将上述整合后的代码上传后,运行即可。通过软件商城下载搜索即可。

此时调用手机摄像头开始监控,当检测人员越界后,会接收到一条数据信息,查看人员计数情况

完整代码

# aidlux相关
# 下面的utils函数包和track函数包要到公众号“AidLUx”上回复lesson5
from cvs import *
import aidlite_gpu
from utils import detect_postprocess, preprocess_img, draw_detect_res, scale_coords, process_points, is_in_poly, \is_passing_line
import cv2
# bytetrack
from track.tracker.byte_tracker import BYTETracker
from track.utils.visualize import plot_tracking
import requests  # 库的引用
import time# 加载模型
model_path = '/home/lesson4_codes/aidlux/best-fp16.tflite'
in_shape = [1 * 640 * 640 * 3 * 4]
out_shape = [1 * 25200 * 6 * 4]# 载入模型
aidlite = aidlite_gpu.aidlite()
# 载入yolov5检测模型
aidlite.ANNModel(model_path, in_shape, out_shape, 4, 0)
# 初始化文件
tracker = BYTETracker(frame_rate=30)
track_id_status = {}
cap = cvs.VideoCapture("/home/aidlux/person.mp4")
frame_id = 0
count_person = 0
while True:frame = cap.read()if frame is None:print("Camera is over!")# 填写对应的喵码id = 'xxxxx'# 填写喵提醒中,发送的消息,这里放上前面提到的图片外链text = "越界人流统计:" + str(count_person)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)breakframe_id += 1if frame_id % 3 != 0:continue# 预处理img = preprocess_img(frame, target_shape=(640, 640), div_num=255, means=None, stds=None)# 数据转换:因为setTensor_Fp32()需要的是float32类型的数据,所以送入的input的数据需为float32,大多数的开发者都会忘记将图像的数据类型转换为float32aidlite.setInput_Float32(img, 640, 640)# 模型推理APIaidlite.invoke()# 读取返回的结果pred = aidlite.getOutput_Float32(0)# 数据维度转换pred = pred.reshape(1, 25200, 6)[0]# 模型推理后处理pred = detect_postprocess(pred, frame.shape, [640, 640, 3], conf_thres=0.4, iou_thres=0.45)# 绘制推理结果res_img = draw_detect_res(frame, pred)# 目标追踪相关功能det = []# Process predictionsfor box in pred[0]:  # per imagebox[2] += box[0]box[3] += box[1]det.append(box)if len(det):# Rescale boxes from img_size to im0 sizeonline_targets = tracker.update(det, [frame.shape[0], frame.shape[1]])online_tlwhs = []online_ids = []online_scores = []# 取出每个目标的追踪信息for t in online_targets:# 目标的检测框信息tlwh = t.tlwh# 目标的track_id信息tid = t.track_idonline_tlwhs.append(tlwh)online_ids.append(tid)online_scores.append(t.score)# 针对目标绘制追踪相关信息res_img = plot_tracking(res_img, online_tlwhs, online_ids, 0, 0)# 1.绘制统计人流线lines = [[167, 541], [1191, 539]]cv2.line(res_img, (167, 541), (1191, 539), (255, 255, 0), 3)# 2.计算得到人体下方中心点的位置(人体检测监测点调整)pt = [tlwh[0] + 1 / 2 * tlwh[2], tlwh[1]]  # 以人头为识别点# 3人体和违规线的判断(状态追踪)track_info = is_passing_line(pt, lines)if tid not in track_id_status.keys():track_id_status.update({tid: [track_info]})else:if track_info != track_id_status[tid][-1]:track_id_status[tid].append(track_info)# 4.判断是否有track_id越界,有的话保存成图片# 当某个track_id的状态,上一帧是-1,但是这一帧是1时,说明越界了if track_id_status[tid][-1] == 1 and len(track_id_status[tid]) > 1:# 判断上一个状态是否是-1,是否的话说明越界,为了防止继续判别,随机的赋了一个3的值if track_id_status[tid][-2] == -1:track_id_status[tid].append(3)# cv2.imwrite("overstep.jpg",res_img)count_person += 1  # 之前已经定义count_person=0,不然会报未定义的错# 5.再判断当前一个状态为1,后一个状态为-1时的情况if track_id_status[tid][-1] == -1 and len(track_id_status[tid]) > 1:# 判断上一个状态是否是1,是否的话说明越界,为了防止继续判别,随机的赋了一个3的值if track_id_status[tid][-2] == 1:track_id_status[tid].append(3)# cv2.imwrite("overstep.jpg",res_img)count_person += 1cv2.putText(res_img, "Pereson_count in the gate of Hospital:" + str(count_person), (50, 50),cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 255), 3)cvs.imshow(res_img)

Aidlux实践-快速实现街道人流量统计系统相关推荐

  1. 基于Aidlux平台的街道人流量统计开发与测试

    一.前言 目前我国智慧城市的场景划分覆盖面很广,比如智慧园区.智慧工地.智慧交通.智慧机场等等.不同的智慧场景,其覆盖范围都不一样,但通常而言,智慧城市行业主要是对空间内的人.车.物进行识别分析. 本 ...

  2. 大数据时代,人流量统计系统如何提高商业价值

    由于近几年疫情的影响,'人流量'成了最大的安全隐患,像商超.景区.服务区等这些人流量较大的场所,虽然密集的人流量能给商家带来庞大的商机,但是同时也增加了安保.服务等管理上的难度,如果能掌握正确的客流量 ...

  3. 基于AidLux平台的医院进出口人流量统计案例开发与测试

    1.环境配置 1.1.跨平台应用系统Aidlux AIdlux系统是基于ARM架构的跨生态(Android/鸿蒙+Linux)一站式AIOT应用开发平台.实际应用到现场的时候,通常会以几种形态:GPU ...

  4. 简易人流量统计c语言编程,人流量统计系统设计.doc

    人流量统计系统设计.doc SOUTHWESTUNIVERSITYOFSCIENCEANDTECHNOLOGY本科毕业设计(论文)基于红外传感器的公共场所人流量统计系统设计学院名称信息工程学院专业名称 ...

  5. 基于Arduino UNO人流量统计DIY

    文章目录 DIY图片 一. 电路设计与程序调试 二.接线 三.代码 DIY图片 一. 电路设计与程序调试 (1)Arduino UNO Arduino UNO是Arduino USB接口系列的最新版本 ...

  6. 基于Yolov5+Aidlux的人流量统计测试

    最近几天跟着AI界的大V江大白体验了一把基于Yolov5框架实现人流统计,觉得现在实现AI真的是触手可及,至少之前没有这么觉得过.个人转行进入教育行业将近4年,在此期间虽然也自娱自乐搞一些AI项目,但 ...

  7. 基于PaddleDetection实现人流量统计人体检测

    人流量统计 1. 项目概述 在地铁站.火车站.机场.展馆.景区等公共场所,需要实时检测人流数量,当人流密度过高时及时预警,并实施导流.限流等措施,防止安全隐患. 在人流密度较高的公共场所,使用Padd ...

  8. 【解决方案】TSINGSEE客流统计系统技术架构与使用场景解析

    一.客流统计系统介绍 TSINGSEE客流统计系统是一种运用视频图像分析技术进行人流量统计的视频智能化应用系统.通过内置算法对视频中人数和人群流动方向等信息进行有效统计并生成报表,用户可以在掌握监控区 ...

  9. 小型职工工作量c语言,计算机c语言职工工作量统计系统.doc

    <C语言课程设计>报告 题目:职工工作量统计系统 班 级: 学 号: 姓 名: 指导老师: 成 绩: 目 录 1.课程设计的目的和意义··························· ...

最新文章

  1. 面试官:你能说说MyBatis拦截器原理吗?
  2. python一行代码的威力
  3. 初学python的30个操作难点汇总(入门篇)希望对你有帮助
  4. java常见类加载器,面试必备
  5. jQuery UI Autocomplete示例(一)
  6. Spring Cloud Alibaba源码 - 21 Ribbon 源码解析
  7. C#~异步编程再续~await与async引起的w3wp.exe崩溃-问题友好的解决
  8. 但见高通笑,哪闻英特尔哭?
  9. Router OS 全攻略
  10. 稀疏矩阵相乘-Python版
  11. 【实用插件】精心挑选6款优秀的 jQuery Tooltip 插件
  12. pytorch搭建卷积神经网络【第三课_自己搭建对抗神经网络】
  13. 发那科服务器显示021,发那科FANUC机器人示教器启动黑屏无显示当天修好故障
  14. 、用ecshop整合淘宝客api改造用于淘宝客程序
  15. 网站中CSS是实现什么功能的,什么是CSS,其主要作用是什么
  16. unity3d 700种 材质球_活动策划:这10种气球创意玩法,让活动现场的布置更高级。...
  17. 20162330 第三周 蓝墨云班课 泛型类-Bag 练习
  18. API MISUSE: <CBCentralManager: 0x000000000> can only accept this command while in the powered on
  19. 2020牛客暑期多校训练营(第九场) Groundhog and 2-Power Representation
  20. Python中条件判读语句if的使用详解

热门文章

  1. Node对象的一些方法
  2. android 抽奖动画下载,召唤抽奖系统正式版
  3. deepin改无盘服务器,UbuntuDeepin系统上搭建nfs服务器
  4. 【云原生 | Kubernetes 系列】1个POD2个container实现Wordpress K8s部署
  5. 微信域名检测接口文档
  6. python经纬度 县信息_10分钟教你用Python获取百度地图各点的经纬度信息
  7. Android电池信息
  8. 获取ios设备的电池信息
  9. java foreach循环语句_Javaforeach语句
  10. 动态规划练习三:换钱问题(动态规划概念理解与记忆搜索法概念理解对比)