#opencv #object-detection #haar-classifier #cascade-classifier
Вопрос:
Я пытаюсь обучить классификатор ХААРА с помощью OpenCV 2.4 обнаруживать головку ракеток для сквоша. К сожалению, результаты с точки зрения точности довольно плохие, и я хотел бы понять, в какой части моего процесса есть недостатки. На данный момент я не беспокоюсь о производительности, так как не буду использовать его в качестве детектора в реальном времени.
Отрицательные образцы
- Я использовал некоторую онлайн-базу данных изображений для получения случайных изображений (разной ширины и высоты).
- Я также добавил пару негативных изображений, связанных со сквошем, таких как пустые корты или фотографии игроков на кортах, где не видно головки ракетки (всего менее 20).
Positive samples
I created a total of 4168 positive samples, of which
- 168 are manually annotated shots of game recordings
- 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.
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)
:
Вопросы
- Реалистичен ли мой вариант использования? Может ли быть какая-либо причина, по которой ракетки особенно трудно обнаружить?
- Достаточно ли моих положительных проб?
- Могут ли быть проблемой углы или отсутствие прозрачного фона в сгенерированных образцах?
- Или соотношение аннотированных вручную к сгенерированным образцам (168:4000) недостаточно?
- Достаточно ли соотношение положительных и отрицательных выборок, используемых для обучения (3900:7000)?
- Подходит ли мой подход к обучению?
- Есть ли что-то не так с моими тренировочными параметрами (например, высота/ширина объекта в контексте формы ракетки)?
- В чем может быть причина того, что моя частота ложных тревог снижается во время тренировок?
Комментарии:
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 имхо является показателем того, что объект слишком сложен для обучения (например, различные вращения не имеют достаточных функций).