对图像进行旋转、镜像等数据增强后同时对labelme标注的json进行相应的增强结果生成(lableme格式的json与图像同步进行数据增强)

直接上代码(需要注意:只能对单张图像增强后的生成json脚本,可以在main里面改一下,改成一个循环就可以。你的json在labelme标注的时候要保存imageData,这个脚本需要对这个数据也做旋转或者镜像处理,没有imageData会报错,有问题评论区可讨论)

import base64
import json
from labelme import utils
import cv2 as cv
import sys
import numpy as np
import random
import re


class DataAugment(object):
    def __init__(self, image_id, suffix):
        self.add_saltNoise = True
        self.gaussianBlur = True
        self.changeExposure = True 
        self.id = image_id
        self.suffix = suffix
        img = cv.imread(str(self.id)+self.suffix)
        try:
            img.shape
        except:
            print('No Such image!---'+str(id)+self.suffix)
            sys.exit(0)
        self.src = img
        dst1 = cv.flip(img, 0, dst=None)
        dst2 = cv.flip(img, 1, dst=None)
        dst3 = cv.flip(img, -1, dst=None)
        self.flip_x = dst1
        self.flip_y = dst2
        self.flip_x_y = dst3
        cv.imwrite(str(self.id)+'_flip_x'+self.suffix, self.flip_x)
        cv.imwrite(str(self.id)+'_flip_y'+self.suffix, self.flip_y)
        cv.imwrite(str(self.id)+'_flip_x_y'+self.suffix, self.flip_x_y)

    def gaussian_blur_fun(self):
        if self.gaussianBlur:
            dst1 = cv.GaussianBlur(self.src, (5, 5), 0)
            dst2 = cv.GaussianBlur(self.flip_x, (5, 5), 0)
            dst3 = cv.GaussianBlur(self.flip_y, (5, 5), 0)
            dst4 = cv.GaussianBlur(self.flip_x_y, (5, 5), 0)
            cv.imwrite(str(self.id)+'_Gaussian'+self.suffix, dst1)
            cv.imwrite(str(self.id)+'_flip_x'+'_Gaussian'+self.suffix, dst2)
            cv.imwrite(str(self.id)+'_flip_y'+'_Gaussian'+self.suffix, dst3)
            cv.imwrite(str(self.id)+'_flip_x_y'+'_Gaussian'+self.suffix, dst4)

    def change_exposure_fun(self):
        if self.changeExposure:
            # contrast
            reduce = 0.5
            increase = 1.4
            # brightness
            g = 10
            h, w, ch = self.src.shape
            add = np.zeros([h, w, ch], self.src.dtype)
            dst1 = cv.addWeighted(self.src, reduce, add, 1-reduce, g)
            dst2 = cv.addWeighted(self.src, increase, add, 1-increase, g)
            dst3 = cv.addWeighted(self.flip_x, reduce, add, 1 - reduce, g)
            dst4 = cv.addWeighted(self.flip_x, increase, add, 1 - increase, g)
            dst5 = cv.addWeighted(self.flip_y, reduce, add, 1 - reduce, g)
            dst6 = cv.addWeighted(self.flip_y, increase, add, 1 - increase, g)
            dst7 = cv.addWeighted(self.flip_x_y, reduce, add, 1 - reduce, g)
            dst8 = cv.addWeighted(self.flip_x_y, increase, add, 1 - increase, g)
            cv.imwrite(str(self.id)+'_ReduceEp'+self.suffix, dst1)
            cv.imwrite(str(self.id)+'_flip_x'+'_ReduceEp'+self.suffix, dst3)
            cv.imwrite(str(self.id)+'_flip_y'+'_ReduceEp'+self.suffix, dst5)
            cv.imwrite(str(self.id)+'_flip_x_y'+'_ReduceEp'+self.suffix, dst7)
            cv.imwrite(str(self.id)+'_IncreaseEp'+self.suffix, dst2)
            cv.imwrite(str(self.id)+'_flip_x'+'_IncreaseEp'+self.suffix, dst4)
            cv.imwrite(str(self.id)+'_flip_y'+'_IncreaseEp'+self.suffix, dst6)
            cv.imwrite(str(self.id)+'_flip_x_y'+'_IncreaseEp'+self.suffix, dst8)

    def add_salt_noise(self):
        if self.add_saltNoise:
            percentage = 0.005
            dst1 = self.src
            dst2 = self.flip_x
            dst3 = self.flip_y
            dst4 = self.flip_x_y
            num = int(percentage * self.src.shape[0] * self.src.shape[1])
            for i in range(num):
                rand_x = random.randint(0, self.src.shape[0] - 1)
                rand_y = random.randint(0, self.src.shape[1] - 1)
                if random.randint(0, 1) == 0:
                    dst1[rand_x, rand_y] = 0
                    dst2[rand_x, rand_y] = 0
                    dst3[rand_x, rand_y] = 0
                    dst4[rand_x, rand_y] = 0
                else:
                    dst1[rand_x, rand_y] = 255
                    dst2[rand_x, rand_y] = 255
                    dst3[rand_x, rand_y] = 255
                    dst4[rand_x, rand_y] = 255
            cv.imwrite(str(self.id)+'_Salt'+self.suffix, dst1)
            cv.imwrite(str(self.id)+'_flip_x'+'_Salt'+self.suffix, dst2)
            cv.imwrite(str(self.id)+'_flip_y'+'_Salt'+self.suffix, dst3)
            cv.imwrite(str(self.id)+'_flip_x_y'+'_Salt'+self.suffix, dst4)

    def json_generation(self):
        image_names = [str(self.id)+'_flip_x', str(self.id)+'_flip_y', str(self.id)+'_flip_x_y']
        if self.gaussianBlur:
            image_names.append(str(self.id)+'_Gaussian')
            image_names.append(str(self.id)+'_flip_x'+'_Gaussian')
            image_names.append(str(self.id)+'_flip_y' + '_Gaussian')
            image_names.append(str(self.id)+'_flip_x_y'+'_Gaussian')
        if self.changeExposure:
            image_names.append(str(self.id)+'_ReduceEp')
            image_names.append(str(self.id)+'_flip_x'+'_ReduceEp')
            image_names.append(str(self.id)+'_flip_y'+'_ReduceEp')
            image_names.append(str(self.id)+'_flip_x_y'+'_ReduceEp')
            image_names.append(str(self.id)+'_IncreaseEp')
            image_names.append(str(self.id)+'_flip_x'+'_IncreaseEp')
            image_names.append(str(self.id)+'_flip_y'+'_IncreaseEp')
            image_names.append(str(self.id)+'_flip_x_y'+'_IncreaseEp')
        if self.add_saltNoise:
            image_names.append(str(self.id)+'_Salt')
            image_names.append(str(self.id)+'_flip_x' + '_Salt')
            image_names.append(str(self.id)+'_flip_y' + '_Salt')
            image_names.append(str(self.id)+'_flip_x_y' + '_Salt')
        for image_name in image_names:
            with open(image_name+self.suffix, "rb")as b64:
                base64_data_original = str(base64.b64encode(b64.read()))
                # In pycharm:
                # match_pattern=re.compile(r'b\'(.*)\'')
                # base64_data=match_pattern.match(base64_data_original).group(1)
                # In terminal:
                base64_data = base64_data_original
            with open(str(self.id)+".json", 'r')as js:
                json_data = json.load(js)
                img = utils.img_b64_to_arr(json_data['imageData'])
                height, width = img.shape[:2]
                shapes = json_data['shapes']
                for shape in shapes:
                    points = shape['points']
                    for point in points:
                        match_pattern2 = re.compile(r'(.*)_x(.*)')
                        match_pattern3 = re.compile(r'(.*)_y(.*)')
                        match_pattern4 = re.compile(r'(.*)_x_y(.*)')
                        if match_pattern4.match(image_name):
                            point[0] = width - point[0]
                            point[1] = height - point[1]
                        elif match_pattern3.match(image_name):
                            point[0] = width - point[0]
                            point[1] = point[1]
                        elif match_pattern2.match(image_name):
                            point[0] = point[0]
                            point[1] = height - point[1]
                        else:
                            point[0] = point[0]
                            point[1] = point[1]
                json_data['imagePath'] = image_name+self.suffix
                json_data['imageData'] = base64_data
                json.dump(json_data, open("./"+image_name+".json", 'w'), indent=2)
        return image_names

if __name__ == "__main__":

    dataAugmentObject = DataAugment("your image name: such as: my_img.jpg, you can give my_img", suffix=".jpg")
    dataAugmentObject.gaussian_blur_fun()
    dataAugmentObject.change_exposure_fun()
    dataAugmentObject.add_salt_noise()
    dataAugmentObject.json_generation()

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
制作COCO格式图像字幕数据集需要进行以下步骤: 1. 数据收集:收集大量的图像相应的字幕文本。可以使用现有的图像数据集,如MSCOCO、Flickr8k等,或者自行收集图像并为其编写字幕。 2. 标注图像:对每个图像进行标注,将图像相应的字幕文本配对。可以使用标注工具,如LabelImg或VGG Image Annotator (VIA),手动标注每个图像。 3. 创建COCO格式JSON文件:根据COCO数据集格式要求,创建一个JSON文件来存储图像和字幕的相关信息。JSON文件应包含以下字段:images、annotations、categories等。 4. 图像处理和预处理:对图像进行必要的处理和预处理,如调整大小、裁剪、正则化等。确保所有图像都具有相同的尺寸和格式。 5. 数据集划分:根据需要,将数据集划分为训练集、验证集和测试集。通常,80%的数据用于训练,10%用于验证,10%用于测试。 6. 数据集清洗和质量控制:检查并清理数据集中的错误、重复或低质量的样本。确保每个样本都有准确且有意义的字幕文本。 7. 数据集扩充(可选):可以通过数据增强技术,如旋转、翻转、缩放等,扩充数据集,增加样本的多样性和数量。 8. 数据集导入和使用:将COCO格式数据集导入到深度学习框架中,如TensorFlow或PyTorch,并用于训练和评估图像字幕生成模型。 以上是制作COCO格式图像字幕数据集的一般步骤。具体实施时,可以根据需求和实际情况进行调整和扩展。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值