当前位置: 首页 > news >正文

【YOLOv8 代码解读】数据增强代码梳理

1. LetterBox增强

当输入图片的尺寸和模型实际接收的尺寸可能不一致时,通常需要使用LetterBox增强技术。具体步骤是先将图片按比例缩放,将较长的边缩放到设定的尺寸以后,再将较短的边进行填充,最终短边的长度为stride的倍数即可。这种方法可以保留原始图像的纵横比,同时还可以使图像更加适合目标检测算法的输入。
在YOLOv8代码中,ultralytics/data/augment.pyclass LetterBox类别实现了该功能。

import cv2
import numpy as npclass LetterBox:"""Resize image and padding for detection, instance segmentation, pose."""def __init__(self, new_shape=(640, 640), auto=False, scaleFill=False, scaleup=True, center=True, stride=32):"""Initialize LetterBox object with specific parameters."""self.new_shape = new_shapeself.auto = autoself.scaleFill = scaleFillself.scaleup = scaleupself.stride = strideself.center = center  # Put the image in the middle or top-leftdef __call__(self, labels=None, image=None):"""Return updated labels and image with added border."""if labels is None:labels = {}img = labels.get("img") if image is None else imageshape = img.shape[:2]  # current shape [height, width]new_shape = labels.pop("rect_shape", self.new_shape)if isinstance(new_shape, int):new_shape = (new_shape, new_shape)# Scale ratio (new / old)r = min(new_shape[0] / shape[0], new_shape[1] / shape[1])if not self.scaleup:  # only scale down, do not scale up (for better val mAP)r = min(r, 1.0)# Compute paddingratio = r, r  # width, height ratiosnew_unpad = int(round(shape[1] * r)), int(round(shape[0] * r))dw, dh = new_shape[1] - new_unpad[0], new_shape[0] - new_unpad[1]  # wh paddingif self.auto:  # minimum rectangledw, dh = np.mod(dw, self.stride), np.mod(dh, self.stride)  # wh paddingelif self.scaleFill:  # stretchdw, dh = 0.0, 0.0new_unpad = (new_shape[1], new_shape[0])ratio = new_shape[1] / shape[1], new_shape[0] / shape[0]  # width, height ratiosif self.center:dw /= 2  # divide padding into 2 sidesdh /= 2if shape[::-1] != new_unpad:  # resizeimg = cv2.resize(img, new_unpad, interpolation=cv2.INTER_LINEAR)top, bottom = int(round(dh - 0.1)) if self.center else 0, int(round(dh + 0.1))left, right = int(round(dw - 0.1)) if self.center else 0, int(round(dw + 0.1))img = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_CONSTANT, value=(114, 114, 114))  # add borderif labels.get("ratio_pad"):labels["ratio_pad"] = (labels["ratio_pad"], (left, top))  # for evaluationif len(labels):labels = self._update_labels(labels, ratio, dw, dh)labels["img"] = imglabels["resized_shape"] = new_shapereturn labelselse:return imgnew_shape=(640, 640)
aug = LetterBox(new_shape,center=True)labels=None
img = cv2.imread("./2.png",-1)lettered_img = aug(labels,img)cv2.imshow('v8 letter_box',lettered_img)
cv2.waitKey(0)

center=True
在这里插入图片描述

center=False
在这里插入图片描述

2 Mosaic增强

3 Mixup增强

http://www.lryc.cn/news/328046.html

相关文章:

  • 安卓调试桥ADB
  • 深入理解数据结构第一弹——二叉树(1)——堆
  • 面试题:JVM的垃圾回收
  • Java8之接口默认方法
  • 发挥ChatGPT潜力:高效撰写学术论文技巧
  • 国产暴雨AI服务器X3418开启多元自主可控新篇章
  • webpack-dev-server 如何直接用IP打开
  • Web框架开发-BBS项目预备知识
  • 力扣208---实现Trie(前缀树)
  • 书生·浦语大模型开源体系(一)论文精读笔记
  • 基于单片机模糊算法温度控制系统设计
  • GESP Python编程四级认证真题 2024年3月
  • Collection与数据结构 顺序表与ArrayList
  • pytorch | torchvision.transforms.CenterCrop
  • 在Debian 11上安装GCC
  • kafka部署之简单密钥
  • 大模型重塑电商,淘宝、百度、京东讲出新故事
  • 用静态工厂方法代替构造器
  • Discourse 最多允许有几个分类级别
  • MySQL数据库主从复制和读写分离
  • rust - 使用log4rs打印日志
  • 数据结构:单调栈和单调队列
  • 大模型RAG性能提升路径
  • 机器视觉学习(九)—— 边缘检测
  • 基于单片机声音分贝采集和显示控制系统设计
  • CentOS使用Docker部署Halo并结合内网穿透实现公网访问本地博客
  • 打造高效自动化渗透测试系统:关键步骤与实践
  • 绿联 部署vocechat,搭建私人聊天服务器,用于小型团队和家庭环境
  • 考研数学|高效刷透汤家凤《1800》经验分享
  • LLM推理入门指南②:深入解析KV缓存