Ошибка сегментации, когда opencv и tenorflow используют libgtk - PullRequest
0 голосов
/ 12 июня 2018

Когда OpenCV и tenorflow используют libgtk, возникает ошибка сегментации.Ниже я привел простой скрипт, который создает проблему, соответствующие версии аппаратного и программного обеспечения и трассировку стека.FWITW, те же версии opencv, tenorflow, pandas и т. Д. Работали очень хорошо, когда я установил их на другую машину в марте.Не уверен, что именно изменилось.

Как создать проблему

Следующий скрипт работает просто отлично.Захватывает и отображает фрейм как ожидаетсяНапример ..

import tensorflow
import cv2
cv2.namedWindow('frame')

Соответствующая информация об аппаратном и программном обеспечении :

Аппаратная архитектура x86 (ядро Intel I5) GPU GTX 1060 OS Linux Mint 18.2

Ядро Ubuntu версии 4.8.0-53-generic # 56 ~ 16.04.1-Ubuntu OpenCV версия 3.4 Tensorflow версия 1.4.1 Pandas версия 0.20.1

CUDA 9.1 драйвер Nvidia 396.26

Несколько вещей, которые я пробовал 1. Компиляция OpenCV с GTK2.4 и GTK3.Тот же результат 2. Изменение версии драйвера NVIDIA

Я планирую попробовать CUDA 9.0 дальше, хотя, честно говоря, я не знаю, какое это имеет отношение к чему-либо.

Обратный след ошибки сегментации (gdb) bt

#0 0x000000000052b88c in ?? ()
#1 0x00000000005653ab in PyErr_WarnEx ()
#2 0x00007fff840f7938 in ?? () from /usr/lib/python2.7/dist-packages/gobject/_gobject.x86_64-linux-gnu.so
#3 0x00007fffd539e9a4 in g_logv () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#4 0x00007fffd539ebcf in g_log () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#5 0x00007fffd5690d7d in ?? () from /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#6 0x00007fffd569107b in g_type_register_static () from /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#7 0x00007fffd5691695 in g_type_register_static_simple () from /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#8 0x00007fffd5e173a4 in gdk_display_manager_get_type () from /usr/lib/x86_64-linux-gnu/libgdk-3.so.0
#9 0x00007fffd5e17409 in gdk_display_manager_get () from /usr/lib/x86_64-linux-gnu/libgdk-3.so.0
#10 0x00007fffd62fcc8b in ?? () from /usr/lib/x86_64-linux-gnu/libgtk-3.so.0
#11 0x00007fffd62d420b in ?? () from /usr/lib/x86_64-linux-gnu/libgtk-3.so.0
#12 0x00007fffd53a2f67 in g_option_context_parse () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#13 0x00007fffd62d3fe8 in gtk_parse_args () from /usr/lib/x86_64-linux-gnu/libgtk-3.so.0
#14 0x00007fffd62d4049 in gtk_init_check () from /usr/lib/x86_64-linux-gnu/libgtk-3.so.0
#15 0x00007fffd62d4099 in gtk_init () from /usr/lib/x86_64-linux-gnu/libgtk-3.so.0
#16 0x00007fffeef176c3 in cvInitSystem () from /usr/local/lib/libopencv_highgui.so.3.4
#17 0x00007fffeef1a764 in cvNamedWindow () from /usr/local/lib/libopencv_highgui.so.3.4
#18 0x00007fffeef1aead in cvShowImage () from /usr/local/lib/libopencv_highgui.so.3.4
#19 0x00007fffeef11349 in cv::imshow(cv::String const&, cv::_InputArray const&) () from /usr/local/lib/libopencv_highgui.so.3.4
#20 0x00007ffff67078d3 in pyopencv_cv_imshow(_object*, _object*, _object*) () from /usr/local/lib/python2.7/dist-packages/cv2.so
#21 0x00000000004bc3fa in PyEval_EvalFrameEx ()
#22 0x00000000004c136f in PyEval_EvalFrameEx ()
#23 0x00000000004c136f in PyEval_EvalFrameEx ()
#24 0x00000000004b9ab6 in PyEval_EvalCodeEx ()
#25 0x00000000004eb30f in ?? ()
#26 0x00000000004e5422 in PyRun_FileExFlags ()
#27 0x00000000004e3cd6 in PyRun_SimpleFileExFlags ()
#28 0x0000000000493ae2 in Py_Main ()
#29 0x00007ffff7810830 in __libc_start_main (main=0x4934c0 <main>, argc=2, argv=0x7fffffffe058, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, 
stack_end=0x7fffffffe048) at ../csu/libc-start.c:291
#30 0x00000000004933e9 in _start ()

1 Ответ

0 голосов
/ 12 июня 2018

Основная проблема здесь в том, что один и тот же процесс использовал две разные версии gtk.

Мой OpenCV использовал GTK3.Python использует GTK2 (в импорте GTK).Tensorflow и pandas импортируют gtk где-то в своей обработке, следовательно, они имеют одну и ту же проблему.

Сейчас я обошел эту проблему, перекомпилировав opencv с gtk2.Другие альтернативы будут ..

  1. Обновите python до gtk3.Я посмотрел на доступные ресурсы по этому вопросу, и не был убежден, что они были достаточно солидными.

  2. Скомпилируйте tenorflow и pandas с GTK3 (в настоящее время я только что импортировал предварительно скомпилированные библиотеки для обоих).Очевидно, что это не надежное решение, поскольку какой-то другой пакет может использовать встроенный gtk, приводящий к той же самой проблеме снова.

...