質問編集履歴
1
コードをかなり編集しました。どうかお願いします。
title
CHANGED
|
@@ -1,1 +1,1 @@
|
|
|
1
|
-
pytorchで自作データセットを作成したい
|
|
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
|
-
・
|
|
32
|
+
・getitemでindex番目の画像をロードしたい
|
|
40
|
-
・
|
|
33
|
+
・ただ本当にロードできてる?
|
|
41
|
-
・
|
|
34
|
+
・ちゃんとlabelとして認識できてる?
|
|
42
35
|
|
|
36
|
+
全体的に
|
|
43
|
-
|
|
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
|
|
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
|
-
|
|
67
|
+
transforms.ToTensor(),
|
|
68
|
+
transforms.Normalize(self.mean, self.std) #標準化
|
|
69
|
+
]),
|
|
69
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
117
|
+
label = self.labels[index]
|
|
91
118
|
|
|
92
119
|
|
|
93
|
-
return
|
|
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
|
-
・
|
|
150
|
+
・画像の読み込み方
|
|
110
|
-
|
|
151
|
+
おそらく画像の読み込みに失敗していると思いますので別の方法があれば教えていただきたいです。
|
|
111
152
|
|
|
112
|
-
・
|
|
153
|
+
・init,getitemの書き方が正しいのか確認してほしいです。
|
|
113
154
|
前処理としてこんな内容でいいのかわかりませんが、initの中身、getitemでどんなコードを書いたら紐づけができるのか想像ができません。
|
|
114
155
|
|
|
115
156
|
・前処理というか上記で上げたコードとして不備はないかを確認してほしいです。
|