OpenCVとPythonを使ったオブジェクト検出

OpenCVとPythonを使ったオブジェクト検出のためのカバー画像

Ethan

2022年4月14日に投稿

はじめに

こんにちは!このチュートリアルでは、PythonとOpenCVを使ったシンプルなオブジェクト検出の実装方法をご紹介します。😀

このチュートリアルは、以下の投稿で述べた重みなどが必要です:
https://dev.to/ethand91/setting-up-yolo-with-darknet-1ehm

プロジェクトのセットアップ

まず、「weights」ディレクトリに以下のファイルを追加する必要があります:

  • coco.names
  • yolov3.cfg
  • yolov3.weights

また、仮想環境を初期化する必要があります:

python3 -m venv env
source env/bin/activate

mkdir weights
cp [darknet directory]/cfg/coco.names weights/
cp [darknet directory]/cfg/yolov3.cfg weights/
cp [darknet directory]/yolov3.weights

依存関係のインストール

次に、サンプルに必要な依存関係をインストールします。"requirements.txt"ファイルを作成し、次の内容を追加してください:

# requirements.txt
opencv-python
argparse
numpy

そして、次のコマンドでインストールします:

pip install -r requirements.txt

ソースコードの記述

まず、必要なモジュールをインポートする必要があります:

import numpy as np
import argparse
import cv2

次に、必要な変数を宣言し、ネットワークモデルを初期化します:

LABELS_FILE = "weights/coco.names"
CONFIG_FILE = "weights/yolov3.cfg"
WEIGHTS_FILE = "weights/yolov3.weights"
CONFIDENCE_THRESHOLD = 0.3

LABELS = open(LABELS_FILE).read().strip().split("\n")

np.random.seed(4)
COLORS = np.random.randint(0, 255, size = (len(LABELS), 3), dtype = "uint8")

net = cv2.dnn.readNetFromDarknet(CONFIG_FILE, WEIGHTS_FILE)

次の関数は、画像内で検出されたオブジェクトをループし、信頼度が最小限のしきい値を超えているかどうかをチェックし、そうであればboxes配列にボックスと検出された座標を追加します。

そして、検出が複数あることを確認し、その場合は画像上にボックスとオブジェクトラベル、信頼度を描画します。

最後に、変更された画像が画面に表示されます。

def drawBoxes(image, layerOutputs, H, W):
  # [...] (同上のコードブロック内容)

次の関数は、与えられたパスから画像ファイルを読み込み、画像からブロブを作成し、ネットワークの入力に設定します。

次に、レイヤー出力を取得し、上で定義された関数に必要な変数を渡します。

def detectObjects(imagePath):
  # [...] (同上のコードブロック内容)

もちろん、main関数も必要です。argparseを使ってコマンドラインからファイルパスを読み取り、上の関数を呼び出し、その後ユーザーがキーを押すまで待ちます。

終了後には、ウィンドウを破棄することでクリーンアップします。

if __name__ == "__main__":
  # [...] (同上のコードブロック内容)

プログラムの実行

以下のコマンドでプログラムを実行できます:

python main.py -i horses.png

上手くいけば、以下の画像が表示されるはずです:

サンプル

いろいろな画像で試してみてください。😎

まとめ

この投稿では、PythonとOpenCVを使ったシンプルなオブジェクト検出を実装する方法をご紹介しました。

このチュートリアルのソースコードはGitHubで見ることができます:
https://github.com/ethand91/object-detect

いいね!

このチュートリアルが参考になりましたか?もしご興味があれば、私の他のトピックについての投稿もご覧ください。フォローやいいねをしていただけると嬉しいです。
それと、コーヒーが大好きです。

「Buy Me A Coffee」

こちらの記事はdev.toの良い記事を日本人向けに翻訳しています。
https://dev.to/ethand91/object-detection-with-opencv-and-yolo-22oj