入门小菜鸟,希望像做笔记记录自己学的东西,也希望能帮助到同样入门的人,更希望大佬们帮忙纠错啦~侵权立删。
目录
3、random_perspective()函数(详见代码解析)
一、原理分析
YOLOv5采用和YOLOv4一样的Mosaic数据增强。
主要原理:它将一张选定的图片和随机的3张图片进行随机裁剪,再拼接到一张图上作为训练数据。
这样可以丰富图片的背景,而且四张图片拼接在一起变相提高了batch_size,在进行batch normalization(归一化)的时候也会计算四张图片。
这样让YOLOv5对本身batch_size不是很依赖。
二、代码分析
1、主体部分——load_mosaic
labels4, segments4 = [], []
s = self.img_size #获取图像尺寸
yc, xc = (int(random.uniform(-x, 2 * s + x)) for x in self.mosaic_border) # mosaic center x, y
#random.uniform随机生成上述范围的实数(即一半图像尺寸到1.5倍图像尺寸)
#这里是随机生成mosaic中心点
先初始化标注列表为空,然后获取图像尺寸s
根据图像尺寸利用random.uniform()随机生成mosaic中心点,范围在(即一半图像尺寸到1.5倍图像尺寸)
indices = [index] + random.choices(self.indices, k=3) # 3 additional image indices
#随机生成另外3张图片的索引
#random.choices——随机生成3个图片总数内的索引
#然后一起把索引,连同原先选定的图片打包进indices
random.shuffle(indices)
#对这些索引值随机排序
利用random.choices()随机生成另外3张图片的索引,将这4张图片的索引填进indices列表,然后利用random.shuffle()对这些索引值随机排序
for i, index in enumerate(indices): #循环遍历这些图片
# Load image
img, _, (h, w) = load_image(self, index)#加载图片和高宽
循环遍历这4张图片,并且调用load_image()函数加载图片和对应高宽
接下来就是如何放置这4张图啦~
# place img in img4
if i == 0: # top left(左上角)
img4 = np.full((s * 2, s * 2, img.shape[2]), 114, dtype=np.uint8) # base image with 4 tiles
#先生成背景图
x1a, y1a, x2a, y2a = max(xc - w, 0), max(yc - h, 0), xc, yc # xmin, ymin, xmax, ymax (large image)
#设置大图上的位置(要么原图大小,要么放大)(w,h)或(xc,yc)(新生成的那张大图)
x1b, y1b, x2b, y2b = w - (x2a - x1a), h - (y2a - y1a), w, h # xmin, ymin, xmax, ymax (small image)
#选取小图上的位置(原图)
第一张图片放在左上角
img4首先用np.full()函数填充初始化大图,尺寸是4张图那么大
然后分别设置大图上该图片的位置,以及相应的在原图(即小图)上截取的位置坐标
elif i == 1: # top right(右上角)
x1a, y1a, x2a, y2a = xc, max(yc - h, 0), min(xc + w, s * 2), yc
x1b, y1b, x2b, y2b = 0, h - (y2a - y1a), min(w, x2a - x1a), h
elif i == 2: # bottom left(左下角)
x1a, y1a, x2a, y2a = max(xc - w, 0), yc, xc, min(s * 2, yc + h)
x1b, y1b, x2b, y2b = w - (x2a - x1a), 0, w, min(y2a - y1a, h)
elif i ==

本文详细解析了YOLOv5中的Mosaic数据增强技术,涉及load_mosaic函数中的图片裁剪、拼接及标签处理过程,同时解读了load_image和random_perspective函数的作用。通过实例学习和关键代码剖析,助力初学者理解和实践图像增强方法。
最低0.47元/天 解锁文章
23万+

被折叠的 条评论
为什么被折叠?



