在進行物件偵測訓練之前需要準備訓練集和驗證集,因此本文將要來介紹如何進行標記。內容會分為三個部分:
- Python XML 讀寫操作
- 使用 labelImg 手動進行標註
- 使用 insightface 自動化標註
- 使用 YOLO 自動化標註
Python XML 讀寫操作
首先來看一下 XML 格式
接下來讀取 XML 以及寫入 XML,需要使用以下模組
from xml.etree import ElementTree as ET
- 讀取 XML
# 載入檔案進行解析tree = ET.parse(“maksssksksss10.xml”)
root = tree.getroot()# 查看每個 tagfor child in root:
print(child.tag)# ===== output =====
# folder
# filename
# size
# segmented
# object# 搜尋所有 ‘object’ 裡的 name
for child in root.findall(‘object’):
name = child.find(‘name’)
print(name.text)# ===== output =====
# with_mask# 更改 name 內容並儲存成 xml 檔
for child in root.findall(‘object’):
name = child.find(‘name’)
name.text = “face”
tree.write(“001.xml”)
- 寫入 XML
參考: https://officeguide.cc/python-read-write-xml-format-file-tutorial-examples/
使用 labelImg 手動進行標註
首先下載 labelImg 工具,下圖為資料夾內容
更改 data/predefined_classes.txt 為需要的 label
打開 labelImg.exe 會出現以下 UI 介面,功能使用可以參考下圖
在圖片上按右鍵,點選 Create RectBox 後,就可以開始畫框了~
畫好框後選擇要標註的 label,再按左邊的 Next Image 就會儲存圖片 label
使用 insightface 自動化標註
Github: https://github.com/deepinsight/insightface
當有大量的資料需要標記時,手動標記非常耗時,因此我們可以使用工具幫助進行標記,不過標記完成之後還是建議再看過一次,避免有標記錯誤的問題。以下 label 的儲存格式是使用 XML,可將其改為需要的格式。
首先安裝 MXNet GPU 以及 cython。因為我的 CUDA 版本為 10.2,因此執行以下指令進行安裝
$ pip install mxnet-cu102$ pip install cython
本文示範標註戴口罩的圖片,因此使用 RetinaFaceAntiCov 項目
$ git clone --recursive https://github.com/deepinsight/insightface.git
需要先將 rcnn 編譯
$ cd insightface/detection/RetinaFace$ make
編譯好後,將 rcnn 資料夾覆蓋 RetinaFaceAntiCov/rcnn,然後下載模型: https://www.dropbox.com/s/6rhhxsbh2qik65k/cov2.zip?dl=0 ,建立一個 model 資料夾放入剛下載好的模型
原本的程式只能偵測一張圖片,因此將程式碼修改為偵測多張圖片並寫入 XML 檔,然後就可以開始執行自動化標記了~
使用 YOLO 自動化標註
若要使用 yolo 進行自動化標註可參考以下:
- Python影像辨識筆記(二十六):如何透過YOLOv3/v4進行自動化Bounding Box標記?
- https://gist.github.com/YashasSamaga/e2b19a6807a13046e399f4bc3cca3a49
我根據第二個 github 去修改成讀取圖片檔預測並儲存畫出預測框及 txt 檔,其中 imgdir 為要預測的檔案資料夾、save_result_dir 和 save_txt_dir 分別為預測出的圖片與 txt 檔、第 20 和 31 行依照各自的設定進行更改。