mosaic数据增强

目标检测: 一文读懂 Mosaic 数据增强 前言 在Yolo-V4、Yolo-V5中,都有一个很重要的技巧,就是Mosaic数据增强,这种数据增强方式简单来说就是把4张图片,通过随机缩放、随机裁减、随机排布的方式进行拼接。Mosaic有如下优点: (1)丰富数据集:随机使用4张图片,随机缩放,再随机分布进行拼接,大大丰富了检测数据集,特别是随机缩放增加了很多小目标,让网络的鲁棒性更好; (2)减少GPU显存:直接计算4张图片的数据,使得Mini-batch大小并不需要很大就可以达到比较好的效果。 图1 mosaic 效果 mosaic p 阅读详情

mosaic数据增强

Mosaic数据增强

Mosaic数据增强方法是YOLOV4论文中提出来的,主要思想是将四张图片进行随机裁剪,再拼接到一张图上作为训练数据。这样做的好处是丰富了图片的背景,并且四张图片拼接在一起变相地提高了batch_size,在进行batch normalization的时候也会计算四张图片,所以对本身batch_size不是很依赖,单块GPU就可以训练YOLOV4。
以下是我根据pytorch YOLOV4的代码对Mosaic数据增强进行的整理。

在这里插入图片描述

图1

部分代码展示:

oh, ow, oc = img.shape    # img为读取的图片数据      
# self.cfg.jitter为cfg文件中的参数,默认给的是0.2                                              
dh, dw, dc = np.array(np.array([oh, ow, oc]) * self.cfg.jitter, dtype=np.int)  
# 首先生成一些随机偏移的坐标,分别代表左右上下                                    
pleft = random.randint(-dw, dw)   
pright = random.randint(-dw, dw)  
ptop = random.randint(-dh, dh)    
pbot = random.randint(-dh, dh) 
# 裁剪部分的长和宽
swidth = ow - pleft - pright
sheight = oh - ptop - pbot     
1234567891011

整个Mosaic过程如图一所示,图一展示的是pleft,pright,ptop,pbot都大于0时的情况,首先在原图上找到以(pleft,pright)为左上角,swidth,sheight为宽和长的矩形,然后取这个矩形和原图的交集(也就是深绿色的部分)。

注意:图1中(2)这里不是直接取的交集出来,而是先创建一个宽为swidth,长为sheight的矩形,再将矩形赋值为原图RGB三个通道的均值,然后再将上面说的交集部分根据计算的坐标放在这个矩形上面,只不过图一是基于pleft,pright,ptop,pbot都大于0时的情况,所以正好放在(0, 0)坐标上。具体可以参考一以下代码。

# new_src_rect也就是上面说的交集的坐标(x1, y1, x2, y2)
 new_src_rect = rect_intersection(src_rect, img_rect)                                                                                                                        
 dst_rect = [max(0, -pleft), max(0, -ptop), max(0, -pleft) + new_src_rect[2] - new_src_rect[0], 
             max(0, -ptop) + new_src_rect[3] - new_src_rect[1]]  
                                            
cropped = np.zeros([sheight, swidth, 3])                                   
cropped[:, :, ] = np.mean(img, axis=(0, 1))                                
# 这里就是将交集部分放在矩形上                                                      
cropped[dst_rect[1]:dst_rect[3], dst_rect[0]:dst_rect[2]] = \              
    img[new_src_rect[1]:new_src_rect[3], new_src_rect[0]:new_src_rect[2]]  
12345678910

然后对图片进行resize,resize为网络输入所需要的分辨率,默认情况下就是608x608大小。然后根据计算的左上坐标,以及随机得到的宽CutX,长Cuty,裁剪一部分区域作为一张新图的左上部分。图1中(4)红框表示裁剪的区域,注意:图1中(4)左上角的(0, 0)坐标是因为pleft,pright大于0,根据计算所得。计算裁剪坐标的过程可参照以下代码。

