5个课时,落地AI应用!
欢迎大家来到AidLux零基础边缘端智慧安防训练营~
在第三节课,我们学习了用目标检测yolov5训练一个人体检测模型。
在第四节课,又将Yolov5+目标追踪Bytetrack结合,进行了2种算法的串联。
有了检测和追踪的结合,我们就可以实现AI项目中的很多功能了。
比如越界识别,判断在某块区域的监测过程中,是否有人越过这个区域。
在很多智能相机中,常常会内置这个功能,应用的场景非常多。
比如客流统计,通过对人流的追踪,判断越过某条统计线段进出的有多少人。
比如车辆违停检测,统计停靠在某个区域的车辆停留时间,判断是否违规停放。
tips:上面的举例中使用的目标检测和目标追踪算法功能原理上是一样的,只是检测的目标和设置的业务功能不同。
本次训练营,主要针对越界识别的功能进行讲解和实现,在最后的作业环节,大家可以跟着实现客流统计的功能。本节课的内容框架:
1 越界监测区域绘制
2 越界识别功能实现
3 越界识别&系统告警
4 业务逻辑和代码实现
5 AidLux认证开发者
课程五
想要实现越界识别,需要检测是否有人违规进入某个限定区域。
举个例子,我们想要实现一个预防坠湖的功能,首先需要在沿湖范围设置一个限定区域。
当在我们限定区域内识别到人体的时候,就需要重点关注,判断风险和异常。
显示生活中,很多园区的各个边界都设置有监测区域,俗称电子栅栏。当识别到出现翻越情况,会在第一时间告警提示。
不难理解,想要实现越界翻越识别业务功能,首先要绘制一个监测区域,即电子栅栏。
在训练营代码中,围栏是手动绘制的,主要基于point这4个点,绘制了一个多边形区域。下方的代码,也在aidlux文件夹的yolov5_overstep.py中。
这四个点是如何确定的呢?我们先讲一下最基础的办法。
通常会从视频文件中保存一张单帧的图片,比如使用aidlux文件夹下面的video_to_image.py文件,运行后会保存一张图片到lesson5_codes文件夹下方,即image.jpg。
我们先把图片下载到电脑上,再使用画图软件打开image.jpg。
找到图片中我们想监测的区域,点击4个点的坐标记录下来,即图片上的4个点坐标。
然后在video_to_image.py的代码中,添加监测区域信息的代码,查看一下显示区域是否可以。
运行后可以看到,我们已经在监控视频中添加上监测的越界区域了。
相较于手动绘制监测区域,在实际的业务系统中,通常会做成用户自行配置的界面方式,让用户可以通过拖拽的方式快速配置。
了解完监测区域的绘制后,我们再来整体实现越界识别的功能。
首先将第四节课中用到的代码yolov5_bytetrack.py进行修改,变成yolov5_overstep.py。
并将绘制区域的坐标和功能,写到之前检测追踪代码的后面。
这时就可以在之前检测追踪的效果上,也绘制上监测区域了。
在实际业务场景中,通常情况下判断人体越界的点,主要用的是脚部的点。
由于不同的目标检测算法,最后的后处理不同,得到的检测框的信息可能是多样化的。
本次训练营中用的yolov5算法,会得到检测框的四个点信息,[左上角点x,左上角点y,宽w,高h]。
所以我们需要通过代码,转换成人体下方的点,即[左上角点x+1/2*宽w,左上角点y+高h]。
转换的方式也非常简单,大家看可以参考下方的这一行代码。
有了监测的人体的坐标信息,我们还需要根据人体是否在监测区域内,将人体的状态进行区分。
因此第三部分的代码,主要是判断每个人的运动状态,将每个人运动轨迹中,每一帧在图片上的状态统计下来。
为了便于演示测试,我们将人体在监测区域内设置为1,不在监测区域内设置为-1。
这里主要是第三部分的代码,判断每个人体每一帧的状态,是1还是-1,并将所有的状态,保存到track_id_status里面。
当在第三部分,知道每个人在移动轨迹中的状态时,就可以知道是否越界了。
比如某个人当前一帧的状态是-1,后一帧的状态变成1时,说明刚刚进入越界区域,这时就将当前的图片进行保存,留作告警记录。
一般在实际应用的项目业务系统中,会出现一个告警弹窗。比如某个位置出现告警信息,便于安排工作人员前去查看。
为了更加贴近实际,我们采用一种简单且实用的方式,即通过微信公众账号提醒等的方式,实现告警弹窗。
在后面大作业人流统计分析中,也会使用到。
(1)注册并创建账号
关注并“注册账号”。
(2)注册完成后,回到公众号页面,点击菜单栏的“提醒”,并选择“新建”。
(3)填写新建提醒的相关信息,点击最后的“保存”。页面会自动加载,中间的部分会跳出自己账号专属对应的“喵码”和“网址”,后面的代码中主要用到喵码的功能。
为了测试效果,我们又写了一个测试代码,放在aidlux/miaotixing.py文件夹中。
需要注意的是,这里的id是测试账号的id,大家需要修改成自己的,否则会收不到推送。
另外text信息,可以修改成自己需要的告警文字,我们修改成“有人越界识别!!”的信息。
运行代码后,会在微信上会收到一条“有人越界识别!!”的告警信息。
我们将前面越界告警的代码和提醒功能进行结合,当有人越界的时候,直接推送告警信息到手机上。
这时我们就可以通过查看手机及时知道有哪些人越界了。
到了这里,要恭喜各位同学,大家已经在训练营的课程中:
✔ 实现了利用人体数据集训练人体检测模型;
✔ 并和bytetrack追踪结合,实现检测追踪的效果;
✔ 通过设置监测区域,达到越界识别+喵提醒告警的功能。
大家可以运行前面aidlux文件夹中yolov5_overstep.py测试一下,记得将喵码修改成你自己的。
完成功能后,我们将整个流程全都移植到AidLux边缘设备软件上,实现边缘端越界告警的效果。
就像lesson1中讲解的,我们是用电脑和AidLux进行编程结合,实现的算法业务功能。
在实际项目中,获取的主要是摄像头的实时视频流,跟训练营采用视频文件的形式稍有不同,但整体差别不大。
除了找一台闲置的手机一直跑项目之外,还可以用AidBox的边缘设备快速的将自己编写的代码,落地到项目的使用中去。
因为算力更强,可接入的视频流更多。
来到本次训练营的末尾阶段,我们给大家准备了一个完整的实战作业:
使用人体检测+人体追踪+线段统计的方式,针对视频实现人流统计,并通过喵提醒告知人流统计的数量。
比如下方图片中,绘制了统计的线段,针对此线段往来的人群,进行客流统计。
最终达到下方视频截图的效果。
其实整体实现的逻辑也很简单,和前面越界识别的实现很相似,主要分为五个部分:
(1)人流统计越界线段绘制
前面是绘制越界区域,这里则是绘制统计人流的线段,主要采用cv2.line的方式。
(2)人体检测统计点调整
前面讲了分析人体检测框下方中心点,和越界区域的位置关系,这里也是一样的。
主要分析人体下方中心点,和人流统计线段的位置关系,因此也再修改一下统计区域。
(3)人体和线段的位置状态判断
这里主要分析人体下方点,和统计线段的位置关系,这部分的代码在utils.py的is_passing_line函数中:
当人体在线段的下方时,人体状态是-1;
当人体在线段的上方时,人体状态是1。
我们这里主要统计从-1到1区域的人流的数量。
实现的代码如下:
前面还需要有一些初始化的函数:
(4)人流统计分析判断
当人体的状态,从-1变化到1的时候,就统计为人员越线了。
并在图片的左上方,统计人流计数的实时效果。
(5)提醒发送
当整个视频跑完后,就可以得到客流统计整体的数据。
为了及时知道客流的信息状态,我们也可以将最后的结果,以喵提醒的方式进行发送。
这部分的代码,放在最前面的图片采集中。
前面还有两个库(times、requests)引用:
在这里已经给出了比较明显的人流统计的代码提示了。
大家可以按照整体的业务逻辑,编写一个人流统计的代码,将各个板块进行串联,调试,里面的各种颜色也都可以调整。
最终统计得到的效果是:
在视频运行完后,手机上还会收到一个提醒提示。
本节课的内容基本结束了,为了巩固学习成果,大家可以完成一个作业任务。
4.3.1 作业流程
作业最终实现的是使用人体检测+人体追踪+业务逻辑,完成人流统计的业务功能。
完成作业的整个流程,主要分为两个部分:
(1)代码实现
大家可以参考前面的代码示意,完成整体人流统计项目的开发和实现。
(2)文章编写&分享
将完成整体人流统计项目的开发和实现的过程发布。
(3)文章参考
参考作品模板看这里
4.3.2 作业奖励
完成本次训练营的学习并完成最终作业的同学,可以分享作品。
AidLux认证开发者计划正式开启
大家可以在这里交流互动,还有本节课所需的数据集、资料包。
本次智慧安防训练营到此结束了,感谢大家的学习,也期待大家的作品。
用AidLux,每个人都能轻松落地AI应用。