GluonCV:用Pascal VOC資料訓練YOLO v3(上)準備資料+簡單訓練命令
1.GluonCV簡介
GluonCV提供計算機視覺中state-of-the-art(SOTA)深度學習模型的實現。
它專為工程師,研究人員和學生設計,可基於這些模型快速產生原型產品和研究思路。 該工具包提供四個主要功能:
(1)訓練指令碼用來複現研究論文中報告的SOTA結果
(2)大量預訓練模型
(3)精心設計的API可大大降低實施複雜性
(4)社群支援
2.安裝環境
訓練了一下GluonCV提供的 YOLOv3,記錄一下使用過程
首先是安裝環境
pip install --upgrade pip apt-get update pip install gluoncv --pre --upgrade pip install mxnet-cu90 --pre --upgrade apt-get install python-tk
3.準備pascal voc資料集
Pascal VOC是用於目標檢測的資料集,benchmark最常用的組合是使用2007 trainval和2012 trainval進行訓練,使用2007test進行驗證。 本節將介紹為GluonCV準備此資料集的步驟。
3.1 下載pascal voc資料集
我們需要來自Pascal VOC的以下四個檔案:
下載和解壓縮這些檔案的最簡單方法是使用資料集自動下載指令碼pascal_voc_down.py
wget https://github.com/JackwithWilshere/GluonCV_YOLOv3/blob/master/pascal_voc_down.py
執行
python pascal_voc_down.py
它將自動下載並將資料提取到〜/ .mxnet / datasets / voc中。
3.2 用GluonCV讀取分析資料集
此處是官方教程裡分析的pascal_voc.py
wget https://github.com/JackwithWilshere/GluonCV_YOLOv3/blob/master/pascal_voc.py
如果直接在linux命令列執行
python pascal_voc.py
因為沒有GUI終端,會報錯如下,(如果有GUI介面,比如VNC server,不會報錯,並且後面可顯示邊界框圖片)
_tkinter.TclError: no display name and no $DISPLAY environment variable
解決方法是
python檔案中:
在 from matplotlib import pylot 之前,新增程式碼:
如下:
import matplotlib as mpl
mpl.use('Agg')
from matplotlib import pylot
下面是對其語句的分析(可以用jupyter notebook)
使用gluoncv.data.VOCDetection可以直接載入影象和標籤。
from gluoncv import data, utils
from matplotlib import pyplot as plt
train_dataset = data.VOCDetection(splits=[(2007, 'trainval'), (2012, 'trainval')])
val_dataset = data.VOCDetection(splits=[(2007, 'test')])
print('Num of training images:', len(train_dataset))
print('Num of validation images:', len(val_dataset))
Out:
Num of training images: 16551
Num of validation images: 4952
現在讓我們看一個例子。
train_image, train_label = train_dataset[200]
print('Image size (height, width, RGB):', train_image.shape)
Out:
Image size (height, width, RGB): (360, 480, 3)
通過從0到4的切片列獲取邊界框
bounding_boxes = train_label[:, :4]
print('Num of objects:', bounding_boxes.shape[0])
print('Bounding boxes (num_boxes, x_min, y_min, x_max, y_max):\n',
bounding_boxes)
Out:
Num of objects: 2
Bounding boxes (num_boxes, x_min, y_min, x_max, y_max):
[[209. 32. 327. 190.]
[ 64. 72. 402. 309.]]
通過切片第5列取類ids
class_ids = train_label[:, 4:5]
print('Class IDs (num_boxes, ):\n', class_ids)
Out:
Class IDs (num_boxes, ):
[[14.]
[12.]]
視覺化影象,邊界框 (需要有GUI,即視覺化介面,比如在vnc server執行)
utils.viz.plot_bbox(train_image.asnumpy(), bounding_boxes, scores=None,
labels=class_ids, class_names=train_dataset.classes)
plt.show()
官方準備資料集的詳細解釋
4.訓練YOLO v3
wget https://github.com/JackwithWilshere/GluonCV_YOLOv3/blob/master/train_yolo3.py
(1)在GPU:0上用Pascal VOC資料訓練預設的darknet53模型
python train_yolo3.py --gpus 0
(2)在GPU:0,1,2,3上用Pascal VOC資料訓練darknet53模型,並使用了synchronize BatchNorm。
python train_yolo3.py --gpus 0,1,2,3 --network darknet53 --syncbn
詳細訓練分析接下篇