Jump to content
Compvision.ru
dmitryctc

Тренировка (haar cascade training)

Recommended Posts

Всем привет!
Вот и закончились праздники.
Пока они были - успел заинтересоваться возможностями openCV.
Прошу не кидаться камнями, ибо относительно недавно занялся изучением, и могу делать глупые ошибки.
В общем, поигрался с мануалами (детектирование лица на видео, котики на фото).
Захотел попробовать натренировать свою xml (haar cascade training) для определения, есть ли на видео рыбки (аквариумные).
Правильно ли я вижу процесс тренировки? : 
1. Я должен подготовить две выборки фотографий (позитивные и негативны) c (например) ~1000 и 3000 примеров соответственно ;
2. Разложить их по папкам good и bad; на уровне корня создать два файла: good.dat и bad.dat
3. Привожу к общему формату положительные : opencv_createsamples.exe -info something\Good.dat -vec samples.vec -w 20 -h 20
4. Создаю финальный каскад xml: opencv_traincascade.exe -data haarcascade -vec samples.vec -bg something\Bad.dat -numStages 16 -minhitrate 0.999 -maxFalseAlarmRate 0.4 -numPos 200 -numNeg 500 -w 20 -h 20 -mode ALL -precalcValBufSize 1024 -precalcIdxBufSize 1024

на втором пункте у меня возникают некоторые вопросы:
 - какого размера должны быть good и bad фотографии? Нужно делать их на профессиональный фотоаппарат, или хватит камеры телефона? Должен ли быть у них одинаковый размер?
 - если в файле bad.dat, согласно статьи с хабра,  должно быть просто перечисление фотографий, то в файле good.dat, цитирую "Кроме пути должно быть указанно положение рассматриваемого объекта и его размер.".
если я сделаю несколько фотографий рыбки в аквариуме, мне нужно будет потом эти фотографии в ручную обрезать, найти у каждой фотографии координаты рыбки и указать?


Пока больше вопросов нет. Искал по форуму ответы - не смог найти. 
Заранее спасибо!)

Share this post


Link to post
Share on other sites

1. количество примером чем больше тем лучше. Количество положительных и отрицательных должно быть примерно равным. 

2. Положительный пример - это фотография где есть искомый объект. Т.е. это целая фотография, в которой указывается область где есть объект. Обрезать ничего не нужено.  Сам размер области и всей фотографии не важен. Но каскад у вас 20 на 20, т.е. квадрат и область желательно делать тоже квадратной. И да надо будет руками отмечать области.

3. Отрицательный пример - это фонография где нет искомого объекта. ЕЕ размер тоже не важен.

4. Качество телефона вполне хватит.

 

  • Like 1

Share this post


Link to post
Share on other sites
В 13.01.2018 at 10:07, iskees сказал:

1. количество примером чем больше тем лучше. Количество положительных и отрицательных должно быть примерно равным. 

2. Положительный пример - это фотография где есть искомый объект. Т.е. это целая фотография, в которой указывается область где есть объект. Обрезать ничего не нужено.  Сам размер области и всей фотографии не важен. Но каскад у вас 20 на 20, т.е. квадрат и область желательно делать тоже квадратной. И да надо будет руками отмечать области.

3. Отрицательный пример - это фонография где нет искомого объекта. ЕЕ размер тоже не важен.

4. Качество телефона вполне хватит.

 

спасибо за ответы. возникли ещё пара вопросов:

5. Отрицательные примеры должны быть чёрно-белые, и цветные?

6. Положительные примеры должны быть чёрно-белыми, или цветными ?

 

на некоторых ресурсах встречал обучение именно на чёрно-белых картинках, чему был удивлён

Share this post


Link to post
Share on other sites

Всё чёрно-белое (grayscale). Можно подавать и цветное, но цвет не используется.

  • Like 1

Share this post


Link to post
Share on other sites
В 18.01.2018 at 14:22, Nuzhny сказал:

Всё чёрно-белое (grayscale). Можно подавать и цветное, но цвет не используется.

спасибо. 

и ещё возникшие вопросы) 

пытался научить находить пачку молока на фотографии. Как положительные - использовал такие фотографии, как прикреплённая; как отрицательные - примерно такая же фото, только пачка молока на ней отсутствует. Всего 800 положительных и 2300 отрицательных фотографий.

при создании файла vec с помощью opencv_createsamples задавал параметры -w 10 -h 30

