————————————————
版权声明:本文为CSDN博主「大林兄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_46142822/article/details/123805663

参考

https://blog.csdn.net/weixin_44751294/article/details/124363703

其他数据增强;https://blog.51cto.com/u_11299290/5144799

效果

​(1)扩充了数据集的数量​

​(2)增加了小样本的数量​:把大样本随机放缩成了小样本,因此增加了小样本的数量。

​(3)小样本更小:​由于采用随机放缩,合并后,导致小样本的尺寸更小。

前言

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

图1 mosaic 效果

mosaic python实现
思路:随机选择四张图,取其部分拼入该图,如下图所示,四种颜色代表四张样本图,超出的部分将被舍弃。

图2 mosaic 思路

具体做法如下:

step1:新建mosaic画布,并在mosaic画布上随机生成一个点

im_size = 640
mosaic_border = [-im_size // 2, -im_size // 2]
s_mosaic = im_size * 2mosaic = np.full((s_mosaic, s_mosaic, 3), 114, dtype=np.uint8)
yc, xc = (int(random.uniform(-x, s_mosaic + x)) for x in mosaic_border)

图3 mosaic 画布

step2:围绕随机点 (x_c, y_c) 放置4块拼图

(1)左上位置

画布放置区域: (x1a, y1a, x2a, y2a)

case1:图片不超出画布,画布放置区域为 (x_c - w , y_c - h , x_c, y_c)

case2:图片超出画布,画布放置区域为 (0 , 0 , x_c, y_c)

综合case1和case2,画布区域为:

 x1a, y1a, x2a, y2a = max(x_c - w, 0), max(y_c - h, 0), x_c, y_c

图4 mosaic 左上拼图

图片区域 : (x1b, y1b, x2b, y2b)

case1:图片不超出画布,图片不用裁剪,图片区域为 (0 , 0 , w , h)

case2:图片超出画布,超出部分的图片需要裁剪,区域为 (w - x_c , h - y_c , w , h)

综合case1和case2,图片区域为:

 x1b, y1b, x2b, y2b = w - (x2a - x1a), h - (y2a - y1a), w, h

(2)右上位置

画布放置区域: (x1a, y1a, x2a, y2a)

case1:图片不超出画布,画布区域为 (x_c , y_c - h , x_c + w , y_c)

case2:图片超出画布,画布区域为 (x_c , 0 , s_mosaic , y_c)

综合case1和case2,画布区域为:

 x1a, y1a, x2a, y2a = x_c, max(y_c - h, 0), min(x_c + w, s_mosaic), y_c

图5 mosaic 右上拼图

图片区域 : (x1b, y1b, x2b, y2b)

case1:图片不超出画布,图片不用裁剪,图片区域为 (0 , 0 , w , h)

case2:图片超出画布,图片需要裁剪,图片区域为 (0 , h - (y2a - y1a) , x2a - x1a , h)

综合case1和case2,图片区域为:

 x1b, y1b, x2b, y2b = 0, h - (y2a - y1a), min(w, x2a - x1a), h

同理可实现左下和右下的拼图。

step3:更新bbox坐标
4张图片的bbox (n,4),其中n为4张图片中bbox数量,4代表四个坐标值(xmin,ymin,xmax,ymax) ,加上偏移量得到mosaic bbox坐标:

def xywhn2xyxy(x, padw=0, padh=0):# x: bbox坐标 (xmin,ymin,xmax,ymax)x = np.stack(x)y = x.clone() if isinstance(x, torch.Tensor) else np.copy(x)y[:, 0] = x[:, 0] + padw  # top left xy[:, 1] = x[:, 1] + padh  # top left yy[:, 2] = x[:, 2] + padw  # bottom right xy[:, 3] = x[:, 3] + padh  # bottom right yreturn y

mosaic python 完整实现代码如下:

import cv2
import torch
import random
import os.path
import numpy as np
import matplotlib.pyplot as plt
from camvid import get_bbox, draw_boxdef load_mosaic(im_files, name_color_dict):im_size = 640s_mosaic = im_size * 2mosaic_border = [-im_size // 2, -im_size // 2]labels4, segments4, colors = [], [], []# mosaic center x, yy_c, x_c = (int(random.uniform(-x, s_mosaic + x)) for x in mosaic_border)img4 = np.full((s_mosaic, s_mosaic, 3), 114, dtype=np.uint8)seg4 = np.full((s_mosaic, s_mosaic), 0, dtype=np.uint8)for i, im_file in enumerate(im_files):# Load imageimg = cv2.imread(im_file)seg_file = im_file.replace('images', 'labels')name = os.path.basename(seg_file).split('.')[0]seg_file = os.path.join(os.path.dirname(seg_file), name + '_L.png')seg, boxes, color = get_bbox(seg_file, names, name_color_dict)colors += colorh, w, _ = np.shape(img)# place img in img4if i == 0:  # top leftx1a, y1a, x2a, y2a = max(x_c - w, 0), max(y_c - h, 0), x_c, y_cx1b, y1b, x2b, y2b = w - (x2a - x1a), h - (y2a - y1a), w, h elif i == 1:  # top rightx1a, y1a, x2a, y2a = x_c, max(y_c - h, 0), min(x_c + w, s_mosaic), y_cx1b, y1b, x2b, y2b = 0, h - (y2a - y1a), min(w, x2a - x1a), helif i == 2:  # bottom leftx1a, y1a, x2a, y2a = max(x_c - w, 0), y_c, x_c, min(s_mosaic, y_c + h)x1b, y1b, x2b, y2b = w - (x2a - x1a), 0, w, min(y2a - y1a, h)elif i == 3:  # bottom rightx1a, y1a, x2a, y2a = x_c, y_c, min(x_c + w, s_mosaic), min(s_mosaic, y_c + h)x1b, y1b, x2b, y2b = 0, 0, min(w, x2a - x1a), min(y2a - y1a, h)img4[y1a:y2a, x1a:x2a] = img[y1b:y2b, x1b:x2b]# place seg in seg4seg4[y1a:y2a, x1a:x2a] = seg[y1b:y2b, x1b:x2b]# update bboxpadw = x1a - x1bpadh = y1a - y1bboxes = xywhn2xyxy(boxes, padw=padw, padh=padh)labels4.append(boxes)labels4 = np.concatenate(labels4, 0)for x in labels4[:, 1:]:np.clip(x, 0, s_mosaic, out=x)  # clip coord# draw resultdraw_box(seg4, labels4, colors)return img4, labels4,seg4if __name__ == '__main__':names = ['Pedestrian', 'Car', 'Truck_Bus']im_files = ['camvid/images/0016E5_01440.png','camvid/images/0016E5_06600.png','camvid/images/0006R0_f00930.png','camvid/images/0006R0_f03390.png']load_mosaic(im_files, name_color_dict)```图6 mosaic 数据增强结果
————————————————
版权声明:本文为CSDN博主「大林兄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_46142822/article/details/123805663

马赛克数据增强 mosaic相关推荐

  1. Mosaic(马赛克)数据增强总结

    文章目录 1.推荐链接 2.argparse.ArgumentParser解析 3.用Mosaic制作菜刀数据集 4.关于数据增强比较好的链接 1.推荐链接 1.图片的左右翻转,上下翻转,旋转 参考: ...

  2. 【图像数据增强】Mixup、Cutout、Random Erasing、CutMix、Mosaic等详解

    对于模型而言一般包含四个部分:输入.输出.网络结构.训练相关.如果想要改善模型,就可以从这四个部分入手. ● 输入:数据 --> Data Augmentation ● 输出:Loss相关 ● ...

  3. mosaic数据增强_YoloV4当中的Mosaic数据增强方法(附代码详细讲解)

    上一期中讲解了图像分类和目标检测中的数据增强的区别和联系,这期讲解数据增强的进阶版- yolov4中的Mosaic数据增强方法以及CutMix. 前言 Yolov4的mosaic数据增强参考了CutM ...

  4. 睿智的目标检测28——YoloV4当中的Mosaic数据增强方法

    睿智的目标检测28--YoloV4当中的Mosaic数据增强方法 学习前言 代码下载 什么是Mosaic数据增强方法 实现思路 全部代码 1.数据增强 2.调用代码 学习前言 哈哈哈!我又来数据增强了 ...

  5. 【目标检测】(10) Mosaic 数据增强方法,附Python完整代码

    各位同学好,今天和大家分享一下目标检测算法中常用的图像数据增强方法 Mosaic.先放张图看效果.将四张图片缩放后裁剪拼接在一起,并调整检测框的坐标位置,处理位于图像边缘的检测框.文末有完整代码 1. ...

  6. mosaic数据增强

    mosaic数据增强则利用了四张图片,对四张图片进行拼接,每一张图片都有其对应的框框,将四张图片拼接之后就获得一张新的图片,同时也获得这张图片对应的框框,然后我们将这样一张新的图片传入到神经网络当中去 ...

  7. 几种数据增强:Mixup,Cutout,CutMix 和yolov4中的 Mosaic

    作者:RayChiu_Labloy 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 目录 1.几种数据增强的比较 2.What does model learn with ...

  8. YoloV4当中的Mosaic数据增强方法(附代码讲解)

    上一期中讲解了图像分类和目标检测中的数据增强的区别和联系,这期讲解数据增强的进阶版- yolov4中的Mosaic数据增强方法以及CutMix. 前言 Yolov4的mosaic数据增强参考了CutM ...

  9. cut out数据增强_数据增强:Mixup,Cutout,CutMix | Mosaic

    1.几种数据增强的比较 Mixup:将随机的两张样本按比例混合,分类的结果按比例分配: Cutout:随机的将样本中的部分区域cut掉,并且填充0像素值,分类的结果不变: CutMix:就是将一部分区 ...

最新文章

  1. 杭电1000 A + B Problem
  2. 四川大学锦江学院计算机专业怎么样,四川大学锦江学院怎么样?是一所什么层次的大学?...
  3. docker in all
  4. 我的编码习惯 —— API 接口定义
  5. 云服务器网站不能够上传视频,网站的视频要存到云服务器上吗
  6. string match
  7. php300云,概述 · PHP300Framework2.0 · 看云
  8. FileBeats安装
  9. jquery组件WebUploader文件上传用法详解
  10. c3p0存在严重bug “APPARENT DEADLOCK“的问题
  11. 台安PLC通过手机热点远程在线模拟,远程编程,远程调试
  12. 产品笔试后不会知识点总结
  13. 化工行业ERP管理系统丨外贸软件
  14. IAR(For STM32) 安装,配置,工程创建,下载,调试
  15. 整理 kanban 的 DoR 和 DoD
  16. 【转载】Matlab与C#连接的几种方式比较
  17. JXLS导出Excel表格实战教程
  18. 滤波器原理及其作用计算机网络,什么是滤波器?滤波器原理及其作用是什么?...
  19. 【Unity】漂浮文字
  20. [HoopChina]爱神的通牒

热门文章

  1. 响应式织梦模板婚纱照摄影类网站
  2. PostgreSQL创建一个数据库和常用的命令
  3. 如何用百度统计页面中多个链接的pvuv,并且页面还不需要跳转
  4. webmatrix mysql_WebMatrix教程(一) (关注Microsoft 的最新武器:建立你的第一个WebMatrix网站)...
  5. Tableu地图绘制注意事项
  6. 对3721上网助手的一些疑问建议
  7. 计算机桌面隔几秒闪一下,win7游戏窗口化隔一段时间就会闪一下屏幕怎么办
  8. 自定义组件 QQ对话框
  9. make menuconfig配置方法
  10. 走向人生巅峰?这份自由程序员速成宝典你值得拥有