cedro-blog

YolactEdgeで、高速に画像から物体を検出し、形を推定する

1.はじめに

 以前、「画像から物体を検知し、形を推定するタスク」を行うMask R-CNNをご紹介しました。今回は、エッジでのリアルタイム処理向けの、処理が高速なYolactEdge をご紹介します。

*この論文は、2020年12月に提出されました。

2.YolactEdgeとは?

 まず、YolactEdgeのベースであるYolactのフロー図を示します。

  まず、Feature Backbone(CNNネットワーク)で画像から Feature Pyramid(特徴量をまとめたピラミッド)を抽出します。そして、Protonet で画像全体の全てのマスクを生成し、Prediction Head+NMSで各マスクの信頼度を求め、この2つを結合します。その後、Crop+Threshholdを行い出力を得ます。マスク生成と信頼度計算を並行して動かすのが高速化の秘密です。

 このプロセスを改良し、さらなる高速化を実現したのが YolactEdge で、下記にそのフォローを示します。

 処理する画像がキーフレーム(場面が変わるフレーム)でなければ、画像は1つ前のフレームとほとんど変わらないはずです。そのため、画像から特徴量を抽出するところで、一部を前の画像の特徴量を使うことで計算量を削減しています。

 また、YolactEdgeでは、TensorRTという推論最適化・実行ライブラリを採用することで、ネットワークを最適化し、低レイテンシ・高スループットの推論を実現しています。

 これによって、550×550の画像に対して、Jetson AGXXavier(Nvidiaが開発したエッジ処理用デバイス)で最大30FPS、RTX 2080Tiであればなんと172FPSを実現すると報告されています。

 それでは、実際にコードを動かしてみましょう。

3.コード

 コードはGoogle Colabで動かす形にしてGithubに上げてありますので、それに沿って説明して行きます。自分で動かしてみたい方は、この「リンク」をクリックし表示されたノートブックの先頭にある「Colab on Web」ボタンをクリックすると動かせます。

 まず、セットアップを行います。なお、今回はTensorRTはインストールしていません。

静止画を物体検知

 下記のコードを実行し、物体検出するサンプル画像 (./pic/sample.jpg) を確認します。自分の画像でやってみたい場合は、ここに画像をアップロードして下さい。

 eval.pyを実行し、静止画から物体を検出します。引数は、1行目が学習済みの重みの指定、2行目は物体を検出する閾値(score_threshold)と検出数(top_k)、3行目は入力画像指定(image)と出力画像指定(output_img)、4行目はTensorRTを使わない指定です。。

 自分の画像でやってみたい方は、入力画像指定(image)のところを修正して下さい。

 人、馬、自転車、傘などを物体検知し、その形を推定しています。

ビデオから物体検知

 下記のコードを実行し、物体検出するサンプルビデオ (./video/sample.mp4) を確認します。自分の動画でやってみたい方は、ここに動画をアップロードして下さい。

https://cedro3.com/wp-content/uploads/2021/03/video.mp4

 eval.py を実行し、ビデオから物体を検出します。引数は、1行目が学習済みの重みの指定、2行目は物体を検出する閾値(score_threshold)と検出数(top_k)、3行目は入力ビデオ指定(video)と出力ビデオ指定(output_video)、4行目はTensorRTを使わない指定です。

 自分のビデオでやってみたい方は、入力ビデオ指定(video)のところを修正して下さい。

https://cedro3.com/wp-content/uploads/2021/03/output_video.mp4

 人、車、バス、自転車などを物体検出し、形を推定しています。

 では、また。

(オリジナルGithub)https://github.com/haotian-liu/yolact_edge

(Twitterへの投稿)