# 根据网络的输入大小随机计算的cut_x、cut_y,min_offset为预设参数,默认为0.2
# cfg.w,cfg.h为网络的输入大小,默认为608
 cut_x = random.randint(int(self.cfg.w * min_offset), int(self.cfg.w * (1 - min_offset)))
 cut_y = random.randint(int(self.cfg.h * min_offset), int(self.cfg.h * (1 - min_offset)))
# 裁剪坐标的计算过程                                                                                 
left_shift = int(min(cut_x, max(0, (-int(pleft) * self.cfg.w / swidth))))                         
top_shift = int(min(cut_y, max(0, (-int(ptop) * self.cfg.h / sheight))))                          
                                                                                                  
right_shift = int(min((self.cfg.w - cut_x), max(0, (-int(pright) * self.cfg.w / swidth))))        
bot_shift = int(min(self.cfg.h - cut_y, max(0, (-int(pbot) * self.cfg.h / sheight))))               
# 这里的ai参数为图一中的(3), out_img初始化的新图
# 该函数的功能就是图1中(3)到(5)的过程,分别将裁剪的图片粘贴到新图的左上,右上,左下,右下
# 循环4次,每循环一次粘贴一次,每次根据给的参数i粘贴到哪个部分                                       
out_img, out_bbox = blend_truth_mosaic(out_img, ai, truth.copy(), self.cfg.w, self.cfg.h, cut_x,  
                                       cut_y, i, left_shift, right_shift, top_shift, bot_shift)   
123456789101112131415

以下是blend_truth_mosaic函数细节:

def blend_truth_mosaic(out_img, img, bboxes, w, h, cut_x, cut_y, i_mixup,                                        
                       left_shift, right_shift, top_shift, bot_shift):                                           
    left_shift = min(left_shift, w - cut_x)                                                                      
    top_shift = min(top_shift, h - cut_y)                                                                        
    right_shift = min(right_shift, cut_x)                                                                        
    bot_shift = min(bot_shift, cut_y)                                                                            
                                                                                                                 
    if i_mixup == 0:                                                                                             
        bboxes = filter_truth(bboxes, left_shift, top_shift, cut_x, cut_y, 0, 0)                                 
        out_img[:cut_y, :cut_x] = img[top_shift:top_shift + cut_y, left_shift:left_shift + cut_x]                
    if i_mixup == 1:                                                                                             
        bboxes = filter_truth(bboxes, cut_x - right_shift, top_shift, w - cut_x, cut_y, cut_x, 0)                
        out_img[:cut_y, cut_x:] = img[top_shift:top_shift + cut_y, cut_x - right_shift:w - right_shift]          
    if i_mixup == 2:                                                                                             
        bboxes = filter_truth(bboxes, left_shift, cut_y - bot_shift, cut_x, h - cut_y, 0, cut_y)                 
        out_img[cut_y:, :cut_x] = img[cut_y - bot_shift:h - bot_shift, left_shift:left_shift + cut_x]            
    if i_mixup == 3:                                                                                             
        bboxes = filter_truth(bboxes, cut_x - right_shift, cut_y - bot_shift, w - cut_x, h - cut_y, cut_x, cut_y)
        out_img[cut_y:, cut_x:] = img[cut_y - bot_shift:h - bot_shift, cut_x - right_shift:w - right_shift]      
                                                                                                                 
    return out_img, bboxes                                                                                       
123456789101112131415161718192021

最后说明一下对于标签框的处理,图1中可以看到,当进行裁剪的时候,如果裁剪了样本当中的标签框的部分区域,则将其舍弃,保留裁剪之后还完整的标签框。

下图为pleft,pright,ptop,pbot都小于0的裁剪情况:
在这里插入图片描述

图2

由于时间关系,我只画了比较容易画的两种情况图,也只做了粘贴左上角的部分,但其实也都是一个道理。
本文只做了Mosaic的裁剪部分详解,当然个人觉得比较关键的也是这个部分,其实当中还有一些其他增强操作,例如随机翻转,模糊,HSV增强等等,这个暂时还没有做,后续会进行更新。

