pytorch debug 常用工具

news/2025/1/25 20:47:40

自动辨识图像格式可视化

import numpy as np
import matplotlib.pyplot as plt
from PIL import Imagedef convert_to_numpy(image_input):"""自动检测输入图像类型,并将其转换为NumPy数组。"""if isinstance(image_input, np.ndarray):# 输入已经是NumPy数组,直接返回return image_inputelif 'Tensor' in str(type(image_input)):# 输入是Tensor类型# 检查是否需要转换(依赖于Tensor所属的库,如PyTorch, TensorFlow等)if hasattr(image_input, 'detach'):# 假设是PyTorch Tensorimage_input = image_input.detach().cpu().numpy()else:# 假设是TensorFlow Tensor或其他框架的Tensorimage_input = image_input.numpy()# 如果Tensor有通道维度在最前面(如CHW),则需要转换为HWCif image_input.ndim == 3 and image_input.shape[0] in (1, 3):image_input = image_input.transpose(1, 2, 0)elif isinstance(image_input, Image.Image):# 输入是Pillow图像,转换为NumPy数组image_input = np.array(image_input)else:raise TypeError("Unsupported image type")# 如果图像是单通道的,且在最后一个维度(例如HxWx1),去掉该维度if image_input.ndim == 3 and image_input.shape[-1] == 1:image_input = image_input.squeeze(-1)image_np = image_input if image_np.ndim == 3 and image_np.shape[-1] == 3:plt.imshow(image_np)else:plt.imshow(image_np, cmap='viridis')plt.title(title)plt.axis('off')plt.show()def visualize_image(image_np, title="Image"):"""可视化NumPy格式的图像"""if image_np.ndim == 3 and image_np.shape[-1] == 3:plt.imshow(image_np)else:plt.imshow(image_np, cmap='gray')plt.title(title)plt.axis('off')plt.show()# 示例使用
# image_tensor, image_np, image_pil 分别代表Tensor, NumPy数组, Pillow图像的输入
# 将它们转换为NumPy数组
# image_np = convert_to_numpy(image_tensor)
# image_np = convert_to_numpy(image_np)
# image_np = convert_to_numpy(image_pil)# # 可视化图像
# visualize_image(image_np)

可视化

张量可视化

import torch
from torchvision.transforms.functional import to_pil_image
from PIL import Image
def tensor_to_pil(tensor):# 确保tensor是在CPU上tensor = tensor.cpu()# 如果tensor有一个批次维度,去除它if tensor.dim() == 4 and tensor.shape[0] == 1:tensor = tensor.squeeze(0)# 转换为PIL图像pil_image = to_pil_image(tensor)# 返回PIL图像return pil_image

tensor_to_pil( ).show()

可视化已经图像信息

def draw_np(pic_np):pic_np = np.squeeze(pic_np)plt.imshow(pic_np)# 隐藏坐标轴plt.axis('on')# 显示数据标尺plt.colorbar()# 显示图像plt.show()

def get_image_info(image):# 获取图像的模式、格式和尺寸mode = image.modeformat_ = image.formatsize = image.size# 根据图像模式推断每个通道的位数if mode in ("1", "L", "P"):bits_per_channel = 8  # 通常是8位elif mode == "RGB":bits_per_channel = 8  # 通常是8位,3通道elif mode == "RGBA":bits_per_channel = 8  # 通常是8位,4通道elif mode == "I":bits_per_channel = 32 # 整数像素模式elif mode == "F":bits_per_channel = 32 # 浮点像素模式else:bits_per_channel = 'unknown'  # 未知或不常见的模式# 计算总位数total_bits = image.getbands().__len__() * bits_per_channel# 打印图像信息print(f"Image mode: {mode}")print(f"Image format: {format_}")print(f"Image size: {size}")print(f"Bits per channel: {bits_per_channel}")print(f"Total bits per pixel: {total_bits}")#%%
import numpy as npdef get_array_info(np_array):"""获取并打印NumPy数组的详细信息。参数:np_array: NumPy数组。"""# 获取数组的形状shape = np_array.shape# 获取数组的总元素数量size = np_array.size# 获取数组的数据类型dtype = np_array.dtype# 获取数组单个元素的大小(以字节为单位)itemsize = np_array.itemsize# 获取数组的维度数量ndim = np_array.ndim# 获取数组的总字节数nbytes = np_array.nbytes# 打印数组信息print(f"Array Shape: {shape}")print(f"Array Size: {size}")print(f"Array Data Type: {dtype}")print(f"Item Size: {itemsize} bytes")print(f"Array Dimensions: {ndim}")print(f"Total Bytes: {nbytes} bytes")
def read_pic(path_pic):# 加载图像image = Image.open(path_pic)print(image.size)print(image.format)return imagedef pic_to_np(pic):np_depth = np.array(pic)return np_depthdef draw_np(pic_np):pic_np = np.squeeze(pic_np)plt.imshow(pic_np)# 隐藏坐标轴plt.axis('on')# 显示数据标尺plt.colorbar()# 显示图像plt.show()def pic_info(path):raw_image = read_pic(path)raw_np = pic_to_np(raw_image)get_image_info(raw_image)get_array_info(raw_np)raw_image.show()draw_np(raw_np)

