來源:Victor Dibia編譯:weakish
編者按:傳統(tǒng)的追蹤檢測物體方法大多基于規(guī)則,面對一些復雜情況時(光照、遮蔽、視角)表現(xiàn)不佳。而快速神經(jīng)網(wǎng)絡(luò)的興起,使神經(jīng)網(wǎng)絡(luò)應(yīng)用于實時物體追蹤檢測成為可能。IBM研究院研究員(Research Staff Member)Victor Dibia在本月初發(fā)文介紹了如何使用Tensorflow框架基于SSD神經(jīng)網(wǎng)絡(luò)構(gòu)建實時手部檢測器。
本文記錄了使用Tensorflow(Object Detection API)訓練一個手部檢測器的步驟和代碼。我主要感興趣的是實時檢測桌子上的手。我希望本文能夠展示如何將神經(jīng)網(wǎng)絡(luò)應(yīng)用于追蹤手部(第一人稱視角和其他視角),并取得良好的結(jié)果。
可以從Github獲取所有的代碼(包括訓練好的模型)。
下圖是檢測器的實時演示:
和任何基于DNN/CNN的任務(wù)一樣,流程中成本最高的(也是風險最大的)部分是尋找或創(chuàng)建正確的(標注過的)數(shù)據(jù)集。我首先嘗試了牛津手部數(shù)據(jù)集進行了實驗(結(jié)果不好)。我接著嘗試了Egohands數(shù)據(jù)集,這個數(shù)據(jù)集更符合我的需求(第一人稱視角、高質(zhì)量圖像、手部標注)。
一些fps數(shù)字:
21 FPS使用320 * 240圖像,運行時無可視化結(jié)果。
16 FPS使用320 * 240圖像,運行時可視化結(jié)果
11 FPS使用640 * 480圖像,運行時可視化結(jié)果(上圖)
以上數(shù)據(jù)是在MacBook ProCPU(i7,2.5GHz,16GB)上測試的結(jié)果。
動機——為什么使用神經(jīng)網(wǎng)絡(luò)追蹤/檢測手部?
計算機視覺領(lǐng)域現(xiàn)在有若干追蹤方法。湊巧的是,其中許多方法是基于規(guī)則的(例如,基于紋理和邊界特征來提取背景,使用色彩直方圖和HOG分類器來區(qū)分手和背景等),因而它們的魯棒性不是非常好。例如,如果背景不同尋常,或者照明條件的急劇變化導致了膚色的急劇變化或追蹤物被遮蔽,這些算法可能會很困惑。(可以參考這篇關(guān)于HCI領(lǐng)域估計手部姿態(tài)的綜述:https://www.cse.unr.edu/~bebis/handposerev.pdf)。
快速移動或者手部角度比較特殊時會出現(xiàn)檢測不到的情況
有了足夠大的數(shù)據(jù)集,神經(jīng)網(wǎng)絡(luò)提供了訓練表現(xiàn)良好的模型的機會,同時應(yīng)對了現(xiàn)有對象追蹤/檢測算法的挑戰(zhàn)——多樣化的/差的照明條件,多化的視角甚至遮蔽。神經(jīng)網(wǎng)絡(luò)用于實時跟蹤/檢測的主要缺陷是,它們可能是很復雜的,與僅作追蹤的算法比相對較慢,并且收集一個精良的數(shù)據(jù)集成本可能相當高。但隨著神經(jīng)網(wǎng)絡(luò)的快速發(fā)展,情況正在改變。
此外,深度學習框架(例如tensorflow的Object Detection API)簡化了針對自定義物體檢測的模型的訓練過程,使這個領(lǐng)域的工作變得更加容易上手。更重要的是,ssd、faster r-cnn、rfcn等快速神經(jīng)網(wǎng)絡(luò)模型如ssd,更快的r-cnn,rfcn(見這里)等的出現(xiàn)使神經(jīng)網(wǎng)絡(luò)成為實時檢測(和追蹤)應(yīng)用的有吸引力的候選者。在HCI領(lǐng)域(如輸入設(shè)備等),有很多像這樣的魯棒性很強的手部追蹤應(yīng)用。
如果你對訓練檢測器的過程不感興趣,你可以直接跳到應(yīng)用模型檢測手部的那節(jié)。
噪雜背景和遮蔽
訓練模型是一個多階段過程(匯總數(shù)據(jù)集、清洗,分割訓練、測試集并生成推理圖)。雖然我簡要描述了這些部分的細節(jié),但還有其他一些教程更詳細地介紹如何使用tensorflow Object Detection API。如果對從頭開始訓練一個定制的檢測器感興趣,我建議你通讀這些教程。
Tensorflow的數(shù)據(jù)預備和網(wǎng)絡(luò)訓練
Egohands數(shù)據(jù)集
手部檢測器模型使用了Egohands數(shù)據(jù)集中的數(shù)據(jù)的。這個數(shù)據(jù)集效果不錯的原因有幾個。 它包含優(yōu)質(zhì)的像素級別標注(> 15000個摳像標注),其中有4800張圖像包含手部。所有的圖像都是基于第一人稱視角(Google glass)拍攝的,這些圖像取自48個不同的環(huán)境(室內(nèi),室外)和活動(玩紙牌,下國際象棋,搭積木,解決謎題等)。如果你將使用Egohands數(shù)據(jù)集,可以按如下方式引用它:
Bambach, Sven, et al. “Lending a hand: Detecting hands and recognizing activities in complex egocentric interactions.” Proceedings of the IEEE International Conference on Computer Vision. 2015.
Egohands數(shù)據(jù)集用多邊形(白點)圈出了每只手
Egohands數(shù)據(jù)集(包含標注數(shù)據(jù)的zip文件)包含48個文件夾,每個文件夾對應(yīng)于視頻采集的地點(每個文件夾包含100張圖片)。
— LOCATION_X
— frame_1.jpg
— frame_2.jpg
…
— frame_100.jpg
— polygons.mat // 標注
— LOCATION_Y
— frame_1.jpg
— frame_2.jpg
…
— frame_100.jpg
— polygons.mat // 標注
轉(zhuǎn)換數(shù)據(jù)至Tensorflow格式
首先需要將Egohands數(shù)據(jù)集轉(zhuǎn)換為適用于Tensorflow的格式(tfrecord)。Github 倉庫中包含一個egohands_dataset_clean.py腳本,它可以幫助生成這些csv文件。
下載egohands數(shù)據(jù)集
重命名所有文件,在文件名中包含其目錄名稱,以確保每個文件名都是唯一的
將數(shù)據(jù)集分成訓練(80%)和測試(20%)兩個文件夾。
讀入每個文件夾中的“polygons.mat”,生成包圍盒,并將其可視化以確保正確。
一旦腳本運行完畢,你應(yīng)該有一個包含訓練和測試文件夾的圖像文件夾。每個文件夾中還應(yīng)該包含一個用于生成tfrecords的csv標注文件,文件名分別為train_labels.csv和test_labels.csv。
接著,將數(shù)據(jù)集和csv文件轉(zhuǎn)換為tfrecord。請參考Harrison提供的教程了解如何轉(zhuǎn)換(https://pythonprogramming.net/creating-tfrecord-files-tensorflow-object-detection-api-tutorial/)。如果你在本地訓練,這個教程還介紹了如何在本地啟動培訓進程。如果你使用GCP之類的服務(wù)在云端訓練,請參考這個教程(https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/running_on_cloud.md)。
注意:雖然egohands數(shù)據(jù)集為手部提供了四個單獨的標簽(自己的左手、自己的右手、他人的左手、他人的右手),但本文只對一般的“手”感興趣,因此上面的腳本將所有的訓練數(shù)據(jù)都標記為“手”。你可以修改訓練腳本以生成支持4個標簽的tfrecord。
訓練手部檢測模型
預備好數(shù)據(jù)集后,接下來的任務(wù)就是在這個數(shù)據(jù)集上訓練模型。我們可以使用遷移學習來縮短訓練整個模型所需的時間。這意味著我們可以找一個已經(jīng)在相關(guān)的領(lǐng)域(這里是圖像分類)訓練過的現(xiàn)有模型,并重新訓練它最后一層或幾層網(wǎng)絡(luò)來檢測手部。棒!考慮到神經(jīng)網(wǎng)絡(luò)有時候有幾千甚至幾百萬參數(shù),這些參數(shù)可能需要幾周或幾個月的時間來訓練,遷移學習有助于縮短訓練時間,可能縮短到幾小時。實際上,Tensorflow就提供了一些模型(在tensorflow model zoo),我選擇ssd_mobilenet_v1_coco模型作為起點,因為它是目前最快的機型(之一,參見SSD研究論文),訓練過程可以在你本地的CPU機器上完成,這可能需要一段時間,或者在(云)GPU機器上訓練,這樣快很多(我正是這么做的)。作為參考,在我的MacBook Pro(從源碼編譯tensorflow以充分利用mac的cpu架構(gòu)的特性)上,我取得的最大訓練速度是每步5秒,而在GPU上則是每步 0.5秒。也就是說,在我的mac(i7,2.5GHz,16GB)上運行20萬步需要約12天,而在GPU上需要約5小時。
隨著訓練過程的進展,我預期總損失(錯誤)會降低到可能的最小值(大約為1或更低)。通過觀察tensorboard圖形上顯示的總損失(見下圖),應(yīng)該可以了解到訓練過程何時完成(總損失不會因更多迭代/步驟而下降)。我運行了20萬步訓練(花了大約5小時),在總損失(錯誤)值2.575處停止訓練。(現(xiàn)在反思一下,我本可以在大約5萬步處停止訓練,總損失值也差不多)。使用tensorflow,你還可以并發(fā)運行評估,評估你的模型在測試數(shù)據(jù)上的表現(xiàn)。衡量表現(xiàn)的常用指標是平均精確率(mean average precision,mAP),它是一個總結(jié)精度-召回曲線下面積的數(shù)字。mAP是衡量模型表現(xiàn)的度量,模型的表現(xiàn)指生成與我們的測試數(shù)據(jù)集中的摳像包圍盒至少有50%重疊區(qū)域的包圍盒。對于這里訓練的手部檢測器,mAP值為0.9686@0.5IOU。mAP取值范圍為0-1,越高越好。
最終的損失值為2.275,mAP為0.9686
訓練完成后,導出訓練好的推理圖(frozen_inference_graph.pb)(具體步驟參見前文提到的教程),將其保存在hand_inference_graph文件夾中?,F(xiàn)在是時候做一些有趣的檢測了。
使用檢測器檢測和追蹤手部
將檢測器應(yīng)用到Y(jié)outube視頻
如果你還沒有安裝好Tensorflow,請依照這個教程安裝Tensorflow及其object detection api(https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/installation.md)。
檢測手部的一般步驟如下:
加載frozen_inference_graph.pb
讀取輸入圖像(來自實時視頻流、視頻文件或靜態(tài)圖像)
檢測手部并可視化包圍盒
GitHub倉庫中有兩個腳本,整合了以上步驟:
detect_multi_threaded.py:讀取攝像頭視頻輸入并進行檢測的多線程實現(xiàn)。
detect_single_threaded.py: 和上面的腳本一樣,只不過它是單線程的。適用于視頻文件。
最重要的,代碼倉庫中的frozen_inference_graph.pb包含了一個基于SSD訓練好的模型,你能很容易地將它導入你的tensorflow應(yīng)用來檢測手部。
一些優(yōu)化的想法
顯著提升表現(xiàn)的因素:
線程:從攝像頭讀取圖像是一個負擔很重的I/O事件,如果在主應(yīng)用線程上運行它,可能會減慢程序。我實現(xiàn)了Adrian Rosebuck的一些在多個工作線程上并行捕捉圖像的好想法?;旧?,這增加了約5 FPS。
新接觸OpenCV的人可能沒考慮到cv2.read()方法返回BGR格式的圖像。 確保在檢測之前將其轉(zhuǎn)換為RGB(否則的話,精確率會大大降低)。
保證你的輸入圖像使用較小的尺寸將增加fps,同時不會帶來任何顯著的精確率下降(我使用了約320×240的圖像,而不是我的攝像頭默認提供的1280×720圖像)。
組合效果不錯的追蹤算法也能提升表現(xiàn),我仍在嘗試這方面的優(yōu)化。如果你有優(yōu)化的想法,歡迎分享!
有很多手的隨機圖片顯示了檢測器的一些局限
注意:檢測器確實反映了與訓練集相關(guān)的一些限制。包括非第一人稱視角、非常嘈雜的背景(手山手海),有時甚至是膚色。使用更多的數(shù)據(jù)有機會改善這方面的表現(xiàn)。
集成多DNN
讓事情變得更有趣的一種方式是將我們對“手”的位置的新知識與經(jīng)訓練用于識別其他物體的檢測器整合起來。不幸的是,雖然我們的手部檢測器確實可以檢測到手部,但它不能檢測到其他物體。 要創(chuàng)建一個可以分類多個不同對象的檢測器,意味著要為每個類預備一個數(shù)據(jù)集并進行訓練,這一過程將十分漫長。
因此,一個潛在的替代策略是探索允許我們高效地交錯用于多種物體的多個預訓練模型的結(jié)構(gòu),并讓它們檢測單個圖像上的多個物體。
舉例來說,我有興趣了解桌子上的物體相對于同一張桌子上的手的位置。我目前正在研發(fā)一個多線程應(yīng)用,該應(yīng)用加載多個檢測器,在一張圖像上輸出多個包圍盒。很快我會在后續(xù)的文章中介紹這方面的內(nèi)容。
致謝
這個成果對我而言也是一次緊張的學習Python和Tensorflow的周末課程。沒有Egohands數(shù)據(jù)集的話,這一切都是不可能的,非常感謝作者們![Harrison][pythongramming]和Dat Tran的tensorflow自定義對象檢測教程對這個學習過程極有幫助。當然,非常感謝Tensorflow的作者們!它是一個很棒的框架!
引用本教程
如果你打算引用本教程:
Victor Dibia, Real-time Hand-Detection using Neural Networks (SSD) on Tensorflow, (2017), GitHub repository。
@misc{Dibia2017,
author = {Victor, Dibia},
title = {Real-time HandTrackingUsing SSD on Tensorflow },
year = {2017},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {url{https://github.com/victordibia/handtracking}},
commit = {b523a27393ea1ee34f31451fad656849915c8f42}
}
歡迎通過Twitter、Github和Linkedin與作者交流。
參考文獻
Bambach, S., Lee, S., Crandall, D. J., and Yu, C. 2015.“Lending A Hand: Detecting Hands and Recognizing Activities in Complex Egocentric Interactions,”in ICCV, pp. 1949–1957
Erol, A., Bebis, G., Nicolescu, M., Boyle, R. D., and Twombly, X. 2007. “Vision-based hand pose estimation: A review,” Computer Vision and Image Understanding (108:1–2), pp. 52–73 (doi: 10.1016/j.cviu.2006.10.012).
Liu, W., Anguelov, D., Erhan, D., Szegedy, C., Reed, S., Fu, C. Y., and Berg, A. C. 2016. “SSD: Single shot multibox detector,” in European conference on computer vision (Vol. 9905 LNCS), Springer Cham, pp. 21–37 (doi: 10.1007/978-3-319-46448-0_2).
Betancourt, A., Morerio, P., Regazzoni, C. S., and Rauterberg, M. 2015. “The Evolution of First Person Vision Methods: A Survey,” IEEE Transactions on Circuits and Systems for Video Technology (25:5), pp. 744–760 (doi: 10.1109/TCSVT.2015.2409731)
GitHub地址:https://github.com/victordibia/handtracking
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4779瀏覽量
101079 -
SSD
+關(guān)注
關(guān)注
21文章
2887瀏覽量
117725 -
tensorflow
+關(guān)注
關(guān)注
13文章
329瀏覽量
60599
原文標題:基于SSD神經(jīng)網(wǎng)絡(luò)實時檢測手部
文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論