0
本文作者: skura | 2020-02-11 13:44 |
作為目前機(jī)器學(xué)習(xí)領(lǐng)域最火熱的研究方向之一,計(jì)算機(jī)視覺(jué)相關(guān)的技術(shù)一直備受關(guān)注。其中,目標(biāo)檢測(cè)是計(jì)算機(jī)視覺(jué)領(lǐng)域常見(jiàn)的問(wèn)題之一,如何平衡檢測(cè)的質(zhì)量和算法的速度很重要。對(duì)于這個(gè)問(wèn)題,計(jì)算機(jī)視覺(jué)工程師、VirtusLab 創(chuàng)始人 Piotr Skalski 發(fā)表了自己的心得,分享了關(guān)于他最喜歡的計(jì)算機(jī)視覺(jué)算法 YOLO 的實(shí)踐資料。以下便是他的全文。
前言
YOLO 是我最喜歡的計(jì)算機(jī)視覺(jué)算法之一,在很長(zhǎng)一段時(shí)間里,我計(jì)劃著專(zhuān)為它寫(xiě)一篇博文。然而,我不希望它成為另一篇詳細(xì)解釋 YOLO 背后工作原理的文章,網(wǎng)上有很多文章都很好地涵蓋了它理論方面的知識(shí)。除此之外,如果你想加深對(duì)這個(gè)架構(gòu)的理解,直接從源代碼獲取信息并閱讀源文件(https://arxiv.org/abs/1506.02640)也是一個(gè)好主意。
基于 YouTube-8M 數(shù)據(jù)集的籃球場(chǎng)球員移動(dòng)檢測(cè)
這一次,我將向你展示如何快速地、以相對(duì)較低的代價(jià)和不那么強(qiáng)大的機(jī)器創(chuàng)建目標(biāo)檢測(cè)模型,這個(gè)模型能夠檢測(cè)任何你選擇的對(duì)象。如果你需要在工作中快速測(cè)試你的想法,或者只是有一小段時(shí)間建立在家構(gòu)建你的項(xiàng)目,這是一個(gè)很好的方法。去年,我有機(jī)會(huì)進(jìn)行了幾個(gè)這樣的實(shí)驗(yàn),本文中出現(xiàn)的所有可視化結(jié)果都是出自這些項(xiàng)目。
注意:這一次,我們將主要使用開(kāi)源庫(kù)和工具,因此我們網(wǎng)站上的編碼量將是最小的。但是,為了鼓勵(lì)你使用 YOLO 并為你的項(xiàng)目提供一個(gè)起點(diǎn),我還提供了腳本,允許你下載我的預(yù)訓(xùn)練模型以及所有配置文件和測(cè)試數(shù)據(jù)集。像往常一樣,你會(huì)在我的 GitHub 上找到所有的內(nèi)容:https://github.com/SkalskiP/ILearnDeepLearning.py/tree/master/02_data_science_toolkit/02_yolo_object_detection 。
YOLO
所有不知道 YOLO 是什么的人不要擔(dān)心,也不要去任何地方找資料!我現(xiàn)在簡(jiǎn)要地解釋一下我說(shuō)的是什么。
YOLO 是一種實(shí)時(shí)目標(biāo)檢測(cè)算法,它是第一個(gè)平衡所提供檢測(cè)的質(zhì)量和速度的算法。通常,這類(lèi)最強(qiáng)大的模型,都是建立在卷積神經(jīng)網(wǎng)絡(luò)的基礎(chǔ)上,這次也不例外。所謂「目標(biāo)檢測(cè)模型」,我們的意思是,我們不僅可以用它來(lái)找出給定照片中存在的對(duì)象,還可以用它來(lái)指示它們的位置和數(shù)量。除其他外,這種模型在機(jī)器人和汽車(chē)工業(yè)中都有應(yīng)用,因此檢測(cè)速度至關(guān)重要。自2015年以來(lái),該算法已經(jīng)進(jìn)行了三次迭代,還有為 TinyYOLO 等移動(dòng)設(shè)備設(shè)計(jì)的變體。移動(dòng)版本的精度有限,但計(jì)算要求也較低,運(yùn)行速度更快。
數(shù)據(jù)集
和深度學(xué)習(xí)一樣,創(chuàng)建模型的第一步是準(zhǔn)備一個(gè)數(shù)據(jù)集。有監(jiān)督的學(xué)習(xí)是查看標(biāo)記的示例并在數(shù)據(jù)中發(fā)現(xiàn)不明顯的模式。我必須承認(rèn)創(chuàng)建一個(gè)數(shù)據(jù)集是一個(gè)相當(dāng)乏味的任務(wù),因此我準(zhǔn)備了一個(gè)腳本,允許你下載我的象棋數(shù)據(jù)集,并查看 YOLO 如何在這個(gè)例子中工作。
但那些想要建立自己的數(shù)據(jù)集的人面臨著挑戰(zhàn)。為了實(shí)現(xiàn)這個(gè)目標(biāo),我們需要收集一組圖像并創(chuàng)建匹配的標(biāo)簽文件。圖片應(yīng)該包含我們想識(shí)別的對(duì)象,并且,數(shù)據(jù)集中所有對(duì)象的類(lèi)的分布應(yīng)該類(lèi)似。如你所見(jiàn),在我的第一個(gè)項(xiàng)目——籃球探測(cè)器中,我使用了游戲視頻中的框架。
籃球數(shù)據(jù)集的圖像樣本
標(biāo)簽文件應(yīng)該與圖像具有相同的名稱(chēng),但顯然具有不同的擴(kuò)展名,并且應(yīng)該位于并行目錄中。最佳數(shù)據(jù)結(jié)構(gòu)如下所示。除了 images 和 labels 目錄之外,我們還必須準(zhǔn)備 class_names.txt 文件,該文件定義我們計(jì)劃?rùn)z測(cè)的對(duì)象類(lèi)的名稱(chēng)。這個(gè)文件的每一行代表一個(gè)類(lèi),應(yīng)該包含一個(gè)或多個(gè)沒(méi)有空格的單詞。
標(biāo)記
不幸的是,YOLO 需要一個(gè)特定的標(biāo)簽格式,這是大多數(shù)免費(fèi)標(biāo)簽工具不支持的。為了消除從 VOC XML、VGG JSON 或其他廣泛使用的格式解析標(biāo)簽的需要,我們將利用 makesense.ai(https://www.makesense.ai/ ),這里是我在 GitHub 上開(kāi)發(fā)的一個(gè)免費(fèi)開(kāi)源項(xiàng)目(https://github.com/SkalskiP/make-sense )。編輯器不僅支持直接導(dǎo)出到 YOLO 格式,而且直觀,不需要安裝,可以在瀏覽器中工作。此外,它還支持多種功能,旨在加快你的標(biāo)簽工作。可以使用 MakeSense 查看人工智能支持的標(biāo)記過(guò)程。
AI 支持使用 makesense.ai 進(jìn)行標(biāo)記
工作完成后,我們可以下載一個(gè) .zip 文件,其中包含 .txt 文件。每一個(gè)這樣的文件都對(duì)應(yīng)于一個(gè)標(biāo)記的圖像,并描述照片中可見(jiàn)的對(duì)象。如果我們打開(kāi)其中一個(gè)文件,我們會(huì)發(fā)現(xiàn),每一行都是 class_idx x_center y_center width height 式。其中 class_idx 表示 class_names.txt 文件中指定標(biāo)簽的索引(從 0 開(kāi)始計(jì)數(shù))。其余參數(shù)描述圍繞單個(gè)對(duì)象的邊界框,它們可以取 0 到 1 之間的值。幸運(yùn)的是,大多數(shù)時(shí)候我們不需要考慮這些細(xì)節(jié),因?yàn)榫庉嬈鲿?huì)為我們處理所有的事情。YOLO 格式的標(biāo)簽示例如下所示。
環(huán)境設(shè)置
YOLO 最初是在一個(gè)叫做 Darknet 的深度學(xué)習(xí)的小框架中寫(xiě)的。從那時(shí)起,許多其它實(shí)現(xiàn)已經(jīng)創(chuàng)建,其中大多數(shù)使用兩個(gè)非常流行的 Python 平臺(tái):Keras 和 PyTorch。在所有可用的解決方案中,有一個(gè)是我特別喜歡的(https://github.com/ultralytics/yolov3 )。它提供了一個(gè)用于訓(xùn)練和檢測(cè)的高級(jí) API,但也具有很多有用的特性。在使用它時(shí),我們的所有工作歸結(jié)為準(zhǔn)備一個(gè)數(shù)據(jù)集和創(chuàng)建幾個(gè)配置文件,然后其余的工作就交給庫(kù)了。
環(huán)境設(shè)置也非常簡(jiǎn)單——可以歸結(jié)為運(yùn)行幾個(gè)命令,你可以在下面找到這些命令(假設(shè)你的計(jì)算機(jī)上已經(jīng)安裝了 Python 和 Git)。最好從項(xiàng)目目錄中執(zhí)行命令,以實(shí)現(xiàn)上面所示的結(jié)構(gòu)。值得一提的是,環(huán)境也可以通過(guò) Docker 創(chuàng)建(這對(duì) Windows 用戶(hù)特別有用)。你可以在這里(https://github.com/ultralytics/yolov3/wiki/Docker-Quickstart )找到更多關(guān)于這個(gè)主題的說(shuō)明。
# Clone framework
git clone https://github.com/ultralytics/yolov3.git
# Enter framework catalogue [Linux/MacOS]
cd ./yolov3
# Setup Python environment
pip install -U -r requirements.txt
配置
如前一段所述,我們現(xiàn)在需要做的就是創(chuàng)建幾個(gè)配置文件。它們定義了訓(xùn)練集和測(cè)試集的位置、對(duì)象類(lèi)的名稱(chēng),并提供了所用神經(jīng)網(wǎng)絡(luò)的架構(gòu)指南。
國(guó)際象棋數(shù)據(jù)集標(biāo)注參考圖片
首先,我們需要將數(shù)據(jù)集分割成訓(xùn)練集和測(cè)試集。我們使用兩個(gè) .txt 文件來(lái)完成這項(xiàng)工作,它們中的每一個(gè)都包含指向數(shù)據(jù)集中特定圖像的路徑。為了加快工作速度,我準(zhǔn)備了一個(gè) Python 腳本,它將自動(dòng)為我們創(chuàng)建這些文件。你只需指示數(shù)據(jù)集的位置并定義訓(xùn)練集和測(cè)試集之間的分割百分比。train.txt/test.txt 文件的片段如下所示。
./dataset/images/image_1.png
./dataset/images/image_2.png
./dataset/images/image_3.png
...
.data 是我們需要提供的最終文件。讓我們用下一個(gè)項(xiàng)目的例子來(lái)討論它的內(nèi)容——象棋檢測(cè)器。在本例中,我有 12 個(gè)惟一的對(duì)象類(lèi)想要識(shí)別。接下來(lái),我們給出定義哪些照片屬于訓(xùn)練集,哪些照片屬于測(cè)試集的文件的位置,最后給出前面討論的帶有標(biāo)簽名稱(chēng)的文件的位置。為了使一切正常工作,chess.data、chess_train.txt、chess_test.txt 和 chess.names 文件應(yīng)移動(dòng)到 project/yolov3/data 目錄。
classes=12
train=./data/chess_train.txt
valid=./data/chess_test.txt
names=./data/chess.names
訓(xùn)練
現(xiàn)在我們準(zhǔn)備開(kāi)始訓(xùn)練。如前所述,我們使用的庫(kù)有一個(gè)高級(jí) API,因此終端中的一個(gè)命令和幾個(gè)參數(shù)就足以啟動(dòng)這個(gè)過(guò)程。然而,在下面還有幾件大大增加我們?nèi)〉米罱K成功的幾率的事情。
python3 train.py
--data ./data/project.data
--cfg ./cfg/project.cfg
--weights ./weights/yolov3.pt
首先,我們可以應(yīng)用遷移學(xué)習(xí),我們不必從頭開(kāi)始訓(xùn)練。我們可以使用在不同數(shù)據(jù)集上訓(xùn)練的模型的權(quán)重,從而縮短我們自己的網(wǎng)絡(luò)的學(xué)習(xí)時(shí)間。我們的模型可以使用基本的形狀知識(shí),并專(zhuān)注于將這些信息鏈接到我們想要識(shí)別的新類(lèi)型的對(duì)象。其次,庫(kù)執(zhí)行數(shù)據(jù)增強(qiáng),因此它根據(jù)我們提供的照片生成新的示例。因此,即使我們只有一個(gè)很小的數(shù)據(jù)集——幾百?gòu)垐D片,我們也可以訓(xùn)練我們的模型。我們使用的庫(kù)還為我們提供了一個(gè)由于增強(qiáng)而創(chuàng)建的圖像示例。下面你可以看到在我的籃球探測(cè)器的訓(xùn)練過(guò)程中創(chuàng)建的示例。
訓(xùn)練集數(shù)據(jù)增強(qiáng)的可視化
檢測(cè)
最后,快樂(lè)的時(shí)刻來(lái)了!我們致力于創(chuàng)建模型的工作得到了回報(bào),現(xiàn)在可以用它來(lái)找到我們?cè)谌魏握掌邢胍獙ふ业膶?duì)象。同樣地,這是一個(gè)非常簡(jiǎn)單的任務(wù),我們可以用終端中的一個(gè)簡(jiǎn)單命令來(lái)完成。執(zhí)行之后,我們將在輸出目錄中找到預(yù)測(cè)的結(jié)果。值得一提的是,我們還可以對(duì)自己拍攝的視頻進(jìn)行實(shí)時(shí)預(yù)測(cè),這在項(xiàng)目演示中尤其有用。
python3 detect.py
--data ./data/project.data
--cfg ./cfg/project.cfg
--weights ./weights/best.py
--source ./data/sample
基于 TinyYOLO 的象棋檢測(cè)
結(jié)論
如果你完成了上面的所有內(nèi)容,那么恭喜你!非常感謝你花時(shí)間閱讀這篇文章。我希望我能證明訓(xùn)練你自己的定制 YOLO 模型并不困難,我的建議將對(duì)你未來(lái)的實(shí)驗(yàn)有所幫助。
雷鋒網(wǎng)雷鋒網(wǎng)雷鋒網(wǎng)
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見(jiàn)轉(zhuǎn)載須知。