基于M5UnitV2的口罩识别
使用M5UnitV2的口罩识别,模型使用V-Training进行训练,使用python编程,将摄像头连接到阿里云iot平台,使用阿里云的IoT Studio进行报表整理输出
标签
嵌入式系统
振青666
更新2021-07-19
1086

M5StackUnit2简介

硬件部分,模块具有GC2145 1080p摄像头,麦克风,TF卡槽,串口,TYPEC等外设,使用了Sigmstar SSD202D做为主控芯片,内部有双核A7 1.2GHz,摄像头内部集成了128MB的DDR3内存和512MBFlash。

软件方面,模块内嵌了Linux操作系统,同时集成有丰富的资源及开发工具,内置了多种开发功能,对python支持良好,上手门槛较低。框架图如下图

FjQzinRSrqN6wZXUc_DYPl4QLrdk

任务介绍

我选择了任务四,识别办公室/宿舍出入人员是否有正常佩戴口罩,发现异常立即报警,并将每日的数据上传到PC端,生成报表。可以将任务拆分,拆分后任务可以分成检测人员是否正常佩戴口罩,异常报警,上传每日数据,生成报表,接下来将按照这个顺序介绍任务实现。

实现介绍

1、对是否佩戴口罩进行识别

首先需要收集训练集,采集训练集的方式多种多样,可以使用M5智能摄像头手工抓取图片采集,也有同学选择了借助已有模型来进行训练集采集,为了方便我选择使用网络上开源的数据集进行训练。

本次活动M5Stack为了降低上手难度,搭建了v-training在线训练平台,只需要将收集好的图片上传到在线训练平台,然后再平台上打标,训练即可,将训练得到的模型上传到摄像头,即可开始运行。

为了减少运行web服务对性能的占用,使用python调用模型,即可获得json

{'num': 1, 'obj': [{'prob': 0.415603101, 'x': 284, 'y': 117, 'w': 175, 'h': 198, 'type': 'WithMask'}], 'running': 'Object Recognition'}

通过对JSON数据处理进行其他功能的实现。

2、异常报警

分析所获得的JSON数据,即可得到进入人员是否正确佩戴了口罩,在识别到未正确配到口罩的人员时,通过摄像头内部的指示灯现场报警,同时也可以通过串口连接外置报警模块,实现声光报警,由于没有配到本次摄像头所需要的连接线,所以选择只用摄像头内部指示灯报警。

def control_white_led(value):
    open('/sys/class/gpio/export', 'w').write('0') # Export the GPIO0
    open('/sys/class/gpio/gpio0/direction', 'w').write('out') # Set the direction of the GPIO
    open('/sys/class/gpio/gpio0/value', 'w').write(str(value)) # Set the calute, '1' or '0'
# 控制白色指示灯,0为亮,1为灭
def control_red_led(value):
    open('/sys/class/gpio/export', 'w').write('1') # Export the GPIO0
    open('/sys/class/gpio/gpio1/direction', 'w').write('out') # Set the direction of the GPIO
    open('/sys/class/gpio/gpio1/value', 'w').write(str(value)) # Set the calute, '1' or '0'
# 控制红色指示灯,0为亮,1为灭

3、数据上传

通过typec接口与电脑相连的网卡桥接不能连接到互联网,所以选择使用WiFi连接到互联网,通过使用阿里云iot服务,将数据实时上传到云端。

3.1 摄像头联网

使用wpa_cli命令进行配网,但是会出现在无法保存的情况,所以需要使用一些特殊处理。

FiXD-i1wYwO7Q87RPcaRWeEndmkm

正确的配网步骤如下:

① 查询附近的热点,使用命令:

wpa_cli -i wlan0 scan
wpa_cli -i wlan0 scan_results

显示目前周围的WiFi,找到自己需要的WiFi。

FhCPo18l1HKf94avbbeEmbRru-3l

② 将WiFi信息配置到wpa_supplicant.conf文件

使用命令

wpa_passphrase SSID PSK >> /etc/wpa_supplicant.conf

将WiFi信息写入wpa_supplicant.conf文件,写入后,检查wpa_supplicant.conf内是否已经保存了所需要连接的WiFi信息。

