Автор Тема: OpenCV / обучаване на Haar cascade класификатори  (Прочетена 50271 пъти)

4096bits

  • Напреднали
  • *****
  • Публикации: 6152
    • Профил
Интелигентността не е, дали ще се справиш с дадена ситуация или въпрос. Интелигентността е способността да се задават правилните въпроси, когато се срещнем с нещо непознато. Въпроси, които ще очертаят непознатото в правилни рамки, за да можем да го вместим в представите си. Да можем с тези въпроси да търсим отговорите в правилната посока.
На сегашното ниво на алгоритми и изчислителна мощ, не виждам как това може да бъде постигнато с някой софтуер. Всеки калкулатор за долар-два смята много по-бързо и точно от почти всички хора. Всяка машинария обработва статистически данни много по-бързо от човек. Сега. По въпроса със смятането... Знае се, че има хора способни на чудеса буквално в това отношение. Идва въпроса дали и останалите хора не са способни на същото. Ако да, нуждата ни от тъпите компютри може да отпадне в много случаи. Статистиката също, ако се приведе в нужния математически модел и математически точна граматика, също може би ще може да се обработва от надарени или развили тази способност хора. Ако приемем, че всички сме способни да смятаме така.
Тук идва въпроса и за цената на тези усилия вече де. Сигурно ще е изморително. Ако не са ни научили от малки на това, ще ни е трудничко. На мен ми е трудно с много неща. Спомням си като по-малък как поглъщах буквално всякаква интересна информация и ми оставаше в главата. Бях гъвкав. Сега не толкова.
Според мен компютри изобщо няма да са ни нужни един ден, а в момента повече пречат, отколкото помагат. Хората затъпяват. Учат се да решават проблемите и задачите си, като влагат усилия да научат някой друг да ги реши, пресметне, вместо тях. Аз съм го изпитвал на собствен гръб. Два теста по математика, като на първия се справих много добре, но на втория, две седмици след това, имах тройка. Само защото тези две седмици се радвах на сметачката, която ползвах. Смяташе вместо мен, аз само записвах така, че все едно аз съм го смятал. Нула усилия от моя страна и резултата беше очакван.
Този софтур за разпознаване на образи  или лица сигурно лесно може да се излъже. Особено лицевия. Ако човек реши да се крие от него или хората зад него, може да го направи доста успешно.
Споменах ли, че преди време, когато нямаше жиесеми и изобщо нещо, което да помни телефонните номера вместо мен, помнех почти всички номера, които ми бяха дали приятели и съученици. Сега зная моя номер, домашния ми също, зная домашния на нашите, на един приятел и помня и още два мобилни номера на друг човек. Това е всичко. Много зле
« Последна редакция: Apr 10, 2015, 11:23 от 4096bits »
Активен

As they say in Mexico, "Dasvidaniya!" Down there, that's two vidaniyas.

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Тая дивотия ме закрасти обаче, реших да направя нещо по-практично и да си напиша бъгаво софтуерче за проста система за видеонаблюдение, не особено професионална, но пък забавен опит в реализирането на изцяло уеб-базирана такава с благинки като human body/face detection, лицево разпознаване и истинско засичане на движение (не делти между кадри - тва е доста нескопосано). Не че нямам СОТ вкъщи, ама ще е забавно въпреки всичко.

Та тръгнах на (напоследък любимия ми) питонец да си го дращя, ползвайки django фреймуърка. "Архитектурата" я замислих, моделите и няколко view-та ги разписах, остава най-важното: самата функционалност. Реших да ползвам ffmpeg за да стриймвам видео, което да може да се гледа в браузъра. Подаването на видеофреймове от opencv към ffmpeg е ужасно голяма кочина да му се не види, идиотите просто не са предвидили друга възможност освен всичко да минава през адски бавен pipe. OpenCV има и досадния навик да работи с BGR а не с RGB стойности на пикселите и докато се сетя за това се чудих защо нещата излизат все едно си се надрусал с ЛСД. Допълнително (жив да не бях) най-накрая разбрах каква е тази драма с подържаните от HTML5 браузърите кодеци и формати. Понеже нещата се оказаха достатъчно насрани, просто не виждам по-добър вариант от стриймването на FLV и показването в браузъра с някакъв swf плеър.

