Anchor Boxes详解

为什么要用anchor box?

到目前为止,对象检测中存在一个问题就是每个格子只能预测一个对象,如果想让一个格子检测出多个对象,你可以这么做,就是使用anchor box这个概念,我们从一个例子开始讲吧。
在这里插入图片描述
假设我们有这样一张图片,对于这个例子,我们使用3x3的网格,可以观察到,行人和汽车的中心几乎在同一个网格,然而我们以前的方法一个格子只能预测一个对象,而且对于y输出的的向量量𝑦 = [𝑝𝑐 𝑏𝑥 𝑏𝑦 𝑏ℎ 𝑏𝑤 𝑐1 𝑐2 𝑐3 ],你可以检测这三个类别,行人、汽车和摩托车,它将无法输出检测结果,所以我必须从两个检测结果中选一个,这便影响了模型性能,导致一些对象被丢弃无法检测出来。

anchor box 引入

在这里插入图片描述
而 anchor box 的思路是,这样子,预先定义两个不同形状的 anchor box,或者 anchor box 形状,你要做的是把预测结果和这两个 anchor box 关联起来。一般来说,你可能会用更多的 anchor box,可能要 5 个甚至更多,我们就用两个 anchor box,这样介绍起来简单一些。
你要做的是定义类别标签,用的向量不再是下面这个:
[𝑝𝑐 𝑏𝑥 𝑏𝑦 𝑏ℎ 𝑏𝑤 𝑐1 𝑐2 𝑐3]𝑇
而是重复两次:
𝑦 = [𝑝𝑐 𝑏𝑥 𝑏𝑦 𝑏ℎ 𝑏𝑤 𝑐1 𝑐2 𝑐3 𝑝𝑐 𝑏𝑥 𝑏𝑦 𝑏ℎ 𝑏𝑤 𝑐1 𝑐2 𝑐3]𝑇
前面8个是和anchor box1相关联,后面8个是和anchor box2相关联。行人一般符合anchor box1形状,所以用anchor box1来预测行人回达到很好的效果,这么编码𝑝𝑐 = 1,代表有个行人,用𝑏𝑥,𝑏𝑦,𝑏ℎ和𝑏𝑤来编码包住行人的边界框,然后用𝑐1,𝑐2,𝑐3(𝑐1 = 1,𝑐2 = 0,𝑐3 = 0)来说明这个对象是个行人。 汽车一般符合anchor box2形状,所以用anchor box2来预测汽车会有很好的效果,你就可以这么编码,这里第二个对象是汽车,然后有这样的边界框等等,这里所有参数都和检测汽车
相关(𝑝𝑐 = 1,𝑏𝑥,𝑏𝑦,𝑏ℎ,𝑏𝑤,𝑐1 = 0,𝑐2 = 1,𝑐3 = 0)。

总结

所以,总的来说,anchor box是这么来做的,现在每个对象和以前一样根据中心点分配到一个格子中,然后看和每个anchor box的IoU(交并比),选择IoU最高的那个,用这个anchor box来进行预测。输出y的维度是nxnxmxc(n为图片分成nxn份,m为anchor box数量,c为class类别数)

缺陷或不足

现在还有一些额外的细节,如果你有两个 anchor box,但在同一个格子中有三个对象,这种情况算法处理不好,你希望这种情况不会发生,但如果真的发生了,这个算法并没有很好的处理办法,对于这种情况,我们就引入一些打破僵局的默认手段。还有这种情况,两个对象都分配到一个格子中,而且它们的 anchor box 形状也一样,这是算法处理不好的另一种情况,你需要引入一些打破僵局的默认手段,专门处理这种情况,希望你的数据集里不会出现这种情况,其实出现的情况不多,所以对性能的影响应该不会很大。 我们建立 anchor box 这个概念,是为了处理两个对象出现在同一个格子的情况,实践中这种情况很少发生,特别是如果你用的是 19×19 网格而不是3×3 的网格,两个对象中点处于 361 个格子中同一个格子的概率很低,确实会出现,但出现频率不高。也许设立 anchor box 的好处在于 anchor box 能让你的学习算法能够更有征对性,特别是如果你的数据集有一些很高很瘦的对象,比如说行人,还有像汽车这样很宽的对象,这样你的算法就能更有针对性的处理,这样有一些输出单元可以针对检测很宽很胖的对象,比如说车子,然后输出一些单元,可以针对检测很高很瘦的对象,比如说行人。

怎么选择anchor box?

1.一般手工指定anchor box形状,根据要检测的对象,指定有针对性地anchor box,可选择5-10个anchor box,使其尽可能覆盖到不同形状。
2.使用K-means聚类算法获得anchor box。

  • 13
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
yolov5的autoanchor.py是一个用于自动计算YOLO模型中anchor boxes的脚本。在YOLO系列算法中,anchor boxes用于预测目标的位置和类别。 autoanchor.py的主要作用是根据给定的训练数据,自动计算出适合当前数据集的anchor boxes的尺寸。在训练YOLO模型时,anchor boxes的尺寸需要根据数据集的特点进行调整,以便更好地适应目标物体的大小和比例。 在autoanchor.py中,首先会对输入的训练数据进行聚类操作。聚类是一种将数据分为不同组别的方法,可以根据数据点之间的相似性将它们分成不同的类别。在这里,聚类的目的是找到一组anchor boxes,使得这些boxes能够较好地覆盖训练数据中的目标物体。 具体而言,autoanchor.py使用k-means聚类算法来对训练数据中的bounding box进行聚类。k-means算法是一种常用的聚类算法,它通过迭代的方式将数据点划分为k个簇,使得每个点距离所属簇的质心最近。 在YOLO模型中,每个目标物体都会被表示为一个bounding box,其中包括了物体的位置和尺寸信息。autoanchor.py会根据训练数据中的bounding box计算出一组适合的anchor boxes,这些boxes的尺寸能够较好地覆盖目标物体的大小和比例。 计算完成后,autoanchor.py会输出得到的anchor boxes的尺寸,在训练YOLO模型时,这些尺寸会被用作模型的先验信息,用于预测目标的位置和类别。 总结来说,yolov5的autoanchor.py是一个用于自动计算YOLO模型中anchor boxes尺寸的脚本,它通过对训练数据进行聚类操作,找到适合当前数据集的anchor boxes尺寸,以便更好地预测目标物体的位置和类别。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值