一、前情介绍

在之前对yolov3的学习中,有时候发现小样本数据集容易出现过拟合或者泛化能力不强的问题,在对这一问题提出的不同解决方法进行了摸索和尝试,发现提高数据集样本容量是一个比较直接和简单粗暴的方法,以下纪录这一实验方法。

二、环境

直接交代环境,都是相对较简单,在这里博主没遇到过坑

  • os
  • numpy
  • PIL
  • imgaug

三、代码

import xml.etree.ElementTree as ET
import os
import numpy as np
from PIL import Image
import shutilimport imgaug as ia
from imgaug import augmenters as iaaia.seed(1)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 bndboxlist# (506.0000, 330.0000, 528.0000, 348.0000) -> (520.4747, 381.5080, 540.5596, 398.6603)
def change_xml_annotation(root, image_id, new_target):new_xmin = new_target[0]new_ymin = new_target[1]new_xmax = new_target[2]new_ymax = new_target[3]in_file = open(os.path.join(root, str(image_id) + '.xml'))  # 这里root分别由两个意思tree = ET.parse(in_file)xmlroot = tree.getroot()object = xmlroot.find('object')bndbox = object.find('bndbox')xmin = bndbox.find('xmin')xmin.text = str(new_xmin)ymin = bndbox.find('ymin')ymin.text = str(new_ymin)xmax = bndbox.find('xmax')xmax.text = str(new_xmax)ymax = bndbox.find('ymax')ymax.text = str(new_ymax)tree.write(os.path.join(root, str("%06d" % (str(id) + '.xml'))))def change_xml_list_annotation(root, image_id, new_target, saveroot, id):in_file = open(os.path.join(root, str(image_id) + '.xml'))  # 这里root分别由两个意思tree = ET.parse(in_file)elem = tree.find('filename')elem.text = (str("%06d" % int(id)) + '.jpg')xmlroot = tree.getroot()index = 0for object in xmlroot.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)new_xmin = new_target[index][0]new_ymin = new_target[index][1]new_xmax = new_target[index][2]new_ymax = new_target[index][3]xmin = bndbox.find('xmin')xmin.text = str(new_xmin)ymin = bndbox.find('ymin')ymin.text = str(new_ymin)xmax = bndbox.find('xmax')xmax.text = str(new_xmax)ymax = bndbox.find('ymax')ymax.text = str(new_ymax)index = index + 1tree.write(os.path.join(saveroot, str("%06d" % int(id)) + '.xml'))def mkdir(path):# 去除首位空格path = path.strip()# 去除尾部 \ 符号path = path.rstrip("/")# 判断路径是否存在# 存在     True# 不存在   FalseisExists = os.path.exists()# 判断结果if not isExists:# 如果不存在则创建目录# 创建目录操作函数os.makedirs(path)print(path + ' 创建成功')return Trueelse:# 如果目录存在则不创建,并提示目录已存在print(path + ' 目录已存在')return Falseif __name__ == "__main__":IMG_DIR = "自己的文件路径/image"XML_DIR = "自己的文件路径/Anotations"AUG_XML_DIR = "F:/crop/Annotations"  # 存储增强后的XML文件夹路径try:shutil.rmtree(AUG_XML_DIR)except FileNotFoundError as e:a = 1mkdir(AUG_XML_DIR)AUG_IMG_DIR = "F:/crop/images"  # 存储增强后的影像文件夹路径try:shutil.rmtree(AUG_IMG_DIR)except FileNotFoundError as e:a = 1mkdir(AUG_IMG_DIR)AUGLOOP = 10  # 每张影像增强的数量boxes_img_aug_list = []new_bndbox = []new_bndbox_list = []# 影像增强seq = iaa.Sequential([iaa.Flipud(0.5),  # vertically flip 20% of all imagesiaa.Fliplr(0.5),  # 镜像iaa.Multiply((1.2, 1.5)),  # change brightness, doesn't affect BBsiaa.GaussianBlur(sigma=(0, 2.0)),  # iaa.GaussianBlur(0.5),iaa.Affine(translate_px={"x": 15, "y": 15},scale=(0.8, 0.95),rotate=(-30, 30))  # translate by 40/60px on x/y axis, and scale to 50-70%, affects BBs])for root, sub_folders, files in os.walk(XML_DIR):for name in files:bndbox = read_xml_annotation(XML_DIR, name)shutil.copy(os.path.join(XML_DIR, name), AUG_XML_DIR)shutil.copy(os.path.join(IMG_DIR, name[:-4] + '.jpg'), AUG_IMG_DIR)for epoch in range(AUGLOOP):seq_det = seq.to_deterministic()  # 保持坐标和图像同步改变,而不是随机# 读取图片img = Image.open(os.path.join(IMG_DIR, name[:-4] + '.jpg'))# sp = img.sizeimg = np.asarray(img)# bndbox 坐标增强for i in range(len(bndbox)):bbs = ia.BoundingBoxesOnImage([ia.BoundingBox(x1=bndbox[i][0], y1=bndbox[i][1], x2=bndbox[i][2], y2=bndbox[i][3]),], shape=img.shape)bbs_aug = seq_det.augment_bounding_boxes([bbs])[0]boxes_img_aug_list.append(bbs_aug)# new_bndbox_list:[[x1,y1,x2,y2],...[],[]]n_x1 = int(max(1, min(img.shape[1], bbs_aug.bounding_boxes[0].x1)))n_y1 = int(max(1, min(img.shape[0], bbs_aug.bounding_boxes[0].y1)))n_x2 = int(max(1, min(img.shape[1], bbs_aug.bounding_boxes[0].x2)))n_y2 = int(max(1, min(img.shape[0], bbs_aug.bounding_boxes[0].y2)))if n_x1 == 1 and n_x1 == n_x2:n_x2 += 1if n_y1 == 1 and n_y2 == n_y1:n_y2 += 1if n_x1 >= n_x2 or n_y1 >= n_y2:print('error', name)new_bndbox_list.append([n_x1, n_y1, n_x2, n_y2])# 存储变化后的图片image_aug = seq_det.augment_images([img])[0]path = os.path.join(AUG_IMG_DIR,str("%06d" % (len(files) + int(name[:-4]) + epoch * 250)) + '.jpg')image_auged = bbs.draw_on_image(image_aug, thickness=0)Image.fromarray(image_auged).save(path)# 存储变化后的XMLchange_xml_list_annotation(XML_DIR, name[:-4], new_bndbox_list, AUG_XML_DIR,len(files) + int(name[:-4]) + epoch * 250)print(str("%06d" % (len(files) + int(name[:-4]) + epoch * 250)) + '.jpg')new_bndbox_list = []

四、结果对比

原数据集,大概只有27张图片

这是增强了11倍的结果:

对增强后的数据集进行训练,没有任何问题:

对小样本数据进行数据增强相关推荐

  1. 深度学习和目标检测系列教程 9-300:TorchVision和Albumentation性能对比,如何使用Albumentation对图片数据做数据增强

    @Author:Runsen 上次对xml文件进行提取,使用到一个Albumentation模块.Albumentation模块是一个数据增强的工具,目标检测图像预处理通过使用"albume ...

  2. 序列数据的数据增强方法综述

    为了追求精度,深度学习模型框架的结构越来越复杂,网络越来越深.参数量的增加意味着训练模型需要更多的数据.然而人工标注数据的成本是高昂的,且受客观原因所限,实际应用时可能难以获得特定领域的数据,数据不足 ...

  3. 水下目标检测之数据集和数据增强方法

    水下目标检测之数据集和数据增强方法 通过之前对yolov5的简单学习,发现yolov5的训练和调试都比较方便,因此希望将其运用到水下目标检测的任务中.那么首要任务就是寻找比较合适的数据集作为训练样本, ...

  4. 为什么大数据需要数据湖?

    自2011年"数据湖"概念被提出,业界便对数据湖一直有着广泛而不同的理解和定义. "数据湖是一个集中化存储海量的.多个来源,多种类型数据,并可以对数据进行快速加工,分析的 ...

  5. 环球网校签约神策数据,数据赋能教育行业创新升级

    近日,环球网校签约神策数据,未来神策将以第三方大数据服务商的形式助力环球网校进一步加快教­­­育行业的创新与突破. 环球网校于 2003 年成立,十七年来秉承"教育无域,环球共享" ...

  6. 无法从套接字中获取更多数据_数据科学中应引起更多关注的一个组成部分

    无法从套接字中获取更多数据 介绍 (Introduction) Data science, machine learning, artificial intelligence, those terms ...

  7. 乐高ev3 读取外部数据_数据就是新乐高

    乐高ev3 读取外部数据 When I was a kid, I used to love playing with Lego. My brother and I built almost all k ...

  8. 再问数据中台 - 数据中台是什么?

    数据中台需求的出现,是企业数字化转型的一个标志性的转折,数据中台成为热点,标志着,"在企业信息化或者数字化的历史上,数据从来没有距离业务这么近,数字化转型正从流程优先走向数据优先" ...

  9. Hadoop! | 大数据百科 | 数据观 | 中国大数据产业观察_大数据门户

    深度好文丨读完此文,就知道Hadoop了! 来源:BiThink 时间:2016-04-12 15:14:39 作者:陈飚 "昔我十年前,与君始相识." 一瞬间Hadoop也到了要 ...

  10. 数据治理:数据治理之道-数据文化-数据思维融入企业文化

    参考<一本书讲透数据治理>.<数据治理>等 大数据的根本价值在于从数据的不确定性中发现规律,获得确定性.想要在繁杂的大数据中快速找到价值数据,并依靠数据发现.分析.解决.跟踪问 ...

最新文章

  1. 第三十六期:人工智能统计调查:86%的消费者更喜欢人工客服
  2. React 组件间传值的几种情形
  3. Ubuntu Mysql安装配置
  4. 群晖消息通知 推送服务器,群晖resync服务器
  5. VS2010下C/C++连接MySql数据库的方法
  6. .Net Log4Net配置多文件日志记录
  7. 服务器互相备份不同步_94爱分享拍了拍你,这款好用的数据同步备份软件千万不要错过!...
  8. 【OpenCV-Python】29.OpenCV的特征检测——特征匹配
  9. linux如何监控网络流量,linux 下网络流量监控
  10. 时间格式2020-01-13T16:00:00.000Z中的T和Z分别表示什么,如何处理
  11. 游戏服务器架构,配置
  12. 伊利诺伊大学在线计算机硕士,UIUC伊利诺伊大学厄巴纳香槟分校计算机科学硕士MSc in Computer Science...
  13. Oracle递归查询的原理
  14. 电视直播(CCTV5)
  15. 程序员个人外包合同模板 私活模板
  16. jquery实现新闻消息滚动
  17. 一文快速了解MassGrid网络
  18. 读书笔记:《SEO教程:搜索引擎优化入门与进阶》(4)——代码优化
  19. 基于深度学习的音乐推荐系统
  20. 视觉SLAM十四讲第八讲

热门文章

  1. MATLAB函数合辑
  2. CSS_python
  3. CSP-J2020复赛题解
  4. 我要曝光!CDN 省钱大法!
  5. 华为linux系统能用Cad么,华为平板能装cad画图吗 华为平板可以用cad软件吗?
  6. android 网络运营商名称显示规则(锁屏界面,下拉列表)
  7. hive修复多级分区
  8. [存档]Martin Fowler在UMLChina交流实录
  9. 锐捷 linux无法上网,通过锐捷认证了,为什么还不能上网?
  10. wordpress友联_WordPress 友情链接页面终极版