【深度学习标注数据处理】imgaug Augment Polygons 对标注图片和 polygon 的数据增强

2023-11-16

对于本地化进行图像的增强,大家都是非常好操作的。但是,对于标注信息一起增强,还是稍微有一些难度的,麻烦很多。

我是遇到一个数据集非常少的任务,只有40张图。就直接标记了去训练,发现几乎不拟合,当然这里使用的是yolo v8,而不是UNet。

于是,先本地化给增强到50倍数据集,然后再去训练,说不定是个好的方法。这里采用的就是imgaug的开源库,学习参考如下:

  1. imgaug 地址
  2. 官方文档
  3. Augment Polygons

一、单张实验下

1、首先,是采用labelme标注的一张图像,如下,是用labelme打开时候看到的内容:

在这里插入图片描述

imgaug查看原图和标记内容,如下:

import imageio
import imgaug as ia
import json
import numpy as np
from imgaug.augmentables.polys import Polygon, PolygonsOnImage

class LabelJson(object):
    def __init__(self, abs_path=None) -> None:
        super().__init__()
        self.abs_path = abs_path
        self.read()

    def read(self):
        with open(self.abs_path, 'r', encoding='utf-8') as f:
            lj = json.load(f)
        self.wh = [lj.get('imageWidth'), lj.get('imageHeight')]
        shapes = lj.get('shapes')
        self.cls = [i.get('label') for i in shapes]  # '1305' if i.get('label') == '14' else
        points = [i.get('points') for i in shapes]
        points = [np.array(i, dtype=np.int32).reshape((-1, 2)) for i in points]
        self.loc = points
        self.box = [[j[:, 0].min(), j[:, 1].min(), j[:, 0].max(), j[:, 1].max()] for j in points]
        self.img_name = lj.get('imagePath')
        self.is_pos = bool(self.cls)
        return self

img_path = r"F:\tmp\png/catDog.jpg"
json_path = r'F:\tmp\png\catDog.json'
image = imageio.imread(img_path)
json_info = LabelJson(json_path)

print(image.shape)

ia.imshow(image)

image_polys = np.copy(image)
for point in json_info.loc:
    meerkat = Polygon(point)
    image_polys = meerkat.draw_on_image(image_polys, alpha_face=0.2, size_points=7)

ia.imshow(image_polys)

显示的图片内容:

在这里插入图片描述

2、开始进行第一次数据增强,不改变形状,加入高斯噪声等等操作

#  let's convert our polygons to an PolygonsOnImage instance:
psoi = ia.PolygonsOnImage([Polygon(point) for point in json_info.loc],
                          shape=image.shape)


import imgaug.augmenters as iaa
ia.seed(1)

# add aug
aug = iaa.Sequential([
    iaa.AdditiveGaussianNoise(scale=10),
    iaa.CoarseDropout(0.1, size_px=8),
    iaa.AddToHueAndSaturation((-50, 50))
])

image_aug, psoi_aug = aug(image=image, polygons=psoi)
ia.imshow(psoi_aug.draw_on_image(image_aug, alpha_face=0.2, size_points=7))

下面就是增强后的结果:

在这里插入图片描述

3、接下来进行第二次的增强,这次加入形状和位置调整。

# add aug 2
aug = iaa.Sequential([
    iaa.Affine(translate_percent={"x": 0.2, "y": 0.1}),
    iaa.Fliplr(1.0)
])

image_aug, psoi_aug = aug(image=image, polygons=psoi)
ia.imshow(psoi_aug.draw_on_image(image_aug, alpha_face=0.2, size_points=7))

展示如下所示:

在这里插入图片描述

4、增强后的坐标,转化为labelme可以读取的json形式保存,再打开查看,这也是大多数我们需要做的目的。如下操作:

import base64, os
from PIL import Image
import io
import json
import cv2
def base64encode_img(src_image):
    # src_image = Image.open(image_path)
    src_image = Image.fromarray(cv2.cvtColor(src_image, cv2.COLOR_BGR2RGB))
    output_buffer = io.BytesIO()
    src_image.save(output_buffer, format='JPEG')
    byte_data = output_buffer.getvalue()
    base64_str = base64.b64encode(byte_data).decode('utf-8')
    return base64_str

