kornia库ssim使用,Invalid image shape

一、图像张量转四维

将图像张量转换为四维张量的原因-训练神经网络 - 知乎

img1 = cv2.imread('OCT3.png') #读入一张图像
img1 = cv2.resize(img1,(256,256)) #修改尺寸为256*256
img1 = np.array(img1)
tensor = transforms.ToTensor()
img_tensor = tensor(img1) #转化成张量形式,此时的shape是(3,256,256)
img_tensor1 = img_tensor.unsqueeze(0) #有时候需要四维张量运算,把三维变成四维,此时的shape是(1,3,256,256)

       将numpy类型转换为tensor类型:[h, w, c]->[c, h, w]

       还要将tensor类型转换成四维张量:[c, h, w]->[b, c, h, w] 这是什么原因呢?

       其实在深度学习和计算机视觉中,将图像张量转换为四维张量的原因主要与批量处理和神经网络的输入要求有关。以下是详细解释:

  1. 批量处理:在训练神经网络时,通常一次处理多个图像,这称为批量处理。批量处理可以提高计算效率,因为在许多情况下,矩阵运算可以在现代硬件(如GPU)上并行执行。因此,将多个图像组合成一个四维张量可以加速训练过程。四维张量的形状为 (B, C, H, W),其中B是批量大小,表示同时处理的图像数量。
  2. 神经网络输入要求:大多数神经网络(尤其是卷积神经网络)在设计时就考虑了批量处理。这意味着它们的输入要求通常是四维张量,即使您只处理单个图像,也需要将其转换为四维张量。在这种情况下,批量大小为1,张量的形状为 (1, C, H, W)。

       通过将图像张量转换为四维张量,您可以确保它与神经网络的输入要求兼容,并充分利用批量处理带来的计算优势。

二、问题:Invalid image shape, we expect BxCxHxW. Got:

   (pip install kornia,需安装kornia库之后使用,具体代码在github上)

     查看ssim源代码如下,需要四维。一般图片转成张量是三维

if not len(image.shape) == 4: raise ValueError(f"Invalid image shape, we expect BxCxHxW. Got: {image.shape}")

       

       图像转tensor张量,需要先加一维,img_tensor1.unsqueeze(0),进行处理后,如果需要显示,再缩减一维才可以显示为图片tensor1.squeeze(0)。

三、使用ssim函数进行两个图片比较的代码如下(可以选择叠加显示两个图,或者单独显示):

picture_show_single()函数帮助将ssim结果图和原图叠加显示。没有此需要的话直接img3.show()即可

import matplotlib.pyplot as plt
from torchvision import transforms
import kornia.metrics as k
import cv2
import numpy as np
plt.rc("font", family='Microsoft YaHei')# img3.show()
def picture_show_double(img1,img2):img1=np.array(img1)img_result= cv2.addWeighted(img1,0.7,img2,0.3,10)# img_result = cv2.resize(src=img_result, dsize=None, fx=1.5, fy=1.5, interpolation=cv2.INTER_CUBIC)fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(8,8),dpi=100)axes[0].set_title("ssim对比结果")axes[0].imshow(img2[:,:,::-1])axes[1].set_title("不同位置与原图叠加结果")axes[1].imshow(img_result[:,:,::-1])plt.axis('off')plt.show()def picture_show_single(img1,img2):img_result= cv2.addWeighted(img1,0.7,img2,0.3,10)plt.plot(figsize=(8,8))plt.imshow(img2[:, :, ::-1])plt.axis('off')plt.show()plt.imshow(img_result[:, :, ::-1])plt.axis('off')plt.show()def ssim_test():img1 = cv2.imread(r'Figure_1.png')img2 = cv2.imread(r'Figure_2.png')# img1=np.array(img1)print(img1.shape, img2.shape)transform = transforms.ToTensor()img_tensor1 = transform(img1)print(len(img_tensor1.shape))img_tensor11 = img_tensor1.unsqueeze(0)print(len(img_tensor11.shape))img_tensor2 = transform(img2).unsqueeze(0)print(len(img_tensor2.shape), img_tensor11.shape, img_tensor2.shape)result_tensor = k.ssim(img_tensor11, img_tensor2, 5)result_tensor = result_tensor.squeeze(0)transform = transforms.ToPILImage()img3 = transform(result_tensor)img3.show()img3 = np.array(img3)picture_show_single(img1, img3)ssim_test()

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

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

相关文章

Linux docker3--数据卷-nginx配置示例

一、因为docker部署服务都是以最小的代价部署,所以通常在容器内部很多依赖和命令无法执行。进入容器修改配置的操作也比较麻烦。本例介绍的数据卷作用就是将容器内的配置和宿主机文件打通,之后修改宿主机的配置文件就相当于修改了docker进程的配置文件&a…

webgl浏览器渲染设置

在浏览器中程序图形化webgl渲染时,有时候发现代码没有问题,但是就是无法渲染或者渲染报错,此时可以尝试如下的设置: 通过在chrome浏览器输入chrome://flags打开扩展 设置一(webgl开发者扩展) 设…

复习Day2

AcWing 1214. 波动数列 - AcWing j(n-1)*b与前i-1项的和模n余数相同: 记前i项的和为x,则有 x%nj ,第i项为 -(n-1)b , 前i项的和为 x-(-(n-1)b)即 x(n-1)b , 而 x(n-1)b % n j (n-1)b % n 就是 x(n-1)b 在模n的情况下同余于 x%n (n-1)*b 对于加法,减法,乘法 什么…

2024华为OD统一考试(C卷)最新题库(Java Python C++)

关于华为OD ​ 华为的员工补充途径有三种,分别是校招、OD转正和社招。校招是华为唯一的正式员工入职途径,但是从近几届开始竞争非常激烈,尤其是在CV、AI、NLP等赛道上,所以对于C9等专业的学生来说,可以考虑转向一些冷…

