Мы возвращаемся к рассказу об open source библиотеке компьютерного зрения OpenCV. Проект живет и развивается, движимый командой разработчиков, работающих в компании Intel, а также неугасающей поддержкой community. В конце 2018 года увидел свет первый стабильный релиз из ветки 4.х, а буквально месяц назад вышло новое обновление — версия 4.1. Мы попросили авторов библиотеки перечислить кратко, что нового привнесли эти две версии в функционал OpenCV.
OpenCV 4.0
Выход OpenCV 4.0 завершил жизненный цикл версии 3.x — для исправления ошибок и незначительных доработок была создана ветка 3.4, от которой будут создаваться уже минорные 3.4.x версии (по аналогии с 2.4.x).
OpenCV 4.0 final
- OpenCV теперь является C++11 библиотекой и требует C++11-совместимого компилятора;
- Удалены многие функции устаревшего C API (из OpenCV 1.0), старые константы и объявления функций вынесены в отдельные заголовочные файлы (imgproc_c.h) и теперь должны включаться пользователем явно (#include <opencv/imgproc/imgproc_c.h>);
- Все CUDA-модули были перенесены в репозиторий opencv_contrib;
- Persistence API для записи и чтения данных в файл переписан на C++, старые функции были удалены;
- Добавлен новый модуль G-API, позволяющий выстраивать графы из операций над изображениями и применять различные оптимизации на них;
- В модуль dnn добавлена поддержка Deep Learning Deployment Toolkit (в том числе opensource-версии), включая использование Intel Movidius Neural Compute Stick или Intel Neural Compute Stick 2 на Raspberri Pi 3;
- В модуль dnn добавлена поддержка сетей в формате ONNX (Open Neural Network Exchange);
- В модуль dnn добавлена экспериментальная поддержка вычислений через Vulkan;
- Добавлена реализация алгоритма real-time обработки 3D сцен/моделей KinectFusion (с оптимизацией под CPU и GPU/OpenCL);
- В модуль objdetect добавлена поддержка детектирования и декодирования QR-кодов (декодер использует библиотеку QUirc) — этим летом в рамках летней интернатуры будет проделана работа над улучшением качества и, возможно, добавлен режим одновременного детектирования-декодирования более одного QR кода на изображении.;
- Очень эффективный и при этом высокоточный алгоритм оптического потока DIS перенесен из opencv_contrib в модуль video главного репозитория.
OpenCV 4.1
- Добавлены диспетчеризованные оптимизированные реализации многих алгоритмов в модулях core и imgproc;
- Улучшения в модуле dnn:
- Внедрена поддержка запуска сетей на Intel Neural Compute Stick 2 (с использованием DLDT);
- Уменьшено максимальное потребление памяти, внедрена поддержка множества новых сетей из TensorFlow
- В модуле videoio добавлена поддержка Android Media NDK API для чтения видео файлов/потоков на Android устройствах из C++ кода (полезно для тестирования алгоритмов);
- Добавлен новый модуль для анализа качества изображений (opencv_contrib/quality). В нём реализованы как базовые алгоритмы (PSNR, SSIM), так и новые специализированные алгоритмы (вроде алгоритма оценки качества без использования исходных изображений BRISQUE — Blind/Referenceless Image Spatial Quality Evaluator);
- Реализовано несколько новых алгоритмов: Robust local optical flow, Quasi Dense Stereo, калибрация камеры привязанной к манипулятору (Hand-Eye);
Более подробную информацию о библиотеке можно найти на изменившемся до неузнаваемости сайте проекта.
Количество патчей с 4.0.0 по 4.1.0: 462 (около 5.3 патчей в день, не считая выходные и праздники). Изменений, как вы видите, много, и они существенны. Если у вас есть вопросы по поводу внедренного функционала, либо, наоборот, не внедренного — добро пожаловать в комментарии, разработчики OpenCV постараются на них ответить.
Комментарии (12)
smarttowel0
25.05.2019 07:08Спасибо за релиз!
Расскажите, почему перестали развивать cuda модули? Ведь сейчас обработка изображений все больше переезжает на gpu.dkurt
25.05.2019 10:52Вопрос в поддержке. CUDA модули были перенесены в opencv_contrib, в котором требования к изменениям более гибкие, чем в главном репозитории. Тестирование проводится, а вот развитие — уже на стороне заинтересованных пользователей. С 4.0.0 тем не менее 12 коммитов есть (
git rev-list -v --no-merges d511587..2c32791 modules/cud*
).
BTW, для dnn этим летом, вероятно, появится поддержка CUDA backend (в рамках Google Summer of Code): https://github.com/opencv/opencv/issues/14585.
Armavir
25.05.2019 07:08Здравствуйте, планируется ли поддержка iGPU Mali серии Т800 и выше, в модулях dnn, stereo и др.?
guryanov
Делаю сейчас проект, в котором нужно делать определение лиц, железо десктопное, но при этом процессор крайне желательно не занимать ничем. Так что попробовал разные варианты, в том числе ваш Neural Compute Stick 2. Тестировал на картинках 800x533
Core i5 9400F — 59ms
Core i7 7500U — 108ms
Core i7 3770 — 110ms
GeForce GTX 1060 6Gb — 154ms
GeForce GTX 1050 2Gb — 199ms
Core i7 3770, ubuntu 18.04 with OpenCV from OpenVINO — 67ms
Intel Neural Compute Stick 2, ubuntu 18.04 with opencv from OpenVINO — 349
Короче решил на видеокартах остановиться, чтобы поцессор не нагружать. Intel Neural Compute stick ваш все-таки больше для всяких Raspberry Pi, насколько я понял.
Крайне удивило, что процессоры так хорошо работают по сравнению с видеокартами.
Еще не понял, почему старый Corei7 3770 работает горазо лучше через OpenVino. Вы там какое-то графическое ядро к вычислениям подключаете?
dkurt
Рекомендую посмотреть в сторону асинхронного запуска сети на стике. Для face detection сети из OpenCV (SSD, 300x300), синхронное использование стика даёт около 26FPS, асинхронное — 53FPS (смотрите https://github.com/opencv/opencv/pull/14516).
Не рассматривали вариант с iGPU? С half precision floating point (DNN_TARGET_OPENCL_FP16 в терминах OpenCV) обычно быстрее чем CPU.
У OpenVINO внутри mkl-dnn для CPU. Все вычисления честно на CPU.
guryanov
Спасибо! Попробую.
А можно как-то в докере к примеру запустить ваш OpenCV? У меня более-менее современный процессор с GPU только на рабочем ноуте, а там федора.
JerleShannara
Выделение лиц на full-hd видеопотоке с openvino for fpga в асинхронном режиме выдает 4.35ms на openvino-вском примере выделения лиц.
guryanov
Что-то не верится, скорее всего там скейлится картинка к меньшему размеру. Для моего случая меньше 300x300 очень плохо работает, на 300x300 конечно быстрее раза в 3 работает.
JerleShannara
./interactive_face_detection_demo -i /var/xlam/test_faces.mp4 -m /opt/intel/computer_vision_sdk/deployment_tools/intel_models/face-detection-adas-0001/FP16/face-detection-adas-0001.xml -m_ag /opt/intel/computer_vision_sdk/deployment_tools/intel_models/age-gender-recognition-retail-0013/FP32/age-gender-recognition-retail-0013.xml -d HETERO:FPGA,CPU -async -d_ag CPU
Видео для примера взято было из ютуба (самая проблема найти видео без всяких демонстраций распознавания). Распознавание пола и возраста тут да, крутятся на процессоре. Полностью на FPGA запустить не вышло, т.к. прямую обработку видео оно не умеет. Использовалось OpenVino 2018 R5. Одна из плат, которую мучал, разработана в РФ.
guryanov
Попробую разобраться, что там делается, было бы неплохо производительность повысить. Мне максимум около 60FPS, я обрабатываю лайввью с зеркалки canon 200D, через библиотеку gphoto2 можно запросить текущую картинку в jpeg, если в цикле без ограничений читать, то около 60 кадров в секунду получается.
Dipet_D_M
Очень странные результаты. Напишите хотя бы что за алгоритмы такие, которые на GPU выполняются почти в 3 раза хуже, чем просто на CPU. Даже если учесть время на передачу данных, всё равно очень странно.
guryanov
Так посмотрите, какие у меня GPU — очень слабенькие по сравнению с тем, что используется в тестах на сайте нвидии. У меня код вот на этом примере основан — https://github.com/hybridgroup/gocv/blob/master/cmd/ssd-facedetect/main.go
Только там размер картинки image.Pt(128, 96) — у меня 800x533 в приведенных тестах было. Но там от размера картинки соотношение скоростей не сильно зависит. Модель caffe взял ту же, из примера.
Инициализация, один раз делается
И поиск: