第四十章 YOLO2人手檢測實驗
1)實驗平臺:正點原子DNK210開發板
2)章節摘自【正點原子】DNK210使用指南 - CanMV版 V1.0
3)購買連結:https://detail.tmall.com/item.htm?&id=782801398750
4)全套實驗原始碼+手冊+影片下載地址:http://www.openedv.com/docs/boards/k210/ATK-DNK210.html
5)正點原子官方B站:https://space.bilibili.com/394620890
6)正點原子K210技術交流企鵝群:605557868
在上一章節中,介紹了利用maix.KPU模組實現YOLO2的人臉檢測,本章將繼續介紹利用maix.KPU模組實現YOLO2的人手檢測。透過本章的學習,讀者將學習到YOLO2網路的人手檢測應用在CanMV上的實現。
本章分為如下幾個小節:
40.1 maix.KPU模組介紹
40.2 硬體設計
40.3 程式設計
40.4 執行驗證
40.1 maix.KPU模組介紹
有關maix.KPU模組的介紹,請見第39.1小節《maix.KPU模組介紹》。
40.2 硬體設計
40.2.1 例程功能
- 獲取攝像頭輸出的影像,並送入KPU進行YOLO2的人手檢測模型運算,後將運算結果和攝像頭輸出的影像一起顯示在LCD上。
40.2.2 硬體資源
本章實驗內容,主要講解maix.KPU模組的使用,無需關注硬體資源。
40.2.3 原理圖
本章實驗內容,主要講解maix.KPU模組的使用,無需關注原理圖。
40.3 程式設計
40.3.1 maix.KPU模組介紹
有關maix.KPU模組的介紹,請見第40.1小節《maix.KPU模組介紹》。
40.3.2 程式流程圖
圖40.3.2.1 YOLO2人手檢測實驗流程圖
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']
# 構造KPU物件
hand_detecter = KPU()
# 載入模型檔案
hand_detecter.load_kmodel('/sd/KPU/hand_detect.kmodel')
# 初始化YOLO2網路
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()
# 進行KPU運算
hand_detecter.run_with_output(resize_img)
# 進行YOLO2運算
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和攝像頭。
接著是構造一個KPU物件,並從檔案系統中載入YOLO2人手檢測網路需要用到的網路模型,並初始化YOLO2網路。
然後便是在一個迴圈中不斷地獲取攝像頭輸出的影像,由於網路需要的影像尺寸與攝像頭直接輸出的影像尺寸不一致,因此將其複製到網路需要的影像尺寸的影像上,再並將其送入KPU中進行運算,然後再進行YOLO2網路運算,最後便得到網路識別出人手在輸入影像上的一些資訊,將這些資訊繪製到影像上後,在LCD上顯示影像。
40.4 執行驗證
將DNK210開發板連線CanMV IDE,點選CanMV IDE上的“開始(執行指令碼)”按鈕後,將攝像頭對準人手,讓其採集到人手影像,隨後便能在LCD上看到攝像頭輸出的影像,同時影像中的人手均被綠色的矩形框框出,並在矩形框內的左上角標出了人手的置信度,如下圖所示:
圖40.4.1 LCD顯示YOLO2人手檢測結果