这次复现的是一种特殊的数据增强方式,copy-paste(复制-粘贴)
参考资料:(29条消息) 代码复现:Copy-Paste 数据增强for 语义分割_叶舟的博客-CSDN博客_copy pastehttps://blog.csdn.net/oYeZhou/article/details/111696577?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165932070216782246443539%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=165932070216782246443539&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~hot_rank-2-111696577-null-null.142^v36^pc_rank_34&utm_term=copy-paste&spm=1018.2226.3001.4187
GitHub项目代码:
https://github.com/qq995431104/Copy-Paste-for-Semantic-Segmentation
我使用的是仿VOC数据集进行复现,因为我觉得voc格式的数据集更直观简单一些
首先要制作一个自己的语义分割VOC格式数据集,这里我之前的教程有讲过,站里也有很多很详细的教程,就不赘述了
简单来说,我们最终制作完成的数据集只需要有两样东西,按如下格式摆放即可:
JPEGImages下存放的是图片的原图,格式为jpg,不是jpg在读入的时候会error,说return了nonetype
SegmentationClass下面存放的是与原图按顺序一一对应的掩膜图像,格式是png,一般来说用脚本生成的都是png
然后在copy_paste.py中直接修改路径,运行即可
#改成自己的路径即可,如果显示读不到文件就改成绝对路径
def get_args():
parser = argparse.ArgumentParser()
parser.add_argument("--input_dir", default="./dataset/VOCdevkit2012/VOC2012", type=str,
help="input annotated directory")
parser.add_argument("--output_dir", default="./dataset/VOCdevkit2012/VOC2012_copy_paste", type=str,
help="output dataset directory")
parser.add_argument("--lsj", default=True, type=bool, help="if use Large Scale Jittering")
return parser.parse_args()
Tips:本人在这里遇到了一个报错
大意为我们读入的mask图像是一个RGB格式的三通道彩色图像(括号中三个参数分别表示长,宽,通道数),而代码需要处理mask的图片是一个单通道的图像,因此我们需要把这个读入的mask图像转换成单通道的,也就是灰度图像,解决办法如下:
#大概在代码的80行左右,在img和mask分别resize之后,把mask转换成单通道灰度图像
h_new, w_new = int(h * rescale_ratio), int(w * rescale_ratio)
img = cv2.resize(img, (w_new, h_new), interpolation=cv2.INTER_LINEAR)
mask = cv2.resize(mask, (w_new, h_new), interpolation=cv2.INTER_NEAREST)
#我使用的是opencv中的库函数,可以直接转换
mask=cv2.cvtColor(mask,cv2.COLOR_BGR2GRAY)
运行成功后,在同一级文件夹下会生成一个格式与VOC2012格式一样的文件夹,里面分别存放了copy-paste之后的原图和掩膜图像
检验成果: