以前M5stickVで画像を判別させる方法をやりましたが、これを応用して家族の顔を判別してみました。
判別するとLEDが光ります
LEDの色は4色しかないのですが、ちょうど家族4人分で割り当てられました。
アルティメット(父) 青
妻 緑
娘 4歳 赤
息子 1歳 白
boot.pyは下記のようになりました。
import image
import lcd
import sensor
import sys
import time
import KPU as kpu
from Maix import GPIO
from fpioa_manager import *
import KPU as kpu
lcd.init()
lcd.rotation(2)
try:
img = image.Image("/sd/startup.jpg")
lcd.display(img)
except:
lcd.draw_string(lcd.width()//2-100,lcd.height()//2-4, "Error: Cannot find start.jpg", lcd.WHITE, lcd.RED)
task = kpu.load("任意の学習ファイル名")
labels=["1","2","3","4"] #You can check the numbers here to real names.
fm.register(board_info.LED_W, fm.fpioa.GPIO3)
fm.register(board_info.LED_R, fm.fpioa.GPIO4)
fm.register(board_info.LED_G, fm.fpioa.GPIO5)
fm.register(board_info.LED_B, fm.fpioa.GPIO6)
led_w = GPIO(GPIO.GPIO3, GPIO.OUT)
led_r = GPIO(GPIO.GPIO4, GPIO.OUT)
led_g = GPIO(GPIO.GPIO5, GPIO.OUT)
led_b = GPIO(GPIO.GPIO6, GPIO.OUT)
led_w.value(1)
led_r.value(1)
led_g.value(1)
led_b.value(1)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_windowing((224, 224))
sensor.run(1)
lcd.clear()
while(True):
img = sensor.snapshot()
fmap = kpu.forward(task, img)
plist=fmap[:]
pmax=max(plist)
max_index=plist.index(pmax)
a = lcd.display(img)
print(labels[max_index])
b = int(labels[max_index])
if pmax > 0.98 and b == 4:
lcd.draw_string(50, 40, "Accu:%.2f Type:%s"%(pmax, labels[max_index].strip()))
print('brue')
led_b.value(0)
time.sleep_ms(400)
led_b.value(1)
if pmax > 0.98 and b == 3:
lcd.draw_string(50, 40, "Accu:%.2f Type:%s"%(pmax, labels[max_index].strip()))
print('green')
led_g.value(0)
time.sleep_ms(400)
led_g.value(1)
if pmax > 0.98 and b == 2:
lcd.draw_string(50, 40, "Accu:%.2f Type:%s"%(pmax, labels[max_index].strip()))
print('red')
led_r.value(0)
time.sleep_ms(400)
led_r.value(1)
if pmax > 0.98 and b == 1:
lcd.draw_string(50, 40, "Accu:%.2f Type:%s"%(pmax, labels[max_index].strip()))
print('white')
led_w.value(0)
time.sleep_ms(400)
led_w.value(1)
a = kpu.deinit(task)
注意点なのですが、認識の閾値(例:pmax > 0.98)をかなり上げておかないと誤認識が多くなります。閾値をあげても娘と息子は顔がクリソツなので結構間違えます。
今回はLEDでやりましたが、GPIOを使えば扉の開錠などに応用できそうです。
↑ずっと手で持っているのは大変なので3Dプリンタで台を作りました。