A certain engineer "COMPLEX"

開発メモ その159 ChainerCVでSSDのメモ

Introduction


備忘録。基本中の基本だけど数学苦手で理論も苦手な自分用のメモ。
基本、train.pyについての解説。

What is problem?


配列の次元の意味

ChainerCVにおけるサンプルのSSDの実装は、MultiboxTrainChainクラスが中心。
で、ネットワークに画像(正確にはバッチ数分)を入力した際の出力について。

下記画像における、mb_locsmb_confs

  • mb_locs
    • multibox locations、つまり位置の損失
    • 次元は、バッチ数、8732、4(x,y,w,h)
  • mb_confs
    • multibox confidences、つまり確信度の損失
    • 次元は、バッチ数、8732、カテゴリ数+1

となる。
カテゴリ数にプラス1しているのは、どのカテゴリにも合致しない、というカテゴリを用意するため。
SSDのサンプルはVOC2007のため、カテゴリ数は20なので、21になる。
8732はデフォルトボックス、つまり画像全体を分割する矩形の個数。

なので、mb_confsの場合、カテゴリ毎に8732の矩形それぞれに損失が格納されていることを意味する。
(正確には、画像毎に対して、カテゴリ8732個が割り当てられ、その1つ1つにカテゴリ21個の損失が格納されている。)
損失はラベルに合致した場合は正、合致しない場合は負になる。

可視化

学習や推論に使用される変数を可視化するといろいろわかる。

データセット

学習を始める前に、利用される教師データがどのようなものかを可視化する。


from chainercv.visualizations import vis_bbox

vocTrain = VOCBboxDataset(year='2007', split='trainval')
img, bbox, label = vocTrain[0]
vis_bbox(img, bbox, label)

imgs

MultiboxTrainChaincallに渡ってくる引数を確認することでいろいろな情報が確認できる。
imgs

  1. cupy.core.core.ndarrayなので、Numpy.ndarrayに変換
  2. チャネル数、高さ、幅の順の次元をNumpy.transposeで、高さ、幅、チャネル数に変換
  3. uint8に変換
  4. RGB形式として画像に変換し、ファイル出力

という手順で可視化ができる。


from PIL import Image
Image.fromarray(np.uint8(np.transpose(chainer.cuda.to_cpu(imgs[0]), (1, 2, 0))),"RGB").save("test.png")

この段階で来る画像は、学習用に水増しされている画像に変換されているので注意。

開発メモ その158 ChainerCVでSSDを動かす

Introduction


ChainerCVSSD (Single Shot Multibox Detector)を遊んでみます。

How to?


CUDA、cuDNNのチェック、仮想環境作成、仮想環境のアクティベートまでの手順は下記です。

Introduction以前、CUDAを含むChainerのインストール手法を書きましたが、もう少しわかりやすく整理しました。ResolutionCUDA_PATHの確認Chainerで利用するCUDAを確認し...

パッケージのインストール

cupycupy-cudachainerのバージョンは一致させます。
cupy-cudaの末尾の数値は、先ほど確認したCUDAのバージョンに合わせます。
また、Chainerは4.5.0を使うため、ChainerCVは0.10.0になります。
(0.11.0はChainer 5.0.0になるため)

また、下記の順番を守ってインストールします。


> python -m pip install --upgrade pip
> python -m pip install cupy==4.5.0
> python -m pip install cupy-cuda92==4.5.0
> python -m pip install chainer==4.5.0
> python -m pip install chainercv==0.10.0
> python -m pip install opencv-python

最終確認

Chainer、ChainerCVがインストールされたこと、ChainerがCUDA、cuDNNを認識していることを確認します。


> python -c "import chainer; chainer.print_runtime_info()"
Platform: Windows-10-10.0.17134-SP0
Chainer: 4.5.0
NumPy: 1.15.4
CuPy:
CuPy Version : 4.5.0
CUDA Root : C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2
CUDA Build Version : 9020
CUDA Driver Version : 9020
CUDA Runtime Version : 9020
cuDNN Build Version : 7104
cuDNN Version : 7104
NCCL Build Version : None

> python -m pip freeze
chainer==4.5.0
chainercv==0.10.0
cupy==4.5.0
cupy-cuda92==4.5.0
fastrlock==0.4
filelock==3.0.10
numpy==1.15.4
opencv-python==3.4.3.18
Pillow==5.3.0
protobuf==3.6.1
six==1.11.0

デモ (学習)

ChainerCVのリポジトリにサンプルが含まれているのでブランチを指定してクローンします。
クローンしたらサンプルを実行します。


> git clone -b v0.10.0 https://www.github.com/chainer/chainercv
> cd chainercv/examples/ssd
> python train.py --model ssd300 --batchsize 32 --gpu 0

データセットはVOC2007のようです。
GeForce GTX 1080を利用した場合、約30時間かかりました。また、バッチサイズを増やそうとしたらメモリが足りなくなりました。

下記は学習後の損失の推移グラフです。
上から、全体の損失、カテゴリの損失、位置の損失です。

