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进行分类,类内竞争会损失精度,对每一类使用二分类,分类损失也使用二值交叉熵。