FinUtkwnwxy_LZo41MoNlx3nRENp

FhyQ4pdWzkVkC_ApHVHif5HoflVy

③ 使用wpa_cli命令配网

(i)  增加一个网络id:wpa_cli -i wlan0 add_network

            FsX5nBJM5L9J2xaO7tRP-nmtL2Fv

(ii)  配置WiFi热点的名称ssid:wpa_cli -i wlan0 set_network 网络编号 ssid '"WiFi名称"'

(iii) 配置WiFi热点的密码psk:wpa_cli -i wlan0 set_network 网络编号 psk '"密码"'

   Fk_LWXZTGacbTbeZqyFWBulNZxR6

(iv)  查看网络列表:wpa_cli -i wlan0 list_network

   Fi3YUrAvdDe4OHKqZcyADfTYutZW

(v)  选择网络:使用list_network命令,会打印所有已添加成功的WiFi热点,如果有多个WiFi热点,可以使用select_network命令选择使用哪个热点,可实现WiFi热点的切换。wpa_cli -i wlan0 select_network 网络编号

(vi) 获取动态IP:udhcpc -i wlan0 -q

(vii)使用ping命令测试是否能够连接外网,如果能够正常返回延迟,则配置成功

FtRO0HqsqRTXa-wVGUPDBHgHYY_0

3.2 将摄像头连接到阿里云iot

在程序中配置iot后台获取的三元素ProductKey 、DeviceName 、DeviceSecret然后配置topic:POST、POST_REPLY、SET。

# 消息回调(云端下发消息的回调函数)
def on_message(client, userdata, msg):
    #print(msg.payload)
    Msg = json.loads(msg.payload)
    switch = Msg['params']['PowerLed']
    print(msg.payload)  # 开关值

#连接回调(与阿里云建立链接后的回调函数)
def on_connect(client, userdata, flags, rc):
    pass

# 链接信息
Server,ClientId,userNmae,Password = aliLink.linkiot(DeviceName,ProductKey,DeviceSecret)

# mqtt链接
mqtt = mqttd.MQTT(Server,ClientId,userNmae,Password)
mqtt.subscribe(SET) # 订阅服务器下发消息topic
mqtt.begin(on_message,on_connect)

3.3 识别是否佩戴口罩对返回数据进行处理

if 'num' in doc:
    for obj in doc['obj']:
        if obj['prob'] > 0.45:
            if obj['type'] == 'WithOutMask':
                withoutMask += 1
                peopleCount += 1
                control_white_led(0) 
            elif obj['type'] == 'WithMask':
                withMask += 1
                peopleCount += 1
                control_white_led(1)

3.4 规范格式上传

updateMsn = {
            'PeopleCount':peopleCount,
            'WithoutMask':withoutMask,
            'WithMask':withMask,
        }
        JsonUpdataMsn = aliLink.Alink(updateMsn)
        print(JsonUpdataMsn)
        mqtt.push(POST,JsonUpdataMsn) # 定时向阿里云IOT

现在就可以定时使用Alink协议将数据发送到阿里云iot平台。

4、报表生成

使用阿里云的iot studio进行数据显示,十分方便的创建自己的数据显示,只需要在软件中选择插件,并绑定数据即可根据实时数据产生报表。

数据显示效果:

FiUWTGxNmGI12aXAKZuA_b07lqXN

代码使用方式

下载代码,在run.py中填入11-13行的三元素ProductKey,DeviceName,DeviceSecret,和15-17行的POST,POST_REPLY,SET,均可以在阿里云iot后台获取,

FnPyLRVuQ5ED8vpXrzVr4wYpRMrbFuYYpZ7YHwYHi4wXAS4sdUWtACt2

使用scp命令将代码上传到摄像头,在摄像头中运行run.py即可。

遇到的困难

最早选择了爬虫方案,但是一直没有完成,后来使用摄像头直接联网,但是常规的wpa_cli无法直接联网,查找资料后解决,并分享了方法。

未来期待

希望可以得到关于摄像头更详细的资料,或者官方将拥有的资源进行封装,提供类似树莓派的pip库。

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