目标检测踩坑指南

目标检测踩坑指南

事情是这样的。。。最近摸鱼时,,咳咳,, 干活时踩了一点点坑。直入主题,在anchor_based的目标检测中,正确使用合适的anchor会给网络性能带来很大程度的提升。

读取到gt_boxes是否要经过变换?怎么变换?

一般在目标检测中,假设原始图像为(1280, 720), 而网络的输入为(640,640), 那么需要将图像resize。

  • 当通过读取json文件,读取到图像的真实box时,boxes可能有两种存在方式,一种是(x1, y1, x2, y2),其中(x1,y1)是box左上角的点在图像中的坐标, (x2, y2)是box右下角的点在图像中的坐标。另一种存在方式是:(cx, cy, w, h),其中(cx, cy)是box的中心点在图像中的坐标,(w,h)是box的宽度和高度。
  • 如果直接resize,长宽压缩比例有可能不同,例如:原始图像大小为(1280, 720), 而网络的输入/输出大小为(640, 640), 那么在width这一维度上,压缩比例为:640 / 1280 = 0.5, 在height上这一维度上,压缩比例为:0.888。 那么图像的gt_boxes的width维度上要按照0.5的比例压缩,height维度上以0.888的比例压缩。

如果获取anchor?

yolov3的anchor获取

注意anchor只是作为objects的宽高值的先验。所以在聚类的时候只需要这些objects的[width, height]就可以。

  • 利用上述的方式获得所有的boxes的[width,height]之后,利用聚类算法获取9个anchor。有了这9个anchor,我们就可以认为:大部分的objects,其宽度和高度就在这个范围内。
  • 一般的聚类算法,两个点的距离为欧氏距离。两个点的距离越近,两个点就有更大的可能为一个类。聚类算法的核心为:类间间距越大越好,类内间距越小越好。
  • 在目标检测中,距离函数从欧式距离换成了1-iou(box1, box2). iou(box1, box2)代表两个box的交并比。
  • 因为聚类元素为[width, height]. 并没有box。所以默认box的左上角值为(0,0), 宽高值即为box右下角的xy值,这样一个[width,height]也就对应一个box。
  • 给定聚类数目,当聚类中心不再变化/达到一定聚类次数时,聚类结束。

yolov5的anchor获取

在yolov5中获取anchor的方式更加成熟,是利用k_means + 遗传变异的方法获取anchor。

anchor到底怎么用的啊? 好烦哦。。

假如网络的输入为(640, 640),网络输出层的三个featue map的大小分别为(20,20),(40,40),(80,80)。假设我们的anchor为[[(w1, h1), (w2, h2), (w3, h3)], [(w4, h4), (w5, h5), (w6, h6)], [(w7,h7),(w8,h8),(w9,h9)]].

  • 最小的网格需要使用最大的感受野,对应地,要使用最大的三个anchor,这三个anchor在应用时也要除以相同的尺度32。
  • 最大的网格(80,80)需要使用较小的三个anchor,对应地,这三个anchor在应用时要处理相同的尺度8.

你可能感兴趣的:(目标检测,聚类,算法)