A certain engineer "COMPLEX"

開発メモ その162 Ubuntu 18.04でVINOをコマンドラインから有効化する

Introduction


備忘録。
Ubuntu 16ならx11vnc一択なんですけど、Gnomeに変わったため、18ではこれができない。

How to


18からはネットワークに対してVinoの設定をON/OFFする仕組みに変わった模様。
Vinoインストール後、ネットワークマネージャーで接続一覧を表示、取得し、dconfで設定を有効化します。


$ sudo apt install vino
$ nmcli connection show
NAME UUID TYPE DEVICE
有線接続 1 ba688a1f-889f-30a0-b947-ed395181dc52 ethernet enp5s0
$ dconf write /org/gnome/settings-daemon/plugins/sharing/vino-server/enabled-connections "['ba688a1f-889f-30a0-b947-ed395181dc52']"
$ dconf read /org/gnome/settings-daemon/plugins/sharing/vino-server/enabled-connections
['ba688a1f-889f-30a0-b947-ed395181dc52']
$ ss -lnt | grep 5900
LISTEN 0 5 0.0.0.0:5900 0.0.0.0:*
LISTEN 0 5 [::]:5900 [::]:*

開発メモ その161 UbuntuでOpenPoseを動かす

Introduction


かなりはまったのでメモ。

How to


ビルドするだけなら簡単なのだが、動かすとどうしても動かない。
例えば下記のようなエラーが出る。


$ ./pose_1_extract_from_image.bin
Starting OpenPose demo...
F1219 20:52:30.150040 24594 upgrade_proto.cpp:97] Check failed: ReadProtoFromBinaryFile(param_file, param) Failed to parse NetParameter file: models/pose/body_25/pose_iter_584000.caffemodel
*** Check failure stack trace: ***
@ 0x7f91236e55cd google::LogMessage::Fail()
@ 0x7f91236e7433 google::LogMessage::SendToLog()
@ 0x7f91236e515b google::LogMessage::Flush()
@ 0x7f91236e7e1e google::LogMessageFatal::~LogMessageFatal()
@ 0x7f91230ac311 caffe::ReadNetParamsFromBinaryFileOrDie()
@ 0x7f912322351a caffe::Net<>::CopyTrainedLayersFromBinaryProto()
@ 0x7f912501ae17 op::NetCaffe::initializationOnThread()
@ 0x7f912503b48e op::addCaffeNetOnThread()
@ 0x7f912503bf7a op::PoseExtractorCaffe::netInitializationOnThread()
@ 0x7f9125040b80 op::PoseExtractorNet::initializationOnThread()
@ 0x404320 tutorialDeveloperPose1()
@ 0x403613 main
@ 0x7f9123f52830 __libc_start_main
@ 0x403649 _start
@ (nil) (unknown)
Aborted (core dumped)

この現象はissueとして登録されている。

Executed Command (if any) cd /path/to/openpose/build/examples/openpose/ ./openpose.bin --face --logging_level 0 OpenPose Output (if any) /path/to/openpose/in...

ただし、一部のUbuntuで発生しているようで、作者の環境では再現できていない模様。
解決策は、

  • OpenPoseに含まれているCaffeを使わずシステムに登録されているCaffeを使う
  • OpenPoseに含まれているCaffeのリビジョンを変更する

となる。

後者の解決策は

Executed Command (if any) cd /path/to/openpose/build/examples/openpose/ ./openpose.bin --face --logging_level 0 OpenPose Output (if any) /path/to/openpose/in...

で提示されていた。

まず


$ vi openpose/CMakeLists.txt

でファイルを開く。次に、caffeのソースを取得する箇所を修正する。
具体的な行数はリビジョンによって変わるため、下記の行番号は参考であるが、下記の記述はソース中に2つあるため、探せば必ず見つかる。


# Build Process
set(CAFFE_CPU_ONLY OFF)
if (${GPU_MODE} MATCHES "CUDA")
- execute_process(COMMAND git checkout master WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/3rdparty/caffe)
+ execute_process(COMMAND git checkout f019d0dfe86f49d1140961f8c7dec22130c83154 WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/3rdparty/caffe)
elseif (${GPU_MODE} MATCHES "CPU_ONLY")
if (USE_MKL)
#execute_process(COMMAND git checkout intel WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/3rdparty/caffe)
@@ -682,7 +682,7 @@ if (UNIX OR APPLE)
"${CMAKE_BINARY_DIR}/caffe/lib/libmkldnn.so"
)
else (USE_MKL)
- execute_process(COMMAND git checkout master WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/3rdparty/caffe)
+ execute_process(COMMAND git checkout f019d0dfe86f49d1140961f8c7dec22130c83154 WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/3rdparty/caffe)
endif (USE_MKL)
set(CAFFE_CPU_ONLY ON)
set(USE_CUDNN OFF)

この修正を完了後、


$ sudo apt install -y cmake libopencv-dev
$ sudo apt install -y libgflags-dev libgoogle-glog-dev libprotobuf-dev protobuf-compiler libhdf5-serial-dev
$ sudo apt install -y libatlas-base-dev
$ sudo apt install -y --no-install-recommends libboost-all-dev
$ mkdir build
$ cd build
$ cmake ..
$ cmake --build . --config Release

でビルドが可能になる。

また、利用するCUDAは9.2未満にすること。
これは、caffeがlibcublas_device.aを参照しているが、CUDA 9.2で削除されてためである。

開発メモ その160 Ubuntu 18にCUDA 10とcuDNNをインストール

Introduction


Windowsみたいにインストーラがないのでメモ。ちなみにMacはインストーラがある。

How to



> wget https://developer.nvidia.com/compute/cuda/10.0/Prod/local_installers/cuda-repo-ubuntu1804-10-0-local-10.0.130-410.48_1.0-1_amd64
> sudo dpkg -i cuda-repo-ubuntu1804-10-0-local-10.0.130-410.48_1.0-1_amd64.deb
(データベースを読み込んでいます ... 現在 218372 個のファイルとディレクトリがインストールされています。)
cuda-repo-ubuntu1804-10-0-local-10.0.130-410.48_1.0-1_amd64.deb を展開する準備をしています ...
cuda-repo-ubuntu1804-10-0-local-10.0.130-410.48 (1.0-1) を展開しています...

cuda-repo-ubuntu1804-10-0-local-10.0.130-410.48 (1.0-1) を設定しています ...

The public CUDA GPG key does not appear to be installed.
To install the key, run this command:
sudo apt-key add /var/cuda-repo-10-0-local-10.0.130-410.48/7fa2af80.pub
> sudo apt-key add /var/cuda-repo-10-0-local-10.0.130-410.48/7fa2af80.pub
OK
> sudo apt-get update
> sudo apt-get install cuda-10-0

終わったら再起動が必須です。

続いてcuDNN。


sudo dpkg -i libcudnn7_7.4.1.5-1+cuda10.0_amd64.deb
sudo dpkg -i libcudnn7-dev_7.4.1.5-1+cuda10.0_amd64.deb
sudo dpkg -i libcudnn7-doc_7.4.1.5-1+cuda10.0_amd64.deb

開発メモ その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

良い感じです。