马赛克数据增强 mosaic
————————————————
版权声明:本文为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相关推荐
- Mosaic(马赛克)数据增强总结
文章目录 1.推荐链接 2.argparse.ArgumentParser解析 3.用Mosaic制作菜刀数据集 4.关于数据增强比较好的链接 1.推荐链接 1.图片的左右翻转,上下翻转,旋转 参考: ...
- 【图像数据增强】Mixup、Cutout、Random Erasing、CutMix、Mosaic等详解
对于模型而言一般包含四个部分:输入.输出.网络结构.训练相关.如果想要改善模型,就可以从这四个部分入手. ● 输入:数据 --> Data Augmentation ● 输出:Loss相关 ● ...
- mosaic数据增强_YoloV4当中的Mosaic数据增强方法(附代码详细讲解)
上一期中讲解了图像分类和目标检测中的数据增强的区别和联系,这期讲解数据增强的进阶版- yolov4中的Mosaic数据增强方法以及CutMix. 前言 Yolov4的mosaic数据增强参考了CutM ...
- 睿智的目标检测28——YoloV4当中的Mosaic数据增强方法
睿智的目标检测28--YoloV4当中的Mosaic数据增强方法 学习前言 代码下载 什么是Mosaic数据增强方法 实现思路 全部代码 1.数据增强 2.调用代码 学习前言 哈哈哈!我又来数据增强了 ...
- 【目标检测】(10) Mosaic 数据增强方法,附Python完整代码
各位同学好,今天和大家分享一下目标检测算法中常用的图像数据增强方法 Mosaic.先放张图看效果.将四张图片缩放后裁剪拼接在一起,并调整检测框的坐标位置,处理位于图像边缘的检测框.文末有完整代码 1. ...
- mosaic数据增强
mosaic数据增强则利用了四张图片,对四张图片进行拼接,每一张图片都有其对应的框框,将四张图片拼接之后就获得一张新的图片,同时也获得这张图片对应的框框,然后我们将这样一张新的图片传入到神经网络当中去 ...
- 几种数据增强:Mixup,Cutout,CutMix 和yolov4中的 Mosaic
作者:RayChiu_Labloy 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 目录 1.几种数据增强的比较 2.What does model learn with ...
- YoloV4当中的Mosaic数据增强方法(附代码讲解)
上一期中讲解了图像分类和目标检测中的数据增强的区别和联系,这期讲解数据增强的进阶版- yolov4中的Mosaic数据增强方法以及CutMix. 前言 Yolov4的mosaic数据增强参考了CutM ...
- cut out数据增强_数据增强:Mixup,Cutout,CutMix | Mosaic
1.几种数据增强的比较 Mixup:将随机的两张样本按比例混合,分类的结果按比例分配: Cutout:随机的将样本中的部分区域cut掉,并且填充0像素值,分类的结果不变: CutMix:就是将一部分区 ...
最新文章
- 杭电1000 A + B Problem
- 四川大学锦江学院计算机专业怎么样,四川大学锦江学院怎么样?是一所什么层次的大学?...
- docker in all
- 我的编码习惯 —— API 接口定义
- 云服务器网站不能够上传视频,网站的视频要存到云服务器上吗
- string match
- php300云,概述 · PHP300Framework2.0 · 看云
- FileBeats安装
- jquery组件WebUploader文件上传用法详解
- c3p0存在严重bug “APPARENT DEADLOCK“的问题
- 台安PLC通过手机热点远程在线模拟,远程编程,远程调试
- 产品笔试后不会知识点总结
- 化工行业ERP管理系统丨外贸软件
- IAR(For STM32) 安装,配置,工程创建,下载,调试
- 整理 kanban 的 DoR 和 DoD
- 【转载】Matlab与C#连接的几种方式比较
- JXLS导出Excel表格实战教程
- 滤波器原理及其作用计算机网络,什么是滤波器?滤波器原理及其作用是什么?...
- 【Unity】漂浮文字
- [HoopChina]爱神的通牒
热门文章
- 响应式织梦模板婚纱照摄影类网站
- PostgreSQL创建一个数据库和常用的命令
- 如何用百度统计页面中多个链接的pvuv,并且页面还不需要跳转
- webmatrix mysql_WebMatrix教程(一) (关注Microsoft 的最新武器:建立你的第一个WebMatrix网站)...
- Tableu地图绘制注意事项
- 对3721上网助手的一些疑问建议
- 计算机桌面隔几秒闪一下,win7游戏窗口化隔一段时间就会闪一下屏幕怎么办
- 自定义组件 QQ对话框
- make menuconfig配置方法
- 走向人生巅峰?这份自由程序员速成宝典你值得拥有