如何改进openCV人员检测算法?

How can i improve openCV people detecting algorithm

本文关键字:检测 算法 何改进 openCV      更新时间:2023-10-16

我正在尝试编写人类探测器,它现在工作,但有时它对猫/盒子等做出反应,我也得到了5 fps。所以问题是,我如何改进我的算法以获得更好的fps和检测精度。

我试过用这个:http://www.pyimagesearch.com/2015/11/09/pedestrian-detection-opencv/

但是我找不到任何方法我可以在android上使用这个。

public Mat onCameraFrame(CvCameraViewFrame inputFrame) {    
        List<MatOfPoint> list = new ArrayList<>();
            Mat frame = new Mat();
            Mat gray = new Mat();
            Mat hierarchy = new Mat();
            Mat originalFrame = inputFrame.rgba();

            Imgproc.medianBlur(originalFrame,originalFrame,3);
            Imgproc.cvtColor(originalFrame, gray, Imgproc.COLOR_RGB2GRAY, 0);
            HOGDescriptor hog = new HOGDescriptor();
            //Получаем стандартный определитель людей и устанавливаем его нашему дескриптору
            MatOfFloat descriptors = HOGDescriptor.getDefaultPeopleDetector();
            hog.setSVMDetector(descriptors);
            MatOfRect locations = new MatOfRect();
            MatOfDouble weights = new MatOfDouble();
            hog.detectMultiScale(gray, locations, weights);
            Point rectPoint1 = new Point();
            Point rectPoint2 = new Point();
            Point fontPoint = new Point();
            if (locations.rows() > 0) {
                List<Rect> rectangles = locations.toList();
                for (Rect rect : rectangles) {
                    rectPoint1.x = rect.x;
                    rectPoint1.y = rect.y;
                    fontPoint.x  = rect.x;
                    fontPoint.y  = rect.y - 4;
                    rectPoint2.x = rect.x + rect.width;
                    rectPoint2.y = rect.y + rect.height;
                    final Scalar rectColor = new Scalar( 0  , 0 , 0  );
                    // Добавляем на изображения найденную информацию
                    Imgproc.rectangle(originalFrame, rectPoint1, rectPoint2, rectColor, 2);
                }
            }

            frame.release();
            gray.release();
            hierarchy.release();
            list.clear();
            return originalFrame;
        }

你正在使用HOG+SVM方法来检测人;它本质上是相当缓慢的。然而,你可以使用这个问题中的一些建议,如何加快svm.predict?

根据你的问题,例如,如果相机是静态的,而行人在移动,你可以选择背景减法,这可能是最有效的方法,但要记住,这将拾取场景中移动的任何物体,所以你可以包括阈值来删除小物体。一些背景减法算法包括混合高斯法(MOG)或混合高斯法(MOG2)或混合高斯法(GMG)。此外,需要注意的重要一点是,这些方法依赖于创建场景的背景模型,也就是说,它们假设静态像素随着时间的推移成为背景的一部分,因此,当行人在场景中静止一段时间时,他们会嵌入背景,导致误检。有很多论文提供了这个问题的潜在解决方案,所以你可能想看看它们,这里有一篇产生了不错的结果:使用分割高斯模型的通量张量进行静态和移动目标检测

此外,您可以选择数据驱动的方法,要么获得一个良好的预训练模型并使用它进行检测,要么使用TensorFlow, Caffe或Torch自己训练一个,并使用dnn opencv_contrib模块进行检测。