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

时间:2018-02-09 13:11:19

标签: python opencv cascade-classifier

我正试图通过从三个摄像头相机附加到覆盆子的镜架来对覆盆子pi进行物体检测。 目前我有三种类型的对象我想要检测,所以我训练了三个级联分类器如下。

 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 

我从循环中的三个摄像头获取帧并将每个帧传递给Detection类。

        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

中的

    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帧。有什么我可以尝试加快检测?任何帮助将受到高度赞赏。

  

注意我在训练时也尝试过使用LBP功能,但这并没有帮助。

1 个答案:

答案 0 :(得分:2)

您正试图在很少

有几点可以回答“如何尝试和加快检测速度”的问题,这些都是基于经验的意见

  1. RPi在很大程度上难以快速处理大量相机数据,尤其是三台相机。它没有大量的处理能力,我建议在没有任何检测的情况下查看您的处理使用情况
  2. 对象检测非常占用大量CPU资源,即使在少量使用时,尝试在三个线程上运行它也可能对处理器来说太过分了
  3. 您可以通过增加/减少比例因子和最小/最大尺寸来减少您正在进行的处理量,这将导致更多的检测(即噪音),但会更快地运行
  4. 调整帧的大小也需要时间,尝试并设置相机,以便它们为您提供正确尺寸的图像,而不是动态调整大小
  5. 其他几点说明:

    1. 尝试在多处理器处理器(即台式PC或笔记本电脑)上运行代码,看看它如何提高速度
    2. 正如“@Long Luong”所说,缺少GPU将非常限制
    3. 由于需要考虑的所有不同因素,这本质上是一个难以回答的难题,因此我的回答非常好。