操作完成之后然后再将原始图片按照 第一张图片摆放在左上,第二张图片摆放在左下,第三张图片摆放在右下,第四张图片摆放在右上四个方向位置摆好。

最后,这是我根据pytorch YOLOV4的代码,自己的理解,如果有错,欢迎指正,谢谢。

深度学习中小知识点系列(三) 解读Mosaic 数据增强 """将四张图片拼接在一张马赛克图像中:param index: 需要获取的图像索引:return:"""labels4 = [] # 拼接图像的label信息# 随机初始化拼接图像的中心点坐标# 从dataset中随机寻找三张图像进行拼接# 遍历四张图像进行拼接# 创建马赛克图像# 计算马赛克图像中的坐标信息(将图像填充到马赛克图像中)# 计算截取的图像区域信息(以xc,yc为第一张图像的右下角坐标填充到马赛克图像中,丢弃越界的区域) 阅读详情

相关推荐

Mosaic数据增强

YOLO-V5 代码中数据增强代码理解 对 u 版 yolo-v5 中的 load_mosaic 代码的理解。 前言 【个人学习笔记记录,如有错误,欢迎指正】 YOLO-V4 论文地址:https://arxiv.org/pdf/2004.10934.pdf YOLO-V5 代码仓库地址:https://github.com/ultralytics/yolov5 一、Mosaic 数据增强是什么? 在 YOLO-V4 论文中提到:Mosaic 数据增强是一种新的混合4幅图像的数据增强方法,该方法参考了

m0_46498587的博客 1万+

【YOLO系列】 YOLOv4之Mosaic数据增强(附代码)

Mosaic数据增强是一种在目标检测任务中常用的技术,特别是在使用YOLO系列算法时。这种数据增强方法通过将四张图片随机组合成一张新的图片,从而增加数据集的多样性,提高模型的泛化能力。将这样一张新的图片传入到神经网络当中去学习,相当于一下子传入四张图片进行学习了。这极大丰富了检测物体的背景,且在标准化BN计算的时候一下子会计算四张图片的数据。

江湖小Jay的博客 6283

YOLOV4-Mosaic数据增强详解

Mosaic数据增强 Mosaic数据增强方法是YOLOV4论文中提出来的,主要思想是将四张图片进行随机裁剪,再拼接到一张图上作为训练数据。这样做的好处是丰富了图片的背景,并且四张图片拼接在一起变相地提高了batch_size,在进行batch normalization的时候也会计算四张图片,所以对本身batch_size不是很依赖,单块GPU就可以训练YOLOV4。 以下是我根据pytorch YOLOV4的代码对Mosaic数据增强进行的整理。 图1 部分代码展示: oh, ow, oc = img

Q1u1NG的博客 1万+

数据增强mosaic实现

mosaic 是yolov4中提出的一个数据增强的方式,通过将4张图片拼接在一起送入训练,有效提升了模型的map

金色旭光的博客 2707

Yolov5-7.0:mosaic数据增强原理解析

通过详解代码与展示图片,带你更好地了解yolov5中的mosaic4以及mosaic9增强的实现机制

Daisy的博客 2974

用opencv实现yolov4中的mosaic数据增强

简单看了一个yolov4的介绍,mosaic数据增强简单说就是四张图片合一,长宽随机变化。理想的实现是结合图片集和标签集,对单张图片标注过之后,四张合一的图片就不用再标注。这里只做一个简单的实现,仅仅把四张图片随机合一,生成mosaic图片集,后面需要对这个生成的图片标注。 c++程序: #include <opencv2/opencv.hpp> #include ...

sinat_41852207的博客 4735

【YOLOv4探讨 之三】mosaic数据增强

