实例分割数据集有限,根据图像增强imgaug生成数据集

1、需求背景: 对于含有化学生产加工的公司,车间含有化学封装、蚀刻等工艺流程,一线工人需要进行化学原料的添加等操作,然而存在工人不能按照规范穿戴安全帽,防尘服,手套,安全鞋的现象,对工人的生命安全造成影响。

2、由于图像采集难度较大,不利于模型训练,故采用图像增强方法,增加图片的数量 imgaug的github地址

1、github的官网的项目
2、labelme进行关键点的打标签,会生成JPG、json文件一对一

直接上代码

import os
import json

#读取python文件
from operator import index
import cv2
import numpy as np
from imgaug import augmenters as iaa
import imgaug as ia
import json
import os

# 定义一个lambda表达式,以p=0.5的概率去执行sometimes传递的图像增强
from tqdm import tqdm

sometimes = lambda aug: iaa.Sometimes(0.5, aug)
# 建立一个名为seq的实例,定义增强方法,用于增强

aug = iaa.Sequential(
    [
        iaa.Fliplr(0.5),  # 对50%的图像进行镜像翻转
        iaa.Flipud(0.2),  # 对20%的图像做左右翻转
        sometimes(iaa.Crop(percent=(0, 0.1))),
        # 这里沿袭我们上面提到的sometimes,对随机的一部分图像做crop操作
        # crop的幅度为0到10%
        # 或者 sometimes(iaa.Crop(px=(0, 16))),随机在距离边缘的0-16像素中选择crop范围

        # 对一部分图像做仿射变换
        sometimes(iaa.Affine(
            scale={"x": (0.8, 1.2), "y": (0.8, 1.2)},  # 图像缩放为80%到120%之间
            translate_percent={"x": (-0.2, 0.2), "y": (-0.2, 0.2)},  # 平移±20%之间
            rotate=(-45, 45),  # 旋转±45度之间
            shear=(-16, 16),  # 剪切变换±16度,(矩形变平行四边形)
            order=[0, 1],  # 使用最邻近差值或者双线性差值
            cval=(0, 255),  # 全白全黑填充
            mode=ia.ALL  # 定义填充图像外区域的方法
        )),

        # 使用下面的0个到5个之间的方法去增强图像。注意SomeOf的用法
        iaa.SomeOf((0, 5),
                   [                     
                       # 用高斯模糊,均值模糊,中值模糊中的一种增强。注意OneOf的用法
                       iaa.OneOf([
                           iaa.GaussianBlur((0, 3.0)),
                           iaa.AverageBlur(k=(7, 13)),  # 核大小2~7之间,k=((5, 7), (1, 3))时,核高度5~7,宽度1~3
                           iaa.MedianBlur(k=(9, 11)),
                       ]),

                       # 锐化处理
                       iaa.Sharpen(alpha=(0, 1.0), lightness=(0.75, 1.5)),

                       # 浮雕效果
                       # iaa.Emboss(alpha=(0, 1.0), strength=(0, 2.0)),

                       # 边缘检测,将检测到的赋值0或者255然后叠在原图上
                       sometimes(iaa.OneOf([
                           iaa.EdgeDetect(alpha=(0, 0.7)),
                           iaa.DirectedEdgeDetect(
                               alpha=(0, 0.7), direction=(0.0, 1.0)
                           ),
                       ])),

                       # 加入高斯噪声
                       iaa.AdditiveGaussianNoise(
                           loc=0, scale=(0.0, 0.05 * 255), per_channel=0.5
                       ),

                       # 将1%到10%的像素设置为黑色
                       # 或者将3%到15%的像素用原图大小2%到5%的黑色方块覆盖
                       iaa.OneOf([
                           iaa.Dropout((0.01, 0.03), per_channel=0.5),
                           iaa.CoarseDropout(
                               (0.03, 0.05), size_percent=(0.02, 0.05),
                               per_channel=0.2
                           ),
                       ]),

                       # 2%的概率反转像素的强度,即原来的强度为v那么现在的就是255-v
                       # iaa.Invert(0.02, per_channel=True),

                       # 每个像素随机加减-10到10之间的数
                       iaa.Add((-3, 3), per_channel=0.5),

                       # 像素乘上0.9或者1.1之间的数字.
                       iaa.Multiply((0.9, 1.1), per_channel=0.5),

                       # 将整个图像的对比度变为原来的0.9或者1.1
                       # iaa.ContrastNormalization((0.9, 1.1), per_channel=0.5),
                       iaa.LinearContrast((0.6,1.4),per_channel=0.5),
                       # 将RGB变成灰度图然后乘alpha加在原图上
                       iaa.Grayscale(alpha=(0.0, 0.1)),

                       # 把像素移动到周围的地方。这个方法在mnist数据集增强中有见到
                       # sometimes(
                       #     iaa.ElasticTransformation(alpha=(0.5, 3.5), sigma=0.25)
                       # ),

                       # 使用该方法,可能会导致报错:   process finished with exit code 137
                       # 至于为啥报错,我也没搞定,直接舍弃该增强方法
                       # sometimes(iaa.PiecewiseAffine(scale=(0.01, 0.05))) 扭曲图像的局部区域   
                   ],

                   random_order=True  # 随机的顺序把这些操作用在图像上
                   )
    ],
    random_order=True  # 随机的顺序把这些操作用在图像上
)


image_path = r'/path/files'
file_path_new = r'/path/new_file_path'
files = os.listdir(image_path)

for file in tqdm(files):
    if(file.endswith(".JPG")):
        for l in range(20):
            f = open(image_path + '/' + file.split(".")[0] + '.json')
            data = json.load(f)
            image = cv2.imread(image_path + '/' + file)
            print( '母图片'  + str(file)   +  '第'+  str(l)  + '张图片')
            #由于shapes种可能包含多个不同的对象,所以需要进行遍历循环
            if (len(data["shapes"]) >= 0):
                keypoints_tmp = []
                keypoints_list = []
                for j in range(len(data["shapes"])):
                    keypoints_tmp.append(len(data["shapes"][j]["points"]))
                    for i in data["shapes"][j]["points"]:
                        keypoints_list.append(i)
                keypoints=ia.KeypointsOnImage([ia.Keypoint(x=int(v[0]), y=int(v[1])) for v in keypoints_list], shape=image.shape)
                batch = ia.Batch(images=[image],keypoints=[keypoints])
                batch_aug =list(aug.augment_batches([batch]))[0]
                aug_example_img = batch_aug.images_aug[0]

                cnts = []
                num_k = 0

                for x, k in enumerate(keypoints_tmp):
                    cnt = []
                    for i in batch_aug.keypoints_aug[0][num_k:num_k+k]:
                        if(int(i.x < 0) or int(i.y < 0)):
                            cnt = []
                            break
                        cnt.append([int(i.x),int(i.y)])
                    num_k = k + num_k
                    data["shapes"][x]["points"] = cnt
                    #取消绘图描点过程
                    # cnts.append(np.array(cnt))
                #取消绘图描点过程
                # cv2.drawContours(aug_example_img,cnts,-1,(0,0,255),1)
                aug_example_img = aug_example_img.copy()
                #更改json文件的image_name
                data["imagePath"] =  file.split(".")[0] + "-" + str(l) +".JPG"
                data["imageData"] = None
                file_new =  open(file_path_new + "/" + file.split(".")[0] + '-' + str(l) + '.json','w')
                json.dump(data,file_new,indent=2)  #indent的目的是为了使得JSON格式样子更加好看
                cv2.imwrite(file_path_new + '/' +file.split(".")[0] + '-' + str(l) + '.JPG' ,aug_example_img)
       

``
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值