0

Я выполняю проект, который включает в себя обнаружение объектов с несколькими классами. Моя цель - обнаружить следующие объекты.
1. Грузовик
2. Автомобиль
3. Лицо
Поскольку у меня есть три различных объекта, это означает, что у меня будет три разных размера окна. Но функции HOG для блоков останутся прежними. Я взломал OpenCV hog.cpp и сделал две новые функции для вычисления дескрипторов HOG только для блоков. Вот мой код.Понимание особенностей функции HOG

void cv::gpu::HOGDescriptor::getDescriptorsBlock(const GpuMat& img, Size win_stride, GpuMat& descriptors, FileStorage fs3, string fileName, double scale, int width, int height, size_t lev) 
{ 
    CV_Assert(win_stride.width % block_stride.width == 0 && win_stride.height % block_stride.height == 0); 

    size_t block_hist_size = getBlockHistogramSize(); 
    computeBlockHistograms(img); 
    Size blocks_per_img = numPartsWithin(img.size(), block_size, block_stride); 

    // Size blocks_per_win = numPartsWithin(win_size, block_size, block_stride); 
    // Size wins_per_img = numPartsWithin(img.size(), win_size, win_stride); 

    // copy block_hists from GPU to CPU/ 

    float dest_ptr[block_hist_size * blocks_per_img.area()]; 

    cudaMemcpy(&dest_ptr[0], block_hists.ptr<float>(), block_hist_size *blocks_per_img.area()*sizeof(CV_32F),  cudaMemcpyDeviceToHost); 

    std::cout<<"("<<width<< " ," << height<< ")"<< std::endl; 
    std::cout <<lev<< std::endl; 

    // write to yml file 

    int level = lev; 

    fs3<<"Scale"<<scale; 
    fs3 <<"Level"<<level; 
    fs3<<"Width"<<width<<"Height"<<height; 
    fs3 << "features" << "["; 
    for (unsigned int i = 0; i < (block_hist_size * blocks_per_img.area()) ; i++) 
    { 
    fs3 << dest_ptr[i]; 
    } 
    fs3 << "]"; 
} 

Аналогична, чтобы получить блок дескрипторы для многомасштабных

void cv::gpu::HOGDescriptor::getDescriptorsMultiScale(const GpuMat& img, 
               Size win_stride, double scale0, unsigned int count) 
{ 

    CV_Assert(img.type() == CV_8UC1 || img.type() == CV_8UC4); 

    vector<double> level_scale; 
    double scale = 1.; 
    int levels = 0; 

    for (levels = 0; levels < nlevels; levels++) 
    { 
     level_scale.push_back(scale); 
     if (cvRound(img.cols/scale) < win_size.width || 
      cvRound(img.rows/scale) < win_size.height || scale0 <= 1) 
      break; 
     scale *= scale0; 
    } 
    levels = std::max(levels, 1); 
    level_scale.resize(levels); 
    image_scales.resize(levels); 

    // open yml file with image ID 

    FileStorage fs3; 
    char fileName[20]; 
    GpuMat descriptors; 
    sprintf (fileName, "%04d", count); 
    fs3.open(fileName, FileStorage::WRITE); 

    for (size_t i = 0; i < level_scale.size(); i++) 
    { 
     scale = level_scale[i]; 
     Size sz(cvRound(img.cols/scale), cvRound(img.rows/scale)); 
     GpuMat smaller_img; 

     if (sz == img.size()) 
      smaller_img = img; 
     else 
     { 
      image_scales[i].create(sz, img.type()); 
      switch (img.type()) 
      { 
       case CV_8UC1: hog::resize_8UC1(img, image_scales[i]); break; 
       case CV_8UC4: hog::resize_8UC4(img, image_scales[i]); break; 
      } 
      smaller_img = image_scales[i]; 
     } 
     std::cout<<"scale "<<level_scale[i]<<std::endl; 

     // calculate descriptors for blocks 
     getDescriptorsBlock(smaller_img, win_stride, descriptors, fs3, fileName, scale, smaller_img.cols, smaller_img.rows, i); 

     // detect(smaller_img, locations, hit_threshold, win_stride, padding); 
    } 
    // close yml file 
    fs3.release(); 

} 

Моего вопроса был бы понять структуру макета HOG дескрипторов только для блока. Может ли кто-то поделиться своими мыслями?

ответ

0

Как правило, использование пирамиды изображения часто применяется, чтобы стать масштабным инвариантом. Если вы хотите получить более изощренный подход, взгляните на эту статью «Обнаружение объекта с дискриминированным обучением Частичные модели» [1]. Им действительно удалось использовать HoG в разных масштабах. Конечно, оригинальная бумага HoG может быть полезна для понимания структуры самой функции [2], если это больше того, что вам нужно.

[1] http://vision.ics.uci.edu/papers/FelzenszwalbGMR_PAMI_2009/FelzenszwalbGMR_PAMI_2009.pdf

[2] http://lear.inrialpes.fr/people/triggs/pubs/Dalal-cvpr05.pdf

Смежные вопросы