[PYTHON] Docker x Visualization hat nicht funktioniert und ich war süchtig danach, also habe ich es zusammengefasst!

Einführung

Wenn Sie eine Vision-Bibliothek wie OpenCV unter Docker verwenden, müssen Sie den Docker-Container und die Anzeige des lokalen PCs verbinden. Diese Methode kannte ich jedoch nicht und es dauerte lange, sodass ich sie unterwegs entdeckte Ich möchte die aufgetretenen Probleme und ihre Lösungen zusammenfassen!

Entwicklungsumgebung

Ubuntu! Überprüfen Sie die Details mit dem folgenden Befehl!

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.3 LTS"

$ arch
x86_64

Laden Sie das Docker-Image herunter

Laden Sie zunächst das Docker-Image von Docker Hub herunter. Auf Docker Hub veröffentlichte Docker-Bilder können kostenlos heruntergeladen und gespeichert werden.

$ docker pull ubuntu:18.04

Bereitstellen eines Docker-Containers

Starten Sie den Docker-Container mit dem gespeicherten Docker-Image. Beim Bereitstellen eines Docker-Containers gibt es verschiedene Optionen [1] [2] //qiita.com/tnarihi/items/275c009e9dec1306893f). Die diesmal verwendeten Optionen sind "-it", "--privileged", "--env", "--volume" und "--name". Erstens ermöglicht -it die Verwendung von Bash für den Docker-Container, indem dem Docker-Container ein Pseudo-Terminal zugewiesen wird. Dann erlaubt --privileged den Zugriff auf alle Geräte. --env gibt die Umgebungsvariablen an, die im Docker-Container verwendet werden sollen. Mit "--volume" können Sie das Host-Betriebssystemverzeichnis auf dem Gastbetriebssystem [[3]] bereitstellen (https://docs.docker.com/v17.09/engine/admin/volumes/bind-mounts). /). Sie können den Containernamen mit --name angeben.

$ docker run -it \
             --privileged \
             --env="DISPLAY=$DISPLAY" \
             --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
             --volume="$HOME/ws/:/home/" \
             --name="ubuntu_cv2" \
             ubuntu:18.04

Paketinstallation

Zuallererst ist es Ubuntus übliches Update und Upgrade.

# apt-get update
# apt-get upgrade

Installieren Sie als Nächstes Vim als Editor.

# apt-get install vim

Python wird als Programmiersprache verwendet.

# apt-get install python3.6 \
                  python3-dev \
                  python3-pip \
                  libffi-dev \
                  libssl-dev

Installieren Sie OpenCV mit pip.

# pip3 install opencv-python

Erstellen Sie ein Bildanzeigeprogramm

Erstellen Sie ein Basisprogramm zum Anzeigen von Bildern mit OpenCV.

open_image.py


import cv2

# Load an color image
img = cv2.imread('test.jpg')

# Show the image
cv2.imshow('image',img)

# Stop when 0 pressed
cv2.waitKey(0)
cv2.destroyAllWindows()

Problem 1: OpenCV kann nicht korrekt importiert werden

Führen Sie zunächst Python aus und testen Sie, ob OpenCV korrekt importiert werden kann.

# python3
>>> import cv2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.6/dist-packages/cv2/__init__.py", line 3, in <module>
    from .cv2 import *
ImportError: libSM.so.6: cannot open shared object file: No such file or directory

Natürlich kann ich OpenCV aufgrund eines Fehlers nicht importieren. Dieser Fehler kann durch Installation von "libsm6", "libxext6" und "libxrender-dev" [4] behoben werden.

# apt-get install -y libsm6 libxext6 libxrender-dev

Versuchen Sie nach der Installation erneut, OpenCV zu importieren.

# python3
>>> import cv2

Es ist in Ordnung!

Problem 2: Das Bild kann nicht angezeigt werden

Lassen Sie uns die zuvor erstellte open_image.py ausführen.

# python3 open_image.py
No protocol specified
: cannot connect to X server :1

