Teaprog.com

とあるエンジニアの日々の記録。エンジニアと関係のないようなことも書きます。

YOLOv3における検出領域の座標取得

はじめに

 

以下の記事もご参考までに。

 

teaprog.com

 

私はYOLOv3において、座標の取得を行うコードを探し、コードを少しいじったことがあります。

 

今回は標準出力に検出領域の座標を表示できるようにしてみたいと思います。

 

初期状態の検出結果は以下のようになります。

 

標準出力

 

f:id:tk0137:20210530203752j:plain

 

出力画像

 

f:id:tk0137:20210530203819j:plain

 

余談ですが、上の犬の写真はその界隈ではけっこう有名な画像です。

 

標準出力の方には予測したオブジェクト名とパーセンテージの表示が表示されています。

 

一方、出力画像の方には検出領域が矩形で囲まれた画像が出力されています。

 

しかし、この四角形の面積を調べたりしたい時など、座標の値が知りたい場面が出てくる可能性があります。

 

しかし嬉しいことに、実はコードを1行追加するだけで上の矩形の角4点の座標を出力させることができます。

 

標準出力で検出結果領域の座標を表示させたり、用途に合わせて出力結果を変える方法を不勉強ながら書いてみようと思います。

 

今回はYOLOv3というかなり古いバージョンでの説明になります。

 

後継のYOLOv4や5で大きなコードの変更はなされていつかどうかは分かりませんが、あくまでもご参考になればという所存でございます。

 

検出領域の座標に関するコード

 

YOLOv3のソースコードの中で、検出領域の座標の表示に関するコードを見ていきたいと思います。

 

ファイルの場所

 

/darknet/src/image.c

 

このC言語で書かれたこのファイルの284行目辺りのこの部分です。 

 

f:id:tk0137:20210530194332j:plain

 

"left"、"right"、"top"、"bot"という変数にそれぞれ座標が代入されていることがわかります。

 

ちなみにですが、プログラムで扱われる画像ファイルの座標は左上の座標を(0,0)とし、縦軸は下、横軸は右へ行くほど座標値が大きくなる、という形式が多いです。

 

要は右下へ行くほど座標が大きくなる、ということです。

 

なので、このコードの直後に「printf」などの関数を使用して標準出力で座標を出力させることができます。

 

下のように変えてみます。

 

f:id:tk0137:20210530204236j:plain

 

「printf」関数でいい感じに出力されるようにコードを1行だけ追加。

 

「make」を実行した後、再び検出してみます。

 

f:id:tk0137:20210530204605j:plain

 

座標が表示されたことが確認できました。

 

しかし、「get_color」という意図しない文字列が表示されてしまいましたので、再びコードを見直してみようと思います。

 

すると、らしきものが同じ「image.c」ファイルから見つかりました。

 

25行目辺りになります。

 

f:id:tk0137:20210530205256j:plain

 

この上の図に示した行をコメントアウトした後、「make」を実行し、もう一度検出をしました。

 

f:id:tk0137:20210530210305j:plain

 

実行結果は以下のようになりました。

 

f:id:tk0137:20210530210858j:plain

 

思うような結果が表示されました。

 

検出対象の下にその検出領域の座標が出力されており、位置的にも座標は矩形の4点の位置と一致していそうです。

 

簡単でしたが、以上になります。

 

ご参考になれば幸いです。

 

まとめ 

 

YOLOv3による検出画像の矩形の座標が表示できるようにコードを変更しました。

 

/darknet/src/image.c

 

 この上のファイルの284行目辺りにたった1行コードを追加するだけで、座標が出力されました。

 

YOLOv3自体、使用される方は限られてくると思いますが、少しでも参考になった、役に立ったと感じてくだされば幸いです。

 

ありがとうございました。