图片数据增强,包括模糊,亮度,裁剪,旋转,平移,镜像 ,python ,LabelImg,LabelMe工具

  • 1 对象检测图片数据增强(使用labelImg工具)
  • 2 对象分割图片数据增强(使用labelMe工具)
    • 参考

    本屌打完标签之后,想着能不能找个python脚本找到对应的图片和xml文件帮我增强一下,然后用yolo去训练,效果应该会好一些,但是找了一圈后,发现网上大牛是有很多,但每个人都贴一点代码,没有稍微完整一点的,所以本屌决定动手用python整一个,以后打标签就少打一点了,只有天知道我打标签的痛苦,那么多零件要训练,真要命。
  好了,找了一圈后,还是找了一些demo,具体参考了一个github上的大牛,最后的参考给出了链接,我拿来瞎改了一下,能用吧,然后基于这个,自己又搞了一个基于labelMe标定的json数据的图片增强,因为最近的新项目要用。大概就是这样吧。

完整代码,我放在github上了:https://github.com/pureyangcry/tools

  希望对您有帮助!谢谢!

1 对象检测图片数据增强(使用labelImg工具)

  首先来张图片(网上找的,https://jingyan.baidu.com/article/574c52193e33f96c8d9dc1e4.html)


  对于这张图片,我们使用labelImg工具进行标注,会得到对应的xml文件,结果如下:


    现在我们要实现一些图片增强,比如模糊,亮度,裁剪,旋转,平移,镜像等变化,同时我们希望,标签也跟着变化,比如下面这样的结果:

    好的,大概我们就实现了,效果还行吧?会同时得到对应的新图片和xml文件结果。

  实现这个图片增强效果的部分代码如下:

# 加噪声def _addNoise(self, img):'''输入:img:图像array输出:加噪声后的图像array,由于输出的像素是在[0,1]之间,所以得乘以255'''# return cv2.GaussianBlur(img, (11, 11), 0)return random_noise(img, mode='gaussian', seed=int(time.time()), clip=True) * 255# 调整亮度def _changeLight(self, img):alpha = random.uniform(0.35, 1)blank = np.zeros(img.shape, img.dtype)return cv2.addWeighted(img, alpha, blank, 1 - alpha, 0)保存xml的代码:
```javascript# 保持xml结果def save_xml(self, file_name, save_folder, img_info, height, width, channel, bboxs_info):''':param file_name:文件名:param save_folder:#保存的xml文件的结果:param height:图片的信息:param width:图片的宽度:param channel:通道:return:'''folder_name, img_name = img_info  # 得到图片的信息E = objectify.ElementMaker(annotate=False)anno_tree = E.annotation(E.folder(folder_name),E.filename(img_name),E.path(os.path.join(folder_name, img_name)),E.source(E.database('Unknown'),),E.size(E.width(width),E.height(height),E.depth(channel)),E.segmented(0),)labels, bboxs = bboxs_info  # 得到边框和标签信息for label, box in zip(labels, bboxs):anno_tree.append(E.object(E.name(label),E.pose('Unspecified'),E.truncated('0'),E.difficult('0'),E.bndbox(E.xmin(box[0]),E.ymin(box[1]),E.xmax(box[2]),E.ymax(box[3]))))etree.ElementTree(anno_tree).write(os.path.join(save_folder, file_name), pretty_print=True)

**完整程序请参考最上面,给出的github链接的DataAugForObjectDetection中的内容。**

2 对象分割图片数据增强(使用labelMe工具)

    还是那张图片,恩,牧羊犬还是小时候好看,长大了就丑了(初一小时候就很好看,哈哈)

  现在使用LabelMe工具来标注,不出意外会得到一个json文件,结果如下:


    现在我们来实现这个结果的增强,能力有限,目前只做到了模糊、亮度、平移、镜像等变化。

    效果如下:


    贴上部分代码:

  # 随机的改变点的值def _addRandPoint(self, img):percent = self.rand_point_percentnum = int(percent * img.shape[0] * img.shape[1])for i in range(num):rand_x = random.randint(0, img.shape[0] - 1)rand_y = random.randint(0, img.shape[1] - 1)if random.randint(0, 1) == 0:img[rand_x, rand_y] = 0else:img[rand_x, rand_y] = 255return img# 平移def _shift_pic_bboxes(self, img, json_info):# ---------------------- 平移图像 ----------------------h, w, _ = img.shapex_min = wx_max = 0y_min = hy_max = 0shapes = json_info['shapes']for shape in shapes:points = np.array(shape['points'])x_min = min(x_min, points[:, 0].min())y_min = min(y_min, points[:, 1].min())x_max = max(x_max, points[:, 0].max())y_max = max(y_max, points[:, 0].max())d_to_left = x_min  # 包含所有目标框的最大左移动距离d_to_right = w - x_max  # 包含所有目标框的最大右移动距离d_to_top = y_min  # 包含所有目标框的最大上移动距离d_to_bottom = h - y_max  # 包含所有目标框的最大下移动距离x = random.uniform(-(d_to_left - 1) / 3, (d_to_right - 1) / 3)y = random.uniform(-(d_to_top - 1) / 3, (d_to_bottom - 1) / 3)M = np.float32([[1, 0, x], [0, 1, y]])  # x为向左或右移动的像素值,正为向右负为向左; y为向上或者向下移动的像素值,正为向下负为向上shift_img = cv2.warpAffine(img, M, (img.shape[1], img.shape[0]))# ---------------------- 平移boundingbox ----------------------for shape in shapes:for p in shape['points']:p[0] += xp[1] += yreturn shift_img, json_info# 镜像def _filp_pic_bboxes(self, img, json_info):# ---------------------- 翻转图像 ----------------------h, w, _ = img.shapesed = random.random()if 0 < sed < 0.33:  # 0.33的概率水平翻转,0.33的概率垂直翻转,0.33是对角反转flip_img = cv2.flip(img, 0)  # _flip_xinver = 0elif 0.33 < sed < 0.66:flip_img = cv2.flip(img, 1)  # _flip_yinver = 1else:flip_img = cv2.flip(img, -1)  # flip_x_yinver = -1# ---------------------- 调整boundingbox ----------------------shapes = json_info['shapes']for shape in shapes:for p in shape['points']:if inver == 0:p[1] = h - p[1]elif inver == 1:p[0] = w - p[0]elif inver == -1:p[0] = w - p[0]p[1] = h - p[1]return flip_img, json_info

    保存对应的json文件代码:

    # 对图片进行字符编码def img2str(self, img_name):with open(img_name, "rb")as f:base64_data = str(base64.b64encode(f.read()))match_pattern = re.compile(r'b\'(.*)\'')base64_data = match_pattern.match(base64_data).group(1)return base64_data# 保存图片结果def save_img(self, save_path, img):cv2.imwrite(save_path, img)# 保持json结果def save_json(self, file_name, save_folder, dic_info):with open(os.path.join(save_folder, file_name), 'w') as f:json.dump(dic_info, f, indent=2)

完整代码请参考上面给出的github链接的DataAugForObjectSegmentation文件中的内容。

参考

[1] https://github.com/maozezhong/CV_ToolBox/blob/master/DataAugForObjectDetection

图片数据增强,包括模糊,亮度,裁剪,旋转,平移,镜像 ,python ,LabelImg,LabelMe工具相关推荐

  1. LabelImg,LabelMe工具标注后的图片数据增强

    向AI转型的程序员都关注了这个号???????????? 人工智能大数据与深度学习  公众号:datayx 这是一个目标检测和目标分割增强的小工具,需要您事先标记一些图片,然后变化增强图片(支持Lab ...

  2. Dataset之图片数据增强:基于TF实现图片数据增强(原始的训练图片reshaped_image→数据增强→distorted_image(训练时直接使用))

    Dataset之图片数据增强:基于TF实现图片数据增强(原始的训练图片reshaped_image→数据增强→distorted_image(训练时直接使用)) 目录 数据增强步骤 数据增强实现代码 ...

  3. DL之AlexNet:利用卷积神经网络类AlexNet实现猫狗分类识别(图片数据增强→保存h5模型)

    DL之AlexNet:利用卷积神经网络类AlexNet实现猫狗分类识别(图片数据增强→保存h5模型) 目录 利用卷积神经网络类AlexNet实现猫狗分类识别(图片数据增强→保存h5模型) 设计思路 处 ...

  4. python 图片数据增强_数据增强之批量修改图像尺寸大小(附Python实现)

    2019 is a new start! 很久没有更啦~希望不要懒惰.(虽然不努力真滴很舒服诶) 今天就来说一下之前在处理图片时候用到的一些知识. 数据增强 在接触Alexnet网络结构模型的时候,第 ...

  5. Dataset之图片数据增强:设计自动生成汽车车牌图片算法(cv2+PIL)根据随机指定七个字符生成逼真车牌图片数据集(自然场景下+各种噪声效果)可视化

    Dataset之图片数据增强:设计自动生成汽车车牌图片算法(cv2+PIL)根据随机指定七个字符生成逼真车牌图片数据集(自然场景下+各种噪声效果)可视化 导读 设计自动生成汽车车牌图片算法,基于cv2 ...

  6. Dataset之图片数据增强:设计自动生成(高级封装之命令行解析实现)汽车车牌图片算法(cv2+PIL+argparse)根据随机指定七个字符自动生成逼真车牌图片数据集(带各种噪声效果)

    Dataset之图片数据增强:设计自动生成(高级封装之命令行解析实现)汽车车牌图片算法(cv2+PIL+argparse)根据随机指定七个字符自动生成逼真车牌图片数据集(带各种噪声效果) 导读 设计自 ...

  7. 【数据增强】---- 使用 Pytorch 裁剪图片并保存

    文章目录 概述 实现方式 项目结构及代码 输出结果 补充 对文件夹里的所有图片批量裁剪 概述 最近需要制作一个数据集,由于数据集的数量不够,而这些数据集中的单张照片很大,因此可以通过裁剪的方式进行数据 ...

  8. python图片旋转脚本_封装了深度学习中几个图片数据增强的脚本-python平移、旋转与调整大小...

    文章目录 平移 代码 演示 删除 代码 演示 旋转 代码 演示 平移 代码 可以调整以下的代码,只进行某一方向的平移:也可修改divisor调整平移的比例因子. import cv2 import n ...

  9. unet图片数据增强_kaggle气胸疾病图像分割top5解决方案

    比赛背景 突然喘气,无缘无故地无助地呼吸,这会是肺衰竭吗?气胸可由胸部钝伤.肺部疾病的损害引起,有时候甚至无法探寻诱因.在某些情况下,肺萎陷可能会危及生命.气胸通常由胸部X射线放射科医生诊断,但有时很 ...

最新文章

  1. AX2009取销售订单的税额
  2. 用C#语言构造蜘蛛程序
  3. POJ 3281 -- Dining(最大流,拆点建图)
  4. java中堆与栈的区别_java中堆和栈的区别分析
  5. gitlab永久设置密码
  6. 月份第一天_4月份的第一天,全省迎来晴暖天气~
  7. Wide-Baseline Image Matching Using Line Signatures
  8. django-区分时区的时间类型
  9. JavaScript继承详解
  10. 需求分析 转自:http://fangang.iteye.com/blog/1345099
  11. 仓库管理数据库系统设计
  12. Maven的下载安装配置教程(详细图文)
  13. 主板 B85 + 核显HD4600 , EFI 安装黑苹果
  14. beanshell断言_从BeanShell断言脚本调用Jmeter函数
  15. SpaceSyntax【空间句法】之DepthMapX学习:第四篇 凸多边形图分析[未完]
  16. 自定义考勤统计日历(一)
  17. 程序员需要了解的常见的英文缩写的含义
  18. 硬盘坏道如何屏蔽?最全攻略都在这了!
  19. Python垃圾收集机制
  20. python绘制相关系数热力图

热门文章

  1. 机电一体化综合实训考核设备
  2. node koa解析excel表格 .xlsx .xls
  3. mc服务器怎么修改浮空字,如何制作悬浮字?我的世界教程 | 我的世界 | MC世界侠...
  4. 宝塔面板+腾讯云轻量应用服务器部署fiora聊天室
  5. 【2016浙江省赛:区间取模】E : Modulo Query | ZOJ - 3940
  6. DUL模型详解——代码+原理——Data Uncertainty Learning
  7. c语言 乘法运算符,C 乘法运算符
  8. 苹果于近日推送了 iOS 14.5 开发者预览版 Beta
  9. 接口文档——Swagger
  10. iOS版本最新分布概况