本文提出针对模型对MS COCO数据集中小目标测试检测效果差,提出两个解决方案:
1. 对包含小目标的图片过采样。
2. 在包含小目标的图片中做填鸭。
两个解决方法又进一步细分,并通过实验得到一些结论。MS COCO中对small object的定义是矩形框面积小于32 x 32。代码实现在:Data_Augmentation_Zoo_for_Object_Detection/SmallObjectAugmentation.py at master · zzl421/Data_Augmentation_Zoo_for_Object_Detection · GitHub 欢迎star和指错
一、Oversampling:3x 效果最佳
二、Augmentation:第3种策略最佳
1. 用augmented图片替代original图片
2. 将augmented图片复制一次
3. augmented图片(0.5的概率执行)+ original图片
三、Copy-Pasting Strategies
1. 一张图片中,随机选择一个小目标进行多次复制,放置在随机位置。复制一次效果最好
2. 一张图片中,随机选择多个小目标复制,放置在任意位置。复制三次效果最好。
3. 一张图片中,复制所有的小目标,放置在随机位置。复制一次效果最好
四、 Pasting Algorithms
1. 复制后的目标不覆盖原目标
2. 不对粘贴对象的边缘进行平滑处理(本文的平滑处理:具有不同尺寸过滤器的高斯模糊)
综上,我们以0.5的概率执行数据增强操作。数据增强操作即是Copy-Pasting策略,共包含三个,并且复制后的目标不覆盖原目标:
1. 随机选择一个小目标复制一次
2. 随机选择多个小目标复制三次
3. 所有小目标复制一次
代码实现见上,使用如下:
class SmallObjectAugmentation(object):
def __init__(self, thresh=64*64, prob=0.5, copy_times=3, epochs=30, all_objects=False, one_object=False):
类实例化参数包括:
1. thresh: 目标是否是小目标
2. prob: 执行Copy-pasting的可能性,默认为0.5
3. copy_times: 复制的次数,默认为3
4. epochs: 为避免遮挡之前生成的目标,多次随机产生annot的中心点坐标,为避免浪费算力,迭代epochs代后,自动结束。
5. all_object: 为Ture时,执行策略3
6. one_object: 为Ture时,执行策略1
7. all_object = one_object = False时,执行策略2,即默认执行策略2
SOA_THRESH = 64*64
SOA_PROB = 1
SOA_COPY_TIMES = 3
SOA_EPOCHS = 30
SOA_ONE_OBJECT = False
SOA_ALL_OBJECTS = False
augmenter = SmallObjectAugmentation(SOA_THRESH, SOA_PROB, SOA_COPY_TIMES, SOA_EPOCHS, SOA_ONE_OBJECT, SOA_ALL_OBJECTS)
"""
sample = {'img':img, 'annot':annots}
img = [height, width, 3]
annot = [xmin, ymin, xmax, ymax, label]
"""
sample = augmenter(sample)
在KITTI数据集上,执行效果如下:
policy 1
policy 2
policy 3