Linux镜像文件下载地址--SCAS 开源镜像站,速度快

SCAS 开源镜像站 https://mirror.iscas.ac.cn/举例: 下载centos7 Index of /centos/7/isos/x86_64/ (iscas.ac.cn)

ARM实验 LED流水灯

.text .global _start _start: 使能GPIOE GPIOF的外设时钟 RCC_MP_AHB4ENSETR的第[4][5]设置为1即可使能GPIOE GPIOF时钟 LDR R0,0X50000A28 指定寄存器地址 LDR R1,[R0] 将寄存器原来的数值读取出来&#xff0c;保存到R1中 ORR R1,R1,#(0x3<<4) 将第4位设置为1 S…

Linux网络协议栈从应用层到内核层②

文章目录 1、bind 源码剖析2、listen 源码剖析3、accept 源码剖析4、connect 源码剖析客户端调用connect成功&#xff0c;但三次握手并未完成&#xff0c;进程是如何阻塞自己客户端在connect时&#xff0c;如何选择源端口客户发送syn封包以及重传服务端收到syn封包&#xff0c;…

AIGC摩尔定律

关于AIGC(Artificial Intelligence Generated Content,人工智能生成内容)领域的“摩尔定律”,这是一个比喻性的概念,用来描述AI模型尤其是深度学习模型在算力、效率以及能力方面的指数级增长趋势。传统的摩尔定律是指集成电路上可容纳的晶体管数量大约每两年翻一番,从而带…

算法公式汇总

文章目录 三角函数定义式诱导公式平方关系两角和与差的三角函数积化和差公式和差化积公式倍角公式半角公式万能公式其他公式反三角函数恒等式 三角函数定义式 三角函数 定义式 余切&#xff1a; c o t A 1 t a n A \text { 余切&#xff1a;} \ cotA \frac{1}{tanA} 余切&a…

Java面向对象编程面试题

序号问题详细答案1什么是类与对象&#xff1f;类和对象实例之间的关系&#xff1f; 类具有继承、数据隐藏和多态三种主要特性。类是同一类对象实例的共性的抽象&#xff0c;对象是类的实例化&#xff1b;类是静态的&#xff0c;对象是动态的&#xff0c;对象可以看作是运行中…

微店获得店铺的所有商品 API 返回值说明

一、应用场景 店铺的所有商品API接口具有广泛的应用场景&#xff0c;主要涉及到电商平台的运营、数据分析、用户体验提升以及第三方应用集成等方面。 首先&#xff0c;对于电商平台而言&#xff0c;店铺的所有商品API接口是获取商品信息的核心途径。通过调用这个接口&#xf…

x-zse-96安卓端纯算,魔改AES还原

两天前发了一个x-zse-96的文章,当时遇到了点问题,只分析到了最后一个白盒AES函数里面,并且当时用dfa攻击还原出了秘钥,IV也确定了,但是加密结果不对,本来打算把下文鸽掉的,因为当时unidbg没跑起来,用frida去hook白盒AES中的每一行汇编有点麻烦,没有unidbg方便.后来小白大佬说un…

内网渗透(一)必须了解Windows工作组

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将信息做其他用途&#xff0c;由Ta承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 1、内网渗透测试简介 内网也叫局域网&#xff0c;是指在…

代码随想录学习Day 14

104.二叉树的最大深度 题目链接 讲解链接 本题很容易想到采用层次遍历的思路来解决&#xff0c;因为要求的是二叉树的最大深度&#xff0c;那么在进行层次遍历的时候设置一个变量count用来记录当前遍历的层数&#xff0c;count初始为0&#xff0c;每遍历完一层将其值1&#…

《自动机理论、语言和计算导论》阅读笔记:p1-p4

《自动机理论、语言和计算导论》学习第1天&#xff0c;p1-p4&#xff0c;总计4页。这只是个人的学习记录&#xff0c;因为很多东西不懂&#xff0c;难免存在理解错误的地方。 一、技术总结 1.有限自动机(finite automata)示例 1.software for checking digital circuits。 …

工作需求,Vue实现登录

加油&#xff0c;新时代打工人&#xff01; vue 2.x Element UI <template><div class"body" :style"{background-image: url(${require(/assets/images/login.png)})}"><el-form :rules"rules" ref"loginForm" :mode…

MySQL 中的索引

MySQL 中的索引 一、索引的创建和删除1.主键会自动添加索引2.unique 约束的字段自动添加索引3.给指定的字段添加索引4.删除指定索引5.查询表上的索引 二、索引的分类三、MySQL索引采用了B树数据结构1.B树的经典面试题 四、其他索引及相关调优1.Hash索引2.聚集索引和非聚集索引3…

【linux线程(四)】初识线程池手撕线程池

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux线程池 1. 前言2. 什么是…

Python 从0开始 一步步基于Django创建项目(3)使用Admin site管理数据模型

本文内容建立在《Python 从0开始 一步步基于Django创建项目&#xff08;2&#xff09;创建应用程序&数据模型》的基础上。 Django提供的admin site&#xff0c;使得网站管理员&#xff0c;能够轻松管理网站的数据模型。 本文首先创建‘管理员账户’&#xff0c;即超级用户…

最长上升子序列的动态规划:暴力dfs + 记忆化搜索 + dp

LIS &#xff0c;&#xff08;Longest Increasing Subsequence&#xff09;本题链接&#xff1a;895. 最长上升子序列 - AcWing题库 给定一个长度为 N的数列&#xff0c;求数值严格单调递增的子序列的长度最长是多少。 目录 方法一&#xff1a;暴力dfs 方法二&#xff1a;记忆…