Yolo-You Only Look Once
YOLO算法采用一个单独的CNN模型实现end-to-end的目标检测:
- Resize成448448,图片分割得到77网格(cell)
- CNN提取特征和预测:卷积部分负责提取特征。全链接部分负责预测:
- 过滤bbox(通过nms)
• YOLO算法整体来说就是把输入的图片划分为SS格子,这里是33个格子。
• 当被检测的目标的中心点落入这个格子时,这个格子负责检测这个目标,如图中的人。
• 我们把这个图片输入到网络中,最后输出的尺寸也是SSn(n是通道数),这个输出的SS与原输 入图片SS相对应(都是33)。
• 假如我们网络一共能检测20个类别的目标,那么输出的通道数n=2(4+1)+20=30。这里的2指 的是每个格子有两个标定框(论文指出的),4代表标定框的坐标信息, 1代表标定框的置信度, 20是检测目标的类别数。
• 所以网络最后输出结果的尺寸是SSn=3330。
关于标定框:
• 网络的输出是S x S x (5*B+C) 的一个 tensor(S-尺寸,B- 标定框个数,C-检测类别数,5-标定框的信息)。
• 5分为4+1:
• 4代表标定框的位置信息。框的中心点(x,y),框的高宽 h,w。
• 1表示每个标定框的置信度以及标定框的准确度信息。
一般情况下,YOLO 不会预测边界框中心的确切坐标。它预测:
•与预测目标的网格单元左上角相关的偏移;
•使用特征图单元的维度进行归一化的偏移。
例如: 以上图为例,如果中心的预测是 (0.4, 0.7),则中心在 13 x 13 特征图上的坐标是 (6.4, 6.7)(红色单 元的左上角坐标是 (6,6))。
但是,如果预测到的 x,y 坐标大于 1,比如 (1.2, 0.7)。那么预测的中心坐标是 (7.2, 6.7)。注意该中心在红色单元右侧的单元中。这打破了 YOLO 背后的理论,因为如果我们假设红色框负责预测目 标狗,那么狗的中心必须在红色单元中,不应该在它旁边的网格单元中。 因此,为了解决这个问题,我们对输出执行 sigmoid 函数,将输出压缩到区间 0 到 1 之间,有效 确保中心处于执行预测的网格单元中。
每个标定框的置信度以及标定框的准确度信息:
左边代表包含这个标定框的格子里是否有目标。有=1没有=0。 右边代表标定框的准确程度, 右边的部分是把两个标定框(一个是Ground truth一个是预测的标 定框)进行一个IOU操作,即两个标定框的交集比并集,数值越大,即标定框重合越多,越准确。
我们可以计算出各个标定框的类别置信度(class-specific confidence scores/ class scores): 表达的是该标定框中目标属于各个类别的可能性大小以及标定框匹配目标的好坏。
每个网格预测的class信息和bounding box预测的confidence信息相乘,就得到每个bounding box 的class-specific confidence score。
• 其进行了二十多次卷积还有四次最大池化。其中3x3卷积用于提取特征,1x1卷积用于压缩特征,最后将图像 压缩到7x7xfilter的大小,相当于将整个图像划分为7x7的网格,每个网格负责自己这一块区域的目标检测。
• 整个网络最后利用全连接层使其结果的size为(7x7x30),其中7x7代表的是7x7的网格,30前20个代表的是预测 的种类,后10代表两个预测框及其置信度(5x2)。
对每一个网格的每一个bbox执行同样操作: 7x7x2 = 98 bbox (每个bbox既有对应的class信息又有坐标信息)
得到每个bbox的class-specific confidence score以后,设置阈值,滤掉得分低的boxes,对保留的 boxes进行NMS处理,就得到最终的检测结果。
排序后,不同位置的框内,概率不同:
以最大值作为bbox_max,并与比它小的非0值(bbox_cur)做比较:IOU
递归,以下一个非0 bbox_cur(0.2)作为bbox_max继续比较IOU:
最终,剩下n个框。
得到每个bbox的class-specific confidence score以后,设置阈值,滤掉得分低的boxes,对保留的boxes进行NMS处理,就得到最终的检测结果。
对bb3(20×1)类别的分数,找分数对应最大类别的索引.---->class bb3(20×1)中最大的分---->score
根据不同类划分不同的框:
Yolo的缺点:
•YOLO对相互靠的很近的物体(挨在一起且中点都落在同一个格子上的情况),还有很小的 群体检测效果不好,这是因为一个网格中只预测了两个框,并且只属于一类。
•测试图像中,当同一类物体出现不常见的长宽比和其他情况时泛化能力偏弱。
Yolo2
1.Yolo2使用了一个新的分类网络作为特征提取部 分。
2. 网络使用了较多的3 x 3卷积核,在每一次池化操 作后把通道数翻倍。
3. 把1 x 1的卷积核置于3 x 3的卷积核之间,用来压 缩特征。
4. 使用batch normalization稳定模型训练,加速收 敛。
5. 保留了一个shortcut用于存储之前的特征。
6. 除去网络结构的优化外,yolo2相比于yolo1加入 了先验框部分,最后输出的conv_dec的shape为 (13,13,425):
• 13x13是把整个图分为13x13的网格用于预测。
• 425可以分解为(85x5)。在85中,由于yolo2常 用的是coco数据集,其中具有80个类;剩余 的5指的是x、y、w、h和其置信度。x5意味着 预测结果包含5个框,分别对应5个先验框。
Yolo3
YOLOv3相比于之前的yolo1和yolo2,改进较大,主要 改进方向有:
1、使用了残差网络Residual
2、提取多特征层进行目标检测,一共提取三个特征 层,它的shape分别为(13,13,75),(26,26,75), (52,52,75)。最后一个维度为75是因为该图是基于voc 数据集的,它的类为20种。yolo3针对每一个特征层 存在3个先验框,所以最后维度为3x25。
3、其采用反卷积UpSampling2d设计,逆卷积相对于 卷积在神经网络结构的正向和反向传播中做相反的运 算,其可以更多更好的提取出特征。
代码实现:
在资源中
实现结果如下