RK3568-USB攝像頭實時AI物品識別
為了更直觀的體驗RK3568的AI算力,將AI識別例程與攝像頭功能結合起來,對攝像頭的每一幀圖像進行物品識別,這里使用的是RK提供的SSD模型。
SSD,全稱為Single Shot MultiBox Detector,是Wei Liu在ECCV 2016上提出的一種目標檢測算法,屬于一階段One Stage方法,SSD 模型利用不同尺度的特征圖進行目標的檢測,其模型結構圖如下:

SSD具有如下主要特點:
從YOLO中繼承了將detection轉化為regression的思路,同時一次即可完成網(wǎng)絡訓練
基于Faster RCNN中的anchor,提出了相似的prior box
加入基于特征金字塔(Pyramidal Feature Hierarchy)的檢測方式,相當于半個FPN思路
SSD網(wǎng)絡結構圖如下:

其算法步驟為:
將圖像輸入預訓練好的分類網(wǎng)絡(基于VGG16-Atrous)得到不同大小的特征映射
分別提取Conv4_3、Conv7、Conv8_2、Conv9_2、Conv10_2、Conv11_2層的特征映射feature map,在每個特征映射的每個點構造6個不同大小尺度的bounding box,進行檢測和分類來生成一些列bounding box
采用NMS處理不同特征映射的bounding box,刪掉部分重疊或者不正確的bounding box,得到最終的檢測框
OK3568-C開發(fā)板中自帶了已訓練好的AI模型,位于/userdata/model目錄下的ssd_inception_v2.rknn,我們直接用就可以了。
2 USB攝像頭實現(xiàn)物品識別代碼
先來看下整個代碼的項目結構,然后再來分別介紹各個功能模塊。
imageutil.h:圖像類型轉換相關函數(shù)
myvideosourceface.cpp/h:用于USB攝像頭圖像顯示
qtcamera.cpp/h:qt界面
rknn_ssd_process.cpp/h:用于SSD模型進行AI物品識別的接口函數(shù)
rknn_ssd.cpp/h:SSD模型相關函數(shù)

3 按幀獲取USB攝像頭圖像
Qt讀取并顯示USB攝像頭,需要3個基本元素:
QCamera:它是用于讀取攝像頭視頻信號的接口函數(shù)
QCameraInfo:它提供相機設備的常規(guī)信息,可以用來查詢系統(tǒng)上當前可用的相機設備
QCameraViewfinder:它提供了一個相機取景器的小部,該類繼承于QVideoWidget類,用于顯示多媒體類提供的視頻
3.1 USB相機獲取圖像
查找USB相機
3.2 改為自己的Viewfinder
上面的USB攝像頭顯示程序,使用的是Qt的QCameraViewfinder用來顯示攝像頭圖像,為了能獲取到每一幀的圖像,可以自己實現(xiàn)一個Viewfinder,然后在m_camera->setViewfinder時設置為自己的,并添加槽函數(shù)rcvFrame,當獲取到一幀圖像時,會觸發(fā)此函數(shù)。
4 圖像類型的轉換與顯示
4.1 QImage轉Mat
Qt是QCamera創(chuàng)建的USB攝像頭,獲取到的圖片格式是QImage類型,而使用OpenCV進行圖像處理,需要轉換為cv::Mat類型,轉換的方式如下:
4.2 Mat轉QImage
OpenCV進行圖像處理完成后,比如進行AI物品識別完成,并將識別的信息標記到圖像上后,需要再轉成QImage的類型用于在Qt中顯示出來,轉換的方式如下:
4.3 QImage轉QPixmap
QImage在Qt中還不能直接顯示出來,還需要再轉為QPixmap類型,轉換的方式如下:
4.4 圖像的顯示
這里創(chuàng)建一個QLabel用于顯示圖像,調(diào)用setPixmap方法即可將圖像顯示出來,最后的adjustSize用來自動調(diào)整大小。
5 RKNN例程移植
飛凌OK3568-C開發(fā)板資料中,自帶了ssd模型的測試程序,代碼位置如下,ssd的測試代碼是這3個文件:

測試代碼,需要在執(zhí)行時,輸入模型的目錄位置和測試圖片的位置,AI物品識別之后會產(chǎn)生一個輸出圖片,需要再使用圖片查看器查看結果。
為了方便功能的調(diào)用,這里將fltest_opencv_rknn_ssd_main.cc改寫為rknn_ssd_process.cpp,并將具體功能進行拆分,封裝為C++的形式。
5.1 按功能封裝為C++形式
自己封裝的RknnSsdModel類定義:
5.1.1 RKNN初始化
主要功能是根據(jù)傳入的rknn模型進行相關的初始化
5.1.2 RKNN運行
傳入一張Mat格式的圖片(一幀視頻圖像),經(jīng)過AI識別,并將識別的信息標注到圖片上后,將識別結果也以Mat格式傳出:
5.2 AI識別調(diào)用
OK3568-C開發(fā)板中自帶了已訓練好的AI模型,位于/userdata/model目錄下的ssd_inception_v2.rknn,在程序初始化時需要用到。

AI識別的代碼邏輯為:先在qtCamera初始化時調(diào)用RKNN的初始化,然后打開USB攝像頭,USB獲取到每幀圖像后, 調(diào)用DoRknnSsd進行AI物品識別,最后將識別的結果通過setPixmap方法展示出來
5.3 編譯
需要注意下Qt工程的配置文件,要把opencv的一些庫鏈接進去
qcamera.pri
qcamera.pro
最后的編譯腳本還和之前的一樣:
6 總結
本篇介紹了在飛凌OK3568-C開發(fā)板中,外接USB攝像頭,利用Qt和RKNN進行AI物品識別,通過已訓練好的SSD模型,進行攝像頭畫面的實時AI物品檢查的代碼實現(xiàn)原理。