Es scheint, dass die Bildschirmverbindung zum PC fehlgeschlagen ist. Der Grund war, dass der Host-PC die Verbindungsanforderung vom Gast-PC zur Anzeige des Host-PCs ablehnte. Öffnen Sie ein anderes Terminal und führen Sie den folgenden Befehl auf der Seite des Host-PCs aus, um die Verbindung zum Display [[5]] zu ermöglichen (https://unix.stackexchange.com/questions/121716/unable-to-open-x -server) [6] [7] tun können.

$ xhost +
access control disabled, clients can connect from any host

Kehren wir zu dem Terminal zurück, auf dem der Docker-Container ausgeführt wurde, und führen Sie open_image.py aus.

# python3 open_image.py
X Error: BadAccess (attempt to access private resource denied) 10
  Extension:    130 (MIT-SHM)
  Minor opcode: 1 (X_ShmAttach)
  Resource id:  0x247
...

Ich habe einen weiteren Fehler erhalten. Nach der Untersuchung der Fehlerursache scheint es möglich zu sein, sie durch Hinzufügen von "QT_X11_NO_MITSHM = 1" zur Umgebungsvariablen zu beheben. Öffnen Sie zunächst die Datei ".bashrc" in Vim.

# vim ~/.bashrc

Fügen Sie als Nächstes die Umgebungsvariable "QT_X11_NO_MITSHM = 1" hinzu.

export QT_X11_NO_MITSHM=1

Führen Sie nach dem Speichern der Datei ".bashrc" den Befehl "source" [8] aus, um das Hinzufügen von Umgebungsvariablen widerzuspiegeln.

# source ~/.bashrc

Verwenden Sie den Befehl "echo", um festzustellen, ob die Umgebungsvariablen korrekt hinzugefügt wurden.

# echo $QT_X11_NO_MITSHM
1

Es ist in Ordnung! Ich bin zum dritten Mal ehrlich. Lassen Sie uns open_image.py ausführen!

# python3 open_image.py

Das Bild wird angezeigt! !! !!

abschließend

Obwohl es verschiedene Probleme gab, konnte ich den Docker-Container und die PC-Anzeige erfolgreich verbinden und das Bild mit OpenCV anzeigen. Bei dieser Überprüfung haben wir auch festgestellt, dass es sinnvoll ist, die Umgebungsvariable "QT_X11_NO_MITSHM = 1" wie unten gezeigt hinzuzufügen, wenn der Docker-Container bereitgestellt wird.

$ docker run -it \
             --privileged \
             --env="DISPLAY=$DISPLAY" \
             --env="QT_X11_NO_MITSHM=1" \
             --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
             --volume="$HOME/ws/:/home/" \
             --name="ubuntu_cv2" \
             ubuntu:18.04

Ich werde mein Bestes geben, um von nun an Docker-Meister zu werden! Vielen Dank an alle, die es gelesen haben! !! !!

Verweise

[1] Docker run options, https://docs.docker.com/v17.12/edge/engine/reference/commandline/run/ [2] Example of docker run, https://qiita.com/tnarihi/items/275c009e9dec1306893f [3] How to mount on docker, https://docs.docker.com/v17.09/engine/admin/volumes/bind-mounts/ [4] How to solve opencv import error, https://github.com/NVIDIA/nvidia-docker/issues/864 [5] Open X server, https://unix.stackexchange.com/questions/121716/unable-to-open-x-server [6] Allowing computers access, https://www.stitson.com/pub/book_html/node72.html [7] About xhost, https://wiki.archlinux.jp/index.php/Xhost [8] Source command, https://bash.cyberciti.biz/guide/Source_command

Recommended Posts

Docker x Visualization hat nicht funktioniert und ich war süchtig danach, also habe ich es zusammengefasst!
Beachten Sie, dass ich süchtig danach war, TensowFlow einzurichten
Ich habe PySide2 installiert, aber pyside2-uic hat nicht funktioniert, also habe ich es geschafft.
[Einführung in json] Nein, ich war süchtig danach. .. .. ♬
Ich habe versucht, Twitter Scraper mit AWS Lambda zu verwenden, aber es hat nicht funktioniert.
Ich war süchtig danach, logging.getLogger mit Flask 1.1.x zu versuchen
[IOS] GIF-Animation mit Pythonista3. Ich war süchtig danach.
PyTorchs Buch war schwer zu verstehen, deshalb habe ich es ergänzt
[Erwerb der Qualifikation] Ich habe LinuC Level 1 bestanden und werde darüber schreiben, wie man studiert und wie es war.
Ich war süchtig nach Multiprocessing + Psycopg2
W3C-Validatoren haben mit Sublime Text3 nicht funktioniert, also habe ich es zum Laufen gebracht
Ich möchte eine Pipfile erstellen und im Docker wiedergeben
Ich war süchtig nach falschen Klassenvariablen und Instanzvariablen in Python
Ich war süchtig danach, mysqlclient zu installieren
Verwenden Sie Python aus Java mit Jython. Ich war auch süchtig danach.
Ich war auf dotCloud süchtig nach Flask
(Anfänger) Ich bin mir über den SSH- und Linux-Befehl ssh-keygen nicht sicher, also habe ich es zusammengefasst.
Der Dateiname war in Python schlecht und ich war süchtig nach Import
Was ich süchtig nach Python Autorun war
Ich war süchtig danach, Cython mit PyCharm auszuprobieren, also machen Sie sich eine Notiz
Der tree.plot_tree von scikit-learn war sehr einfach und bequem, daher habe ich versucht, zusammenzufassen, wie man es einfach benutzt.
Ich habe versucht, Java mit Termux unter Verwendung von Termux Arch zu verwenden, aber es hat nicht funktioniert
Irgendwie hat der Code, den ich geschrieben habe, funktioniert und ich war beeindruckt, also werde ich ihn veröffentlichen
Als ich versuchte, mit Python eine virtuelle Umgebung zu erstellen, funktionierte dies nicht
Ich konnte AWS-Batch mit Python, Moto verspotten, also werde ich es verlassen
Ich habe die Größenänderung von TensorFlow nicht verstanden und sie daher visuell zusammengefasst.
Ich habe mein Bestes versucht, um eine Optimierungsfunktion zu erstellen, aber es hat nicht funktioniert.
Ich habe versucht, ein Projekt mit Python on Docker mit PyCharm zu erstellen, aber es hat mit Docker Compose funktioniert
Wovon ich süchtig war, als ich Klassenvererbung und gemeinsame Tabellenvererbung in SQLAlchemy kombinierte
Eine Geschichte, von der ich bei np.where süchtig war
Python: Kann in Lambda wiederholt werden
Wovon ich süchtig war, als ich Python Tornado benutzte
Ich habe MNIST mit Caffe gelernt und versucht, es zu zeichnen (MAC OS X El Capitan)
Da es Doppelgenger gab, habe ich versucht, es mit künstlicher Intelligenz zu unterscheiden (lacht) (Teil 1)
Wenn ich versuche, mit Heroku zu pushen, funktioniert es nicht
Wovon ich süchtig war, als der Processing-Benutzer zu Python wechselte
Bis zu dem Punkt, an dem Pythons Sellerie und RabbitMQ (Docker) funktionieren
[Fix] Ich war süchtig nach dem alphanumerischen Urteil über Python-Strings
[Für Black-Screen-Phobie] Ich möchte etwas über Linux und Shells wissen, deshalb habe ich sie lose illustriert.
Ich habe versucht, Pyenv zu verwenden, das ich ohne Essen hasste, und es war zu bequem, mich hinzusetzen.
Ich war ein wenig süchtig nach der Installation von Python3.3 + mod_wsgi3.4 auf Sakura VPS (CentOS), also ein Hinweis zur Überprüfung
Als ich versuchte, mithilfe von Anforderungen in Python zu kratzen, war ich süchtig nach SSLError, also einem Workaround-Memo
Eine Geschichte über das Schreiben von AWS Lambda und ein wenig Abhängigkeit von den Standardwerten von Python-Argumenten
Ich habe versucht, den Teil, in dem die Pflanze gezeigt wird, mithilfe von Deep Learning aus dem Foto der Veranda zu extrahieren, aber es hat nicht funktioniert, daher werde ich den Inhalt von Versuch und Irrtum zusammenfassen. Teil 2