【深度学习实战(10)】图像推理之预处理

一、预处理流程

在把一张图像送入模型进行推理时,需要先进行预处理,预处理流程包括:
(1)读取图像
(2)尺寸调整,letter_box(不失真)
(3)通道调整:HWC->CHW
(4)格式调整: array -> tensor
(5)维度调整:CHW -> BCHW
(6)设备调整:to device

二、代码

import torch
import cv2
import numpy as np
from torchvision import transforms


# -------------------------------------------------------------------#
#   letterbox:图片缩放,居中对齐,左右或者上下填充,通过仿射变换实现
# -------------------------------------------------------------------#
def letter_box(image, input_w=640, input_h=640):
    scale = min(input_h / image.shape[0], input_w / image.shape[1])
    ox = (-scale * image.shape[1] + input_w + scale  - 1) * 0.5
    oy = (-scale * image.shape[0] + input_h + scale  - 1) * 0.5
    M = np.array([
        [scale, 0, ox],
        [0, scale, oy]
    ], dtype=np.float32)
    IM = cv2.invertAffineTransform(M)
    image_prep = cv2.warpAffine(image, M, (input_w, input_h), flags=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT, borderValue=(114, 114, 114))
    return image_prep, M, IM

#------------------#
#   preprocess
#------------------#
def preprocess(image, input_size, device):
    # ------------------#
    #   HWC->CHW
    #   array -> tensor
    #   CHW -> BCHW
    #   to device
    # ------------------#
    return torch.unsqueeze(transforms.ToTensor()(image), 0).to(device)



if __name__ == "__main__":

    device = 'cpu'
    model_input_size = [320, 320]
    

    # -----------------#
    #   read image
    # -----------------#
    image=cv2.imread('demo.png')
    cv2.imshow('orginal', image)

    # -----------------#
    #   letter_box
    # -----------------#
    M = None
    IM = None
    ltbox = (image.shape[0] != model_input_size[0] or image.shape[1] != model_input_size[1])
    if ltbox:
        image, M, IM=letter_box(image, 320, 320)
        cv2.imshow('ltbox', image)
        cv2.waitKey(0)

    # -----------------#
    #   preprocess
    # -----------------#
    image_in = preprocess(image, model_input_size, device)

二、代码逐行debug调试

运行letter_box后
在这里插入图片描述
运行preprocess后
在这里插入图片描述
我们看看ToTensor对图像做了什么?
ToTensor之前:
在这里插入图片描述
类型:ndarray
通道:HWC
数值:[114,114,114] 未归一化
ToTensor之后:
在这里插入图片描述

类型:Tensor
通道:CHW
数值:[0.4471,0.4471,0.4471] 归一化 0.4471=114/256

通过debug,我们可以发现transforms.ToTensor()一共对图片做了三件事,分别是类型转换通道调整归一化

查阅资料,确认一下
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从 Elastic 的 Go APM 代理迁移到 OpenTelemetry Go SDK

作者:来自 Elastic Damien Mathieu 正如我们之前所分享的,Elastic 致力于帮助 OpenTelemetry(OTel)取得成功,这意味着在某些情况下构建语言 SDK 的分发版本。 Elastic 在观察性和安全数据收集方面战略性地选择了 OTel…

【Win】怎么下载m3u8视频\怎么通过F12开发人员工具获取视频地址\怎么下载完整的.ts格式视频

怎么下载m3u8视频?首先通过浏览器本地的开发人员工具,获取m3u8的地址,然后再通过第三方下载工具下载,此处以N_m3u8DL-CLI_v3.0.2为例 如下图的步骤,即可获取到视频的m3u8地址 打开N_m3u8DL-CLI_v3.0.2,粘贴…

JAVA 线程状态

一、简介 每一个java线程都会有六种状态,即:NEW,RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED等。这些线程状态是JVM的线程状态,并不映射操作系统的线程状态。可以通过t1.getState().toString()获取线程状态。 1、NE…

