【ファッション×テック】おしゃれ判定アプリを開発した

#はじめに
エンジニアはおしゃれが苦手でどうしてもダサい服装になりがちです(偏見)．そこで今回はiosのおしゃれ判定アプリを作ってみました．下の写真のようにアプリが服装の点数をつけてくれます．小坂菜緒さん可愛いですね．
<img width="375" alt="IMG_508AE0173F1A-1.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/256520/07e24223-2852-359a-78f6-4f26489c3b84.jpeg">

#開発環境
* macOS Mojave 10.14.1
* Xcode 10.1
* python 3.6
* ios 12.1

#画像集め
今回は画像データをpythonのicrawlerを使い集めました．本当はWEARというサイトから評価の高い服装と低い服装を集めたかったのですが，icrawlerの方が簡単であるため妥協してしまいました．前回書いたicrawlerの[記事](https://qiita.com/NakaokaRei/items/8c7e7b1f2c0c7ef8b3a3)に従って画像を集めます．以下のコマンドを実行しおしゃれな服装とダサい服装の画像を集めます．

```
$ python crawler.py image/osya おしゃれな服装
$ python crawler.py image/dasa ダサい服装
```
<img width="603" alt="スクリーンショット 2018-11-20 19.20.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/256520/cb440f2b-4218-f473-5296-d7efc0270351.png">

#モデルの学習
集めた画像を使ってDeepLearningモデルを学習させます．今回はResNetという精度が高くパラメータ数もそれほど多くないモデルを使って転移学習行いモデルを学習させます．今回使用したフレームワークはKerasと言うpythonのライブラリでモデルの構築や学習が簡単にでき，学習済みのモデルも簡単に保存できます．コードは以下になります．

```osya_dasa.py
import os.path,sys
from keras.models import Model,Sequential
from keras.layers import Dense,Input,Flatten,Dropout
from keras.applications.resnet50 import ResNet50
from keras.preprocessing.image import ImageDataGenerator
from keras.callbacks import EarlyStopping,TensorBoard
import keras.callbacks
import numpy as np
from keras.optimizers import SGD

IMAGE_SIZE = 224
BATCH_SIZE = 32

NUM_TRAINING = 1260
NUM_VALIDATION = 140

#モデルの構築
input_tensor = Input(shape=(224,224,3))
resnet50_model = ResNet50(weights='imagenet', include_top=False, input_tensor=input_tensor)
x = resnet50_model.output
x = Flatten(name='flatten')(x)
x = Dropout(0.5)(x)
predictions = Dense(2, activation='softmax', name='predictions')(x)
model = Model(inputs=resnet50_model.input, outputs=predictions)
model.compile(optimizer=SGD(lr=1e-4,momentum=0.9),
    loss='categorical_crossentropy',
    metrics=['accuracy'])
model.summary()

classes = ['osya', 'dasa']


train_datagen = ImageDataGenerator(
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.1,
    zoom_range=0.1,
    horizontal_flip=True,
    vertical_flip=True,
    rescale=1.0 / 255
)

test_datagen = ImageDataGenerator(
    rescale=1.0 / 255
)

train_generator = train_datagen.flow_from_directory(
    'data/train_osya_dasa',
    target_size=(IMAGE_SIZE, IMAGE_SIZE),
    batch_size=BATCH_SIZE,
    class_mode='categorical',
    classes = classes,
    shuffle=True
)

validation_generator = test_datagen.flow_from_directory(
   'data/test_osya_dasa',
   target_size=(IMAGE_SIZE, IMAGE_SIZE),
   batch_size=BATCH_SIZE,
   class_mode='categorical',
   classes = classes,
   shuffle=True
)

#モデルの学習
hist = model.fit_generator(
    train_generator,
    steps_per_epoch=NUM_TRAINING//BATCH_SIZE,
    epochs=500,
    verbose=1,
    validation_data=validation_generator,
    validation_steps=NUM_VALIDATION//BATCH_SIZE*10,
   )

#モデルの保存
model.save('model/osya_dasa_last.h5')

```

#モデルの変換
kerasで保存した学習済みのモデルをSwiftで使えるモデルに変換します．こちらの[記事](https://qiita.com/kenmaz/items/d416b191f79f60e07752)を参考にさせていただきました．

```h5_to_mlmodel.py
import coremltools
path = 'ここに学習済みのモデルのパス'
coreml_model = coremltools.converters.keras.convert(path,
        input_names = 'image',
        image_input_names = 'image',
        is_bgr = True, 
        image_scale = 0.00392156863, 
        class_labels = ['おしゃれですね','あなたはダサい'])

coreml_model.save('fashion.mlmodel')
```

#アプリ作り
学習させたモデルをアプリに組み込みます．こちらの[記事](http://tech.wonderpla.net/entry/2017/10/03/150000)を参考にさせていただきました．ソースコードは[github](https://github.com/NakaokaRei/fashion)に載せてあります．写真を撮影またはアルバムから写真を選択するとおしゃれ度を判定してくれます．

![20181120_201114.GIF](https://qiita-image-store.s3.amazonaws.com/0/256520/9b8bd335-617c-b036-e038-fbddc52e3570.gif)

#考察
デモでいろいろな服装で試してみたところ，かなり厳しめの採点になっているようです．原因として考えられることは，データセットであると思います．そもそもネットに自分の服装を投稿している人はおしゃれな人が多く，本当にダサい人はネットに自分の服装を投稿しないです．従って，データセットがおしゃれさんの服装に偏ってしまい採点が厳しめになっていると考えられます(そもそも学習がしっかりできているとは思いませんが…)．そこで前回の[記事](https://qiita.com/NakaokaRei/items/231ec4efe42dfe79d1ff)で紹介したAnoGANを使えばおしゃれさんの服装だけでモデルを学習できるのではないかと思いました．

#まとめ
今回はkerasの学習済みのモデルをiosのアプリに組み込んでおしゃれ判定アプリを作ってみました（データセットがガバガバでモデルもガバガバ判定ですが...）．今後はスクレイピングの勉強をして良質なデータを集め再度モデルを学習させてみたいと思います．また，アプリのUIや機能をブラッシュアップしAppStoreにリリースできたらいいなと思っています．

#追記（2018/12/16）
今回の反省点を下にアプリを新しくして記事を書きました『[WEAEのコーディネートを使って本気でおしゃれ判定アプリを作る](https://qiita.com/NakaokaRei/items/03dd5587babcc5f772d3)』．