【深度学习实战(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.5oy = (-scale * image.shape[0] + input_h + scale  - 1) * 0.5M = 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 = NoneIM = Noneltbox = (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.mzph.cn/pingmian/771.shtml

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

相关文章

小红的排列构造(dp优化)

题目描述 小红拿到了一个长度为n的数组a,她希望你构造两个排列p和q,满足对于i∈[1,n],ai∈[1,n]pi或qi二选一。你能帮帮她吗?定义排列是一个长度为n的数组,其中1到n每个元素恰好出现1次。 输入描述:第一行输入一个正整数n&#…

Linux平台Alsa库移植

嵌入式Linux平台Alsa库移植 1. Alsa-lib2. Alsa-utilsAplay播放避坑 1. Alsa-lib alsa-lib下载地址:https://www.alsa-project.org/files/pub/lib/ 这里使用的版本是alsa-lib-1.0.29 下载完成并解压,进入alsa-lib-1.0.29目录 编译配置如下: …

关于selenium各种操作语句(方便查询便携版)

定位方法 #功能from selenium import webdriver#载入驱动 from selenium.webdriver.common.by import By #新版载入by,旧版的find_element_by_id语句一般会被划掉,然后给你提示说语句已淘汰,不过目前还是可以运行,只是代码不好看。#启动驱动的…

解释RocketMQ的“消息顺序”特性

RocketMQ的“消息顺序”特性指的是它能按照发送方的预期,保持消息在生产和消费过程中的顺序一致性。这一特性对于某些特定的应用场景至关重要,比如金融交易、订单处理等,在这些场景中,消息的顺序性对于业务逻辑的正确性有着决定性…

解析OceanBase v4.2 Oracle 语法兼容之 LOCK TABLE

背景 在OceanBase V4.1及之前的版本中,尽管已经为Oracle租户兼容了LOCK TABLE相关的语法,包括单表锁定操作,和WAIT N, NOWAIT 关键字。但使用时还存在一些限制。例如:LOCK TABLE只能针对单表进行锁定,并不…

Leetcode287_寻找重复数

1.leetcode原题链接:. - 力扣(LeetCode) 2.题目描述 给定一个包含 n 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。 假设 nums 只有 一个重复…

URL GET +号后台接收成空格

问题:参数spdmwhbs001 其中包含URL特殊符号 如果用GET请求方式不做任何不处理那么浏览器自动将转为%20 请求链接为 details?spdmwhbs%20001&limitKcysType1 后台接收到的参数为 whbs 001 ,自动将号转成空格了。 尝试解决(失败&#…

Redis中的事务(二)

事务 事务的实现 执行事务 当一个处于事务状态的客户端向服务器发送EXEC命令时,这个EXEC命令将立即被服务器执行,服务器会遍历这个客户端的事务队列,执行队列中保存的所有命令,最后将执行命令所得的结果全部返回给客户端。 例…

kubernets 节点数量限制修改

kubelet节点pod数量限制 在 Kubernetes 中,kubelet 的 --max-pods 参数默认值是 110。这意味着每个节点上最多可以运行 110 个 Pod。这个默认值是为了在大多数情况下提供一个合理的默认限制,以避免节点资源被过度占用。 如果需要修改默认的 --max-pods…

STM32学习和实践笔记(17):STM32外部中断(EXTI)的整体介绍

1.外部中断介绍 1.1 EXTI简介 STM32F10x外部中断/事件控制器(EXTI)包含多达 20 个用于产生事件/中断请求的边沿检测器。(事件与中断的区别,可参看STM32---中断与事件的区别_中断和事件的区别-CSDN博客) 具体有哪些&a…

C语言结课实战项目_贪吃蛇小游戏

目录 最终实现效果: 实现基本的功能: 根据游戏进程解释代码: 游戏初始化: 首先进入游戏,我们应该将窗口名称改为 “贪吃蛇” 并将光标隐藏掉。再在中间打印游戏信息。 之后我们要把地图打印出来: 然后…

Redis(三) 事务与发布订阅

结合前两期 Redis(一) Redis简介(Redis(一) Redis简介-CSDN博客) Redis(二) 可编程性(Redis(二) 可编程性-CSDN博客) 目录 事务在 Redis 中的运作方式 用法 事务中的错误 回滚 放弃命令队列 使用检查和设置的乐观锁定 WATCH解释 使用 WATCH 实现 ZPOP Redis 发布/订…

Python的pytest框架(4)--参数化测试

在 pytest 测试框架中,参数化测试(Parametrized Testing)意味着将一个测试用例设计为能够接受不同输入数据(参数)并分别执行,以验证被测试代码在面对多种情况时的行为是否符合预期。参数化测试的核心理念是…

DAY28| 93. 复原IP地址 ,79.子集 ,90.子集II

文章目录 93.复原IP地址78.子集90.子集II 93.复原IP地址 文字讲解:复原IP地址 视频讲解:复原IP地址 **状态:**此题调试了几次ok,与昨天的分割回文子串相比,就是在判断终止条件处需要处理; 思路:…

设计模式- 单例模式(Singleton)结构|实现方式|优缺点|场景

目录 设计模式(分类) 设计模式(六大原则) 创建型 工厂方法 抽象工厂模式 单例模式 建造者模式 单例模式(Singleton Pattern)是一种创建型设计模式,其…

rust : condvar中一对一和多对一模式初探

condvar是不经常碰到的,但其实在tokio之类库中,还是非常核心的作用。 想进一步体会condvar的使用,还是从场景出发。 一、一个通知发送者,一个接收者 假定一个员工收到一个任务,就是模拟是一个时间片,到时…

【Qt】设置QT标准对话框为中文字体

设置QT标准对话框为中文字体 一、问题二、解决方法1、找到Qt内置的翻译文件 qt_zh_CN.qm2、在代码中加载该文件 一、问题 在Qt中我们使用的标准对话框都是英文,例如下面的 字体选择对话框,但是实际中我们需要构建的是中文对话框。 所以我们需要使用Qt官…

19篇 vue3进阶

一 基础特性 1. **Composition API**:引入了组合式 API,允许以函数的方式组织组件逻辑。 2. **响应式系统**:使用 Proxy 作为其响应式系统的基础,提供更精确的依赖追踪。 3. **模板语法**:保留了 Vue 2 的模板语法…

MySQL InnoDB事务隔离级别与锁机制深入解析

引言 在当今的数据库系统中,事务管理是确保数据一致性和完整性的关键。事务是数据库操作的基本单元,它将一系列的数据库操作组合成一个逻辑工作单元,要么全部成功执行,要么全部失败回滚,这就是所谓的ACID属性&#xf…

js自动缩放页面,html自动缩放页面,大屏自动缩放页面,数字看板自动缩放页面,大数据看板自动缩放页面

js自动缩放页面&#xff0c;html自动缩放页面&#xff0c;大屏自动缩放页面&#xff0c;数字看板自动缩放页面&#xff0c;大数据看板自动缩放页面 由纯JS实现 html代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"…