理念:
将输入的图片分割成SS网格,然后每个单元格负责检测中心点落在该单元格的目标。,每个单元格预测B个边界框以及边界框的置信度。置信度=Pr(object)是否有目标IOU。如果有目标Pr(Object)=1,否则为0,边界框的位置用(x,y,w,h)来表示,中心坐标的预测值(x,y)是相对于每个单元格左上角坐标的偏移,w,h是相对于整个图片的宽与高的比例,因此四个值应该都在(0,1)之间
分类问题:
每个单元格要预测C个类别概率值,表示的是该单元格负责预测的边界框属于各个类别的概率
每个单元格只预测一组类别概率值,即最终预测值为SS(B*5+C)
网路i结构:
参考的是GoogleNet 包含24个卷积层和2个全连接层。都采用Leaky ReLu激活函数 max(x,0.1x),最后一层采用的是线性激活函数
对于每个单元格,前20个元素是类别概率值,然后两个元素是边界框置信度,最后8个元素是边界框的(x,y,w,h)
因为每个单元格预测两个边界框。
网络预训练:在ImageNet上进行预训练,采用前20个卷积层,然后添加一个平均池化层和全连接层。与训练之后,将预训练得到的20层卷积层加上随机初始化的4个卷积层和2个全连接层。为了更高清的图片,将网络输入增加到448*448
损失函数:
包含目标的边界框的置信度权重值为1,不包含目标的置信度权重值为0.5即
损失函数第一项为边界框中心坐标的误差项,第二项为边界框的高与
宽的误差项,第三项为包含目标的置信度误差项,第四项是不包含目标的置信度误差项,第五项是包含目标的单元格的分类误差项。指的是第i个单元格中的第j个边界框负责预测该目标
网络预测:
有前面可知,网络最后的输出为7730,将其分为3个部分,类别概率部分为[7,7,20],置信度部分为[7,7,2],边界框部分为[7,7,2,4],将前两部分相乘得到类别置信度([7,7,1,20][7,7,2,1]=[7,7,2,20]),总共预测了77*2=98个边界框。
有两种策略得到检测框的结果。第一种首先每个边界框根据类别置信度最大的那个类别作为其预测标签其预测标签,经过此处理得到各个边界框的越策类别及对应的置信度值,大小为[7,7,2].一般情况下设置置信度阈值,将置信度小于该阈值的box过滤掉,然后再对剩余的边框进行NMS处理,最后留下来的就是检测结果。
需要注意的一点是NMS是分类别的使用NMS还是对所有预测框一视同仁。YOLO使用的是先使用NMS,再确定每个box的类别。基本过程是对于98个boxes,首先将小于置信度阈值的值归为0,然后分类对置信度值采用NMS,这里NMS处理结果不是剔除,而是将其置信度值归为0.
优缺点:
优点
采用了一个CNN实现检测,是单管道策略,其训练和预测都是end-to-end。算法简洁速度快,由于是对整个图片进行卷积,所以在其检测目标有更大的视野,不容易对背景误判。泛化能力强,在做迁移时,模型鲁棒性高。
缺点:各个单元格仅预测两个边界框,而且属于一个类别,对于小物体,yolo的检测效果不好。yolo在物体的宽高比方面泛化率低,无法定位不寻常比例的物体。