Colab中PyTorch保存张量图像到Google Drive生成PNG全黑问题
全黑图像的核心原因
这个问题和Google Drive的挂载逻辑没有关系,是PyTorch图像处理时两个常见的操作误区叠加导致的:
- 最核心的诱因:STL10通过PyTorch默认管线加载出的图像张量,是取值范围在[0,1]区间的32位浮点型。你直接调用
.type(torch.uint8)做类型转换时,不会自动把像素值域从0-1线性映射到0-255的无符号整型范围,而是直接对浮点值做截断取整。图像里绝大多数像素值都是0到1之间的小数,截断取整后全部变成0,最终整个张量被清零,存成PNG自然是纯黑色块。 - 之前用
plot.imshow能正常看到知更鸟图像,是因为imshow接收的是还没做错误类型转换的原始浮点张量,会自动按0-1的浮点值域做正常渲染,根本没察觉到后续的类型转换操作把所有像素值都清零了。 - 还有个潜在的格式坑:
torchvision.io.write_png要求输入张量必须是通道在前的CHW维度格式(形状为[通道数, 图像高度, 图像宽度]),如果张量是通道在后的HWC格式,哪怕值域计算正确,保存出的图像也会出现尺寸错乱、色彩异常的问题。
修正后的操作代码
from google.colab import drive drive.mount('/content/drive') # 接前面从STL10取出的原始image张量,默认是[3,96,96]形状、0-1范围的float32类型 # 先把值域从[0,1]线性缩放到[0,255],再转成uint8格式 robin = (image * 255).type(torch.uint8) # 仅当张量是HWC格式(形状为[高,宽,通道])时,才需要加这行做维度转换 # robin = robin.permute(2, 0, 1) # 正常执行保存即可 torchvision.io.write_png(robin, '/content/drive/My Drive/ImgFolder/robin.png')
验证方法:在执行保存前,打印
robin的最大值和最小值。如果用之前错误的转换方式,打印结果会是全0;修正后最大值应该接近255,最小值为0,此时保存出的图像就能正常显示内容了。
内容的提问来源于stack exchange,提问作者plotka
相关产品推荐
相关产品推荐