Та докарах нещата дотам да хващам входа от камерата, да го процесвам с opencv, да го encode-вам във FLV формат и да го стриймвам с ffserver. Вероятно ще трябва динамично да генерирам ffserver.conf и да рестартирам гадината при промяна в конфигурацията на уеб приложението, ма тва не е голям проблем. Това което наистина ме отчайва е възможните разновидности на тема "какво подържа камерата". Иначе с моята оптимизирах нещата и сега изхода от обработеното с opencv видео при стриймване генерира около 2-3mbit/s трафик (и това включва трафика за качването от ffmpeg към ffserver), което е нищо в рамките на един етернет сегмент. Това е 640x480, 24-битов цвят, изкуствено орязано до 10fps. Една идея е да го превръщам в 8-битов grayscale - ще помисля по въпроса, мене си ми харесва цветно и някак бих могъл да прежаля по-ниския framerate. Та при това положение енкодването с ffmpeg товари с по-малко от 10% процесора, но питонския скрипт който разпознава лица твърдо окупира едно процесорно ядро :(

Та реално въпросния софтуер надали някога ще може да работи с повече от няколко камери, просто ресурсите нарастват в аритметична прогресия.

Но пък би било забавно - movement detection-а ще ми позволи да записвам видео само когато има причина да го правя, т.е изискванията към дисково пространство ще намалеят с порядъци.

Така както съм замислил нещата, ще има и alert-и които ще могат да се дефинират на база какво е събитието (просто движение или full body засечено или човешко лице засечено или човешко лице засечено и разпознато като някой в базата). Alert-ите съответно имат action, който може да бъде пращане на мейлове, изпълнение на външни команди (например aplay alarm.wav), дори по едно време ми хрумна идиотската идея да се качва някъде видео-то - щото примерно като влезе крадец в къщата едва ли ще пощади десктоп машината и кел файда че съм го логнал на диска.

Абе накратко ще си имам занимавки в близките няколко седмици, много се радвам.
« Последна редакция: Apr 12, 2015, 02:41 от gat3way »
Активен

"Knowledge is power" - France is Bacon

4096bits

  • Напреднали
  • *****
  • Публикации: 6152
    • Профил
Ако има достатъчно рам, не може ли да се слагат нещата в  tmpfs и директно после в облака. Така няма да се бави машината с писане по харда.
Активен

As they say in Mexico, "Dasvidaniya!" Down there, that's two vidaniyas.

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Може, стига да измисля добра дефиниция на това "после".

Апропо добре се получава засега...



Да се чете "как да хакнем алармена система с разпознаване на образи която още не е написана" :)


П.П ааааа вече знам ако Джон Ленън е влязал да краде в апартамента!!!

« Последна редакция: Apr 13, 2015, 11:50 от gat3way »
Активен

"Knowledge is power" - France is Bacon

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Имам много лоши новини за всички дето са решили да ползват SIFT и компания за feature detection - всичките алгоритми в opencv са патентовани, водят се non-free и ако се ползват за комерсиална цел, трябва да се плаща royalty, това включително ако искаш да го ползваш в някаква уеб услуга.

