Разработка кроссплатформенного приложения для автоматизации процесса подготовки данных для обучения нейронной сети распознаванию деревьев по кроне
Конференция: CXXXI Студенческая международная научно-практическая конференция «Молодежный научный форум»
Секция: Технические науки
CXXXI Студенческая международная научно-практическая конференция «Молодежный научный форум»
Разработка кроссплатформенного приложения для автоматизации процесса подготовки данных для обучения нейронной сети распознаванию деревьев по кроне
Аннотация. В статье рассматриваются создание кроссплатформенного приложения для процесса подготовки данных. Работа с las файлами, отображение с помощью OpenGL, и работа с облаком точек с использованием библиотеки CGAL.
Ключевые слова: Кроссплатформенное приложение, C++, Qt, OpenGL, CGAL.
Разработка библиотеки
Структура las файла состоит из трёх блоков
- PUBLIC HEADER BLOCK
- VARIABLE LENGTH RECORDS
- POINT DATA RECORDS
по этой структуре были созданы три класса, как три блока (public header block, variable length records, point data records) и два вспомогательных класса - класс файла, класс конвертор. Класс файла нужен для взаимодействия приложения с моей библиотекой. Класс конвертор нужен для преобразования двоичного кода в параметры понятные людям.
Отображение Las файлов
Отрисовка облака точек идет через видеокарту с использованием шейдеров. В данной работе использован QOpenGLWidget. QOpenGLWidget предоставляет три удобные виртуальные функции, которые нужно переопределить в своем подклассе для выполнения типичных задач OpenGL:
- paintGL () - Визуализирует сцену OpenGL. Вызывается всякий раз, когда виджет нуждается в обновлении.
- resizeGL () - Устанавливает окно просмотра OpenGL, проекцию и т. д. Получает вызов всякий раз, когда размер виджета изменяется (а также когда он отображается в первый раз, потому что все вновь созданные виджеты автоматически получают событие изменения размера).
- initializeGL () - Устанавливает ресурсы и состояние OpenGL. Вызывается один раз перед первым вызовом resizeGL () или paintGL ().
Класс, который используется для отображения точек в приложении, наследуется от двух классов QOpenGLWidget и QOpenGLFunctions.
QOpenGLFunctions предоставляет гарантированный API, доступный во всех системах OpenGL, и заботится о разрешении функций в системах, которые в нем нуждаются. Рекомендуемый способ использования QOpenGLFunctions - прямое наследование.
Работа с облаком точек
В основе работы с облаком точек лежит kd-дерево. KD-Tree(K-мерное дерево), специальная 'геометрическая' структура данных, которая позволяет разбить K-мерное пространство на 'меньшие части', посредством сечения этого самого пространства гиперплоскостями(K > 3), плоскостями (K = 3), прямыми (K = 2) ну, и в случае одномерного пространства-точкой.
Разбиение используется для сужения диапазона поиска в k-мерном пространстве. Все объекты помещаются в специальные параллелепипеды bounding box-ы (bounding box-ом назовем такой параллелепипед, который описывает исходное множество объектов или сам объект, если мы строим bounding box лишь для него. У точек в качестве bounding box-а берется bounding box с нулевой площадью поверхности и нулевым объемом), стороны которых параллельны осям координат.
Разработанные инструменты для работы с облаком точек.
Ручная обработка точек:
- Разбиение одного файла на несколько файлов;
- Механическое удаление точек в пространстве.
Автоматическая обработка точек:
- Удаление выбросов(шумов);
- Уменьшение количества точек;
- Сглаживание для уменьшения шума.
В основе удаление выбросов лежит алгоритм K - ближайших соседей. Этот алгоритм является самым простым алгоритмом классификации.
На вход метода псевдослучайного удаления точек приходит массив с точками. Количество удаляемых точек 3%.
Уменьшение количества точек при помощи сетки, облако точек покрывается сеткой с размером ячейки равной переменной epsilon. Для расчёта epsilon вычисляется средний интервал от k ближайших соседей. И если в секции окажется несколько точек, то они замещаются одной.
Иерархическое уменьшение точек, облако точек рекурсивно делится на мелкие кластеры. Рассчитываются центройды и все точки которые находятся рядом с центройдой объединяются в одну точку.
Сглаживание - этот метод сглаживает входные точки, проецируя каждую точку на параметрическую поверхность, расположенную над ее ближайшими соседями. Использует KD-дерево.