https://dhexx.cn/news/show-5177708.html

相关文章

spring集成mybatis简单教程

首先说下实现了什么效果,就是不用每次查询前手动创建 sessionFactory和添加datasource文件了。 整个工程结构是这样的 这次我也把代码放在了gitee上,方便大家更全貌的看到所有的实现细节。代码链接如下: Java: 一些Java代码 (gitee.com) …

2024年网络安全竞赛-网站渗透

网站渗透 (一)拓扑图 1.使用渗透机对服务器信息收集,并将服务器中网站服务端口号作为flag提交; 使用nmap工具对靶机进行信息收集 2.使用渗透机对服务器信息收集,将网站的名称作为flag提交; 访问页面即可 3.使用渗透机对服务器渗透,将可渗透页面的名称作为flag提交…

唯创知音WT2003Hx系列单片机语音芯片:家庭理疗产品的智能声音伴侣

随着科技的不断创新,家庭理疗产品正迎来一场智能化的变革。唯创知音的WT2003Hx系列单片机语音芯片以其强大的功能和高品质音频播放能力,为家庭理疗产品带来了更为智能、沉浸式的用户体验。 1. MP3高品质音频播放 WT2003Hx系列语音芯片支持高品质的MP3音…

【Flutter】创建应用顶级组件,应用根组件 (学习记录)

前言 在 Flutter 中,应用的顶级组件或根组件通常是在 main() 函数中通过 runApp() 方法创建的。这个组件通常是一个 MaterialApp、CupertinoApp、GetMaterialApp 或其他类似的应用框架组件。 以下是一个创建 MaterialApp 作为根组件的示例: void main()…

jupyter notebook搭建

搭环境残废在这里记录做个备注 配置jupyter pip install jupyter jupyter notebook --generate-config,有的环境已经有了可以省去这一步 vim ~/.jupyter/jupyter_notebook_config.py 在文件末尾插入下面几句代码 # 允许通过任意绑定服务器的ip访问 c.Noteboo…

利用Node.js和cpolar实现远程访问,无需公网IP和路由器设置的完美解决方案

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation&#xff0…

【链表Linked List】力扣-114 二叉树展开为链表

目录 题目描述 解题过程 官方题解 题目描述 给你二叉树的根结点 root ,请你将它展开为一个单链表: 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。展开后的单链表应…

Python开发运维:Python垃圾回收机制

目录 一、理论 1.Python垃圾回收机制 一、理论 1.Python垃圾回收机制 (1)引⽤计数器 1)环状双向链表 refchain 在python程序中创建的任何对象都会放在refchain链表中。 name "david" age 20 hobby ["篮球",游泳…

【小聆送书第二期】人工智能时代之AIGC重塑教育

🌈个人主页:聆风吟 🔥系列专栏:网络奇遇记、数据结构 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 📋正文📝活动参与规则 参与活动方式文末详见。 📋正文 AI正迅猛地…

uniapp图片预览

用的是Uview组件库里面的 直接在页面写上&#xff1a; <u-album singleSize"100" :urls"[https://lxt.jingyi.icu/item.img]"></u-album> 这图片路径是我自己的 你们可以按照组件库里面的方法去实现