pythonとOpencvによる顔検出のマルチプロセッシングまたはマルチスレッド化

最近、ラズベリーパイ3(OSはラズビアン)でOPENCVとPYTHONを使ってライブカメラで顔を検出する作業をしています。そして、私はラズベリーパイ3でopencvを使用して検出された顔は非常に遅く、約4〜5FPS / sを参照してください。そこで、マルチスレッドやマルチプロセシングを使用して、FPSを高速化することができるのでしょうか?

どのようなアイデアでも構いませんので、私を助けてください。ありがとうございます。

を更新しました。カメラからの画像をキャプチャするために別のスレッドを使用していますが、シリアルと比較してFPSのスピードアップが見られません...。私のコードをご覧ください。

import threading
import time
import cv2
import numpy as np
class myThread (threading.Thread):
    def __init__(self, src):
        print("thread -------------init-------------")
        threading.Thread.__init__(self)
        self.cap = cv2.VideoCapture(src)
        self.stop = False
    def run(self):
        while(self.stop == False):
            self.ret, self.frame = self.cap.read()

    def Stop(self):
        self.cap.release()
        self.stop = True

    def read(self):
        return self.ret, self.frame

recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('trainer/trainer.yml')
cascadePath = "haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascadePath);

thread = myThread(0)
thread.start()
time.sleep(1)

start = time.time()
frames = 0
font = cv2.FONT_HERSHEY_SIMPLEX
cap = cv2.VideoCapture(0)
while(True):
    ret, frame = thread.read()
    frame = cv2.resize(frame, (640, 480))
    frames += 1
    gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    faces = faceCascade.detectMultiScale(gray, 1.2, 5)
    for(x,y,w,h) in faces:
        # Create rectangle around the face
        cv2.rectangle(frame, (x-20,y-20), (x+w+20,y+h+20), (0,255,0), 4)
        Id, con = recognizer.predict(gray[y:y+h,x:x+w])
        print(Id, con)

        # Check the ID if exist
        if(con < 60):
            if(Id == 1):
                Id = "HUY"
            if(Id == 2):
                Id = "HOA"
        #If not exist, then it is Unknown
        else:
            #print(Id)
            Id = "Unknow"

        # Put text describe who is in the picture
        cv2.rectangle(frame, (x-22,y-90), (x+w+22, y-22), (0,255,0), -1)
        cv2.putText(frame, str(Id), (x,y-40), font, 2, (255,255,255), 3)  

    if cv2.waitKey(10) & 0xFF == ord('q'):
        thread.Stop()
        break
    cv2.imshow("frame", frame) 
end = time.time()
second = end - start
print("second:", + second)
print(frames/second)
cv2.destroyAllWindows()
解説 (0)

はい、マルチスレッドで処理することができます。 Python 2 では threading ライブラリを、Python 3 では thread ライブラリを使用してください。

以下は簡単な例です。

メインスレッドの他に

カメラを操作し、最新のフレームを常に更新するスレッド(この場合はグローバル)を1つだけ用意します。

def camera_thread():       
    cam = cv2.VideoCapture(1)
    _ret, self.image = cam.read()
    cv2.imshow('camera', self.image)

2番目のスレッドは最新フレームを使用してモデルから推論を実行することができます。

オプションの第3のスレッドは、おそらく顔の上にバウンディングボックスを描画したり、他の操作を実行したりすることができます。

この場合、モデルからの出力を得てからでないとボックスの描画を開始できないため、2番目と3番目のスレッドの間でミューテックスロックが必要になることがあります。これにより、2番目のスレッドは他のスレッドを待たずに次のフレームの推論を開始することができます。

上記の例では、推論が少し遅れてスムーズなビデオ出力になります。マルチスレッドの仕組みがよく分からない場合は、まず基本的なことを読んでおくことをお勧めします。

解説 (4)