【目标检测-复制粘贴数据增强】

复制粘贴数据增强

在目标检测、分类和分割任务中,复制粘贴数据增强(Copy-Paste Data Augmentation)是一种创新的数据增广技术,它通过将训练集中的一部分物体实例复制并粘贴到其他图像的合理位置上,以生成新的训练样本。这种方法能够增加模型对不同场景下物体多样性的识别能力,并且尤其有助于提升小样本类别和边界框定位的准确性。

原理与步骤:

  1. 选择源图像和目标图像:从训练集中随机选择一个或多个包含目标对象的源图像以及一个背景图像作为目标图像。
  2. 提取目标对象:使用实例分割算法(如Mask R-CNN)从源图像中精确地分割出要复制的目标对象,并得到其像素级别的掩码。
  3. 选择粘贴位置:在目标图像上随机选择一个合法的位置来粘贴目标对象。合法位置通常是指不会导致目标与其他对象重叠过多或出现在不合理的物理空间区域的位置。
  4. 融合图像:将目标对象及其对应的像素级掩码应用到目标图像上,根据掩码将目标对象的像素值合并到目标图像上。
  5. 调整标注信息:对于目标检测任务,需要更新粘贴后的目标物体的边界框坐标;对于语义分割任务,则需合并掩码图以反映新添加的目标。
  6. 重复上述过程:为了生成更多样化的训练样本,可以多次执行上述步骤,直到达到所需的增强样本数量。

代码实现
以下是一个简化的示例,展示如何在PyTorch环境下用自定义方式实现该方法

import numpy as np
from PIL import Image, ImageDraw# 加载和预处理图像的方法 load_and_preprocess_image
# 读取和解析标注信息的方法 load_annotationsdef copy_paste_data_augmentation(src_image_path, src_anns, target_image_path, n_copies=1):# 加载源图像和目标图像src_image = load_and_preprocess_image(src_image_path)target_image = load_and_preprocess_image(target_image_path)# 转换为PIL格式便于操作src_image_pil = Image.fromarray(src_image.astype(np.uint8))target_image_pil = Image.fromarray(target_image.astype(np.uint8))# 加载源图像的标注信息src_objects_masks, src_bboxes = load_annotations(src_anns)for _ in range(n_copies):# 随机选择一个源对象obj_index = np.random.randint(0, len(src_objects_masks))obj_mask = src_objects_masks[obj_index]bbox = src_bboxes[obj_index]# 在目标图像上随机选择一个粘贴位置paste_x, paste_y = get_random_valid_position(target_image.shape[:2], bbox)# 将目标对象剪裁出来obj_pil = src_image_pil.crop(bbox_to_tuple(bbox))# 粘贴到目标图像上target_image_pil.paste(obj_pil, (paste_x, paste_y), mask=obj_mask)# 更新目标图像上的标注信息(这里假设已经有了update_annotations函数)updated_anns = update_annotations(target_anns, obj_bbox=paste_bbox(paste_x, paste_y, bbox))# 返回增强后的图像和对应的标注信息return np.array(target_image_pil), updated_anns# 辅助函数,例如获取合法的粘贴位置、转换边界框等
def get_random_valid_position(image_size, bbox):# 根据实际情况实现,确保目标不会超出图像范围或者和其他物体严重重叠passdef bbox_to_tuple(bbox):# 将边界框表示转换为PIL所需的(x, y, width, height)元组形式passdef paste_bbox(paste_x, paste_y, bbox):# 计算粘贴后的新边界框坐标passdef update_annotations(original_anns, obj_bbox):# 更新原始标注信息以反映新增加的目标物体pass

目标分割

实例分割框架是基于Mask R-CNN,使用detectron2(Facebook AI Research开发的开源库,基于PyTorch)实现的简化示例,它包含了如何加载预训练的Mask R-CNN模型并进行实例分割以获取目标物体掩码:

