以下便是他的全文。
YOLO 是我最喜歡的計算機視覺算法之一,在很長一段時間里,我計劃著專為它寫一篇博文。然而,我不希望它成為另一篇詳細解釋 YOLO 背后工作原理的文章,網上有很多文章都很好地涵蓋了它理論方面的知識。除此之外,如果你想加深對這個架構的理解,直接從源代碼獲取信息并閱讀源文件(https://arxiv.org/abs/1506.02640)也是一個好主意。
這一次,我將向你展示如何快速地、以相對較低的代價和不那么強大的機器創建目標檢測模型,這個模型能夠檢測任何你選擇的對象。如果你需要在工作中快速測試你的想法,或者只是有一小段時間建立在家構建你的項目,這是一個很好的方法。去年,我有機會進行了幾個這樣的實驗,本文中出現的所有可視化結果都是出自這些項目。注意:這一次,我們將主要使用開源庫和工具,因此我們網站上的編碼量將是最小的。但是,為了鼓勵你使用 YOLO 并為你的項目提供一個起點,我還提供了腳本,允許你下載我的預訓練模型以及所有配置文件和測試數據集。像往常一樣,你會在我的 GitHub 上找到所有的內容:https://github.com/SkalskiP/ILearnDeepLearning.py/tree/master/02_data_science_toolkit/02_yolo_object_detection。
所有不知道 YOLO 是什么的人不要擔心,也不要去任何地方找資料!我現在簡要地解釋一下我說的是什么。
YOLO 是一種實時目標檢測算法,它是第一個平衡所提供檢測的質量和速度的算法。通常,這類最強大的模型,都是建立在卷積神經網絡的基礎上,這次也不例外。所謂「目標檢測模型」,我們的意思是,我們不僅可以用它來找出給定照片中存在的對象,還可以用它來指示它們的位置和數量。除其他外,這種模型在機器人和汽車工業中都有應用,因此檢測速度至關重要。自2015年以來,該算法已經進行了三次迭代,還有為 TinyYOLO 等移動設備設計的變體。移動版本的精度有限,但計算要求也較低,運行速度更快。
和深度學習一樣,創建模型的第一步是準備一個數據集。有監督的學習是查看標記的示例并在數據中發現不明顯的模式。我必須承認創建一個數據集是一個相當乏味的任務,因此我準備了一個腳本,允許你下載我的象棋數據集,并查看 YOLO 如何在這個例子中工作。
但那些想要建立自己的數據集的人面臨著挑戰。為了實現這個目標,我們需要收集一組圖像并創建匹配的標簽文件。圖片應該包含我們想識別的對象,并且,數據集中所有對象的類的分布應該類似。如你所見,在我的第一個項目——籃球探測器中,我使用了游戲視頻中的框架。
標簽文件應該與圖像具有相同的名稱,但顯然具有不同的擴展名,并且應該位于并行目錄中。最佳數據結構如下所示。除了 images 和 labels 目錄之外,我們還必須準備 class_names.txt 文件,該文件定義我們計劃檢測的對象類的名稱。這個文件的每一行代表一個類,應該包含一個或多個沒有空格的單詞。
不幸的是,YOLO 需要一個特定的標簽格式,這是大多數免費標簽工具不支持的。為了消除從 VOC XML、VGG JSON 或其他廣泛使用的格式解析標簽的需要,我們將利用 makesense.ai(https://www.makesense.ai/),這里是我在 GitHub 上開發的一個免費開源項目(https://github.com/SkalskiP/make-sense )。編輯器不僅支持直接導出到 YOLO 格式,而且直觀,不需要安裝,可以在瀏覽器中工作。此外,它還支持多種功能,旨在加快你的標簽工作。可以使用 MakeSense 查看人工智能支持的標記過程。
工作完成后,我們可以下載一個 .zip 文件,其中包含 .txt 文件。每一個這樣的文件都對應于一個標記的圖像,并描述照片中可見的對象。如果我們打開其中一個文件,我們會發現,每一行都是 class_idx x_center y_center width height 式。其中 class_idx 表示 class_names.txt 文件中指定標簽的索引(從 0 開始計數)。其余參數描述圍繞單個對象的邊界框,它們可以取 0 到 1 之間的值。幸運的是,大多數時候我們不需要考慮這些細節,因為編輯器會為我們處理所有的事情。YOLO 格式的標簽示例如下所示。
YOLO 最初是在一個叫做 Darknet 的深度學習的小框架中寫的。從那時起,許多其它實現已經創建,其中大多數使用兩個非常流行的 Python 平臺:Keras 和 PyTorch。在所有可用的解決方案中,有一個是我特別喜歡的(https://github.com/ultralytics/yolov3)。它提供了一個用于訓練和檢測的高級 API,但也具有很多有用的特性。在使用它時,我們的所有工作歸結為準備一個數據集和創建幾個配置文件,然后其余的工作就交給庫了。
環境設置也非常簡單——可以歸結為運行幾個命令,你可以在下面找到這些命令(假設你的計算機上已經安裝了 Python 和 Git)。最好從項目目錄中執行命令,以實現上面所示的結構。值得一提的是,環境也可以通過 Docker 創建(這對 Windows 用戶特別有用)。你可以在這里(https://github.com/ultralytics/yolov3/wiki/Docker-Quickstart)找到更多關于這個主題的說明。
# Clone frameworkgit clone https://github.com/ultralytics/yolov3.git# Enter framework catalogue [Linux/MacOS]cd ./yolov3# Setup Python environmentpip install -U -r requirements.txt
如前一段所述,我們現在需要做的就是創建幾個配置文件。它們定義了訓練集和測試集的位置、對象類的名稱,并提供了所用神經網絡的架構指南。
首先,我們需要將數據集分割成訓練集和測試集。我們使用兩個 .txt 文件來完成這項工作,它們中的每一個都包含指向數據集中特定圖像的路徑。為了加快工作速度,我準備了一個 Python 腳本,它將自動為我們創建這些文件。你只需指示數據集的位置并定義訓練集和測試集之間的分割百分比。train.txt/test.txt 文件的片段如下所示。
classes=12train=./data/chess_train.txtvalid=./data/chess_test.txtnames=./data/chess.names
.data 是我們需要提供的最終文件。讓我們用下一個項目的例子來討論它的內容——象棋檢測器。在本例中,我有 12 個惟一的對象類想要識別。接下來,我們給出定義哪些照片屬于訓練集,哪些照片屬于測試集的文件的位置,最后給出前面討論的帶有標簽名稱的文件的位置。為了使一切正常工作,chess.data、chess_train.txt、chess_test.txt 和 chess.names 文件應移動到 project/yolov3/data 目錄。
classes=12train=./data/chess_train.txtvalid=./data/chess_test.txtnames=./data/chess.names
現在我們準備開始訓練。如前所述,我們使用的庫有一個高級 API,因此終端中的一個命令和幾個參數就足以啟動這個過程。然而,在下面還有幾件大大增加我們取得最終成功的幾率的事情。
python3 train.py--data ./data/project.data --cfg ./cfg/project.cfg --weights ./weights/yolov3.pt
首先,我們可以應用遷移學習,我們不必從頭開始訓練。我們可以使用在不同數據集上訓練的模型的權重,從而縮短我們自己的網絡的學習時間。我們的模型可以使用基本的形狀知識,并專注于將這些信息鏈接到我們想要識別的新類型的對象。其次,庫執行數據增強,因此它根據我們提供的照片生成新的示例。因此,即使我們只有一個很小的數據集——幾百張圖片,我們也可以訓練我們的模型。我們使用的庫還為我們提供了一個由于增強而創建的圖像示例。下面你可以看到在我的籃球探測器的訓練過程中創建的示例。
最后,快樂的時刻來了!我們致力于創建模型的工作得到了回報,現在可以用它來找到我們在任何照片中想要尋找的對象。同樣地,這是一個非常簡單的任務,我們可以用終端中的一個簡單命令來完成。執行之后,我們將在輸出目錄中找到預測的結果。值得一提的是,我們還可以對自己拍攝的視頻進行實時預測,這在項目演示中尤其有用。
python3 detect.py--data ./data/project.data --cfg ./cfg/project.cfg --weights ./weights/best.py --source ./data/sample
如果你完成了上面的所有內容,那么恭喜你!非常感謝你花時間閱讀這篇文章。我希望我能證明訓練你自己的定制 YOLO 模型并不困難,我的建議將對你未來的實驗有所幫助。
資料來源:
https://towardsdatascience.com/chess-rolls-or-basketball-lets-create-a-custom-object-detection-model-ef53028eac7d