Иначе се оказва голяма краста - в момента напредвам с домашната алармена система. Днес открих че камерата може да се използва като детектор за пожар относително успешно. Дори май направих първото си собствено откритие в тая област (макар че силно ме съмнява никой да не се е сетил, защото не е особено велико, доста елементарно и логично е) - промених един алгоритъм измислен от братята турци за откриване на пламъци, елиминирайки нуждата от обучение. Те го правят на базата на марковски модели, базирани на факта, че контурите на пламъците "трептят" по определен начин. Ако игнорираме момента с това че камерата може да се мести или видеото, в което разпознаваме може да има драстични делти с времето (примерно да откриваме огън в музикален видео-клип където се сменят радикално различни сцени), тогава ние може тотално да елиминираме момента с тренирането и да постигнем много висока акуратност на разпознаването на пламъците, използвайки единствено побитови операции върху матрици, определени RGB филтри, background extraction алгоритмите в OpenCV (MOG е най-подходящ, изгъзиците на MOG2 не ни вършат работа), както и стандартния blob detection с малко tweak-нати параметри (по отношение на минимална площ, инерция и convexity). Трябва да пазим и няколко кадъра назад и акуратността силно зависи от това, но дори с пазенето на един кадър назад, нещата са доста прилични. Performance-а е достатъчно приличен и можем да го правим в реално време.

https://www.youtube.com/watch?v=XMwVKWjVaFY

Съжалявам за тъпото аудио, youtube е доста дразнеща работа. Но се вижда де, при промяна на сцената, акуратността спада брутално, огньове се откриват където ги няма. Но пък за камера за видеонаблюдение, тези неща няма да са проблемни.
« Последна редакция: Apr 23, 2015, 01:42 от gat3way »
Активен

"Knowledge is power" - France is Bacon

4096bits

  • Напреднали
  • *****
  • Публикации: 6152
    • Профил
А какви честоти на вълната на светлината хващат нормалните камери? Защото, ако ловят над определени в инфрачервената област, спокойно може да се ползват дори само така за детектори. Без разпознаване на пламъци.
Активен

As they say in Mexico, "Dasvidaniya!" Down there, that's two vidaniyas.

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Типично ако нямат някакви филтри, ловят и малко под обхвата на видимата светлина - което лесно може да се види ако снимаш дистанционното на телевизора докато работи.

Обаче не мисля че е толкова просто поради две причини - първата е че камери - съответно сензори и филтри много, съответно различен честотен response и ще трябва да има някакъв процес на калибрация, който ще е сложен в *не-лабораторни* условия да се проведе прецизно. Втората е че не е толкова просто с горящите неща, няма някаква определена честота на която излъчват. Например всяко тяло над абсолютната нула излъчва електромагнитни вълни в много широк спектър, включително и много дълги вълни като например радио/микровълни. Ако хванеш примерно сателитна чиния с конвертор и я вържеш към софтуерно радио, ще откриеш че шумовия фон е един когато чинията гледа в небето, доста по-висок когато гледа към земята или някоя сграда, много по-висок когато е насочена към слънцето и ако чинията е достатъчно голяма и достатъчно прецизно насочена, ще регистрира и луната с някой друг децибел отгоре. На много хора им е странно как примерно дървото отсреща е източник на радиовълни, но то си е - допринася за термичния шумов фон.

С всичко останало нещата са така - в зависимост от температурата (и от "материала") просто по-голямата част от излъчената ЕМ енергия е в различна част от спектъра. За пламъците специално е трудно да направиш детектор на базата на това с подръчни камери - понеже различни материали горят при различна температура и имат различни спектрални характеристики. С инфрачервена камера примерно пак би имал проблем да различиш преминаващ човек от запалена хартия от радиатора на парното примерно, само по честотата - защото освен горящата хартия има и други неща, които излъчват на тази честота малко или много.
Активен

"Knowledge is power" - France is Bacon

Naka

  • Напреднали
  • *****
  • Публикации: 3395
    • Профил
Имам много лоши новини за всички дето са решили да ползват SIFT и компания за feature detection - всичките алгоритми в opencv са патентовани, водят се non-free и ако се ползват за комерсиална цел, трябва да се плаща royalty, това включително ако искаш да го ползваш в някаква уеб услуга.

В Европа нали нямаше софтуерни патенти. А и пише че SIFT и братчето му SURF са патентовани в US.


