使用albumentations对coco进行数据增强

news2024/11/15 4:03:24

数据增强的必要性

目前几乎所有描述最先进的图像识别模型的论文都使用了基本的增强技术

深度神经网络需要大量的训练数据来获得良好的结果,并防止过度拟合,然而要获得足够的训练样本往往非常困难,多种原因可能使得收集足够的数据非常困难,甚至不可能。
为了制作一个训练数据集,你需要获得图像,然后给它们贴上标签。例如,如果你有一个图像分类任务,你需要分配正确的类标签;对于一个物体检测任务,你需要在物体周围画出边界框;对于一个语义分割任务,你需要为每个输入的图像像素分配一个正确的类别。这个过程需要手工劳动,而且有时给训练数据贴标签的成本可能很高。例如,为了正确标记医学图像,你需要昂贵的领域专家。
有时甚至收集训练图像也很困难,对医疗数据的处理有很多法律限制,获得这些数据需要很多努力。有时获得训练图像是比较可行的,但会花费很多钱。例如,为了获得卫星图像,你需要向卫星运营商支付费用来拍摄这些照片。为了获得用于道路场景识别的图像,你需要一个操作员,他将驾驶一辆汽车并收集所需的数据。
图像增强是一个从现有图像中创造新的训练样本的过程,为了制造一个新的样本,你稍微改变一下原始图像,例如可以让新的图像更亮一点、可以从原始图像上切下一块或者可以通过翻转原始图像来制作新的图像等等。
与只有少数最流行的转换技术的基础集相比,多样化的图像增强集提高了神经网络的性能。扩增有助于对抗过度拟合,提高计算机视觉任务(如分类、分割和物体检测)的深度神经网络的性能。最重要的是,像Albumentations这样的图像增强库使我们能够以最小的努力将图像增强添加到任何计算机视觉管道中。


albumentations的优势

目前有两种类型的图像增强:像素级增强和空间级增强。

虽然像opencv和Pillow也可以实现图像数据的增强,但是有些任务不仅需要对图像进行变换,同时标签也对应需要有所调整,例如对于分割任务,你需要对输入图像和输出掩码进行一些转换另外你还必须在图像转换和掩码转换中使用相同的参数。
对于像素级的增强,你只需要改变输入图像。对于空间级别的增强,你不仅需要对图像,而且还需要对边界框坐标应用同样的变换。在应用空间级增强后,你需要更新边界框的坐标,以代表增强后的图像上物体的正确位置。像素级增强改变了原始图像的像素值,但它们并不改变输出掩码,如改变图像的RGB调色板的亮度或对比度,就是像素级增强。相反空间级的增强则同时改变了图像和遮罩,当你应用图像变换时,如翻转、旋转或裁剪输入图像的一部分,你也需要对输出标签应用同样的变换以保持其正确性。


目前Albumentations是一个非常强大且主流的数据增强库

Albumentations提供一个单一的界面来处理不同的计算机视觉任务,如分类、语义分割、实例分割、物体检测、姿势估计等。目前该库在工业、深度学习研究、机器学习竞赛和开源项目中被广泛使用。

pip install albumentations

Albumentations的优势:

  1. 高性能:
    Albumentations为最大的速度和性能进行了优化。在引擎盖下,该库使用来自OpenCV和NumPy的高度优化函数进行数据处理。我们有一个定期更新的基准,比较流行的图像增强库对最常见的图像变换的速度。Albumentations在大多数情况下表现出最好的性能。

  2. 支持多样化的增强功能
    Albumentations支持超过60种不同的图像增强方式。

  3. 可扩展性
    Albumentations允许轻松添加新的增强器,并通过单一接口与内置变换器一起在计算机视觉管道中使用它们。

  4. 严格的测试
    扩增管道中的错误可能会悄悄地破坏输入数据。它们很容易被忽视,但用不正确的数据训练的模型的性能会下降,Albumentations有一个广泛的测试套件,有助于在开发期间发现错误。


Albumentations对coco进行数据增强

本文主要是以coco数据集为例,介绍使用Albumentations目标检测任务的数据增强方法

目标检测任务是指利用计算机技术及算法来实现对目标进行分类和定位的计算机视觉任务,目标检测任务中Bounding boxes是在图像上标记物体的矩形,其有多种格式的Bounding boxes表示形式,包括pascal_voc、albumentations、coco和yolo。

  1. pascal_voc:[x_min, y_min, x_max, y_max]
  2. albumentations:[x_min / width,y_min / height, x_max / width, y_max / height],其实就是在pascal_voc的基础上进行了归一化
  3. coco:[x_min,y_min,bbox_width,bbox_height]
  4. yolo:[x_center,y_center,bbox_width, bbox_height]

使用什么格式并不重要,处理方法是一样的,需要在下面使用到函数中的参数进行调整


读取coco的标注文件

path = './instances_val2014.json' # 这里需要改为个人环境中标注文件的路径
with open(instance_file, 'r') as f:
    data = json.load(f)

