PythonでSemantic Segmentation(セマンティックセグメンテーション)のプログラムを作って、ちょっと改造してみた話

2020年8月27日

こんにちは。トモです。

今日もマニアックな話をぶっこんで行きます。

先日、SSDで物体検出する話を書きました。今回はセマンティックセグメンテーションです。

それなに???

って人はググってね。Google先生が色々教えてくれますから。

今の時代、正直ググり方さえ知っていれば何でも無料で学べる気がします。もちろんネット環境がないとだめですけど。

調べたいと思うか思わないかだけです。

プログラムに限らず、自発的なアクションがなければ何も生まれませんよね。

っと、おしゃべりはそのくらいにして。

以下、セマンティックセグメンテーションで何ができるか紹介して行きます。

これは、画像内の物体(複数でもOK)に対して、物体の種類ごとに領域をピクセルレベルで色付けして分類する技術です。

もっとやさしく説明すると、画像内の物体に色を付けて分類したような画が見れるよというものです。

言葉で説明するより以下の動画をご覧ください。

動画1

セマンティックセグメンテーション(semantic segmentation)で物体分類、面積推定、大きさ推定、距離推定しちゃう

動画2

物体を色分けして、物体周囲に枠も表示させちゃう

順に動画内でやっていることを説明して行きます。

動画内でやっていること

動画1、動画2とも、近くにあった子供のおもちゃをセマンティックセグメンテーションで学習させ、リアルタイムに色分けして表示しています。

動画1では、物体の上の方に物体の名前を表示させ、さらにWebカメラから物体までの距離も表示させています。物体までの距離については、数センチメートル程度の誤差があるので、実務に使おうと思ったらもっと精度の高いモデルを作る必要がありますが、用途によっては使えるかもしれません。

で、左側の画面には、上から面積推定、大きさ(寸法)推定した値を表示させています。

面積推定では、画面サイズが720ピクセル×720ピクセルなので、全ピクセル数に対する物体のピクセル数がどのくらいあるのかを割合として%で示しています。また、大きさ(寸法)推定は物体の幅と高さのピクセル数を示しています。

動画2では、動画1の距離推定の代わりに物体の周囲に枠を表示させています。

SSDで物体検出した際に物体の周囲にバインティングボックス(四角い枠)を表示させますが、あれは物体の位置を分かりやすく示すためのただの枠なので、物体の大きさまでは分からないんですよね。

それに比べて、こちらでは物体をピクセル単位で推論しているので、推論の精度を上げれば物体の大きさをある程度正確に求めることができると思います。もちろん、ここではあくまでピクセル数を示しているだけなので、ずばり大きさ(寸法)というわけではないですが、要するに1ピクセルが何mmに相当するのかをあらかじめ設定しておけば、プログラム内部に長さに変換する式を組み込むことでいくらでも計算で大きさを求めることができるということです。

なお、動画1と動画2で画面左上のFPSが若干違っていることに気づいたでしょうか?

FPSは一秒間に何フレーム表示するかを示した値で、値が大きい方が計算負荷が小さい(早く推論できる)ということです。

動画1と動画2では、ピクセル推論させる際のソースコードを若干変えています。どちらが良いかは、何をやりたいのかで変わると思います。

使えるシチュエーションは?

  • 画像内の物体を分類(複数可)
  • 物体の大きさを求めたい
  • 物体までの距離を知りたい

などでしょうか。

物体までの距離がリアルタイムに分かると、ロボットアームで物をつかむとか、ドローンを飛ばすときに物体までの距離がどのくらいありどのくらいの時間で到達するか等を推論するのにかなり使えそうです。

でも、リアルタイムで推論させるには計算負荷がかなり大きいので、現場で使うには小型のAI専用チップとかがないとキツいと思います。多分ラズパイでは無理だろうなあ。やったことないけど。

ハードは時間が立てばどんどん進化して行くと思うので、大事なのはどういうロジックでソースコードを書いたか、アイディアが重要だと思います。

まとめ

今日もマニアックな話で申し訳ありません。

でも好きなんで。好きなことしか熱く語れないっす。

まだまだ進化中のプログラムなので、もう少し色々やってみます。

本日もお付き合いいただき、ありがとうございました。