1. 程式人生 > >yolo生成和訓練資料集

yolo生成和訓練資料集

第二代yolo的效能明顯比第一代yolo有所提升,在博主實際測試中。基於3000張的資料集來說,yolo的效果還是不錯的,tiny-yolo的效能稍差,但是時間也縮短了很多。大約tiny的時間是yolo的1/5,YOLO的官方網站上也有所介紹,對於67的fps還真不是一般的電腦能達到的。
具體來說,yolo網路使用的使用是設定幾種不同大小,形狀的框,去挨個檢測圖片中的元素,然後合成為一個物體。具體的可以參考yolo檢測網路的論文,名字為You Only Look Once:Unified, Real-Time Object Detection,意思是你只看一次,看來外國人起名字也很有意思,只是他們的名字可以縮寫。。。相比較yolo來講,tiny-yolo實際上用的框架是一樣的,只是神經網路的結構不一樣,所以,yolo訓練出來的weights檔案大約為200M,而tiny-yolo的weights檔案大約為60M,這裡博主可以簡單的分析一下,tiny-yolo和yolo在結構上的區別,官方給出的配置檔案裡面yolo對應的是yolo.cfg,tiny-yolo對應的是tiny-yolo.cfg。
下面是yolo.cfg的部分內容
yolo


下面的是tiny-yolo.cfg的內容

可以看出tiny-yolo在圖片大小上有所減小,由yolo的608*608變為了416*416 ,並且在第一層網路的時候就由yolo的32個filters減小到了16個。這樣,tiny-yolo的體積就會減小很多,但是精確度也下將了很多,一般使用mAP來評價。後面會介紹如何評價檢測精度。
進入正題,假設讀者已經通過官網下載了yolo網路的原始碼,並且也嘗試著測試了一波,發現,恩,還不錯。接著開始考慮如何去訓練自己的網路。博主在訓練自己的網路的時候走了很多彎路。希望讀者能少走彎路,多花時間去提升自我。
首先是要有自己的資料集,我們通過手機拍照,爬蟲,相機拍照搞到了幾千張圖片,例如這樣的圖片:

不得不說淘寶的圖片還是有點不靠譜的。(如果需要爬淘寶的圖片,可聯絡博主,把原始碼發給你,沒時間寫blog,用的python+selenium),接下來需要做的就是將這些圖片進行標註,畢竟yolo是個有監督模型,使用的是yolo網路推薦的工具labelImg,博主大體看了一下這個工具,使用的是python+qt,地址為https://github.com/tzutalin/labelImg ,按照上面的介紹安裝,就ok了,這個工具的效率還是很高的,基本上幾百張可以在不到一小時之內標註完成。標註完所有的圖片之後,開啟標註檔案的資料夾就會看到如下:

都是一些xml,檔案,開啟一個檔案,就是以下資訊:

這張圖片的所有資訊都在裡面,包括大小,包括你標註的物體的位置,大小,因為博主的源圖片中只有一個物體,所以只有一個object的標籤,要是有多個標註的物體的話,就會出現多個object的標籤。拿到所有的圖片的xml格式的標註檔案之後,就要開始轉化格式了。因為yolo網路採用的並不是這種格式,而是類似於圖下這種。
第一個是類別,第二個和第三個是標註物體的中心位置的x,y的比例座標。後面兩個是標註物體的比例大小。如果有多個物體的話會有多行物體資訊。所以首先我們應該先把xml檔案轉為txt檔案,為了方便檢視數量,我們還順便對所有檔案重新命名了。例如下:

使用的工具來源於github上面的yolo-voc處理工具,你也可以使用命令下載到本地
git clone [email protected]:lucky-ing/yolo-voc.git
裡面共有兩個資料夾,現在我們使用的是xml2txt/xml2txt.py檔案來對我們資料進行處理,首先你需要把你所有標註的xml檔案和所有的圖片檔案放在一起,就像這樣:

這是手機拍的照片,所有檔名很麻煩。(明白博主為什麼要重新命名所有的圖片了吧)。接著切到剛才的xml2txt.py資料夾內,使用命令:
python xml2txt.py 0 /home/lucky/open/wires/1016wire /home/lucky/open/wires/picture_voc/10.22 /home/lucky/yolo/darknet/data/voc.names
python xml2txt.py,使用python(一般是指python2)執行xlm2txt
0的意思是檔案重新命名的開始序列,例如,博主寫的是0,則本次處理的圖片的名字都是從0000.jpg名字開始增加的,如果你寫的是647,則第一張被處理的圖片則從0647.jpg開始增加。
/home/lucky/open/wires/1016wire 是指之前所有圖片和xml檔案所在的路徑,切記不要在後面加/。
/home/lucky/open/wires/picture_voc/10.22 是整理之後的圖片和txt檔案儲存的地址路徑,切記不要在後面加/。
/home/lucky/yolo/darknet/data/voc.names 是指我們上面提到的xml檔案內標註的是標註物體屬於某一類,但是yolo並不識別類別,只是識別編號,所以這裡要把類名轉為編號。該檔案裡面就是所有的類名,每個類名為一行,程式會根據順序對他們進行編號,例如

博主製鞋了兩種類別,分別是tuoxie和wire,那麼如果xml檔案裡面是tuoxie,那麼轉換之後的txt檔案內的編號就是0。如果只有一個類別的可以不用填寫這個引數,預設就為0。
執行之後如圖

程式開始瘋狂操作。操作之後就會在你的目標資料夾內出現以下情況:

這時候你的操作幾乎是成功的。接下還有一步就是需要將所有的圖片檔案都彙總到一個txt檔案內,我們可以使用剛才下載的資料夾內的addneme2txt/addneme2txt.py來操作。只需要輸入以下命令:

python pic2txt.py /home/lucky/open/wires/picture_voc/10.22 /home/lucky/open/10.22

python pic2txt.py是指使用python 執行pic2txt檔案。
/home/lucky/open/wires/picture_voc/10.22 是我們之前整理後的圖片和txt檔案所在的路徑。切記不要在後面加/。
/home/lucky/open 是為了我們可能要在伺服器上訓練網路,那時的我們圖片的路徑肯定和我們電腦的上路徑不一樣,例如我們電腦上路徑在/home/lucky/open/wires/picture_voc/10.22 ,當我們把整個資料夾copy到伺服器上的時候,放在了/home/lucky/open目錄下,如果yolo網路仍然通過/home/lucky/open/wires/picture_voc/10.22來查詢的話是肯定找不到的。所以我們需要修改為伺服器的路徑。
開始執行之後,電腦開始瘋狂操作:

結束之後會在我們的圖片和txt的資料夾內生成一個train.txt,開啟就有:

至此,我們大部分的準備都已經完成了,接下來開始訓練了。
首先,如果你要把訓練部分放在伺服器進行,你需要把我們的圖片和txt資料夾全部拷貝到伺服器,而且,路徑要和上文的伺服器路徑一致。否則,yolo找不到圖片所在位置。
假設你已經搞ok了。
yolo訓練網路需要配置檔案,和data檔案,命令如下

./darknet detector train cfg/voc.data cfg/yolo-voc.cfg

./darknet detector train 是指使用darknet的train函式。
cfg/voc.data是一些資訊檔案,我們需要修改這個檔案,或者指向你自己的資訊檔案。我的資訊檔案如下所示:

classes是指訓練中的物體的類別的個數,這裡博主只訓練了一種,所以為1.
train是告訴yolo,所有的訓練的圖片位置,指向的就是我們之前生成的train.txt檔案。
valid是yolo的測試檔案的路徑檔案,因為我們只訓練,所以不需要修改,或者不要動。
names是所有類別的檔案,就是我們上文提到的voc.names,貌似這裡沒什麼用。
backup是指訓練後的weights檔案存放的位置。
cfg/yolo-voc.cfg是yolo網路的配置檔案,如果我們使用tiny-yolo,就使用cfg/tiny-yolo-voc.cfg。但是還是需要修改一下里面的內容。在cfg檔案的最後一層輸出層中

因為我們訓練的類別數目不一樣,所以最後一層的filters的數量也不一樣,計算公式為5*(class_num+5),如果我們只有一個訓練數目的話,則filters=30.可參考blog.csdn.net/zhuiqiuk/article/details/70167963
修改完這些這些配置之後,開始,執行!,等待他執行結束之後,會在backup內輸出一個weights檔案,就是我們的訓練後的資料,我們可以使用該檔案檢測識別我們識別的物體。如果想測試訓練後的weights檔案的可靠性,可以看博主另外一篇文章。介紹yolo的mAP的資料生成。
歡迎讀者一起討論,或者聯絡博主[email protected]