K210之亚博的板子也能用maixpy
遇到的问题
想用k210做一个人脸识别的项目,人脸识别像opencv那样,可以在线录入人脸信息,也可以在线删除人脸信息,也能在线识别人脸信息,据目前的探索(用的也是官方提供的人脸识别的模型)来看,k210也就是能识别出来人脸,具体识别是谁,精度太差太差,不知道有没有其他大神有新的方法,当然这也是题外话,先说说怎么用吧
- 1. ,机器码是运行模型的必要条件,模型都是加密的,需要根据机器码来下载属于自己的专用模型,也就是说自己的机器只能用属于自己的模型,机器码怎么获取,上这个网站,登录http://dl.sipeed.com/shareURL/MAIX/MaixPy/release下载站
搜索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()
能力有限,只是记录和分享学习过程 希望能给有需要的人提供帮助,除此之外没有任何用途,不喜勿喷 谢谢