yolov5中的mosaic实现原理

mosaic图像增强技术基于现有数据极大的丰富了样本的多样性,极大程度降低了模型对于多样性学习的难度

本文将对yolov5中mosaic实现的核心源码进行解析并结合自身项目经历谈下其局限性

mosaic实现位于datasets.py中的load_mosaic()函数,入参是当前训练的图片序号,出参是一幅经过mosaic图像增强的图片及其label

经过如下步骤得到mosaic增强图像:

step1. 假设模型输入尺寸为s,生成一幅尺寸为2s * 2s的灰色图

step2. 从点A(s/2, s/2)和点B(3s/2, 3s/2)限定的矩形内随机选择一点作为拼接点,代码如下

yc, xc = [int(random.uniform(-x, 2 * s + x)) for x in self.mosaic_border]  # mosaic center x, y

step3. 随机选择四张图,取其部分拼入该图,如下图所示,四种颜色代表四张样本图,超出的部分将被舍弃

step4. 将图片进行变换后得到最终输出,对应代码和示意图如下

    # Augment
    img4, labels4 = random_perspective(img4, labels4,
                                       degrees=self.hyp['degrees'],
                                       translate=self.hyp['translate'],
                                       scale=self.hyp['scale'],
                                       shear=self.hyp['shear'],
                                       perspective=self.hyp['perspective'],
                                       border=self.mosaic_border)  # border to remove

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
YOLOv5 mosaic 是一种数据增强方法,用于合成多个图像并生成一个新的训练样本。它通过将四个不同的图像拼接在一起,并随机调整其位置和大小来生成一个新的合成图像。 以下是一个使用 Python 实现 mosaic 数据增强的示例代码: ```python import cv2 import numpy as np import random def mosaic(image, boxes, output_size): width, height = output_size # 创建一个空白画布 mosaic_img = np.full((height, width, 3), 0, dtype=np.uint8) # 随机选择三个额外的图像用于合成 random.shuffle(boxes) images = [cv2.imread(box[0]) for box in boxes[:3]] # 将四个图像拼接在一起 mosaic_img[:height//2, :width//2] = cv2.resize(images[0], (width//2, height//2)) mosaic_img[:height//2, width//2:] = cv2.resize(images[1], (width//2, height//2)) mosaic_img[height//2:, :width//2] = cv2.resize(images[2], (width//2, height//2)) mosaic_img[height//2:, width//2:] = cv2.resize(image, (width//2, height//2)) # 随机调整合成图像的位置和大小 x_offset = random.randint(0, width//2) y_offset = random.randint(0, height//2) resize_scale = random.uniform(0.6, 0.9) mosaic_img = mosaic_img[y_offset:y_offset+height, x_offset:x_offset+width] mosaic_img = cv2.resize(mosaic_img, (int(width*resize_scale), int(height*resize_scale))) return mosaic_img # 示例用法 image = cv2.imread('image.jpg') boxes = [('image1.jpg', [x1, y1, x2, y2]), ('image2.jpg', [x1, y1, x2, y2]), ('image3.jpg', [x1, y1, x2, y2])] mosaic_img = mosaic(image, boxes, (640, 640)) # 显示合成后的图像 cv2.imshow("Mosaic Image", mosaic_img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 请注意,示例的 `boxes` 是一个包含图像路径和边界框坐标的列表,你需要根据你的实际数据进行调整。另外,你还需要先安装 OpenCV 库来运行该代码。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值