# Modify annotation
new_boxes=[]
for box in gt_boxes:
obj_name = box[0]
x1 = int(box[1])
y1 = int(box[2])
x2 = int(box[3])
y2 = int(box[4])
x1, x2 = x1-x, x2-x
y1, y2 = y1-y, y2-y
x1, y1, x2, y2 = x1/scale, y1/scale, x2/scale, y2/scale
if (x1<img.shape[1] and y1<img.shape[0]) and (x2>0 and y2>0):
if x1<0: x1=0
if y1<0: y1=0
if x2>img.shape[1]: x2=img.shape[1]
if y2>img.shape[0]: y2=img.shape[0]
new_boxes.append([obj_name, x1, y1, x2, y2])
return resized, new_boxes
CutoutCutout是2017年由Terrance DeVries和Graham W. Taylor在他们的论文中介绍的,是一种简单的正则化技术,在训练过程中随机掩盖输入的正方形区域,可以用来提高卷积神经网络的鲁棒性和整体性能。这种方法不仅非常容易实现,而且表明它可以与现有形式的数据扩充和其他正则化器一起使用,进一步提高模型的性能。论文地址:https://arxiv.org/abs/1708.04552与本文一样,我们使用了cutout来提高图像识别(分类)的精度,因此,如果我们将相同的方案部署到目标检测数据集中,可能会导致丢失目标(特别是小目标)的问题。在下图中,删除了剪切区域(黑色区域)内的大量小对象,这不符合数据增强的精神。
为了使这种方式适合对象检测,我们可以做一个简单的修改,而不是仅使用一个遮罩并将其放置在图像中的随机位置,而是随机选择一半的对象,并将裁剪应用于每个目标区域,效果更佳。增强后的图像如下图所示。
Cutout的输出是一个新生成的图像,我们不删除对象或改变图像大小,那么生成的图像的注释就是原始注释。def cutout(img, gt_boxes, amount=0.5):
'''
### Cutout ###
img: image
gt_boxes: format [[obj x1 y1 x2 y2],...]
amount: num of masks / num of objects
'''
out = img.copy()
ran_select = random.sample(gt_boxes, round(amount*len(gt_boxes)))
for box in ran_select:
x1 = int(box[1])
y1 = int(box[2])
x2 = int(box[3])
y2 = int(box[4])
mask_w = int((x2 - x1)*0.5)
mask_h = int((y2 - y1)*0.5)
mask_x1 = random.randint(x1, x2 - mask_w)
mask_y1 = random.randint(y1, y2 - mask_h)
mask_x2 = mask_x1 + mask_w
mask_y2 = mask_y1 + mask_h
cv2.rectangle(out, (mask_x1, mask_y1), (mask_x2, mask_y2), (0, 0, 0), thickness=-1)
return out
ColorJitterColorJitter是另一种简单的图像数据扩充类型,我们随机改变图像的亮度、对比度和饱和度。我相信这个“家伙”很容易被大多数读者理解。