yolov3损失函数改进_YOLOv3论文解析
YOLOv3已經出來很久了,自己的文字檢測也是用的YOLOv3完成的,最近一直被問到一些相關細節問題,自己不看源碼也確實記不起來了,干脆就簡單寫下來好了。代碼參考均來自于Github:keras-yolov3
一、改進
改進一:邊界框的預測
yolov3的anchors和yolov2一樣由聚類得到,數量由5個增加到9個。直接預測得到tx,ty,tw,th,to然后通過下面兩張圖的轉換公式得到最后的歸一化真實值(還需要乘以對應圖像的H,W還原)。
其中:
xywh實際值轉換公式.png
xywh對應關系.png
# 將output 轉換為實際值
box_xy = (K.sigmoid(feats[..., :2]) + grid) / K.cast(grid_shape[::-1], K.dtype(feats))
box_wh = K.exp(feats[..., 2:4]) * anchors_tensor / K.cast(input_shape[::-1], K.dtype(feats))
box_confidence = K.sigmoid(feats[..., 4:5])
box_class_probs = K.sigmoid(feats[..., 5:])
改進二:類別預測
不再使用Softmax進行分類,類內競爭會損失精度,對每一類使用二分類,分類損失也使用二值交叉熵。
改進三:多尺度預測
FPN已經被證明了是非常有效的tricks,自然而然被納入了yolov3中。其中包含三個特征圖尺度,分別下采樣32x,16x,8x,每個特征圖上設置三種大小的anchors,對應大、中、小,每一個尺度的特征圖上可以得到 N × N × [3 ? (4 + 1 + 80)] 的結果,分別是N x N個 gird cell ,3種尺度的anchors,x、y、w、h、confidence、80類。
改進四:特征提取器
由yolov2的darknet-19升級為darknet-53。
darknet-53.png
result.png
改進五:訓練方法
作者此處引用了自己的網站主頁。。。
二、具體做法和實驗結果
精度.png
速度.png
三、一些嘗試但是不起作用
嘗試使用預測中心點x、y的偏移量和w、h的比例關系,穩定性下降,結果并不好。
嘗試直接預測x、y而不是使用logistic,MAP下降。
嘗試使用Focal Loss,MAP下降2%,作者也不確定原因。
嘗試使用Faster-rcnn的雙IOU閾值,在訓練期間:iou>0.7,正例;0.3
四、損失函數
xy_loss
二值交叉熵(KL散度)
wh_loss
SSE
confidence_loss
分為obj和no_obj兩種情況計算。對于obj(該檢測框有對應的真實框),二值交叉熵;對于no_obj(該檢測框無對應的真實框),當檢測框和真實框的iou低于0.5,需要計算no_obj_confidence_loss,也是二值交叉熵。
class_loss
二值交叉熵
# 這里是一個系數,面積越小權重越高
box_loss_scale = 2 - y_true[l][...,2:3]*y_true[l][...,3:4]
xy_loss = object_mask * box_loss_scale * K.binary_crossentropy(raw_true_xy, raw_pred[...,0:2], from_logits=True)
wh_loss = object_mask * box_loss_scale * 0.5 * K.square(raw_true_wh-raw_pred[...,2:4])
confidence_loss = object_mask * K.binary_crossentropy(object_mask, raw_pred[...,4:5], from_logits=True)+ \
(1-object_mask) * K.binary_crossentropy(object_mask, raw_pred[...,4:5], from_logits=True) * ignore_mask
class_loss = object_mask * K.binary_crossentropy(true_class_probs, raw_pred[...,5:], from_logits=True)
總結
以上是生活随笔為你收集整理的yolov3损失函数改进_YOLOv3论文解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cuda linux编译器_CUDA与L
- 下一篇: autocad2014 第二次打开闪退_