def savejson(points_list, clses_list, img_tmp, filename, save_dir):
    A = dict()
    listbigoption = []
    for cls, points in zip(clses_list, points_list):
        listobject = dict()

        listobject['points'] = points
        listobject['line_color'] = 'null'
        listobject['label'] = cls

        listobject['fill_color'] = 'null'
        listbigoption.append(listobject)

    A['imageData'] = base64encode_img(img_tmp)
    A['imagePath'] = filename
    A['shapes'] = listbigoption
    A['flags'] = {}
    print(A)

    saveJson_path = os.path.join(save_dir, 'json')
    os.makedirs(saveJson_path, exist_ok=True)
    suffix = os.path.splitext(filename)[-1]
    with open(saveJson_path + "/" + filename.replace(suffix, ".json"), 'w', encoding='utf-8') as f:
        json.dump(A, f, indent=2, ensure_ascii=False)
        
image_aug, psoi_aug = aug(image=image, polygons=psoi)
print(psoi_aug)

points_list = []
for pos in psoi_aug:
    print('pos:', pos)
    points = [list(xy.astype(np.float64)) for xy in pos]
    print('points:', points)
    points_list.append(points)

image_augRGB = cv2.cvtColor(image_aug, cv2.COLOR_BGR2RGB)
savejson(points_list, json_info.cls, image_augRGB, os.path.basename(img_path), r'F:\tmp\png\aug')
# ia.imshow(psoi_aug.draw_on_image(image_aug, alpha_face=0.2, size_points=7))
ia.imshow(image_aug)
cv2.imwrite(os.path.join(r'F:\tmp\png\aug', os.path.basename(img_path)), image_augRGB)

直接保存的是BGR,需要转到RGB进行保存

在这里插入图片描述
增强后,存储到本地,用labelme再次打开查看,如下(暂未做小于0的截断处理):

在这里插入图片描述

加入截断操作,如下:

image_aug, psoi_aug = aug(image=image, polygons=psoi)
print(psoi_aug)
nw, nh, _ = image_aug.shape

points_list = []
for pos in psoi_aug:
    print('pos:', pos)
    points = [list(xy.astype(np.float64)) for xy in pos]
    print('points:', points)
    for p in points:
        if p[0]<0:
            p[0] = 0
        elif p[0]>nh:
            p[0] = nh
        if p[1]<0:
            p[1] = 0
        elif p[1]>nw:
            p[1] = nw
    points_list.append(points)

展示如下:

在这里插入图片描述

数据增强,随机的产生2*4个图像,用于展示:

ia.seed(2)
aug = iaa.Sequential([
    iaa.OneOf([
        iaa.AdditiveGaussianNoise(scale=10),
        iaa.GaussianBlur(sigma=(0.0, 3.0)),
        ]),
    iaa.Affine(rotate=(-20, 20), translate_percent=(-0.2, 0.2), scale=(0.8, 1.2),
               mode=["constant", "edge"], cval=0),  # 放射变换
    iaa.OneOf([
        iaa.Fliplr(0.5),    # 水平翻转
        iaa.Flipud(0.5),    # 上下翻转
        ]),
    iaa.OneOf([
        iaa.GammaContrast((0.5, 2.0)),
        iaa.LinearContrast((0.8, 1.2), per_channel=0.5),
        ]),

    iaa.AddToHueAndSaturation((-20, 20)),   # 通过随机值增加或减少色调和饱和度。
    iaa.Sometimes(0.75, iaa.Snowflakes())
])

images_polys_aug = []
for _ in range(2*4):
    image_aug, psoi_aug = aug(image=image, polygons=psoi)

    image_polys_aug = psoi_aug.draw_on_image(image_aug, alpha_face=0.2, size_points=11)
    images_polys_aug.append(ia.imresize_single_image(image_polys_aug, 0.5))

ia.imshow(ia.draw_grid(images_polys_aug, cols=2))

展示如下:
在这里插入图片描述

二、汇总

最后,做下汇总:

目标:根据采用labelme标注的pylygons标记信息,批量对图像和标注信息同时增强变换
步骤:

  1. 读取图像和json文件信息
  2. 增强操作
  3. 保存到本地
  4. 再次采用labelme,查看生成的结果,是否正常

代码如下:

import imageio
import imgaug as ia
import numpy as np
from imgaug.augmentables.polys import Polygon, PolygonsOnImage
import imgaug.augmenters as iaa

