2111 views|4 replies

109

Posts

8

Resources
The OP
 

[Automatic clock-in walking timing system based on face recognition] MaixBit-K210 can easily run with face recognition function! [Copy link]

 

Preparation

Get machine code

  • Register an account on MaixHub: https://maix.sipeed.com/

  • After logging in, search for the face recognition model, click the [Download] button, and you will be prompted to enter the machine code.

  • Refer to the following connection steps: Get the machine code of MaixPy series development board——MaixHub Machine code acquisition (sipeed.com)
  • Download the key_gen.bin file, use kflash_gui to download the bin file to the board, and connect the serial port assistant tool (115200-8N1) to obtain a string of 32-byte machine code.
  • After filling in the 32-bit machine code, you can get a compressed package. After decompression, there will be main.py and 3 smodel files (encrypted files of kmodel mode files)

Update the firmware of MaixBit

  • Download firmware file link: Download Site - Sipeed
  • Note the file selection: Use Maixpy IDE and support kmodel V4 to select the file [9]

  • Use kflash_gui to successfully download the firmware to the development board.

Copy the smodel file to the TF card

  • If you have a TF card, you can use a card reader to copy the three smodel files into the TF card:

  • ps: If you encounter TF card cannot be mounted, please note that the format of TF card should be FAT32

Code Link

  • On the MaixPy IDE, enter the Python code:
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)

Run Demo

  • You can click the Boot Key button to enter the photos of the people you want to save.
  • When the target person enters the camera area, "Mr. 1" can be identified (from the code part, we can see that the person is marked as 1~10: names = ['Mr.1', 'Mr.2', 'Mr.3', 'Mr.4', 'Mr.5', 'Mr.6', 'Mr.7', 'Mr.8', 'Mr.9', 'Mr.10'])
  • At this point, the face recognition function has been completed!

This post is from DigiKey Technology Zone

Latest reply

Is there a video? I want to see the effect~   Details Published on 2022-7-4 09:27

赞赏

1

查看全部赞赏

 
 

6841

Posts

11

Resources
2
 
Congratulations on getting started. Can you share with me how to store information into the database?
This post is from DigiKey Technology Zone

Comments

According to the file system operation, data can be stored in SPIFFS or TF card  Details Published on 2022-7-3 22:13
 
 
 

109

Posts

8

Resources
3
 
lugl4313820 posted on 2022-7-3 01:12 Congratulations on getting started. Can you share how to store information in the database?

According to the file system operation, the data can be stored in SPIFFS or TF card

This post is from DigiKey Technology Zone

Comments

I have read a lot of information and found that facial feature information can be stored in MySQL, but it must be loaded into memory when loaded. Is there any way to compare it directly in the database?  Details Published on 2022-7-3 23:22
 
 
 

6841

Posts

11

Resources
4
 
alanlan86 posted on 2022-7-3 22:13 According to the file system operation, you can store data in spiffs or tf card

I have read a lot of information and found that facial feature information can be stored in MySQL, but it must be loaded into memory when loaded. Is there any way to compare it directly in the database?

This post is from DigiKey Technology Zone
 
 
 

6788

Posts

2

Resources
5
 

Is there a video? I want to see the effect~

This post is from DigiKey Technology Zone
 
 
 

Just looking around
Find a datasheet?

EEWorld Datasheet Technical Support

Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号
快速回复 返回顶部 Return list