使用 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"的问题,这些都是个人意见,但基于经验
- RPi 在很大程度上难以快速处理大量相机数据,尤其是在使用三个相机的情况下。它没有大量的处理能力,我建议在没有任何检测的情况下查看您的处理使用情况
- 对象检测非常 CPU 密集,即使很少使用,尝试 运行 在三个线程上进行此操作对您的处理器来说可能太多了
- 您可以通过 increasing/decreasing 您的比例因子和 min/max 大小来减少您正在做的处理量,这将导致更多的检测(即噪声),但 运行 更快
- 调整帧的大小也需要时间,请尝试设置相机,以便它们为您提供正确大小的图像,而不是在运行中调整它们的大小
一些其他注意事项:
- 尝试 运行在 g运行iter 处理器(即台式 PC 或笔记本电脑)上运行您的代码,看看这如何提高速度
- 正如“@Long Luong”所述,您的 GPU 不足将非常 受到限制
- 这本来就是一个难以可靠回答的问题,因为需要考虑所有不同的因素,因此我的回答相当空泛。
我正在尝试通过从连接到覆盆子的三个网络摄像头获取帧来从 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"的问题,这些都是个人意见,但基于经验
- RPi 在很大程度上难以快速处理大量相机数据,尤其是在使用三个相机的情况下。它没有大量的处理能力,我建议在没有任何检测的情况下查看您的处理使用情况
- 对象检测非常 CPU 密集,即使很少使用,尝试 运行 在三个线程上进行此操作对您的处理器来说可能太多了
- 您可以通过 increasing/decreasing 您的比例因子和 min/max 大小来减少您正在做的处理量,这将导致更多的检测(即噪声),但 运行 更快
- 调整帧的大小也需要时间,请尝试设置相机,以便它们为您提供正确大小的图像,而不是在运行中调整它们的大小
一些其他注意事项:
- 尝试 运行在 g运行iter 处理器(即台式 PC 或笔记本电脑)上运行您的代码,看看这如何提高速度
- 正如“@Long Luong”所述,您的 GPU 不足将非常 受到限制
- 这本来就是一个难以可靠回答的问题,因为需要考虑所有不同的因素,因此我的回答相当空泛。