K210之亚博的板子也能用maixpy

K210之亚博的板子也能用maixpy

遇到的问题

想用k210做一个人脸识别的项目,人脸识别像opencv那样,可以在线录入人脸信息,也可以在线删除人脸信息,也能在线识别人脸信息,据目前的探索(用的也是官方提供的人脸识别的模型)来看,k210也就是能识别出来人脸,具体识别是谁,精度太差太差,不知道有没有其他大神有新的方法,当然这也是题外话,先说说怎么用吧

  1. 1. ,机器码是运行模型的必要条件,模型都是加密的,需要根据机器码来下载属于自己的专用模型,也就是说自己的机器只能用属于自己的模型,机器码怎么获取,上这个网站,登录http://dl.sipeed.com/shareURL/MAIX/MaixPy/release下载站
  2. 在这里插入图片描述
    搜索key,然后下载最后的那个key_gen_v1.2bin
    用kflash_gui软件将这个key_gen_v1.2bin烧到自己的板子里,注意kflash_gui的开发板要选自动,或者选KD**2那个,地址选0x000000,其他的选项不要动,注意烧写软件和连接软件不能同时使用,会有端口占用的错误,烧写成功后打开串口软件,复位k210开发板就能看到自己的机器码(key)了,
    现在要去下载属于自己的模型了,开心,去https://www.maixhub.com/网站首页,向下翻就能看到好多模型,我要做的人脸识别就在第一个,点击下载,然后输入自己的机器码,就等下载吧,(这里要下载3个文件,分别是xxxxxxx0x300000xxxxxxxx xxxxxxx0x400000xxxxxxxx xxxxxxx0x500000xxxxxxxx 有的浏览器只能弹出来2个下载框 那就在下一次 看看能不能下全 不行就换浏览器,我用的360浏览器 点击下载2次)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    下载完 就用kflash_gui烧到板子里吧,也可以放在sd卡,注意哈这个下载页面中关于这个模型就有相关的说明,告诉我们要将这3个模型分别下到哪个地址(0x300000 0x400000 0x500000)没错这3个地址和文件名上的那个是一样的,(实际上模型文件名就是该模型的烧录地址+自己的机器码) 运行这个模型也要有相应的固件 固件在下载页面也有指定,要用他指定的固件,固件就烧录到0x000000

到此那就只剩下程序了,程序如下:
下面是全部代码 需要根据亚博的原理图找到亚博板子的红绿灯的管脚 改一下就好了,我备注有写 红 绿灯。不改也能运行 就是没有红绿灯的效果

// 人脸识别

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.smodel)
task_ld = kpu.load(0x400000.smodel)
task_fe = kpu.load(0x500000.smodel)

clock = time.clock()

fm.register(2, fm.fpioa.GPIOHS0)    #这个是亚博的3轴按键中间的那个,如果当前人脸不认识 按下他就记录这个人脸了  以后就认识了
key_gpio = GPIO(GPIO.GPIOHS0, GPIO.IN)
start_processing = False
fm.register(13, fm.fpioa.GPIO1)    #这里的灯不是亚博的灯 要根据原理图改一下,将13改成具体的数就行   识别成功就亮绿灯
fm.register(14, fm.fpioa.GPIO2)#这里的灯不是亚博的灯 要根据原理图改一下,将13改成具体的数就行    识别不成功就亮红灯
LED_G = GPIO(GPIO.GPIO1, GPIO.OUT,value=1) #构建 LED 对象
LED_R = GPIO(GPIO.GPIO2, GPIO.OUT,value=1) #构建 LED 对象
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)
                LED_G.value(0)

                print('人脸已通过')

                LED_R.value(1)
            else:
                a = img.draw_string(i.x(), i.y(), ("X :%2.1f" % (
                    max_score)), color=(255, 0, 0), scale=2)
                LED_R.value(0)
                print('人脸未通过')

                LED_G.value(1)
            if start_processing:
                record_ftr = feature
                record_ftrs.append(record_ftr)
                start_processing = False

            break
    fps = clock.fps()

    a = lcd.display(img)
    gc.collect()

能力有限,只是记录和分享学习过程 希望能给有需要的人提供帮助,除此之外没有任何用途,不喜勿喷 谢谢

  • 17
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值