Image_preprocessing

23008 ワード

長さaixsに基づいて、残りの部分は0(黒)に塗りつぶされますが、中心は変わりません。

os.chdir('/home/mskang/hyeokjong/cancer/2018/task1/ISIC2018_Task1-2_Training_Input')

train_inputs_list = os.listdir('/home/mskang/hyeokjong/cancer/2018/task1/ISIC2018_Task1-2_Training_Input')
train_inputs_list.remove('ATTRIBUTION.txt')
train_inputs_list.remove('LICENSE.txt')
# len(train_inputs_list)

for i in tqdm(range(len(train_inputs_list))):
    os.chdir('/home/mskang/hyeokjong/cancer/2018/task1/ISIC2018_Task1-2_Training_Input')
    img = Image.open(train_inputs_list[i])
    imgArray = np.array(img)
    a,b,_ = imgArray.shape
    if a >= b:
        z = np.zeros(( a, (a-b)//2 , 3))
        con = np.concatenate( [z,imgArray,z], axis=1)
    else:
        z = np.zeros(((b-a)//2 , b , 3))
        con = np.concatenate( [z,imgArray,z], axis=0)
    con = con.astype('uint8')
    padded_image = Image.fromarray(con)
    os.chdir('/home/mskang/hyeokjong/cancer/2018/task1/train_input_pad')
    padded_image.save('padded_' + train_inputs_list[i] + '.jpg')
    

Segmentationでは、次のようにサイズを変更すると、各ピクセルが「int」ではなく「地面真実」(target)から「浮動小数点」に変わります。


私はただ考えているだけで、たぶん調整すればいいと思っています.私は間違っています.
class custom_dataset(Dataset):
    
    def __init__(self, inputs_dir , targets_dir, transform = None):
        
        self.inputs_dir = inputs_dir 
        self.inputs_list =  os.listdir(inputs_dir)
        
        self.targets_dir = targets_dir
        self.targets_list =  os.listdir(targets_dir)      
        
        self.transform = transform
        
        
    def __len__(self):
        return len(self.inputs_list)
    
    def __getitem__(self,idx):
        os.chdir(self.inputs_dir)
        input_image = Image.open(self.inputs_list[idx])
        
        os.chdir(self.targets_dir)
        target_image = Image.open(self.targets_list[idx])
        
        if self.transform:
            input_image_tensor = self.transform(input_image)
            target_image_tensor = self.transform(target_image)

            
        return ( input_image_tensor ,target_image_tensor)
        

path_train_inputs = '/home/mskang/hyeokjong/cancer/2018/task1/train_input_pad'
path_train_targets = '/home/mskang/hyeokjong/cancer/2018/task1/train_targets_pad'

train_dataset = custom_dataset(path_train_inputs, path_train_targets )

train_transformation = transforms.Compose([transforms.Resize(4),
                        transforms.RandomHorizontalFlip(),
                        transforms.ToTensor()])
train_dataset.transform = train_transformation


batch_size = 2
train_dl = DataLoader(train_dataset, batch_size, shuffle=True,
                      num_workers=4, pin_memory=True)
                      
           
           
          
          
          
for i,j in train_dl:
    inputs,targets = i,j
    break
    
    
    
    
    
inputs.shape
---------------------------
torch.Size([2, 3, 4, 4])




targets.shape
---------------------------
torch.Size([2, 1, 4, 4])





targets
---------------------------
tensor([[[[0.0000, 0.0157, 0.0196, 0.0000],
          [0.0314, 0.4510, 0.4784, 0.0157],
          [0.0471, 0.4314, 0.4000, 0.0196],
          [0.0000, 0.0000, 0.0000, 0.0000]]],


        [[[0.0000, 0.0000, 0.0000, 0.0000],
          [0.0000, 0.0314, 0.0588, 0.0000],
          [0.0000, 0.0471, 0.0824, 0.0000],
          [0.0000, 0.0000, 0.0000, 0.0000]]]])


Resizeの方法もいろいろありますが、上記のようにResizeを実行するとfloatがスムーズに計算されて生成されます.
上のコードを見てください.Custom_datasetでは、変換は対応可能であり、直接データセット上で変換され、.transformに変換されるが、速度差はない.(考えてみれば、二人はまるで同じようです)

実験が進む


すなわち、targetはtransforms.Resize()を使用できない.
では、一定の解決策がありますが、上記のコードのように.transformでやるとinputとtargetは同じ変換を採用するので、当初はdataset classに異なる変換を適用すればいいと思います.torch.nn.functional.interpolate(input, size=None, scale_factor=None, mode='nearest', align_corners=None, recompute_scale_factor=None)mode調整
  • は違う方法で使えますか?
  • 考えましたが、私はFCNモデルを使っていますが、どうして大きさを調整するのですか?
  • もちろん、FCN分類モデルの場合はサイズを調整する必要があります.でもtargetはサイズを調整しませんlabelなので
  • で分割でサイズを調整する場合はありますか?
  • 2479172の可変サイズの画像はFCNモデルでは可能であるが、torchのdataloaderは同じサイズしか受け入れられないためpytorchで実現するには問題がある.
    2つの解決策があります
    1つ目は、本明細書で説明するresizeです.
    2つ目はダイレクトエンコーディングトレーニング(どうせ反復器)またはdataloaderの作成です.( custom collate_fn )
    https://discuss.pytorch.org/t/how-to-create-a-dataloader-with-variable-size-input/8278/2
    しかしなぜcustom collate fnのキャラクターは0を加えてサイズを調整するのかもちろん最初の計算は速いです.
    追加のcustom collate fnが極端に異なるサイズの画像であることを考慮する必要がある場合、同じモデルを使用するのはよくないので、reizeは正しい.
    割合を維持する問題があるだけです.
    ほとんどのコードはclass部分で変換されます.これが原因です.
    解決策は以下の通り.
    1.torch.nn.functional.interpolatetorch.nn.Upsampleが2つのpytorchに内蔵されています.
    2.https://pytorch.org/vision/stable/transforms.htmlを見てtorchvision.transforms.Resize(size, interpolation=<InterpolationMode.BILINEAR: 'bilinear'>, max_size=None, antialias=None)でモードを指定できます.
    3.custom transformation classを作成すればよい.
    つまり、変換.Component([])で要素を入れる必要があるのはクラスであることがわかります.
    2番が一番気持ちがいい
    lossと同様にfunctionとclassの2つのクラスがあり、classが継承されるとカスタマイズしやすい.
    この部分はよくできているような気がします
    https://stackoverflow.com/questions/23853632/which-kind-of-interpolation-best-for-resizing-image
    どんな補間がいいですか.
    ㅄㅄㅄㅄㅄㅄㅄㅄㅄㅄ