文章链接:Simple Copy-Paste is a Strong Data Augmentation Method for Instance Segmentation
主要记录下文章中做的实验和一些有意思的related work。
文章主旨:
介绍copy paste这一方法可以显著提升实例分割的性能。前人的工作大都集中于对目标周围的视觉场景建模,后进行粘贴。与此对比,copy paste作为一种更为简单的方法(对目标物进行随机粘贴)可以给模型带来足够好的效果。特别是对半监督算法和自训练而言,copy paste可生成extra data作为pseudo label进行训练,带来很好的效果。
core:
(1)选择源图像和目标图像;
(2)选择要粘贴的物体;
(3)选择粘贴位置。
此外,除却粘贴,算法中还加入小幅抖动(small scale jittering)、大幅抖动(large scale jittering)和随机resize,对粘贴后的图像进行处理。实验表示SJ处理大大提高了数据有效性。
related work:
实例分割中提到的文章我很感兴趣,copy paste用于弱监督实例分割。Remez等将copy paste作为一种对抗性方法,原理是基于一张给定bbox的图像,生成网络对bbox中的目标进行预测,生成mask。基于给定的mask,让该目标融入其他的图像,判决网络用来确保生成的mask or image足够的真实。
method:
好像一些文章中没有提到,论文中使用了高斯滤波平滑粘贴图像边缘,然而效果并不好。
SSJ的resize范围是0.8~1.25,LSJ的resize范围是0.1~2.0. 如果生成图像小于原始图像,用灰色像素点pad。
experiment:
主要对自训练很感兴趣。
To combine self-training and Copy-Paste we first use a supervised teacher model trained with Copy-Paste to generate pseudo labels on unlabeled data. Next we take ground truth objects from COCO and paste them into pseudo labeled images and COCO images. Finally, we train the student model on all these images.
这个没做过相关项目,回头看看具体效果。实验结果表明与baseline相比,提升2.9AP。
最后放个小demo:
import cv2
import numpy as np
# 读取源图像和目标图像
source_image = cv2.imread('C:/Users/10351/Desktop/1.jpg')
target_image = cv2.imread('C:/Users/10351/Desktop/3.jpg')
# 指定目标在源图像中的位置和尺寸
x, y, xmax, ymax = 48, 240, 195, 371
w = xmax - x
h = ymax - y
# 提取目标
cropped_image = source_image[y:y+h, x:x+w]
# 计算目标的缩放比例,保持原始宽高比,设置0.5
scale_factor = 0.5
# 调整目标的大小
new_width = int(w * scale_factor)
new_height = int(h * scale_factor)
cropped_image_resized = cv2.resize(cropped_image, (new_width, new_height))
# 将目标随机粘贴到目标图像的位置
x_pos = np.random.randint(0, target_image.shape[1] - new_width)
y_pos = np.random.randint(0, target_image.shape[0] - new_height)
# 创建一个与目标图像相同大小的空白图像
result_image = target_image.copy()
# 粘贴目标到目标图像,保持原始宽高比
result_image[y_pos:y_pos+new_height, x_pos:x_pos+new_width] = cropped_image_resized
# 保存合成的图像
cv2.imwrite("result_image.jpg", result_image)