Извлечение функций HoG с помощью OpenCV

Я пытаюсь извлечь функции с помощью OpenCV HoG API, однако я не могу найти API, который позволяет мне это делать.

Что я пытаюсь сделать, так это извлечь функции с помощью HoG из всего моего набора данных (заданное количество положительных и отрицательных изображений), а затем обучить мою собственную SVM.

Я заглянул в HoG.cpp под OpenCV, и это не помогло. Все коды скрыты за сложностями и необходимостью обслуживать различное оборудование (например, Intel IPP).

У меня вопрос:

  1. Есть ли какой-либо API из OpenCV, который я могу использовать для извлечения всех этих функций / дескрипторов, которые будут загружены в SVM? Если есть, как я могу использовать его для обучения моей собственной SVM?
  2. Если нет, то есть ли какие-нибудь существующие библиотеки, которые могли бы сделать то же самое?

Пока я фактически портирую существующую библиотеку (http://hogprocessing.altervista.org/) с Processing (Java) на C ++, но это все еще очень медленно, а обнаружение занимает не менее 16 секунд.

Кто-нибудь еще успешно извлекал функции HoG, как вы это обошли? И есть ли у вас какие-нибудь открытые исходные коды, которые я мог бы использовать?

заранее спасибо


comment
Думаю, вам может помочь эта страница: geocities.ws/talh_davidc   -  person SomethingSomething    schedule 08.01.2016


Ответы (4)


Вы можете использовать класс hog в opencv следующим образом

HOGDescriptor hog;
vector<float> ders;
vector<Point> locs;

Эта функция вычисляет характеристики свиньи за вас

hog.compute(grayImg, ders, Size(32, 32), Size(0, 0), locs);

Характеристики HOG, вычисленные для grayImg, сохраняются в ders векторе, чтобы преобразовать его в матрицу, которую можно использовать позже для обучения.

Mat Hogfeat(ders.size(), 1, CV_32FC1);

for(int i=0;i<ders.size();i++)
    Hogfeat.at<float>(i,0)=ders.at(i);

Теперь ваши функции HOG хранятся в матрице Hogfeat.

Вы также можете установить размер окна, размер ячейки и размер блока, используя объект hog следующим образом:

hog.blockSize = 16;
hog.cellSize = 4;
hog.blockStride = 8;

// This is for comparing the HOG features of two images without using any SVM 
// (It is not an efficient way but useful when you want to compare only few or two images)
// Simple distance
// Consider you have two HOG feature vectors for two images Hogfeat1 and Hogfeat2 and those are same size.

double distance = 0;
for(int i = 0; i < Hogfeat.rows; i++)
    distance += abs(Hogfeat.at<float>(i, 0) - Hogfeat.at<float>(i, 0));

if (distance < Threshold)
    cout<<"Two images are of same class"<<endl;
else
    cout<<"Two images are of different class"<<endl;

Надеюсь, это будет полезно :)

person G453    schedule 26.07.2012
comment
в настоящее время я не могу это проверить, потому что XCode 4.4 каким-то образом повредил большинство установленных библиотек. Я сообщу вам позже, когда мне удастся решить эту проблему - person sub_o; 26.07.2012
comment
Вы можете использовать простое евклидово расстояние в качестве сопоставителя .... Я отредактировал ответ, см. Тот же ответ выше :) - person G453; 01.08.2012
comment
@Sistu Спасибо, я наконец-то могу извлечь функции, но мне все равно нужно добавить их в мою собственную SVM. - person sub_o; 07.08.2012
comment
Я использую OpenCV 2.3.1, но в этой версии у меня нет HOGDescriptor::compute(). Какую версию OpenCV вы использовали в этом ответе? - person Yamaneko; 07.01.2013
comment
Извините, только что узнал, что он также работает в OpenCV 2.3.1. Я использовал cv::gpu::HOGDescriptor вместо cv::HOGDescriptor. Спасибо! - person Yamaneko; 07.01.2013
comment
Привет, я использую opencv 2.4.9, и описанный вами подход не работает. Я получаю сообщение об ошибке, что ни одна из перегруженных функций не соответствует списку аргументов. Не могли бы вы обновить свой ответ, чтобы он соответствовал opencv2.4.9? - person spurra; 21.09.2014

Я также написал программу сравнения двух свиней с помощью статьи выше. И я применяю этот метод, чтобы проверить, меняется ли область ROI или нет. См. Страницу здесь. исходный код и простое введение

person Jeonghyun Kim    schedule 27.02.2015
comment
В качестве ответа не может быть принята только ссылка, опишите в ответе нужную часть ссылки. - person Thirumalai murugan; 27.02.2015

Вот и версия GPU.

cv::Mat temp;
gpu::GpuMat gpu_img, descriptors;

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);
gpu_img.upload(img);
gpu_hog.getDescriptors(gpu_img, win_stride, descriptors, cv::gpu::HOGDescriptor::DESCR_FORMAT_ROW_BY_ROW);
            descriptors.download(temp);
person Community    schedule 26.06.2015

OpenCV 3 предоставляет некоторые изменения в способах использования алгоритмов графического процессора (например, CUDA) пользователем, см. Руководство по переходу - CUDA.

Чтобы обновить ответ от user3398689 до OpenCV 3, вот фрагмент кода:

#include <opencv2/core/cuda.hpp>
#include <opencv2/cudaimgproc.hpp>

[...]

/* Suppose you load an image in a cv::Mat variable called 'src' */

int img_width  = 320;
int img_height = 240;
int block_size = 16;
int bin_number = 9;

cv::Ptr<cv::cuda::HOG> cuda_hog = cuda::HOG::create(Size(img_width, img_height),
                                                    Size(block_size, block_size),
                                                    Size(block_size/2, block_size/2),
                                                    Size(block_size/2, block_size/2),
                                                    bin_number);

/* The following commands are optional: default values applies */
cuda_hog->setDescriptorFormat(cuda::HOG::DESCR_FORMAT_COL_BY_COL);
cuda_hog->setGammaCorrection(true);
cuda_hog->setWinStride(Size(img_width_, img_height_));

cv::cuda::GpuMat image;
cv::cuda::GpuMat descriptor;

image.upload(src);

/* May not apply to you */
/* CUDA HOG works with intensity (1 channel) or BGRA (4 channels) images */
/* The next function call convert a standard BGR image to BGRA using the GPU */
cv::cuda::GpuMat image_alpha;
cuda::cvtColor(image, image_alpha, COLOR_BGR2BGRA, 4);

cuda_hog->compute(image_alpha, descriptor);

cv::Mat dst;
image_alpha.download(dst);

Затем вы можете использовать дескрипторы в переменной dst по своему усмотрению, например, как предлагает G453.

person Claudio    schedule 22.02.2017