M5Stack UnitV2口罩识别并上传阿里云
识别办公室/宿舍出入人员是否有正常佩戴口罩,发现异常立即报警,上传到云端,生成报表
标签
M5Stack UnitV2
Upton
更新2021-07-15
1050

AI摄像头 ––UnitV2 识别宿舍戴口罩情况

 

PART1硬件介绍

 

UnitV2是M5Stack推出的一款高效率的AI识别模块, 采用Sigmstar SSD202D(集成双核Cortex-A7 1.2Ghz处理器)控制核心,集成128MB-DDR3内存,512MB NAND Flash, 1080P摄像头。内嵌Linux操作系统,集成丰富的软硬件资源与开发工具,致力带给用户开箱即用的体验。

任务分析

识别办公室/宿舍出入人员是否有正常佩戴口罩,发现异常立即报警,并将每日的数据上传到PC端,生成报表。作为扩展,以上四个题目也可以选择上传到云端,生成报表。

 

PART2 实现思路

任务拆解

1.首先需要识别人是否出现,然后识别人是否带有口罩。

2.利用python爬虫爬取http://10.254.239.1/或者http://unitv2.py/输出的json信息,通过ai摄像头输出的物体数量来判断是否带有口罩

3.利用本地pc的python-mqtt模拟设备上传数据到阿里云,并实时查看当前戴口罩的人数和查看线上记录

4.利用python调用钉钉机器人来给钉钉群聊发送当前是否带有口罩的信息。

 

具体步骤

0.安装驱动

在m5stack官网下载安装驱动m5-docs

sr9900_driver_01.webp

将驱动压缩包解压至桌面路径->进入设备管理器中选中当前未识别的设备->右键选择自定义更新->选中压缩包解压的路径->点击确认,等待更新完成。

1.训练模型

使用V-Training进行人脸识别训练和戴口罩识别训练

1.1

注册V-Training并登录,点击Start->新建项目->导入图片->NEXT->Object Detection

利用ai模型辅助训练

1.2

选择图片中你想要识别的物体创建标签,选择多张照片进行分析

1.3

点击Refresh可以刷新查看任务最新状态,训练完成后,将获得模型Download下载链接,以及损失曲线。

若损失曲线显示一张下降的曲线,则说明模型训练成功

1.4模型验证

通过浏览器访问域名unitv2.pyIP:10.254.239.1,切换功能至Object Recognition,点击add按键上传模型。

查看模型输出json文件是否符合预期效果

2 python爬虫爬取网页输出json文件

安装webdriver使用selenium,首先使用webdriver打开http://10.254.239.1/,使用模拟按键点击打开Object Recognition,并点击run

在执行完js程序后查找json输出的id标签,导出json文件,查找识别到的物品数量

(以下为单独的python爬虫程序,附录程序为完整版)

# 爬虫代码
# 指定chrome的驱动
# 执行到这里的时候Selenium会到指定的路径将chrome driver程序运行起来
driver = webdriver.Chrome('C:\Program Files\Google\Chrome\Application\chromedriver.exe')
# get 方法 打开指定网址
driver.get('http://10.254.239.1/')
html = driver.page_source
time.sleep(8)

driver.find_element_by_id("object_recognition")  # 模拟按键输入
driver.find_element_by_id("object_recognition").click()  # 单机元素
time.sleep(10)
driver.find_element_by_id("yolo_run")  # 模拟按键输入
driver.find_element_by_id("yolo_run").click()  # 单机元素
time.sleep(10)

def publish_loop():
    global mark_person, nomark_person
    mark_person = 0
    # dingding = DingDingWebHook(secret=my_secret, url=my_url)

    while 1:
        element_keyword = driver.find_element_by_id('func-result-pre')
        # print(element_keyword.text)
        json_date = element_keyword.text
        json_jiexi = json.loads(json_date)
        try:
            person_num: object = json_jiexi['num']
            assert isinstance(person_num, object)
            print(person_num)
            if person_num == 1:
                nomark_person += 1
                # 钉钉预警
                print('1111')
                dingdingpush1()
            elif person_num == 2:
                mark_person += 1
                # 钉钉预警
                print('2222')
                dingdingpush2()
            time.sleep(5)
            switchPost = json_switch_set('1', mark_person)
            client.publish(topic_post, payload=switchPost, qos=0)
        except:
            time.sleep(1)

3.python模拟设备数据上传阿里云

代码较长,已放附录

4.通过钉钉自定义机器人给宿舍群发送警报信息和祝福信息

class DingDingWebHook(object):
    def __init__(self, secret=None, url=None):
        """
        :param secret: 安全设置的加签秘钥
        :param url: 机器人没有加签的WebHook_url
        """
        if secret is not None:
            secret = secret
        else:
            secret = ''  # 加签秘钥
        if url is not None:
            url = url
        else:
            url = "https://oapi.dingtalk.com/robot/send?access_token=复制钉钉自定义机器人中的码"  # 无加密的url

        timestamp = round(time.time() * 1000)  # 时间戳
        secret_enc = secret.encode('utf-8')
        string_to_sign = '{}\n{}'.format(timestamp, secret)
        string_to_sign_enc = string_to_sign.encode('utf-8')
        hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
        sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))  # 最终签名

        self.webhook_url = url + '&timestamp={}&sign={}'.format(timestamp, sign)  # 最终url,url+时间戳+签名

    def send_meassage(self, data):
        """
        发送消息至机器人对应的群
        :rtype: object
        :param data: 发送的内容
        :return:
        """
        header = {
            "Content-Type": "application/json",
            "Charset": "UTF-8"
        }
        send_data = json.dumps(data)  # 将字典类型数据转化为json格式
        send_data = send_data.encode("utf-8")  # 编码为UTF-8格式
        request = urllib.request.Request(url=self.webhook_url, data=send_data, headers=header)  # 发送请求

        opener = urllib.request.urlopen(request)  # 将请求发回的数据构建成为文件格式
        print(opener.read())  # 打印返回的结果


def dingdingpush1():
    my_secret = ''
    my_url = 'https://oapi.dingtalk.com/robot/send?access_token=复制钉钉自定义机器人中的码'
    my_data = {
        "msgtype": "markdown",
        "markdown": {"title": "unitv2",
                     "text": "# **350宿舍戴口罩情况**\n"
                             "\n检测到未佩戴口罩,请立即佩戴口罩 "
                     },
        "at": {
            "atMobiles": [],
            "isAtAll": True}  # 是否@所有人
    }
    dingding = DingDingWebHook(secret=my_secret, url=my_url)
    dingding.send_meassage(my_data)


def dingdingpush2():
    my_secret = ''
    my_url = 'https://oapi.dingtalk.com/robot/send?access_token=复制钉钉自定义机器人中的码'
    my_data2 = {
        "msgtype": "markdown",
        "markdown": {"title": "unitv2",
                     "text": "# **350宿舍戴口罩情况**\n""\n已佩戴口罩,注意环境安全 "},
        "at": {
            "atMobiles": [],
            "isAtAll": True}  # 是否@所有人
    }
    dingding = DingDingWebHook(secret=my_secret, url=my_url)
    dingding.send_meassage(my_data2)

 

PART3 功能展示

 

未佩戴口罩时

 

钉钉机器人发送报警信息

佩戴口罩时

在阿里云iot界面可以查看报表

 

实时报表

7日报表

part4 遇到的问题

1.无法联网

解决方案

因为不会使用linux联网,ssh也不怎么会用,使用python本地模拟设备上传数据到阿里云

2.输出数据无法获取

解决方案

因为ai摄像头可以看作一个小型服务器,可以使用python爬虫爬取js运行完返回的json数据

解析json数据可以判断是否带有口罩

part5 未来的建议

建议贵公司提供的说明文档更加详细些,让一些没有接触过linux的技术小白可以更快的上手此设备。

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