Kinaconの技術ブログ

Ubuntuはじめました。

ディープラーニング SSD(Single Shot MultiBox Detector)を試す。

f:id:m-oota-711:20190216172207p:plain

SSD(Single Shot MultiBox Detector)を試してみました。

試したコードは以下です。

github.com


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に格納する。

mega.nz


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 で抜けることができる。


f:id:m-oota-711:20190214191051p:plain


Trainコードを修正して動かす。

学習データのダウンロード

PASCAL_VOCの2007年の training/validation data をダウンロードする。

host.robots.ox.ac.uk

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")

実行結果

f:id:m-oota-711:20190215072837g:plain

以上。