我会从以下实现的角度理解YOLOv3,附上github代码 https://github.com/XingZeng307/YOLOv3。(真正从头实现一遍代码才能发现无穷多的细节需要去推敲,如果有错误麻烦指出,谢谢!)
目录
YOLO简介
- 定义:YOLO是目标检测算法,用来识别图片中的物体,并且找到它们的位置,并且用边框给它们标出来。如图所示(note: 我用的数据集是关检测衣服的衣领类型的,所以这里是单目标检测)
标准深度神经网络结构
# 伪码
def model(x, y, num_iters):
paras = initialize_paras()
for i in range(num_iters):
pred = model(x, paras)
cost = loss(pred, y)
grads = backward(cost)
paras = update_paras(grads)
YOLO的结构完全和以上的标准结构一致
我们需要做的是:
- YOLO模型结构(也就是我们的神经网络结构)
- 定义YOLO的输入x和输出y(prediction)分别是什么,以及格式,以便后面计算loss
- 定义loss function,因为计算loss需要target,所以需要将训练数据集中的target的格式转换成和prediction的格式一致。
- 训练模型 (forward -> loss -> back prop -> update para)
- 检测新的图片
YOLOv3 model architecture (对应代码yolov3.py)
YOLO的模型架构是它的一个精华所在!!!
附上我自己手绘的一张图,花了很长时间,字迹有点潦草,希望不要介意。但是确实很用心画的一张YOLO v3的很完整的网络结构图!
-
1. 输入输出:当然,用于目标检测,输入是一张图(e.g. [256 X 256 X 3])或者一个batch,输出是检测到的物体的类以及其位置,表示为 [x, y, w, h, confidence, classes],x, y, w, h是表示的是预测的边框(中心点➕宽➕高),confidence表示我有多自信在这个边框里面有物体object,但前提是我有object,如果没有object,confidence则为0,最后classes是one-hot-encoding,表示的是预测的这个物体object属于哪一个类别。(note: 图中最后输出的[32 X 32 X 255],[16 X 16 X 255], [8 X 8 X 255]之后会解释怎么与[x, y, w, h, confidence, classes]相关)
-
2. 中间结构 (精髓所在):
2.1 ResBlock的思想,在图中为short layer, 用于训练深层网络
2.2 金字塔结构思想,大目标,小目标现在通吃!(之前YOLO1的一个缺点就是对小目标检测不准确),在图中为route之后concat,把前后特征