OpenCV: detectMultiScale() дает слишком много точек вне объекта

Я целый день тренировал свой компьютер с opencv_traincascade обнаруживать монеты номиналом 2 евро, используя более 6000 позитивных изображений, подобных следующему:

введите здесь описание изображения

Теперь я только что попытался запустить простую программу OpenCV, чтобы увидеть результаты и проверить файл cascade.xml. Конечный результат очень разочаровал:

введите здесь описание изображения

На монете много точек, но есть и много других точек на фоне. Может ли быть проблема с моими положительными изображениями, используемыми для обучения? Или, может быть, я использую detectMultiScale() с неправильными параметрами?

Вот мой код:

#include "opencv2/opencv.hpp"

using namespace cv;

int main(int, char**) {

  Mat src = imread("2c.jpg", CV_LOAD_IMAGE_COLOR); 

  Mat src_gray;

  std::vector<cv::Rect> money;

  CascadeClassifier euro2_cascade;

  cvtColor(src, src_gray, CV_BGR2GRAY );
  //equalizeHist(src_gray, src_gray);

  if ( !euro2_cascade.load( "/Users/lory/Desktop/cascade.xml" ) ) {
     printf("--(!)Error loading\n");
     return -1;
  }

  euro2_cascade.detectMultiScale( src_gray, money, 1.1, 0, CV_HAAR_FIND_BIGGEST_OBJECT|CV_HAAR_SCALE_IMAGE, cv::Size(10, 10),cv::Size(2000, 2000) );

  for( size_t i = 0; i < money.size(); i++ ) {
     cv::Point center( money[i].x + money[i].width*0.5, money[i].y + money[i].height*0.5 );
     ellipse( src, center, cv::Size( money[i].width*0.5, money[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 );
  }

  //namedWindow( "Display window", WINDOW_AUTOSIZE );
  imwrite("result.jpg",src);
}

Я также попытался уменьшить количество соседей, но эффект тот же, только с меньшим количеством точек... Может ли быть проблемой тот факт, что на позитивных изображениях есть эти 4 угла в качестве фона вокруг монеты? Я сгенерировал png-изображения с помощью Gimp из снятого видео, показывающего монету, поэтому я не знаю, почему opencv_createsamples ставит эти 4 угла.


person SagittariusA    schedule 29.01.2016    source источник
comment
Смотрите мой ответ в этом вопросе. если у вас 6000 изображений, вы можете попробовать дескрипторы hog из dlib. stackoverflow.com/questions/ 34344825/   -  person TruckerCat    schedule 29.01.2016
comment
@R_Valdez Спасибо за добрый и интересный комментарий. Есть ли какой-нибудь простой учебник, который вы можете связать со мной? Потому что я очень новичок во всем этом и сразу запутался...   -  person SagittariusA    schedule 29.01.2016
comment
Я не знаю никакого учебника для этого. Но код примера dlib очень хорошо прокомментирован. Это почти как учебник. Я рекомендую вам скачать dlib и поиграть с примером кода. Также вы должны прочитать сообщение в блоге, это очень полезно (blog.dlib.net/2014/02/)   -  person TruckerCat    schedule 29.01.2016
comment
вы не должны использовать все положительные изображения, а только монету с небольшим фоном вокруг нее (поскольку монета круглая, или используйте только внутренний прямоугольник монеты для обучения)   -  person Micka    schedule 29.01.2016
comment
Не уверен, но вы сделали одну фотографию монеты и просто добавили это (одно и то же изображение) на множество разных фонов, чтобы использовать их в качестве позитивных изображений? Вместо этого вы должны получить много разных изображений только монет (например, немного разных ракурсов, разных камер и т. д.) и использовать их как позитивные изображения.   -  person Micka    schedule 29.01.2016
comment
взгляните на этот coding-robin .de/2013/07/22/ и как он обрезал изображения вокруг бананов   -  person Micka    schedule 29.01.2016
comment
Я получил 100 изображений/кадров всего за 2€ из короткого видео, которое я снял на свой iphone. Затем я использовал VideoCapture для получения изображений. Затем я объединил их с более чем 3000 фоновых изображений с помощью команды opencv_createsamples. Я строго следовал этому руководству: memememememememe.me/training-haar-cascades   -  person SagittariusA    schedule 29.01.2016
comment
@Micka Хорошо, я понял, что ты сказал. Я не знаю, что думать. Во всех других руководствах говорилось, что я должен комбинировать изображения монет со случайным фоном, и эти результаты используются как положительные... :(   -  person SagittariusA    schedule 29.01.2016
comment
@Micka, если вы прокрутите учебник, на который у вас есть ссылки, вы увидите, что этот парень делает то же самое, комбинируя изображения обрезанных бананов со случайным фоном. Так же, как я...   -  person SagittariusA    schedule 29.01.2016


Ответы (2)


Эти позитивные изображения просто неправильные

Чем больше «шума» вы даете своим изображениям в частях обучающих данных, тем надежнее они будут, но да, тем больше времени потребуется для обучения. Однако именно здесь вступают в действие ваши отрицательные образцы. Если у вас есть как можно больше отрицательных обучающих выборок с максимально возможным количеством диапазонов, вы создадите более надежные детекторы. Вы должны убедиться, что ваши позитивные изображения содержат только ваши монеты, а все ваши негативные изображения содержат все, кроме монет.

Я видел пару ваших вопросов до сих пор, и я думаю, что вы хотите обнаружить три разных типа монет евро. Лучше всего обучить три классификатора на этих разных монетах, а затем запустить все три на своих изображениях.

Я также думаю, что вам не хватает ключевого знания о том, как работает HAAR (или LBP или что-то еще), эффективно он создает набор «функций» из ваших положительных изображений, а затем пытается найти эти функции в изображениях, которые вы запускаете классификатор. Он создает эти особенности, выясняя, чем отличаются ваши позитивные образы от негативных. Вы не хотите ничего, что не будет тем, что вы пытаетесь обнаружить в своих позитивных образах.

Редактировать 1 — пример

Представьте себе создание классификатора для дорожного знака «Стоп», который аналогичен обнаружению монет. Он большой, красный и шестиугольный. Создать для этого классификатор относительно просто — если не путать этап обучения с ошибочными данными.

Правка 2 — Масштабирование изображений:

Вы также должны помнить, что при запуске этапа обнаружения он берет ваш классификатор и начинает с малого, а затем масштабируется. Крупные очевидные особенности будут обнаружены быстрее — в моем предыдущем примере большие красные пятна и шестиугольные формы. Затем он начнется с небольших функций, например, текста или чисел.

Редактировать 3 — гораздо лучший пример

Это пример очень хорошо показывает, как работает обучение детектора каскадных объектов. На самом деле это даже тот же пример, что и со знаком стоп!

person GPPK    schedule 29.01.2016
comment
Извините, если я настаиваю на этом, но я действительно запутался: во многих уроках я читал, что положительные изображения — это случайный фон плюс монета. Нет, вы говорите, что я должен использовать только монету в качестве положительных... Так что же мне делать? Пожалуйста, объясните мне, как если бы вы разговаривали с дураком, потому что я совсем запутался. - person SagittariusA; 29.01.2016
comment
Эти учебники неверны. Вы хотите, чтобы ваши положительные изображения были только тем, что вы хотите обнаружить, а затем ваши отрицательные образцы включали все остальное (или, по крайней мере, настолько, насколько это практически возможно). - person GPPK; 29.01.2016
comment
Я обновил свой ответ, чтобы дать больше базовых знаний и лучший учебник. - person GPPK; 29.01.2016
comment
Спасибо за добрый ответ. очень интересно... Боюсь, я не узнаю все за одну ночь, но у меня очень мало времени. Таким образом, я должен запустить opencv_traincascade, где положительные изображения ТОЛЬКО с монетами, не так ли? - person SagittariusA; 29.01.2016
comment
Да, положительные образцы только с тем, что вы хотите обнаружить, отрицательные образцы со всем остальным. Учись и живи по этой фразе - person GPPK; 29.01.2016
comment
Спасибо ГППК... Сейчас запущу вычисления, надеюсь все будет хорошо. Я изучу вашу документацию, в том числе и потому, что мне нужно написать кое-что о состоянии дел в своей диссертации... Вы дали мне работу на выходные. Я дам Вам знать. Спасибо от души за это время. - person SagittariusA; 29.01.2016
comment
Последнее дело! Когда я запускаю эту команду opencv_traincascade -data final -vec 2.vec -bg negatives.txt -numPos 12000 -numNeg 3000 -numStages 20 -featureType HAAR -precalcValBufSize 2048 -precalcIdxBufSize 2048 -minHitRate 0.999 -maxFalseAlarmRate 0.5 -w 48 -h 48 -mode ALL, нет ссылки на Positives.txt... таким образом, на положительные изображения ссылаются внутри файла .vec, верно? - person SagittariusA; 29.01.2016
comment
Да, vec создается другим инструментом, и они там есть. - person GPPK; 29.01.2016
comment
Извините, но я не очень понимаю... У меня есть Positives.txt, который содержит список всех изображений только с монетой, а их 60. Затем у меня есть 12000 образцов изображений, которые представляют собой случайные фоновые изображения с монетой ( созданный opencv_createsamples)... Итак, как мне сгенерировать этот файл .vec? пожалуйста, напишите команду, потому что я действительно не понимаю - person SagittariusA; 29.01.2016
comment
Везде читал, что vec файл создается из семплов, а вы сказали, что это не так, он создается только по позитивам (изображения только с монетой)... запутался :( - person SagittariusA; 29.01.2016
comment
@GPPK как насчет размеров положительных образцов? Лучше или даже необходимо предоставить их все в одном масштабе/размере? Например, минимальный обнаруживаемый размер? - person Micka; 30.01.2016
comment
@GPPK с помощью этой команды opencv_createsamples -vec i.vec -w 48 -h 48 -num 210 -img ./positives/i.jpg -maxidev 100 -maxxangle 0 -maxyangle 0 -maxzangle 0.9 -bgcolor 0 -bgthresh 0 (для i от 0 до 60) я создал файл vec, учитывающий только положительные обрезанные изображения монеты (без случайного фона) ... это то, что вы имели в виду? - person SagittariusA; 03.02.2016
comment
Очевидно, я объединил все файлы .vec в один - person SagittariusA; 03.02.2016

Чтобы обнаружить изображение монеты евро, вы можете использовать несколько методов:

1) Обучить каскад OpenCV (HAAR или LBP). Не забывайте использовать большое количество ложных образов. Также расширьте изображение монеты (добавьте рамку).

2) Оцените изображение с градиентами абс исходного изображения. Используйте преобразование Хафа, чтобы обнаружить круги (монета имеет форму круга).

person Maxim    schedule 29.01.2016
comment
Как я сказал в своем вопросе, я тренировал каскад OpenCV со многими изображениями (6000 положительных и более 3000 отрицательных), и вычисления заняли очень много времени, но это результат ... Я не могу объяснить себе, почему так много точек вне монеты... - person SagittariusA; 29.01.2016
comment
Эффективность классификатора HAAR сильно зависит от вариантов обучения. Например, мои параметры для определения номерных знаков: - person Maxim; 29.01.2016
comment
Значит, это не зависит от положительных образов, не так ли? Я имею в виду тот факт, что вокруг монеты есть эти 4 угла ... Я попробую еще один тренинг с вариантами, которые вы написали ... спасибо - person SagittariusA; 29.01.2016
comment
Изображение монеты не должно касаться края изображения (в образце поезда). - person Maxim; 29.01.2016
comment
извините, все это очень ново для меня... что вы имеете в виду? - person SagittariusA; 29.01.2016
comment
Попробуйте использовать LBP - это намного быстрее (для поезда и для работы). - person Maxim; 29.01.2016
comment
только вчера я попытался запустить свою программу с cascade.xml, сгенерированным LBP, но это не сработало. Я не получил НИ ОДНОГО положительного момента на своем фото, оно было совершенно пустым :( - person SagittariusA; 01.02.2016