class LabelJson(object):
    def __init__(self, abs_path=None) -> None:
        super().__init__()
        self.abs_path = abs_path
        self.read()

    def read(self):
        with open(self.abs_path, 'r', encoding='utf-8') as f:
            lj = json.load(f)
        self.wh = [lj.get('imageWidth'), lj.get('imageHeight')]
        shapes = lj.get('shapes')
        self.cls = [i.get('label') for i in shapes]  # '1305' if i.get('label') == '14' else
        points = [i.get('points') for i in shapes]
        points = [np.array(i, dtype=np.int32).reshape((-1, 2)) for i in points]
        self.loc = points
        self.box = [[j[:, 0].min(), j[:, 1].min(), j[:, 0].max(), j[:, 1].max()] for j in points]
        self.img_name = lj.get('imagePath')
        self.is_pos = bool(self.cls)
        return self

import base64, os
from PIL import Image
import io
import json
import cv2
def base64encode_img(src_image):
    # src_image = Image.open(image_path)
    src_image = Image.fromarray(cv2.cvtColor(src_image, cv2.COLOR_BGR2RGB))
    output_buffer = io.BytesIO()
    src_image.save(output_buffer, format='JPEG')
    byte_data = output_buffer.getvalue()
    base64_str = base64.b64encode(byte_data).decode('utf-8')
    return base64_str

def savejson(points_list, clses_list, img_tmp, filename, save_dir):
    A = dict()
    listbigoption = []
    for cls, points in zip(clses_list, points_list):
        listobject = dict()

        listobject['points'] = points
        listobject['line_color'] = 'null'
        listobject['label'] = cls

        listobject['fill_color'] = 'null'
        listbigoption.append(listobject)

    A['imageData'] = base64encode_img(img_tmp)
    A['imagePath'] = filename
    A['shapes'] = listbigoption
    A['flags'] = {}

    suffix = os.path.splitext(filename)[-1]
    with open(save_dir + "/" + filename.replace(suffix, ".json"), 'w', encoding='utf-8') as f:
        json.dump(A, f, indent=2, ensure_ascii=False)


def saveJsonImg_main(image_aug, psoi_aug, cls_list, img_path, num, save_dir):
    nw, nh, _ = image_aug.shape

    points_list = []
    for pos in psoi_aug:
        points = [list(xy.astype(np.float64)) for xy in pos]
        for p in points:
            if p[0] < 0:
                p[0] = 0
            elif p[0] > nh:
                p[0] = nh
            if p[1] < 0:
                p[1] = 0
            elif p[1] > nw:
                p[1] = nw
        points_list.append(points)

    image_augRGB = cv2.cvtColor(image_aug, cv2.COLOR_BGR2RGB)
    savejson(points_list, cls_list, image_augRGB, str(num)+'_'+os.path.basename(img_path), save_dir)
    # ia.imshow(psoi_aug.draw_on_image(image_aug, alpha_face=0.2, size_points=7))
    cv2.imwrite(os.path.join(save_dir, str(num)+'_'+os.path.basename(img_path)), image_augRGB)


ia.seed(2)
aug = iaa.Sequential([
    iaa.OneOf([
        iaa.SaltAndPepper(0.01),
        iaa.AdditiveGaussianNoise(scale=5),
        iaa.GaussianBlur(sigma=(0.0, 3.0)),
        ]),
    iaa.OneOf([
        iaa.Affine(rotate=(-20, 20), translate_percent=(-0.2, 0.2), scale=(0.8, 1.2),
                   mode=["constant", "edge"], cval=0),  # 放射变换
        iaa.Affine(scale={"x": (0.5, 1.5), "y": (0.5, 1.5)}),
        iaa.Affine(translate_px={"x": (-20, 20), "y": (-20, 20)}),
        iaa.TranslateX(px=(-20, 20)),
        iaa.Rotate((-45, 45))
        ]),
    iaa.OneOf([
        iaa.Fliplr(0.7),    # 水平翻转
        iaa.Flipud(0.7),    # 上下翻转
        ]),
    iaa.OneOf([
        iaa.GammaContrast((0.5, 2.0)),
        iaa.LinearContrast((0.8, 1.2), per_channel=0.5),
        iaa.WithBrightnessChannels(iaa.Add((-50, 50))),     # Augmenter to apply child augmenters to brightness-related image channels.
        iaa.AddToHueAndSaturation((-20, 20)),   # 通过随机值增加或减少色调和饱和度。
        ]),

    iaa.Sometimes(0.75, iaa.Snowflakes())
])

def main():
    img_dir = r"./images"
    json_dir = r'./label'
    save_dir = r'./aug'

    for file in os.listdir(img_dir):
        img_path = os.path.join(img_dir, file)
        json_path = os.path.join(json_dir, file.replace('.jpg', '.json'))

        # read image and get json info
        image = imageio.imread(img_path)
        json_info = LabelJson(json_path)

        #  let's convert our polygons to an PolygonsOnImage instance:
        psoi = ia.PolygonsOnImage([Polygon(point) for point in json_info.loc],
                                  shape=image.shape)

        # one labelme image aug to 50 image
        for num in range(50):
            # aug
            image_aug, psoi_aug = aug(image=image, polygons=psoi)

            # save json and image
            saveJsonImg_main(image_aug, psoi_aug, json_info.cls, img_path, num, save_dir)


if __name__ == '__main__':
    main()

至此结束,感兴趣的可以赶紧去学习下。如果恰好对你也有帮助,点个赞

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【深度学习标注数据处理】imgaug Augment Polygons 对标注图片和 polygon 的数据增强 的相关文章

  • Mac OS 上的诗歌安装失败,显示“should_use_symlinks”

    我正在尝试使用以下命令安装诗歌 curl sSL https install python poetry org python3 但它失败了 但有以下例外 例外 此版本的 python 无法在不使用符号链接的情况下创建 venvs 下面是详
  • Google App Engine queue.yaml 无法在开发服务器中工作

    我无法让 dev appserver py 识别我使用queue yaml 创建的自定义队列 他们没有出现在http localhost 8000 taskqueue http localhost 8000 taskqueue 当我尝试向其
  • 补丁 - 为什么相对补丁目标名称不起作用?

    我已经从模块导入了一个类 但是当我尝试修补类名而不使用模块作为前缀时 出现类型错误 TypeError Need a valid target to patch You supplied MyClass 例如 以下代码给出了上述错误 imp
  • Python - 来自 .进口

    我第一次尝试图书馆 我注意到解决图书馆内导入问题的最简单方法是使用如下结构 from import x from some module import y 我觉得这件事有些 糟糕 也许只是因为我不记得经常看到它 尽管公平地说我还没有深入研究
  • Pandas:如果单元格包含特定文本则删除行

    pandas 中的这段代码不起作用 如果该列包含提供的任何文本 数字 我希望它删除该行 目前 我只能在单元格与我的代码中传递的确切文本匹配时才能使其工作 因为它只删除显示 Fin 的单元格不是金融或金融 df2 df df Team Fin
  • 在 Django OAuth Toolkit 中安全创建新应用程序

    如何将 IsAdminUser 权限添加到 Django OAuth Toolkit 中的 o applications 视图 REST FRAMEWORK DEFAULT PERMISSION CLASSES rest framework
  • 从扫描文档中提取行表 opencv python

    我想从扫描的表中提取信息并将其存储为 csv 现在我的表提取算法执行以下步骤 应用倾斜校正 应用高斯滤波器进行去噪 使用 Otsu 阈值进行二值化 进行形态学开局 Canny 边缘检测 进行霍夫变换以获得表格行 去除重复行 10像素范围内相
  • Python新式类和__subclasses__函数

    有人可以向我解释为什么这有效 在 Python 2 5 中 class Foo object pass class Bar Foo pass print Foo subclasses 但这不是 class Foo pass class Ba
  • Geodjango距离查询未检索到正确的结果

    我正在尝试根据地理位置的接近程度来检索一些帖子 正如您在代码中看到的 我正在使用 GeoDjango 并且代码在视图中执行 问题是距离过滤器似乎被完全忽略了 当我检查查询集上的距离时 我得到了预期距离 1m 和 18km 但 18km 的帖
  • 用 python 编写的数学语法检查器

    我需要的只是使用 python 检查字符串是否是有效的数学表达式 为了简单起见 假设我只需要 运算符 也作为一元 带有数字和嵌套括号 为了完整性 我还添加了简单的变量名称 所以我可以这样测试 test 3 2 1 valid test 3
  • 使用 Pandas 计算 delta 列

    我有一个数据框 如下所示 Name Variable Field A 2 3 412 A 2 9 861 A 3 5 1703 B 3 5 1731 A 4 0 2609 B 4 0 2539 A 4 6 2821 B 4 6 2779 A
  • Jython 和 SAX 解析器:允许的实体不超过 64000 个?

    我做了一个简单的测试xml saxJython 中的解析器在处理大型 XML 文件 800 MB 时遇到以下错误 Traceback most recent call last File src project xmltools py li
  • 使用“默认”环境变量启动新的子进程

    我正在编写一个构建脚本来解析依赖的共享库 及其共享库等 这些共享库在正常情况下是不存在的PATH环境变量 为了使构建过程正常工作 让编译器找到这些库 PATH已更改为包含这些库的目录 构建过程是这样的 加载器脚本 更改 PATH gt 基于
  • 返回表示每组内最大值的索引的一系列数字位置

    考虑一下这个系列 np random seed 3 1415 s pd Series np random rand 100 pd MultiIndex from product list ABDCE list abcde One Two T
  • 混淆矩阵不支持多标签指示符

    multilabel indicator is not supported是我在尝试运行时收到的错误消息 confusion matrix y test predictions y test is a DataFrame其形状为 Horse
  • Django 与谷歌图表

    我试图让谷歌图表显示在我的页面上 但我不知道如何将值从 django 视图传递到 javascript 以便我可以绘制图表 姜戈代码 array Year Sales Expenses 2004 1000 400 2005 1170 460
  • 多个对象以某种方式相互干扰[原始版本]

    我有一个神经网络 NN 当应用于单个数据集时 它可以完美地工作 但是 如果我想在一组数据上运行神经网络 然后创建一个新的神经网络实例以在不同的数据集 甚至再次同一组数据 上运行 那么新实例将产生完全错误的预测 例如 对 XOR 模式进行训练
  • 查找总和为给定数字的值组合的函数

    这个帖子查找提供的 Sum 值的组合 https stackoverflow com a 20194023 1561176呈现函数subsets with sum 它在数组中查找总和等于给定值的值的组合 但由于这个帖子已经有6年多了 我发这
  • 如何为不同操作系统/Python 版本编译 Python C/C++ 扩展?

    我注意到一些成熟的Python库已经为大多数架构 Win32 Win amd64 MacOS 和Python版本提供了预编译版本 针对不同环境交叉编译扩展的标准方法是什么 葡萄酒 虚拟机 众包 我们使用虚拟机和Hudson http hud
  • Apache Beam Pipeline 写表后查询表

    我有一个 Apache Beam Dataflow 管道 它将结果写入 BigQuery 表 然后我想查询该表以获取管道的单独部分 但是 我似乎无法弄清楚如何正确设置此管道依赖性 我编写的新表 然后想要查询 与一个单独的表连接以进行某些过滤

随机推荐

  • 3.4 DML

    package com atguigu import org apache hadoop hbase Cell import org apache hadoop hbase CellUtil import org apache hadoop
  • 【python】python获取两个list交集

    获取两个list 的交集 方法一 a 2 3 4 5 b 2 5 8 tmp val for val in a if val in b print tmp 2 5 方法二 比方法一快 print list set a intersectio
  • js实现WebSocket 连接

    一 WebSocket 简单介绍 1 HTTP和WebSocket的区别 http 通信只能由客户端发起 WebSocket 服务器可以主动向客户端推送信息 客户端也可以主动向服务器发送信息 是真正的双向平等对话 属于服务器推送技术的一种
  • 崩坏3渠道服扫码登录桌面版的方法教程

    文章目录 一 渠道服分类 二 扫码登录方法 1 官服或手机有相应渠道服版本 2 B服 vivo oppo UC 小米 3 应用宝 QQ 微信 华为 魅族 三 注意事项及问题解决方法 一 渠道服分类 崩坏3rd 渠道服扫码登录桌面版方法 崩坏
  • 算法:多个无序数组合并排序

    思路1 先单独排序 再合并 注意 sorted函数是又返回值的 不改变原来list 注意 若是多个数组 则可以对其中所有第一个数进行再排序 def sort1 list1 list2 list1 sorted list1 list2 sor
  • 深度网络架构的设计技巧(三)之ConvNeXt:打破Transformer垄断的纯CNN架构

    单位 FAIR DenseNet共同一作 曾获CVPR2017 best paper UC伯克利 ArXiv https arxiv org abs 2201 03545 Github https github com facebookre
  • vue3.0 toRef与toRefs

    toRef与toRefs toRef 代码示例 toRef toRefs toRef 作用 创建一个ref对象 其value值指向另一个对象中的某个属性 语法 const name toRef person name 应用 要将响应式中的某
  • git 使用经验

    常用命令 git stash 暂存当前已修改的文件 git stash pop 释放暂存的文件 git status 查看当前状态 git checkout master 切换到主分支 提交文件相关 git add 增加文件 git rm
  • lammps案例:液体平衡态rdf计算模拟练习

    分享一个2维液态平衡模拟案例代码 随机生成400 0 8个原子并进行温度初始化 原子在LJ力场作用下运动到一定位置后达到平衡 并输出rdf数据 代码已经注释 以供参考 当原子数量超过400 0 9时 体系接近固态 可自行更改参数并结合rdf
  • scrapy_redis配置redis集群

    单节点的redis太容易挂了 总是出现意外情况 借助scrapy redis sentinel库实现scrapy redis对redis集群的使用 按照官方库的说明去修改后启动项目会报错 报错的原因其实是作者的源码包中一个叫queue py
  • 修改Fedora 25与Windows 10的默认启动顺序

    首先贴出Fedora25下 boot grub2 grub cfg的内容 DO NOT EDIT THIS FILE It is automatically generated by grub2 mkconfig using templat
  • 看完这篇 教你玩转渗透测试靶机vulnhub——DC6

    Vulnhub靶机DC6渗透测试详解 Vulnhub靶机介绍 Vulnhub靶机下载 Vulnhub靶机安装 Vulnhub靶机漏洞详解 信息收集 暴力破解 漏洞发现 漏洞利用 nmap脚本提权 获取flag Vulnhub靶机渗透总结 V
  • Unity显示被遮挡的模型

    具体显示为这个效果 同事在网上找了一个受光的材质 Shader Custom RoleShader Properties Color Color Color 1 1 1 1 MainTex Albedo RGB 2D white Gloss
  • 一文彻底搞懂 MYSQL分库分表方案

    MYSQL分库分表方案 垂直分表 把一部分表字段放入一张表 另一部分放入其他的表 按照表字段的使用频次分门别类的划分 例如 在商品列表查询时 列表中只是展示部分字段 同时这个列表查询比详情信息查询更加高频 并不需要把所有字段都展示 我们可以
  • 可信执行环境(TEE):深入探讨安全计算的未来

    摘要 本文将详细介绍可信执行环境 TEE 的概念 原理和功能 我们将讨论TEE的应用场景 以及如何使用TEE来保护敏感数据和代码的安全 此外 我们还将探讨TEE的挑战和未来发展 1 引言 随着计算设备的普及和云计算技术的快速发展 如何保护数
  • python b 'string'

    str literals a sequence of Unicode characters UTF 16 or UTF 32 depending on how Python was compiled bytes b literals a s
  • 软件测试之自动化测试

    目录 1 什么是自动化测试 2 selenium java环境搭建 3 熟悉selenium的API 定位元素 添加等待 打印信息 浏览器的相关操作 键盘组合键用法 鼠标事件 特殊场景 定位一组元素 多层框架定位 下拉框处理 弹窗处理 上传
  • MATLAB算法实战应用案例精讲-【深度学习】归一化

    目录 归一化基础知识点 1 什么是归一化 2 为什么要归一化
  • Linux中部署软件时提示空间不足的应急方案

    1 df h 查看剩余空间 2 我们看到 home 下面的空间有很多 注 如果 home 下的控件时充足 且可以分配出去多余的空间 可以继续往下看 如自己 不够用或不够往外分配 可以外接新硬盘 3 在根号下执行 cp r home home
  • 【深度学习标注数据处理】imgaug Augment Polygons 对标注图片和 polygon 的数据增强

    对于本地化进行图像的增强 大家都是非常好操作的 但是 对于标注信息一起增强 还是稍微有一些难度的 麻烦很多 我是遇到一个数据集非常少的任务 只有40张图 就直接标记了去训练 发现几乎不拟合 当然这里使用的是yolo v8 而不是UNet 于