回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我对Pythorch中执行的数据扩充有点困惑。在</p>
<p>因为我们处理的是分割任务,所以我们需要数据和掩码来进行相同的数据扩充,但是有些数据是随机的,比如随机旋转。在</p>
<p>Keras提供<code>random seed</code>保证数据和掩码执行相同的操作,如下面的代码所示:</p>
<pre><code> data_gen_args = dict(featurewise_center=True,
featurewise_std_normalization=True,
rotation_range=25,
horizontal_flip=True,
vertical_flip=True)
image_datagen = ImageDataGenerator(**data_gen_args)
mask_datagen = ImageDataGenerator(**data_gen_args)
seed = 1
image_generator = image_datagen.flow(train_data, seed=seed, batch_size=1)
mask_generator = mask_datagen.flow(train_label, seed=seed, batch_size=1)
train_generator = zip(image_generator, mask_generator)
</code></pre>
<p>我在Pythorch官方文档中没有找到类似的描述,所以我不知道如何确保数据和掩码可以同步处理。在</p>
<p>Pythorch确实提供了这样一个函数,但是我想将它应用到一个定制的数据加载器。在</p>
<p>例如:</p>
^{pr2}$
<p>在这种情况下,img和mask将分别进行变换,因为随机旋转等操作是随机的,因此掩模和图像之间的对应关系可能会改变。换句话说,图像可能已经旋转,但遮罩没有这样做。在</p>
<h2>编辑1</h2>
<p>我在<a href="https://github.com/a514514772/DISE-Domain-Invariant-Structure-Extraction/blob/master/util/loader/augmentations.py" rel="nofollow noreferrer">augmentations.py</a>中使用了该方法,但出现了一个错误:</p>
<pre><code>Traceback (most recent call last):
File "test_transform.py", line 87, in <module>
for batch_idx, image, mask in enumerate(train_loader):
File "/home/dirk/anaconda3/envs/pytorch/lib/python3.6/site-packages/torch/utils/data/dataloader.py", line 314, in __next__
batch = self.collate_fn([self.<a href="https://www.cnpython.com/pypi/dataset" class="inner-link">dataset</a>[i] for i in indices])
File "/home/dirk/anaconda3/envs/pytorch/lib/python3.6/site-packages/torch/utils/data/dataloader.py", line 314, in <listcomp>
batch = self.collate_fn([self.dataset[i] for i in indices])
File "/home/dirk/anaconda3/envs/pytorch/lib/python3.6/site-packages/torch/utils/data/dataset.py", line 103, in __getitem__
return self.dataset[self.indices[idx]]
File "/home/dirk/home/data/dirk/segmentation_unet_pytorch/data.py", line 164, in __getitem__
img, mask = self.transforms(img, mask)
File "/home/dirk/home/data/dirk/segmentation_unet_pytorch/augmentations.py", line 17, in __call__
img, mask = a(img, mask)
TypeError: __call__() takes 2 positional arguments but 3 were given
</code></pre>
<p>这是我的<code>__getitem__()</code>的代码:</p>
<pre><code>data_transforms = {
'train': Compose([
RandomHorizontallyFlip(),
RandomRotate(degree=25),
transforms.ToTensor()
]),
}
train_set = DatasetUnetForTestTransform(fold=args.fold, random_index=args.random_index,transforms=data_transforms['train'])
# __getitem__ in class DatasetUnetForTestTransform
def __getitem__(self, index):
img = np.zeros((self.im_ht, self.im_wd, channel_size))
mask = np.zeros((self.im_ht, self.im_wd, channel_size))
temp_img = np.load(Label_path + '{:0>4}'.format(self.patient_index[index]) + '.npy')
temp_label = np.load(Label_path + '{:0>4}'.format(self.patient_index[index]) + '.npy')
temp_img, temp_label = crop_data_label_from_0(temp_img, temp_label)
for i in range(channel_size):
img[:,:,i] = temp_img[self.count[index] + i]
mask[:,:,i] = temp_label[self.count[index] + i]
if self.transforms:
img = T.ToPILImage()(np.uint8(img))
mask = T.ToPILImage()(np.uint8(mask))
img, mask = self.transforms(img, mask)
img = T.ToTensor()(img).copy()
mask = T.ToTensor()(mask).copy()
return img, mask
</code></pre>
<h2>编辑2</h2>
<p>我发现在ToTensor之后,相同标签之间的骰子变成了255而不是1,如何修复它?在</p>
<pre><code># Dice computation
def DSC_computation(label, pred):
pred_sum = pred.sum()
label_sum = label.sum()
inter_sum = np.logical_and(pred, label).sum()
return 2 * float(inter_sum) / (pred_sum + label_sum)
</code></pre>
<p>如果需要更多的代码来解释这个问题,请随时询问。在</p>