Flaskでイコちゃんペリー画像分類器の予測結果を返す

はじめに

先日の記事で作ったイコちゃんとペリー分類器ですが、今回は画像ファイルを送れば分類結果が返されるFlaskのAPIを作ってみようと思います。すごく簡単にできそうな記事を見つけたので、そこで紹介されていたコードを使います。

前回のおさらい

前回は、ペリーの画像27枚、イコちゃんの画像20枚を集めKerasでVGG16を使って分類器を作りました。テストデータもペリー9枚、イコちゃん7枚の計16枚と用意し、F1スコアは0.705くらいでした。画像を集めるのが面倒なのと、GPUを持っていないので更なる精度向上はいったん目指しておりません。

Flaskとは

FlaskとはWikipediaによると、「Python用の軽量なウェブアプリケーションフレームワークで、Djangoの次に人気がある。」とあります。学習済みモデルで推論の処理を受けつけ、その結果を返すということにしか関心がないデータサイエンティストとしては、ウェブアプリケーションフレームワークをわざわざ学びたいものではないですが、データサイエンス界隈ではしばしば見かけることから、学ばざるを得ないなと思います。
Flaskには「処理を受け付け、結果を返す」というただそれだけの関心で向き合っていく次第です。
公式ドキュメントはこちら(Welcome to Flask — Flask Documentation (2.0.x))になります。
そういえば以前、「[第3版]Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)」という書籍でFlaskを用いたレコメンドAPIを時間制限のある無料のサーバ(PythonAnywhere)で実装したことはありましたが、CSSやHTMLを色々設定して面倒だなという印象がありあまり記憶に残っておりません(笑)。

今回の処理

この記事のソースコードはこの記事、「How to Build A Machine Learning API Using Flask」から使わせていただきました。ローカル環境で機能するAPIをFlaskで作るというものです。

ざっくりとした処理の流れとしては、
学習済みモデルの読み込みをした状態で、
入力された画像を前処理し、
推論を行い、その結果を返すというものです。

ソースコード

さて、学習済みの画像分類モデルで、画像を受け付けて推論し、結果を返すコードは以下の通りとなります。

こちらのソースコードをapp.pyのファイル名で保存して、
コンソール上で

と実行すれば、FlaskのAPIサーバが立ち上がります。
今回はローカル環境なので、ブラウザで
http://0.0.0.0:5000/
を表示すればサーバが起動しているのを見れます。
さて、肝心の画像分類ですが、
コンソール上で以下のようにcurlコマンドを叩けばローカルのサーバから推論結果が返ってきます。–formという引数で’file=@”/perry_image/test/ikochan_test_8.jpeg”‘みたいにローカルのファイル名を指定して実行する形となります。

1なので、この画像はイコちゃん判定されました。過去の記事にもあるように、正解率は11/16くらいなので、69%と微妙ですけども。
今回はローカルサーバですが、Webサーバ上で起動すれば、機械学習を用いたツール開発が実現できますね。
なにより、思ったよりも短いコードで実現できてしまうことに驚きました。推論などの処理は基本的にPOSTのところに書く感じです。

今後:本番運用に必要なことについて

仕事で使うとなると、このコードを載せるサーバとかセキュリティ周りをどうするかというのが気になります。処理回数の制限とかIP制限とか認証キーとかどうするのか。
URLが流出するかもしれないし、誰かがDOS攻撃とかしてくる人がいるかもしれないし。
データ分析をするだけのご身分ではこういったことを考えることはないですが、データサイエンティストという職種に求められるスキルが少しずつ広がっていくのは面白いとも思えるので、粛々と向き合っていきたいです。

最近、「Python FlaskによるWebアプリ開発入門 物体検知アプリ&機械学習APIの作り方」という書籍が出ていたので、ポチりました。本番で運用する観点でどういったリスクを潰しておくべきか、この本から学んで実装までいけるといいなと思います。

参考情報

[第3版]Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)
How to Build A Machine Learning API Using Flask
GETとPOSTの違いについて

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です