OpenCV 4.2.0 с python3 и CUDA: ошибка в cv2.VideoCapture () - PullRequest
0 голосов
/ 21 апреля 2020

Я сталкиваюсь с проблемой OpenCV, которая возникает у меня уже несколько дней: она вызывает ошибки при вызове функции cv2.VideoCapture().

При запуске моего скрипта (с GDB):

extract-all_1   | Thread 1 "python3" received signal SIGSEGV, Segmentation fault.
extract-all_1   | 0x00007f83857fe33b in bool pyopencv_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(_object*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, ArgInfo const&) [clone .isra.1286] ()
extract-all_1   |    from /usr/lib/python3/dist-packages/cv2/python-3.6/cv2.cpython-36m-x86_64-linux-gnu.so
extract-all_1   | (gdb) quit

При запуске моего сценария без GDB контейнер выходит с кодом 139

Я обнаружил, что проблема возникает при вызове функции "cv2.VideoCapture ()":

def perform_video_extraction(video_path):
    input_movie = cv2.VideoCapture(video_path)
    nb_total_frames = int(input_movie.get(cv2.CAP_PROP_FRAME_COUNT))
    [...]

Подсказки:

  • Я обрабатываю видеофайлы MP4
  • Я пытался сжать видео с частотой от 30 кадр / с до 25 кадр / с
  • Я пытался использовать OpenCV 3.4 .9, 4.1.0, 4.1.1, 4.1.2, 4.2.0 и 4.3.0 (pip install)
  • Я пытался скомпилировать OpenCV 4.2.0 и 4.3.0 из исходного кода
  • Я пробовал каждую вышеописанную версию последовательно с CUDA 10.0, 10.1 и 10.2: каждая версия для каждого случая выдает одну и ту же ошибку
  • Этот segfault не воспроизводится при использовании версии CPU (не cuda) OpenCV

Вот мой Dockerfile (CUDA 10.2 с OpenCV 4.2.0, собранный из исходного кода): https://pastebin.com/raw/a42wtcRG

Вот что возвращает сводная сборка cmake: https://pastebin.com/raw/SFPUakyL

Моя конфигурация:

Есть ли у вас какие-либо рекомендации по устранению этой проблемы?

Спасибо

1 Ответ

1 голос
/ 24 апреля 2020

Мне удалось отладить проблему. Из-за глупой кодировки проблемы.

Добавление:

ENV LANG C.UTF-8

в мой Dockerfile удалось заставить контейнер работать (мой исходный pastebin упомянул эту строку, но после двойной проверки, У меня его не было).

Мне удалось выяснить эту идею благодаря более точному следу от GDB:

root@f42846d26d89:/opencv-4.2.0/build# gdb --args python3 -u /usr/app/scripts/extract.py
GNU gdb (Ubuntu 8.1-0ubuntu3.2) 8.1.0.20180409-git
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from python3...(no debugging symbols found)...done.
(gdb) run
Starting program: /usr/bin/python3 -u /usr/app/scripts/extract.py
warning: Error disabling address space randomization: Operation not permitted
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
[...]
Thread 1 "python3" received signal SIGSEGV, Segmentation fault.
getUnicodeString (str="", obj=<optimized out>) at /opencv-4.2.0/modules/python/src2/pycompat.hpp:69
69          if (PyBytes_Check(bytes))
(gdb) backtrace
#0  0x00007f2959a1433b in getUnicodeString (str="", obj=<optimized out>) at /opencv-4.2.0/modules/python/src2/pycompat.hpp:69
#1  0x00007f2959a1433b in pyopencv_to<std::__cxx11::basic_string<char> >(PyObject*, cv::String&, ArgInfo const&) (obj=<optimized out>, value="", info=...)
    at /opencv-4.2.0/modules/python/src2/cv2.cpp:731
#2  0x00007f2959dd6a2d in pyopencv_cv_VideoCapture_VideoCapture(pyopencv_VideoCapture_t*, PyObject*, PyObject*) (self=0x7f2965344190, args=0x7f296307c3c8, kw=0x0)
    at /opencv-4.2.0/build/modules/python_bindings_generator/pyopencv_generated_types_content.h:21272
#3  0x0000000000551b81 in  ()
#4  0x00000000005aa6ec in _PyObject_FastCallKeywords ()
#5  0x000000000050abb3 in  ()
#6  0x000000000050c5b9 in _PyEval_EvalFrameDefault ()
#7  0x0000000000509d48 in  ()
#8  0x000000000050aa7d in  ()
#9  0x000000000050c5b9 in _PyEval_EvalFrameDefault ()
#10 0x0000000000508245 in  ()
#11 0x000000000050b403 in PyEval_EvalCode ()
#12 0x0000000000635222 in  ()
#13 0x00000000006352d7 in PyRun_FileExFlags ()
#14 0x0000000000638a8f in PyRun_SimpleFileExFlags ()
#15 0x0000000000639631 in Py_Main ()
#16 0x00000000004b0f40 in main ()
(gdb) list
64  {
65      bool res = false;
66      if (PyUnicode_Check(obj))
67      {
68          PyObject * bytes = PyUnicode_AsUTF8String(obj);
69          if (PyBytes_Check(bytes))
70          {
71              const char * raw = PyBytes_AsString(bytes);
72              if (raw)
73              {
(gdb) 

/opencv-4.2.0, являющийся моим путем установки

Похоже, мои имена файлов были не в правильном формате кодирования.

Наконец, я указываю, что pip install с привязкой python напрямую работает отлично, теперь эта модификация имеет был принесен.

...