读取后的结果是一个字典,包括info、images、licenses、annotations和categories五个键,我们主要关心的是images、annotations和categories这三个字段的内容:

  1. images:这是一个列表类型的结果,列表长度为图像总个数,每个列表数据是一个字典类型的数据,主要包括’file_name’、‘height’、'width’和’id’等8个字段
  2. annotations:也是一个列表类型的结果,列表长度为bbox总个数,每个列表数据是一个字典类型的数据,包括’segmentation’、‘area’、‘iscrowd’、‘image_id’、‘bbox’、'category_id’和’id’这七个字段,其中’segmentation’是用于分割任务的;'bbox’是一个包含四个元素的列表数据[x_min,y_min,bbox_width,bbox_height]
  3. categories:同样是一个列表类型的结果,列表总长度为80,表示该数据集共80个类别,每个列表数据是一个字典类型的数据,包括’supercategory’、'id’和’name’这三个字段

图像增强

transform = A.Compose([
    A.RandomCrop(width=320, height=320),
    A.HorizontalFlip(p=0.5),
    A.RandomBrightnessContrast(p=0.2),
], bbox_params=A.BboxParams(format='coco', min_area=500, min_visibility=0.1))

首先定义一个数据增强pipeline,这里以随机裁剪、水平翻转和随机亮度对比度变化为例,A.RandomCrop接收两个参数,高度和宽度,A.RandomCrop(width=320, height=320)意味着A.RandomCrop将接受一个输入图像,从中提取一个256×256像素的随机patch,然后将结果传递给管道中的下一个增强器。
接着是进行水平翻转,A.HorizontalFlip有一个名为p的参数,p是一个特殊的参数,几乎所有的增强都支持,它控制应用增强的概率,p=0.5意味着在50%的概率下会进行水平翻转图像,而在50%的概率下,不会翻转输入图像。
接下来是A.RandomBrighntessContrast,它也有一个参数p,p=0.2意味着以20%的概率改变上一步得到图像的亮度和对比度,而在80%的概率下,图像保持不变。

下图是未进行增强的图像展示
在这里插入图片描述

以上设置对于图像分类任务是通用的,但是为了适用于目标检测任务,需要添加后面的参数,也就是bbox_params,需要将A.BboxParams的一个实例传递给该参数,A.BboxParams指定了用于处理bounding boxes的设置。其中 format设置了bounding boxes坐标的格式,可以设置为pascal_voc、albumentations、coco 或者 yolo,而且这个值是必须的,因为Albumentation需要知道bounding boxes的坐标源格式,以便正确地进行增强。

min_area 和 min_visibility 参数控制 Albumentations 在增强后bounding boxes的大小发生变化时应该如何处理,min_area是一个以像素为单位的值,如果一个bbox的面积在增强后变得小于min_area,Albumentations将放弃该box,返回的bounding boxes列表将不包含该box。min_visibility是一个介于0和1之间的值,如果增强后的bbox面积与增强前的bbox面积之比小于min_visibility,Albumentations将放弃该box,也就是如果增强过程切掉了一个bbox的绝大部分,那么这个盒子就不会出现在增强后bounding boxes的列表中。

在这里插入图片描述

就像这张图,如果min_visibility设置的再大些,那么toilet这个物体将不会被标记

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/32714.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机毕业设计】27.仓库管理系统源码

一、系统截图(需要演示视频可以私聊) 摘 要 网络的广泛应用给生活带来了十分的便利。所以把仓库管理与现在网络相结合,利用JSP技术建设仓库管理系统,实现仓库管理系统的信息化。则对于进一步提高公司的发展,丰富仓库管…

户外运动耳机推荐、十大户外运动耳机品牌推荐排名清单

最近南方的天气有点秋高气爽,这样的天气要说最适合进行什么运动,那户外徒步肯定是最佳选择,在这样适宜的天气下去拥抱大自然,体验户外山野环境的美好绝对是个很棒的过程!但是一个人的长时间徒步多少还是会少了些味道&a…

408 | 大纲知识点考点冲刺 复习整理 ——【计网】第三章 数据链路层

自用冲刺笔记整理。 部分图片来自王道。 加油ヾ(◍∇◍)ノ゙ (一)数据链路层的功能 结点: 主机、 路由器。帧 : 链路层的协议数据单元, 封装网络层数据报。其主要作用是加强物理层传输原始比特流的功能,将物理层提供的可能出错的物理连接改造成为逻辑上无差错的数据链路,…

11.24Spring学习第四天

整合Mybatis(重点) 步骤 1.引入依赖 <!--引入相关依赖--><!-- spring jdbc --><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></…

在字节跳动做了5年软件测试,12月无情被辞,想给划水的兄弟提个醒...

前言 先简单交代一下背景吧&#xff0c;某不知名 985 的本硕&#xff0c;17 年毕业加入字节&#xff0c;以“人员优化”的名义无情被裁员&#xff0c;之后跳槽到了有赞&#xff0c;一直从事软件测试的工作。之前没有实习经历&#xff0c;算是5年的工作经验吧。 这5年之间完成…

如何在数据库只保存oss上的文件名, 当查询数据时根据字段的文件名, 获取oss的公网访问地址,并对字段内容重写

