使用 openCV 级联分类器进行对象检测需要太多时间

Object detection with openCV cascade classifiers taking too much time

我正在尝试通过从连接到覆盆子的三个网络摄像头获取帧来从 raspberry pi 进行对象检测。 目前我想要检测三种类型的对象,所以我训练了三个级联 classifiers,如下所示。

 opencv_traincascade -data data -vec positives.vec -bg bg.txt -numPos 1200 -numNeg 1000 -numStages 11 -minHitRate 0.999 -maxFalseAlarmRate 0.2 -w 24 -h 24 

我正在循环从三个摄像头获取帧,并将每个帧传递给检测 class。

        obj_detection= ObjectDetection()
        for name in camera_names:

            if name not in self.cv2_window_name:
                self.cv2_window_name.append(name)

            frame = datavector[name]
            width, height, channel = frame.shape
            frame=cv2.resize(frame,(int(width/1),int(height/2)),interpolation=cv2.INTER_AREA)  #resizing image helped a little but didnt helped much 
            frame = obj_detection.detect(frame)

            print(time.time())    #to check frame rate currently showing 4 frames per second

            cv2.imshow(name, frame)
            cv2.waitKey(1)  # CV2 Devil

ObjectDetection class

    self.objs['Traffic light']= cv2.CascadeClassifier("../1.xml")
    self.objs['Stop']= cv2.CascadeClassifier("../2.xml")
    self.objs['No Left'] = cv2.CascadeClassifier("../3.xml")

 def detect(self,image):
        self.image=image

        objects = [key for key in self.objs]
        t={}
        for type in objects:
            t[type]=Thread(target = self.detect_obj,args=(self.objs[type],self.image,type))
            t[type].start()
        [t[type].join() for type in objects] 
        return self.image




 def detect_obj(self,classifier,image,type=""):
        self.image=image
        gray_image = cv2.cvtColor(self.image , cv2.COLOR_BGR2GRAY)   
        obj=classifier.detectMultiScale(
            gray_image,
            scaleFactor=1.02,
            minNeighbors=2,
            minSize=(50,50),
            flags=cv2.CASCADE_SCALE_IMAGE
            )



        for (x,y,w,h) in obj:
            cv2.rectangle(self.image,(x,y),(x+w,y+h),(255,219,0),2)

问题是我在检测后每秒获得 4-5 帧,但我至少需要每秒 10 帧。有什么我可以尝试加快检测速度的吗?任何帮助将不胜感激。

NOTE I have also tried Using LBP features while training but that didnt helped .

您正在尝试做 很多 很少

几点回答"How can I try and speed up detection"的问题,这些都是个人意见,但基于经验

  1. RPi 在很大程度上难以快速处理大量相机数据,尤其是在使用三个相机的情况下。它没有大量的处理能力,我建议在没有任何检测的情况下查看您的处理使用情况
  2. 对象检测非常 CPU 密集,即使很少使用,尝试 运行 在三个线程上进行此操作对您的处理器来说可能太多了
  3. 您可以通过 increasing/decreasing 您的比例因子和 min/max 大小来减少您正在做的处理量,这将导致更多的检测(即噪声),但 运行 更快
  4. 调整帧的大小也需要时间,请尝试设置相机,以便它们为您提供正确大小的图像,而不是在运行中调整它们的大小

一些其他注意事项:

  1. 尝试 运行在 g运行iter 处理器(即台式 PC 或笔记本电脑)上运行您的代码,看看这如何提高速度
  2. 正如“@Long Luong”所述,您的 GPU 不足将非常 受到限制
  3. 这本来就是一个难以可靠回答的问题,因为需要考虑所有不同的因素,因此我的回答相当空泛。