デモ (推論)

前項での学習した結果、モデルがresult\model_iter_120000として保存されていますのでそれを活用します。
学習に使ったVOC2007のカテゴリは下記のとおりです。

  • Aeroplanes
  • Bicycles
  • Birds
  • Boats
  • Bottles
  • Buses
  • Cars
  • Cats
  • Chairs
  • Cows
  • Dining tables
  • Dogs
  • Horses
  • Motorbikes
  • People
  • Potted plants
  • Sheep
  • Sofas
  • Trains
  • TV/Monitors

試しにWikipediaにある羊の画像(Lleyn sheep.jpg)を認識させてみます。

なお、推論のデモには追加でモジュールが必要であるためインストールします。


> pip install matplotlib

実行は下記のように行います。


> python demo.py --gpu 0 --pretrained-model result\model_iter_120000 800px-Lleyn_sheep.jpg

良い感じです。

開発メモ その157 Gitlab on Docker in Synology NASのLet's Encryptを更新する

Introduction


一応シェルを作っているので、コマンド一発でできる状態ですが、メモとして残す。

How to?


元々、自宅NAS上のGitLab on DockerへのSSL証明書の適用は下記のサイトを参考にして行っていました。

なので、既にGitLabはhttpsを通じて公開されています。

そして本題。
下記が更新に使用するシェルスクリプトです。
update_gitlab_cert.shとして保存します。


cd /volume1/docker/gitlab/gitlab/certs
# List up files in certs
ls -la
# Confirm expiration date
sudo openssl x509 -noout -dates -in /usr/syno/etc/certificate/system/default/cert.pem
# Copy latest cert files to current directory
sudo cp /usr/syno/etc/certificate/system/default/cert.pem ./gitlab.crt
sudo cp /usr/syno/etc/certificate/system/default/privkey.pem ./gitlab.key
# Update
openssl dhparam -out dhparam.pem 4096

実行前にGitLabを停止します。
下記が実行結果です。非常に時間がかかります。


$ sudo ./update_gitlab_cert.sh
total 12
drwxr-xr-x 1 root root 62 May 27 10:16 .
drwxr-xr-x 1 1000 1000 106 May 26 23:54 ..
-rwxr-xr-x 1 root root 769 Aug 26 02:06 dhparam.pem
-rwxr-xr-x 1 root root 2171 Nov 19 00:23 gitlab.crt
-rwxr-xr-x 1 root root 1675 Nov 19 00:23 gitlab.key
notBefore=Oct 6 04:12:36 2018 GMT
notAfter=Jan 4 04:12:36 2019 GMT
Generating DH parameters, 4096 bit long safe prime, generator 2
This is going to take a long time

終わったらGitLabを再起動します。
ただ、最後のopensslコマンドは一度実行したら実行する必要はないかもしれません。

開発メモ その156 Visual Studio CodeでPythonのデバッグ

Introduction


以前、Visual Studio CodeでPython仮想環境を指定しました。

Introduction備忘録。Resolution拡張機能のインストールMicrosoftのPythonをインストールします。インストール後はVisual Studio Codeを再起動します。ユーザ設定の変更...

その続きで、デバッグを行います。

How to?


まずデバッグしたいPythonのソースを開きます。
次に、画面左のデバッグアイコンをクリックし、歯車アイコンの左にあるコンボボックスを展開します。
そして構成の追加をクリックします。

続いて、仮想環境を選択します。
すると、画面右下でpylintのインストールを促されますので、Installを選択します。
拡張機能とありますが、これは仮想環境にインストールされるパッケージになります。

準備ができましたので、ブレークポイントを設定し、デバッグ開始アイコンをクリックすることで任意の個所で停止できるようになります。

開発メモ その155 Visual Studio CodeでPython仮想環境を指定する

Introduction


備忘録。

Resolution


拡張機能のインストール

MicrosoftPythonをインストールします。
インストール後はVisual Studio Codeを再起動します。

Extension for Visual Studio Code - Linting, Debugging (multi-threaded, remote), Intellisense, code...

ユーザ設定の変更

ここは人の好みによりますが、自分のように特定のディレクトリに仮想環境を集めている場合について説明。
まず、画面左下の歯車アイコンから設定を選択。

次に、Settingsが表示されるので、検索バーにvenvPathと入力し、仮想環境を集めているディレクトリを指定します。
この際、パス区切り文字列はバックスラッシュのままでかまいません。

設定後はVisual Studio Codeを再起動します。

仮想環境を選択

Visual Studio Codeが起動したら、Ctrl+Shift+Pでコマンドパレットを表示させ、Pythonと入力し、その中からPython: インタープリターを選択を選択します。

少しすると、システムにインストールしてある、Pythonと仮想環境に加え、先ほど指定したフォルダの配下にある仮想環境が一覧に表示されます。

Visual Studio Codeを起動したばかりの時だと、仮想環境の一覧が表示されないことがあります。
その時は、コマンドパレットからもう一度選択すれば表示されます。