做小目标的目标检测的伙伴应该都熟悉,COCO官方把32*32以下的目标定义为小目标,而当我们自己想从中剥离出更小的目标该怎么做呢?(如TOD数据集中指出目标平均像素体积为12.8这样)
当32*32像素的目标不适合我们所需要更改这个尺寸的时候我们需要修改哪些内容呢?往下看,直接找到cocoval.py的源码,直接ctrl+f搜索small,找到对应有三个位置,第三个small在setDetParams函数中,源码如下:
def setDetParams(self):
self.imgIds = []
self.catIds = []
# np.arange causes trouble. the data point on arange is slightly larger than the true value
self.iouThrs = np.linspace(.5, 0.95, int(np.round((0.95 - .5) / .05)) + 1, endpoint=True)
self.recThrs = np.linspace(.0, 1.00, int(np.round((1.00 - .0) / .01)) + 1, endpoint=True)
self.maxDets = [1, 10, 100]
self.areaRng = [[0 ** 2, 1e5 ** 2], [0 ** 2, 32 ** 2], [32 ** 2, 96 ** 2], [96 ** 2, 1e5 ** 2]]
self.areaRngLbl = ['all', 'small', 'medium', 'large']
self.useCats = 1
以0-13个像素划分为tiny指标为例对代码进行修改,主要就修改areaRng和areaRngLbl两行:
def setDetParams(self):
self.imgIds = []
self.catIds = []
# np.arange causes trouble. the data point on arange is slightly larger than the true value
self.iouThrs = np.linspace(.5, 0.95, int(np.round((0.95 - .5) / .05)) + 1, endpoint=True)
self.recThrs = np.linspace(.0, 1.00, int(np.round((1.00 - .0) / .01)) + 1, endpoint=True)
self.maxDets = [1, 10, 100]
#修改下面这两行
self.areaRng = [[0 ** 2, 1e5 ** 2], [0 ** 2,13],[13, 32 ** 2], [32 ** 2, 96 ** 2], [96 ** 2, 1e5 ** 2]]
self.areaRngLbl = ['all', 'tiny','small', 'medium', 'large']
self.useCats = 1
从上面的代码修改可以看出,我们加了一个0-13的区域对应着“tiny”这个指标,这样用coco指标进行计算的时候就会自动算出APtiny指标了(同理可以这样获得所有自己想要的指标)。接下来讲讲另外两个要改动的位置。
前两个“small”在_summarizaDets函数中,该函数的作用是获取各级的AP以及AR指标以便后期打印信息,这里的每一行就是对应最终打印的指标信息。
def _summarizeDets():
stats = np.zeros((12,))
stats[0] = _summarize(1)
stats[1] = _summarize(1, iouThr=.5, maxDets=self.params.maxDets[2])
stats[2] = _summarize(1, iouThr=.75, maxDets=self.params.maxDets[2])
stats[3] = _summarize(1, areaRng='small', maxDets=self.params.maxDets[2])
stats[4] = _summarize(1, areaRng='medium', maxDets=self.params.maxDets[2])
stats[5] = _summarize(1, areaRng='large', maxDets=self.params.maxDets[2])
stats[6] = _summarize(0, maxDets=self.params.maxDets[0])
stats[7] = _summarize(0, maxDets=self.params.maxDets[1])
stats[8] = _summarize(0, maxDets=self.params.maxDets[2])
stats[9] = _summarize(0, areaRng='small', maxDets=self.params.maxDets[2])
stats[10] = _summarize(0, areaRng='medium', maxDets=self.params.maxDets[2])
stats[11] = _summarize(0, areaRng='large', maxDets=self.params.maxDets[2])
return stats
这里就直接和你们说一下要怎么修改吧,把tiny增加在small上面的位置(需要加两条,一条是AP一条是AR),另外一定要注意stats=np.zeros((12,))也要记得修改,加了两条就修改12-》14.
修改完上述两个内容之后直接运行yolov5的val.py测试一下,结果如下:
可以看出成功的获得了APtiny的指标了。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.youkuaiyun.com/Fan1534/article/details/137581936