数据结构(顺序队列 循环队列

目录 1. 讲解&#xff1a;2. C代码实现&#xff1a;小结&#xff1a; 1. 讲解&#xff1a; 2. C代码实现&#xff1a; #include <stdlib.h> #include <iostream>using namespace std;#define MaxSize 10 #define ElemType inttypedef struct {ElemType data[MaxSi…

JavaWeb--06Vue组件库Element

Element 1 Element组件的快速入门1.1 Table表格 1 Element组件的快速入门 https://element.eleme.cn/#/zh-CN Element是饿了么团队开发的 接下来我们来学习一下ElementUI的常用组件&#xff0c;对于组件的学习比较简单&#xff0c;我们只需要参考官方提供的代码&#xff0c;然…

2010年认证杯SPSSPRO杯数学建模B题(第一阶段)交通拥堵问题全过程文档及程序

2010年认证杯SPSSPRO杯数学建模 交通拥堵问题 B题 Braess 悖论 原题再现&#xff1a; Dietrich Braess 在 1968 年的一篇文章中提出了道路交通体系当中的Braess 悖论。它的含义是&#xff1a;有时在一个交通网络上增加一条路段&#xff0c;或者提高某个路段的局部通行能力&a…

【Java框架】SpringMVC(二)——SpringMVC数据交互

目录 前后端数据交互RequestMapping注解基于RequestMapping注解设置接口的请求方式RequestMapping注解的常用属性一个方法配置多个接口method属性params属性headers属性consumes属性produces属性 SpringMVC中的参数传递默认单个简单参数默认多个简单参数默认参数中有基本数据类…

关基网络战时代,赛宁网安电力网络攻防靶场全面提升电网安全防护力

随着网络空间成为与陆地、海洋、天空、太空同等重要的人类活动新领域&#xff0c;自网络空间向物理电网发起攻击&#xff0c;破坏电力等国家关键基础设施成为当前大国博弈、大规模战争的重要手段和常态进攻形式。同时&#xff0c;新型电力系统建设发展驱动电力系统形态和控制方…

鸢尾花数据集的KNN探索与乳腺癌决策树洞察

鸢尾花数据集的KNN探索与乳腺癌决策树洞察 今天博主做了这个KNN和决策树的实验。 一.数据集介绍 介绍一下数据集&#xff1a; 威斯康星州乳腺癌数据集&#xff1a; 威斯康星州乳腺癌数据集&#xff08;Wisconsin Breast Cancer Dataset&#xff09;是一个经典的机器学习数…

vue+node使用RSA非对称加密,实现登录接口加密密码

背景 登录接口&#xff0c;密码这种重要信息不可以用明文传输&#xff0c;必须加密处理。 这里就可以使用RSA非对称加密&#xff0c;后端生成公钥和私钥。 公钥&#xff1a;给前端&#xff0c;公钥可以暴露出来&#xff0c;没有影响&#xff0c;因为公钥加密的数据只有私钥才…

Rabbit加密算法:性能与安全的完美结合

title: Rabbit加密算法&#xff1a;性能与安全的完美结合 date: 2024/4/19 19:51:30 updated: 2024/4/19 19:51:30 tags: Rabbit加密对称加密流密码密钥调度安全分析实际应用加密算法 第一章&#xff1a;引言 1. 加密算法的基本概念和应用 加密算法是一种通过对数据进行转换…

排序算法之桶排序

目录 一、简介二、代码实现三、应用场景 一、简介 算法平均时间复杂度最好时间复杂度最坏时间复杂度空间复杂度排序方式稳定性桶排序O(nk )O(nk)O(n^2)O(nk)Out-place稳定 稳定&#xff1a;如果A原本在B前面&#xff0c;而AB&#xff0c;排序之后A仍然在B的前面&#xff1b; 不…

【Linux】进程的地址空间

一、看现象 1 #include<stdio.h>2 #include<unistd.h>3 4 int g_val 100;5 int main()6 {7 printf("father process is running!pid: %d,ppid: %d\n",getpid(),getppid( ));8 sleep(1);9 10 int id fork();11 if(id 0)12 {13 int cn…

vue快速入门(三十二)局部与全局注册组件的步骤

注释很详细&#xff0c;直接上代码 上一篇 新增内容 局部注册组件全局注册组件 文件结构 源码 MyHeader.vue <!-- 用于测试全局注册组件 --> <template><div><h1>又可以愉快的学习啦</h1></div> </template><script>export d…

go语言并发实战——日志收集系统(四) 利用tail包实现对日志文件的实时监控

Linux中的tail命令 tail 命令是一个在 Unix/Linux 操作系统上用来显示文件末尾内容的命令。它可以显示文件的最后几行内容&#xff0c;默认情况下显示文件的最后 10 行。tail 命令 非常有用&#xff0c;特别是在我们查看日志文件或者监视文件变化时。 基本用法如下&#xff1a…

LLM生成模型在生物单细胞single cell的应用:scGPT

参考&#xff1a; https://github.com/bowang-lab/scGPT https://www.youtube.com/watch?vXhwYlgEeQAs 相关算法&#xff1a; 主要是把单细胞测序出来的基因表达量的拼接起来构建成的序列&#xff0c;这里不是用的基因的ATCG&#xff0c;是直接用的基因名称 训练数据&#x…

vue+springboot+websocket实时聊天通讯功能

前言 在我的前一篇文章里 vuespringboot实现聊天功能 &#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388; 实现了最最基础的聊天功能&#xff0c;可以通过聊天互相给对方发送信息 &#x1f388;&#x1f388;&#x1f388;&…

Python全栈开发前端与后端的完美融合

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在当今互联网时代&#xff0c;全栈开发已经成为了一种趋势。全栈开发者具备前端和后端开发的…

KMP算法(Python)

进阶的做法就是KMP算法&#xff0c;当然暴力也能ac。 KMP主要用一个nex列表&#xff0c;nex[i]存储&#xff08;模式串needle中&#xff09;从第0个到i个字符串s中的一个相等前后缀的最大长度。比如说对于aabaa来说&#xff0c;最大长度应该是&#xff08;前缀aa&#xff09;和…

HarmonyOS开发案例:【首选项】

介绍 本篇Codelab是基于HarmonyOS的首选项能力实现的一个简单示例。实现如下功能&#xff1a; 创建首选项数据文件。将用户输入的水果名称和数量&#xff0c;写入到首选项数据库。读取首选项数据库中的数据。删除首选项数据文件。 最终效果图如下&#xff1a; 相关概念 [首…
最新文章