第四十一章 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上的實現。
本章分為如下幾個小節:
41.1 maix.KPU模組介紹
41.2 硬體設計
41.3 程式設計
41.4 執行驗證
41.1 maix.KPU模組介紹
有關maix.KPU模組的介紹,請見第39.1小節《maix.KPU模組介紹》。
41.2 硬體設計
41.2.1 例程功能
- 獲取攝像頭輸出的影像,並送入KPU進行YOLO2的物體檢測模型運算,後將運算結果和攝像頭輸出的影像一起顯示在LCD上。
41.2.2 硬體資源
本章實驗內容,主要講解maix.KPU模組的使用,無需關注硬體資源。
41.2.3 原理圖
本章實驗內容,主要講解maix.KPU模組的使用,無需關注原理圖。
41.3 程式設計
41.3.1 maix.KPU模組介紹
有關maix.KPU模組的介紹,請見第41.1小節《maix.KPU模組介紹》。
41.3.2 程式流程圖
圖41.3.2.1 YOLO2人手檢測實驗流程圖
41.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 = (1.3221, 1.73145, 3.19275, 4.00944, 5.05587, 8.09892, 9.47112, 4.84053, 11.2364, 10.0071)
names = ["aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable",
"dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"]
# 構造KPU物件
object_detecter = KPU()
# 載入模型檔案
object_detecter.load_kmodel("/sd/KPU/voc20_detect.kmodel")
# 初始化YOLO2網路
object_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.5, nms_value=0.2, classes=len(names))
while True:
img= sensor.snapshot()
resize_img.draw_image(img, 0, 0).pix_to_ai()
# 進行KPU運算
object_detecter.run_with_output(resize_img)
# 進行YOLO2運算
objects = object_detecter.regionlayer_yolo2()
for object in objects:
img.draw_rectangle(object[0], object[1], object[2], object[3], color=(0, 255, 0))
img.draw_string(object[0] + 2, object[1] + 2, "%.2f" % (object[5]), color=(0, 255, 0))
img.draw_string(object[0] + 2, object[1] + 10, names[object[4]], color=(0, 255, 0))
lcd.display(img)
gc.collect()
可以看到一開始是先初始化了LCD和攝像頭。
接著是構造一個KPU物件,並從檔案系統中載入YOLO2人手檢測網路需要用到的網路模型,並初始化YOLO2網路。
然後便是在一個迴圈中不斷地獲取攝像頭輸出的影像,由於網路需要的影像尺寸與攝像頭直接輸出的影像尺寸不一致,因此將其複製到網路需要的影像尺寸的影像上,再並將其送入KPU中進行運算,然後再進行YOLO2網路運算,最後便得到網路識別出物體在輸入影像上的一些資訊,將這些資訊繪製到影像上後,在LCD上顯示影像。
41.4 執行驗證
將DNK210開發板連線CanMV IDE,點選CanMV IDE上的“開始(執行指令碼)”按鈕後,將攝像頭對準物體,讓其採集到物體影像,隨後便能在LCD上看到攝像頭輸出的影像,同時影像中的物體均被綠色的矩形框框出,並在矩形框內的左上角標出了物體的名稱和置信度,如下圖所示:
圖41.4.1 LCD顯示YOLO2物體檢測結果