第四十章 YOLO2人手檢測(cè)實(shí)驗(yàn)
在上一章節(jié)中,介紹了利用maix.KPU模塊實(shí)現(xiàn)YOLO2的人臉檢測(cè),本章將繼續(xù)介紹利用maix.KPU模塊實(shí)現(xiàn)YOLO2的人手檢測(cè)。通過(guò)本章的學(xué)習(xí),讀者將學(xué)習(xí)到Y(jié)OLO2網(wǎng)絡(luò)的人手檢測(cè)應(yīng)用在CanMV上的實(shí)現(xiàn)。
本章分為如下幾個(gè)小節(jié):
40.1 maix.KPU模塊介紹
40.2 硬件設(shè)計(jì)
40.3 程序設(shè)計(jì)
40.4 運(yùn)行驗(yàn)證
40.1 maix.KPU模塊介紹
有關(guān)maix.KPU模塊的介紹,請(qǐng)見第39.1小節(jié)《maix.KPU模塊介紹》。
40.2 硬件設(shè)計(jì)
40.2.1 例程功能
1. 獲取攝像頭輸出的圖像,并送入KPU進(jìn)行YOLO2的人手檢測(cè)模型運(yùn)算,后將運(yùn)算結(jié)果和攝像頭輸出的圖像一起顯示在LCD上。
40.2.2 硬件資源
本章實(shí)驗(yàn)內(nèi)容,主要講解maix.KPU模塊的使用,無(wú)需關(guān)注硬件資源。
40.2.3 原理圖
本章實(shí)驗(yàn)內(nèi)容,主要講解maix.KPU模塊的使用,無(wú)需關(guān)注原理圖。
40.3 程序設(shè)計(jì)
40.3.1 maix.KPU模塊介紹
有關(guān)maix.KPU模塊的介紹,請(qǐng)見第40.1小節(jié)《maix.KPU模塊介紹》。
40.3.2 程序流程圖
40.3.3 main.py代碼
main.py中的腳本代碼如下所示:
import lcd
import sensor
import image
import gc
from maix import KPU
lcd.init()
sensor.reset()
sensor.set_framesize(sensor.QVGA)
sensor.set_pixformat(sensor.RGB565)
sensor.set_hmirror(False)
resize_img = image.Image(size=(320, 256))
anchor = (0.8125, 0.4556, 1.1328, 1.2667, 1.8594, 1.4889, 1.4844, 2.2000, 2.6484, 2.9333)
names = ['hand']
# 構(gòu)造KPU對(duì)象
hand_detecter = KPU()
# 加載模型文件
hand_detecter.load_kmodel('/sd/KPU/hand_detect.kmodel')
# 初始化YOLO2網(wǎng)絡(luò)
hand_detecter.init_yolo2(anchor, anchor_num=len(anchor) // 2, img_w=320, img_h=240, net_w=320, net_h=256, layer_w=10, layer_h=8, threshold=0.7, nms_value=0.3, classes=len(names))
while True:
? ? img= sensor.snapshot()
? ?resize_img.draw_image(img, 0, 0).pix_to_ai()
? ? # 進(jìn)行KPU運(yùn)算
? ?hand_detecter.run_with_output(resize_img)
? ? # 進(jìn)行YOLO2運(yùn)算
? ?hands = hand_detecter.regionlayer_yolo2()
? ? for hand in hands:
? ?? ? img.draw_rectangle(hand[0], hand[1], hand[2], hand[3], color=(0, 255, 0))
? ?? ? img.draw_string(hand[0] + 2, hand[1] + 2, "%.2f" % (hand[5]), color=(0, 255, 0))
? ?? ? img.draw_string(hand[0] + 2, hand[1] + 10, names[hand[4]], color=(0, 255, 0))
? ? lcd.display(img)
? ? gc.collect()
可以看到一開始是先初始化了LCD和攝像頭。
接著是構(gòu)造一個(gè)KPU對(duì)象,并從文件系統(tǒng)中加載YOLO2人手檢測(cè)網(wǎng)絡(luò)需要用到的網(wǎng)絡(luò)模型,并初始化YOLO2網(wǎng)絡(luò)。
然后便是在一個(gè)循環(huán)中不斷地獲取攝像頭輸出的圖像,由于網(wǎng)絡(luò)需要的圖像尺寸與攝像頭直接輸出的圖像尺寸不一致,因此將其復(fù)制到網(wǎng)絡(luò)需要的圖像尺寸的圖像上,再并將其送入KPU中進(jìn)行運(yùn)算,然后再進(jìn)行YOLO2網(wǎng)絡(luò)運(yùn)算,最后便得到網(wǎng)絡(luò)識(shí)別出人手在輸入圖像上的一些信息,將這些信息繪制到圖像上后,在LCD上顯示圖像。
40.4 運(yùn)行驗(yàn)證
將DNK210開發(fā)板連接CanMV IDE,點(diǎn)擊CanMV IDE上的“開始(運(yùn)行腳本)”按鈕后,將攝像頭對(duì)準(zhǔn)人手,讓其采集到人手圖像,隨后便能在LCD上看到攝像頭輸出的圖像,同時(shí)圖像中的人手均被綠色的矩形框框出,并在矩形框內(nèi)的左上角標(biāo)出了人手的置信度,如下圖所示: