38

OpenCV の HoG API を使用して機能を抽出しようとしていますが、それを可能にする API が見つからないようです。

私がやろうとしているのは、HoG を使用してすべてのデータセット (一定数の正と負の画像) から特徴を抽出し、独自の SVM をトレーニングすることです。

OpenCV の下で HoG.cpp をのぞき見しましたが、役に立ちませんでした。すべてのコードは複雑さの中に埋もれており、さまざまなハードウェア (Intel の IPP など) に対応する必要があります。

私の質問は:

  1. SVM に供給されるすべての機能/記述子を抽出するために使用できる OpenCV の API はありますか? それを使用して自分の SVM をトレーニングするにはどうすればよいですか?
  2. 存在しない場合、同じことを達成できる既存のライブラリはありますか?

これまでのところ、実際に既存のライブラリ (http://hogprocessing.altervista.org/) を Processing (Java) から C++ に移植していますが、それでも非常に遅く、検出には少なくとも 16 秒かかります。

HoG 機能の抽出に成功した人は他にいますか? そして、私が使用できるオープンソースコードはありますか?

前もって感謝します

4

4 に答える 4

50

次のようにopencvでhogクラスを使用できます

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;

お役に立てば幸いです:)

于 2012-07-26T05:41:53.267 に答える
3

上記の記事を参考にしながら、2 hog 機能のプログラムも書いてみました。そして、この方法を適用してROI領域が変化するかどうかを確認します。こちらのページをご参照ください。 ソースコードと簡単な紹介

于 2015-02-27T04:39:14.670 に答える
3

こちらも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);
于 2015-06-26T20:20:50.493 に答える
1

OpenCV 3 では、ユーザーが GPU アルゴリズム (つまり 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);

その後、たとえば G453 で提案されているように、「dst」変数で好きなように記述子を使用できます。

于 2017-02-22T22:40:23.160 に答える