簡介
當我們使用過先前介紹過的LabelImg這套標籤工具後,事實上其實不需要使用這篇這種工具,但當我們拿到了現成的DataSet後,卻又不符合Darknet能吃的格式,這時候就需要用到了。
尤其是我們自己透過自動化程式來拍照並自動產出Yolo Training VOC格式,資料量又非常大(雖然可以再自動化程式自己在撰寫轉換格式程式,我之後一定會寫在Unity中),這時候最省事的方法就是靠別人發明的輪子來處理遇到的問題。
Convert2Yolo
來介紹一下這工具,其實蠻好用的,但是我在Win10都一直跑不起來(可能是該工具只for mac or linux,或Win10所安裝的套件包不符合),所以拿來Mac使用,畢竟這不需要像Yolo Training耗費非常多電腦資源。
以上是git的連結位置,這套工具可以無痛轉換常用到的四種標籤格式,
- COCO
- VOC
- UDACITY Object Detection
- KITTI 2D Object Detection
而這邊為求電腦不髒掉,一樣透過Anaconda來新增一個虛擬環境,那我們就開始創立一個專屬於Convert2Yolo的環境吧。為求慎重我在該虛擬環境安裝python3.8版本。
//name的環境名稱可以用自己喜歡的
conda create --name YoloConverter python=3.8
//安裝過程他會問題y/n
y
//把他git資料抓下來
git clone https://github.com/ssaru/convert2Yolo.git
接下來就要安裝該工具所需要的套件在你虛擬環境。以下是該工具所需要的套件與程式碼,輸入字串就好。他會依照文件中的字串一一去下載安裝。最後安裝完匯出下下圖資訊與安裝過程。
- Pillow==7.2.0
- cycler==0.10.0
- kiwisolver==1.0.1
- matplotlib==2.2.2
- numpy==1.14.3
- pyparsing==2.2.0
- python-dateutil==2.7.2
- pytz==2018.4
- six==1.11.0
pip3 install -r requirements.txt
接著就要開始轉換你的資料了,請看到下圖,左邊第一個就是要放置你要轉換的所有圖片,中間則是你的標籤文檔案,右邊則是你所有標籤的類別,如下圖二,我用自動化所拍攝的照片總共有四種類別,就把它儲存在txt檔案即可。
最後要進到關鍵一步,首先你要先知道你的DataSet是什麼的格式,在上方有說明該工具可以轉換四種不同類型的標籤格式,我這邊是VOC,Annotations中的檔案都是xml格式,而Yolo Darknet是需要怎樣的格式?
如上圖,第一個就是標籤類別,如上述要準備的檔案中的name.txt類別名稱,假如該圖所標示的物件都是『Red』的話,此欄位會顯示0(陣列索引排序,這不多說),後面的四個浮點數,就是標籤在圖片中的座標位置,下面是轉換公式:
Yolo annotation object format
x = (xmin + (xmax-xmin)/2) * 1.0 / image_w
y = (ymin + (ymax-ymin)/2) * 1.0 / image_h
w = (xmax-xmin) * 1.0 / image_w
h = (ymax-ymin) * 1.0 / image_h
上圖匡起來的地方就是VOC格式要轉換成Yolo格式必須要有的數值,而下方就是要叫轉換工具動起來的指令:
1. --datasets
選用你原始格式 COCO / VOC / UDACITY / KITTI
```指令
--datasets COCO
```
2. --img_path
你的大量圖片放置的位置
```指令
--img_path ./example/kitti/images/
```
3. --label
你的標籤檔案放置位置
```指令
--label ./example/kitti/labels/
```
4. --convert_output_path
你轉出檔案的路徑
```指令
--convert_output_path ./
```
5. --img_type
要轉換的圖片格式,通常都是jpg
```指令
--img_type ".jpg"
```
6. --manifest_path
這在透過darknet工具訓練時需要的一個檔案,darkflow不需要
[darknet framework](https://pjreddie.com/darknet/)
```指令
--manifest_path ./
```
7. --cla_list_file(`*.names`)
這個也是darknet要訓練時需要備妥的一個檔案,『檔名.name』
[darknet `*.name` file](https://github.com/pjreddie/darknet/blob/master/data/voc.names)
```指令
--cls_list_file voc.names
接著我們就開始轉換吧以下是指令,要注意的是這是我自己檔案的路徑,記得要遵循自己放資料的路徑,並修改之,轉換好之後會呈現上圖資訊。這邊我轉換了3000份資料,並隨機抽樣檢查檔案也是正常轉換,上圖二,大概花了半秒即大功告成。
python3 example.py --datasets VOC --img_path ./example/20200916/JPEGImages/ --label ./example/20200916/Annotations/ --convert_output_path ./YOLO/ --img_type ".jpg" --manifest_path ./ --cls_list_file ./example/20200916/names.txt
小結 & 可能遇到的問題
這邊紀錄一下可能會遇到的問題,第一:可能是你路徑找不到導致工具無法轉換,第二:該工具需要的套件Pillow的版本,因為工具本身在轉換時會去讀取format.py的程式碼,由於程式找不到Pillow所以無法進行編譯,如上圖。我遇到的小問題大概是這兩個,假如大家有用到且有遇到其他問題,我們再一起解。
這工具其實可以讓你在整個準備Yolo DataSet時加速,並且可以轉換的格式還蠻多種的,所以在這邊分享並作紀錄,讓你的人生加速(加速可以有更多時間體驗人生,不是加速XX)。