当前位置: 首页 > 知识库问答 >
问题:

使用Docker在jupyter中运行OpenCv

邵轶
2023-03-14

我想制作一个易于运行的 jupyter 笔记本,它支持 OpenCV,并作为 Docker 映像提供。

这个概念是让一个 docker 容器运行 jupyter 内核,并通过主机中的浏览器访问笔记本。类似的东西。

但是,问题是OpenCV似乎依赖于正在运行的Gtkenvironment.So尝试运行以下代码

import numpy as np
import cv2
img = cv2.imread('pendulum.png',0)
cv2.imshow('image',img) 

导致jupyter内核崩溃:

(image:603): Gtk-WARNING **: cannot open display: 
[I 15:23:49.808 NotebookApp] KernelRestarter: restarting kernel (1/5)

有没有办法绕过这种依赖关系,让在泊坞站容器中运行的OpenCV在主机系统的浏览器中显示图像?

重现问题的步骤:

Dockerfile:

FROM ubuntu:16.04

RUN apt-get update

RUN apt-get update --fix-missing && apt-get install -y wget bzip2 ca-certificates \
    libglib2.0-0 libxext6 libsm6 libxrender1 \
    git mercurial subversion

RUN echo 'export PATH=/opt/conda/bin:$PATH' > /etc/profile.d/conda.sh && \
    wget --quiet https://repo.continuum.io/archive/Anaconda3-4.0.0-Linux-x86_64.sh && \
    /bin/bash /Anaconda3-4.0.0-Linux-x86_64.sh -b -p /opt/conda && \
    rm /Anaconda3-4.0.0-Linux-x86_64.sh

ENV PATH /opt/conda/bin:$PATH

RUN conda install -y -c https://conda.binstar.org/menpo opencv3

RUN apt-get install -y libgomp1
RUN apt-get install -y libgtk2.0-0 x11-xserver-utils libcanberra-gtk3-module
RUN mkdir /home/user
RUN groupadd -r user -g 777 && \
useradd -u 431 -r -g user -d /home/user -s /sbin/nologin -c "Docker image user" user

RUN apt-get install -y libcanberra-gtk*

RUN chown -R user:user /home/user

USER user
WORKDIR /home/user

要执行的命令:

docker build -t opencv-play .
docker run -v /home/user/.Xauthority:/home/user/.Xauthority -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY -u user -v `pwd`:/home/user -p 8008:8008 -t -i opencv-play
jupyter notebook --ip='*' --no-browser --port=8008   #Inside the container
#Open the browser, URL-> http://localhost:8008
#Run the above code in jupyter

共有3个答案

岳刚洁
2023-03-14

为了能够在docker的jupyter中运行opencv,我和其他用户做了相同的操作,但方式更明确:

在主机中:

xhost +local:root

docker run -it --name yolo_cuda8 -v "/home/dl001/dhiren/robust_tracking/camera/:/home/notebooks" -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY -p 8888:8888 new_cuda8 bash

容器内:

jupyter notebook --port=8888 --ip=0.0.0.0 --allow-root --no-browser

值得通过发出 echo $DISPLAY 命令来检查主机中的 DISPLAY 变量,并验证和设置 docker 容器内部是否不存在。

env
export DISPLAY=:1

参考:

链接2

储阳曦
2023-03-14

我的建议是不要使用OpenCV进行绘图,而是使用matplotlib。这样可以更好地打印(OpenCV打印功能非常有限),还可以直接输出笔记本电脑。

您可以选择使用inline后端,该后端将每个绘图呈现为PNG(?)图像并将其显示在笔记本中。但是,这不允许缩放、平移等。

笔记本电脑后端支持缩放等功能,但我上次尝试时边缘很粗糙。

无论哪种方式,要使用它,您都可以使用%matplotlib魔法选择后端。

import matplotlib.pyplot as plt
%matplotlib inline

plt.imshow(img)
plt.title('My image')
plt.show()

对于笔记本后端,只需执行%matplotlib笔记本

使用图像时,调用plt通常也是一个好主意。imshow不带插值:

plt.imshow(img, interpolation='none')