如何在数据库只保存oss上的文件名, 当查询数据时根据字段的文件名, 获取oss的公网访问地址,并对字段内容重写. 有这样一个需求, 图片上传到oss 上, 返回文件名和公网访问地址, 但是要求数据库中只存储文件名称. 有两个目的: 数据库只存储文件名称, 方便后期oss 上数据迁移到其他…

面试官:在 Java 中 new 一个对象的流程是怎样的?彻底被问懵了。。

对象怎么创建&#xff0c;这个太熟悉了&#xff0c;new一下(其实还有很多途径&#xff0c;比如反射、反序列化、clone等&#xff0c;这里拿最简单的new来讲)&#xff1a; Dog dog new Dog();我们总是习惯于固定语句的执行&#xff0c;却对于背后的实现过程缺乏认知&#xff0…

[附源码]java毕业设计医院门诊信息管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【多线程 (二)】线程安全问题、同步代码块、同步方法、Lock锁、死锁

文章目录线程安全问题前言2.1多线程模拟卖票出现的问题2.2卖票案例中出现的问题分析2.3同步代码块解决数据安全问题2.4同步方法解决数据安全问题2.5Lock锁2.6死锁总结线程安全问题 前言 之前我们讲了多线程的基础知识&#xff0c;但是在我们解决实际问题中会遇到一些错误&…

接口自动化测试实战之智能场景如何攻破

智能场景的意思就是怎么样才能让接口自动化智能化&#xff0c;让使用接口框架的人越来越没有要求&#xff0c;大街上随便拉一个人来&#xff0c;一分钟了解框架的使用&#xff0c;就能完美地去完成接口自动化测试。 1.找出公司要求我们测试的接口的共同点 假设有10个接口&…

【附源码】计算机毕业设计JAVA移动电商网站

【附源码】计算机毕业设计JAVA移动电商网站 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JAVA mybati…

(一)进程与线程

黑马程序员深入学习Java并发编程&#xff0c;JUC并发编程全套教程_哔哩哔哩_bilibili 一、进程与线程&#xff08;P5&#xff09; 1. 进程 &#xff08;1&#xff09;程序由指令和数据组成&#xff0c;但这些指令要运行&#xff0c;数据要读写&#xff0c;就必须将指令加载至…

查阅标准文档以及effective c++作者文笔 真正搞懂万能引用和引用折叠以及完美转发

在解释任何东西以前 我都必须要强调 我们为什么需要这个东西 如果一个东西我们都是不需要的 那么我们解释他干嘛? 假定你彻底了解了一个东西 但是你并不知道你为什么需要他 他能解决什么问题 那你仅仅就只是背了一段理论性的东西 对于你本人的成长毫无用处 这里我们一次性讲懂…

sqli-labs/Less-58

这一关只有五次机会了 哎怎么办啊 那就只能找出每轮的共同点 这一关肯定不能一轮就完成所有的操作 至少得分个两轮进行操作才可以 前一轮进行注入类型的获取 后一轮进行各种爆破操作 分配好了 首先去判断一下注入类型是否属于数字型注入 输入如下 id1 and 12 回显如下 不属于…

Web大学生网页作业成品 基于HTML+CSS+JavaScript---个人介绍5页 带视频 带报告

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | ‍个人博客网站 | ‍个人主页介绍 | 个人简介 | 个人博客设计制作 | 等网站的设计与制作 | 大学生个人HTML网页设计作品 | HTML期末大学生网页设计作业…

大规模 Spring Cloud 微服务无损上下线探索与实践

作者&#xff1a;十眠 “从一次常见的发布说起&#xff0c;在云上某个系统应用发布时&#xff0c;重启阶段会导致较大数量的 OpenAPI、上游业务的请求响应时间明显增加甚至超时失败。随着业务的发展&#xff0c;用户数和调用数越来越多&#xff0c;该系统又一直保持一周发布二…

CAD特殊符号,你不一定会!!!

在CAD软件中&#xff0c;有时候会输入一些特殊的符号。比如在标明高低差的时候会输入“”号&#xff0c;在标明管子或者钢筋的直径为输入直径符号“”&#xff0c;为了标明角度值需要输入符号“”&#xff0c;那么这些符号怎么快速的绘制出来呢&#xff1f;我们一起用CAD梦想画…

专利解析|多维建模结合AI识别商品特征的方法

企业采购数字化转型的背景 国家“十四五”规划纲要提出要推进产业数字化转型&#xff0c;在供给侧结构性改革大背景下&#xff0c;国家出台了《企业数字化采购实施指南》&#xff0c;大大促进了企业采购电商化的发展。企业电商化采购能提高企业的采购效率、加快物流速度、降低…

m基于QPSK调制解调的无线图像传输matlab仿真,包括扩频解扩均衡等模块

目录 1.算法描述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法描述 软件无线电在无线通信领域被称为是自模拟通信过渡到数字通信之后的又一次革命&#xff0c;在军用和民用方面都有着广阔的应用。它是一种新的无线通信技术&#xff0c;基于通用的可编程的…

【JAVA高级】——封装JDBC中的DaoUtils工具类(Object类型方法)

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;JAVA开发者…