【深度学习实战(15)】使用训练好的语义分割模型进行推理测试

一、语义分割推理测试的一般流程

前处理
(1)get image
(2)letter_boxo_ho_wi_hi_wn_hn_w
(3)1/250CHWBCHW
(4)to tensorto cuda
前向传播:get prediction
后处理:
(1)CHWHWCsoftmax
(2)to numpyto cpu
(3)letter_box_invi_hn_ho_wo_h
(4)armax
(5)get imageImage.fromarray(np.uint8())

二、代码讲解

前处理

(1)get image

image = Image.open(img)

(2)letter_boxo_ho_wi_hi_wn_hn_w

orininal_h  = np.array(image).shape[0]
orininal_w  = np.array(image).shape[1]
#---------------------------------------------------------#
#   给图像增加灰条,实现不失真的resize
#   也可以直接resize进行识别
#---------------------------------------------------------#
image_data, nw, nh  = resize_image(image, (self.input_shape[1],self.input_shape[0]))#---------------------------------------------------#
#   对输入图像进行resize
#---------------------------------------------------#
def resize_image(image, size):iw, ih  = image.sizew, h    = sizescale   = min(w/iw, h/ih)nw      = int(iw*scale)nh      = int(ih*scale)image   = image.resize((nw,nh), Image.BICUBIC)new_image = Image.new('RGB', size, (128,128,128))new_image.paste(image, ((w-nw)//2, (h-nh)//2))return new_image, nw, nh

(3)1/250CHWBCHW

#---------------------------------------------------------#
#   添加上batch_size维度
#---------------------------------------------------------#
image_data  = np.expand_dims(np.transpose(preprocess_input(np.array(image_data, np.float32)), (2, 0, 1)), 0)def preprocess_input(image):image /= 255.0return image

(4)to tensorto cuda

with torch.no_grad():images = torch.from_numpy(image_data)if self.cuda:images = images.cuda()

前向传播:

get prediction

#---------------------------------------------------#
#   图片传入网络进行预测
#---------------------------------------------------#
pr = self.net(images)[0]
#---------------------------------------------------#

后处理:

(1)CHWHWCsoftmax(2)to numpyto cpu

#---------------------------------------------------#
#   取出每一个像素点的种类
#---------------------------------------------------#
pr = F.softmax(pr.permute(1,2,0),dim = -1).cpu().numpy()

(3)letter_box_invi_hn_ho_wo_h

#--------------------------------------#
#   将灰条部分截取掉
#--------------------------------------#
pr = pr[int((self.input_shape[0] - nh) // 2) : int((self.input_shape[0] - nh) // 2 + nh), \int((self.input_shape[1] - nw) // 2) : int((self.input_shape[1] - nw) // 2 + nw)]
#---------------------------------------------------#
#   进行图片的resize
#---------------------------------------------------#
pr = cv2.resize(pr, (orininal_w, orininal_h), interpolation = cv2.INTER_LINEAR)

(4)armax

#---------------------------------------------------#
#   取出每一个像素点的种类
#---------------------------------------------------#
pr = pr.argmax(axis=-1)

(5)get imageImage.fromarray(np.uint8())

seg_img = np.reshape(np.array(self.colors, np.uint8)[np.reshape(pr, [-1])], [orininal_h, orininal_w, -1])
#------------------------------------------------#
#   将新图片转换成Image的形式
#------------------------------------------------#
image   = Image.fromarray(np.uint8(seg_img))
#------------------------------------------------#
#   将新图与原图及进行混合
#------------------------------------------------#
image   = Image.blend(old_img, image, 0.7)

三、完整代码

def detect_image(self, image, count=False, name_classes=None):#---------------------------------------------------------##   在这里将图像转换成RGB图像,防止灰度图在预测时报错。#   代码仅仅支持RGB图像的预测,所有其它类型的图像都会转化成RGB#---------------------------------------------------------#image       = cvtColor(image)#---------------------------------------------------##   对输入图像进行一个备份,后面用于绘图#---------------------------------------------------#old_img     = copy.deepcopy(image)orininal_h  = np.array(image).shape[0]orininal_w  = np.array(image).shape[1]#---------------------------------------------------------##   给图像增加灰条,实现不失真的resize#   也可以直接resize进行识别#---------------------------------------------------------#image_data, nw, nh  = resize_image(image, (self.input_shape[1],self.input_shape[0]))#---------------------------------------------------------##   添加上batch_size维度#---------------------------------------------------------#image_data  = np.expand_dims(np.transpose(preprocess_input(np.array(image_data, np.float32)), (2, 0, 1)), 0)with torch.no_grad():images = torch.from_numpy(image_data)if self.cuda:images = images.cuda()#---------------------------------------------------##   图片传入网络进行预测#---------------------------------------------------#pr = self.net(images)[0]#---------------------------------------------------##   取出每一个像素点的种类#---------------------------------------------------#pr = F.softmax(pr.permute(1,2,0),dim = -1).cpu().numpy()#--------------------------------------##   将灰条部分截取掉#--------------------------------------#pr = pr[int((self.input_shape[0] - nh) // 2) : int((self.input_shape[0] - nh) // 2 + nh), \int((self.input_shape[1] - nw) // 2) : int((self.input_shape[1] - nw) // 2 + nw)]#---------------------------------------------------##   进行图片的resize#---------------------------------------------------#pr = cv2.resize(pr, (orininal_w, orininal_h), interpolation = cv2.INTER_LINEAR)#---------------------------------------------------##   取出每一个像素点的种类#---------------------------------------------------#pr = pr.argmax(axis=-1)seg_img = np.reshape(np.array(self.colors, np.uint8)[np.reshape(pr, [-1])], [orininal_h, orininal_w, -1])#------------------------------------------------##   将新图片转换成Image的形式#------------------------------------------------#image   = Image.fromarray(np.uint8(seg_img))#------------------------------------------------##   将新图与原图及进行混合#------------------------------------------------#image   = Image.blend(old_img, image, 0.7)

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

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

相关文章

Java中ArrayList和顺序表

目录 1.线性表 2.顺序表 3 ArrayList简介 4. ArrayList使用 4.1 ArrayList的构造 4.2 ArrayList常见操作 4.3 ArrayList的遍历 1.线性表 线性表 ( linear list ) 是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结 …

Linux-延迟任务and定时任务

一.在系统中设定延迟任务要求如下 在系统中建立easylee用户,设定其密码为easylee 延迟任务由root用户建立 要求在5小时后备份系统中的用户信息文件到/backup中 确保延迟任务是使用非交互模式建立 确保系统中只有root用户和easylee用户可以执行延迟任务的设定 二.在…

ArrayList与顺序表(1)

前言~🥳🎉🎉🎉 hellohello~,大家好💕💕,这里是E绵绵呀✋✋ ,如果觉得这篇文章还不错的话还请点赞❤️❤️收藏💞 💞 关注💥&#x…

【苍穹外卖】HttpClient-快速理解入门

目录 HttpClient-快速理解&入门1. 需求2. 如何使用3. 具体示例4. 大致优点5. 大致缺点 HttpClient-快速理解&入门 1. 需求 在平常访问服务器里面的资源的时候,我们通常是通过浏览器输入网址(或者在浏览器点击某个连接)这种方式&…

测试的分类(2)

目录 按照执行方式分类 静态测试 动态测试 按照测试方法 灰盒测试 按照测试阶段分类 单元测试 集成测试 系统测试 冒烟测试 回归测试 按照执行方式分类 静态测试 所谓静态测试就是不实际运行被测软件,只是静态地检查程序代码, 界面或文档中可能存在错误的过程. 不以…

ffmpeg安装使用(详细)

目录结构 前言ffmpeg下载ffmpeg环境变量配置ffmpeg环境变量配置验证ffmpeg使用举例说明.mp4 转 .wav.mp3 转 .wav.ogg 转 .wav 参考链接 前言 本文主要记录ffmpeg在Windows系统中的安装使用方法。 ffmpeg下载 FFmpeg官网下载 ffmpeg环境变量配置 解压后将“.\ffmpeg\bin”…

vscode 如何断点调试ros1工程

在vscode中断点调试ros1工程主要分为以下几步: 1. 第一步就是修改cmakelist.txt,到调试模式。 将CMAKE_BUILD_TYPE原来对应的代码注释掉,原来的一般都不是调试模式。加上下面一行代码,意思是设置调试模式。 # 断点调试 SET(CMAK…

Python 运行时的目录信息

摘要说明: 在 python 执行过程中,会涉及各种目录信息,了解各种目录的含义和获取方式,可以让我们更好地进行代码控制,并进行相应的处理。 一. 操作场景说明 1. 几个目录和文件 Windows的命令行窗口所在目录 &#xf…

【Linux】文件基本属性

Linux 系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。 为了保护系统的安全性,Linux 系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。 在 Linux 中我们可以使用 ll 或者 …

python 中pandas安装教程

1.打开cmd 输入代码 conda info --envs #查看环境 conda activate daiyi_Python #进入环境 conda list #查看环境 conda install pandas #下载pandas 输入y即可 conda uninstall pandas #删除pandas 输入y即可

《你想活出怎样的人生》上映,AOC带你打开宫崎骏的动画世界大门!

摘要:宫崎骏式美学,每一帧都是治愈! 近日,宫崎骏新作《你想活出怎样的人生》正式公映。苍鹭与少年的冒险、奇幻瑰丽的场景、爱与成长的主题,让观众们收获到满满的爱与感动。宫崎骏总能以细腻的画面、温柔的音乐&#…

设计模式——模板方法

1)模板方法模式(Template Method Pattem),又叫模板模式(Template Patern),在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。 2)简单说,模板方法模式 定义一个操作中…

ETLCloud中多并行分支运行的设计技巧

在大数据处理领域,ETL(Extract, Transform, Load)流程是至关重要的一环,它涉及数据的提取、转换和加载,以确保数据的质量和可用性。而在ETL流程中,多并行分支的运行设计是一项关键技巧,可以有效…

华为ensp中MSTP多网段传输协议(原理及配置命令)

作者主页:点击! ENSP专栏:点击! 创作时间:2024年4月22日15点29分 在华为ENSP中,MSTP(多段传输协议)是重要的生成树协议,它扩展了STP(生成树协议&#xff09…

Java 判断当前时间是否在指定时间区间内

栗子:21:30:00 至 08:30:00 时间段内。 import java.time.Instant; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZoneId; import java.util.Date;public class Demo {public static void main(String[] args) {// 创建一个Date…

猴子摘桃问题(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int sum 1;int i 0;//运算&#xff1b;for (i 1; i < 10; i){//运算&#xff1b;sum …

Docker 部署Java程序以及常用命令详解

文章目录 关于 docker 安装以及部署项目1. CentOS 中安装 Docker2. VMware中镜像拉取失败3. idea 远程连接Docker4. dockerfile 部署 springboot 项目5. 创建JDK运行环境配置6. docker 查询容器运行日志7. docker 容器将镜像中的文件拷贝到宿主机8. docker 部署mysql9. 容器中下…

typecho博客的相对地址实现

typecho其中的博客地址,必须写上绝对地址,否则在迁移网址的时候会出现问题,例如页面记载异常 修改其中的 typecho\var\Widget\Options\General.php 中的165行左右, /** 站点地址 */if (!defined(__TYPECHO_SITE_URL__)) {$siteUrl new Form\Element\Text(siteUrl,null,$this-…

怎么把3d模型旋转加复制---模大狮模型网

在3D设计中&#xff0c;旋转和复制模型是常见且重要的操作&#xff0c;它们可以帮助设计师创建复杂的场景并节省时间。本文将介绍如何在3D建模软件中旋转并复制模型&#xff0c;以及一些技巧和注意事项&#xff0c;帮助您轻松实现这些操作。 旋转3D模型&#xff1a; 旋转3D模型…

心理学|变态心理学健康心理学——躯体疾病患者的一般心理特点

一、对客观世界和自身价值的态度发生改变 患者除了内部器官有器质或功能障碍外&#xff0c;他们的自我感觉和整个精神状态也会发生变化。使人改变对周围事物的感受和态度&#xff0c;也可以改变患者对自身存在价值的态度。这种主观态度的改变&#xff0c;可以使患者把自己置于人…