ディープラーニング SSD(Single Shot MultiBox Detector)を試す。
SSD(Single Shot MultiBox Detector)を試してみました。
試したコードは以下です。
dockerで実行環境を構築し、一部コードを修正して推論・転移学習してます。
目次
作業環境
スペック | |
---|---|
GPU | GeForce GTX 1080 |
CPU | intel® Core™ i7-7700K |
メモリ | 15.6 GB |
作業環境 | ver |
---|---|
Ubuntu | 16.04 |
docker-io | 18.09.1 |
nvidia-docker2 | 2.0.3 |
実行環境の構築
dockerコンテナに実行環境を構築し、推論や学習を行う。
実行環境 | ver |
---|---|
keras | 1.2.2 |
tensorflow-gpu | 1.0.1 |
OpenCV | 3.1.0 |
詳細は以下のdockerfile参照
FROM nvidia/cuda:8.0-cudnn5-devel LABEL maintainer="kinacon-blog.work" RUN apt update && \ apt install -y --no-install-recommends \ cmake \ unzip \ git \ python3.5 \ libpython3-dev \ python3-pip \ zlib1g-dev \ libffi-dev \ libssl-dev && \ apt clean && \ rm -rf /var/lib/apt/lists/* RUN pip3 install --upgrade pip setuptools RUN pip3 install numpy \ pillow \ scipy \ matplotlib \ tensorflow-gpu==1.0.1 \ keras==1.2.2 \ h5py RUN apt update && \ apt install -y --no-install-recommends \ nano \ python3-tk \ ca-certificates \ pkg-config \ libgtk2.0-dev \ libcanberra-gtk-module \ libjpeg-dev \ libpng-dev \ ffmpeg \ libhdf5-dev \ libavcodec-dev \ libavformat-dev \ libavresample-dev \ libswscale-dev \ libv4l-dev \ libtbb2 \ libtbb-dev && \ apt clean && \ rm -rf /var/lib/apt/lists/* # refer: https://gist.github.com/filitchp/5645d5eebfefe374218fa2cbf89189aa RUN mkdir -p /tmp/opencv WORKDIR /tmp/opencv RUN git clone https://github.com/daveselinger/opencv . && \ git checkout 3.1.0-with-cuda8 RUN mkdir build WORKDIR /tmp/opencv/build/ RUN cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D PYTHON_DEFAULT_EXECUTABLE=$(which python3) \ -D WITH_CUDA=ON \ -D WITH_CUBLAS=ON \ -D ENABLE_FAST_MATH=ON \ -D CUDA_FAST_MATH=ON \ -D WITH_TBB=ON \ -D WITH_V4L=ON \ -D WITH_OPENGL=ON \ -D BUILD_PERF_TESTS=OFF \ -D BUILD_TESTS=OFF \ -D CUDA_NVCC_FLAGS="-D_FORCE_INLINES" .. && \ make -j "$(nproc)" && \ make install && \ ldconfig && \ make clean RUN cp lib/python3/cv2.cpython-35m-x86_64-linux-gnu.so /usr/lib/python3/dist-packages/ WORKDIR /tmp/
docker imageをbuildする。
ここでは、dockerfileは/docker_buildに格納してます。
cd docker_build docker build -t ssd-keras:1.2.2 .
コードの入手
ssd_kerasのダウンロード
以下より入手し、解凍する。
GitHub - rykov8/ssd_keras: Port of Single Shot MultiBox Detector to Keras
学習済み重みのダウンロード
学習済み重み(weights_SSD300.hdf5)をダウンロードし、ssd_keras-masterに格納する。
Testコードを修正して動かす。
testコードは以下に格納されている。
ssd_keras-master/testing_utils/videotest_example.py, videotest.py
コード修正
videotest_example.py
# vid_test.run('path/to/your/video.mkv')
vid_test.run(../pics/cat.jpg)
videotest.py
#1 # Compute aspect ratio of video # vidw = vid.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH) # vidh = vid.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT) vidw = vid.get(cv2.CAP_PROP_FRAME_WIDTH) vidh = vid.get(cv2.CAP_PROP_FRAME_HEIGHT) #2 # Skip frames until reaching start_frame if start_frame > 0: # vid.set(cv2.cv.CV_CAP_PROP_POS_MSEC, start_frame) vid.set(cv2.CAP_PROP_POS_MSEC, start_frame) #3 # cv2.waitKey(10) cv2.waitKey(0)
実行結果
# コンテナ起動 xhost +local:user docker container run -it --rm \ --runtime=nvidia \ -e DISPLAY=$DISPLAY \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -v ~/ssd_keras-master:/tmp/docker: \ ssd-keras:1.2.2 # SSD実行 cd /tmp/docker/testing_utils python3 videotest_example.py
コンテナからはctrl + D で抜けることができる。
Trainコードを修正して動かす。
学習データのダウンロード
PASCAL_VOCの2007年の training/validation data をダウンロードする。
Trainコードは以下に格納されている。
ssd_keras-master/SSD_training.ipynd
SSD_training.ipyndを.pyに変換
pythonコードに変換する
cd ssd_keras-master pip3 install jupyter jupyter nbconvert --to python SSD_training.ipynb
コード修正
SSD_training.py
#0 import matplotlib matplotlib.use('TkAGG') import matplotlib.pyplot as plt #1 import os os.makedirs("./checkpoints/",exist_ok=True) #2 # get_ipython().run_line_magic('matplotlib', 'inline') #3 # NUM_CLASSES = 4 NUM_CLASSES = 21 #4 # gt = pickle.load(open('gt_pascal.pkl', 'rb')) gt = pickle.load(open('dataset.pkl', 'rb')) #5 # path_prefix = '../../frames/' path_prefix = './VOCdevkit/VOC2007/JPEGImages/' #6 # gen = Generator(gt, bbox_util, 16, '../../frames/', gen = Generator(gt, bbox_util, 16, path_prefix, train_keys, val_keys, (input_shape[0], input_shape[1]), do_crop=False) #7 # colors = plt.cm.hsv(np.linspace(0, 1, 4)).tolist() colors = plt.cm.hsv(np.linspace(0, 1, NUM_CLASSES)).tolist()
dataset.pklの作成(アノテーションデータの読み込み)
get_data_from_XML.pyを用いてPASCAL VOC形式のアノテーションデータをpickle形式に変換する。
get_data_from_XML.pyを修正
格納先は以下
/PASCAL_VOC/get_data_from_XML.py
get_data_from_XML.py
## example on how to use it # import pickle # data = XML_preprocessor('VOC2007/Annotations/').data # pickle.dump(data,open('VOC2007.p','wb')) import pickle data = XML_preprocessor('../VOCdevkit/VOC2007/Annotations/').data pickle.dump(data,open('../dataset.pkl','wb'))
get_data_from_XML.pyを実行
ssd_keras-masterの中にdataset.pklを作成される。
cd ssd_keras-master/PASCAL_VOC python3 get_data_from_XML.py
Trainの実行
# コンテナ起動 xhost +local:user docker container run -it --rm \ --runtime=nvidia \ -e DISPLAY=$DISPLAY \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -v ~/ssd_keras-master:/tmp/docker: \ ssd-keras:1.2.2 # SSD Train実行 cd /tmp/docker/ python3 SSD_training.py
Train結果の確認
ssd_keras-master/checkpointsに今回学習した重みが格納されているので、これを使用してTestコードを実行する。
新しい学習済み重みの設定と、
ソースを動画(ssd_keras-masterに格納)で実行するよう修正した。
videotest_example.py
#0 # model.load_weights('../weights_SSD300.hdf5') model.load_weights('../checkpoints/weights.29-2.20.hdf5') #1 # vid_test.run('path/to/your/video.mkv') # vid_test.run(../pics/cat.jpg) vid_test.run("./Street - 5025.mp4")
実行結果
以上。