基于 M5Stack-UnitV2 实现的宿舍口罩佩戴情况监测系统
基于 M5Stack-UnitV2 全功能一体化的AI摄像头,实现宿舍口罩佩戴情况监测系统
标签
嵌入式系统
M5Stack-UnitV2
YGL
更新2021-07-21
733

内容介绍

一、概括

本次项目的源于硬禾学堂和 M5Stack 联合举办的活动 【你玩转我全返】M5Stack UnitV2 - 首款全功能一体化AI摄像头,活动采用的是 M5Stack UnitV2,是M5Stack 的首款全功能一体化AI摄像头,功能强大,可玩性很高,稍后会详细介绍这款硬件。

image-20210717161944852

来看下本次项目实现的任务:

识别宿舍出入人员是否有正常佩戴口罩,发现异常立即报警,并将每日的数据发送到PC端或者云端,形成报表。

现在拆解一下任务,看看如何分成简单的部分去实现,如下图所示:

image-20210717152413393

文章就按照这四个部分去实现,然后整合后,就能够得到最终的结果。

简述一下我的思路,通过 M5Stack 官方提供的 V-Training(Ai模型训练服务),轻松构建出口罩佩戴与否的识别模型,然后就能够得到人员是否佩戴口罩的情况,然后将数据传送给电脑,然后通过在 PC 端使用 python 来分析 M5Stack UnitV2 传过来的数据,根据数据得知人员是否佩戴口罩,若不佩戴则连接电脑的音箱发出报警声,同时提取需要的数据进行保存,同样使用 python 将数据可视化,得到每天口罩佩戴情况的报表。

image-20210717154426790

这个网站也有很多大佬基于这款硬件开发一些有趣的项目,可以参考一下: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

产品原理图如下:

image-20210717161759761

更多信息,请到官网查看:UnitV2 中文文档

三、项目实现

image-20210718163934487

下面就根据上图的四个点展开详细描述,尽量把实现细节描述地清楚一些。

3.1、M5Stack UnitV2实现口罩佩戴识别

本人是 AI 方面的小白,虽然不懂这个实现的底层原理,但是依葫芦画瓢的能力还是有的,直接使用 M5Stack 官方提供的 V-Training(Ai模型训练服务)即可轻松构建自定义的识别模型。具体详细操作步骤见 V-Training 教程

下面讲述几个关键的步骤:

  • 获取训练素材

    也就是训练的图片,数量越多越好,素材拍摄场景要贴合实际识别的的场景,可以使用 M5Stack UnitV2 直接拍摄保存,然后保存下来:

    如下所示:

    image-20210718184413335

    上文只是使用了网图,我们最好是得到自己监测环境的效果图,这样训练之后,效果会更好些。

    下面是我自己在宿舍拍摄的人脸图片数据,包括人脸戴口罩与不戴口罩的图片,我们待会会对这些图片进行标记。

    image-20210718183216455

  • 标记素材

    登陆 V-Training在线训练平台,对拍摄的图片进行标记,主要标记是否为人和是否佩戴口罩,

    佩戴口罩的做如下标记,就是标记人和佩戴口罩:person 和 Mask

    image-20210718233729828

    未佩戴口罩的做如下标记,就是标记人和未佩戴口罩:person 和 NoMask

    image-20210718233859548

    按照上图的方式操作拍摄的几十张图,给每一个图都做上上面两种标记方式。

    最后点击训练即可,等待服务器训练完成,得到训练后的模型。

    image-20210719190139783

  • 将训练模型加载到 M5Stack UnitV2 上,即可实现检测某人是否佩戴口罩的目标。

    下图是训练后得到的模型:

    image-20210719190710602

    我们来看一下识别效果,我们可以得到置信度比较高的戴口罩情况,同时 UnitV2 还会反馈相关的识别数据给到我们,这些数据的格式是 json格式。

    image-20210719191450287

  • 获取 json 格式的识别数据

    M5Stack UnitV2 会在是识别过程同时通过串口将数据传输出来,我们通过电脑的串口接收数据,然后分析即可。

    得到UnitV2发送的数据其实是 json 格式,样式如下:

    image-20210719192539164

很容易就能看出来,我们能够从中得到两个信息:是否为人 和 是否佩戴口罩。当然还有这些信息的置信度。由于有时识别不清楚等原因,这些数据并不都是正确的,我们需要对这些数据进行“清洗”,以便我们能够得到有效数据。

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模块连着电脑,放于宿舍的某个监测位置,用于识别走过的人的佩戴口罩的情况:

image-20210719205220655

将识别的数据直接写入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)

打开文件即可看到最近检测到的数据:

image-20210719202548338

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')

生成的图表如下:(由于现在疫情不是很严重,佩戴口罩比较少,有些甚至是我为了戴而戴)

image-20210719203215870

四、总结

刚开始看到这个活动时,看到只是一个关于 AI 相关的模块时,其实是觉得自己是应该玩不动的,毕竟没有AI基础。

所以花了点时间去了解,后来看了相关直播,突然发现其实不用了解原理就可以使用,只需要按步骤去训练即可使用,真是太方便了。

训练和标记花了最多的时间,活生生地从高科技的AI开发变成了图片标记苦力工。

这个项目虽然现在勉强做完了,但是感觉自己实现的还是有点少,更多的是把 UnitV2 当做一个单独的模块,然而没有深入地开发,所以没能发挥这个模块强大的功能,还是因为对Linux也不是很熟的缘故。

还有本来打算实现将数据上传至云服务器的功能也没来得及做,后面花点时间去实现。

其实后面想利用这个模块配合我的智能小车,让我的车变成真正的智能小车。

至于收获,这段时间逼迫自己学了些东西,就连 python也是现学现卖,发现只有在开发中学习的效率才是最高的。

人生很长,不给自己设限,多玩点不同领域的东西还是挺有趣的。

附件下载

mask_recognition.zip
项目工程文件

团队介绍

评论

0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号