Съдържание:

Разпознаване на звезди с помощта на Computer Vision (OpenCV): 11 стъпки (със снимки)
Разпознаване на звезди с помощта на Computer Vision (OpenCV): 11 стъпки (със снимки)

Видео: Разпознаване на звезди с помощта на Computer Vision (OpenCV): 11 стъпки (със снимки)

Видео: Разпознаване на звезди с помощта на Computer Vision (OpenCV): 11 стъпки (със снимки)
Видео: Face Recognition Using Python, Keras, OpenCV & Tensorflow| Recognize Face in Real-time Video Streams 2024, Ноември
Anonim
Разпознаване на звезди с помощта на Computer Vision (OpenCV)
Разпознаване на звезди с помощта на Computer Vision (OpenCV)

Тази инструкция ще ви опише как да създадете програма за компютърно зрение за автоматично идентифициране на звездните модели в изображение. Методът използва библиотеката OpenCV (Open-Source Computer Vision) за създаване на набор от обучени каскади HAAR, които могат да се използват за разпознаване на специфични звездни модели. Въпреки че това ръководство е в контекста на разпознаване на образи на звезди, процесът на OpenCV, който описвам, може да се приложи и към други приложения - така че, надявам се, ще бъде полезен!

Проектът е обобщен във видеото:

Защо написах тази инструкция?

  1. Вярвам, че методът за идентифициране на звезден модел, който разработвам, има потенциал да бъде приложен към широк спектър от аматьорски астрономически проекти - независимо дали това е ориентация на телескоп, автоматична класификация на изображенията или дори в крайна сметка звезден сензор на отворен код или любителски CubeSat.
  2. Тук има много добри инструкции за OpenCV, но въпреки това ми се стори много труден процес да се науча първоначално, така че се надявам, че това ръководство ще бъде добра справка за други хора, които искат да обучават HAAR класификатори за OpenCV (не е задължително да се прави с може би астрономия!).
  3. Аз самият не съм обучен програмист, така че този проект наистина подтикна разбирането ми. Надяваме се, че като напишем тази инструкция, други, по -опитни производители ще бъдат вдъхновени да работят по тази концепция и да допринесат за GitHub и тази инструкция чрез коментари на тази страница.
  4. Аматьорската астрономия и ориентационните методи са мой голям интерес, вижте предишните ми инструкции, включващи Arduino Star-Finder за телескопи.

Коричната снимка на този Instructable е с концептуален 3U CubeSat дизайн, в който участвах в дизайна. Използвах го, за да илюстрирам тази инструкция, тъй като първоначалното приложение на системата за разпознаване на звезди с компютърно зрение трябваше да бъде за сензор за ориентация за аматьорски CubeSats, използвайки Raspberry Pi V2 камера. Вярвам, че има много други потенциални приложения за разпознаване на звезди от компютърно виждане, но мисля, че това е най -готиното!

Малък речник:

Изучаването на компютърното зрение се забавя от глупавото количество използвани специализирани термини, така че тук ще дефинирам някои за нас:

Каскада - Класификатор, обучен да идентифицира конкретен целеви обект.

Фидуциален маркер - маркер, който добавя визуална точка към изображението.

HAAR - Хааровите характеристики са вид изображение, използвано за обучение на класификатор.

OpenCV - Open Source Computer Vision, библиотека от инструменти за компютърно виждане.

Stellarium - софтуер за астрономия с отворен код.

Стъпка 1: Изисквания

OpenCV е библиотека, базирана на Linux, така че въпреки че е възможно да се работи добре с Windows, ще имате много по -лесно време да я стартирате в Linux среда (вземете това от мен и много дни се опитвате да я накарате да работи напълно) Windows!). Като експеримент изтеглих и стартирах OpenCV на моя Raspberry Pi 3B+, който беше успешен, въпреки че обучението по класификатор е много интензивен процес, така че ако искате да го направите с всякаква скорост, препоръчителният маршрут е да наемете Linux Virtual Server (което всъщност може да бъде изненадващо евтино) за няколко дни/седмици/месеци и да го използва като специална среда, в която да се провежда обучението по класификатора. Ще можете да контролирате сървъра от компютър с Windows, като използвате SSH клиент като Putty. След като каскадите се обучат с помощта на VPS, те могат да бъдат изтеглени на вашия компютър с Windows, а Python може да се използва за стартиране на програмата за разпознаване на изображения в среда на Windows.

