Оглавление:

Распознавание звезд с помощью компьютерного зрения (OpenCV): 11 шагов (с изображениями)
Распознавание звезд с помощью компьютерного зрения (OpenCV): 11 шагов (с изображениями)

Видео: Распознавание звезд с помощью компьютерного зрения (OpenCV): 11 шагов (с изображениями)

Видео: Распознавание звезд с помощью компьютерного зрения (OpenCV): 11 шагов (с изображениями)
Видео: [Python] Введение в распознавание контуров через OpenCV 2024, Ноябрь
Anonim
Распознавание звезд с помощью компьютерного зрения (OpenCV)
Распознавание звезд с помощью компьютерного зрения (OpenCV)

Это руководство расскажет вам, как создать программу компьютерного зрения для автоматического определения звездных паттернов на изображении. В этом методе используется библиотека OpenCV (компьютерное зрение с открытым исходным кодом) для создания набора обученных каскадов HAAR, которые можно использовать для распознавания определенных звездных паттернов. Хотя это руководство относится к распознаванию звездообразных образов, описанный мною процесс OpenCV может быть применен и к другим приложениям - так что, надеюсь, он будет полезен!

Краткое содержание проекта представлено в этом видео:

Почему я написал это наставление?

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

На обложке этого учебного пособия изображен концептуальный дизайн CubeSat 3U, в разработке которого я участвовал. Я использовал его, чтобы проиллюстрировать это наставление, поскольку исходное приложение системы распознавания звезд компьютерного зрения должно было быть для датчика ориентации для любительских CubeSat с использованием камеры Raspberry Pi V2. Я считаю, что есть много других потенциальных приложений распознавания звезд компьютерного зрения, но я считаю, что это самое крутое!

Небольшой глоссарий:

Изучение компьютерного зрения замедляется из-за глупого количества используемых специализированных терминов, поэтому я определю некоторые для нас здесь:

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

Опорный маркер - маркер, добавляющий точку визуальной привязки к изображению.

HAAR - функции, подобные Хаару, - это тип функции изображения, используемый для обучения классификаторам.

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

Stellarium - программа для астрономии с открытым исходным кодом.

Шаг 1. Требования

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

Виртуальный сервер Linux:

Виртуальный сервер Linux (VPS) необходим для выполнения процессов каскадного обучения HAAR. Изначально я нанял сервер с 8 ГБ ОЗУ и 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: отрицательные и положительные стороны

Отрицательные

Действительно ключевой аспект каскадного обучения - иметь как можно больший набор данных негативных изображений. Мы говорим о тысячах, в идеале о десятках тысяч изображений. На самом деле не имеет значения, что они содержат, цель - просто предоставить разнообразную визуальную информацию. Папка «Обучение классификаторам» содержит множество различных наборов данных негативных изображений, которые я скомпилировал. Первоначально они состояли исключительно из смоделированных изображений звездного поля, взятых из Stellarium, но позже я добавил в набор данных столько рандомизированных изображений, сколько смог найти (да, включая мои праздничные фотографии…). Самый большой набор данных там включает почти 9000 изображений, и это был самый большой набор из созданных мной до сих пор. Используя это, вы сэкономите на компиляции своего собственного.

Положительные

Позитивное изображение (то есть целевой звездный узор, который каскад будет обучен распознавать) начинается как снимок экрана звездного узора в Stellarium. Затем программа на Python определяет самые яркие звезды на изображении и накладывает маркеры (объясненные далее в этой инструкции) на эти положения звезд. Затем это изображение уменьшается до 50x50 пикселей. Это мало, но время обучения, необходимое для каскадов, будет экспоненциально увеличиваться по мере увеличения этого размера, и поэтому это хороший компромисс между качеством и временем.

Шаг 5: Stellarium Control

Stellarium Control
Stellarium Control
Stellarium Control
Stellarium Control

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

thesis_4 и thesis_5 захватывают около 2000 изображений северного и южного небесных полушарий соответственно. Они использовались для формирования базы данных негативных изображений, чтобы тренировать позитивное изображение. Различие между севером и югом было простым способом гарантировать, что целевой (положительный) звездный рисунок не будет присутствовать в отрицательном наборе данных, путем обучения звездного рисунка северного полушария относительно набора данных изображения южного полушария и наоборот. (Если положительное изображение также присутствует в наборе данных отрицательного изображения, это повлияет на качество классификатора).

