数据扩充是一种增加数据集多样性的技术,无需收集更多真实数据,但仍有助于提高模型精度并防止模型过拟合。
在本文中,你将学习使用Python和OpenCV为对象检测任务实现最流行、最高效的数据扩充过程。
即将引入的一组数据扩充方法包括:
随机裁剪
Cutout
颜色抖动
增加噪音
过滤
首先,在继续之前,让我们导入几个库并准备一些必要的子例程。
import os
import cv2
import numpy as np
import random
def file_lines_to_list(path):
'''
### 在TXT文件里的行转换为列表 ###
path: 文件路径
'''
with open(path) as f:
content = f.readlines()
content = [(x.strip()).split() for x in content]
return content
def get_file_name(path):
'''
### 获取Filepath的文件名 ###
path: 文件路径
'''
basename = os.path.basename(path)
onlyname = os.path.splitext(basename)[0]
return onlyname
def write_anno_to_txt(boxes, filepath):
'''
### 给TXT文件写注释 ###
boxes: format [[obj x1 y1 x2 y2],...]
filepath: 文件路径
'''
txt_file = open(filepath, "w")
for box in boxes:
print(box[0], int(box[1]), int(box[2]), int(box[3]), int(box[4]), file=txt_file)
txt_file.close()
下面的图片是在这篇文章中使用的示例图片。
随机裁剪
随机裁剪随机选择一个区域并进行裁剪以生成新的数据样本,裁剪后的区域应具有与原始图像相同的宽高比,以保持对象的形状。
从上图中,左侧图像表示具有边界框(红色)的原始图像,通过裁剪橙色框内的区域创建一个新样本作为右侧图像。
在新示例的注释中,将删除与左侧图像中的橙色框不重叠的所有对象,并细化位于橙色框边界上的对象的坐标,使其适合新图像示例。原始图像的随机裁剪输出为新裁剪图像及其注释。
def randomcrop(img, gt_boxes, scale=0.5):
'&#