《K210技术结合口罩检测与人脸识别:一步步指导教学》

基于K210的口罩检测与人脸识别——手把手教学

  • K210简介
  • 人脸识别模型获取
  • 口罩检测模型获取
  • 使用说明
  • 模型总结
  • 代码下载
  • 基于深度学习与FreeRTOS的多功能视觉防疫终端
  • 视频演示
  • 笔者最近期末综合设计,设计一个
    基于深度学习与FreeRTOS的多功能视觉防疫终端,本人负责人脸识别和口罩检测模块,采用k210完成该模块。

    K210简介


    本次设计采用基于k210设计的maixbit开发板载UART / I2C接口,连接到esp32主流控制器,实现硬件无缝对接。同时,该单片机将Micropython移植到K210,带64 位双核带硬件 FPU、卷积加速器、FFT、Sha256 的 RISC-V CPU,基于该单片机的硬件基础,可以使用部署在K210上的YOLOv2模型,完成人脸识别和口罩识别部分。

    人脸识别模型获取

    KPU 是 K210 内部一个神经网络处理器,简单来说就是 KPU 能加载和运行各种现成的 AI 算法模型,实现各种机器视觉等功能。 MaixPy 中人脸识别本质是目标检测,主要通过在K210的KPU上跑 YOLO(You Only Look Once)目标检测算法来实现。
    我们通过烧录训练好的模型和固件、在SD卡中存放已有模型,调用K210的KPU,实现口罩检测。基于这个思路,使用部署在K210上的YOLO模型完成口罩检测任务。
    笔者采用自训练的方法获得,官方提供了现成的口罩检测和人脸检测模型,附上链接以供大家获取;值得注意的是,每个k210的机器码不同,需要烧录以下固件,并在串口助手连接的情况下,按下boot,显示你的机器码

    固件下载库:固件下载
    得到机器码后,进入maixhub官网


    最后得到:

    但这个代码只针对人脸检测,但我们目标还需要口罩检测,所以代码只能用于参考。
    注意:我们可以通过把三个固件和一个bin(理解为:承载各个模型头文件的包)通过kflash烧录到k210中,也可以放在sd卡中,但在boot.py中要调用一下代码:

    task_fd = kpu.load(0x200000) # 从flash 0x200000 加载人脸检测模型
    task_ld = kpu.load(0x300000) # 从flash 0x300000 加载人脸五点关键点检测模型
    task_fe = kpu.load(0x400000) # 从flash 0x400000 加载人脸196维特征值模型
    
    

    `也可通过sipeed官网提供的固件(但会不会出bug我不了解):
    sipeed提供的人脸检测模型下载(可用性未知)

    口罩检测模型获取

    使用说明

    下载模型后得到: .py 示例脚本,.smodel 模型文件

    将模型下载到 flash 的 0x300000 位置(与示例脚本中模型加载位置对应)

    下载站下载 kmodelv4 支持固件, 并用 kflash 烧录

    这里我将support.bin(v0.6.2_32)(默认地址)和口罩模型.smodel(起始地址改为:0x300000)打包成kfpkg,值得一提的是,人脸检测也是使用这个版本的固件

    模型总结

    笔者采用以下方法
    人脸检测模型放在sd卡,采用代码读取法
    口罩检测模型烧录进k210,采用调用地址法

    task_fe = kpu.load("/sd/FE1.smodel") # 加载人脸196维特征值模型
    task = kpu.load(0x300000) #加载口罩检测模型
    

    模型(人脸需要自己拿自己的机器码去下载)和代码

    代码下载

    基于K210的口罩检测与人脸识别代码及模型下载和指导

    基于深度学习与FreeRTOS的多功能视觉防疫终端

    FreeRTOS实时人机交互部分采用ESP32完成,有问题请联系@体弱多病bamboo君

    基于深度学习与FreeRTOS的多功能视觉防疫终端代码
    `

    视频演示

    不多说上成果
    基于深度学习与FreeRTOS的多功能视觉防疫终端

    部分源码:

    #==================加载模型分别是196特征值和mask(口罩和人脸)==================**
    anchor = (0.1606, 0.3562, 0.4712, 0.9568, 0.9877, 1.9108, 1.8761, 3.5310, 3.4423, 5.6823)  # anchor for face detect
    dst_point = [(44, 59), (84, 59), (64, 82), (47, 105),
                 (81, 105)]  # standard face key point position
    a = kpu.init_yolo2(task, 0.5, 0.3, 5, anchor)
    b = kpu.init_yolo2(task_fe, 0.5, 0.3, 5, anchor)
    #==================窗口大小==================**
    img_lcd = image.Image()
    img_face = image.Image(size=(128, 128))
    a = img_face.pix_to_ai()
    
    #==================人脸相似度==================**
    ACCURACY = 71
    
    while (1):
        img = sensor.snapshot()
        clock.tick()
        code = kpu.run_yolo2(task, img)
        if code:
            totalRes = len(code)
    
            for item in code:
                ##==================图片转换==================**
                a = img.draw_rectangle(item.rect())
                face_cut = img.cut(item.x(), item.y(), item.w(), item.h())
                face_cut_128 = face_cut.resize(128, 128)
                a = face_cut_128.pix_to_ai()
                #==================口罩==================**
                confidence = float(item.value())
                itemROL = item.rect()
                classID = int(item.classid())
                if confidence < 0.52:
                    _ = img.draw_rectangle(itemROL, color=color_B, tickness=5)
                    print("Please enter the detection range!")
                    continue
    
                if classID == 1 and confidence > 0.65:
                    _ = img.draw_rectangle(itemROL, color=color_G, tickness=5)
                    if totalRes == 1:
                        drawConfidenceText(img, (0, 0), 1, confidence)
                else:
                    _ = img.draw_rectangle(itemROL, color=color_R, tickness=5)
                    if totalRes == 1:
                        drawConfidenceText(img, (0, 0), 0, confidence)
    
                #==================人脸==================**
                fmap = kpu.forward(task_fe, face_cut_128)
                feature = kpu.face_encode(fmap[:])
                reg_flag = False
                scores = []
                for j in range(len(record_ftrs)):
                    score = kpu.face_compare(record_ftrs[j], feature)
                    scores.append(score)
                max_score = 0
                index = 0
                del (face_cut_128)
                for k in range(len(scores)):
                    if max_score < scores[k]:
                        max_score = scores[k]
                        index = k
                if max_score > ACCURACY:
                    a = img.draw_string(item.x(), item.y(), ("%s :%2.1f" % (
                        names[index], max_score)), color=(0, 255, 0), scale=2)
                    lvbo(3)
                    sum_face=sum_face+1
                    if(sum_face-sum_unface>5):
                        sum_unface=0
                    if(sum_face>4):
                        face_yes=1
                        print("人脸识别成功")
                        #uart_A.write(names[index]+'\r\n')
                        FACE.value(1)
                        print(FACE.value())
                        sum_face=0
                        #time.sleep(3)
                        tim = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.UNIT_MS, period=3000, callback=None, arg=None)
                        FACE.value(0)
                else:
                    a = img.draw_string(item.x(), item.y(), ("X :%2.1f" % (
                    max_score)), color=(255, 0, 0), scale=2)
                    lvbo(4)
                    sum_unface=sum_unface+1
                    #if(face_yes==0):
                    if(sum_unface-sum_face>5):
                        sum_unface=0
                    if(sum_face>4):
                        print("人脸识别失败")
                        #uart_A.write(names[index]+'\r\n')
                        FACE.value(0)
                        print(FACE.value())
                        sum_unface=0
                #=====================**按键注册==================*
                if start_processing:
                    record_ftrs = []
                    record_ftr = feature
                    record_ftrs.append(record_ftr)
                    save_feature(record_ftr) #存到SD卡
                    print(feature)
                    start_processing = False
                break
        lvbo(0)
        fps = clock.fps()
        #print("%2.1f fps" % fps)
        img.draw_string(0, 200, "%2.1f fps" % fps, scale=2, color=(255, 0, 0))
        a = lcd.display(img)
        gc.collect()
        b= img.draw_rectangle(80,22,159,195)
    
    物联沃分享整理
    物联沃-IOTWORD物联网 » 《K210技术结合口罩检测与人脸识别:一步步指导教学》

    发表评论