python - 是否可以在 transform.compose 中使用非 pytoch 增强
问题描述
我正在研究一个将图像作为 Pytorch 输入的数据分类问题。我想使用 imgaug 库,但不幸的是我不断收到错误。这是我的代码。
#import necessary libraries
from torch import nn
from torchvision import models
import imgaug as ia
import imgaug.augmenters as iaa
from torchvision import datasets
from torch.utils.data.dataloader import DataLoader
from torchvision import transforms
from torch import optim
import numpy as np
from PIL import Image
import glob
from matplotlib import image
#preprocess images
#create data transformers
seq = iaa.Sequential([iaa.Sometimes(0.5,iaa.GaussianBlur(sigma=(0,3.0))),
iaa.Sometimes(0.5,iaa.LinearContrast((0.75,1.5))),
iaa.AdditiveGaussianNoise(loc=0,scale=(0.0,0.05*255),per_channel=0.5),
iaa.Sometimes(0.5,iaa.Affine(
scale={"x": (0.8, 1.2), "y": (0.8, 1.2)},
translate_percent={"x": (-0.2, 0.2), "y": (-0.2, 0.2)},
rotate=(-25, 25),
shear=(-8, 8)))],random_order=True)
train_transformation = transforms.Compose([transforms.RandomResizedCrop(300),
seq,
transforms.ToTensor()])
train_data = datasets.ImageFolder(root = 'train')
train_loader = DataLoader(train_data,shuffle = True,batch_size = 32,num_workers = 0)
train_iter = iter(train_loader)
train_iter.next()
Jupyter Server: local
Python 3.8.4 64-bit: Idle
CNN Cancer Detector
Melanoma
Intro
Skin cancer is the most common form of cancer, with 1 in 5 Americans developping it by the time they reach 70 years old. Over 2 people die of skin cancer in the US every hour.[1] Early detection is key in saving peoples lives with skin cancer, with the early detection 5 year survival rate being 99%[1]. Dermatologist have to look at patients one by one, and must assess by eye whether or not a blemish is malignant or benign. Dermatologist's have around a 66% accuracy rate in assessing 752 different skin diseases, while CNN's, such as the one detailed in *Dermatologist-level classification of skin cancer with deep neural networks* published in Nature have achieved greater accuracy levels then dermatologist's, around 72.1%[2].
By converting cancer detection to easily deployable software, you could allow people to get accurate cancer testing at home, saving resources and time. By making cancer detection more accesible, people would be more likely to get tested, saving lives in the process. Below I will detail my process and results from a melanoma (the most deadly form of skin cancer) detector model using CNN's.
[2]
from PIL import Image
import glob
from matplotlib import image
[3]
#preprocess images
#create data transformers
seq = iaa.Sequential([iaa.Sometimes(0.5,iaa.GaussianBlur(sigma=(0,3.0))),
iaa.Sometimes(0.5,iaa.LinearContrast((0.75,1.5))),
iaa.AdditiveGaussianNoise(loc=0,scale=(0.0,0.05*255),per_channel=0.5),
iaa.Sometimes(0.5,iaa.Affine(
scale={"x": (0.8, 1.2), "y": (0.8, 1.2)},
translate_percent={"x": (-0.2, 0.2), "y": (-0.2, 0.2)},
rotate=(-25, 25),
shear=(-8, 8)))],random_order=True)
…train_iter = iter(train_loader)
train_iter.next()
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
in
20 train_loader = DataLoader(train_data,shuffle = True,batch_size = 32,num_workers = 0)
21 train_iter = iter(train_loader)
---> 22 train_iter.next()
D:\Python\lib\site-packages\torch\utils\data\dataloader.py in __next__(self)
343
344 def __next__(self):
--> 345 data = self._next_data()
346 self._num_yielded += 1
347 if self._dataset_kind == _DatasetKind.Iterable and \
D:\Python\lib\site-packages\torch\utils\data\dataloader.py in _next_data(self)
383 def _next_data(self):
384 index = self._next_index() # may raise StopIteration
--> 385 data = self._dataset_fetcher.fetch(index) # may raise StopIteration
386 if self._pin_memory:
387 data = _utils.pin_memory.pin_memory(data)
D:\Python\lib\site-packages\torch\utils\data\_utils\fetch.py in fetch(self, possibly_batched_index)
45 else:
46 data = self.dataset[possibly_batched_index]
---> 47 return self.collate_fn(data)
D:\Python\lib\site-packages\torch\utils\data\_utils\collate.py in default_collate(batch)
77 elif isinstance(elem, container_abcs.Sequence):
78 transposed = zip(*batch)
---> 79 return [default_collate(samples) for samples in transposed]
80
81 raise TypeError(default_collate_err_msg_format.format(elem_type))
D:\Python\lib\site-packages\torch\utils\data\_utils\collate.py in (.0)
77 elif isinstance(elem, container_abcs.Sequence):
78 transposed = zip(*batch)
---> 79 return [default_collate(samples) for samples in transposed]
80
81 raise TypeError(default_collate_err_msg_format.format(elem_type))
D:\Python\lib\site-packages\torch\utils\data\_utils\collate.py in default_collate(batch)
79 return [default_collate(samples) for samples in transposed]
80
---> 81 raise TypeError(default_collate_err_msg_format.format(elem_type))
TypeError: default_collate: batch must contain tensors, numpy arrays, numbers, dicts or lists; found
我知道 imgaug 转换器的输入必须是一个 numpy 数组,但我不确定如何将它合并到我的 transform.compose 中(如果我可以的话。)。当 imgaug seq 不在 transform.compose 中时,它可以正常工作。
感谢您的帮助!
解决方案
查看 pytorch 中的转换文档给我们一个提示:https ://pytorch.org/docs/stable/torchvision/transforms.html#generic-transforms
我会尝试类似的东西:
train_transformation = transforms.Compose([transforms.RandomResizedCrop(300),
transforms.Lambda(lambda x: seq(x)),
transforms.ToTensor()])
推荐阅读
- c# - 为什么线程 IsAlive 即使在线程内执行最后一个命令后仍返回 false
- android - 在我的开发 Android 应用程序上设置 crashlytics 时要进行哪些主要调整?
- r - 使用 get() 从包中调用函数而不加载包
- php - PHP7.3 GD 标头版本和 GD 库版本不匹配
- python - 第一个 if 条件有效,但 elif 条件无效
- r - 我的代码将作为一个块运行,但是当我尝试编织时给我一个错误
- c# - 如何使用 FileHelpers 将动态对象写入文件?
- swift - 为什么我的 NSWindow 在以编程方式创建时不会浮在全屏应用程序之上?(斯威夫特 5)
- spring-kafka - 使用 Spring Kafka 从 ConsumerRebalanceListener 访问消费者对象
- kubernetes - Openshift: How to access the file that is in the external file system?