Виртуален сървър на Linux:

Виртуален сървър на Linux (VPS) е необходим за извършване на каскадни тренировъчни процеси HAAR. Първоначално наех сървър с 8GB RAM и Ubuntu 16.04.6 (LTS) x64, а по -късно и втори, за да удвоя скоростта, с която мога да тренирам каскади, въпреки че ще ви трябва само минимум една

Софтуер:

  • Stellarium - това е софтуер за виртуален планетариум/астрономия, свободно достъпен. Той ще се използва за събиране на симулирани изображения на звезди за използване при тестване.
  • Putty - Това е SSH клиент, който се използва за управление на VPS чрез командния ред.
  • WinSCP - използва се за прехвърляне на файлове от компютър с Windows.

Стъпка 2: Настройка на VPS

Има малък процес на настройка, за да стартирате VPS. Първият път може да ви отнеме малко време, но не е твърде сложно, ако следвате стъпките отблизо. Този урок беше чудесна препоръка за мен, препоръчвам ви да прочетете и това, докато работите с тази инструкция. Той обхваща спецификата на командите на Linux ред по ред, което е необходимо да се следва до буквата.

Приблизително процесът включва:

  1. Създаване на Linux сървър с правилна версия на Ubuntu.
  2. Обновяване и актуализиране на сървъра.
  3. Създаване на директория на работно пространство, в която е инсталиран OpenCV.
  4. Инсталиране на някои основни неща, а именно компилатор, различни библиотеки и свързвания на Python.

След този етап сте готови да започнете подготовката за тренировъчния процес.

Стъпка 3: Процесът

Целият процес на компютърно виждане с помощта на HAAR каскади в началото е доста объркващ, така че тази стъпка описва логиката малко по -подробно:

Основен процес

  1. Съществува отрицателен набор от изображения, състоящ се от няколко хиляди изображения, които не съдържат обекта на интерес. Това ще трябва да бъде качено във VPS.
  2. Създава се единствен положителен образ, който съдържа обекта на интерес. Това също ще трябва да бъде качено във VPS.
  3. Единичното положително изображение се изкривява, изкривява, завърта и т.н., чрез набор от избрани параметри и се наслагва върху селекция от отрицателни изображения. Това е изкуствен начин за създаване на голям положителен набор от данни от едно изображение. (За други приложения в реалния свят, като например идентифициране на котка, можете просто да използвате няколко хиляди изображения на котки, но този метод не винаги е подходящ, ако нямате толкова голям набор от положителни изображения. Използваният тук изкуствен подход ще бъде по-малко ефективен, но това е единствената възможност за случай на употреба като този).
  4. Провежда се тренировъчен процес, който работи на етапи. Всеки етап ще обучава каскада за идентифициране на различни характеристики от типа HAAR в наборите от изображения. Всеки етап отнема експоненциално повече време за завършване и ефективността на класификатора се увеличава всеки път (възможно е също така да се тренира прекалено, само за да знаете!).
  5. Една обучена каскада ще може да търси един -единствен целеви обект. Ако искате да идентифицирате множество уникални обекти, ще ви е необходима обучена каскада за всеки. В този случай обучих около 50 различни каскади за уникални звездни фигури, за да създам комплект, който да покрие северното небесно полукълбо.
  6. И накрая, се използва програма за откриване, която изпълнява всяка каскада от набор срещу входно изображение. Каскадата ще търси своя зададен обект в рамките на входното изображение.
  7. Ако успее, целевият обект ще бъде идентифициран във входното изображение.

n.b. ако се използва например в контекст на сателитна ориентация, изображение ще бъде заснето с помощта на вградена камера. Най -ярките звезди на това изображение ще бъдат идентифицирани и маркери, разположени върху тези позиции. След това това изображение се представя в набора от обучени каскади, които ще проверят дали входното изображение съдържа някой от целевите обекти. Ако бъде открит истински положителен резултат, тогава ъгловата позиция на известно съзвездие се открива спрямо осите на тялото на спътника.

Стъпка 4: Негативи и позитиви

Отрицателни

Наистина ключов аспект на каскадното обучение е да има възможно най -голям набор от негативни изображения. Говорим за хиляди, в идеалния случай десетки хиляди изображения. Всъщност няма значение какво съдържат, целта е просто да предоставят разнообразна визуална информация. Папката Classifier Training съдържа разнообразни набори от данни за отрицателни изображения, които аз компилирах. Първоначално те се състоеха единствено от симулирани изображения на звездно поле, събрани от Stellarium, но по -късно разширих набора от данни с толкова произволни изображения, колкото намерих (да, включително моите празнични снимки …). Най -големият набор от данни включва почти 9000 изображения, което беше най -голямото, което съм създал досега. Използвайки това, това ще ви спести от компилирането на вашето собствено.

Положителни

Положителното изображение (това е моделът на целевата звезда, която каскадата ще бъде обучена да разпознава) започва като екранна снимка на звезден модел в Stellarium. След това програма на python идентифицира най -ярките звезди в изображението и наслагва маркери (обяснени по -късно в тази инструкция) върху тези позиции на звезди. След това това изображение се свива до 50x50 пиксела. Това е малко, но времето за обучение, необходимо за каскадите, ще се увеличи експоненциално с увеличаването на този размер, така че това е добър компромис между качеството и времето.

Стъпка 5: Контрол на стелариума

Контрол на стелариума
Контрол на стелариума
Контрол на стелариума
Контрол на стелариума

Папката Stellarium Scripts в хранилището на GitHub съдържа три програми, които написах, за да контролирам използването на Stellarium. За да ги използвате, поставете ги в папката scripts на вашата инсталационна папка Stellarium. За да ги стартирате, можете да отворите прозореца за скриптове от менюто Stellarium или просто като щракнете двукратно върху програмата в папката scripts, която ще стартира Stellarium и веднага ще стартира избраната програма.

thesis_4 и thesis_5 заснемат около 2000 изображения, съответно на северното и южното полукълбо. Те бяха използвани за формиране на бази данни с негативни изображения, за да се обучи положителното изображение срещу. Разликата между север и юг беше прост начин да се гарантира, че целевият (положителен) звезден модел няма да присъства в отрицателния набор от данни, като се обучават звездните модели от северното полукълбо спрямо набора от данни за изображения от южното небесно полукълбо и обратно. (Ако положително изображение присъства и в набора от отрицателни изображения, това ще повлияе на качеството на класификатора).

thesis_setup също е полезен - това настройва Stellarium да бъде подходящ за заснемане на изображения - изображенията, използвани за симулиране на изглед от Космоса. Той извършва действия като скриване на менюта, линии на мрежата, етикети и т.н. автоматично, за да ви спести необходимостта всеки път, когато искате да вземете изображение.

Стъпка 6: Rocket Man

Мъж ракета
Мъж ракета

Първите каскади, които тренирах, не успяха правилно да идентифицират звездни модели. Те бяха много ненадеждни и бяха много склонни към фалшиви положителни резултати. Моето предположение беше, че на практика изображенията на звездното поле от Stellarium (основно само бели точки на черен фон) просто не съдържат достатъчно визуална информация, за да съдържат достатъчно характеристики от типа HAAR за успешно обучение на класификатор. Мисля, че беше късно през нощта, но реших да опитам идеята да напиша програма за автоматично поставяне на малка миниатюра върху местоположението на всяка ярка звезда в изображение на звездно поле.

Елтън