А за пламъците ако се стигне до детектване на пламъци ще е вече много много късно - ебати и детектора. Нещо може да гори и без пламъци. да тлее и да пуши. Затова пушека е много по надежден критерий - така както са направени стандартните детектори.
« Последна редакция: Apr 23, 2015, 09:49 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

Oxy

  • Напреднали
  • *****
  • Публикации: 253
  • Distribution: Fedora / Gentoo / Debian
  • Window Manager: KDE (4.2/ 3.5)
    • Профил
    • WWW
Ние ползвахме нещо друго преди време в университета. До колко вече може да се ползва за комерсиални цели трябва да се види в лиценза...
Ето тук се помещава животното: http://ivt.sourceforge.net/book.html
Там е и книгата по която вървя част от едната ми лекция по темата...
Книгата е писана много разбираемо, стига човек да е учил малко от малко математика :)

Гейт, има инфрачервени камери ако нещо гори.. доста по лесно е да замерва температурата и ако някъде мине прага да сигнализира... нищо толкова сложно.. По забавното е фюжъна на 2те камери, особено ако са с различни резолюции на сензорите и различните им позиции... :) Ако ти се занимава с Геометрия ето интересно нещо, което със сигурност някой е решил но все пак. Имаме 2 камери А и Б които стоят една до друга с някакъв ъгъл, така че да хващат еднаква част от пространството. Знаем ъгъла, да приемем че имат еднаква резолюция, проблемът е: как да мапнем данните от инфрачервената камера А върху данните от нормалната камера Б. Сега ако бяха 2 нормални камери щеше да е по лесно, защото модела на стандартната камера е ясен и винаги можеш да изчислиш проекцията върху даден пиксел на матрицата от къде идва. Номера ще е какъв е модела на инфрачервената камера? После ключова Дума може би е Епиполарна геометрия...

По темата за Невроналните мрежи, статисткиката и класификацията като цяло:
1. Изненада! Невроналните мрежи са статистически модел: Ключова дума нелинейна регресия...
2. Невроналните мрежи имат проблеми като всеки модел, но основния според мен е че при голям брой неврони, много трудно може да се анализира самата мрежа след тренировката, това означава, че може да се разглежда като блекбокс модел. Естествено може да се срязва мрежата и да се разглежда изхода след даден слой, но като цяло ташаци на рояци...
3. Различни алгоритми и модели за различни проблеми.
Примери: Скрит марков модел за моделиране на акустиката при гласово разпознаване. Или Ен-Грам модела за моделиране на речта.
4. Различни модели дават различни като качество резултати:
Аз последно ползвах Линейната дискриминанта на Фишър за да класифицирам ментално натоварване на база концентрацията на хемоглобина в определени мозъчни дялове. Интересното е, че метода работи доста добре, предвид факта каквъв беше експеримента стигнах до 80% Акурантност (И мисля че може да се качи още ако се поработи още)...
5. Интересно нещо е използването на десижън функции и множество РАЗЛИЧНИ класификатори. Проблема тогава, е че може да се стигне до неразличима ситуация. За това приоритети, тежести етц...
6. There is no silver bullet: Означаващо, че няма един модел в който фитват всички проблеми, както и няма един алгоритъм който класифицира всички данни. Отделно, че има разлика между класификация и предсказване примерно.

4096bits

  • Напреднали
  • *****
  • Публикации: 6152
    • Профил
То ясно, че всяко тяло с температура над абсолютната нула излъчва. Излъчва и черната дупка дори.
Но все си мисля, че температурата на горене може да се засече така директно. Сигурно ще е неудобно, защото различните материали, както и ти каза, горят при различна температура, та това ще трябва да се задава като параметър. Вероятно не е особено добро решение, щото различни материали десетки в едно помещение например.
Активен

As they say in Mexico, "Dasvidaniya!" Down there, that's two vidaniyas.

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Цитат
А за пламъците ако се стигне до детектване на пламъци ще е вече много много късно - ебати и детектора. Нещо може да гори и без пламъци. да тлее и да пуши. Затова пушека е много по надежден критерий - така както са направени стандартните детектори.

И това може да се направи както се оказва, някой го е измислил...тази вечер си играх да го имплементирам (некадърно):

https://www.youtube.com/watch?v=B5Bm2FhVHwE

Зелените "региони" са тези които са близо до статистическите рамки, но не се вписват като кандидат за "пушек". Това работи относително надеждно (макар че имплементацията ми е тъпа и трябва да я подобря) само при положение че камерата не се мести - ако се мести стават големи проблеми.

Алгоритъмът е доста прост - изваждаме фона, за да вземем движещите се обекти, намираме контурите, правим малко магии за да обединим близки малки контури (аз го правя тъпо - ползвам blur), чертаем ги върху черно изображение, AND-ваме го с оригинала, обръщаме резултата от RGB в YUV и за всеки контур смятаме средната стойност за Y (luminance) стойността на всички пиксели, средното отклонение, площта на контура и геометрията (опростено - аз вземам броя на точките които го формират). Вземаме тези стойности примерно за 20 кадъра назад и правим сметката - ако имаме контур където средната стойност на Y не се променя, а стандартното отклонение стои в някакви граници, както и ако площта и геометрията се променят за всеки кадър, тогава имаме кандидат за пушек. При достатъчно добре подбрани threshold стойности и достатъчно много кадри назад, за които пази информация, класификатора работи относително добре. Проблеми са както движението, така и кадри, взети от места с ярки източници на светлина в общи линии, първото осира откриването, второто осира false позитивите.

Ама не съм доволен силно от това. Може би трябва да го обединя с вчеращните експерименти, за да търся едновременно пушек и огън, за да съм по-сигурен когато давам аларма "пожар". Но дори и това няма да подобри достатъчно добре коректността според мен. Не знам, ще пробвам.

Активен

"Knowledge is power" - France is Bacon

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Цитат
, че всяко тяло с температура над абсолютната нула излъчва. Излъчва и черната дупка дори.
Но все си мисля, че температурата на горене може да се засече така директно. Сигурно ще е неудобно, защото различните материали, както и ти каза, горят при различна температура, та това ще трябва да се задава като параметър. Вероятно не е особено добро решение, щото различни материали десетки в едно помещение например.

Проблемът е да разберем дали нещо гори в крайна сметка. Камерата (за видима светлина, но и инфрачервената) не е калибрирана и смятана да ни каже "за такава стойност на пиксела съответства температурата на горене на произволен обект от сцената". Вероятно можеш да си правиш такива изводи на базата на това че повечето неща дето горят при някакви температурни граници от няколкостотин градуса, излъчват силно в инфрачервения обхват и една инфрачервена камера ще го регистрира това като доста "ярък" пиксел. И какво от това - същото ще го направи примерно за крушката за осветление. Мисля че е доста трудно да се направи детектор за пожар само на базата на това, без някаква софтуерна логика по отношение на регистрирания обект. Но може би греша, не знам.

Разбира се, специализирана техника, която е правена да работи в много по-тесен честотен обхват, с висок dynamic range, филтрираща боклуците на съседни честоти които се alias-ват и бъркат по всевъзможни начини и е калибрирана като хората, би могла да ни каже далеч по-точно дали това е нещо дето гори или не и каква му е температурата. Обаче не съм убеден че това е толкова просто с обикновени камери, дори IR такива.
« Последна редакция: Apr 24, 2015, 02:44 от gat3way »
Активен

"Knowledge is power" - France is Bacon

4096bits

  • Напреднали
  • *****
  • Публикации: 6152
    • Профил
Не грешиш. Изтъкнах същото и аз. Трябва да се укаже за конкретния обкет, какви стойности на светлината от него могат да се приемат за горене. Трудна задача и изискваща доста ръчна работа. Вероятно разделяне на зони или, ако пък разпознава обекта като "това канапе" сам да си вземе от някъде данните, че текстила или изкуствената кожа горят при тази инфрачервена светлина излъчвана от тях. Сложно и ресурсоядящо. Май димен детектор е за предпочитане  :D

