Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

在docker中使用paddle,在python improt cv2时报错,但是本机的python import cv2是正常的 #8880

Closed
Yight001 opened this issue Mar 8, 2018 · 12 comments
Labels
User 用于标记用户问题

Comments

@Yight001
Copy link

Yight001 commented Mar 8, 2018

在docker中使用python时 import cv2时报错,但在本机却没问题

qq 20180308174250

使用paddle时,也会报错

qq 20180308185054

问题应该就是在docker的python库中找不到opencv,但是没有什么好的方法解决,求大神帮帮忙!

@yeyupiaoling
Copy link
Contributor

@Yight001
您好,docker容器跟本机的环境是完全分离的,所以您在本机安装cv2,对docker是不会影响的

@Yight001
Copy link
Author

Yight001 commented Mar 8, 2018

@yeyupiaoling 但是之前在本机安装的numpy在docker中就能正常使用

@ranqiu92 ranqiu92 added the User 用于标记用户问题 label Mar 8, 2018
@yeyupiaoling
Copy link
Contributor

@Yight001
您先了解Docker容器,如果不熟悉,可以在电脑本机上使用PaddlePaddle
也可以参考这个文章:http://blog.csdn.net/tengxing007/article/details/54380732

@ranqiu92
Copy link
Contributor

ranqiu92 commented Mar 8, 2018

docker与本机是分离的,在docker里输入pip list 看下装了哪些python包

@wangkuiyi
Copy link
Collaborator

wangkuiyi commented Mar 9, 2018

答疑

我估计 @Yight001 说的“host上安装的CV2在Docker里能用”其实是Docker image里也有CV2。

理论上有一种做法,可以让 Docker container 使用host上的Python package —— 在启动 container 的时候使用 -v 参数把host上的Python package directory map到container里。不过这不是一个好办法,因为host上和 container 里的的Python interpreter 可能不是同一个版本,所以他们的package不一定能通用。

解惑

如果要build一个Docker image,能用来跑依赖OpenCV和PaddlePaddle的Python程序,可以:

  1. 写一个Dockerfile,从官方PaddlePaddle Docker image派生自己的image。
  2. 这个Dockerfile里写明安装 python-opencv package。
  3. Build这个新的image。
  4. 运行这个image,启动其中的Python 解释器,并且import image里安装的paddle和cv2

验证

我在我的MacBook Pro上按照上述过程实践了一下,验证通过。

  1. 我的/tmp/cv2paddle/Dockerfile的内容如下:

    FROM paddlepaddle/paddle:latest
    MAINTAINER Yi Wang <[email protected]>
    
    RUN apt-get update && apt-get install -y python-opencv
  2. 我用如下命令build我的image:

    cd /tmp/cv2paddle
    docker build -t cv2paddle .
  3. 用如下命令运行我的image,并且在其中启动一个Python 解释器,来验证可以import paddle和cv2:

    yi@Yis-Mac-mini cv2paddle $ docker run --rm -it cv2paddle /bin/bash
    root@c767b69c8ce5:/# python
    Python 2.7.12 (default, Dec  4 2017, 14:50:18) 
    [GCC 5.4.0 20160609] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import paddle.v2 as paddle
    >>> import cv2
    >>> 

    我没有做进一步的验证,但是至少以上步骤确保import paddle和cv2都没问题。

其他

可能大家会问为什么不在PaddlePaddle的标准Docker image里事先安装好 OpenCV2。其实团队还真讨论过这个可能性。但是OpenCV设计好几十个Ubuntu packages,会让 Docker image 大小剧增。而且国内访问Dockerhub速度很慢,并且非computer vison领域的AI开发者不会用到 OpenCV,所以最终决定不装。

如果有兴趣,欢迎一个负责computer vison的团队基于上述例子Dockerfile维护一个 PaddlePaddle for Vision 的 标准 image。

@Yight001
Copy link
Author

Yight001 commented Mar 9, 2018

大神@wangkuiyi,我对Docker不是很熟悉,找了很多资料,我尝试您的做法,但是始终不能build这个镜像
docker build -t cv2paddle . 中的cv2paddle是 文件夹的名字吗?还有/tmp/cv2paddle/Dockerfile这个路径是本机的路径吗?

@typhoonzero
Copy link
Contributor

docker build -t cv2paddle . 这个命令中-t cv2paddle是指定build生成的镜像的名字。后面的.是指在当前目录.下寻找Dockerfile文件并使用该文件build cv2paddle 这个镜像。

@yeyupiaoling
Copy link
Contributor

@Yight001
如果你不了解使用Dockerfile构建一个镜像,可以在原来的镜像安装和更新你的库,使用命令

docker run -t -i 你的镜像 /bin/bash

然后使用exit退出,在退出之前要记住镜像的ID,然后提交生成一个新的镜像

docker commit -m="提交信息" -a="作者" 刚才记录的ID 镜像名称

要注意是ID是你进入镜像看到的ID,比如root@1234566,那么1234566就是ID
镜像名称的结构是:REPOSITORY:TAG

@Yight001
Copy link
Author

Yight001 commented Mar 9, 2018

@yeyupiaoling 在镜像中如何更新我的库呢,按照您的方法进入了指定的镜像

qq 20180309135813

@Yight001
Copy link
Author

Yight001 commented Mar 9, 2018

我在镜像中安装了opencv但是还是报错

qq 20180309153601

@typhoonzero
Copy link
Contributor

Try apt-get install libglib2.0-0, if this still does not work, try find whether libgthread-2.0.so.0 exists and export LD_LIBRARY_PATH to it's directory.

@Yight001
Copy link
Author

感谢大家的帮助,在参考了你们的方法后,这个问题得以解决。我的解决方法是在有opencv的镜像中,安装paddle,这样就可以import paddle.v2 和 import cv2。

@Yight001 Yight001 reopened this Mar 12, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
User 用于标记用户问题
Projects
None yet
Development

No branches or pull requests

5 participants