Мы возвращаемся к рассказу об 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)


  1. guryanov
    24.05.2019 13:30

    Делаю сейчас проект, в котором нужно делать определение лиц, железо десктопное, но при этом процессор крайне желательно не занимать ничем. Так что попробовал разные варианты, в том числе ваш 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. Вы там какое-то графическое ядро к вычислениям подключаете?


    1. dkurt
      24.05.2019 21:50

      Рекомендую посмотреть в сторону асинхронного запуска сети на стике. Для 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.


      Еще не понял, почему старый Corei7 3770 работает горазо лучше через OpenVino. Вы там какое-то графическое ядро к вычислениям подключаете?

      У OpenVINO внутри mkl-dnn для CPU. Все вычисления честно на CPU.


      1. guryanov
        25.05.2019 18:17

        Спасибо! Попробую.

        А можно как-то в докере к примеру запустить ваш OpenCV? У меня более-менее современный процессор с GPU только на рабочем ноуте, а там федора.


    1. JerleShannara
      25.05.2019 04:27

      Выделение лиц на full-hd видеопотоке с openvino for fpga в асинхронном режиме выдает 4.35ms на openvino-вском примере выделения лиц.


      1. guryanov
        25.05.2019 18:18

        Что-то не верится, скорее всего там скейлится картинка к меньшему размеру. Для моего случая меньше 300x300 очень плохо работает, на 300x300 конечно быстрее раза в 3 работает.


        1. JerleShannara
          25.05.2019 19:20

          ./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. Одна из плат, которую мучал, разработана в РФ.


          1. guryanov
            25.05.2019 21:39

            Попробую разобраться, что там делается, было бы неплохо производительность повысить. Мне максимум около 60FPS, я обрабатываю лайввью с зеркалки canon 200D, через библиотеку gphoto2 можно запросить текущую картинку в jpeg, если в цикле без ограничений читать, то около 60 кадров в секунду получается.


    1. Dipet_D_M
      25.05.2019 07:08

      Очень странные результаты. Напишите хотя бы что за алгоритмы такие, которые на GPU выполняются почти в 3 раза хуже, чем просто на CPU. Даже если учесть время на передачу данных, всё равно очень странно.


      1. guryanov
        25.05.2019 18:25

        Так посмотрите, какие у меня GPU — очень слабенькие по сравнению с тем, что используется в тестах на сайте нвидии. У меня код вот на этом примере основан — https://github.com/hybridgroup/gocv/blob/master/cmd/ssd-facedetect/main.go


        Только там размер картинки image.Pt(128, 96) — у меня 800x533 в приведенных тестах было. Но там от размера картинки соотношение скоростей не сильно зависит. Модель caffe взял ту же, из примера.


        Инициализация, один раз делается


            d.net = gocv.ReadNet(protoFile, modelFile)
            if d.net.Empty() {
                return nil, fmt.Errorf("Error loading model and proto files")
            }
        
            if err := d.net.SetPreferableBackend(gocv.NetBackendDefault); err != nil {
                return nil, errors.Wrap(err, "Set GPU backend")
            }
        
            targetType := gocv.NetTargetCPU
            if _, err := os.Stat("/proc/driver/nvidia/gpus"); err == nil {
                targetType = gocv.NetTargetFP16
            }
        
            if err := d.net.SetPreferableTarget(targetType); err != nil {
                return nil, errors.Wrap(err, "Set Target type")
            }

        И поиск:


            W := float32(img.Cols())
            H := float32(img.Rows())
        
            blob := gocv.BlobFromImage(img, 1.0, image.Pt(300, 300), gocv.NewScalar(104.0, 177.0, 123.0, 0), false, false)
            defer blob.Close()
        
            d.net.SetInput(blob, "data")
        
            detBlob := d.net.Forward("detection_out")
            defer detBlob.Close()
        
            detections := gocv.GetBlobChannel(detBlob, 0, 0)
            defer detections.Close()
        
            rects := []image.Rectangle{}
            for r := 0; r < detections.Rows(); r++ {
                confidence := detections.GetFloatAt(r, 2)
                left := detections.GetFloatAt(r, 3) * W
                top := detections.GetFloatAt(r, 4) * H
                right := detections.GetFloatAt(r, 5) * W
                bottom := detections.GetFloatAt(r, 6) * H
        
                if confidence < 0.8 {
                    continue
                }
        
                r := image.Rectangle{
                    Min: image.Point{int(left), int(top)},
                    Max: image.Point{int(right), int(bottom)},
                }.Canon()
        
                if (r.Min.X < 0 && r.Max.X < 0) || (r.Min.Y < 0 && r.Max.Y < 0) || (float32(r.Min.X) > W && float32(r.Max.X) > W) || (float32(r.Min.Y) > H && float32(r.Max.X) > H) {
                    continue
                }
                rects = append(rects, r)
            }
        


  1. smarttowel0
    25.05.2019 07:08

    Спасибо за релиз!
    Расскажите, почему перестали развивать cuda модули? Ведь сейчас обработка изображений все больше переезжает на gpu.


    1. 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.


  1. Armavir
    25.05.2019 07:08

    Здравствуйте, планируется ли поддержка iGPU Mali серии Т800 и выше, в модулях dnn, stereo и др.?