python语义分割任务数据增强,对图片和label做同样的增强变换
2018-01-23 11:36
639 查看
# -*- coding:utf-8 -*- """数据增强 1. 翻转变换 flip 2. 随机修剪 random crop 3. 色彩抖动 color jittering 4. 平移变换 shift 5. 尺度变换 scale 6. 对比度变换 contrast 7. 噪声扰动 noise 8. 旋转变换/反射变换 Rotation/reflection """ from PIL import Image, ImageEnhance, ImageOps, ImageFile import numpy as np import random import threading, os, time import logging logger = logging.getLogger(__name__) ImageFile.LOAD_TRUNCATED_IMAGES = True class DataAugmentation: """ 包含数据增强的八种方式 """ def __init__(self): pass @staticmethod def openImage(image): return Image.open(image, mode="r") @staticmethod def randomRotation(image, label, mode=Image.BICUBIC): """ 对图像进行随机任意角度(0~360度)旋转 :param mode 邻近插值,双线性插值,双三次B样条插值(default) :param image PIL的图像image :return: 旋转转之后的图像 """ random_angle = np.random.randint(1, 360) return image.rotate(random_angle, mode) , label.rotate(random_angle, Image.NEAREST) #暂时未使用这个函数 @staticmethod def randomCrop(image, label): """ 对图像随意剪切,考虑到图像大小范围(68,68),使用一个一个大于(36*36)的窗口进行截图 :param image: PIL的图像image :return: 剪切之后的图像 """ image_width = image.size[0] image_height = image.size[1] crop_win_size = np.random.randint(40, 68) random_region = ( (image_width - crop_win_size) >> 1, (image_height - crop_win_size) >> 1, (image_width + crop_win_size) >> 1, (image_height + crop_win_size) >> 1) return image.crop(random_region), label @staticmethod def randomColor(image, label): """ 对图像进行颜色抖动 :param image: PIL的图像image :return: 有颜色色差的图像image """ random_factor = np.random.randint(0, 31) / 10. # 随机因子 color_image = ImageEnhance.Color(image).enhance(random_factor) # 调整图像的饱和度 random_factor = np.random.randint(10, 21) / 10. # 随机因子 brightness_image = ImageEnhance.Brightness(color_image).enhance(random_factor) # 调整图像的亮度 random_factor = np.random.randint(10, 21) / 10. # 随机因1子 contrast_image = ImageEnhance.Contrast(brightness_image).enhance(random_factor) # 调整图像对比度 random_factor = np.random.randint(0, 31) / 10. # 随机因子 return ImageEnhance.Sharpness(contrast_image).enhance(random_factor) ,label # 调整图像锐度 @staticmethod def randomGaussian(image, label, mean=0.2, sigma=0.3): """ 对图像进行高斯噪声处理 :param image: :return: """ def gaussianNoisy(im, mean=0.2, sigma=0.3): """ 对图像做高斯噪音处理 :param im: 单通道图像 :param mean: 偏移量 :param sigma: 标准差 :return: """ for _i in range(len(im)): im[_i] += random.gauss(mean, sigma) return im # 将图像转化成数组 img = np.asarray(image) img.flags.writeable = True # 将数组改为读写模式 width, height = img.shape[:2] img_r = gaussianNoisy(img[:, :, 0].flatten(), mean, sigma) img_g = gaussianNoisy(img[:, :, 1].flatten(), mean, sigma) img_b = gaussianNoisy(img[:, :, 2].flatten(), mean, sigma) img[:, :, 0] = img_r.reshape([width, height]) img[:, :, 1] = img_g.reshape([width, height]) img[:, :, 2] = img_b.reshape([width, height]) return Image.fromarray(np.uint8(img)), label @staticmethod def saveImage(image, path): image.save(path) def makeDir(path): try: if not os.path.exists(path): if not os.path.isfile(path): # os.mkdir(path) os.makedirs(path) return 0 else: return 1 except Exception, e: print str(e) return -2 def imageOps(func_name, image, label, img_des_path, label_des_path , img_file_name, label_file_name, times=5): funcMap = {"randomRotation": DataAugmentation.randomRotation, "randomCrop": DataAugmentation.randomCrop, "randomColor": DataAugmentation.randomColor, "randomGaussian": DataAugmentation.randomGaussian } if funcMap.get(func_name) is None: logger.error("%s is not exist", func_name) return -1 for _i in range(0, times, 1): new_image , new_label = funcMap[func_name](image,label) DataAugmentation.saveImage(new_image, os.path.join(img_des_path, func_name + str(_i) + img_file_name)) DataAugmentation.saveImage(new_label, os.path.join(label_des_path, func_name + str(_i) + label_file_name)) opsList = {"randomRotation", "randomColor", "randomGaussian"} def threadOPS(img_path, new_img_path, label_path, new_label_path): """ 多线程处理事务 :param src_path: 资源文件 :param des_path: 目的地文件 :return: """ #img path if os.path.isdir(img_path): img_names = os.listdir(img_path) else: img_names = [img_path] #label path if os.path.isdir(label_path): label_names = os.listdir(label_path) else: label_names = [label_path] img_num = 0 label_num = 0 #img num for img_name in img_names: tmp_img_name = os.path.join(img_path, img_name) if os.path.isdir(tmp_img_name): print('contain file folder') exit() else: img_num = img_num + 1; #label num for label_name in label_names: tmp_label_name = os.path.join(label_path, label_name) if os.path.isdir(tmp_label_name): print('contain file folder') exit() else: label_num = label_num + 1 if img_num != label_num: print('the num of img and label is not equl') exit() else: num = img_num for i in range(num): img_name = img_names[i] print img_name label_name = label_names[i] print label_name tmp_img_name = os.path.join(img_path, img_name) tmp_label_name = os.path.join(label_path, label_name) # 读取文件并进行操作 image = DataAugmentation.openImage(tmp_img_name) label = DataAugmentation.openImage(tmp_label_name) threadImage = [0] * 5 _index = 0 for ops_name in opsList: threadImage[_index] = threading.Thread(target=imageOps, args=(ops_name, image, label, new_img_path, new_label_path, img_name, label_name)) threadImage[_index].start() _index += 1 time.sleep(0.2) if __name__ == '__main__': threadOPS("/data1/qixinyuan/data/datasets/little/img", "/data1/qixinyuan/data/datasets/little/new_img", "/data1/qixinyuan/data/datasets/little/label", "/data1/qixinyuan/data/datasets/little/new_label")
相关文章推荐
- ubuntu为python处理图片安装图片数据增强库imgaug
- 关于名片全能王扫描,返回切边增强图片web api的图片数据分割
- Python图片数据增强crop、rotate、environment factor
- python的数据增强利用opencv读取图片
- 语义分割--Label Refinement Network for Coarse-to-Fine Semantic Segmentation
- 基于Mutil-Scale CNN的图片语义分割、法向量估计
- Android:仿微博Listview与多线程功能(JSON、数据下载、图片加载、Listview、异步任务)
- Python图片转换成矩阵,矩阵数据转换成图片
- 推荐一些在线效率工具汇总(数据分析,舆情监测、图片语义识别等)
- VOC2012 分割数据 转 lmdb 格式 python 代码
- Python图片转换成矩阵,矩阵数据转换成图片
- python中将手写数据数组转换为图片输入出来
- python通过接口上传图片造测试数据
- python 使用opencv 把视频 分割成图片
- python-抓取数据、下载图片(正则)、构造headers、urlencode、get_post
- python爬取微博图片数据存到Mysql中遇到的各种坑\python Mysql存储图片\python爬取微博图片
- 数据科学部门如何使用Python和R组合完成任务
- python中将数据增强
- [python] numpy 三行代码打乱训练数据(保持label和data的对应关系不变)
- python+caffe训练自己的图片数据流程