我有一个情况,我需要使用ImageFolder与albumentations库,使pytorch的扩增-自定义dataloader是不是一个选项。
为此,我被难住了,我不能让ImageFolder与Albumenations一起工作。我已经尝试了沿着这些路线的东西:
class Transforms:
def __init__(self, transforms: A.Compose):
self.transforms = transforms
def __call__(self, img, *args, **kwargs):
return self.transforms(image=np.array(img))['image']
然后:
trainset = datasets.ImageFolder(traindir,transform=Transforms(transforms=A.Resize(32 , 32)))
其中traindir
是带有图像的目录。但是我得到了一个奇怪的错误:
RuntimeError: Given groups=1, weight of size [16, 3, 3, 3], expected input[1024, 32, 32, 3] to have 3 channels, but got 32 channels instead
我似乎找不到一个可复制的例子,使一个简单的aug管道与imagefolder工作。
- 更新 * 在@Shai的建议下,我现在这样做了:
class Transforms:
def __init__(self):
self.transforms = A.Compose([A.Resize(224,224),ToTensorV2()])
def __call__(self, img, *args, **kwargs):
return self.transforms(image=np.array(img))['image']
trainset = datasets.ImageFolder(traindir,transform=Transforms())
但我被甩了
self.padding, self.dilation, self.groups)
RuntimeError: Input type (torch.cuda.ByteTensor) and weight type (torch.cuda.FloatTensor) should be the same
3条答案
按热度按时间pdtvr36n1#
你需要使用
ToTensorV2
转换作为最后一个:n3ipq98p2#
通过查看PyTorch上的ImageFolder实现[链接]和Kaggle中的一些建议工作[ link ]。我提出了以下解决方案(从我这边成功测试):
现在你可以运行代码如下:
b1payxdu3#
Albumentations库利用opencv将图像表示为numpy数组,因此您必须提供一个可调用的加载器函数,将img返回为numpy数组,该数组可以传递给albummentation转换。