EnsekiTT Blog

EnsekiTTが書くブログです。

学習しても予測に使わなきゃ電気代の無駄なんだよ!ってことでTensorFlowのResNetをFlask使ってWebサービスっぽくする話

つまりなにしたの?

TensorFlowのModelsにあるResNetを学習できたので学習した分類器をFlaskに組み込んでWebサービスっぽくした。
追記 2017年10月5日 2時00分: 公開しようと思ったけど思った以上にリソースを食うのとセキュリティとかガバガバなのでコードだけ公開することにしました。*1
追記2 同 2時15分: なんかClassの順番間違えてるっぽい()
f:id:ensekitt:20171004211657j:plain*2

サービスの概要

データが投稿されると予測結果を返すAPIを作ってみる。手順はこんな感じ

  • 画像をPOSTする
  • POSTされた画像を保存する
  • 保存した画像を32x32にリサイズして保存する(上書きにした
  • リサイズした画像をPREDICTモードでモデルに突っ込む
  • 予測結果を返す

ジョブキューなどはとりあえず使わず、普通に動作をブロックして解析させている。(やってはいけない)

TensorFlowのResNetについて

こないだの記事を参考にしていただけたら
ensekitt.hatenablog.com

Flaskについて

Welcome | Flask (A Python Microframework)
Pythonで実装された"マイクロ"フレームワーク
小さいものだとすごく簡単にWebサービスを作れるのと、コードの見通しが良い。
最近は小さいものだとTornadoよりもFlaskを使っています。

実行手順

cd models/official/resnet
python cifar10_download_and_extract.py
python cifar10_main.py
cd service
python app.py

このあとブラウザから
http://localhost:5000/
にアクセスすると使える。
Ctrl+cで止められる。

構成

  • app.py

サーバの処理が書いてある。

  • resnet_model.py

models/official/resnetにあるものと同じ。

  • templates

Webのテンプレートが入ってる。ポストページ用

  • uploads

アップロードされた画像が入る

app.pyの関数について

  • cifar10_model_fn

cifar10_main.pyにあったcifar10_model_fnとほとんど同じで、予測の部分だけ切り出してきた。
ここからresnet_modelにアクセスする

  • get_input_fn

画像の入力を行う関数。画像を外から動的に指定したいので関数内で関数を定義して関数を返す形になった。(ややこしい

  • allowed_file

アップロードされたものが許可されたファイル名か確認するぶぶん。

  • index

POSTするための画面(必須ではないしcurlでもよい
ensekitt.hatenablog.com

  • post

実際に画像を処理している部分
POSTされた画像をリサイズ、コンバートなどしてCifar-10と同じような画像に変換している。
そのあとIteratorにデータセットとして追加している(これが必須なのかはよくわかってない。これから勉強する)

TensorFlowのアーキテクチャ理解は依然として遠いことがわかった。

*1:みんなのお家(LAN)で試してください。

*2:unsplash.com NASA