company_banner

OpenCV 4.0 и 4.1 — что нового?



    Мы возвращаемся к рассказу об 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 постараются на них ответить.
    Intel
    225,68
    Компания
    Поделиться публикацией

    Похожие публикации

    Комментарии 14

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

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

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

          А можно как-то в докере к примеру запустить ваш OpenCV? У меня более-менее современный процессор с GPU только на рабочем ноуте, а там федора.
          0
          Выделение лиц на full-hd видеопотоке с openvino for fpga в асинхронном режиме выдает 4.35ms на openvino-вском примере выделения лиц.
            0
            Что-то не верится, скорее всего там скейлится картинка к меньшему размеру. Для моего случая меньше 300x300 очень плохо работает, на 300x300 конечно быстрее раза в 3 работает.
              0
              ./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. Одна из плат, которую мучал, разработана в РФ.
                0

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

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

              Так посмотрите, какие у меня 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)
                  }
              
            0
            Спасибо за релиз!
            Расскажите, почему перестали развивать cuda модули? Ведь сейчас обработка изображений все больше переезжает на gpu.
              0

              Вопрос в поддержке. 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.

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

                Хотелось бы уточнить, пробовали ли запускать OpenCV с OpenCL на Mali? То есть вопрос про то, поддерживает ли OpenCV Mali вообще или наблюдается проблема с этой версией?

                  0
                  Да, пробовал. Выводится сообщение с описанием невозможности использовать данную iGPU. Тестировал на модуле dnn, где есть опция использовать OpenCL. Далее запуск не прекращается, а выполняется, но с большой просадкой по FPS, чем в обычном режиме

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое