[PYTHON] Docker x Visualization ne fonctionnait pas et j'en étais accro, alors je l'ai résumé!

introduction

Lors de l'utilisation d'une bibliothèque de vision telle qu'OpenCV sur Docker, il est nécessaire de connecter le conteneur Docker et l'affichage du PC local, mais je ne connaissais pas cette méthode et cela a pris beaucoup de temps, donc je l'ai rencontrée en chemin Je voudrais résumer les problèmes survenus et leurs solutions!

Environnement de développement

Ubuntu! Vérifiez les détails avec la commande suivante!

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

$ arch
x86_64

Télécharger l'image Docker

Tout d'abord, téléchargez l'image Docker à partir de Docker Hub. Les images Docker publiées sur Docker Hub peuvent être téléchargées et enregistrées gratuitement.

$ docker pull ubuntu:18.04

Déployer un conteneur Docker

Lancez le conteneur Docker à l'aide de l'image Docker enregistrée. Il existe différentes options lors du déploiement d'un conteneur Docker [1] [2] //qiita.com/tnarihi/items/275c009e9dec1306893f). Les options utilisées cette fois sont «-it», «--privileged», «--env», «--volume» et «--name». Premièrement, -it permet d'utiliser Bash sur le conteneur Docker en affectant un pseudo terminal au conteneur Docker. Ensuite, --privileged permet d'accéder à tous les appareils. --env spécifie les variables d'environnement à utiliser dans le conteneur Docker. --volume vous permet de monter le répertoire du système d'exploitation hôte sur le système d'exploitation invité [3] /). Vous pouvez spécifier le nom du conteneur avec --name.

$ 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

Installation du package

Tout d'abord, il s'agit de la mise à jour et de la mise à niveau habituelles d'Ubuntu.

# apt-get update
# apt-get upgrade

Ensuite, installez Vim en tant qu'éditeur.

# apt-get install vim

Python est utilisé comme langage de programmation.

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

Installez OpenCV à l'aide de pip.

# pip3 install opencv-python

Créer un programme d'affichage d'images

Créez un programme de base pour afficher des images à l'aide d'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()

Problème 1: OpenCV ne peut pas être importé correctement

Tout d'abord, exécutez Python et testez si OpenCV peut être importé correctement.

# 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

Effectivement, je ne peux pas importer OpenCV en raison d'une erreur. Cette erreur peut être résolue en installant libsm6, libxext6 et libxrender-dev [4].

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

Après l'installation, essayez à nouveau d'importer OpenCV.

# python3
>>> import cv2

C'est bon!

Problème 2: impossible d'afficher l'image

Exécutons le ʻopen_image.py` créé précédemment.

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

Il semble que la connexion d'affichage avec le PC ait échoué. La raison était que le PC hôte a refusé la demande de connexion du PC invité à l'écran du PC hôte. Ouvrez un autre terminal et exécutez la commande suivante côté PC hôte pour permettre la connexion à l'écran [[5]](https://unix.stackexchange.com/questions/121716/unable-to-open-x -serveur) [6] [7] peut faire.

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

Revenons au terminal sur lequel le conteneur Docker s'exécutait et exécutons ʻopen_image.py`.

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

J'ai une autre erreur. Après avoir recherché la cause de l'erreur, il semble qu'elle puisse être résolue en ajoutant QT_X11_NO_MITSHM = 1 à la variable d'environnement. Tout d'abord, ouvrez le fichier .bashrc dans Vim.

# vim ~/.bashrc

Ensuite, ajoutez la variable d'environnement QT_X11_NO_MITSHM = 1.

export QT_X11_NO_MITSHM=1

Après avoir enregistré le fichier .bashrc, exécutez la commande source [8] pour refléter l'ajout de variables d'environnement.

# source ~/.bashrc

Utilisez la commande ʻecho` pour voir si les variables d'environnement ont été ajoutées correctement.

# echo $QT_X11_NO_MITSHM
1

C'est bon! Je suis honnête pour la troisième fois. Lançons ʻopen_image.py`!

# python3 open_image.py

L'image est affichée! !! !!

en conclusion

Bien qu'il y ait eu divers problèmes, j'ai pu connecter avec succès le conteneur Docker et l'écran du PC et afficher l'image avec OpenCV. À partir de cette vérification, il a également été constaté qu'il était bon d'ajouter la variable d'environnement QT_X11_NO_MITSHM = 1 comme indiqué ci-dessous lors du déploiement du conteneur Docker.

$ 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

Je ferai de mon mieux pour devenir un maître Docker à partir de maintenant! Merci à tous ceux qui l'ont lu! !! !!

Les références

[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 ne fonctionnait pas et j'en étais accro, alors je l'ai résumé!
Notez que j'étais accro à la configuration de TensowFlow
J'ai installé PySide2, mais pyside2-uic ne fonctionnait pas, alors j'ai réussi à le faire.
[Introduction à json] Non, j'en étais accro. .. .. ♬
J'ai essayé d'utiliser Twitter Scraper avec AWS Lambda et cela n'a pas fonctionné.
J'étais accro à essayer logging.getLogger avec Flask 1.1.x
[IOS] Animation GIF avec Pythonista3. J'en étais accro.
Le livre de PyTorch était difficile à comprendre, alors je l'ai complété
[Acquisition de la qualification] J'ai réussi le niveau LinuC 1, donc j'écrirai sur la façon d'étudier et comment c'était.
J'étais accro au multitraitement + psycopg2
Les validateurs W3C ne fonctionnaient pas avec Sublime Text3, alors je l'ai fait fonctionner
Je veux créer un fichier pip et le refléter dans le menu fixe
J'étais accro aux variables de classe et aux variables d'instance erronées en Python
J'étais accro à pip installer mysqlclient
Utilisez Python de Java avec Jython. J'étais aussi accro.
J'étais accro à Flask sur dotCloud
(Débutant) Je ne suis pas sûr de SSH et de la commande Linux ssh-keygen, alors je l'ai résumé.
Le nom du fichier était mauvais en Python et j'étais accro à l'importation
Ce que j'étais accro à Python autorun
J'étais accro à essayer Cython avec PyCharm, alors prenez note
L'arbre.plot_tree de scikit-learn était très simple et pratique, j'ai donc essayé de résumer comment l'utiliser facilement.
J'ai essayé d'utiliser Java avec Termux en utilisant Termux Arch, mais cela n'a pas fonctionné
D'une manière ou d'une autre, le code que j'ai écrit a fonctionné et j'ai été impressionné, alors je vais le poster
Quand j'ai essayé de créer un environnement virtuel avec Python, cela n'a pas fonctionné
J'ai pu me moquer d'AWS-Batch avec python, moto, donc je vais le laisser
Je n'ai pas compris le redimensionnement de TensorFlow, alors je l'ai résumé visuellement.
J'ai fait de mon mieux pour créer une fonction d'optimisation, mais cela n'a pas fonctionné.
J'ai essayé de créer un projet en utilisant Python sur Docker avec PyCharm, mais cela a fonctionné avec Docker Compose
Ce à quoi j'étais accro en combinant l'héritage de classe et l'héritage de table commune dans SQLAlchemy
Une histoire à laquelle j'étais accro chez np.where
Python: peut être répété en lambda
Ce à quoi j'étais accro lors de l'utilisation de Python tornado
J'ai appris MNIST avec Caffe et j'ai essayé de le dessiner (MAC OS X El Capitan)
Depuis qu'il y avait Doppelgenger, j'ai essayé de le distinguer avec l'intelligence artificielle (rires) (Partie 1)
Quand j'essaye de pousser avec heroku, ça ne marche pas
Ce à quoi j'étais accro lorsque l'utilisateur de traitement est passé à Python
Au point où le céleri de Python et RabbitMQ (Docker) fonctionnent
[Réparer] J'étais accro au jugement alphanumérique des chaînes Python
[Pour la phobie de l'écran noir] Je veux en savoir plus sur Linux et les shells, donc je les ai illustrés de manière lâche.
J'ai essayé d'utiliser du pyenv, que je détestais sans manger, et c'était trop pratique de m'asseoir.
J'étais un peu accro à l'installation de Python3.3 + mod_wsgi3.4 sur Sakura VPS (CentOS), donc une note de révision
Quand j'ai essayé de gratter en utilisant des requêtes en python, j'étais accro à SSLError, donc un mémo de contournement
Une histoire sur l'écriture d'AWS Lambda et de devenir un peu accro aux valeurs par défaut des arguments Python
J'ai essayé d'utiliser l'apprentissage en profondeur pour extraire la partie où la plante est montrée de la photo de la véranda, mais cela n'a pas fonctionné, je vais donc résumer le contenu des essais et erreurs. Partie 2