【Python】画像から物体の種類、座標、幅、高さを検出する

Python

以前、keras-yolo3を使用して画像と動画から物体検出を行う方法を書きました。

【Python】keras-yolo3を使用して物体検出

keras-yolo3を利用すると画像から物体を検出して、検出した物体のクラス名と
確率を画像に出力してくれます。

Photo by rawpixel.com from Pexels

検出した物体を切り抜きたいときは、物体の座標、幅、高さが必要になります。
keras-yolo3を利用して物体の種類、左上の座標、幅、高さを求められるようにしてみます。

object-detection-keras-yolo3の利用方法

keras-yolo3のコードを利用して物体の種類、左上の座標、幅、高さを画像から検出する
Pythonスクリプトを作成しました。

kazusapg/object-detection-keras-yolo3
This script uses keras-yolo3 to detect the top left coordinates, width and height of the objects in the image. - kazusapg/object-detection-keras-yolo3

keras-yolo3のweight変換方法を踏襲しているので、検出できる物体は80種類です。
検出できる物体はこちらを参照してください。

インストール方法

object-detection-keras-yolo3のダウンロード

gitでcloneをする場合は以下を入力してください。

またはgithubのページ右側の緑色のclone or downloadをクリック後
Download ZIPを選択し、ファイルをダウンロードしてから解凍してください。

Pipenvを利用したインストール

Pipenvで仮想環境を作成する場合はコマンドプロンプトまたはPowerShellで
object-detection-keras-yolo3フォルダに移動後、pipenv installを入力します。
必要なパッケージをインストールした後に、pipenv shellで仮想環境に入ります。

venvを利用したインストール

venvで仮想環境を作成する場合はコマンドプロンプトまたはPowerShellで
object-detection-keras-yolo3フォルダに移動後、requirements.txtを利用して
必要なパッケージをインストールします。

仮想環境を利用しないインストール

requirements.txtを利用して必要なパッケージをインストールします。

YOLOv3 weightsの変換

YOLO: Real-Time Object DetectionからYOLOv3 weightsをダウンロードします。

YOLO: Real-Time Object Detection
You only look once (YOLO) is a state-of-the-art, real-time object detection system.

weightsファイルはページ内のhere(237MB)をクリックするとダウンロードできます。

You already have the config file for YOLO in the cfg/ subdirectory. You will have to download the pre-trained weight file here (237 MB).

ダウンロードしたweightsファイルをobject-detection-keras-yolo3フォルダに移動し、
下記のコマンドを入力してweightsファイルをkerasで利用できる形に変換します。

 

使用方法

  1. keras.yolo3からYOLOクラスをインポートします。
  2. objectsからget_objects_informationをインポートします。
  3. YOLOクラスのインスタンスを作成します。
  4. YOLOインスタンスと画像のファイルパスを引数としてget_objects_information関数を
    呼び出します。
  5. get_objects_information関数は、検出した物体ごとにdictionaryを生成し、
    生成したdictionaryをListに加えて返します。物体が検出できないときは空のListを返します。

get_objects_information関数内で生成されるdictionaryは
下記のキーを参照することで、それぞれの物体の情報を取得できます。

  • predicted_name 検出した物体のクラス名(人、自転車、車など)
  • x 検出した物体の左上座標のx位置
  • y 検出した物体の左上座標のy位置
  • width 検出した物体の幅
  • height 検出した物体の高さ

使用例

下記の画像から物体の情報を取得してみます。

Photo by rawpixel.com from Pexels

コードは以下になります。
画像はsample_picture.jpgという名前でpictureフォルダに保存されているとします。

画像内に人が2人写っているので、get_objects_information関数から
2つのdictionaryを含んだ状態でListが返ってきます。

List内のそれぞれのdictionaryを利用して、Pillowで保存した画像は下記の2つになります。

 

コメント