tag不存在或已被下架!
今天來分析 Joseph Redmon 所設計的 YOLOV3 的設定檔,裡面會看到他是如何設計整個卷積網路結構,下圖是 github 中 cfg 文件夾的 YOLO 結構的檔案,看 yolov1.cfg, yolov2.cfg, yolov3.cfg 等檔名後面帶著-xxx,例如: yolov2-voc.cfg, yolov3-voc.cfg。 這是指針對不同的數據集 (datasets) 訓練時的網路結構組態檔案,沒有帶 -xxx 的組態檔,基本上的數據集就是微軟的 COCO 數據集,總類別數是 80 類。帶有 -voc 則是跑 VOC 數據集,類別數是 20 類。
圖 1、YOLO 組態檔文件夾的結構
下圖是根據 Joseph Redmon 所發表的 YOLOv3 結構用來萃取特徵圖的 darknet53 網路結構。
圖 2、YOLOv3 的 darknet53
打開 yolov3.cfg,下圖是檔案內前三層的卷積層的設定,比對兩圖的過濾器(filter),卷積核心大小(size) 以及步進 (stride),可以發現一模一樣,分別是 (32 * 32, 3, 1), (64 * 64,3,2), (32 * 32, 1, 1)。這樣不難理解 yolov3.cfg 的目的就是在描述 yolov3 的網路結構,所以我們只要使用不同的組態檔,就可以實作 yolov1,yolov2 或是 yolov3。
圖 3、yolov3.cfg 的前三項設定
因此,全局的設定都是在 [net] 這個選項中進行設定,通常我們針對不同的環境都是修改這裡的設定。
batch=64
subdivisions=16
width=608
height=608
channels=3
batch指的就是一批要多少訓練樣本(batchsize),以我們的例子來說就是圖片,這主要是取決於訓練時的 GPU 記憶體,而 yolo 還有一個參數是 subdivisions,是用來細分,一次放多少樣本到記憶體中,以上述的設定,通常是記憶體足夠大,可以一次放入 4 張圖片 (64/16),如果自己評估記憶體夠用的話, subdivisions 可以設的更小一點,原則上是 8 的倍數。下面這個方程式說明批次 (batchsize) 跟迭代 (iteration) 與期數 (epoch) 的關係。
epoch = (全部訓練樣本 / batchsize) / iteration
舉個例子,訓練集有 1000 個樣本,batchsize = 10,那麼訓練完整個樣本集(1次epoch)需要:100 次iteration。
1 = (1000 / 10) / 100
width, height, channels 這三個參數用來指定訓練圖片大小,必須是 32 的倍數,資料集中的圖片大小務必要跟這個設定相同。
底下是整個模型找尋最佳解的超參數,可以參考機器/深度學習-基礎數學(三):梯度最佳解相關算法(gradient descent optimization algorithms)
momentum=0.9
decay=0.0005
learning_rate=0.0005
max_batches = 60000
policy=steps
steps=400000,450000
scales=.1,.1
圖 4、找尋最佳解的過程
資料擴增相關參數,用來隨機產生新的資料用來訓練模型。
angle(角度): 圖片角度變化,單位是度, angle=10,就是隨機生成 -10 ~ 10 度旋轉的圖片。
saturation(飽和度)和exposure(曝光度): 代表飽和度和曝光度設定 1.5 代表用飽和度和曝光度進行 0 ~ 1.5 倍隨機生成圖片。以下為 DarmMark 所做的示例,它建議可以在 0 - 10 之間調整,但是 darknet 可以容許更大的值。
hue(色調): 色調設定為 0.1 代表在色調隨機變化 0 ~ 0.1 生成圖片。DarmMark 建議可以在 0.0 到 1.0 之間調整。
angle=0
saturation = 1.5
exposure = 1.5
hue=.1
圖 5、DarkMark的圖型效果
最後辨識判斷的結果在 YOLOv3 為[yolo]這個選項中。
[yolo]
mask = 6,7,8
anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
classes=80
num=9
jitter=.3
ignore_thresh = .7
truth_thresh = 1
random=1
要記得在三個 [yolo] 層的前一個卷積層,都要將 fliters 根據辨識的種類數量來進行修改,公式如下,位置可以參考下圖。
filters=(classes + 5) * 3
圖 6、修改判斷層前的卷積層的過濾器