一、概括
本次项目的源于硬禾学堂和 M5Stack 联合举办的活动 【你玩转我全返】M5Stack UnitV2 - 首款全功能一体化AI摄像头,活动采用的是 M5Stack UnitV2
,是M5Stack 的首款全功能一体化AI摄像头,功能强大,可玩性很高,稍后会详细介绍这款硬件。
来看下本次项目实现的任务:
识别宿舍出入人员是否有正常佩戴口罩,发现异常立即报警,并将每日的数据发送到PC端或者云端,形成报表。
现在拆解一下任务,看看如何分成简单的部分去实现,如下图所示:
文章就按照这四个部分去实现,然后整合后,就能够得到最终的结果。
简述一下我的思路,通过 M5Stack 官方提供的 V-Training(Ai模型训练服务),轻松构建出口罩佩戴与否的识别模型,然后就能够得到人员是否佩戴口罩的情况,然后将数据传送给电脑,然后通过在 PC 端使用 python 来分析 M5Stack UnitV2
传过来的数据,根据数据得知人员是否佩戴口罩,若不佩戴则连接电脑的音箱发出报警声,同时提取需要的数据进行保存,同样使用 python 将数据可视化,得到每天口罩佩戴情况的报表。
这个网站也有很多大佬基于这款硬件开发一些有趣的项目,可以参考一下:M5Stack UnitV2 - 用于边缘计算的独立 AI 摄像头 (SSD202D)
二、硬件模块介绍:M5Stack UnitV2 - 用于边缘计算的独立 AI 摄像头
我们来看看这款硬件,
UnitV2 是 M5Stack 推出的一款高效率的AI识别模块,采用 Sigmstar SSD202D(集成双核Cortex-A7 1.2Ghz处理器)控制核心,集成128MB-DDR3内存,512MB NAND Flash, 1080P摄像头。内嵌Linux操作系统,集成丰富的软硬件资源与开发工具,致力带给用户开箱即用,简洁高效的Ai开发体验。
UnitV2 采用 SigmstarSSD202D (集成双核 Cortex-A7 1.2Ghz处理器)控制核心,集成了 M5Stack 开发的多个即用型AI识别应用程序(例如:人脸识别、对象跟踪、颜色跟踪器、形状检测器、条形码检测器和其他常用功能),可以帮助用户快速构建自己的AI应用程序。
主要应用在以下方面:
-
Ai识别功能开发
-
工业视觉识别分类
-
机器视觉学习
UnitV2即插即用,具有内置的USBLAN。通过USB-C接口连接到PC时,他将自动与UnitV2建立网络连接,也可以通过Wi-Fi连接和调试。UART串口通讯,所有标识内容通过串口自动以JSON格式输出,调用方便。内嵌Linux操作系统,集成丰富的软硬件资源与开发工具。可点击链接了解板卡详情:https://docs.m5stack.com/zh_CN/unit/unitv2。
产品特性如下:
-
Sigmstar SSD202D:双核 Cortex-A7 1.2Ghz 处理器
-
128MB DDR3
-
512MB NAND Flash
-
GC2145 1080P Colored Sensor
-
内置麦克风
-
WiFi 2.4GHz
产品原理图如下:
更多信息,请到官网查看:UnitV2 中文文档
三、项目实现
下面就根据上图的四个点展开详细描述,尽量把实现细节描述地清楚一些。
3.1、M5Stack UnitV2实现口罩佩戴识别
本人是 AI 方面的小白,虽然不懂这个实现的底层原理,但是依葫芦画瓢的能力还是有的,直接使用 M5Stack 官方提供的 V-Training(Ai模型训练服务)即可轻松构建自定义的识别模型。具体详细操作步骤见 V-Training 教程。
下面讲述几个关键的步骤:
-
获取训练素材
也就是训练的图片,数量越多越好,素材拍摄场景要贴合实际识别的的场景,可以使用 M5Stack UnitV2 直接拍摄保存,然后保存下来:
如下所示:
上文只是使用了网图,我们最好是得到自己监测环境的效果图,这样训练之后,效果会更好些。
下面是我自己在宿舍拍摄的人脸图片数据,包括人脸戴口罩与不戴口罩的图片,我们待会会对这些图片进行标记。
-
标记素材
登陆 V-Training在线训练平台,对拍摄的图片进行标记,主要标记是否为人和是否佩戴口罩,
佩戴口罩的做如下标记,就是标记人和佩戴口罩:person 和 Mask
未佩戴口罩的做如下标记,就是标记人和未佩戴口罩:person 和 NoMask
按照上图的方式操作拍摄的几十张图,给每一个图都做上上面两种标记方式。
最后点击训练即可,等待服务器训练完成,得到训练后的模型。
-
将训练模型加载到 M5Stack UnitV2 上,即可实现检测某人是否佩戴口罩的目标。
下图是训练后得到的模型:
我们来看一下识别效果,我们可以得到置信度比较高的戴口罩情况,同时 UnitV2 还会反馈相关的识别数据给到我们,这些数据的格式是 json格式。
-
获取 json 格式的识别数据
M5Stack UnitV2 会在是识别过程同时通过串口将数据传输出来,我们通过电脑的串口接收数据,然后分析即可。
得到UnitV2发送的数据其实是 json 格式,样式如下:
很容易就能看出来,我们能够从中得到两个信息:是否为人 和 是否佩戴口罩。当然还有这些信息的置信度。由于有时识别不清楚等原因,这些数据并不都是正确的,我们需要对这些数据进行“清洗”,以便我们能够得到有效数据。
3.2、数据的接收和处理
由于使用串口助手直接接收数据不方便处理数据,所以决定用 python 直接一套带走,方便很多。
打开对应串口:
ser = serial.Serial('com16',115200) #打开串口
通过串口发送切换命令:(其中 v2model_0b5431c82a9b1d32
是之前训练的模型)
send_data = '{"function": "Object Recognition","args":["v2model_0b5431c82a9b1d32"]}\r\n'
然后模块就源源不断地传送数据过来,我们使用 python的 json 模块对字符串数据解析得到 json数据:
dict_data = json.loads(data_str)#字符串转换成字典
得到的数据如下所示:
{
"num":2,
"obj":[
{
"prob":0.966078572,
"x":214,
"y":12,
"w":250,
"h":276,
"type":"NoMask"
},
{
"prob":0.847388446,
"x":16,
"y":0,
"w":595,
"h":457,
"type":"person"
}
],
"running":"Object Recognition"
}
我们可以通过这些数据的来判断该识别是否符合我们要监测的对象。比如 是否有人、佩戴口罩是否识别到、置信度是否满足要求等来清洗数据。
判断是否接收到两个对象的数据,且是否运行的是目标识别模式
if dict_data["num"] == 2 and dict_data["running"] == "Object Recognition" :
#符合则处理
判断置信度是否符合要求,由于我训练的样本较少(标记太苦了,完全就是体力活),置信度大于0.8我就认为是可以的了:
if res["prob"] > 0.8:#概率值为80%
#符合处理数据
接着就是判断是否佩戴口罩了,同时打印判断结果和将数据记录下来,方便后面处理。
if res["type"] == "NoMask":
print("NoMask")
dict_target["type"] = "NoMask"
elif res["type"] == "Mask":
print("Mask")
dict_target["type"] = "NoMask"
3.3、实现发现未佩戴口罩者报警功能
用声音报警无疑是最好的,既然都用电脑来接收和处理数据了,那也用电脑配合音箱来报警吧,毕竟能者多劳嘛。
还是使用万能的python实现,使用 ctypes 模块来实现:
import ctypes
player = ctypes.windll.kernel32
if res["type"] == "NoMask":
player.Beep(800,500)#报警音
很轻松。
3.4、记录每天人员佩戴口罩的情况
人生苦短,还是用 python。
将UnitV2模块连着电脑,放于宿舍的某个监测位置,用于识别走过的人的佩戴口罩的情况:
将识别的数据直接写入txt文件即可。
首先,获取系统时间:
import time
date = time.strftime("%Y-%m-%d", time.localtime())
将时间和佩戴口罩情况数据写入文件:
if res["type"] == "NoMask":
dict_target["type"] = "NoMask"
dict_target["date"] = date #当前系统的时间
writeDict2File('daily_mask_wearing_data.txt',dict_target)
elif res["type"] == "Mask":
dict_target["type"] = "NoMask"
dict_target["date"] = date #当前系统的时间
writeDict2File('daily_mask_wearing_data.txt',dict_target)
打开文件即可看到最近检测到的数据:
3.5、生成每日数据报表
这里还是使用到 python的包pyecharts,
“pyecharts 是一个用于生成 Echarts 图表的类库。Echarts 是百度开源的一个数据可视化 JS 库。用 Echarts 生成的图可视化效果非常棒,为了与 Python 进行对接,方便在 Python 中直接使用数据生成图”。pyecharts可以展示动态图,在线报告使用比较美观,并且展示数据方便,鼠标悬停在图上,即可显示数值、标签等。
直接 show code ,通过上一节记录在txt文件的数据,生成可视化的图表。
def showWearingMasks(FilePath):
fileName = os.path.join(os.getcwd(),FilePath)
attr = ["2021-7-13"]
dictList = []
i = 0
v1=[0]
v2=[0]
with open(fileName, 'r', encoding='utf-8') as f:
for line in f.readlines():
#print(line.strip())
js = json.loads(line.strip())
dictList.append(js)
for oneData in dictList:
if oneData["date"] == attr[i] :
if oneData["type"] == "Mask":
v1[i] += 1
else:
v2[i] += 1
else:
attr.append(oneData["date"])
if oneData["type"] == "Mask":
v1.append(1)
v2.append(0)
else:
v1.append(0)
v2.append(1)
i += 1
bar=Bar("宿舍口罩佩戴情况")
bar.add("戴口罩",attr,v1,is_stack=True)
bar.add("不戴口罩",attr,v2,is_stack=True)
bar.render()
showWearingMasks('daily_mask_wearing_data.txt')
生成的图表如下:(由于现在疫情不是很严重,佩戴口罩比较少,有些甚至是我为了戴而戴)
四、总结
刚开始看到这个活动时,看到只是一个关于 AI 相关的模块时,其实是觉得自己是应该玩不动的,毕竟没有AI基础。
所以花了点时间去了解,后来看了相关直播,突然发现其实不用了解原理就可以使用,只需要按步骤去训练即可使用,真是太方便了。
训练和标记花了最多的时间,活生生地从高科技的AI开发变成了图片标记苦力工。
这个项目虽然现在勉强做完了,但是感觉自己实现的还是有点少,更多的是把 UnitV2 当做一个单独的模块,然而没有深入地开发,所以没能发挥这个模块强大的功能,还是因为对Linux也不是很熟的缘故。
还有本来打算实现将数据上传至云服务器的功能也没来得及做,后面花点时间去实现。
其实后面想利用这个模块配合我的智能小车,让我的车变成真正的智能小车。
至于收获,这段时间逼迫自己学了些东西,就连 python也是现学现卖,发现只有在开发中学习的效率才是最高的。
人生很长,不给自己设限,多玩点不同领域的东西还是挺有趣的。