ローカルに持ってきたjpgファイル群をnpy形式のデータセットにする

みなさんこんにちはやっしーです。

本日は、ローカルに持ってきた画像群を使ったデータセットの作り方を備忘録的にまとめようと思います。

なお、今回取り上げるデータセットは、[Oxford-ⅢT Pets](https://www.robots.ox.ac.uk/~vgg/data/pets/)です。

## Oxford-ⅢT Pets
オックスフォード大学が公開している動物画像のデータセットです。最大37種類。ネコ系やイヌ系です。
<img width="686" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448316/989c29a1-0b9d-0c5d-6118-d9006e515e45.png">


## データセットにしたい画像群のダウンロード
上記Oxford-Pets Ⅲのリンクをクリックして、Dataset をクリックすると、圧縮された画像ファイル群が手に入るので、それを、

///
解凍法を示す
///
解凍すると、jpgファイルがたくさん出てきます。

## ラベルの書き出し（手作業！圧倒的手作業！！）
プログラム上にラベル一覧を並べていきます。これに一致する文字列云々でフィルタかけますので、ここ減らしたりすればクラス分類のクラス数を調整できますね

```python

PETS = [
"Abyssinian",
"american_bulldog",
"american_pit_bull_terrier",
"basset_hound",
"beagle",
"Bengal",
"Birman",
"Bombay",
"boxer",
"British_Shorthair",
"chihuahua",
"Egyptian_Mau",
"english_cocker_spaniel",
"english_setter",
"german_shorthaired",
"great_pyrenees",
"havanese",
"japanese_chin",
"keeshond",
"leonberger",
"Maine_Coon",
"miniature_pinscher",
"newfoundland",
"Persian",
"pomeranian",
"pug",
"Ragdoll",
"Russian_Blue",
"saint_bernard",
"samoyed",
"scottish_terrier",
"shiba_inu",
"Siamese",
"Sphynx",
"staffordshire_bull_terrier",
"wheaten_terrier",
"yorkshire_terrier"]

```

画像へのPATH記述
grobを使います。

```python
file_type  = 'jpg'

img_list = glob.glob(r"./images/*.jpg")
```

変数も定義しておきましょう

```python
#全データ格納用
img_array_list = []
img_label_list = []

#教師用データ格納用
test_array_list = []
test_label_list = []

#学習データ格納用
teach_array_list = []
teach_label_list = []

```

フォルダ内総なめしてファイル名の文字列を検知したら、PETS配列のインデックスをラベルとしてappendします。

```python
for img in img_list:
    for i in PETS:
        if(i in img):
            #print(i)
            #print(img)すると、一致しているのがわかるが、長いのでオススメしない
            img_label_list.append(PETS.index(i))
            
    imgcv = plt.imread(img)
    # 画像の大きさを取得
    temp_img = load_img(img,grayscale=False,target_size=(imgcv.shape[0],imgcv.shape[1]))
    temp_img_array = img_to_array(temp_img) /255
    img_array_list.append(temp_img_array)
```

ちなみにコメント外すとこんなの出てきます。

```
Egyptian_Mau
./images/Egyptian_Mau_167.jpg
pug
./images/pug_52.jpg
basset_hound
./images/basset_hound_112.jpg
Siamese
```

あとは、各クラスから20枚ずつ（何枚でもできます。良い比率あったら教えてください）
教師データにぶち込みます。

```python
#各クラス20枚ずつ取り出して教師用データにする。
# 20*37 = 740
# 学習データ3050枚、教師データ740枚にわけたい
j=0
for j in range(37):
    for i in range(len(img_label_list)):   
        while(teach_label_list.count(j) <=20):
            teach_label_list.append(img_label_list.pop(i))
            teach_array_list.append(img_array_list.pop(i))
        continue

test_label_list = img_label_list
test_array_list = img_array_list
```

やはりデータとして数が足りない気がするので、そのまま37クラス分類とかやらない方が良さそうですね笑

ちなみにlengthチェック

```python
print(len(teach_array_list))
print(len(teach_label_list))
print(len(test_label_list))
print(len(test_array_list))
#1180
#1180
#6210
#6210
```
全部で7390枚だったので、（全200枚、9枚少ないのが１クラス、1枚少ないのが1クラスありました。）OKっぽいですね。

そしたら、完成したリストをnumpy配列にして、

```python
test_array_listnp = np.array(teach_array_list)#教師データ
test_label_listnp = np.array(teach_label_list)#教師ラベル
train_array_listnp = np.array(test_array_list)#学習データ
train_label_listnp = np.array(test_label_list)#学習ラベル
```

np.saveでnpyファイルが完成します！（ここ重いです）

```python
np.save('test_array.npy',test_array_listnp)
np.save('test_label.npy',test_label_listnp)
np.save('train_array.npy',train_array_listnp)
np.save('train_label.npy',train_label_listnp)
```

何回かやると、アドレス空間的に確保できないのか、リストがカラになってしまうことが多々ありました！なんか解決策あったらご教授ください！


ちゃんとできているかの検証はまだしていません。結果が出なかったらまずはデータセットをうたがってください笑