如何获取图像中每个检测目标的像素值并解决张量转换报错
错误原因
你当前的报错核心是:列表cropped_imagesList中存储的每个bbox裁剪出来的图像形状(高、宽)不一致,PyTorch无法直接将形状不同的numpy数组转换为同一个张量,因此触发了维度匹配错误。
另外你的代码还存在边界越界的潜在问题:计算得到的x_start可能为负数、x_end可能超过图像宽度、y_start可能为负数、y_end可能超过图像高度,会导致裁剪出来的图像尺寸和预期不符,进一步加剧维度不一致的问题。
解决方法
根据你的使用需求可以选择以下两种方案:
方案1:保留每个目标的原始尺寸,单独存储
如果不需要把所有裁剪图像拼成一个批量张量,就不要直接对整个列表转张量,每个裁剪结果单独转张量存储即可。
方案2:统一裁剪图像尺寸后合并为批量张量
如果后续需要批量处理所有裁剪结果,就将所有裁剪后的图像统一resize到相同的宽高,再转换为张量。
修复后参考代码
import PIL.Image import numpy as np import torch # 如果需要统一resize可导入以下包 from torchvision import transforms # 读取图像逻辑不变 imgs = PIL.Image.open(img_path).convert('RGB') image_width, image_height = imgs.size imgArrays = np.array(imgs) # 坐标转换逻辑不变 X = (xCenter*image_width) Y = (yCenter*image_height) W = (Width*image_width) H = (Height*image_height) cropped_imagesList = [] # 可选:方案2需提前定义resize变换,可自定义统一尺寸,示例为224*224 resize = transforms.Resize((224, 224)) for i in range(len(X)): x1, y1, w, h = X[i], Y[i], W[i], H[i] x_start = int(x1 - (w/2)) y_start = int(y1 - (h/2)) x_end = int(x_start + w) y_end = int(y_start + h) # 新增:边界截断,防止坐标越界导致裁剪尺寸异常 x_start = max(0, x_start) y_start = max(0, y_start) x_end = min(image_width, x_end) y_end = min(image_height, y_end) temp = imgArrays[y_start: y_end, x_start: x_end] # 方案1实现:单独存储每个裁剪结果的张量,不需要统一尺寸 # single_crop_tensor = torch.as_tensor(temp) # cropped_imagesList.append(single_crop_tensor) # 方案2实现:统一resize后再存储,最终可合并为批量张量 temp_pil = PIL.Image.fromarray(temp) temp_resized = resize(temp_pil) cropped_imagesList.append(torch.as_tensor(np.array(temp_resized))) # 方案2:所有裁剪结果处理完成后,在循环外统一转为批量张量 cropped_images = torch.stack(cropped_imagesList)
像素值获取说明
裁剪得到的numpy数组temp或者转换后的张量,每个元素的数值就是对应bbox范围内的RGB像素值,你可以直接读取使用。

内容的提问来源于stack exchange,提问作者samah salim
相关产品推荐
相关产品推荐

