Самообучение классификатора ХААРА приводит к разочаровывающе низкой точности

#opencv #object-detection #haar-classifier #cascade-classifier

Вопрос:

Я пытаюсь обучить классификатор ХААРА с помощью OpenCV 2.4 обнаруживать головку ракеток для сквоша. К сожалению, результаты с точки зрения точности довольно плохие, и я хотел бы понять, в какой части моего процесса есть недостатки. На данный момент я не беспокоюсь о производительности, так как не буду использовать его в качестве детектора в реальном времени.

Отрицательные образцы

  • Я использовал некоторую онлайн-базу данных изображений для получения случайных изображений (разной ширины и высоты). отрицательный 1введите описание изображения здесь
  • Я также добавил пару негативных изображений, связанных со сквошем, таких как пустые корты или фотографии игроков на кортах, где не видно головки ракетки (всего менее 20). отрицательное руководство

Positive samples

I created a total of 4168 positive samples, of which

  • 168 are manually annotated shots of game recordings
    manually annotated 1manually annotated 2
  • 4000 are samples created using opencv_createsamples
    opencv_createsamples -img img/sample/r2_white.png -bg img/neg.txt -info img/generated/info.txt -pngoutput img/generated -maxxangle 0.85 -maxyangle -0.85 -maxzangle 0.85 -num 4000
    I used relatively high max angles as I felt this would be more representative of how Squash rackets occur on match recordings.
    generated 1generated 2

Vector

After consolidating the annotations of the manually annotated and the generated samples, I created the vector with the following parameters:
opencv_createsamples -info img/pos_all.txt -num 4168 -w 25 -h 25 -vec model/vector/positives_all.vec -maxxangle 0.85 -maxyangle -0.85 -maxzangle 0.85

Training

I trained the model with the following parameters. Again added -mode ALL as I felt rotations of the features would be more representative of real world squash games.
opencv_traincascade -data ../model -vec ../model/vector/positives_all.vec -bg neg.txt -numPos 3900 -numNeg 7000 -numStages 10 -w 25 -h 25 -numThreads 12 -maxFalseAlarmRate 0.3 -mode ALL -precalcValBufSize 3072 -precalcIdxBufSize 3072

The training took about 10 hours in total but even at the 100th sample of the last stage the false alarm was still 0.84 (provided that I interpret the training output correctly).
The lowest was 0.74 at the end of Stage 5.

===== TRAINING 9-stage =====
<BEGIN
POS count : consumed 3900 : 4095
NEG count : acceptanceRatio 7000 : 0.0304295
Precalculation time: 16

N HR FA
1 1 1
2 1 1
3 1 1
4 1 1
5 1 1
6 1 1
7 1 0.998857
98 0.995128 0.840857
99 0.995128 0.850571
100 0.995128 0.842714

КОНЕЦ>

Исход

Классификатор, похоже, не очень хорошо справляется с множеством ложных срабатываний и ложных отрицаний. Я поиграл с параметрами minNeighbors и scaleFactor, но безрезультатно. В приведенном ниже случае я использую detectMultiScale(gray, 2, 75) : исход

Вопросы

  1. Реалистичен ли мой вариант использования? Может ли быть какая-либо причина, по которой ракетки особенно трудно обнаружить?
  2. Достаточно ли моих положительных проб?
    • Могут ли быть проблемой углы или отсутствие прозрачного фона в сгенерированных образцах?
    • Или соотношение аннотированных вручную к сгенерированным образцам (168:4000) недостаточно?
  3. Достаточно ли соотношение положительных и отрицательных выборок, используемых для обучения (3900:7000)?
  4. Подходит ли мой подход к обучению?
    • Есть ли что-то не так с моими тренировочными параметрами (например, высота/ширина объекта в контексте формы ракетки)?
    • В чем может быть причина того, что моя частота ложных тревог снижается во время тренировок?

Комментарии:

1. Насколько я понимаю, классификаторы хаара имеют проблемы с большими вращениями (x,y,z). Успешные классификаторы haar для человеческих лиц обучены одной ориентации, и поэтому существует один для лицевой стороны, а другой для боковой. Кроме того, вам понадобится больше отрицательных проб (лучше всего пустые суды и лица). При создании образцов вы должны убедиться, что применен прозрачный фон. Лучше увеличить количество этапов и увеличить частоту ложных срабатываний до 0,5.

2. Спасибо @Micka. Особенно бит вращения-хорошая подсказка. Я подумал, что мне, вероятно, придется взглянуть на детекторы глубокого обучения, чтобы этот пример сработал, но в то же время я просто хотел бы выяснить, в чем основные проблемы с моим подходом здесь.

3. в качестве примера, для отрицательных образцов я использовал 150 тыс. отрицательных небольших изображений и около 50 тыс. полноразмерных изображений. С 15 тысячами положительных образцов объектов и с этими настройками: -numPos 12500 -numNeg 25000 -minHitRate 0.999 -maxFalseAlarmRate 0.5 -w 24 -h 24 Наиболее важная информация во время обучения: Коэффициент принятия отрицательных значений: Это должно примерно соответствовать вашей максимальной частоте ложных срабатываний на этапе, поэтому, если у вас есть 0,5 maxFAR, вы должны увидеть около 0,5 после этапа 0, 0,5^2 после этапа 1 и т. Д. Если это значение намного меньше, ваши отрицательные образцы недостаточно различимы. Если слишком высокий, классификатор слишком слаб

4. все образцы были взяты непосредственно из промышленного примера использования, поэтому область обучения и целевая область были известны довольно хорошо

5. 0.03 на этапе 9 по сравнению с теоретическим 0.3^9 = 0.000019683 имхо является показателем того, что объект слишком сложен для обучения (например, различные вращения не имеют достаточных функций).