利用YOLO實現自己的目標檢測
因為很多是我按照記憶來寫的,可能會有錯誤,大家一定按照給的連結為準,參考這些即可。。。。。
最近,在師哥的引導下,接觸了一下YOLO演算法,是近年來一個比較好的目標檢測演算法,而且它有自己的開源深度學習框架—darknet,使用起來比較簡單,對於我一個新手來說,挺直白的這個,可以學習一下。
我是在ubuntu16.04下配置的darknet,darknet的安裝比較簡單,官網上有詳細的步驟,按部就班就能裝上。
darknet的 官網
darknet的安裝並不困難,但是因為要訓練,就需要配置GPU,要安裝顯示卡驅動,這裡面的坑是巨大的,我是站在師哥的肩膀上,師哥已經配置好了,就方便多了,使用darknet不難,配置GPU是真的坑多,按照教程一步一步來,不行就多配置幾遍,因為就算第一次配置成了,下一次也不一定成功,配置就是這麼煩的工作。我推薦一個網址,可以按照下面連結的教程來。
這裡面比較彆扭的是要很多操作要進入字元介面操作,但是像我這樣對Ubuntu系統很不熟悉,幾乎陌生的人,玩不轉,但是隻要耐心多弄幾次,不會的就多百度,慢慢就弄出來了,詳細的步驟就按照上面的教程來。
還需安裝opencv,配置opencv。。。。。
下面說一下,怎麼利用YOLO演算法的darknet框架來進行自己的目標檢測。
先貼一個github教程
就按照這個教程來,就能做出自己的目標檢測了,下面我再解釋幾個重要的部分。首先要有樣本,我們要有圖片,需要對圖片進行標註,這裡面就要用到一個標註工具 YOLO—mark,需要下載這個包,然後編譯配置,安裝這個教程來 YOLO—mark
先把github上的這個包下載下來,解壓,然後就把一些檔案的引數改改,把圖片替換成自己的就行。
先把 x64/Release下的yolo-obj.cfg檔案中的classes和filters改成自己的,classes就是你要檢測目標一共有多少種,filters=(classes+5)*5,開啟yolo-obj.cfg 檔案,按住Ctrl+f搜尋classes跟filters,改成自己需要的數,classes只有一個,filters有很多,改哪一個,看一下上面那個教程,只需要修改一處。。
然後再對x64/Release/data下的進行修改。img裡面的照片換成自己的,按上面給的教程修改obj.data和obj.names檔案裡面的內容,obj.data檔案裡要修改的就是classes,自己檢測多少種,就改多少。obj.names就是要檢測目標的名字,比如cat,dog,car。。。。一個名字一行。。。train.txt不用動,這個檔案是一會執行自動生成的,裡面是你標註過的圖片的路徑。那兩個檔案怎麼修改,參考上面的教程即可,這就不多囉嗦了。train.txt檔案內容參考下圖
首先cd Yolo_mark-master,先到Yolo_mark-master這個資料夾路徑下
然後按照指令編譯即可
cmake . (注意cmake和 . 之間是有一個空格的)
make
編譯好了會生成一些檔案,如下圖
第一個資料夾,第3,4個檔案,還有倒數第三個可執行程式就是新生成的。
然後 ./linux_mark.sh 就會運行了。
輸入./linux_mark.sh這個指令可能會報錯,缺少許可權,再輸入指令
chmod a+x ./linux_mark.sh
再輸入
./linux_mark.sh
應該就可以成功運行了,這就解決了標註問題。標註除了會生成那個train.txt檔案外,再就會在img資料夾下生成一些txt檔案,標註一張圖片都會生成想應的txt檔案,檔案裡面就是標註框的中心點座標和標註框的長寬,長和寬是按照一定比例折算的,不是實際的大小。
剩下的工作就是將你所需要訓練的照片都標註上,標註完成後將data檔案複製到darknet/x64/Release/下,替換原來的data資料夾。
然後需要修改yolo-obj.cfg檔案裡面的內容,到darknet/cfg/下,找到yolov3.cfg,將裡面的內容複製到yolo-obj.cfg檔案中。
需要修改一些內容,還是按住Ctrl+f搜尋classes,一共三處classes,換成你要檢測的種類。再搜尋yolo,將yolo層上面的filters改成(classes+5)*3,也是一共三處,參考下圖。具體參考yolov3。。。for win and linux那個教程,會告訴具體修改哪一行。
這裡要注意,不要跟配置標註工具的時候混淆了。。。。。。。filters的計算是不一樣的,數目也不一樣,標註工具的只有一處,這有三處。。。。。。
在訓練的時候,按照下圖
測試的時候,按照下圖修改
正常訓練過程如下圖
如果,全部都顯示nan,說明訓練發生錯誤,可能是哪個檔案沒修改對,期望的是class趨近1,obj趨近1,no obj趨近0。
前900次,每100次會生成一個模型,後面10000次生成一個,儲存在darknet/backup資料夾下
其中yolo-obj.backup這個是實時儲存的,剩下的到了一定步數生成的。
在訓練的時候一定要修改yolo-obj.cfg檔案,將來轉換為訓練模式,測試的時候記得修改成測試模式。
下面是訓練指令
./darknet detector train 是訓練固定的 x64/Release/data 是obj.data的路徑 x64/Release是yolo-obj.cfg的路徑,cd darknet是到了darknet路徑下,即它們都是在darknrt路徑下的
下面是測試指令
backup/yolo-obj.backup是儲存在backup檔案下的訓練生成的模型
data/test1241.jpg是data資料夾下的一張測試圖片
對於一個ubuntu的新手來說,務必要搞清楚這些路徑問題。。。。。。。
因為很多是我按照記憶來寫的,可能會有錯誤,大家一定按照給的連結為準,參考這些即可。。。。。