用labelme标注的目标检测数据并用albumentations进行数据增强

该代码段展示了一个Python脚本,它将Labelme格式的图像标注转换为COCO格式,以便利用albumentations库进行数据增强。应用了多种图像变换,如亮度对比度调整、噪声添加、模糊和旋转等。增强后的数据再次转换回Labelme格式并保存,以供后续使用。
摘要由CSDN通过智能技术生成

思路:先将labelme格式改成albumentations能识别的coco格式,然后使用albumentations进行处理,再将处理后的albumentations格式改成labelme的格式保存

import os
import cv2
import json
import albumentations as A

def data_aug(source_annotated, data_aug_annotated, times=3):
    transform = A.Compose([
            A.RandomBrightnessContrast(p=0.3),
            A.OneOf([A.GaussNoise(), ], p=0.5),
            A.OneOf([
                A.MotionBlur(p=0.2),
                A.MedianBlur(blur_limit=3, p=0.5),
                A.Blur(blur_limit=3, p=0.2),
            ], p=0.5),

            A.RandomBrightnessContrast(p=0.5),   
            A.RandomCrop(300, 300, p=0.5),
            A.RandomRotate90(p=0.5),
            A.HorizontalFlip(p=0.5),
            A.VerticalFlip(p=0.5),
            # to do
        ], bbox_params=A.BboxParams(format='coco', min_area=0., min_visibility=0., label_fields=['class_labels']))

    for js_file in os.listdir(source_annotated):
        if js_file.endswith(".json"):
            for nth in range(times):
                with open(source_annotated + str(js_file), 'r', encoding='utf8') as js:
                    json_base_name = os.path.splitext(js_file)[0]

                    coco_bboxes = []
                    class_labels = []
                    points = []
                    json_data = {}
                    json_data = json.load(js)
                    json_data_new = {
                        "version": json.__version__,
                        "flags": {},
                        "shapes": [],
                        "imagePath": " ",
                        "imageData": None,
                        "imageHeight": None,
                        "imageWidth": None
                    }

                    image_path = json_data["imagePath"]
                    image_base_name = os.path.splitext(image_path)[0]
                    image_extension = os.path.splitext(image_path)[1]  #

                    if json_base_name == image_base_name:
                        image = cv2.imread(source_annotated + image_path, cv2.IMREAD_UNCHANGED)
                        for jd in range(len(json_data["shapes"]) ):
                            coco_bboxes_inner = []
                            label = json_data.get("shapes")[jd].get("label")
                            points = json_data.get("shapes")[jd].get("points")

                            #两坐标
                            X1 = points[0][0]
                            Y1 = points[0][1]
                            X2 = points[1][0]
                            Y2 = points[1][1]

                            # 转化为coco格式的坐标
                            # 获取左上角坐标
                            coco_bboxes_inner.append(X2 if X1 > X2 else X1)
                            coco_bboxes_inner.append(Y2 if Y1 > Y2 else Y1)
                            #width、height
                            coco_bboxes_inner.append(abs(X1 - X2))
                            coco_bboxes_inner.append(abs(Y1 - Y2))
                            coco_bboxes.append(coco_bboxes_inner)
                            class_labels.append(label)

                        transformed = transform(image=image, bboxes=coco_bboxes, class_labels=class_labels)
                        transformed_image = transformed['image']
                        transformed_bboxes = transformed['bboxes']

                        # 将经过Albumentations变化过的bbox转成labelMe格式的坐标
                        transed_bbox = []
                        if len(transformed_bboxes) == 0:
                            continue
                        for tb in transformed_bboxes:
                            #组合左上角坐标(XY)
                            transed_bbox.append([float(tb[0]), float(tb[1])])
                            transed_bbox.append([float(tb[0]+tb[2]), float(tb[1] + tb[3])])

                        new_labelme_bbox = []
                        for i in range(len(transed_bbox)//2):
                            ii = i*2
                            new_labelme_bbox.append([transed_bbox[ii], transed_bbox[ii+1]])

                        save_base_name = json_base_name + "_" + str(nth)
                        cv2.imwrite(data_aug_annotated + "/" + save_base_name + image_extension, transformed_image)

                        for bbox, idx in zip(new_labelme_bbox, transformed['class_labels']):
                            dict_info = {'label': idx,
                                         'points': bbox,
                                         "group_id": None,
                                         "shape_type": "rectangle",
                                         "flags": {},
                                         }
                            json_data_new['shapes'].append(dict_info)
                            json_data_new["imagePath"] = save_base_name + image_extension
                            json_data_new["imageData"] = None
                            json_data_new["imageHeight"] = transformed_image.shape[0]
                            json_data_new["imageWidth"] = transformed_image.shape[1]

                        #写入新json文件
                        js_file_new = open(data_aug_annotated + "/" + save_base_name + '.json', 'w')
                        json.dump(json_data_new, js_file_new, indent=2)



if __name__ == "__main__":
    source_annotated = "data_annotated/"  # 原始的图片、标签路径
    data_aug_annotated = "data_aug_annotated" # 处理后的图片、标签路径
    times = 3  
    data_aug(source_annotated, data_aug_annotated, times)

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值