问题
在resize特征图或者视频序列的时候,为了简洁通常将多个特征图stack后处理。但是cv2.resize有一个在官方文档没有报导的问题,即当channel_size超过 512时就会报一个莫名其妙的错误,如:
---------------------------------------------------------------------------
error Traceback (most recent call last)
/home/__/__/__.ipynb Cell 2 in ()
1 import cv2
2 temp1 = np.random.randn(64, 64, 513)
----> 4 cv2.resize(temp1, (12, 12))
error: OpenCV(4.7.0) /io/opencv/modules/imgproc/src/resize.cpp:3699: error: (-215:Assertion failed) !dsize.empty() in function 'resize'
如果坚持使用cv2的话,只能将图像按通道分块处理。但是stack处理本来就是为了看起来简洁,又要分块实在受不了。
解决方法
pytorch的transform和functional都有类似resize的操作,考虑到transform写下来也比较臃肿,就用了functional的插值函数来写一个resize函数,如下:
import torch
import numpy as np
from torch.nn import functional as F
def torch_resize(images, size):
'''
cv2 resize的时候最高的通道数为512 通过torch 的interpolate处理超出512的图像
'''
temp_iamges = F.interpolate(torch.tensor(images).permute(2, 0, 1).unsqueeze(0),
size = size, mode='bilinear')
return np.array(temp_iamges.squeeze(0).permute(1, 2, 0))