plt.show()的调用对于普通桌面后端(Gtk,Qt)是必需的,但对于内联后端(和笔记本后端?我不记得了)不是必需的。

钱承允
2023-03-14

有两种可能的解决方案:

>

  • 允许容器访问本地XServer。这将显示所有图形输出,就像您直接在主机上而不是在Docker容器中运行软件一样。为此,需要设置DISPLAY环境变量,并将X11套接字传递给容器。在您的示例中,您将:

    $ docker run -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY -v `pwd`:/home/workspace -p 8008:8008 -t -i opencv-play
    
      < Li > < code >-v/tmp/. X11-UNIX:/tmp/. X11-UNIX 将X11套接字传递给容器 < Li > < code >-e DISPLAY = $ DISPLAY 将显示环境变量设置为您的主机系统上的显示环境变量

    如果您不需要图形输出,您可以运行一个不显示任何输出的“假”X服务器。Xvfb就是这样一个不需要访问显示器的显示服务器。为了使用它,您需要在映像中安装Xvfb,即将apt-get install xvfb添加到您的Dockerfile。然后,当您运行容器时,您首先需要启动xvfb并相应地设置DISPLAY。我通常使用一个小脚本来执行此操作,然后启动您的命令,例如。

    #!/bin/bash
    export DISPLAY=0:0
    Xvfb $DISPLAY &
    jupyter notebook --ip='*' --no-browser --port=8008
    

    这将在后台启动Xvfb,然后启动jupyter,将所有图形输出传递到0:0上的Xvfbdisplay服务器。将此脚本添加到映像中,然后按以下方式运行:

    html" target="_blank">docker run -v `pwd`:/home/workspace -p 8008:8008 -t -i opencv-play /path/to/the/script
    

    请注意,您不需要将DISPLAY传递给容器。

  •  类似资料:
    • Jupyter 是个好东西,提供了简单易用的 web REPL 环境,并且可以根据工作语言选配不同的 kernel 提供不同的功能。但是,由于常常用作测试所用,因此对于我这样的“洁癖患者”来说,保持后台常驻和环境清洁实在是非常终于,于是我想到了 docker,实在是 Jupter 运行容器的不二之选。 本来打算自己定制一个的,不过一番搜索后发现官方提供了更为详细和成熟的 docker 镜像,实在是

    • 我正在寻找合并一些cython来加速我的代码。我在Jupyter中运行cython代码时遇到问题。 牢房1: 单元格2: 错误: 但如果我这样做,效果很好。 看起来cdef在Jupyter中的使用方式不同,我如何在Jupyter笔记本中使用cdef?

    • Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序。 Hello world 现在让我们来试试 $ sudo docker run ubuntu:14.04 /bin/echo 'Hello world' Hello world 刚才你启动了你的第一个容器! 那么刚才发生了什么? 我们逐步来分析 docker run 命令做了哪些事情。 首先,

    • 我正在尝试做一些深度学习的工作。为此,我首先在我的Python环境中安装了所有用于深度学习的包。 这就是我所做的。 在Anaconda中,我创建了一个名为的环境,如下所示 然后在其中安装了data science Python包,如Pandas、NumPy等。我还在那里安装了TensorFlow和Keras。下面是该环境中的包列表 您可以看到还安装了。 现在,当我在这个环境中打开Python解释器

    • 我开始学习如何使用TensorFlow进行机器学习。发现docker在我的机器上部署TensorFlow非常方便。然而,我能找到的例子对我的目标设定不起作用。那是 在ubuntu16.04操作系统下,使用nvidia-docker同时托管jupyter和拉伸板服务(可以是两个容器或一个容器有两个服务)。从jupyter创建的文件应该对主机操作系统可见。 Ubuntu 16.04 多克尔 nvidi

    • 问题内容: 好的,我几乎用尽了所有线程和文章,但是仍然无法使我的apache网络服务器在Centos Docker Container上以独立模式运行。 这是我的简化Dockerfile 我的starservice脚本只有 我可以构建良好,但是似乎无法在守护程序/独立模式下运行容器。我怎么做? 我正在使用它以独立模式运行容器 我必须登录到容器并启动服务以使Web服务器运行。 问题答案: 这是经典的