Това беше глупав тест, но чрез добавяне на малка снимка на лицето на Елтън Джон към всяко ярко звездно място, обучение на класификатора спрямо този положителен образ и след това насочване на каскадите спрямо оригиналното изображение, беше много по -ефективно да се намери правилно десен модел. Знаех, че търся нещо!

Стъпка 7: Фидуциални маркери

Фидуциални маркери
Фидуциални маркери

Въпреки че „Елтъните“доказаха теорията, имах нужда от маркер с пълна ротационна симетрия, така че звездният модел да изглежда един и същ, независимо в каква ориентация е представен. Тествах редица видове маркери и установих, че типът в долния десен ъгъл е най -ефективен, с контрастиращите черно -бели пръстени. Програмата python, представена в положителната папка на репо GitHub, показва как се идентифицират най -ярките звезди в дадено изображение и тези маркери автоматично се наслагват в тези позиции. Сега създадохме представяне на ключовите звездни модели, срещу които може да се тренира.

Стъпка 8: Използване на каскадите

Използване на каскадите
Използване на каскадите

Когато сте обучили набор от каскади, трябва да знаете как да ги използвате, за да идентифицирате обект в изображение!

Погледнете папката Star Identification на GitHub, където ще намерите програмата cascade_test19.py. Тази закачливо наречена програма взема набор от каскади от дадена папка и ги изпълнява срещу входно изображение и докладва за направените открития. В основата на това е функцията 'detectMultiScale', която приема различни аргументи, които определят процеса на откриване. Промяната им е от решаващо значение за производителността на каскадния класификатор и повече дискусии за това могат да бъдат намерени в следващата стъпка, където разглеждаме как да премахнем фалшивите положителни резултати.

Това може да се приложи в система за сателитна ориентация, като се съпостави стойността на пиксела в центъра на ограничаващата кутия с небесната координата Ra/Dec на идентифицираната звезда, и след това се съпостави това с ъгловото изместване от центъра на изображението (камера ос). От това, използвайки разбиране за изкривяването на обектива (приблизително до гномонична проекция), ъгълът на спътника може да бъде намерен само от две положителни идентификации.

Стъпка 9: Как да останете позитивни относно фалшивите положителни резултати

Как да останем позитивни относно фалшивите позитиви
Как да останем позитивни относно фалшивите позитиви
Как да останем позитивни относно фалшивите позитиви
Как да останем позитивни относно фалшивите позитиви

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

Програмата cascade_test19.py в папката Star Identification на репо GitHub използва два метода за сортиране на резултатите. Първо, функцията detectMultiScale задава минимален и максимален размер на резултата, който може да бъде намерен, което е разумно, като приблизителния размер на модела на целевата звезда в прозореца (за дадения обектив и увеличение - моите симулирани изображения на Stellarium използват свойствата на камерата Raspberry Pi V2) е известна. Второ, кодът ще избере резултата с най -голямото ограничаващо поле (в рамките на предишните граници). При тестването беше установено, че това е истинският положителен резултат. Трето, програмата определя минимален „levelWeights“(на практика „доверителна стойност“), който е необходим за третиране на този идентификатор като истински положителен. По този метод каскадите бяха ефективни при намирането на правилния резултат.

Освен изображенията на звездното поле, аз също тествах това срещу снимки на бюрото ми, например, тренировъчни каскади за идентифициране на моя бележник, чаша и т.н., за да се упражня елиминирането на фалшиви положителни резултати. Горните методи работят добре при всички обстоятелства, което е окуражаващо.

Стъпка 10: Дискусия

Дискусия
Дискусия
Дискусия
Дискусия
Дискусия
Дискусия

Области за подобряване

Това беше сложен проект за мен и наистина подтикна разбирането ми по темата. Това включваше общо няколко месеца работа на пълен работен ден, за да стигнем до този момент, когато мога да го споделя с вас, но има още много работа, която трябва да се свърши, за да се подобри ефективността на метода. В сегашния си вид той може да функционира добре в рамките на определени ограничения. Работил съм, за да идентифицирам кои области се нуждаят от допълнителна работа и се надявам да успея да отделя време за решаването им през следващите месеци. Те са:

Ъгъл - Това е сложна област, идеята, че резултатите от класификаторите трябва да бъдат ротационно инвариантни, тоест, тя трябва надеждно да идентифицира модела на целевата звезда, независимо от ъгъла, под който е представено изображението, съдържащо целевата звезда. Каскада, обучена с използване на входно изображение в една ориентация, няма да може да идентифицира това изображение при произволни ориентации, така че отклонението от положителния ъгъл на изображението трябва да бъде въведено в процеса на обучение, за да се обучат каскади, които могат да приемат диапазон на входните ъгли. Параметърът „maxzangle“в командите за каскадна тренировка приема аргумент в радиани, който контролира граница на ъгъла, при който входното положително изображение ще се наслагва върху предоставените отрицателни изображения, така че полученият набор от положителни изображения ще съдържа диапазон от ориентации на положителния образ. Въпреки това, с увеличаването на този максимум, коефициентът на приемане (най -общо казано, качеството) на каскадата ще намалее рязко. Вярвам, че решението е да се обучават каскади, използвайки значително по -голяма база данни с негативни изображения, отколкото използвах, за да гарантирам, че може да се създаде качествен каскаден класификатор, дори включващ голямо разпространение на ориентация.

Друго потенциално решение би било да се обучат редица каскади за конкретна цел, като всяка каскада управлява определена част от пълно завъртане на 360 градуса. По този начин качеството на всяка каскада може да се поддържа на високо ниво, но от друга страна това ще доведе до много повече каскади и следователно процесът на идентификация ще бъде по -бавен.

Параметърът „levelWeight“, който е стойност, предоставена от функцията „detectMultiScale“, е аналогична на доверителната стойност в направеното откриване. Изучавайки това, е създадена горната графика, която показва как увереността на положителната идентификация рязко намалява, когато ориентацията на изображението се увеличава в двете посоки, потвърждавайки мислите, че това е слабо място.

Разположение на пиксели - Много по -опростен, но и проблемен момент е този на разположението на пикселите, илюстриран от следните две изображения, показващ увеличен изглед на изображение на звезда, така че отделните пиксели на две звезди да могат да се виждат ясно. Процесът на ерозия, използван в програмата за изтриване на всички, с изключение на най -ярките звезди от изображението, ще запази първата звезда и ще изхвърли втората, въпреки че са с еднаква яркост. Причината за това е, че първата звезда е центрирана върху пиксел, докато втората не е такава. Функцията за ерозия премахва концентрични пръстени от пиксели около централния пиксел на група и така първата звезда ще има централния пиксел да оцелее при ерозионната функция, но втората звезда ще бъде напълно премахната от изображението. Следователно фидуциалните маркери ще бъдат поставени само върху първата звезда, а не върху втората. Това ще доведе до несъответствия, свързани с това кои ярки звезди в дадено звездно поле ще получат маркери (и следователно да бъдат сравнени с обучените класификатори) - следователно е възможно правилното положително наблюдение да не е възможно.

Стъпка 11: Последна дума

Последна дума
Последна дума

Благодаря ви, че прочетохте инструкциите ми, надявам се, че сте намерили този проект за интригуващ. Работата по него беше много интересен процес, мина повече от година, откакто започнах да работя върху концепцията, и съм окуражен от резултатите до този момент. От литературата, която прочетох, това е доста оригинална концепция, и с по -голямо развитие със сигурност може да се приложи в редица приложения за аматьорска астрономия или повече.

Този проект беше стръмна крива на обучение за мен и затова се надявам, че някои читатели с повече опит в програмирането могат да бъдат вдъхновени да допринесат за продължаването на проекта чрез страницата GitHub и ние можем да продължим да разработваме този инструмент с отворен код. Очаквам с нетърпение да прочета всички ваши коментари, но моля, не задавайте твърде трудни въпроси!

Космическо предизвикателство
Космическо предизвикателство
Космическо предизвикателство
Космическо предизвикателство

Вицешампион в космическото предизвикателство

Препоръчано: