В настоящей работе представлено программное решение задачи определения относительной глубины по одному изображению в режиме реального времени. Представленное решение было реализовано на основе программной модели «DPT» группы моделей «MiDaS» при помощи программной библиотеки «OpenCV».
Ключевые слова : карта относительной глубины, PyTorch, OpenCV, MiDaS, DPT.
Введение
Карта относительной глубины кадра содержит в себе информацию о расстоянии между различными объектами, представленных на кадре. Карта относительной глубины представляет собой изображение, где для каждого пикселя вместо информации о цвете хранится информация о расстоянии от камеры до объекта.
Данная информация, например, может иметь применение для определения ориентации в окружающем пространстве беспилотных робототехнических комплексов.
Карту относительной глубины можно получить при помощи специальной камеры глубины или стереокамеры, использующей в качестве входной информации пару стереоскопических кадров одного и того же объекта. Определение глубины по стереопаре кадров заключается в определении для каждой точки на одном кадре парной ей на другом кадре. По полученной паре соответствующих точек производится определение координат их прообраза в трехмерном пространстве [1]. Определив координаты прообраза, глубина вычисляется как расстояние до плоскости камеры. Определение глубины с помощью стереокамеры остается сложной задачей, поскольку требуется дополнительная наладка и точная настройка двух стереоскопических камер.
Карту относительной глубины также может быть получена с использованием искусственных нейронных сетей. Одним из готовых решений является группа моделей «MiDaS» [2], реализованная на основе программной библиотеки «PyTorch». Модели «MiDaS» предназначены для вычисления относительной глубины по одному изображению. Программные модели были обучены на 10 различных наборах данных, включающие данные, полученные с использованием стереоскопического метода. Различные наборы данных, содержащие информацию о глубине, несовместимы с точки зрения масштаба и смещения. «MiDaS» вводит новую функцию потерь, которая позволяет устранить проблемы совместимости и позволяя одновременно использовать для обучения несколько наборов данных из различных источников [3].
Представленное программное решение будет основываться на программной модели «DPT», представленной компанией Intel Corp.
Основная часть
Основной алгоритм вычисления относительной глубины по одному изображению в режиме реального времени заключается в захвате кадра из видео, передаче его в модель для прогнозирования и дальнейшей обработке полученных данных для визуализации.
Загрузка модели и преобразований
Для передачи кадра в модель необходимо изначально произвести наладку программной модели. Затем произвести подготовку входного кадра.
Для подготовки входного кадра к передаче необходимо произвести над ним определенные преобразования. Загрузка модели и преобразований представлена в листинге 1.
Листинг 1. Загрузка модели и преобразований |
|
1 2 3 4 5 6 7 |
model_type = "DPT_Large" model = torch.hub.load("intel-isl/MiDas", model_type) midas_transforms = torch.hub.load("intel-isl/MiDas", "transforms") if model_type == "DPT_Large" or model_type == "DPT_Hybrid": transform = midas_transforms.dpt_transform else: transform = midas_transforms.small_transform |
В данном случае используется программная модель «DPT-Large».
В зависимости от установленной программной модели производится выбор необходимого типа преобразования.
Загрузка входного кадра
Для загрузки входного кадра применяется программная библиотека «OpenCV». Для загрузки кадра необходимо создать объект захвата видео VideoCapture [4]. Исходный программный код представлен в листинге 2.
Листинг 2. Загрузка входного кадра |
|
1 2 3 |
cap = cv2.VideoCapture(0) if not cap.isOpened() exit() |
Для получения кадра из видео применятся функция VideoCapture().read() .
Прогнозирование и обработка выходных данных
Для прогнозирования изначально производится передача преобразованных данных входного кадра в модель. После прогнозирования результата производится преобразование полученных выходных данных к исходному размеру. В завершении производится нормализация выходных данных для визуализации. Исходный программный код представлен в листинге 3.
Листинг 3. Прогнозирование и обработка выходных данных |
|
1 2 3 4 5 6 7 8 9 10 11 12 |
while True: retval, frame = cap.read() if not retval: break input_batch = transform(frame) with torch.no_grad(): predict = model(input_batch) predict = torch.nn.functional.interpolate(predict.unsqueeze(1), size=frame.shape[:2], mode="bilinear") predict = predict.squeeze() predict = torch.nn.functional.normalize(input=predict, p=3) output = predict.numpy() |
Пример входного кадра и результат определения относительной глубины для него представлен на рисунке 1, а и б.
аб
Рис. 1. Результат определения относительной глубины для входного кадра при помощи программной модели «DPT-Large» группы «MiDaS»: a — пример входного кадра («Руины Пальмиры»); б — полученная карта относительной глубины ( mode=«bilinear »)
В данном случае определение относительной глубины, в качестве примера, производилось для одного кадра.
Чем дальше распложены объекты от плоскости камеры, тем они более темнее. Объекты, расположенные ближе к камере — более светлее.
Соответствующая карта глубины для рассмотренного примера в трехмерной системе координат представлена на рисунке 2.
Рис. 2. Соответствующая карта глубины для рассмотренного входного кадра в трехмерной системе координат
Представленная карта глубины в трехмерной системе координат приведена в сокращенном виде. В данном случае количество точек сокращено на 100 единиц.
Заключение
В результате выполнения настоящей работы было представлено программное решение задачи определения относительной глубины по оному кадру в режиме реального времени. Представленное решение было реализовано на основе программной модели «DPT-Large» группы моделей «MiDaS» при помощи программной библиотеки «OpenCV». Применение искусственных нейронных сетей в решении задачи построения карты относительной глубины позволяет производить вычисления глубины с применением одного изображения, в отличии от стереоскопического метода, который использует два изображения в качестве входной информации об объекте и который дополнительно требует точной наладки и настройки оборудования для захвата кадра. Рассмотренная программная модель «DPT» является практичным средством для решения задачи вычисления относительной глубины по одному изображению.
Литература:
- Gary Bradski. Learning OpenCV 3 / Gary Bradski, Adrian Kaehler. O'Reilly Media. — 2016. — 1024 с. — [Электронный ресурс]. Режим доступа: https://www.oreilly.com/library/view/learning-opencv-3/9781491937983/?_gl=1*du23ls*_ga*MTMwNzc2NzkyNy4xNjc3ODI3MjM5*_ga_092EL089CH*MTY3NzgyNzIzOS4xLjEuMTY3NzgyNzUwMy42MC4wLjA
- MIDAS: MiDaS models for computing relative depth from a single image. [Электронный ресурс]. Режим доступа: https://pytorch.org/hub/intelisl_midas_v2/
- René Ranftl. Towards Robust Monocular Depth Estimation: Mixing Datasets for Zero-shot Cross-dataset Transfer / René Ranftl, Katrin Lasinger, David Hafner, Konrad Schindler, Vladlen Koltun. — 2020. — 14 c. — [Электронный ресурс]. Режим доступа: https://arxiv.org/abs/1907.01341
- Jan Erik Solem. Programming Computer Vision with Python / Jan Erik Solem. O'Reilly Media. — 2012. — 272 с. — [Электронный ресурс]. Режим доступа: https://www.oreilly.com/library/view/programming-computer-vision/9781449341916/