OpenCV 3.0 - SVM + HOG дает одинаковые неправильные ответы при обнаружении получеловекаC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 OpenCV 3.0 - SVM + HOG дает одинаковые неправильные ответы при обнаружении получеловека

Сообщение Anonymous »

Я работаю над детектором полутел, чтобы улучшить работу обычного детектора людей. Я знаю, что есть другие способы справиться с окклюзией, но это то, что меня попросили сделать в конце моего дипломного проекта. Моя проблема в том, что я не получаю хорошей производительности, более того, у меня получается шаблон, в котором 4 прямоугольника, представляющие обнаружения, отображаются почти в одном и том же положении, даже не представляя половину тела.
У меня есть набор изображений, включающий 414 изображений верхней половины тела, обрезанных мной и использованных в качестве положительных образцов, и 8520 отрицательных изображений. Все они размером 64х64. Я извлек дескрипторы HOG следующим образом:

Код: Выделить всё

int i;
string imgname, index;

HOGDescriptor hog (Size(64,64), Size(16,16), Size(8,8), Size(8,8), 9, 1, -1, HOGDescriptor::L2Hys, 0.2,false, HOGDescriptor::DEFAULT_NLEVELS, false);

vector pos_rec_descript;
vector
 locations;
size_t SizeDesc;
SizeDesc = hog.getDescriptorSize();

FileStorage fpd ("Pos_Descriptors.yml", FileStorage::WRITE);

for (i = 1; i < 415; i++) { // 2416 images in ./pos_rec
stringstream a;
a  & hog_detector );

void get_svm_detector(const Ptr& svm, vector< float > & hog_detector )
{
// get the support vectors
Mat sv = svm->getSupportVectors();
const int sv_total = sv.rows;
// get the decision function
Mat alpha, svidx;
double rho = svm->getDecisionFunction(0, alpha, svidx);

CV_Assert( alpha.total() == 1 && svidx.total() == 1 && sv_total == 1 );
CV_Assert( (alpha.type() == CV_64F && alpha.at(0) == 1.) ||
(alpha.type() == CV_32F && alpha.at(0) == 1.f) );
CV_Assert( sv.type() == CV_32F );
hog_detector.clear();

hog_detector.resize(sv.cols + 1);
memcpy(&hog_detector[0], sv.ptr(), sv.cols*sizeof(hog_detector[0]));
hog_detector[sv.cols] = (float)-rho;
}

int main(int argc, char** argv)
{
Mat img;
FILE* f = 0;
char _filename[1024];

if( argc == 1 )
{
printf("Usage: peopledetect (People_imgs | People_imgs.txt)\n");
return 0;
}
img = imread(argv[1]);

if( img.data )
{
strcpy(_filename, argv[1]);
}
else
{
f = fopen(argv[1], "rt");
if(!f)
{
fprintf( stderr, "ERROR: the specified file could not be loaded\n");
return -1;
}
}

// Load SVM

Ptr svm = SVM::create();

svm = cv::Algorithm::load("../SVM_Train/SVM3_WS16_P0_LINEAR.yml");

HOGDescriptor hog (Size(64,64), Size(16,16), Size(8,8), Size(8,8), 9, 1, -1, HOGDescriptor::L2Hys, 0.2,false, HOGDescriptor::DEFAULT_NLEVELS, false);

vector  hog_detector;
get_svm_detector (svm, hog_detector);

hog.setSVMDetector(hog_detector);
namedWindow("people detector", 1);

for(;;)
{
char* filename = _filename;
if(f)
{
if(!fgets(filename, (int)sizeof(_filename)-2, f))
break;
//while(*filename && isspace(*filename))
//  ++filename;
if(filename[0] == '#')
continue;
int l = (int)strlen(filename);
while(l > 0 && isspace(filename[l-1]))
--l;
filename[l] = '\0';
img = imread(filename);
}
printf("%s:\n", filename);
if(!img.data)
continue;

fflush(stdout);
vector found, found_filtered, searchLocations;
vector found_weights;
double t = (double)getTickCount();
// run the detector with default parameters.  to get a higher hit-rate
// (and more false alarms, respectively), decrease the hitThreshold and
// groupThreshold (set groupThreshold to 0 to turn off the grouping completely).
hog.detectMultiScale(img, found, found_weights, 0, Size(16,16), Size(0,0), 1.01, 2);
//hog.detect(img, found, 0, Size(16,16), Size(0,0), searchLocations);
t = (double)getTickCount() - t;
printf("tdetection time = %gms\n", t*1000./cv::getTickFrequency());
size_t i, j;
for( i = 0; i < found.size(); i++ )
{
Rect r = found[i];
for( j = 0; j < found.size(); j++ )
if( j != i && (r & found[j]) == r)
break;
if( j == found.size() )
found_filtered.push_back(r);
}
for( i = 0; i < found_filtered.size(); i++ )
{
Rect r = found_filtered[i];
// the HOG detector returns slightly larger rectangles than the real objects.
// so we slightly shrink the rectangles to get a nicer output.
r.x += cvRound(r.width*0.1);
r.width = cvRound(r.width*0.7);
r.y += cvRound(r.height*0.07);
r.height = cvRound(r.height*0.7);
rectangle(img, r.tl(), r.br(), cv::Scalar(0,255,0), 2);
imshow("people detector", img);
waitKey(0);
}
//imshow("people detector", img);
//string imgname = "./Responses/Win_Stride16_4.png";
//imwrite(imgname, img);
int c = waitKey(0) & 255;
if( c == 'q' || c == 'Q' || !f)
break;
}
if(f)
fclose(f);
return 0;
}
Я проверил все размеры дескрипторов, все коврики в порядке. Но в то время, когда я использую defineMultiScale, он показывает такие вещи:
Изображение 1: Это странно, потому что отсутствует множество обнаружений.
Изображение 2: Здесь я понял, что с этими четырьмя прямоугольниками существует своего рода шаблон.
Моя проблема в том, что независимо от того, что я меняю (дескрипторы, ядро, winStride и дополнение в обнаруженииMultiScale), всегда есть очень похожие ответов, и ничто не указывает на правильное обнаружение.
Я не очень уверен в том, как я передаю векторы поддержки HOG, но это единственный способ, который я нашел сделайте это (нашёл в одном из постов StackOverflow).
Если кто-нибудь из вас имеет представление о том, что здесь происходит и почему ответы не меняются от одной конфигурации к другой, я был бы очень благодарен. Этот код уже несколько недель вызывает у меня головную боль. Я менял параметры функций, HOG, менял ядра, пробовал разные наборы изображений, но, похоже, ничто не дало значительных изменений в конечном результате.

Подробнее здесь: https://stackoverflow.com/questions/408 ... -detection
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Возникновение исключения при попытке обучить функции svm + hog в C++
    Anonymous » » в форуме C++
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Почему узкое место move_mean дает разные ответы для массивов разных размеров, но используя одинаковые значения
    Anonymous » » в форуме Python
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Почему онлайн-судья дает мне неправильные ответы? [дубликат]
    Anonymous » » в форуме JAVA
    0 Ответы
    44 Просмотры
    Последнее сообщение Anonymous
  • Тест на простоту дает неправильные ответы на большие числа? [закрыто]
    Anonymous » » в форуме C++
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous
  • Python fastapi дает неправильные ответы
    Anonymous » » в форуме Python
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»