- 必要なコンポーネント
- YOLO
- RaspberryPiへのOpenCVのインストール
- RaspberryPiへの他の必要なパッケージのインストール
- プログラムの説明
- 社会的距離検出器プロジェクトのテスト
Covid-19の時代には、社会的距離は感染性ウイルスの感染を遅らせる効果的な方法です。直接の接触によって病気が伝染するリスクを最小限に抑えるために、人々はお互いの接触を最小限に抑えることをお勧めします。安全な距離を維持することは、工場、銀行、バス、鉄道駅などの多くの場所にとって課題です。
したがって、自動消毒機や非接触温度監視などの以前のコロナ安全プロジェクトの続きとして、ここではOpenCVとRaspberryPiを使用して社会距離拡大検出器システムを構築します。ディープニューラルネットワークモジュールでYOLOv3オブジェクト検出アルゴリズムの重みを使用します。
Raspberry Piは、他のコントローラーよりも多くのメモリと速度を備えているため、画像処理プロジェクトに常に適しています。以前は、顔のランドマーク検出や顔認識アプリケーションなどの複雑な画像処理プロジェクトにRaspberryPiを使用していました。
必要なコンポーネント
- ラズベリーパイ4
ここでは、OpenCVがインストールされたRPi4のみが必要です。ここでは、OpenCVをデジタル画像処理に使用しています。デジタル画像処理の最も一般的なアプリケーションは、オブジェクト検出、顔認識、および人のカウンターです。
YOLO
YOLO(You Only Look Once)は、リアルタイムのオブジェクト検出のためのスマート畳み込みニューラルネットワーク(CNN)です。オブジェクト検出アルゴリズムの最新バージョンであるYOLOv3は、画像やビデオ内の80種類のオブジェクトを認識でき、超高速で優れた精度を備えています。このアルゴリズムは、単一のニューラルネットワークを画像全体に適用してから、画像を領域に分割し、各領域の境界ボックスと確率を計算します。ベースYOLOモデルは、毎秒45フレームでリアルタイムに画像を処理できます。YOLOモデルは、SSDやR-CNNなどの他のすべての検出方法よりも優れています。
このプロジェクトで使用するYOLOV3モデルは、ここからダウンロードできます。
RaspberryPiへのOpenCVのインストール
OpenCVおよびその他の依存関係をインストールする前に、RaspberryPiを完全に更新する必要があります。以下のコマンドを使用して、RaspberryPiを最新バージョンに更新します。
sudo apt-get update
次に、次のコマンドを使用して、RaspberryPiにOpenCVをインストールするために必要な依存関係をインストールします。
sudo apt-get install libhdf5-dev -y sudo apt-get install libhdf5-serial-dev –y sudo apt-get install libatlas-base-dev –y sudo apt-get install libjasper-dev -y sudo apt-get install libqtgui4 –y sudo apt-get install libqt4-test –y
最後に、以下のコマンドを使用してRaspberryPiにOpenCVをインストールします。
pip3 install opencv-contrib-python == 4.1.0.25
OpenCVを初めて使用する場合は、Raspberrypiを使用した以前のOpenCVチュートリアルを確認してください。
- CMakeを使用してRaspberryPiにOpenCVをインストールする
- RaspberryPiとOpenCVによるリアルタイムの顔認識
- RaspberryPiとOpenCVを使用したナンバープレート認識
- OpenCVとRaspberryPiを使用した群集サイズの推定
また、初心者レベルから始まる一連のOpenCVチュートリアルを作成しました。
RaspberryPiへの他の必要なパッケージのインストール
Raspberry Pi for Social距離検出器をプログラミングする前に、他の必要なパッケージをインストールしましょう。
imutilsのインストール: imutilsは、OpenCVを使用して、変換、回転、サイズ変更、スケルトン化、Matplotlib画像の表示などの重要な画像処理機能を簡単にするために使用されます。以下のコマンドを使用して、imutilsをインストールします。
pip3 install imutils
プログラムの説明
完全なコードはページの最後にあります。ここでは、より良い説明のためにコードの重要なセクションを説明しています。
したがって、コードの開始時に、このプロジェクトで使用される予定のすべての必要なライブラリをインポートします。
import numpy as np import cv2 import imutils import os import time
チェック() 関数は、ビデオのフレームに二つのオブジェクトまたは2点間の距離を計算するために使用されます。点aとbは、フレーム内の2つのオブジェクトを示します。これらの2つのポイントは、オブジェクト間のユークリッド距離を計算するために使用されます。
def Check(a、b):dist =((a --b)** 2 + 550 /((a + b)/ 2)*(a --b)** 2)** 0.5キャリブレーション=(a + b )/ 2 if 0 <dist <0.25 *キャリブレーション:Trueを返すelse:Falseを返す
セットアップ機能は、YOLOウェイト、cfgファイル、COCO名ファイルのパスを設定するために使用されます。 os.path モジュールは、一般的なパス名の操作に使用されます。 os.path.join() モジュールは os.pathの サブモジュールで あり 、1つ以上のパスコンポーネントをインテリジェントに結合するために使用されます。 cv2.dnn.readNetFromDarknet() メソッドは、保存された重みをネットワークにロードするために使用されます。重みをロードした後、 net.getLayerNames モデルを使用して、ネットワークで使用されているすべてのレイヤーのリストを抽出します。
def Setup(yolo):グローバルneural_net、ln、LABELS weights = os.path.sep.join()config = os.path.sep.join()labelsPath = os.path.sep.join()LABELS = open(labelsPath ).read()。strip()。split( "\ n")neural_net = cv2.dnn.readNetFromDarknet(config、weights)ln = Neuro_net.getLayerNames()ln = --1] for i in Neuro_net.getUnconnectedOutLayers()]
画像処理機能の内部では、1フレームのビデオを取得し、それを処理して、混雑しているすべての人の間の社会的距離を検出します。関数の最初の2行で、最初にビデオフレームのサイズ(W、H)を(なし、なし)に設定します。次の行では、 cv2.dnn.blobFromImage() メソッドを使用してフレームをバッチでロードし、ネットワークを介して実行しました。blob関数は、フレームで平均減算、 スケーリング、およびチャネルスワッピングを実行します。
(H、W)=(None、None)frame = image.copy()WがNoneまたはHがNoneの場合:(H、W)= frame.shape blob = cv2.dnn.blobFromImage(frame、1 / 255.0、 (416、416)、swapRB = True、crop = False)neural_net.setInput(blob)starttime = time.time()layerOutputs = Neuro_net.forward(ln)
YOLOからのレイヤー出力は、一連の値で構成されます。これらの値は、どの オブジェクト がどの クラスに 属するかを定義するのに役立ちます。 layerOutputsの すべての出力をループし、人を検出しているときに、クラスラベルを「person」として設定します。各検出から、出力で検出するボックスのX中心、Y中心、幅、および高さを示す境界ボックスを取得します。
スコア=検出maxi_class = np.argmax(scores)信頼度=ラベルの場合のスコア== "person":信頼度> 0.5の場合:ボックス=検出* np.array()(centerX、centerY、width、height)= box.astype( "int")x = int(centerX-(width / 2))y = int(centerY-(height / 2))outline.append()confidences.append(float(confidence))
その後、現在のボックスの中心と他のすべての検出されたボックスとの間の距離を計算します。バウンディングボックスが閉じている場合は、ステータスをtrueに変更します。
for i in range(len(center)):for j in range(len(center)):close = Check(center、center)if close:pairs.append(、center])status = True status = True index = 0
次の行では、モデルから受け取ったボックスの寸法を使用して人の周りに長方形を描き、ボックスが安全か危険かを確認します。ボックス間の距離が近い場合、ボックスの色は赤になり、そうでない場合、ボックスは緑になります。
(x、y)=(アウトライン、アウトライン)(w、h)=(アウトライン、アウトライン)if status == True:cv2.rectangle(frame、(x、y)、(x + w、y + h)、 (0、0、150)、2)elif status == False:cv2.rectangle(frame、(x、y)、(x + w、y + h)、(0、255、0)、2)
ループ 関数の内部では、ビデオのすべてのフレームを読み取り、各フレームを処理して人物間の距離を計算しています。
ret、frame = cap.read()if not ret:break current_img = frame.copy()current_img = imutils.resize(current_img、width = 480)video = current_img.shape frameno + = 1 if(frameno%2 == 0またはframeno == 1):Setup(yolo)ImageProcess(current_img)Frame = processedImg
次の行では、 cv2.VideoWriter() 関数を使用して、前に定義したopnameで指定された場所に出力ビデオを保存します。
createがNoneの場合:fourcc = cv2.VideoWriter_fourcc(* 'XVID')create = cv2.VideoWriter(opname、fourcc、30、(Frame.shape、Frame.shape)、True)create.write(Frame)
社会的距離検出器プロジェクトのテスト
コードの準備ができたら、Piターミナルを開き、プロジェクトディレクトリに移動します。コード、Yoloモデル、およびデモビデオは、以下に示すように同じフォルダーにある必要があります。
ここからYoloV3ディレクトリ、Pexelsからビデオをダウンロードし、以下に示すPythonコードをコピーして、上記と同じディレクトリに配置できます。
プロジェクトディレクトリに移動したら、次のコマンドを実行してコードを開始します。
python3detector.py
Pexelsから入手したビデオの例でこのコードを試しました。私にとって、FPSは非常に遅く、ビデオ全体を処理するのに約10〜11分かかりました。
ビデオを使用する代わりに、コードの98行目で cv2.VideoCapture(input) を cv2.VideoCapture(0) に置き換えることで、このコードをRaspberryPiカメラでテストすることもできます。リンクをたどって、RaspberryPiでPiCameraを使用する方法の詳細をご覧ください。
これは、OpenCVをRaspberry Piとともに使用して、社会的距離の違反を検出する方法です。出力ビデオとコードを以下に示します。