Така като си се заел със софтуер за разпознаване на образи и покрай всички тези приказки, току-що ми хрумна друго интересно приложение на такъв софтуер и мисля, че ще се справя и не толкова трудно. Дори мобилно приложение може да се измисли.
Може и пари да се направят от това.
Благодаря!  ::)
« Последна редакция: Apr 24, 2015, 05:24 от 4096bits »
Активен

As they say in Mexico, "Dasvidaniya!" Down there, that's two vidaniyas.

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Тъй, това е последното до което стигнах за момента:

https://www.youtube.com/watch?v=He0F9qU-O28&feature=youtu.be

Идеята ми е да го реализирам възможно най-просто базирано само на статистически модели. Алгоритъмът си го изработих сам и е заиграване на тема онзи paper от по-горе, съчетан с мои наблюдения. Първо, реших да не се занимавам с YUV colorspace-а, а само с RGB и наблюдавах различни сцени с дим, очевидно има два вида дим - "обикновения" където гори нещо генериращо "нормален" пушек, както и "химически" дим - наситени и ароматни въглеводороди, които при горенето си отделят доста черни сажди. Първото е лесно, защото е отенък на сивия цвят и R=G=B стойността работи доста добре - за запалена хартия, дърво, въобще всичко, което има неутрален сив цвят на пламъка. "Химическият" дим със саждите обаче е забавен и това е на практика резултата от горенето на повечето полимери и нефтопродукти. След известни изследвания на кадри от такъв дим стигнах до извода че RGB стойностите се колебаят между 60 и 80 като червената стойност е най-висока следвана от зелената и синята, в някакви интервали. Оттам стария алгоритъм, базиран на това че геометрията се променя, площта нараства, средната стойност на RGB пикселите е почти константа.

Големият проблем е с проследяването на blob-овете, в момента ползвам доста ахмашки и компромисен вариант където ползваме много смели предположения, това относително добре работи в реално време, но е супер неточно и оттам идват и разни false positives, особено при големи промени в сцената. Правилното проследяване включва една сметка за геометричния център на blob-а най-малкото, но само от това ако почнем, изискванията към изчислителното време стават такива, че става ужасно затормозяващо да го правим в реално време върху stream от камера, какво остава за няколко камери. Отделно се губят кадри, които ни носят важна информация и акуратността се насира. Та засега мисля оптимизации, но нямам много идеи.

Другите варианти обаче са по-кофти - анализирането на wavelet-и след трансформация на Фурие (бльох) и особено разните самообучаващи се решения, са с порядъци по-бавни. Трябва да има някакъв фокус, който ми убягва, все пак мисля, че това е достатъчно просто за да можем да гледаме опростено статистически на нещата.

P.S Обаче трябва да призная, не работи добре при странно осветление, примерно нощно такова. Мамицата му и прасе, няма да е толкова просто.
« Последна редакция: Apr 26, 2015, 02:58 от gat3way »
Активен

"Knowledge is power" - France is Bacon

4096bits

  • Напреднали
  • *****
  • Публикации: 6152
    • Профил
А нещо използващо геометрия, движение на флуиди? Пушека определено има характерно поведение и форми.
Активен

As they say in Mexico, "Dasvidaniya!" Down there, that's two vidaniyas.

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
OpenCV или libjpeg проблем
Общ форум
shoshon 0 2357 Последна публикация Jun 22, 2009, 22:02
от shoshon
OpenCV - Help
Web development
taloveca 0 2329 Последна публикация Jan 27, 2015, 20:06
от taloveca
Инсталиране на OpenCV
Хардуерни и софтуерни проблеми
4096bits 1 2526 Последна публикация Jan 23, 2017, 20:58
от remotexx
Обработка на снимка с opencv
Хардуерни и софтуерни проблеми
gosho987 9 4172 Последна публикация Dec 07, 2017, 17:52
от 4096bits