-
Notifications
You must be signed in to change notification settings - Fork 4
/
development.tex
96 lines (67 loc) · 15.7 KB
/
development.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
\chapter{РАЗРАБОТКА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ}
\section{Выбор технологий}
\subsection{Библиотека проективной геометрии}
К разрабатываемому приложению предъявляются следующие требования: высокая производительность, удобный и кроссплатформенный пользовательский интерфейс, минимум зависимостей.
Для выполнения процесса \textbf{Structure From Motion} была выбрана реализация от Криса Суини (\textit{Chris Sweeney}) -- библиотека проективной геометрии с открытым исходным кодом \hyperref[itm:theia]{Theia [\ref{itm:theia}]}. Автор библиотеки, исследователь Вашингтонского университета, занимается разработками в области компьютерного зрения и виртуальной реальности, имеет степень Ph.D., а также множество научных публикаций. Выбор именно этой библиотеки обусловлен несколькими причинами: легковесность (не имеет зависимостей от больших библиотек, таких как OpenCV или Boost), узкая специализация и направленность на решение конкретной задачи, реализация на С++, а также очень хорошая и подробная документация.
\subsection{Пользовательский графический интерфейс}
Для написания графического пользовательского интерфейса отлично подходит библиотека \hyperref[itm:qt]{$Qt$ [\ref{itm:qt}]}.
$Qt$ -- это кроссплатформенный инструментарий разработки приложений на языке программирования C++, который:
\begin{itemize}
\item позволяет запускать написанное с его помощью программное обеспечение в большинстве современных операционных систем (\textit{Windows, macOS, Linux}) путём простой компиляции программы для каждой операционной системы без изменения исходного кода;
\item включает в себя множество классов для работы с сетью, базами данных, также предоставлены обширные инструменты по быстрому и удобному созданию интерфейсов;
\item использует Metaobject-компилятор, который компилирует программы, написанные на $Qt$, в C++ код, таким образом расширяя функционал и возможности языка C++;
\item добавляет очень удобные обёртки для STL контейнеров, такие как: QString, QArray, QList, QLinkedList, QStack, QQueue, QMap и QSet;
\item состоит из таких основных модулей как: Qt Core, Qt GUI, Qt QML, Qt Network, Qt SQL и Qt WebEngine;
\item включает в себя виджеты (компоненты), такие как: кнопки, прогресс бары, переключатели, чекбоксы -- исчерпывающий набор для создания GUI.
\end{itemize}
В комплекте с $Qt$ идёт собственная интегрированная среда разработки QtCreator, а также Qt Designer, который позволяет создавать интерфейс, просто перетягивая и компонуя виджеты и компоненты на форме, а после генерирует каркасы контроллеров.
\subsection{Система сборки проекта}
В качестве системы сборки проекта мной был выбран инструмент Cmake. Cmake -- это кроссплатформеная, бесплатная и свободно распространяемая система управления процессами сборки программного обеспечения. Поддерживает иерархическую структуру и вложенные структуры. Позволяет описать все зависимости проекта и правила для их поиска и сборки. Основным достоинством является кэширование файлов, включённое по умолчанию, что позволяет значительно увеличить скорость сборки, путем перекомпилирования только изменённых файлов, а оставшиеся брать из кэша. Это является очень критичным для приложений написанных на C++, для которых время компиляции может занимать до пяти минут.
Для описания сборки в директории требуется создать файл CMakeLists.txt с перечислением списка файлов для компиляции, а также указать ссылки на библиотеки и имя цели, которое в дальнейшем будет использоваться для запуска собранного исполняемого файла.
После завершения своей работы Cmake генерирует специальный Makefile, который используется стандартный командой make для сборки C++ приложений.
\subsection{Стиль кода}
При разработке приложения было решено придерживаться стиля кода, принятого в компании Google. Google C++ Style Guide -- cамый популярный справочник по стилю, набор правил и советов по написанию чистого, читаемого и расширяемого кода на C++ от компании Google. Для того чтобы точно придерживаться этих правил я использовал cpplint -- скрипт, который с помощью набора регулярных выражений сканирует все файлы проекта и проверяет выполнение правил, выводит ошибки в удобном и понятном виде.
\section{Разработка алгоритма поиска}
Итак, после выполнения всех этапов метода Structure From Motion построена реконструкция поверхности в виде 3D модели. Модель представляет из себя набор точек пространства с известными для них GPS координатами. Цель алгоритма -- найти на построенной 3D карте расположение нового снимка. Предполагается, что на снимке присутствует та же область пространства, что и в модели, иначе ничего найдено не будет. Также снимок должен быть не из исходного набора данных (датасета), то есть оличный от тех, на основе которых строилась модель. Иначе поиск не будет иметь смысла. Следующая задача алгоритма -- найти геометрическое преобразование и с его помощью определить точные координаты точки пространства, из которой был сделан искомый снимок.
Для осуществления поиска по модели вместе с каждой 3D точкой сохраняется набор дескрипторов всех особых точек, соответствующих этой реальной точке.
В итоге получается следующий алгоритм:
\begin{enumerate}
\item На вход поступает очередной снимок;
\item Находим ключевые точки и извлекаем соответствующие им дескрипторы;
\item Сравниваем полученные дескрипторы с сохранёнными в модели;
\item Находим камеру из исходного датасета, для которой получили наилучшее сопоставление;
\item Находим геометрическое преобразование, с помощью которого искомый снимок проецируется на \quotes{лучшую} камеру;
\item По известным GPS-координатам исходной камеры и геометрическому преобразованию находим местоположение искомой камеры.
\end{enumerate}
Также, кроме одной камеры, возможно получение всей области, на которую накладывается искомый снимок.
\section{Приложение для построения реконструкции}
\begin{figure}[h]
\centering
\includegraphics[width=1\textwidth]{appa.png}
\caption{Приложение для построения и визуализации 3D моделей, осуществления поиска по ним}
\label{fig:appa}
\end{figure}
На рисунке \ref{fig:appa} представлен интерфейс разработанного приложения. Модель -- швейцарский карьер, построенный на датасете, снятом с помощью беспилотного летательного аппарата. Датасет был взят из открытого источника.
В приложении реализован следующий функционал:
\begin{itemize}
\item создание нового/открытие существующего проекта;
\item просмотр датасета текущего проекта;
\item извлечение ключевых точек;
\item построение модели;
\item визуализация модели;
\item поиск по построенной модели.
\end{itemize}
Рассмотрим функционал приложения подробнее. При создании проекта надо ввести имя проекта, путь к директории с изображениями и директорию для проекта. В этой директории будет создан конфигурационный файл, содержащий всю информацию о проекте: пути, настройки и параметры. С этим файлом и будет в будущем ассоциирован проект. Соответственно для открытия проекта требуется открыть папку, содержащую этот конфигурационный файл.
При визуализации модели, красным цветом отрисовываются положения исходных камер, с которых видны ключевые точки. При выборе изображений на боковой панели слева точки выбранного изображения, которые попали в конечную модель, подсвечиваются синим цветом.
При построении модели можно настроить такие параметры как количество потоков, в которых будет выполнятся каждая часть процесса Structure From Motion, тип дескриптора и детектора (поддерживаются SIFT и AKAZE), стратегия сопоставления снимков (Brute Force или Cascade Hashing). Остальные настройки касаются внутренних и внешних параметров камеры. Окно выбора параметров представлено на рисунке \ref{fig:appa-options}.
После построения модели её можно сохранить в текстовый файл специального формата, по умолчанию -- в папку текущего проекта. Благодаря этому уже построенные модели можно открывать и визуализировать очень быстро. В одном проекте может быть много моделей, выбор текущей активной модели осуществляется при запуске процесса визуализации.
\begin{figure}[h]
\centering
\includegraphics[width=0.9\textwidth]{appa-options.png}
\caption{Различные параметры построения модели}
\label{fig:appa-options}
\end{figure}
При запуске процесса поиска открывается диалоговое окно для выбора изображения, которое мы собираемся найти на построенной 3D карте. После выполнения поиска ключевые точки модели, сопоставленные с искомым снимком, подсвечиваются красным цветом. Таким образом можно определить координаты искомого снимка, так как координаты для изображений составляющих карту известны. Тестирование приложения на производительность показало, что поиск на датасете из $127$ снимков, при извлечении порядка $5000$ ключевых точек на каждом изображении осуществляется, в среднем, за $40-50$ секунд.
\section{Выводы}
В этой главе была представлена проделанная практическая работа. Проанализированы новые технологии и решения. Получен результат работы -- приложение для построения 3D модели и поиска по ней.
По результатам анализа алгоритма поиска можно сделать вывод: итоговое время лучше полученного экспериментально в начале исследований. Но этого всё ещё недостаточно для стабильной работы в реальном времени на борту беспилотного летательного аппарата. Требуется оптимизация и доработка алгоритма поиска.