# 安装detectron2库
!pip install detectron2 -qqimport cv2
import numpy as np
from detectron2 import model_zoo
from detectron2.engine import DefaultPredictor
from detectron2.config import get_cfgdef load_and_segment_object(model_path, image_path):# 加载配置文件,并设置预训练模型路径cfg = get_cfg()cfg.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"))cfg.MODEL.WEIGHTS = model_pathcfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.5  # 设置检测阈值predictor = DefaultPredictor(cfg)# 加载并预处理图像image = cv2.imread(image_path)inputs = {"image": cv2.cvtColor(image, cv2.COLOR_BGR2RGB)}# 进行预测,得到输出结果outputs = predictor(inputs)# 提取实例分割的结果instances = outputs["instances"].to("cpu")# 获取每个实例的mask和边界框masks = instances.pred_masks.numpy()bboxes = instances.pred_boxes.tensor.numpy()# 返回第一个目标物体的maskif len(masks) > 0:obj_mask = masks[0]return obj_mask, bboxes[0]else:return None, None# 使用模型路径和图像路径
model_path = "path/to/pretrained/model.pth"
image_path = "path/to/source/image.jpg"obj_mask, bbox = load_and_segment_object(model_path, image_path)if obj_mask is not None:# 将mask转换为二值图像便于后续操作obj_mask_binary = (obj_mask > 0).astype(np.uint8) * 255# 现在obj_mask_binary就是目标物体的二值掩码图像

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

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

相关文章

Linux:网络的初步认知

文章目录 网络的认知如何理解协议网络分层OSI模型TCP/IP五层(或四层)模型网络传输的基本流程协议的参与局域网通信原理 本篇将会引入到网络的话题 网络的认知 第一个问题是,网卡是文件吗?答案是显然的,在Linux下一切皆文件,基于…

29-1 webshell 管理上

一、什么是webshell? WebShell是一种以asp、aspx、php、jsp或者cgi等网页文件形式存在的命令执行环境,也可称为一种网页后门。在发现Web站点漏洞后,攻击者通常会利用这些漏洞上传WebShell程序,从而实现对目标站点的控制。"Web"指的是万维网,而"Shell"…

Trait与生命周期

原文链接:(*∇`*) 咦,又好了~ Rust – xiaocr_bloghttp://www.xiaocr.fun/index.php/2024/03/18/trait%E4%B8%8E%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F/ 目录 Trait 定义trait 默认实现 trait作为参数 Trait Bound语法 通过指定多个 trait bound …

opengl日记12-opengl坐标系统

文章目录 环境代码CMakeLists.txtvertexShaderSource.vsmain.cpp 总结 环境 系统&#xff1a;ubuntu20.04opengl版本&#xff1a;4.6glfw版本&#xff1a;3.3glad版本&#xff1a;4.6cmake版本&#xff1a;3.16.3gcc版本&#xff1a;10.3.0 在<opengl学习日记11-opengl的t…

2024年旅游卡代理好做嘛?浅析旅游卡加盟项目的发展前景

旅游卡代理作为一种新型的旅游消费方式&#xff0c;近年来备受瞩目。其中&#xff0c;千益畅行共享旅游卡作为旅游卡代理市场的一员&#xff0c;其便捷性和实用性得到了广大消费者的认可。那么&#xff0c;旅游卡代理究竟好做吗&#xff1f;千益畅行共享旅游卡的发展前景又如何…

【Caddy】 Ubuntu 下卸载 Caddy

要在 Ubuntu 下卸载 Caddy&#xff0c;你可以按照以下步骤进行&#xff1a; 步骤一&#xff1a;停止 Caddy 服务 首先&#xff0c;停止正在运行的 Caddy 服务&#xff1a; sudo systemctl stop caddy步骤二&#xff1a;卸载 Caddy 软件包 执行以下命令卸载 Caddy 软件包&am…

【算法】差分、前缀和(重新排序)

给定一个数组 A和一些查询 Li,Ri&#xff0c;求数组中第 Li 至第 Ri个元素之和。 小蓝觉得这个问题很无聊&#xff0c;于是他想重新排列一下数组&#xff0c;使得最终每个查询结果的和尽可能地大。 小蓝想知道相比原数组&#xff0c;所有查询结果的总和最多可以增加多少? 输…

Java 什么时候类会被加载?

Java 什么时候类会被加载&#xff1f; 题目 Java 什么时候类会被加载&#xff1f; 推荐解析 1&#xff09;创建类的实例&#xff0c;也就是 new 一个对象 public class Test {public static void main(String[] args) {MyClass obj new MyClass(); // 通过new关键字实例化…

多语言LLM的状态:超越英语

多语言大语言模型的发展现状&#xff1a;超越英语 引言 据微软研究院的数据显示&#xff0c;世界上大约88%的语言&#xff0c;即12亿人的母语&#xff0c;缺乏对大型语言模型&#xff08;LLM&#xff09;的访问。这是因为大多数LLM都是以英语为中心的&#xff0c;即它们大多是…

Java:接口

目录 1.接口的概念2.接口的语法规则3.接口使用4.接口的特性5.实现多个接口6.接口中的继承7.抽象类和接口的区别 1.接口的概念 在现实生活中&#xff0c;接口的例子比比皆是&#xff0c;比如&#xff1a;笔记本上的USB口&#xff0c;电源插座等。 电脑的USB口上&#xff0c;可以…

pycorrector检测OCR错字实践

参考&#xff1a;https://github.com/shibing624/pycorrector/tree/master/examples/macbert stopwords.txt 添加专业停用词&#xff0c;避免错误 设置自定义词典&#xff0c;避免将正确的词错误检测成错误的词 from pycorrector import Corrector m Corrector() m.set_cus…

Windows系统部署GoLand结合内网穿透实现SSH远程Linux服务器开发调试

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-HIOuHATnug3qMHzx {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

系统学习Python——装饰器:“私有“和“公有“属性案例-[为Python3.X重定义运算符重载方法的途径:内联定义]

分类目录&#xff1a;《系统学习Python》总目录 正如前面的文章所提到的&#xff0c;Python3.X中最直接的解决方案是&#xff1a;在像装饰器这样的基于委托的类中&#xff0c;重新定义可能在内嵌对象中出现的运算符重载名称。这种方法并不理想&#xff0c;因为它产生了一些代码…

把软件加入开机自启动

注意这个方法最佳效果是适用于打开软件后,关闭窗口不会停止服务 例如 nginx 1.把nginx的快捷方式放到如图所示的文件夹下 C:\Users\KIA_27\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 注意KIA_27应改为你自己的用户名

一维前缀和一维差分(下篇讲解二维前缀和二维差分)(超详细,python版,其他语言也很轻松能看懂)

本篇博客讲解一维前缀和&#xff0c;一维差分&#xff0c;还会给出一维差分的模板题&#xff0c;下篇博客讲解 二维前缀和&二维差分。 一维前缀和&#xff1a; 接触过算法的小伙伴应该都了解前缀和&#xff0c;前缀和在算法中应用很广&#xff0c;不了解也没有关系&#…

24计算机考研调剂 | (研究所)北京微电子技术研究所

北京微电子技术研究所2024年考研调剂信息 调剂信息 一、招生专业 二、调剂对象 统考科目为思想政治理论、英语&#xff08;一&#xff09;、数学&#xff08;一&#xff09;&#xff1b;本科为电子科学与技术、微电子学、集成电路设计、电子信息工程、通信工程、计算机科学与…

Java Day13 多线程

多线程 1、 方式一 Thread2、实现Runnable接口3、实现 Callable接口4、与线程有关的操作方法5、线程安全问题5.1 取钱案例5.2 线程同步5.2.1 同步代码块5.2.2 同步方法5.2.3 Lock锁 6、线程池6.2 创建线程池6.2.1 使用ExecutorService创建新任务策略6.2.2 使用Executors工具类创…

3.21小题总结

第一题&#xff1a;生日蛋糕 题解&#xff1a;这题是蛋糕结构是一层一层的&#xff0c;估计很多人很快就能想到是dfs&#xff0c;但是这题的难想的点在于 你每层的状态该怎么去确定&#xff0c;你怎么来确定每层的半径和高度是多少&#xff0c;一开始我也不知很理解&#xff0…

82.删除排序链表中的重复元素II

给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,3,4,4,5] 输出&#xff1a;[1,2,5]示例 2&#xff1a; 输入&#xff1a;head [1,1,1,2…

贝尔曼方程【Bellman Equation】

强化学习笔记 主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程&#xff0c;个人觉得赵老师的课件深入浅出&#xff0c;很适合入门. 第一章 强化学习基本概念 第二章 贝尔曼方程 文章目录 强化学习笔记一、状态值函数贝尔曼方程二、贝尔曼方程的向量形式三、动作值…