OpenCVとPythonを使ったオブジェクト検出
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
いいね!
このチュートリアルが参考になりましたか?もしご興味があれば、私の他のトピックについての投稿もご覧ください。フォローやいいねをしていただけると嬉しいです。
それと、コーヒーが大好きです。
こちらの記事はdev.toの良い記事を日本人向けに翻訳しています。
https://dev.to/ethand91/object-detection-with-opencv-and-yolo-22oj