Также полезен thesis_setup - он настраивает Stellarium, чтобы он подходил для захвата изображений - изображений, используемых для имитации вида из космоса. Он автоматически выполняет такие действия, как скрытие меню, линий сетки, меток и т. Д., Чтобы избавить вас от необходимости каждый раз, когда вы хотите захватить изображение.

Шаг 6: Человек-ракета

Ракета человек
Ракета человек

Первые каскады, которые я обучил, не смогли правильно идентифицировать какие-либо звездные узоры. Они были очень ненадежными и были очень подвержены ложным срабатываниям. Мое предположение заключалось в том, что фактически изображения звездного поля из 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 в командах каскадного обучения принимает аргумент в радианах, который управляет пределом угла, под которым входное положительное изображение будет наложено на предоставленные отрицательные изображения, поэтому результирующий набор положительных изображений будет содержать диапазон ориентации положительный имидж. Однако по мере увеличения этого maxzangle коэффициент приемки (в целом, качество) каскада резко снижается. Я считаю, что решение состоит в том, чтобы обучать каскады с использованием значительно большей базы данных негативных изображений, чем то, что я использовал, чтобы гарантировать, что можно создать качественный каскадный классификатор даже с большим разбросом ориентации.

Другое возможное решение - обучить несколько каскадов для конкретной цели, каждый из которых управляет определенной частью полного вращения на 360 градусов. Таким образом, качество каждого каскада может поддерживаться на высоком уровне, но, с другой стороны, это приведет к гораздо большему количеству каскадов, и, следовательно, процесс идентификации будет медленнее.

Параметр levelWeight, который представляет собой значение, предоставляемое функцией detectMultiScale, аналогичен значению достоверности при обнаружении, которое было выполнено. Изучая это, был создан приведенный выше график, который показывает, как достоверность положительной идентификации резко снижается по мере того, как ориентация изображения увеличивается в любом направлении, подтверждая мысли о том, что это слабое место.

Размещение пикселей - гораздо более простой, но также проблемный момент - это размещение пикселей, проиллюстрированное следующими двумя изображениями, показывающими увеличенный вид изображения звезды, так что отдельные пиксели двух звезд могут быть четко видны. Процесс эрозии, используемый в программе для удаления с изображения всех звезд, кроме самых ярких, сохраняет первую звезду и отбрасывает вторую, несмотря на то, что они имеют одинаковую яркость. Причина этого в том, что первая звезда центрирована на пикселе, а вторая - нет. Функция эрозии удаляет концентрические кольца пикселей вокруг центрального пикселя группы, так что центральный пиксель первой звезды выдержит функцию эрозии, а вторая звезда будет полностью удалена с изображения. Поэтому реперные маркеры будут размещены только на первой звезде, а не на второй. Это вызовет несоответствия в отношении того, какие яркие звезды в данном звездном поле получат маркеры (и, следовательно, будут сравниваться с обученными классификаторами) - следовательно, возможно, что правильное положительное наблюдение будет невозможно.

Шаг 11: Последнее слово

Последнее слово
Последнее слово

Спасибо, что прочитали мою инструкцию, я надеюсь, что этот проект вас заинтриговал. Работа над этим была очень интересным процессом, прошло больше года с тех пор, как я начал работать над концепцией, и я воодушевлен результатами на данный момент. Судя по литературе, которую я читал, это довольно оригинальная концепция, и при дальнейшем развитии, безусловно, может быть применена в целом ряде приложений для любительской астрономии и других.

Этот проект стал для меня сложной кривой обучения, и поэтому я надеюсь, что некоторые читатели с большим опытом программирования могут быть вдохновлены внести свой вклад в продолжение проекта через страницу GitHub, и мы сможем продолжить разработку этого инструмента с открытым исходным кодом. Я с нетерпением жду возможности прочитать любые ваши комментарии, но, пожалуйста, не задавайте слишком много сложных вопросов!

Космический вызов
Космический вызов
Космический вызов
Космический вызов

Финалист космического конкурса

Рекомендуемые: