pytorch中使用transforms.ToTensor()处理opencv获取的灰度图像问题
众所周知,opencv读取的图片的格式为BGR即(height,width,channel),而PIL读取的图片恰恰相反,为(channel,height,width),matplotlib中也是如此。
在此插一句:如果要使用matplotlib显示opencv读取的图片,需要将opencv读取的图片进行transpose。即:img = cv2.imread(filepath),img = img.transpose(2,0,1),即改变矩阵中元素的位置,使用的是numpy中的转置操作。
Pytorch中使用torchvision.transforms.ToTensor()
我遇到的错误是,在服务器上使用opencv读取图片后,将图片处理为灰度图后,img的shape为[height,width],没有表示通道的维,然后使用ToTensor()操作时报错,即因为缺少维度而无法转置。
然而在自己的电脑上进行同样的操作,能够成功。
此时,查看服务器和电脑上对torchvision.transforms的源代码,文件名为 functional. py,查看版本是否相同。
自己电脑上的版本中对此函数的书写
而服务器上的版本中没有if pic.ndim==2的判断。所以错误原因找到
如果遇到ToTensor报错,越界,则先查看源代码是否没有if判断。之后可以在源代码中修改,也可在自己的代码修改。增加if判断即可。
我自己的修改是在我的代码中。
解决方法
查看Anaconda3\Lib\site-packages\torchvision\transforms\functional.py文件中的ToTensor方法
是否如图所示
若没有,直接修改即可。