项目地址:https://pjreddie.com/darknet/yolo/
YOLO:you only look once,顾名思义:对图片只看一次,找到目标。将整张图片作为输入,输出目标物体的边框和类别。
YOLO的核心思想是在于将目标检测作为回归问题解决。直接在输出层回归bounding box的位置和bounding box所属的类别(整张图作为网络的输入,把 Object Detection 的问题转化成一个 Regression 问题)
具体实现:将原始图片放缩到448×448的尺寸,对图像分成SxS个网格(grid cell),如果某个object的中心落在这个网格中,则这个网格就负责预测这个object。每个网格需要预测B个边界框(bbox)值(bbox值包括中心点坐标和宽高),同时为每个bbox值预测一个置信度(confidence scores)。置信度包括P(Object),IoU。其中P(Object)代表的是有或没有对象的概率,有P(Object)=1,否则0。IoU表示预测的边框与真实边框的重叠度。通过乘上IoU,反映出该边界框预测位置的精度。
SxS个网格,每个网格要预测B个bounding box还要预测C个类别的条件概率,每个bounding box要预测(x, y, w, h)和confidence共5个值。输出就是一个S x S x (5*B+C)的tensor。 注意:class信息是针对每个网格的,confidence信息是针对每个bounding box的。
YOLO支持识别20种不同的对象(人、鸟、猫、汽车、椅子等),所以这里有20个值表示该网格位置存在任一种对象的概率。可以记为P(Class_i | Object),之所以写成条件概率,意思是如果该网格存在一个对象Object,那么它是Ci的概率是 P(Class_i | Object).
测试阶段的NMS阶段对于每个bounding box,我们应该按照下式衡量该框是否应该予以保留:
YOLO给出的损失函数如下
意思是网格i中存在对象。
意思是网格i的第j个bounding box中存在对象。
意思是网格i的第j个bounding box中不存在对象
网络结构如下图所示:
(1)输入大小:448*448*3
(2)C1:conv1->maxpool
输入大小:448*448*3
卷积核大小:7*7
卷积核数量:64
步长:2
填充:3
输出大小:224*224*64
神经元数量:224*224*64
可训练参数:(7*7+1)*64
连接数:224*224*64*(7*7+1)
池化层输入:224*224*64
池化层输出:112*112*64
(3)C2:conv2->maxpool
输入大小:112*112*64
卷积核大小:3*3
卷积核数量:192
步长:1
填充:1
输出大小:
神经元数量:
可训练参数:
连接数:
池化层输入:224*224
池化层输出:112*112