こんばんはエンジニアの眠れない夜です。
物体検出ができるようにしたいなと思っても
- なかなか環境を作るのが面倒(;´Д`)
- そもそもディープラーニングがよく分からない。
という方も多いのではないでしょうか?
今回はそんな方でも簡単に物体検出ができるように画像から2行で「何が映っているのか」と「その座標」を返すAPIを作ったのでぜひ使ってみてください。
YOLOv3を使って物体検出
まずは使い方の紹介から。
ターミナルでこちらのコマンドを実行するとYOLOv3が利用できるAPIが起動します。
※ Dockerがインストールされている前提です。
docker run -p 80:80 registry.gitlab.com/sleepless-se/imageai_object_detection_api
そして、こちらのコマンドでAPIに画像を投げます。
※ path/to/image.jpg
は自分の画像のパスに置き換えてください。
curl -X POST -F image=@path/to/image.jpg http://localhost/predict
すると、写真に写っている物体の予測結果とその座標が返ってきます。あと、スコアも返ってきます。
"[{\"name\": \"person\", \"percentage_probability\": 99.8645544052124, \"box_points\": [104, 15, 524, 656]}]"
めっちゃ簡単ですね。ディープラーニングの知識不要で物体検出ができるようになりました。すごい時代ですね。
そのままだと読みづらいので整形すると返って来た結果はこんな感じです。
- name:person
- percentage_probability:99.8645544052124
- box_points:[104, 15, 524, 656]
※ 複数ある場合は配列で結果が返ってきます。
99.86%で人だと言っています。すごい自信ですね(笑)
box_pointsは対象物の[左、上、右、下]の座標を示しています。
APIに画像を投げるだけなのでどの言語からでも利用できるので、サービスに組み込むことができます。
これであなたのサービスもAI搭載!(笑)
すごく雑ですが…
エンジニアとしては細かいことはいいから画像から何が映っているのかとその位置座標が分かるだけでありがたいですよね。
その結果を使っていろいろできることが広がるので、そっちに集中できます(^^)
コンテナ内に保存される画像なのでこのままでは取り出せませんが検出結果を画像にするとこんな感じです。
バッチリ綺麗なお姉さんを検出できていますね!
物体検出なんだからもっといろいろ映っている画像を使った方が分かりやすそうな気もしますが、適当な写真を使ってしまいましたm(_ _)mすみません
あと、きれいだし…
ImageAIを使ってAPIの中身を変更する方法
このAPIはImageAIを使っています。最近見つけたライブラリで「物体検出の革命だ!」と、一人で興奮して夜中にツイートしていました。
その時のTweetはこちら。
ImageAIというモジュールを使えば物体検出の結果を10行のコードで返せるらしい
https://t.co/YaZkWc41ho— エンジニアの眠れない夜 (@sleepless_se) May 19, 2019
このImageAIはRetinaNet YOLOv3 TinyYOLOv3の3つのモデルを使って物体検出ができます。
現時点ではYOLOv3の物体検出のみですが、APIの中身を書き換えることで画像の分類と動画を使った物体検出もできるようになるはずです。
さらに、今回は学習済みのモデルを使っていますが、自分で教師データを作成すればオリジナルの検出器を作ることも可能です。詳しくはドキュメントを読んでみてください。
ImageAIの使い方の説明は譲って、ここではAPIの中身の変更方法を紹介します。
まずは、リポジトリをダウンロードします。
git clone git@gitlab.com:sleepless-se/imageai_object_detection_api.git
imageai_object_detection_apiの中にapi.pyというファイルがあります。
このファイルがImageAIとFlaskを使ったAPIになっています。
あとはImageAIのドキュメントを見ながらapi.pyの中身を書き換えるだけです。
編集内容をリタイルタイムで確認する時はプロジェクトディレクトリに移動して、こちらのコードでflaskを起動してポート5000番からアクセスできます。
docker run -p 5000:5000 -v $(pwd):/app registry.gitlab.com/sleepless-se/imageai_object_detection_api python3 api.py
※ POSTするポートを5000に変更するのをお忘れなく。 localhost:5000
※ カレントディレクトリがコンテナ内の/appにマウントされます。
GitLabでFolkを作成してからCloneした場合は、リモートリポジトリにプッシュすると勝手にイメージを作成してレジストリにプッシュしてくれます。この辺りはGitLabのありがたい機能ですね。
後はどこかのサーバーでコンテナを起動するだけで、デプロイ完了です(^^)v
docker run -p 80:80 registry.gitlab.com/YOUR_ID/imageai_object_detection_api
作ってみてわかったこと
- GoogleColabCPUだと全然スピードが出ないこと。
- GoogleColabのGPUで試してもそれほど速くないこと。
- Macだと意外に速かったこと。
GoogleColabでCPUだと1枚の画像を処理するのにだいたい5秒〜10秒かかりました。GPUを使っても1枚3〜5秒前後かかりました。
YOLOってこんなに遅かったっけ…?ってなりました。
比較時のGoogleColabです。
なにか使い方が間違っているのかもしれません。
ビデオの解析になるともう少し違う結果になるのでしょうか?また、やってみて報告ができればと思います。
API化した後なので純粋な比較ではないですが、実行時間を計算している関数は同じなので差は出ないはずなのですが、ローカルPC(MacBookProでCPU環境)で動かすと1枚3秒ほどで結果が返ってきました!?
なぜ、GoogleColabのGPUよりCPUだけの方が速いのか…(・・?
GPUありでも試してみたいのですが、MacのグラフィックボードはAMD。どうしたものか…
Nvidiaのならベースイメージをtensorflow-gpu-py3にして、NvidiaDockerを使えばGPUで動かせそうな気もします。
確認ができたらコメントやプルリクエストしていただけると嬉しいですm(_ _)m
まとめ
物体検出の手法やライブラリはいろいろありますが環境を作るだけでも大変で、それを自分のサービスに組み込もうと思うと何日も何週間もかかる作業でした。
ImageAIで物体検出の環境構築が格段に楽になり、今回サービスに組み込みやすいようにAPI化できました。
こうして、どんどんディープラーニングを知らないエンジニアでも利用できるようになると、いろんなサービスに組み込まれて技術の進歩が加速して面白いなと思いながら作りました。
この記事を読んでくださったみなさんも物体検出をプログラムに組み込んで、従来のプログラミングだけではできなかったものを作ってみてください^^
[…] 【Docker】2行でできる物体検出(YOLOv3) […]
[…] 【Docker】2行でできる物体検出(YOLOv3) […]
[…] 【Docker】2行でできる物体検出(YOLOv3) […]