【问题标题】:HOG features for object detection using GPU in OpenCV在 OpenCV 中使用 GPU 进行目标检测的 HOG 特征
【发布时间】:2015-09-15 16:45:01
【问题描述】:

在我的项目中,我在 GPU 上计算同一图像中不同级别的 HOG 特征。我的目标是检测以下对象。
1. 卡车
2. 汽车
3. 人
最重要的问题是在多类目标检测器的情况下选择窗口大小。 This 帖子提供了一个很好的基础,但它没有为在多类特征的情况下选择窗口大小提供答案。
为了解决这个问题,我计算了每个正图像在不同级别/分辨率下的 HOG 特征,保持窗口大小(48*96)相同,但每个图像的文件大约为 600 MB,这太大了。
请让我知道在多类对象检测的情况下如何选择窗口大小、块大小和单元格大小。这是我用来计算 HOG 特征的代码。

void App::run()
{
    unsigned int count = 1;
    FileStorage fs;
    running = true;

    //int width;
    //int height;

    Size win_size(args.win_width, args.win_width * 2); 
    Size win_stride(args.win_stride_width, args.win_stride_height);

    cv::gpu::HOGDescriptor gpu_hog(win_size, Size(16, 16), Size(8, 8), Size(8, 8), 9,
                                   cv::gpu::HOGDescriptor::DEFAULT_WIN_SIGMA, 0.2, gamma_corr,
                                   cv::gpu::HOGDescriptor::DEFAULT_NLEVELS);

    VideoCapture vc("/home/ubuntu/Desktop/getdescriptor/images/image%d.jpg");
    Mat frame;
    Mat Left;
    Mat img_aux, img, img_to_show, img_new;
    cv::Mat temp;
    gpu::GpuMat gpu_img, descriptors, new_img;

    char cbuff[20];



    while (running)
    {

        vc.read(frame);


        if (!frame.empty())
        {
            workBegin();

            width  = frame.rows;
            height = frame.cols;

            sprintf (cbuff, "%04d", count);

            // Change format of the image
            if (make_gray) cvtColor(frame, img_aux, CV_BGR2GRAY);
            else if (use_gpu) cvtColor(frame, img_aux, CV_BGR2BGRA);
            else Left.copyTo(img_aux);

            // Resize image
            if (args.resize_src) resize(img_aux, img, Size(args.width, args.height));
            else img = img_aux;
            img_to_show = img;

            gpu_hog.nlevels = nlevels;

            hogWorkBegin();
            if (use_gpu)
            {
                gpu_img.upload(img);
                new_img.upload(img_new);

                fs.open(cbuff, FileStorage::WRITE);


                for(int levels = 0; levels < nlevels; levels++)
                {
                gpu_hog.getDescriptors(gpu_img, win_stride, descriptors, cv::gpu::HOGDescriptor::DESCR_FORMAT_ROW_BY_ROW);
                descriptors.download(temp);

                //printf("size %d %d\n", temp.rows, temp.cols);

                fs <<"level" << levels;                
                fs << "features" << temp;

                cout<<"("<<width<<","<<height<<")"<<endl;

                width =  round(width/scale);
                height = round(height/scale);

                if( width < win_size.width || height < win_size.height )
                break;

                cout<<"Levels "<<levels<<endl;

                resize(img,img_new,Size(width,height));
                scale *= scale;
                }

                cout<<count<< " Image feature calculated !"<<endl;
                count++;
                //width = 640; height = 480;
                scale = 1.05;

            }

            hogWorkEnd();
            fs.release();
          }
           else  running = false;
       }
} 

【问题讨论】:

    标签: c++ opencv computer-vision gpu pattern-recognition


    【解决方案1】:

    应选择窗口大小,s.t.您要检测的对象适合窗口。如果您想为不同类型设置不同的窗口大小,这可能会变得很棘手。

    通常你做的事情如下

    1. 获取每种对象类型的训练数据,并使用在对象已知位置提取的特征训练 [number of object types] 多个模型。
    2. 然后您拍摄每个测试图像并使用滑动窗口方法提取每个位置的特征。然后将这些特征与每个模型进行比较。如果其中一个模型导致得分高于某个阈值,则您已找到该对象。如果不止一个模型得分高于阈值,则只需选择得分最高的模型。

    如果您想使用不同大小的检测窗口,您将获得不同大小的特征向量(根据 HoG 特征的性质)。棘手的是,在测试阶段,您必须使用与使用的对象类型一样多的滑动窗口。这肯定行得通,但您必须多次处理每个测试图像,导致处理时间更长)

    回答您关于尺寸的问题:我无法为您提供任何价值,它始终取决于您的图像。使用上面提到的图像金字塔是处理不同缩放对象的好方法。

    • 窗口大小:整个对象应该适合;必须能被块大小整除
    • 块大小必须能被单元格大小整除

    可以在here 找到可视化 HoG 特征的示例代码。这也有助于理解特征向量的样子。

    编辑: 发现很难,只有cv::Size(8,8) 允许用于单元格大小。见documentation。

    【讨论】:

    • 非常感谢您的精彩回答。我使用了图像金字塔,这样我就不必根据不同的对象计算 HOG 特征。你能告诉我这是正确的方法还是我必须为不同窗口大小的不同对象计算 HOG 特征
    • 不,图像金字塔用于对对象的不同缩放比例进行建模。如果您有靠近您的汽车的图像,则它比远处的汽车更大(以像素计)。您仍然需要不同的窗口大小(如果对象的大小差异很大,如您的情况;汽车的宽度比人的宽度大得多)。因此,您将采用 64/128 的人检测窗口和 128/128 的汽车检测窗口(只是一些数字,实际值实际上取决于您的图像)
    • 我有分辨率为 1224 * 370 的训练图像,如果我计算每个图像的不同级别的 HOG 特征。我得到大约 800 MB 的 yml 文件。我相信我应该调整我的形象。你推荐什么。
    • 谢谢你我明白你关于图像金字塔的观点。我相信我应该选择多少级别会很有趣。
    • 呃,只能硬着头皮学习了:单元格大小必须是 cv::Size(8,8),目前不支持其他大小,见documentation
    猜你喜欢
    • 2012-10-18
    • 2015-08-12
    • 2013-09-14
    • 2015-11-26
    • 1970-01-01
    • 2012-07-22
    • 2014-03-16
    • 2017-08-13
    • 2012-12-24
    相关资源
    最近更新 更多