はじめまして
deeplearning初学者です。
ただやりたいことがあってどうしても全体像からこの辺はどうなっているんだってのを聞きたくてここに書きました。
やりたいこと
・cifer10の画像分類問題を自分で集めた画像だけで実装したい
・フォルダにあるいくつかの画像を分類し、ラベルを付与することです。
ディレクトリ構成(train:val=7:3)
├─animal_dataset ├─train │ ├─cat(70枚くらい) │ └─dog(70枚くらい) └─val ├─cat(30枚くらい) └─dog(30枚くらい)
とりあえず書いてみたコード
・スクレイピングの処理は省いています
・前処理としてtrainとvalそれぞれにかける
・データセットを作成する。
・initの中身にからのdataとlabelを用意する
・画像を呼び出す処理をする??
・for分とif文でディレクトリ名?が一致していたら0/1で場合分けしてlabelのlistに格納
・これで呼び出すときlabelとして機能する?
・lenでデータ数を返す
・getitemでindex番目の画像をロードしたい
・ただ本当にロードできてる?
・ちゃんとlabelとして認識できてる?
全体的に
正しい書き方というのがあいまいです。もう少しきれいなコードできれいにlabel分類したいです。
python
1import torch 2import torch.utils.data as data 3from torchvision import transforms 4from torchvision import datasets, transforms 5import numpy as np 6 7import os 8import glob 9 10 11 12 13 14 15# 前処理 16 17class MyTransform(): 18 def __init__(self, resize, mean, std): 19 self.resize = resize 20 self.mean = mean 21 self.std = std 22 23 def __call__(self,img, key ='train'): 24 data_transform = { 25 'train': transforms.Compose( 26 [transforms.Resize((256,256)), 27 transforms.ToTensor(), 28 transforms.Normalize(self.mean, self.std) #標準化 29 ]), 30 'val': transforms.Compose( 31 [transforms.Resize((256,256)), 32 transforms.ToTensor(), 33 transforms.Normalize(self.mean, self.std) 34 ]) 35 } 36 37 return data_transform[key](img) 38 39 40 41 42# データセット作成 43class MyDatasets(data.Dataset): 44 def __init__(self, path=None, key='train', transform=None): 45 self.transform = transform 46 self.key = key 47 self.path = path 48 self.data = [] 49 self.lables = [] 50 51 target_path = os.path.join(self.path + self.key + '/**/*.jpg') 52 53 for i in glob(target_path): 54 # データリスト作成 55 self.data.append(i) 56 57 #ラベルリスト作成 58 label = os.path.basename(os.path.dirname(i)) 59 if label == "cat": 60 label = 0 61 elif label == "dog": 62 label = 1 63 self.lables.append(label) 64 65 66 # データ数を返す。 67 def __len__(self): 68 return len(self.data) 69 70 # dataとlabelを返すはず 71 def __getitem__(self, index): 72 # index番目の画像をロード 73 img_path = self.data[index] 74 img = Image.open(img) 75 76 img_transformed = self.transform(img, self.key) 77 label = self.labels[index] 78 79 80 return img_transformed, label 81 82 83train_dataset = MyDatasets() 84print(train_dataset.label) 85 86 87 88
error
こちらのコードを実行した結果です。画像の読み込みに失敗しているきがしますがどのように書き換えればいいのかわかりません。
Traceback (most recent call last): File "dataset.py", line 90, in <module> train_dataset = MyDatasets() File "dataset.py", line 59, in __init__ target_path = os.path.join(self.path + self.key + '/**/*.jpg') TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'
参考にしたサイト
自分でこんな感じのものを作りたい
ciffer10のチュートリアル。これを発展させたい感じ
最後に
初心者故、ごちゃごちゃな質問をしてしまったのは否めないです。ただ理解があいまいなためうまく質問もできない状況です。
以下が聞きたいことのまとめかと思いますが補足情報などありましたらお願いします。
・画像の読み込み方
おそらく画像の読み込みに失敗していると思いますので別の方法があれば教えていただきたいです。
・init,getitemの書き方が正しいのか確認してほしいです。
前処理としてこんな内容でいいのかわかりませんが、initの中身、getitemでどんなコードを書いたら紐づけができるのか想像ができません。
・前処理というか上記で上げたコードとして不備はないかを確認してほしいです。
とは言ってもほとんど書けなかったので、何を追加すればいいのか、こんな処理を入れたらもっと良くなる、こう書くのが普通だよ。などを教えてもらえるとありがたいです。
以上
自分のしたいことを具体的に書いたつもりですが不明点などありましたらご指摘下さい。
回答1件
あなたの回答
tips
プレビュー