yolov5预处理

news/2025/3/3 21:28:30/文章来源:https://www.cnblogs.com/wancy/p/18746134

 1.yolov5预处理流程

  1.等比缩放与填充:将输入图像等比缩放到目标尺寸(如640×640),并在多余部分填充灰条,保持图像的宽高比不变。这一过程也被称为“letterbox”。
  2.颜色空间转换:将图像从BGR格式转换为RGB格式(OpenCV默认读取为BGR)。
  3.归一化:将像素值从[0, 255]归一化到[0, 1],通过除以255.0实现。
  4.通道顺序调整:将图像的通道顺序从HWC(高度、宽度、通道)调整为CHW(通道、高度、宽度)。
  5.添加批次维度:将调整后的图像数据扩展为四维张量(B, C, H, W),其中B表示批次大小,通常为1。

 2.官方的预处理

import math
import cv2
import numpy as npdef preprocess_image(image,img_size=640):#image为cv2读取的BGR图h0, w0 = image.shape[:2]  # orig hwr = img_size / max(h0, w0) # ratioif r != 1: # if sizes are not equalinterp = cv2.INTER_LINEAR if r > 1 else cv2.INTER_AREA # 上采样 or 下采样image = cv2.resize(image, (math.ceil(w0 * r), math.ceil(h0 * r)), interpolation=interp)#以较小的比例缩放图像h1,w1=image.shape[:2]#缩放后的图# 填充dw = (img_size - w1) / 2 # 要填充的宽度的一半dh = (img_size - h1) / 2 # 要填充的高度的一半top, bottom = int(round(dh - 0.1)), int(round(dh + 0.1))left, right = int(round(dw - 0.1)), int(round(dw + 0.1))color = (114, 114, 114) # padding颜色im = cv2.copyMakeBorder(image, top, bottom, left, right, cv2.BORDER_CONSTANT, value=color) # add border #cv2.imwrite("p1.png",im)#BGR to and RGB HWC to CHWim = im.transpose((2, 0, 1))[::-1] # HWC to CHW, BGR to RGBim = np.ascontiguousarray(im)# print("im.shape",im.shape)# print("im.shape2",im.shape[1:3])#CHW#归一化[0,1],添加批次维度input_image = np.expand_dims(im, axis=0).astype(np.float32) / 255.0return input_image, (h0, w0), im.shape[1:3] # im, hw_original, hw_resized# return input_image # imif __name__ == '__main__':image=cv2.imread(r'flower.png')print(image.shape)#(424, 359, 3)input_image, size, input_image_shape=preprocess_image(image, img_size=640)print(input_image.shape)#(1, 3, 640, 640)print(size)#(424, 359)print(input_image_shape)#(1, 3, 640, 640)

  输入为flower.png,大小为h=424,w=359(左图,这里缩小了显示了),经过预处理后变为了右图。

                                     

 3.自己的编写的预处理

 


import cv2
import numpy as np
def preprocess_image(image, img_size=640,padding_color_value=(114,114,114)):'''
   :param image: 原始图
   :param img_size: 模型的输入尺寸大小:640x640
   :return:
   '''# 获取原始图像的尺寸h, w = image.shape[:2]# 计算缩放比例scale = min(img_size / w, img_size / h)# 计算新的尺寸new_w = int(w * scale)new_h = int(h * scale)# 重新调整大小img_resized = cv2.resize(image, (new_w, new_h))# 创建一个目标尺寸的新图像,填充颜色为黑色img_padded = np.zeros((img_size, img_size, 3), dtype=np.uint8)+padding_color_value# 将调整后的图像放入新图像中img_padded[(img_size - new_h) // 2:(img_size + new_h) // 2,(img_size - new_w) // 2:(img_size + new_w) // 2] = img_resized  #cv2.imwrite("p2.png", img_padded)# 转换颜色通道 BGR -> RGBimg_padded = img_padded[..., ::-1]# 归一化到 [0, 1]img_padded = img_padded.astype(np.float32) / 255.0# 添加批次维度img_padded = np.expand_dims(img_padded, axis=0)# 调整维度顺序 NCHWimg_padded = np.transpose(img_padded, (0, 3, 1, 2)) #从 NHWC 转换为 NCHWreturn img_paddedif __name__ == '__main__':image=cv2.imread(r'flower.png')print(image.shape)#(424, 359, 3)img_padded=preprocess_image(image, img_size=640)print(img_padded.shape)#(1, 3, 640, 640)

 

  效果与上图差不多。

 

总结:官方的做法在缩放方式上更为详细,判断r>1还是<1,分别使用cv2.INTER_LINEAR(双线性插值)进行上采样与cv2.INTER_AREA(区域插值)进行下采样。另外,两者分别使用的(math.ceil(w0 * r), math.ceil(h0 * r))与int(w * scale),int(h * scale),前者是向上取值整后者是向下取整,存在微小差异。

 

