跨模块传图像时np转list再还原输入Detectron2报Long类型错误
核心问题结论
将numpy数组通过tolist()转列表再转回的操作,确实会改变数组的固有属性,这是报错产生的核心原因。
具体原理拆解
- 原流程中,
cv2.imread读取得到的pg_image是默认uint8类型的NumPy数组,对应像素值范围0-255,完全兼容Detectron2、PyTorch的双线性上采样算子的输入要求,可被模型正常处理。 - 执行
pg_image.tolist()时,会把整个numpy数组拆解为嵌套的Python原生整数构成的列表,原数组携带的uint8类型信息会完全丢失,没有任何机制会在列表中保留numpy的类型标记。 - 接收端直接执行
np.array(列表内容)时,NumPy不会自动推断出原数组的类型,只会根据传入的Python原生int值,默认生成int64类型的数组——这个类型对应到PyTorch张量里就是报错提到的Long类型。 - 报错涉及的
upsample_bilinear2d_channels_last算子,本身没有针对Long类型的输入实现计算逻辑,遇到int64类型的张量输入时,会直接抛出未实现的RuntimeError。
对应解决方法
- 接收端转回数组时,不要依赖NumPy的自动类型推导,显式指定数据类型即可完全匹配原数组的属性:
pg_image = np.array(接收到的列表内容, dtype=np.uint8) - 跨模块传输图像数据时,更推荐传递序列化后的字节流而非嵌套列表,既可以大幅降低传输时的内存占用,也能从根源上避免自动类型推导带来的兼容问题。
内容的提问来源于stack exchange,提问作者Dawny33
相关产品推荐
相关产品推荐

