It’s almost inevitable to use Docker images these days especially if you want to have a consistent development environment and configuration. They make life extremely easy by guaranteeing that your application (in this case, Computer Vision application) will always behave the same way as it did when you developed it. How? By using Containerization. If you’re not familiar with the topic then I suggest first doing some research and reading on “Containerization vs Virtualization” and how to use Docker. Then come back to this tutorial to learn how to create a Computer Vision Docker Image that you can use to develop and play around with TensorFlow and OpenCV for Object Detection.
First things first, make sure you have Docker installed on your machine.
Then create a folder called “computervision” and then create a file named “Dockerfile” in that folder. Paste the following code into “Dockerfile”:
FROM tensorflow/tensorflow:1.15.2-py3-jupyter
RUN apt-get update
RUN apt-get upgrade -y
RUN apt-get install git cmake wget unzip -y
ADD opencv.sh /home/opencv.sh
RUN /home/opencv.sh
RUN pip install Cython
RUN pip install contextlib2
RUN pip install pillow
RUN pip install lxml
ADD tfmodels.sh /home/tfmodels.sh
RUN /home/tfmodels.sh
Next, create a file named “tfmodels.sh” in the same folder and paste the following code in it:
cd /tf/
git clone https://github.com/tensorflow/models.git --single-branch v1.13.0
mv v1.13.0 models
git clone https://github.com/cocodataset/cocoapi.git
cd cocoapi/PythonAPI
make
cp -r pycocotools /tf/models/research/
cd /tf/models/research
wget -O protobuf.zip https://github.com/google/protobuf/releases/download/v3.0.0/protoc-3.0.0-linux-x86_64.zip
unzip protobuf.zip
./bin/protoc object_detection/protos/*.proto --python_out=.
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim
python object_detection/builders/model_builder_test.py
The next file we need is called “opencv.sh” which will contain the following:
cd /
git clone https://github.com/opencv/opencv.git --single-branch 3.4.9
mv 3.4.9 cv
cd cv
mkdir build
cd build
cmake ..
make
make install
We have all the files we need. Now run the following command from inside the “computervision” folder:
docker build --tag computervision .
This will take a long time (depending on your internet speed and computer specs) but eventually you’ll have a Docker image that you can run. It’s worth noting that the image we build contains the following main compnents:
- TensorFlow 1.5.2
- TensorFlow Models 1.3.0
- OpenCV 3.4.9
- Jupyter Notebook
Let’s run the image we just created, using the following command:
docker run -p 8888:8888 computervision
This will output some text into the Terminal/Command Prompt/PowerShell which will contain a URL similar to the following:
http://127.0.0.1:8888/?token=487a8ed5ac0cb13b0a57080917cc679db9242180a5181a52
Copy and paste it into your browser. This should take you to the local Jupyter server running in the background using Docker. Now you can start experimenting with TensorFlow and OpenCV.
Not all the folders seen here will be available on your Jupyter server. As a great starting point, let’s use the example from this page to use TensorFlow pretrained models in OpenCV:
https://github.com/opencv/opencv/wiki/TensorFlow-Object-Detection-API
If you’re not familiar with Jupyter Notebooks then it might feel a bit strange at first but as soon as you get used to it, life seems impossible without it. So, let’s create a Jupyter Notebook and create the following cells in it.
The first cell is responsible for downloading all the necessary files:
!wget "http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v2_coco_2018_03_29.tar.gz"
!tar -xvzf "ssd_mobilenet_v2_coco_2018_03_29.tar.gz"
!wget "https://somewebsite.com/test.jpg"
Obviously you need to replace “https://somewebsite.com/test.jpg” with a real URL to a “test.jpg” file you want to test with Object Detection.
The next cell is the sample code from the OpenCV Object Detection example (slightly changed since we can’t use cv.imshow in a Jupyter Notebook:
import numpy as np
import tensorflow as tf
import cv2 as cv
# Read the graph.
with tf.gfile.FastGFile('ssd_mobilenet_v2_coco_2018_03_29/frozen_inference_graph.pb', 'rb') as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
with tf.Session() as sess:
# Restore session
sess.graph.as_default()
tf.import_graph_def(graph_def, name='')
# Read and preprocess an image.
img = cv.imread('test.jpg')
rows = img.shape[0]
cols = img.shape[1]
inp = cv.resize(img, (300, 300))
inp = inp[:, :, [2, 1, 0]] # BGR2RGB
# Run the model
out = sess.run([sess.graph.get_tensor_by_name('num_detections:0'),
sess.graph.get_tensor_by_name('detection_scores:0'),
sess.graph.get_tensor_by_name('detection_boxes:0'),
sess.graph.get_tensor_by_name('detection_classes:0')],
feed_dict={'image_tensor:0': inp.reshape(1, inp.shape[0], inp.shape[1], 3)})
# Visualize detected bounding boxes.
num_detections = int(out[0][0])
for i in range(num_detections):
classId = int(out[3][0][i])
score = float(out[1][0][i])
bbox = [float(v) for v in out[2][0][i]]
if score > 0.3:
x = bbox[1] * cols
y = bbox[0] * rows
right = bbox[3] * cols
bottom = bbox[2] * rows
cv.rectangle(img, (int(x), int(y)), (int(right), int(bottom)), (125, 255, 51), thickness=2)
The last cell is responsible for displaying the result of Object Detection:
import matplotlib.pyplot as plt
plt.imshow(img)
Run these cells consecutively and you’ll see the result of object detection (like the following in my case):
Try different things and play around with TensorFlow and OpenCV. The Docker image we created, can of course be modified to use other versions of TensorFlow and OpenCV as well. The greatest thing about it though, is that it will always be ready to go and work on all platforms exactly the same way.
I’m getting the error that cv2 does not exist with all the given code (I had to use chmod -x to run the .sh in the Dockerfile)
When I run Cell 2 in the new notebook:
—————————————————————————
ModuleNotFoundError Traceback (most recent call last)
in
1 import numpy as np
2 import tensorflow as tf
—-> 3 import cv2 as cv
4
5 # Read the graph.
ModuleNotFoundError: No module named ‘cv2’
So I tried switching to a pip install of opencv-python, but that returns the same (or a very similar) failure.
What are the tricks to this? I’ve tried to do several walkthroughs that all seem to fail on opencv, but at least this one got me to Jupyter, so thank you!
Can you please try the image from this post and let me know if you face any issues?
https://amin-ahmadi.com/2020/09/10/computer-vision-docker-image-with-tensorflow-and-opencv-from-scratch/
Got a error:
—————————————————————————
AttributeError Traceback (most recent call last)
in
4
5 # Read the graph.
—-> 6 with tf.gfile.FastGFile(‘ssd_mobilenet_v2_coco_2018_03_29/frozen_inference_graph.pb’, ‘rb’) as f:
7 graph_def = tf.GraphDef()
8 graph_def.ParseFromString(f.read())
AttributeError: module ‘tensorflow’ has no attribute ‘gfile’
Sounds like a recent update to tensorflow which has rendered the code incompatible. Try explicitly specifying older TF versions such as 2.0 and see if that helps.
Hello, Amin. I’m receiving the same error (…has no attribute ‘gfile’). To specify an older TF version, where does this need to be done? In original Dockerfile and rebuild?
Thank you for the article!
See if the updated post helps:
https://amin-ahmadi.com/2020/09/10/computer-vision-docker-image-with-tensorflow-and-opencv-from-scratch/
Just FYI
I won’t ask solution, but this looks defect to me in the script. The “cd\” is still causing problem . I have installed whole Docker from beginning and tried your given scripts again. May be you need to check it in windows that if these works or the scripts are compatible to other operating system.
I understand you still face issues with the image here, can you please try the image from this post and let me know if you face any issues?
https://amin-ahmadi.com/2020/09/10/computer-vision-docker-image-with-tensorflow-and-opencv-from-scratch/
Thanks for helping all this, BTW this page popped up in google search which stated “First things first, make sure you have Docker installed on your machine.” which i already assumed to have, but never thought of different version would have play key role in it.
Thanks for correcting a silly mistake for getting me out of 3 days drama, still who knows how many odds are yet to come. But at the same time, I accept that I should have been diligent, while putting the statement. no matter whether your solution worked me or not. Learning went crazy on me.
Appreciate you patience!!
Yea… I feel the same its long trip.
Here is another error.
$ docker run tensorflow/tensorflow:1.15.2-py3-jupyter -p 8888:8888
C:\Program Files\Docker Toolbox\docker.exe: Error response from daemon: OCI runtime create failed: container_linux.go:346: starting container process caused “exec: \”-p\”: executable file not found in $PATH”: unknown.
Ok, you certainly have a problem with your Docker installation.
Check this link:
https://docs.docker.com/docker-for-windows/
Are you able to run this?
docker run hello-world
If not, fix your Docker first.
What kind of Windows do you got? Home or Pro?
That is the only thing working .. lol… from last 3 days..
What kind of Windows do you have? Home? Pro?
You’re using Docker Toolbox, not Docker Desktop.
See this link:
https://docs.docker.com/toolbox/toolbox_install_windows/
Which mentions this:
Legacy desktop solution. Docker Toolbox is for older Mac and Windows systems that do not meet the requirements of Docker Desktop for Mac and Docker Desktop for Windows. We recommend updating to the newer applications, if possible.
Windows 10
Docker Toolbox ver 18
Please read my last question again and answer all of it.
You can’t use Docker Toolbox.
You must have Docker desktop for this.
If you’re on Windows 10 Home Edition, read this:
https://amin-ahmadi.com/2020/06/16/using-docker-with-windows-10-home-edition/
Hope it helps.
If you are on Windows 10 Pro, install Docker Desktop and try everything from scratch.
And next time please try to read and research your stuff before going on a complain frenzy like this.
I am new to docker . Most of docker images available in docker hub are copied from each other, because no one talked about how to make jupyter notebooks run, as it was asking password for all. After lot of struggle found your website where you talked about how to create your own stuff. I got impressed and follow all the steps like religious book. For long time when logs were being printed with errors and finally not able to get the image created. I lost patience thought asking. Is there common source of where all are learning Hope I could refer that too.
Well back to the point. If somehow we could resolve it. Here is the problem I am facing
1. debconf: delaying package configuration, since apt-utils is not installed
2. Step 5/12 : ADD opencv.sh /home/opencv.sh
—> 5d9bd4bb8fb5
Step 6/12 : RUN /home/opencv.sh
—> Running in 7976c9b7574f
/home/opencv.sh: 1: cd: can’t cd to /
‘…ing into ‘3.4.9
Checking out files: 100% (6509/6509), done.
mv: cannot stat ‘3.4.9’: No such file or directory
/home/opencv.sh: 4: cd: can’t cd to cv
” does not exist.source directory “/tf/build
Specify –help for usage, or press the help button on the CMake GUI.
: not foundv.sh: 8: /home/opencv.sh: make
make: *** No rule to make target ‘install’. Stop.
The command ‘/bin/sh -c /home/opencv.sh’ returned a non-zero code: 2
3. Step 5/12 : ADD opencv.sh /home/opencv.sh
—> 5d9bd4bb8fb5
Step 6/12 : RUN /home/opencv.sh
—> Running in 7976c9b7574f
/home/opencv.sh: 1: cd: can’t cd to /
‘…ing into ‘3.4.9
Checking out files: 100% (6509/6509), done.
mv: cannot stat ‘3.4.9’: No such file or directory
/home/opencv.sh: 4: cd: can’t cd to cv
” does not exist.source directory “/tf/build
Specify –help for usage, or press the help button on the CMake GUI.
: not foundv.sh: 8: /home/opencv.sh: make
make: *** No rule to make target ‘install’. Stop.
The command ‘/bin/sh -c /home/opencv.sh’ returned a non-zero code: 2
Ignore item 1, that’s just a warning. No biggie.
2 and 3 are the same thing, more or less.
What’s your operating system?
Windows, macOS, Linux?
Windows
That is strange, seems docker build can’t access the root folders.
Here’s a few things for you to try.
1. Try it on a Linux machine if you have access to
2. use
--no-cache
in your docker build command3. replace root path is all script with /home
This means, replace “cd /” with “cd /home” in opencv.sh
Let me know how this goes.
Nope… it stuck with home now…
/home/opencv.sh: 1: cd: can’t cd to /home
‘…ing into ‘3.4.9
Ok, this is going to be a long road.
Just run the source image as it is:
docker run tensorflow/tensorflow:1.15.2-py3-jupyter -p 8888:8888
Let me know if it runs.
Did you run this urself… or copied from somewhere? because nothing working in it.
I assume you want to ask “how can I make this work?”
I’ll start with another assumption, you already know what docker is and how jupyter works and all that.
So what exactly is the problem you are facing?In other words, what error you get?