roboflowブログ

 roboflow活用事例
Pythonを使用して画像内のオブジェクトをカウントする方法
Pythonを使用して画像内のオブジェクトをカウントする方法
海岸線のある地域の調査を行っているシナリオを考えてみましょう。既存のドックが日中過密にならないように、別のドックを建設することが適切かどうかを理解したいと考えています。これはコンピュータービジョンで解決できる問題です。

コンピューター ビジョンを使用すると、画像内のさまざまなオブジェクトを識別できます。その後、コードを使用して、画像内の特定のオブジェクトのインスタンス数をカウントできます。

このガイドでは、海岸線の航空写真に表示されるオブジェクトの数を数える方法について説明します。画像内にいくつのボートとジェット スキーがあるかを確認できるように、オブジェクト タイプごとにカウントを保持します。

さっそく始めましょう!

Python で画像内のオブジェクトを数える方法
画像内のオブジェクトをカウントするには、まず、コンピューター ビジョン モデルによって返されるすべての予測を含むリストが必要です。Roboflow でホストされている Aerial Maritime モデルを使用しますが、任意のモデルを使用できます。

私たちのモデルは次のことを予測します。

  1. ボート
  2. ドック
  3. ジェットスキー
  4. リフト
始める前に、辞書のリストを含む「予測」と呼ばれるリストがコード内にあることを確認してください。各ディクショナリには、予測クラスの名前と、参照したい補助情報 (つまり、予測の座標) が含まれている必要があります。

予測リストの例を次に示します。

{'predictions': [{'x': 127.0, 'y': 566.0, 'width': 78.0, 'height': 104.0, 'confidence': 0.8159579038619995, 'class': 'dock'}, {'x': 1200.0, 'y': 475.5, 'width': 52.0, 'height': 85.0, 'confidence': 0.7788712978363037, 'class': 'dock''}]
この画像で前述のオブジェクトのすべてのインスタンスを数えましょう。

RoboflowとRepl.itを使用してYOLOv8モデルをデプロイする方法
各クラスがリストに表示される回数をカウントする Python 関数を作成できます。

def count_instances(predictions: dict) -> dict:
    classes = {}

    for bounding_box in predictions['predictions']:
        if bounding_box['class'] in classes:
            classes[bounding_box['class']] += 1
        else:
            classes[bounding_box['class']] = 1

    return classes
    
inference.save("aerial_with_bounding_boxes.jpg")
この関数では、「classes」という辞書を作成します。次に、各予測を反復処理します。クラスごとに、「classes」ディクショナリ内のそのクラスのカウンターに 1 を追加します。クラスがディクショナリにない場合、クラスは値 1 で追加されます。

コードの最後の行は、予測をファイルに保存して、プロットを確認できるようにします。Roboflow モデルを実行していない場合は、このコードをコメントアウトできます。

コードを実行して、何が起こるか見てみましょう。次の出力が返されます。

{'dock': 4, 'jetski': 1, 'lift': 5}
この辞書は私たちに多くの情報を与えてくれます。モデルによると、画像にはボートがないと結論付けることができます。また、写真が撮影された時点では、ドックにはボートがありませんでした。さらに結論を導き出すこともできます。

画像内のオブジェクトの数を数えることに成功しました!

また、コードは予測をプロットし、「aerial_with_bounding_boxes.jpg」という名前の画像に保存しました。このファイルを開いて、モデルのパフォーマンスを確認できます。

オブジェクトのカウント後にロジックを追加する
カウントされたオブジェクトの数が多すぎる場合に何かを行うロジックをコードに追加できます。たとえば、混雑しているドックが見つかったときに、レコードを CSV ファイルに保存するコードを作成できます。

with open("results.csv", "w+") as f:
    writer = csv.writer(f)

    writer.writerow(["class", "count", "image"])

    if results["boat"] > 0:
        writer.writerow(["boat", results["boat"], "aerial.jpeg"])
このコードは、aerial.jpeg 画像で 10 隻を超えるボートが見つかった場合にレコードを CSV ファイルに書き込みます。このコードは、画像のフォルダー全体で動作するように適合させることができ、各画像に対して実行され、ドックが混雑しているインスタンスをログに記録します。

モデルの構成 (オプション)
上記の例では、Roboflow UniverseでホストされているAerial Maritimeプロジェクトを使用しています。これは、110,000を超えるコンピュータービジョンデータセットと10,000を超えるトレーニング済みモデルのオープンリポジトリです。

ブラウザーでプロジェクトを開き、[デプロイ] をクリックして、データセットをテストできます。これにより、モデルを操作できるインタラクティブなウィジェットが開きます。画像をモデルにドラッグして、予測を取得します。

Roboflow pip パッケージを使用して、コードで予測を取得できます。パッケージを使用するには、まずコマンド ラインからインストールします。

pip install roboflow
次に、[デプロイ] タブを下にスクロールし、表示される Python コードをコピーします。このコードにより、モデルを Python プログラムにロードできます。コードは次のようになります。

from roboflow import Roboflow

rf = Roboflow(api_key="YOUR_API_KEY")

project = rf.workspace().project("aerial-maritime")
model = project.version(22).model
YOUR_API_KEY テキストを API キーに置き換えます。これは、[展開] タブのコードに自動的に表示されます。

画像の予測を取得するには、次のコードを使用します。

inference = model.predict("aerial.jpg", confidence=40, overlap=30)

predictions = inference.json()
これにより、前の例で使用できる予測の JSON オブジェクトが返され、画像内で識別された各クラスが表示される回数をカウントできます。

結論
このガイドでは、Python を使用して画像内のオブジェクトをカウントする方法について説明しました。Python 辞書を使用して、提供された画像に各オブジェクトが表示された回数を数えました。次に、コードをロジックに接続して、画像内に 10 隻を超えるボートが見つかったときにレコードを CSV ファイルに保存しました。これは、海岸線のエリアで別のドックが必要になる可能性があることを示しています。

これで、画像内のオブジェクトをカウントするために必要な情報が得られました。

アノテーション・AI学習データ(教師データ)作成・AIモデル構築ツール「roboflow」

お問い合せ

お問い合せはこちら

AI活用の機械学習を自動化するツール「roboflow」についてのご質問・ご相談はこちら

お電話でのお問い合せも受け付けています。お気軽にご相談ください。

03-5821-9761