最近太忙,久未更新,对不住大家。进入正题,我们聊一聊YOLOv4中使用的mosaic数据增强。关于mosaic数据增强相关文章不少,三个月前这个方面的学习开了个头,那时候各路诸侯都是以TensorFlow框架为主,我这里依然坚持分析研究darknet框架下的数据增强。 mosaic数据增强原理 YOLOv4中在载入图片数据时同步进行mosaic数据增强。 mosaic数据增强基本原理就是在训练集中随机选择若干个(一般是4个)图像,经过裁剪拼接形成新的训练集元素,可以缓解训练集元素少或者增强识别能力,是cut

北溟客的博客 1万+

Mosaic数据增强 mixup CutMix数据增强

Mosaic数据增强 什么是Mosaic数据增强方法 Yolov4的mosaic数据增强参考了CutMix数据增强方式,理论上具有一定的相似性! CutMix数据增强方式利用两张图片进行拼接。 但是mosaic利用了四张图片,根据论文所说其拥有一个巨大的优点是丰富检测物体的背景!且在BN计算的时候一下子会计算四张图片的数据! 就像下图这样: 实现思路 1、每次读取四张图片。 2、分别对四张图片进行翻转、缩放、色域变化等,并且按照四个方向位置摆好。 3、进行图片的组合和框的组合 全部代码 全

jacke121的专栏 1万+

Mosaic数据增强介绍

它通过显著增加图像中目标的密度和多样性、强制模型学习不同尺度和上下文、以及提高小目标检测能力,在目标检测任务(特别是基于 YOLO 的模型)中取得了巨大成功。尽管会生成视觉上不自然的图像并带来一些实现复杂性,但其在提升模型性能、特别是对小目标的鲁棒性方面的优势使其成为现代目标检测训练流程中一个不可或缺的组件。单张合成图像包含的信息量相当于一个小批次 (mini-batch) 的数据,即使物理批大小较小,模型在每次迭代中也能处理更丰富的信息,降低了训练对超大物理批大小的硬件要求。不如在目标检测中普及。

qq_54708219的博客 2187

微信小程序地图开发避坑指南:腾讯地图API从配置到实战(附完整代码)

本文详细解析微信小程序中腾讯地图API的开发实践,从基础配置到高级功能实现,涵盖地图显示、地点搜索、路线规划等核心功能,并提供完整代码示例和常见问题解决方案,帮助开发者高效避坑。特别针对JavaScript SDK和map组件的使用进行了深度优化指导。

weixin_33725722的博客 486

OpenWrt虚拟机磁盘扩容实战:从SquashFS到ext4的完整避坑指南

本文详细介绍了OpenWrt虚拟机磁盘扩容的完整流程,重点对比了SquashFS和ext4文件系统在扩容操作上的关键差异。通过五步安全迁移法和直接分区调整方案,帮助用户有效解决磁盘空间不足问题,同时提供高级技巧和故障排除指南,确保扩容过程顺利无坑。

weixin_29251131的博客 232

Yolov4 mosaic 数据增强

mosaic 数据增强 Yolov4的mosaic 数据增强是参考CutMix数据增强,理论上类似,CutMix的理论可以参考这篇CutMix,但是mosaic利用了四张图片,据论文其优点是丰富检测物体的背景,且在BN计算的时候一下子会计算四张图片的数据,使得mini-batch大小不需要很大,那么一个GPU就可以达到比较好的效果。 实现方法 伪代码: for data, target in ba...

popoffpopoff的博客 2万+

abaqus应力值导出并进行后处理(同一节点多个应力值如何处理?)

Abaqus应力导出: ‘Tools’--- Probe values 在Probe Values里面可以选择需要导出的信息,比如‘Nodes’或者‘Elements’ 如果需要导出多个应力值或者其他信息可以选择‘Components’这个选项。 选择‘Selected’只输出一个正应力S33(对应截图中的) 如果是‘All Direct’,则是输出6个正应力S11, S22, S33, S12, S13, S23 ‘All Principals’输出三个正应力 在输出...

themingyi的博客 5万+

深度学习中的Mosaic数据增强

深度学习中的Mosaic数据增强

网络资源是无限的 6395

Apache-Plc4x-Modbus-Tcp学习记录(一)

