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