M5StackUnit2简介
硬件部分,模块具有GC2145 1080p摄像头,麦克风,TF卡槽,串口,TYPEC等外设,使用了Sigmstar SSD202D做为主控芯片,内部有双核A7 1.2GHz,摄像头内部集成了128MB的DDR3内存和512MBFlash。
软件方面,模块内嵌了Linux操作系统,同时集成有丰富的资源及开发工具,内置了多种开发功能,对python支持良好,上手门槛较低。框架图如下图
任务介绍
我选择了任务四,识别办公室/宿舍出入人员是否有正常佩戴口罩,发现异常立即报警,并将每日的数据上传到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命令进行配网,但是会出现在无法保存的情况,所以需要使用一些特殊处理。
正确的配网步骤如下:
① 查询附近的热点,使用命令:
wpa_cli -i wlan0 scan
wpa_cli -i wlan0 scan_results
显示目前周围的WiFi,找到自己需要的WiFi。
② 将WiFi信息配置到wpa_supplicant.conf文件
使用命令
wpa_passphrase SSID PSK >> /etc/wpa_supplicant.conf
将WiFi信息写入wpa_supplicant.conf文件,写入后,检查wpa_supplicant.conf内是否已经保存了所需要连接的WiFi信息。
③ 使用wpa_cli命令配网
(i) 增加一个网络id:wpa_cli -i wlan0 add_network
(ii) 配置WiFi热点的名称ssid:wpa_cli -i wlan0 set_network 网络编号 ssid '"WiFi名称"'
(iii) 配置WiFi热点的密码psk:wpa_cli -i wlan0 set_network 网络编号 psk '"密码"'
(iv) 查看网络列表:wpa_cli -i wlan0 list_network
(v) 选择网络:使用list_network命令,会打印所有已添加成功的WiFi热点,如果有多个WiFi热点,可以使用select_network命令选择使用哪个热点,可实现WiFi热点的切换。wpa_cli -i wlan0 select_network 网络编号
(vi) 获取动态IP:udhcpc -i wlan0 -q
(vii)使用ping命令测试是否能够连接外网,如果能够正常返回延迟,则配置成功
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进行数据显示,十分方便的创建自己的数据显示,只需要在软件中选择插件,并绑定数据即可根据实时数据产生报表。
数据显示效果:
代码使用方式
下载代码,在run.py中填入11-13行的三元素ProductKey,DeviceName,DeviceSecret,和15-17行的POST,POST_REPLY,SET,均可以在阿里云iot后台获取,
使用scp命令将代码上传到摄像头,在摄像头中运行run.py即可。
遇到的困难
最早选择了爬虫方案,但是一直没有完成,后来使用摄像头直接联网,但是常规的wpa_cli无法直接联网,查找资料后解决,并分享了方法。
未来期待
希望可以得到关于摄像头更详细的资料,或者官方将拥有的资源进行封装,提供类似树莓派的pip库。