Loading...
首页专栏正文

Yolov1介绍

susan 发布于 2021-03-06 16:15:06 浏览 2943 点赞 96 收藏 9

YOLO是什么? YOLO(You Only Look Once)是一种单端式的目标检测算法。YOLO仅需要“看”一次图片就能给出图片中的对象类别和位置,这也是与RCNN系列算法的区别(RCNN算法需要“看”两次,对应的是两段式的目标检测算法)。YOLO最大的特点是极具优势的检测速度,最新版本的YOLOv4在保持较高准确率的情况下每秒仍可处理近70帧,完全可以用于实时的目标检测。

基本思想 首先,YOLO会将一张图片划分成S×S的网格形式,为了方便说明,我们划分成3×3的形式,就像下面这样:

然后我们要为每一个小格子制作对应的y标签,假设我们需要识别的物体就是图里的三种:狗、自行车和汽车,那么我们的Y标签就可以表示成下面这个向量: y=(pc,bx,by,bh,bw,c1,c2,c3)T

pc表示格子中是否有目标,bx和by表示物体中心坐标,bh和bw表示物体的高和宽,c1、c2和c3表示分别表示狗、自行车和汽车。 下面我们举个简单例子: 假如对应网格里没有要检测的对象,那么y标签就是这样: y=(0,?,?,?,?,?,?,?)T

?表示我们不关注这个变量的值,意思是如果pc为0那么后面的元素就不需要关注了。 假如网格中检测对象是一只狗,那么对应的y标签就是下面这样: y=(1,bx,by,bh,bw,1,0,0)T

因为图片中有物体,所以pc=1,对象是狗,所以c1=1。

下面我们说一下bx、by、bh、bw四个坐标的取值。 这里坐标是相对于格子的,格子左上角坐标是(0,0),右下角坐标是(1,1),这里我们粗略估算bx=0.7,by=0.7,bh=1.4,bw=0.9,这里bh=1.4说明这个物体大小是超过格子范围的,所以值大于1。 然后我们就得到了一个3×3×8的向量,3×3表示图片划分的区域数,每个区域具有8个标签,所以是3×3×8。

以上面的例子为例,我们假设模型的具体训练方式如下:

这里只画出了一个卷积层+最大池化层,实际作者使用了多个卷积+最大池化层提取特征,最后通过全连接层进行分类。 训练好模型,我们输入图片,经过一次前向传播得到输出y,y中就包含了物体的类别和位置。

另一个问题就是:前面我们说到一个对象可能可能会跨越很多网格,但是它只会被分配到中心点所在的单个网格。我们使用的网格越多,那么多个物体的中心点出现在一个网格内的概率就越低。

如何判断定位准确性 YOLO使用IoU(Intersection over union)来判断定位是否精确。什么是IoU呢,我们来看下面这张图: 绿色框是人为标注的精确范围,也就是论文中常说的ground-truth bounding boxes,红色框是算法预测的范围,那么IoU就是两个框的交集(黄色部分)与两个框的并集(红色部分)的比值。IoU的定义如下:

当交并比等于1的时候,就说明预测100%精确了。

如何防止一个目标被多次检测 目标检测的常见问题之一是检测对象会不止一次被检测到,就像下面这样:

汽车被检测到了3次,非极大值抑制(NMS.Non-Maximum Suppression)便是用留下最高概率检测框的思想去除同一个检测对象的重复边界框。 它会选择一个结果中的最高概率—0.9,然后去掉与0.9的边界框具有较高IoU的边界框,然后同一个物体就只剩下了一个最高概率的边界框。

如果还有边界框,它会继续选择剩余的框中具有最高概率的边界框,然后再去掉与这个边界框具有较高IoU的边界框。 不断重复第二个步骤,直到去除检测所有对象的重复框。

两个物体的中心在同一个格子 想避免两个物体的中心在同一个格子,一个方法就是将格子变得小一点。而另一个方法,就是使用anchor box,还是这张图,这次我们想同时检测标志牌和车:

汽车和标志牌的中心点都在第三行第二列的格子里,我们再看看他们的检测框:

可以看到他们的包围框形状差异,一个比较高,一个比较宽,那么我们就可以根据数据集定义几种anchor box来区分同一个格子的几个物体。

这里我们定义两种anchor box来区分车和标志牌。加了anchor box,y怎么变化呢?首先,每个y标签有8个元素,最后三个元素c1、c2、c3分别代表标志牌、车和狗(图里并没有)。那么每一个anchor box就对应一组这样的8个元素。我们定义了两个anchor box,所以对应的y就变成了16(8×2)个元素,就像下面这样: y=(pc1,bx,by,bh,bw,c1,c2,c3,pc2,bx,by,bh,bw,c1,c2,c3)T pc1代表车的anchor box是否生效,pc2代表标志牌的。假如上图没有车只有标志牌,y标签第一行的第一个元素就是0;第二行第一个元素就是1,与前面一样,如果对应的数字是1,那么对应的后7位变量我们就不再关心了。实际对应的标签就是下面这样: y=(0,bx,by,bh,bw,1,0,0,1,bx,by,bh,bw,0,1,0)T 如果只有车没有标志牌,那么反过来就可以了。

总结 YOLO制作数据集时将图片映射成S×S的网格,每个网格都有预定义的多个anchor box。 每次检测目标都会产生anchor box数量的重复框,然后用NMS(非极大值抑制)的思想去除重复框。 以上就是YOLOv1的大概思想。

参考资料: http://www.elecfans.com/rengongzhineng/851008.html https://zhuanlan.zhihu.com/p/48530654 https://www.analyticsvidhya.com/blog/2018/12/practical-guide-object-detection-yolo-framewor-python/

*本文仅代表作者观点,不代表易百纳技术社区立场。系作者授权易百纳技术社区发表,未经许可不得转载。

精彩评论

内容存在敏感词
打赏
打赏作者
susan
您的支持将鼓励我继续创作!
金额:
¥1 ¥5 ¥10 ¥50 ¥100
支付方式:
微信支付
支付宝支付
微信支付
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

易百纳技术社区
确定要删除此文章、专栏、评论吗?
确定
取消
易百纳技术社区