質問するログイン新規登録

質問編集履歴

1

コードをかなり編集しました。どうかお願いします。

2020/08/07 07:05

投稿

oinari03
oinari03

スコア59

title CHANGED
@@ -1,1 +1,1 @@
1
- pytorchで自作データセットを作成したいがgetitemや前処理、lableの付与の仕方がわからない
1
+ pytorchで自作データセットを作成し画像の分類をしたい(init,len,getitemのながれ)
body CHANGED
@@ -2,114 +2,155 @@
2
2
  deeplearning初学者です。
3
3
  ただやりたいことがあってどうしても全体像からこの辺はどうなっているんだってのを聞きたくてここに書きました。
4
4
 
5
+
5
6
  ### やりたいこと
6
7
  ・cifer10の画像分類問題を自分で集めた画像だけで実装したい
7
8
  ・フォルダにあるいくつかの画像を分類し、ラベルを付与することです。
8
- 思っている構想があって(ほかの方法があったら教えてください!)
9
+ ディレクトリ構成(train:val=7:3)
10
+ ```ここに言語を入力
11
+ ├─animal_dataset
12
+ ├─train
13
+ │ ├─cat(70枚くらい)
14
+ │ └─dog(70枚くらい)
15
+ └─val
16
+ ├─cat(30枚くらい)
17
+ └─dog(30枚くらい)
18
+ ```
9
19
 
10
- 今回聞きたいのはひとまずですが、どのようにlabelになる部分を作成すればいいのかということです。まったくわかりません。
11
20
 
12
- ________________以下構想________________________
13
21
 
14
- ・スクレイピングで画像収集(とりあえずは100枚ほどで考えています)
15
-
16
- ・収集したデータを手動で分類(dataというディレクトリの中にcatというディレクトリをいれ、さらにtrainというディレクトリ、testというディレクトリに画像を分類。比率は7:3くらい)する予定です。catだけでなくdog,human,carなどのパターンも増やす予定です。
17
-
18
- ・trainに前処理を施して画像をきれいにしていきます。
19
-
20
- ここからが全然想像できないので困っています。流れが見えてきません。
21
- ・具体的にはdatasetのclassを継承してinit,len,getitemという関数に分けてという処理をよくめにするので、説明のためにもそのように分けたいと考えています
22
-
23
- ・しかしどのようにlabelを用意して,どのように画像と紐づけするのかがわかりません(cifer10の画像分類チュートリアルのようにclassesの中に入れる形式をするとよいのかそれともcsvなのかjsonなのか)
24
- ・はたまたそのときの書き方がわかりません。csvの書き方自体はググれば出てきそうですが、datasetになりうるcsvファイルの書き方だったり、jsonの書き方だったりはなかなか出てこないです
25
-
26
-
27
- ### やったこと(理解しいない可能性あり)
28
- ・cifer10での画像分類チュートリアルを通したりして中身を確認した(ただnetworkの部分特にlabelを付与するところが理解できませんでした)
29
- ・画像をスクレイピングで集めて正規化するところまでは確認した(composeなどを利用した)
30
-
31
- ・いくつかのサイトを参考にひな型を作成した
32
-
33
- 結果的にまだまだ流れがつかめてないです。。。。
34
-
35
-
36
22
  ### とりあえず書いてみたコード
37
23
 
38
24
  ・スクレイピングの処理は省いています
25
+ ・前処理としてtrainとvalそれぞれにかける
26
+ ・データセットを作成する。
27
+ ・initの中身にからのdataとlabelを用意する
28
+ ・画像を呼び出す処理をする??
29
+ ・for分とif文でディレクトリ名?が一致していたら0/1で場合分けしてlabelのlistに格納
30
+ ・これで呼び出すときlabelとして機能する?
31
+ ・lenでデータ数を返す
39
- ・data/data_resizeに猫の画像が100枚入っている
32
+ ・getitemでindex番目の画像をロードしたい
40
- ・ここには書いてないがdata/train data/testと手作業で70:30くらいの比率に分けている
33
+ ・ただ本当にロードできてる?
41
- ・使い方がわからなかったので分けただけ
34
+ ・ちゃんとlabelとして認識できてる?
42
35
 
36
+ 全体的に
43
- ・コメントアウトにしてcsvについて書いてはいるがcsvのデータセットの書き方がわからなくて書いていない
37
+ 正しい書き方というのがあいまいです。もう少しきれいなコードできれいにlabel分類したいです。
44
- ・dataトlabelがどう紐づけられるのか全然イメージがつかない...
45
38
 
46
39
 
47
40
  ```python
48
41
  import torch
49
42
  import torch.utils.data as data
50
43
  from torchvision import transforms
51
- from torchvision import dataets, transforms
44
+ from torchvision import datasets, transforms
52
45
  import numpy as np
53
46
 
54
-
47
+ import os
55
48
  import glob
56
- import cv2
57
49
 
58
50
 
59
51
 
60
52
 
61
53
 
54
+
62
55
  # 前処理
63
- transform = transforms.Compose(
64
- [transforms.Resize((256,256),
65
- transforms.ToTensor(),
66
- transforms.RandomResizedCrop(32, scale=(1.0, 1.0), ratio=(1.0, 1.0))])
67
56
 
57
+ class MyTransform():
58
+ def __init__(self, resize, mean, std):
59
+ self.resize = resize
60
+ self.mean = mean
61
+ self.std = std
62
+
63
+ def __call__(self,img, key ='train'):
64
+ data_transform = {
65
+ 'train': transforms.Compose(
66
+ [transforms.Resize((256,256)),
68
- # rootの中に猫の画像が100マイ入っている
67
+ transforms.ToTensor(),
68
+ transforms.Normalize(self.mean, self.std) #標準化
69
+ ]),
69
- data = torchvision.datasets.ImageFolder(root='../data/data_resize', transform=transform)
70
+ 'val': transforms.Compose(
71
+ [transforms.Resize((256,256)),
72
+ transforms.ToTensor(),
73
+ transforms.Normalize(self.mean, self.std)
74
+ ])
75
+ }
70
76
 
77
+ return data_transform[key](img)
71
78
 
72
79
 
73
80
 
74
- class Creat_Datasets(Dataset):
75
81
 
82
+ # データセット作成
83
+ class MyDatasets(data.Dataset):
76
- def __init__(self, imgpath='./data', csvpath='./csv', transform=transform):
84
+ def __init__(self, path=None, key='train', transform=None):
77
85
  self.transform = transform
86
+ self.key = key
78
- # 以下のコードは使えるかどうか不明
87
+ self.path = path
88
+ self.data = []
79
- # self.imgfiles = sorted(glob('%s/*.png' % imgpath))
89
+ self.lables = []
80
- # self.csvfiles = sorted(glob('%s/*.csv' % csvpath))
81
- pass
82
90
 
91
+ target_path = os.path.join(self.path + self.key + '/**/*.jpg')
92
+
93
+ for i in glob(target_path):
94
+ # データリスト作成
95
+ self.data.append(i)
96
+
97
+ #ラベルリスト作成
98
+ label = os.path.basename(os.path.dirname(i))
99
+ if label == "cat":
100
+ label = 0
101
+ elif label == "dog":
102
+ label = 1
103
+ self.lables.append(label)
104
+
105
+
83
106
  # データ数を返す。
84
107
  def __len__(self):
85
- # return len(self.csvfiles)
108
+ return len(self.data)
86
- pass
87
109
 
88
- # dataとlabelのタプルを返してほしい
110
+ # dataとlabelを返すはず
89
111
  def __getitem__(self, index):
112
+ # index番目の画像をロード
113
+ img_path = self.data[index]
114
+ img = Image.open(img)
115
+
116
+ img_transformed = self.transform(img, self.key)
90
- pass
117
+ label = self.labels[index]
91
118
 
92
119
 
93
- return image, label
120
+ return img_transformed, label
94
121
 
95
122
 
123
+ train_dataset = MyDatasets()
124
+ print(train_dataset.label)
125
+
126
+
127
+
128
+
96
129
  ```
130
+ ### error
131
+ こちらのコードを実行した結果です。画像の読み込みに失敗しているきがしますがどのように書き換えればいいのかわかりません。
97
132
 
133
+ ```ここに言語を入力
134
+ Traceback (most recent call last):
135
+ File "dataset.py", line 90, in <module>
136
+ train_dataset = MyDatasets()
137
+ File "dataset.py", line 59, in __init__
138
+ target_path = os.path.join(self.path + self.key + '/**/*.jpg')
139
+ TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'
140
+ ```
141
+
98
142
  ### 参考にしたサイト
99
143
  自分でこんな感じのものを作りたい
100
144
  [ciffer10のチュートリアル。これを発展させたい感じ](https://pytorch.org/tutorials/beginner/blitz/cifar10_tutorial.html)
101
145
 
102
- [上記のチュートリアルの解説にあたる記事だが自作でのlabelの紐づけ方がないので不明](https://qiita.com/kuto/items/0ff3ccb4e089d213871d#%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%A9%E3%83%AB%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AE%E8%A8%93%E7%B7%B4)
103
- [似たようなことをしていたがlabelの紐づけが乗っていなかった](https://qiita.com/ryryry/items/b1da4855504dcd3f9d98#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AD%E3%83%BC%E3%83%80)
104
-
105
146
  ### 最後に
106
147
  初心者故、ごちゃごちゃな質問をしてしまったのは否めないです。ただ理解があいまいなためうまく質問もできない状況です。
107
148
 
108
149
  以下が聞きたいことのまとめかと思いますが補足情報などありましたらお願いします。
109
- ・labelの作り方
150
+ ・画像の読み込み方
110
- dataset独自の書き方なのか?、どこに配置したらいいのか?どのように取り込んだらいいのか?
151
+ おそらく画像の読み込みに失敗していると思いますので別の方法があれば教えていただきたいです。
111
152
 
112
- ・dataとlabelの紐づけ方
153
+ ・init,getitemの書き方が正しいのか確認してほしいです。
113
154
  前処理としてこんな内容でいいのかわかりませんが、initの中身、getitemでどんなコードを書いたら紐づけができるのか想像ができません。
114
155
 
115
156
  ・前処理というか上記で上げたコードとして不備はないかを確認してほしいです。