Pytorchによる二値分類学習時に生じるnot enough values to unpack (expected 2, got 1)

前提

pytorchを使って、白黒画像の二値分類を試みています。
学習フェーズで以下のようなエラーメッセージが生じます。
not enough values to unpack (expected 2, got 1)
何かしら入力が足りないという意味かと思いますが、どこに問題があるかご指摘いただきたいです。

実現したいこと

Pytorchを使った白黒画像を二値分類を実装する

発生している問題・エラーメッセージ

not enough values to unpack (expected 2, got 1)

エラーメッセージ not enough values to unpack (expected 2, got 1) ### 該当のソースコード # ライブラリ読み込み import glob import cv2 import numpy as np import os from torch.utils.data import DataLoader from torch.utils.data import Dataset as BaseDataset import torch import torch.nn as nn import torch.nn.functional as F import segmentation_models_pytorch as smp import albumentations as albu import matplotlib.pyplot as plt # データ確認用 def visualize(**images): """PLot images in one row.""" n = len(images) plt.figure(figsize=(16, 5)) for i, (name, image) in enumerate(images.items()): plt.subplot(1, n, i + 1) plt.xticks([]) plt.yticks([]) plt.title(' '.join(name.split('_')).title()) plt.imshow(image) plt.show() # データ拡張 def get_training_augmentation(): IMAGE_SIZE = 256 train_transform = [ albu.HorizontalFlip(p=0.5), albu.ShiftScaleRotate(scale_limit=0.5, rotate_limit=0, shift_limit=0.1, p=1, border_mode=0), albu.PadIfNeeded(min_height=IMAGE_SIZE, min_width=IMAGE_SIZE, always_apply=True, border_mode=0), albu.RandomCrop(height=IMAGE_SIZE, width=IMAGE_SIZE, always_apply=True), albu.IAAAdditiveGaussianNoise(p=0.2), albu.IAAPerspective(p=0.5), albu.OneOf( [ albu.CLAHE(p=1), albu.RandomBrightness(p=1), albu.RandomGamma(p=1), ], p=0.9, ), albu.OneOf( [ albu.IAASharpen(p=1), albu.Blur(blur_limit=3, p=1), albu.MotionBlur(blur_limit=3, p=1), ], p=0.9, ), albu.OneOf( [ albu.RandomContrast(p=1), albu.HueSaturationValue(p=1), ], p=0.9, ), ] return albu.Compose(train_transform) # テンソル化 def to_tensor(x, **kwargs): return x.transpose(2, 0, 1).astype('float32') # 前処理 def get_preprocessing(preprocessing_fn): _transform = [ albu.Lambda(image=preprocessing_fn), albu.Lambda(image=to_tensor, mask=to_tensor), ] return albu.Compose(_transform) # データセット class Dataset(BaseDataset): CLASSES = ['background', 'dog'] def __init__( self, images_dir, masks_dir, classes=None, augmentation=None, preprocessing=None, ): self.ids = os.listdir(images_dir) self.images_fps = [os.path.join(images_dir, image_id) for image_id in self.ids] self.masks_fps = [os.path.join(masks_dir, image_id) for image_id in self.ids] # convert str names to class values on masks self.class_values = [classes.index(cls.lower()) for cls in classes] self.augmentation = augmentation self.preprocessing = preprocessing def __getitem__(self, i): # read data image = cv2.imread(self.images_fps[i]) #image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # mask mask = cv2.imread(self.masks_fps[i], 0) masks = [(mask == v) for v in self.class_values] mask = np.stack(masks, axis=-1).astype('float32') # apply augmentations if self.augmentation: sample = self.augmentation(image=image, mask=mask) image, mask = sample['image'], sample['mask'] # apply preprocessing if self.preprocessing: sample = self.preprocessing(image=image, mask=mask) image, mask = sample['image'], sample['mask'] return image, mask def __len__(self): return len(self.ids) # モデルを宣言 ENCODER = 'resnet34' ENCODER_WEIGHTS = 'imagenet' CLASSES = ['dog'] ACTIVATION = 'sigmoid' # could be None for logits or 'softmax2d' for multicalss segmentation DEVICE = 'cuda' DECODER = 'unet' model = smp.Unet( encoder_name=ENCODER, encoder_weights=ENCODER_WEIGHTS, classes=len(CLASSES), activation=ACTIVATION, ) model = model.to("cuda") train_dir = 'train' val_dir = 'val' preprocessing_fn = smp.encoders.get_preprocessing_fn(ENCODER, ENCODER_WEIGHTS) # データセットを作成 train_dataset = Dataset( os.path.join(train_dir, 'images'), os.path.join(train_dir, 'masks'), augmentation=get_training_augmentation(), preprocessing=get_preprocessing(preprocessing_fn), classes=['dog'], ) valid_dataset = Dataset( os.path.join(val_dir, 'images'), os.path.join(val_dir, 'masks'), preprocessing=get_preprocessing(preprocessing_fn), classes=['dog'], ) train_loader = DataLoader(train_dataset, batch_size=1, shuffle=True, num_workers=0) valid_loader = DataLoader(valid_dataset, batch_size=1, shuffle=False, num_workers=0) # データ確認 dataset = Dataset(os.path.join(train_dir, 'images'), os.path.join(train_dir, 'masks'), classes=['dog']) image, mask = dataset[0] # get some sample visualize( image=image, mask=mask.squeeze(), ) # 精度確認指標 metrics = [ smp.utils.metrics.IoU(threshold=0.5), ] # ロス loss = smp.utils.losses.DiceLoss() # 最適化関数 optimizer = torch.optim.Adam([ dict(params=model.parameters(), lr=0.001), ]) # 1Epochトレイン用 train_epoch = smp.utils.train.TrainEpoch( model, loss=loss, metrics=metrics, optimizer=optimizer, device=DEVICE, verbose=True, ) valid_epoch = smp.utils.train.ValidEpoch( model, loss=loss, metrics=metrics, device=DEVICE, verbose=True, ) # 学習 40EPoch 25Epochで学習率を下げる #ここで当該エラーを生じます max_score = 0 for i in range(0, 40): print('\nEpoch: {}'.format(i)) try: train_logs = train_epoch.run(train_loader) val_logs = valid_epoch.run(valid_loader) except Exception as e: print(e) # do something (save model, change lr, etc.) if max_score < val_logs['iou_score']: max_score = val_logs['iou_score'] torch.save(model, f'{DECODER}_{ENCODER}.pth') print('Model saved!') if i == 25: optimizer.param_groups[0]['lr'] = 1e-4 print('Decrease decoder learning rate to 1e-4!') #結果確認 # 画像読み込み val_files = glob.glob('val/images/*') f = val_files[0] image_src = cv2.imread(f) image_src = cv2.cvtColor(image_src, cv2.COLOR_BGR2RGB) # 前処理 image = preprocessing_fn(image_src) image = image.transpose(2, 0, 1).astype('float32') # モデルで推論 image=torch.from_numpy(image).to(DEVICE).unsqueeze(0) predict = model(image) predict = predict.detach().cpu().numpy()[0].reshape((256,256)) # 0.5以上を1とする predict_img = np.zeros([256,256]).astype(np.int8) predict_img = np.where(predict>0.5, 1 , predict_img) # 画像表示 fig = plt.figure(figsize=(12, 6)) ax1 = fig.add_subplot(1, 2, 1) ax2 = fig.add_subplot(1, 2, 2) ax1.imshow(image_src) ax2.imshow(predict_img) ```Python3 ソースコード

試したこと

異なる画像で学習を実施。JPG(RGB)画像で試したところ、学習がうまく進むことを確認しました。
実際に分類したい画像は256×256pixelのTif画像(8bit)です。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

コメントを投稿

0 コメント