前言
最近在做钢筋检测的比赛,因为比赛提供的数据只有200多张,而要使用神经网络模型来完成这个任务的话,这样的数据集就显得非常不足了,因而当我们要训练一个神经网络模型时,数据增强就变成了一种非常有必要的手段了,数据增强一般非为两种方式:一类是离线增强,一类是在线增强。
- 离线增强 : 直接对数据集进行处理,数据的数目会变成增强因子 x 原数据集的数目 ,这种方法常常用于数据集很小的时候
- 在线增强 : 这种增强的方法用于,获得 batch 数据之后,然后对这个 batch
的数据进行增强,如旋转、平移、翻折等相应的变化,由于有些数据集不能接受线性级别的增长,这种方法长用于大的数据集,很多机器学习框架已经支持了这种数据增强方式,并且可以使用
GPU 优化计算。
本篇博客我也将具体讲一下这两种方式的具体使用。本次主要做的是VOC2007数据格式的数据增强,使用的数据库主要是imaug,imgaug是一个用于机器学习实验中图像增强的python库,支持python2.7和3.4以上的版本。 它支持多种增强技术,允许轻松组合这些技术,具有简单但功能强大的随机界面,可以在这些界面上增加图像和关键点/界标,并在后台进程中提供增强功能以提高性能。
1.离线增强
代码地址:https://github.com/xinyu-ch/Data-Augment
读取xml原始坐标
def read_xml_annotation(root, image_id):
in_file = open(os.path.join(root, image_id))
tree = ET.parse(in_file)
root = tree.getroot()
bndboxlist = []
for object in root.findall('object'): # 找到root节点下的所有country节点
bndbox = object.find('bndbox') # 子节点下节点rank的值
xmin = int(bndbox.find('xmin').text)
xmax = int(bndbox.find('xmax').text)
ymin = int(bndbox.find('ymin').text)
ymax = int(bndbox.find('ymax').text)
# print(xmin,ymin,xmax,ymax)
bndboxlist.append([xmin, ymin, xmax, ymax])
# print(bndboxlist)
bndbox = root.find('object').find('bndbox')
return b