Apache-Plc4x-Modbus-Tcp学习记录(一)

weixin_45325423的博客 6988

从BSCAN到BAP:深度解析Tessent MBIST逻辑的协同工作机制与设计考量

本文深入解析了Tessent MBIST逻辑中BSCAN Interface、Logic Group Def、Controller与BAP模块的协同工作机制。文章以一条测试指令的完整路径为例,详细阐述了数据流与控制流如何跨模块、跨时钟域协同工作,并重点探讨了MBIST BAP在协议转换与流量管理中的核心桥梁作用,为芯片内建自测试的集成与调试提供了关键的设计考量和实战技巧。

kappa的博客 483

数据增强之Mosaic (Mixup,Cutout,CutMix)

1、简介和比较 Mosaic数据增强方法是YOLOV4论文中提出来的,主要思想是将四张图片进行随机裁剪,再拼接到一张图上作为训练数据。这样做的好处是丰富了图片的背景,并且四张图片拼接在一起变相地提高了batch_size,在进行batch normalization的时候也会计算四张图片,所以对本身batch_size不是很依赖,单块GPU就可以训练YOLOV4。 https://github.com/Tianxiaomo/pytorch-YOLOv4​github.com/Tianxiaomo/pyt

taoqick的专栏 1万+

DeepSeek研发的精算大模型「精卫」已实现98%精算任务覆盖,中国人寿采用后年节约3.2亿元技术采购成本,形成关键技术替代效应

根据现有资料,精算领域关键技术替代效应的行业标准定义尚未明确具体提及。然而,可以从相关文献中提取一些关键概念和方法来推导出可能的定义。​替代效应的基本定义​:替代效应是指一种商品价格变动引起另一种商品的相对价格变动,从而导致消费者在维持原有效用水平不变的条件下对商品需求量做出的调整。​技术替代效应​:在精算领域,技术替代效应可以理解为新技术或新方法对现有技术或方法的替代,从而影响精算模型、数据处理和决策过程。例如,机器学习在精算中的应用日益增长,改变了精算师的工作方式和模型构建方法。​。

百态·数智思维 | 聚焦大数据、量化与未来AI 1712

Yolov5 数据增强 - Mosaic

Mosaic

qq_35326529的博客 6425

Python FastAPI 面试题及参考答案

FastAPI 的路由机制是其核心功能之一,用于将不同的 URL 路径映射到相应的处理函数。通过定义路由,可以构建出功能丰富的 API。在 FastAPI 中,使用装饰器来定义路由。在这个示例中,是一个装饰器,它将根路径"/"的 GET 请求映射到read_root函数。当客户端发送一个 GET 请求到根路径时,FastAPI 会调用read_root函数并返回结果。

大模型大数据攻城狮的专栏 2248

从 CDS 接口到 ABAP 运行时,深入理解 SAP RAP Custom Entity

CDS Custom Entity 是一种非 SQL、瞬态的 CDS 实体,不依赖 HANA SQL 读取数据,而是通过 ABAP 类实现查询逻辑(如 RFC、OData、BAPI 等)。它在 CDS 层定义数据契约(字段、键、关联、注解),由 @ObjectModel.query.implementedBy 指向实现 IF_RAP_QUERY_PROVIDER~SELECT 的类,真正执行数据获取。适用于无法用 SQL 表达的数据源,如远程系统或 API。其核心是“接口 + 实现”模式,运行时由 RAP

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 171

【YOLOv5】数据增强Mosaic,把Mosaic3变成Mosaic9

Mosaic数据增强,将图片进行随机裁剪,缩放后排列接成一张图片,实现丰富数据集,增加小样本目标,提升网络的训练速度。数据增强代码在utils/dataloaders.py,找到。更改这两个地方,就可以吧Mosaic改为Mosaic9。

weixin_47665864的博客 2169

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

上一篇: anchor自适应锚框计算
下一篇: c++模板声明与定义
黑猫爱小鹿
博客等级 码龄8年 1万+粉丝 205原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值