441|5

18

帖子

0

资源

一粒金砂(中级)

【基于人脸识别的自动打卡健走计时系统】MaixBit-K210轻松跑出人脸识别功能! [复制链接]

准备工作

获取机器码

  • 在MaixHub上注册账号:https://maix.sipeed.com/

  • image.png

  • 登录后,搜索人脸识别模型,点击【下载】按钮,将提示输入机器码

  • image.png

  • 参考如下连接步骤: 获取MaixPy系列开发板机器码——MaixHub 机器码获取 (sipeed.com)
  • 下载key_gen.bin文件,采用kflash_gui下载bin文件到板子,接串口助手工具(115200-8N1)即可获取到一串32字节的机器码。
  • 填入32位机器码后,即可获取到一个压缩包,解压后将有main.py和3个smodel文件(kmodel模式文件的加密文件)

更新MaixBit的固件

  • 下载固件文件链接: 下载站 - Sipeed
  • 注意文件的选择:用Maixpy IDE并支持kmodel V4可以选择文件【9】

  • image.png

  • 采用kflash_gui将固件成功下载到开发板中。

拷贝smodel文件到TF卡

  • 若有TF卡,则可以用读卡器将三个smodel文件拷贝入TF卡:

  • image.png

  • ps:若遇到TF无法挂载,请注意TF卡的格式要为FAT32

代码环节

  • 在MaixPy IDE上,输入python代码:
import sensor
import image
import lcd
import KPU as kpu
import time
from Maix import FPIOA, GPIO
import gc
from fpioa_manager import fm
from board import board_info
import utime

 # task_fd = kpu.load(0x300000)
 # task_ld = kpu.load(0x400000)
 # task_fe = kpu.load(0x500000)

task_fd = kpu.load("/sd/FaceDetection.smodel")
task_ld = kpu.load("/sd/FaceLandmarkDetection.smodel")
task_fe = kpu.load("/sd/FeatureExtraction.smodel")

clock = time.clock()

fm.register(board_info.BOOT_KEY, fm.fpioa.GPIOHS0)
key_gpio = GPIO(GPIO.GPIOHS0, GPIO.IN)
start_processing = False

BOUNCE_PROTECTION = 50


def set_key_state(*_):
    global start_processing
    start_processing = True
    utime.sleep_ms(BOUNCE_PROTECTION)


key_gpio.irq(set_key_state, GPIO.IRQ_RISING, GPIO.WAKEUP_NOT_SUPPORT)

lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_hmirror(1)
sensor.set_vflip(1)
sensor.run(1)
anchor = (1.889, 2.5245, 2.9465, 3.94056, 3.99987, 5.3658, 5.155437,
          6.92275, 6.718375, 9.01025)  # 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_fd, 0.5, 0.3, 5, anchor)
img_lcd = image.Image()
img_face = image.Image(size=(128, 128))
a = img_face.pix_to_ai()
record_ftr = []
record_ftrs = []
names = ['Mr.1', 'Mr.2', 'Mr.3', 'Mr.4', 'Mr.5',
         'Mr.6', 'Mr.7', 'Mr.8', 'Mr.9', 'Mr.10']

ACCURACY = 85

while (1):
    img = sensor.snapshot()
    clock.tick()
    code = kpu.run_yolo2(task_fd, img)
    if code:
        for i in code:
            # Cut face and resize to 128x128
            a = img.draw_rectangle(i.rect())
            face_cut = img.cut(i.x(), i.y(), i.w(), i.h())
            face_cut_128 = face_cut.resize(128, 128)
            a = face_cut_128.pix_to_ai()
            # a = img.draw_image(face_cut_128, (0,0))
            # Landmark for face 5 points
            fmap = kpu.forward(task_ld, face_cut_128)
            plist = fmap[:]
            le = (i.x() + int(plist[0] * i.w() - 10), i.y() + int(plist[1] * i.h()))
            re = (i.x() + int(plist[2] * i.w()), i.y() + int(plist[3] * i.h()))
            nose = (i.x() + int(plist[4] * i.w()), i.y() + int(plist[5] * i.h()))
            lm = (i.x() + int(plist[6] * i.w()), i.y() + int(plist[7] * i.h()))
            rm = (i.x() + int(plist[8] * i.w()), i.y() + int(plist[9] * i.h()))
            a = img.draw_circle(le[0], le[1], 4)
            a = img.draw_circle(re[0], re[1], 4)
            a = img.draw_circle(nose[0], nose[1], 4)
            a = img.draw_circle(lm[0], lm[1], 4)
            a = img.draw_circle(rm[0], rm[1], 4)
            # align face to standard position
            src_point = [le, re, nose, lm, rm]
            T = image.get_affine_transform(src_point, dst_point)
            a = image.warp_affine_ai(img, img_face, T)
            a = img_face.ai_to_pix()
            # a = img.draw_image(img_face, (128,0))
            del (face_cut_128)
            # calculate face feature vector
            fmap = kpu.forward(task_fe, img_face)
            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
            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(i.x(), i.y(), ("%s :%2.1f" % (
                    names[index], max_score)), color=(0, 255, 0), scale=2)
            else:
                a = img.draw_string(i.x(), i.y(), ("X :%2.1f" % (
                    max_score)), color=(255, 0, 0), scale=2)
            if start_processing:
                record_ftr = feature
                record_ftrs.append(record_ftr)
                start_processing = False

            break
    fps = clock.fps()
    print("%2.1f fps" % fps)
    a = lcd.display(img)
    gc.collect()
    # kpu.memtest()

 # a = kpu.deinit(task_fe)
 # a = kpu.deinit(task_ld)
 # a = kpu.deinit(task_fd)

运行Demo

  • 可以点击Boot Key按键,录入需要保存的人员照片
  • 目标人员进入摄像头区域即可识别到“Mr.1”(从代码部分可知,人员标记为1~10: names = ['Mr.1', 'Mr.2', 'Mr.3', 'Mr.4', 'Mr.5', 'Mr.6', 'Mr.7', 'Mr.8', 'Mr.9', 'Mr.10'])
  • 到此,即可完成一个人脸识别的功能啦!

 

 

赞赏

1

查看全部赞赏


回复

1867

帖子

3

资源

版主

恭喜入门啦,可不可分享一下如何把信息存入到数据库?

点评

按照文件系统操作就可以存储数据在spiffs或者tf卡  详情 回复 发表于 2022-7-3 22:13

回复

59

帖子

0

资源

一粒金砂(中级)

超级给力


回复

18

帖子

0

资源

一粒金砂(中级)

lugl4313820 发表于 2022-7-3 01:12 恭喜入门啦,可不可分享一下如何把信息存入到数据库?

按照文件系统操作就可以存储数据在spiffs或者tf卡

点评

我看了好多资料,人脸特征信息可以存到mysql里,但是加载时就要加载到内存,有没有方法直接在数据库里对比的?  详情 回复 发表于 2022-7-3 23:22

回复

1867

帖子

3

资源

版主

alanlan86 发表于 2022-7-3 22:13 按照文件系统操作就可以存储数据在spiffs或者tf卡

我看了好多资料,人脸特征信息可以存到mysql里,但是加载时就要加载到内存,有没有方法直接在数据库里对比的?


回复

1626

帖子

0

资源

版主

有视频吗?想看看效果~


回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

最新文章 更多>>
    关闭
    站长推荐上一条 1/10 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表