参考资料:

https://blog.csdn.net/qq_40672115/article/details/127012332

https://blog.csdn.net/weixin_51226647/article/details/139688302

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/892235.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET9中使用Options

选项模式在 ASP.NET Core 中使用类来提供对相关配置设置的强类型访问。通过将配置设置隔离到单独的类,应用程序遵循封装和关注点分离的原则。封装确保依赖于配置的类仅依赖于其使用的设置;关注点分离则确保应用的不同部分的设置互不依赖或耦合。此外,选项模式还提供了验证配…

Semantic Kernel:OpenAPI的Plugin

SK的插件,能让AI功能如虎添翼。Plugin能让AI与本地功能和数据互动,使AI与应用的结合,并起到了很好的粘合剂作用。怎么能让Plugin本身和功能分离呢?调用API是一个很好的办法,比如下面是一个查询订单的功能,是一个mini API项目。using System.Text.Json.Serialization;var …

Semantic Kernel:Phi-4试用

微软在去年12月12日首次展示了Phi-4模型,该模型拥有140亿参数,但表现极为强大。在多项测试中表现优异:GPQA(研究生水平问答)和MATH数学基准测试中,Phi-4的表现超过了OpenAI的GPT-4o,并超越同类顶级开源模型Qwen 2.5 - 14B和Llama 3.3 - 70B。 在美国数学竞赛AMC测试中,…

2025/3/2 【栈与队列】LeetCode232. 用栈实现队列

232. 用栈实现队列 - 力扣(LeetCode) 代码随想录 (programmercarl.com) 思想:用下面的两个栈模拟队列 from collections import deque class MyQueue:def __init__(self):# in主要负责push,out主要负责popself.stackin = []self.stackout = []def push(self, x: int) -> …

Semantic Kernel:Process

Process(流程)是为实现特定业务目标而设计的步骤集合,通过提供服务或产品,为客户创造价值。每个流程由一系列有序的活动组成,这些活动共同完成一个整体目标,旨在提升效率、优化决策,并促进跨团队协作。 在Microsoft Semantic Kernel框架中,Process Framework是一种强大…

Semantic Kernel:新Agent代理

在之前的SemanticKernel中,有一篇关于Agent的文章,不过现在看来其中使用的包过时,所以这篇来更新一下。原文章如下:Semantic Kernel:Agent代理 桂素伟,公众号:桂迹Semantic Kernel:Agent代理原来项目引有的Nuget包如下,版本停留在了1.18.2,2024年9月4日   最新的Agen…

基于uniCloud开发的管理端部署

参考链接: https://doc.dcloud.net.cn/uniCloud/publish.html https://doc.dcloud.net.cn/uniCloud/hosting.html#使用 上传云函数前端网页托管勾选将编译后的资源部署到前端网页托管选项 配置自定义域名配置域名,根据提示在域名管理处添加解析将得到的cname值在域名解析出添…

UnitsNet 库简介

UnitsNet 是一个功能强大的 .NET 库,专为简化物理单位的处理而设计。它提供了丰富的单位类型及其转换功能,使开发人员能够在代码中方便地进行物理单位间的转换、计算和显示。UnitsNet 支持多种领域的物理单位,例如长度、质量、体积、温度、速度、面积等,极大地提高了开发效…

DeepSeek避坑指南:巧用提示词

前言 DeepSeek是国内AI里面的佼佼者,它开源deepseek r1大模型,不仅把AI的使用成本降了下来,同时还撼动了open AI等国际玩家的市场地位。 由于DeepSeek R1是推理模型,在某些时候输出的内容答非所问、甚至会一本正经的胡说八道。今天我们主要聊聊如何能更好的让大模型回答问题…

.NET9里WinForm更新了什么

下面是几个在.NET9中WinForm的新功能!主题Windows Forms 已初步支持暗模式,目标是在 .NET 10 中实现完整支持。应用程序的颜色模式可以设置为以下几种值:SystemColorMode.Classic—(默认)浅色模式,与之前版本的 Windows Forms 相同。 SystemColorMode.System—遵循 Windo…

2019-PTA模拟赛-L1-3 后天(三目表达式-仅代码)

签到题,无解析Code: #include<iostream> using namespace std; int main(){int d;cin >> d;int res = (d + 2) % 7 == 0 ? 7 : (d + 2) % 7;cout << res;return 0; }

SemanticKernel系列,AI系列,SmartFill介绍视频系列

SemanticKernel系列 Semantic Kernel(SK)是微软开发的开源框架,旨在帮助开发者将大型语言模型(LLM)集成到应用程序中。它提供了丰富的工具和功能,支持多种编程语言,简化了LLM的调用和管理过程。通过SK,开发者可以更高效地构建智能应用,实现自然语言处理、对话生成等功…