Перед нами стояла задача сравнения изображений (image matching) для поиска изображения максимально подобного данному изображению из коллекции. В этой статье я расскажу как мы использовали для этой задачи подход на основе нейронных сетей под названием AffNet. Кому интересно, прошу под кат.
В нашем случае нам нужно было найти для заданного изображения наиболее похожее с целью последующего вычисления позиции камеры на основе метода фундаментальной матрицы трансформации в OpenCV.
Первоначально мы попробовали стандартный матчинг изображений с использованием дескрипторов признаков SIFT и матчера FLANN из библиотеки OpenCV, а также Bag-of-Words. Оба подхода давали слабые результаты. Bag-of-Words к тому же требует огромный датасет изображений и много времени для обучения.
На использование подхода нас вдохновил вебинар «Points & Descriptors», который прошлым летом проводил CVisionLab. Для всех заинтересованных здесь доступны слайды с этого вебинара. На этом вебинаре представили интересный подход: AffNet + HardNet. Результаты матчинга, представленные на слайдах нас впечатлили и мы решили попробовать его в нашей задаче. По словам авторов AffNet это инновационный метод для обучения регионов ковариантных к афинной трансформации с функцией постоянной отрицательной потери (hard negative-constant loss), который обходит state-of-the-art подходы типа Bag-of-Words на задачах матчинга изображений и wide baseline stereo.
HardNet это новый компактный обучаемый дескриптор признаков, показавший лучшую эффективность state-of-art в сравнении с классическими и обучаемыми дескрипторами признаков и который возможно быстро вычислять на GPU (ссылка на статью). Он доступен публично на github. Здесь есть хороший пример матчинга изоображений с большой афинной трансформацией с использованием AffNet.
Авторы AffNet объясняют подход более детально в своей статье.
Клонируем репозиторий с github:
Затем переходим в папку affnet.
Запустим Jupyter :
и откроем ноутбук SIFT-AffNet-HardNet-kornia-matching.ipynb в папке examples. Сначала установим все завивисимости. Создадим ячейку в верху ноутбука и запустим ее
Если у вас установлен OpenCV версии 4 вы можете получить ошибку из-за функции SIFT_create:
Дело в том, что начиная с версии 3.4.2.16 SIRF и SURF больше недоступны в основном репозитории opencv, они были вынесены в отдельный пакет opencv-contrib. Установим OpenCV и opencv-contrib:
Когда мы запустим матчинг изображений с AffNet на изображениях, предоставленных авторами, мы получим примерно такой результат:
Довольно неплохой результат для таких изображений.
Для пайплайна DoG-AffNet-OriNet-HardNet
И наконец для пайплайна DoG-OriNet-HardNet
Когда мы применили подход на своих изображениях сцен домашей обтановке (комнаты в доме), мы были удивлены результатами. AffNet находил соответствия между двумя изображениями с очень плохим освещением и большей разницей в угле обхора камеры. AffNet показал хорошие результаты без дополнительного дообучения.
Теперь осталось попробовать AffNet на своих изображениях.
Чтобы интегрировать AffNet в свою программу вам нужно только установить все необходимые библиотеки, скачать предобученные веса модели и скопировать несколько функций из ноутбука SIFT-AffNet-HardNet-kornia-matching.ipynb.
Можно легко сконвертировать Jupyter ноутбук в скрипт python с помощью утилиты jupyter nbconvert. Установим ее через pip:
и запустим конвертацию:
На этом все. Удачи в использовании AffNet для матчинга изоображений и до новых встреч.
В нашем случае нам нужно было найти для заданного изображения наиболее похожее с целью последующего вычисления позиции камеры на основе метода фундаментальной матрицы трансформации в OpenCV.
Первоначально мы попробовали стандартный матчинг изображений с использованием дескрипторов признаков SIFT и матчера FLANN из библиотеки OpenCV, а также Bag-of-Words. Оба подхода давали слабые результаты. Bag-of-Words к тому же требует огромный датасет изображений и много времени для обучения.
Обзор подхода AffNet
На использование подхода нас вдохновил вебинар «Points & Descriptors», который прошлым летом проводил CVisionLab. Для всех заинтересованных здесь доступны слайды с этого вебинара. На этом вебинаре представили интересный подход: AffNet + HardNet. Результаты матчинга, представленные на слайдах нас впечатлили и мы решили попробовать его в нашей задаче. По словам авторов AffNet это инновационный метод для обучения регионов ковариантных к афинной трансформации с функцией постоянной отрицательной потери (hard negative-constant loss), который обходит state-of-the-art подходы типа Bag-of-Words на задачах матчинга изображений и wide baseline stereo.
HardNet это новый компактный обучаемый дескриптор признаков, показавший лучшую эффективность state-of-art в сравнении с классическими и обучаемыми дескрипторами признаков и который возможно быстро вычислять на GPU (ссылка на статью). Он доступен публично на github. Здесь есть хороший пример матчинга изоображений с большой афинной трансформацией с использованием AffNet.
Авторы AffNet объясняют подход более детально в своей статье.
Тестирование подхода AffNet
Клонируем репозиторий с github:
git clone https://github.com/ducha-aiki/affnet.git
Затем переходим в папку affnet.
Запустим Jupyter :
jupyter notebook
и откроем ноутбук SIFT-AffNet-HardNet-kornia-matching.ipynb в папке examples. Сначала установим все завивисимости. Создадим ячейку в верху ноутбука и запустим ее
!pip install kornia pydegensac extract_patches
Если у вас установлен OpenCV версии 4 вы можете получить ошибку из-за функции SIFT_create:
The function/feature is not implemented) This algorithm is patented and is excluded in this configuration;
Дело в том, что начиная с версии 3.4.2.16 SIRF и SURF больше недоступны в основном репозитории opencv, они были вынесены в отдельный пакет opencv-contrib. Установим OpenCV и opencv-contrib:
pip install opencv-python==3.4.2.16
pip install opencv-contrib-python==3.4.2.16
Когда мы запустим матчинг изображений с AffNet на изображениях, предоставленных авторами, мы получим примерно такой результат:
30.0 inliers found
Довольно неплохой результат для таких изображений.
Для пайплайна DoG-AffNet-OriNet-HardNet
18.0 inliers found
И наконец для пайплайна DoG-OriNet-HardNet
25.0 inliers found
Когда мы применили подход на своих изображениях сцен домашей обтановке (комнаты в доме), мы были удивлены результатами. AffNet находил соответствия между двумя изображениями с очень плохим освещением и большей разницей в угле обхора камеры. AffNet показал хорошие результаты без дополнительного дообучения.
Теперь осталось попробовать AffNet на своих изображениях.
Чтобы интегрировать AffNet в свою программу вам нужно только установить все необходимые библиотеки, скачать предобученные веса модели и скопировать несколько функций из ноутбука SIFT-AffNet-HardNet-kornia-matching.ipynb.
Можно легко сконвертировать Jupyter ноутбук в скрипт python с помощью утилиты jupyter nbconvert. Установим ее через pip:
pip install nbconvert
и запустим конвертацию:
jupyter nbconvert SIFT-AffNet-HardNet-kornia-matching.ipynb --to python
На этом все. Удачи в использовании AffNet для матчинга изоображений и до новых встреч.