AidLux · 2022年12月08日 · 四川

零基础边缘端智能安防训练营 | Lesson 5

5个课时,落地AI应用!

欢迎大家来到AidLux零基础边缘端智慧安防训练营~

在第三节课,我们学习了用目标检测yolov5训练一个人体检测模型。

在第四节课,又将Yolov5+目标追踪Bytetrack结合,进行了2种算法的串联。

有了检测和追踪的结合,我们就可以实现AI项目中的很多功能了。
比如越界识别,判断在某块区域的监测过程中,是否有人越过这个区域。
在海康、大华等很多智能相机中,常常会内置这个功能,应用的场景非常多。
比如客流统计,通过对人流的追踪,判断越过某条统计线段进出的有多少人。
比如车辆违停检测,统计停靠在某个区域的车辆停留时间,判断是否违规停放。

tips:上面的举例中使用的目标检测和目标追踪算法功能原理上是一样的,只是检测的目标和设置的业务功能不同。
本次训练营,主要针对越界识别的功能进行讲解和实现,在最后的作业环节,大家可以跟着实现客流统计的功能。本节课的内容框架:

1 越界监测区域绘制
2 越界识别功能实现
3 越界识别&系统告警
4 业务逻辑和代码实现
5 AidLux认证开发者

1. 越界监测区域绘制

想要实现越界识别,需要检测是否有人违规进入某个限定区域。
举个例子,我们想要实现一个预防坠湖的功能,首先需要在沿湖范围设置一个限定区域。

当在我们限定区域内识别到人体的时候,就需要重点关注,判断风险和异常。
57a7106a6e165e4d83c48cb57cae36ab.jpg

显示生活中,很多园区的各个边界都设置有监测区域,俗称电子栅栏。当识别到出现翻越情况,会在第一时间告警提示。
不难理解,想要实现越界翻越识别业务功能,首先要绘制一个监测区域,即电子栅栏。
在训练营代码中,围栏是手动绘制的,主要基于point这4个点,绘制了一个多边形区域。下方的代码,也在aidlux文件夹的yolov5_overstep.py中。
e489cfd6ebed863584a7049b6c77d737.png

这四个点是如何确定的呢?我们先讲一下最基础的办法。
通常会从视频文件中保存一张单帧的图片,比如使用aidlux文件夹下面的video_to_image.py文件,运行后会保存一张图片到lesson5_codes文件夹下方,即image.jpg。
568331444132758441525253d671459a.png

我们先把图片下载到电脑上,再使用画图软件打开image.jpg。
找到图片中我们想监测的区域,点击4个点的坐标记录下来,即图片上的4个点坐标。
de9aca7e3e316310db1f338e5e1d2363.png

然后在video_to_image.py的代码中,添加监测区域信息的代码,查看一下显示区域是否可以。
eb83e3b06d251068121b1cbc7768f3f6.png

运行后可以看到,我们已经在监控视频中添加上监测的越界区域了。
32263e198ad69b7b555f029e59938a3e.png

相较于手动绘制监测区域,在实际的业务系统中,通常会做成用户自行配置的界面方式,让用户可以通过拖拽的方式快速配置。

2. 越界识别功能实现

了解完监测区域的绘制后,我们再来整体实现越界识别的功能。

2.1 视频上越界识别绘制

首先将第四节课中用到的代码yolov5_bytetrack.py进行修改,变成yolov5_overstep.py。
并将绘制区域的坐标和功能,写到之前检测追踪代码的后面。
eaccd22a48ebb54a43a19590edc1a395.png

这时就可以在之前检测追踪的效果上,也绘制上监测区域了。

2.2 人体检测监测点调整

在实际业务场景中,通常情况下判断人体越界的点,主要用的是脚部的点。
由于不同的目标检测算法,最后的后处理不同,得到的检测框的信息可能是多样化的。
本次训练营中用的yolov5算法,会得到检测框的四个点信息,[左上角点x,左上角点y,宽w,高h]。
所以我们需要通过代码,转换成人体下方的点,即[左上角点x+1/2*宽w,左上角点y+高h]。
转换的方式也非常简单,大家看可以参考下方的这一行代码。
075e5efb5215bd48afcce72b38115582.png

2.3 人体状态追踪判断

有了监测的人体的坐标信息,我们还需要根据人体是否在监测区域内,将人体的状态进行区分。

因此第三部分的代码,主要是判断每个人的运动状态,将每个人运动轨迹中,每一帧在图片上的状态统计下来。

为了便于演示测试,我们将人体在监测区域内设置为1,不在监测区域内设置为-1。
02fe0fc25f84aacb50109bb19e443bec.png

这里主要是第三部分的代码,判断每个人体每一帧的状态,是1还是-1,并将所有的状态,保存到track_id_status里面。
ffc56a3b3089d2ec0b5da317f2255591.png

2.4 越界行为判断

当在第三部分,知道每个人在移动轨迹中的状态时,就可以知道是否越界了。

比如某个人当前一帧的状态是-1,后一帧的状态变成1时,说明刚刚进入越界区域,这时就将当前的图片进行保存,留作告警记录。
0d5bd95432ac0ff78c05c7faf08481f6.png

3. 越界识别&系统告警

一般在实际应用的项目业务系统中,会出现一个告警弹窗。比如某个位置出现告警信息,便于安排工作人员前去查看。

为了更加贴近实际,我们采用一种简单且实用的方式,即通过微信公众账号“喵提醒”、“Hi提醒”等的方式,实现告警弹窗。

在后面大作业人流统计分析中,也会使用到。这里以喵提醒为例。

3.1 新建喵提醒账号

(1)注册并创建喵提醒账号
关注“喵提醒”的公众账号,点击回复消息中最后的“注册账号”,填写手机号码进行注册,注册后跳到后台页面可以看到,今天还能收到提醒100条信息,基础上够用的。
51aa848300d77fb7fff0a56292ab1c7f.jpg

(2)注册完成后,回到公众号页面,点击菜单栏的“提醒”,并选择“新建”。
33e25e621d93811274d0ca621c1f1030.jpg

(3)填写新建提醒的相关信息,点击最后的“保存”。页面会自动加载,中间的部分会跳出自己账号专属对应的“喵码”和“网址”,后面的代码中主要用到喵码的功能。
5f0ce5e36a117960e66137451e7f63e6.png

3.2 喵提醒代码测试

为了测试喵提醒的效果,我们又写了一个测试代码,放在aidlux/miaotixing.py文件夹中。
需要注意的是,这里的id是测试账号的id,大家需要修改成自己的,否则会收不到推送。
b5656c629b66e99711a31d4b63ff7a06.png

另外text信息,可以修改成自己需要的告警文字,我们修改成“有人越界识别!!”的信息。
运行代码后,会在微信上会收到一条“有人越界识别!!”的告警信息。
9268d48647c11bb65aa1c73706a493c6.jpg

3.3 越界识别+喵提醒

我们将前面越界告警的代码和喵提醒功能进行结合,当有人越界的时候,直接推送告警信息到手机上。
01dea19c8d00f651cb1038b491359a50.png

这时我们就可以通过查看手机及时知道有哪些人越界了。

4. 业务逻辑和代码实现

4.1 业务逻辑实现

到了这里,要恭喜各位同学,大家已经在训练营的课程中:
✔ 实现了利用人体数据集训练人体检测模型;
✔ 并和bytetrack追踪结合,实现检测追踪的效果;
✔ 通过设置监测区域,达到越界识别+喵提醒告警的功能。
大家可以运行前面aidlux文件夹中yolov5_overstep.py测试一下,记得将喵码修改成你自己的。
完成功能后,我们将整个流程全都移植到AidLux边缘设备软件上,实现边缘端越界告警的效果。
7ca2739a83ba636bcf78019bb106985f.png

就像lesson1中讲解的,我们是用电脑和AidLux进行编程结合,实现的算法业务功能。

在实际项目中,获取的主要是摄像头的实时视频流,跟训练营采用视频文件的形式稍有不同,但整体差别不大。

除了找一台闲置的手机一直跑项目之外,还可以用AidBox的边缘设备快速的将自己编写的代码,落地到项目的使用中去。

因为算力更强,可接入的视频流更多。
0860941c049aa595ea0d046a4e523929.png

4.2 人流统计代码实现

来到本次训练营的末尾阶段,我们给大家准备了一个完整的实战作业:
使用人体检测+人体追踪+线段统计的方式,针对视频实现人流统计,并通过喵提醒告知人流统计的数量。
比如下方图片中,绘制了统计的线段,针对此线段往来的人群,进行客流统计。
81971dd46f43944996257195605e78cd.png

最终达到下方视频截图的效果。
f2bd8a566508ba18c3fc047968a39a0d.png

其实整体实现的逻辑也很简单,和前面越界识别的实现很相似,主要分为五个部分:
(1)人流统计越界线段绘制
前面是绘制越界区域,这里则是绘制统计人流的线段,主要采用cv2.line的方式。
d0365611f22bca9030e0d36ad795e1ef.png

(2)人体检测统计点调整
前面讲了分析人体检测框下方中心点,和越界区域的位置关系,这里也是一样的。
主要分析人体下方中心点,和人流统计线段的位置关系,因此也再修改一下统计区域。
726c0f953a616b9f40fc1308fcfdcde4.png

(3)人体和线段的位置状态判断
这里主要分析人体下方点,和统计线段的位置关系,这部分的代码在utils.py的is_passing_line函数中:
当人体在线段的下方时,人体状态是-1;
当人体在线段的上方时,人体状态是1。
e41cbb5c75ab077c5ded34120ed066b7.png
我们这里主要统计从-1到1区域的人流的数量。
3bc67eb6848b1248b27c58004b264e55.png

实现的代码如下:
ae88ea4aaf3c6c5a880de212185eac62.png

前面还需要有一些初始化的函数:
4cca848b66b7e18e2f9257a4e2723e03.png

(4)人流统计分析判断
当人体的状态,从-1变化到1的时候,就统计为人员越线了。
并在图片的左上方,统计人流计数的实时效果。
069048d707b0ffefad74d604411e5db8.png

(5)喵提醒发送
当整个视频跑完后,就可以得到客流统计整体的数据。
为了及时知道客流的信息状态,我们也可以将最后的结果,以喵提醒的方式进行发送。
这部分的代码,放在最前面的图片采集中。
9dee0053c23d9646dd480504faaf1d06.png

前面还有两个库(times、requests)引用:
a1065179c48b5e5bbfde829a556c0601.png

在这里已经给出了比较明显的人流统计的代码提示了。
大家可以按照整体的业务逻辑,编写一个人流统计的代码,将各个板块进行串联,调试,里面的各种颜色也都可以调整。
最终统计得到的效果是:
14c3020a1cc0c156b5cb64d80e6777fb.png

在视频运行完后,手机上还会收到一个喵提醒的提示。
2483078deee41e4943a4674ea4f03f05.jpg

4.3 训练营作业发布

本节课的内容基本结束了,为了巩固学习成果,大家可以完成一个作业任务。

4.3.1 作业流程

作业最终实现的是使用人体检测+人体追踪+业务逻辑,完成人流统计的业务功能。
完成作业的整个流程,主要分为两个部分:
(1)代码实现
大家可以参考前面的代码示意,完成整体人流统计项目的开发和实现。
(2)文章编写&分享
将完成整体人流统计项目的开发和实现的过程,以图文+视频的形式写成文章,里面包含代码和使用心得,发布到AidLux开发者社区,同步到知乎、CSDN、掘金等不少于3个技术社区。
(3)文章参考
参考作品模板可以看这里

4.3.2 作业奖励

完成本次训练营的学习并完成最终作业的同学,可以在群内分享作品链接,或者添加运营的微信提交,符合要求的,可以领取精美礼品(长期有效)。
ae6bfcd386ced91de66c8d90c7e5ac59.jpg

5. AidLux认证开发者

AidLux认证开发者计划正式开启,提交作品成为认证开发者,高通边缘计算设备、创作激励等丰厚奖励等着你~

大家可以加入AidLux AI开发者交流群,群内有AidLux工程师和江大白等众多AI行业专家,可以给予技术指导以及进行交流互动。

本节课所需的数据集、资料包,大家可以在AidLux AI交流群内获取呦~

本次智慧安防训练营的全部课程到此结束了,感谢大家的学习,也期待大家的作品。

用AidLux,每个人都能轻松落地AI应用。

推荐阅读
关注数
5
内容数
54
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息