при самой тренировке с помощью opencv_traincascade использовал следующие параметры: 

 -numStages 16 -minhitrate 0.999 -maxFalseAlarmRate 0.4 -numPos 700 -numNeg 2300 -w 10 -h 30 -mode ALL -precalcValBufSize 1024 -precalcIdxBufSize 1024

после окончания обучения (обучение длилось ~15 часов), при использовании получившегося каскада коробка с молоком всё равно не распознавалась. 
 

Верно ли я задавал параметры и сделал фотографии, или что-то я сделал не так ?

 

Snapshot_20180121_2461 — копия.JPG

Share this post


Link to post
Share on other sites
4 minutes ago, dmitryctc said:

пытался научить находить пачку молока на фотографии. Как положительные - использовал такие фотографии, как прикреплённая; как отрицательные - примерно такая же фото, только пачка молока на ней отсутствует. Всего 800 положительных и 2300 отрицательных фотографий.

при создании файла vec с помощью opencv_createsamples задавал параметры -w 10 -h 30

Данных маловато, конечно. Рекомендуется несколько тысяч - несколько десятков тысяч только положительных примеров. Отрицательных примерно также, но классификатор нарежет их сам. Если база такая маленькая, то лучше попробовать HOG.

И... почему такие маленькие размеры? 10 на 30! Лучше раза в два или четыре больше. И ты уверен, что пропорции верные?

Время обучения несколько часов или несколько суток - это нормально.

Share this post


Link to post
Share on other sites

DLIB-овский детектор лучше работает и обучается относительно быстро, и данных требует не так много.

http://blog.dlib.net/2014/02/dlib-186-released-make-your-own-object.html

В примерах есть пример обучения и инструмент для разметки данных.

Share this post


Link to post
Share on other sites
17 minutes ago, Smorodov said:

DLIB-овский детектор лучше работает и обучается относительно быстро, и данных требует не так много.

Кстати да. Тот же детектор автомобильных номеров на классификаторе из dlib (продвинутый HOG, насколько я понял что-то типа DPM) работает намного лучше, чем детектор из OpenCV на основе каскадов Хаара (data/haarcascades/haarcascade_russian_plate_number.xml).

Share this post


Link to post
Share on other sites

> детектор автомобильных номеров на классификаторе из dlib

А из коробки есть?

Share this post


Link to post
Share on other sites
52 minutes ago, mrgloom said:

> детектор автомобильных номеров на классификаторе из dlib

А из коробки есть?

Нет, но тренируется элементарно по датасету с Хабра. Что показательно, как раз на этом датасете и сделан приведённый выше каскад Хаара. Эти ребята в OpenCV его и добавили. Что очень здорово - можно сравнить.

Share this post


Link to post
Share on other sites

Спасибо за ответы! 
Думаю, они будут интересны не только мне.

В 22.01.2018 at 14:43, Nuzhny сказал:

Данных маловато, конечно. Рекомендуется несколько тысяч - несколько десятков тысяч только положительных примеров. Отрицательных примерно также, но классификатор нарежет их сам. Если база такая маленькая, то лучше попробовать HOG.

 

внезапно, после почти суток работы и загрузки результата камера начала ооочень редко схватывать коробку молока. небольшой прогресс всё же есть - раньше вообще ничего не схватывалось...это радует, значит, двигаюсь в верном направлении)))

В 22.01.2018 at 14:43, Nuzhny сказал:

И... почему такие маленькие размеры? 10 на 30! Лучше раза в два или четыре больше. И ты уверен, что пропорции верные?

где-то прочитал, что для автомобильных номеров используется 30 ширина и 10 высота. Прикинул - ведь, если перевернуть коробку, выйдет примерно то же самое, вот и решил использовать те же пропорции (3 к 1) и размеры. Полагаю, что с размерами ошибся. Как их лучше правильно высчитать?

В 22.01.2018 at 14:57, Smorodov сказал:

DLIB-овский детектор лучше работает и обучается относительно быстро, и данных требует не так много.

 

спасибо, вечером изучу, что это за зверь. Изначально везде попадался opencv, вот и решил сразу использовать его)

 

Вопрос по негативным изображениям - мне нужно использовать как негативные изображения фон без объекта, или я могу просто набрать разных картинок, загрузить их в папку, сделать описание и больше не волноваться по поводу того, какие картинки там лежат? 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Recently Browsing   0 members

    No registered users viewing this page.

×