本家様 https://github.com/xingyizhou/CenterNet
nvidiaのカードとしてA2000を搭載して、cuda-11.5がインストール済み. そんな環境で CenterNet を動かしてみる.
CentOS7であるならCentOS/devtoolsetにて「devtoolset-10」とかを入れてGCC-8を使えるようにしておく. GCC-4系は無理っぽい
BCCDデータセットでモデルを作ってみた CenterNet/BCCD
アノテーション作成・表示ツール FiftyOne、LabelImg
conda環境の準備 †
既にanaconda/minocondaの利用環境があれば不要だが、なければ作る. っでpython#g1646275のようにanacondaをここでは仕組みます
[illya@rockylinux ~]$ cat /etc/redhat-release
Rocky Linux release 8.6 (Green Obsidian)
[illya@rockylinux ~]$ getenforce
Enforcing
[illya@rockylinux ~]$ wget https://repo.anaconda.com/archive/Anaconda3-2021.11-Linux-x86_64.sh
[illya@rockylinux ~]$ bash ./Anaconda3-2021.11-Linux-x86_64.sh -h
usage: ./Anaconda3-2021.11-Linux-x86_64.sh [options]
Installs Anaconda3 2021.11
-b run install in batch mode (without manual intervention),
it is expected the license terms are agreed upon
-f no error if install prefix already exists
-h print this help message and exit
-p PREFIX install prefix, defaults to /home/illya/anaconda3, must not contain spaces.
-s skip running pre/post-link/install scripts
-u update an existing installation
-t run package tests after installation (may install conda-build)
[illya@rockylinux ~]$
[illya@rockylinux ~]$ bash ./Anaconda3-2021.11-Linux-x86_64.sh -b -p /home/illya/anaconda3
[illya@rockylinux ~]$ ./anaconda3/bin/conda init
(いったんログアウトして再度ログインすると、下記のように表記される)
(base) [illya@rockylinux ~]$
CenterNet 構築 †
ドキュメントの通りに進めると Ampere より古いGPUカードでしかもcuda-9.2とかに限定される.
ここでは Ampere なカードで cuda-11.7 とかのライブラリで動くようにしてみた.
(base) [illya@rockylinux ~]$ /usr/local/cuda/bin/nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Tue_May__3_18:49:52_PDT_2022
Cuda compilation tools, release 11.7, V11.7.64
Build cuda_11.7.r11.7/compiler.31294372_0
(base) [illya@rockylinux ~]$ conda update conda -y
(base) [illya@rockylinux ~]$ conda create --name CenterNet python=3.7 -y <--- CenterNetのドキュメントでは「python=3.6」なのだが無理っぽいので3.7へ
(base) [illya@rockylinux ~]$ conda activate CenterNet
(CenterNet) [illya@rockylinux ~]$ conda install pytorch torchvision cudatoolkit=11.3 Cython pillow -c pytorch -y <---「Cython」と「pillow」を追加してます.
cocoapiのインストール. 場所は「$HOME/apps」に置いたけど、別に「$HOME」直下に置いてもも構わない
(CenterNet) [illya@rockylinux ~]$ mkdir apps
(CenterNet) [illya@rockylinux ~]$ cd apps/
(CenterNet) [illya@rockylinux apps]$ git clone https://github.com/cocodataset/cocoapi
(CenterNet) [illya@rockylinux apps]$ cd cocoapi/PythonAPI/
(CenterNet) [illya@rockylinux PythonAPI]$
(CenterNet) [illya@rockylinux PythonAPI]$ which python <-- pythonのありか
~/anaconda3/envs/CenterNet/bin/python
(CenterNet) [illya@rockylinux PythonAPI]$ make
(CenterNet) [illya@rockylinux PythonAPI]$ python setup.py install --user
CenterNetのインストール. これも場所は「$HOME/CenterNet」とします
(CenterNet) [illya@rockylinux PythonAPI]$ cd $HOME/apps
(CenterNet) [illya@rockylinux apps]$ git clone https://github.com/xingyizhou/CenterNet
(CenterNet) [illya@rockylinux apps]$ cd CenterNet/
(CenterNet) [illya@rockylinux CenterNet]$ ls -CF
data/ exp/ experiments/ images/ LICENSE models/ NOTICE readme/ README.md requirements.txt src/
(CenterNet) [illya@rockylinux CenterNet]$ which pip <-- pipのありかの確認
~/anaconda3/envs/CenterNet/bin/pip
(CenterNet) [illya@rockylinux CenterNet]$ cat requirements.txt
opencv-python
Cython
numba
progress
matplotlib
easydict
scipy
(CenterNet) [illya@rockylinux CenterNet]$ pip install -r ./requirements.txt
っで構築
(CenterNet) [illya@rockylinux CenterNet]$ cd src/lib/models/networks
(CenterNet) [illya@rockylinux networks]$ ls -l
total 80
drwxrwxr-x. 3 illya illya 194 May 22 22:05 DCNv2
-rw-rw-r--. 1 illya illya 22682 May 22 22:05 dlav0.py
-rw-rw-r--. 1 illya illya 9942 May 22 22:05 large_hourglass.py
-rw-rw-r--. 1 illya illya 10167 May 22 22:05 msra_resnet.py
-rw-rw-r--. 1 illya illya 17594 May 22 22:05 pose_dla_dcn.py
-rw-rw-r--. 1 illya illya 10054 May 22 22:05 resnet_dcn.py
(CenterNet) [illya@rockylinux networks]$
(CenterNet) [illya@rockylinux networks]$ mv DCNv2/ DCNv2.orig <--- 付属のモデルは古いGPUとかに対応のようで、ここでは外す
(CenterNet) [illya@rockylinux networks]$ git clone https://github.com/jinfagang/DCNv2_latest DCNv2
(CenterNet) [illya@rockylinux networks]$ ls -lF
total 80
drwxrwxr-x. 4 illya illya 205 May 22 22:07 DCNv2/ <--- 取得したこっちを使います
drwxrwxr-x. 3 illya illya 194 May 22 22:05 DCNv2.orig/
-rw-rw-r--. 1 illya illya 22682 May 22 22:05 dlav0.py
-rw-rw-r--. 1 illya illya 9942 May 22 22:05 large_hourglass.py
-rw-rw-r--. 1 illya illya 10167 May 22 22:05 msra_resnet.py
-rw-rw-r--. 1 illya illya 17594 May 22 22:05 pose_dla_dcn.py
-rw-rw-r--. 1 illya illya 10054 May 22 22:05 resnet_dcn.py
(CenterNet) [illya@rockylinux networks]$
total 80
drwxrwxr-x. 4 illya illya 205 Mar 13 08:42 DCNv2
drwxrwxr-x. 3 illya illya 194 Mar 13 08:39 DCNv2.orig
-rw-rw-r--. 1 illya illya 22682 Mar 13 08:39 dlav0.py
-rw-rw-r--. 1 illya illya 9942 Mar 13 08:39 large_hourglass.py
-rw-rw-r--. 1 illya illya 10167 Mar 13 08:39 msra_resnet.py
-rw-rw-r--. 1 illya illya 17594 Mar 13 08:39 pose_dla_dcn.py
-rw-rw-r--. 1 illya illya 10054 Mar 13 08:39 resnet_dcn.py
(CenterNet) [illya@rockylinux networks]$ cd DCNv2
(CenterNet) [illya@rockylinux DCNv2]$ pwd
/home/illya/apps/CenterNet/src/lib/models/networks/DCNv2
(CenterNet) [illya@rockylinux DCNv2]$
(CenterNet) [illya@rockylinux DCNv2]$ export PATH=/usr/local/cuda/bin:$PATH
(CenterNet) [illya@rockylinux DCNv2]$ vi ./make.sh <-- make.shを修正します
#!/usr/bin/env bash
rm *.so
rm -r build/
python3 setup.py build develop
(CenterNet) [illya@rockylinux DCNv2]$ ./make.sh
もう一つ
(CenterNet) [illya@rockylinux DCNv2]$ cd $HOME/apps/CenterNet/src/lib/external
(CenterNet) [illya@rockylinux external]$ make
テスト †
同封されたテストデータで試してみた
「ctdet_coco_dla_2x.pth」はhttps://github.com/xingyizhou/CenterNet
から入手可能です。
(CenterNet) [illya@rockylinux ~]$ python apps/CenterNet/src/demo.py ctdet --demo apps/CenterNet/images/17790319373_bd19b24cfc_k.jpg --load_model ./ctdet_coco_dla_2x.pth

画面を閉じる際は、表示された画像の上で「リターンキー」を押下すること.
もうひとつ人のポーズをトレースするもの
(CenterNet) [illya@rockylinux ~]$ python apps/CenterNet/src/demo.py multi_pose --demo apps/CenterNet/images/17790319373_bd19b24cfc_k.jpg --load_model ./multi_pose_dla_3x.pth

注意 「demo.py」はPascal vocデータセットには対応していない.
https://github.com/xingyizhou/CenterNet/blob/master/readme/MODEL_ZOO.md
のPascal VOCモデルを試すには「demo.py」から派生した修正ファイルを使用する必要がある.
参照 https://github.com/xingyizhou/CenterNet/issues/142#issuecomment-515751950
(CenterNet) [illya@rockylinux ~]$ cp apps/CenterNet/src/lib/opts.py apps/CenterNet/src/lib/opts_voc.py
(CenterNet) [illya@rockylinux ~]$ cp apps/CenterNet/src/demo.py apps/CenterNet/src/demo_voc.py
「apps/CenterNet/src/demo_voc.py」を修正します
| --- ./apps/CenterNet/src/demo.py 2022-05-22 22:05:02.520256453 +0900
+++ ./apps/CenterNet/src/demo_voc.py 2022-05-23 23:28:37.201004945 +0900
@@ -7,7 +7,7 @@
import os
import cv2
-from opts import opts
+from opts_voc import opts
from detectors.detector_factory import detector_factory
image_ext = ['jpg', 'jpeg', 'png', 'webp']
|
「apps/CenterNet/src/lib/opts_voc.py」を修正します
| --- apps/CenterNet/src/lib/opts.py 2022-05-22 22:05:02.522256470 +0900
+++ apps/CenterNet/src/lib/opts_voc.py 2022-05-23 23:46:11.504512577 +0900
@@ -335,9 +335,9 @@
def init(self, args=''):
default_dataset_info = {
- 'ctdet': {'default_resolution': [512, 512], 'num_classes': 80,
- 'mean': [0.408, 0.447, 0.470], 'std': [0.289, 0.274, 0.278],
- 'dataset': 'coco'},
+ 'ctdet': {'default_resolution': [512, 512], 'num_classes': 20,
+ 'mean': [0.485, 0.456, 0.406], 'std': [0.229, 0.224, 0.225],
+ 'dataset': 'pascal'},
'exdet': {'default_resolution': [512, 512], 'num_classes': 80,
'mean': [0.408, 0.447, 0.470], 'std': [0.289, 0.274, 0.278],
'dataset': 'coco'},
|
実行方法は
(CenterNet) [illya@rockylinux ~]$ python apps/CenterNet/src/demo_voc.py ctdet --demo apps/CenterNet/images/17790319373_bd19b24cfc_k.jpg --load_model ~/ctdet_pascal_dla_384.pth
とします.
あとモデルファイルで「ctdet_coco_hg」なら「--arch hourglass」、「ctdet_pascal_resdcn18_384」なら「--arch resdcn_18」、「ctdet_pascal_resdcn101_384」なら「--arch resdcn_101」を別途追記します
modelを作ってみる †
つまりは前段の「ctdet_coco_dla_2x.pth」を作ってみます. この作り方を覚えれば自分の課題にも対処ができるかなと.
入手可能なデータセットCOCO、Pascal、KITTIからmodelをどう作るのかが下記URLで示されている.
https://github.com/xingyizhou/CenterNet/tree/master/readme
- cocoデータセット 本家様 https://cocodataset.org/

https://cocodataset.org/#download
から
2017 Train, 2017 Val, 2017 Testのイメージデータとannotationファイルを取得する
wget http://images.cocodataset.org/zips/train2017.zip
wget http://images.cocodataset.org/zips/val2017.zip
wget http://images.cocodataset.org/zips/test2017.zip
wget http://images.cocodataset.org/annotations/annotations_trainval2017.zip
wget http://images.cocodataset.org/annotations/image_info_test2017.zip
これらファイルを解凍して、下記のようなannotationsフォルダを作る
~/apps/CenterNet/data/coco/
|
+ annotations/
| +--- captions_train2017.json
| +--- captions_val2017.json
| +--- image_info_test2017.json
| +--- image_info_test-dev2017.json
| +--- instances_train2017.json
| +--- instances_val2017.json
| +--- person_keypoints_train2017.json
| +--- person_keypoints_val2017.json
|
+ test2017/
+ train2017/
+ val2017/
「~/apps/CenterNet/experiments」にモデルの作り方があって「coco_dla_1x」なら
cd ~/apps/CenterNet/src
# train
python main.py ctdet --exp_id coco_dla_1x --batch_size 128 --master_batch 9 --lr 5e-4 --gpus 0,1,2,3,4,5,6,7 --num_workers 16
# test
python test.py ctdet --exp_id coco_dla_1x --keep_res --resume
# flip test
python test.py ctdet --exp_id coco_dla_1x --keep_res --resume --flip_test
# multi scale test
python test.py ctdet --exp_id coco_dla_1x --keep_res --resume --flip_test --test_scales 0.5,0.75,1,1.25,1.5
cd ..
になるみたい. 実行中のログは「~/apps/CenterNet/exp/ctdet/coco_dla_1x」に記載される.
モデルの構築ですが、本家様は使っているノードがTITAN V GPUが8枚のマシンで作っているようで小さい計算ノードでは無理がある.
batch_sizeを小さくすれば一応は動くかと.
- Pascal VOCデータセット 本家様http://host.robots.ox.ac.uk/pascal/VOC/

「CenterNet/src/tools/get_pascal_voc.sh」を参考にフォルダを構成を作る. 一部ファイルが見えないがamazonさんに置いてあるみたい.
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCdevkit_18-May-2011.tar
wget https://s3.amazonaws.com/images.cocodataset.org/external/external_PASCAL_VOC.zip
これらを展開して下記のようなフォルダ構成にする
~/apps/CenterNet/data/voc/
|
+ annotations/
| +--- pascal_trainval0712.json
| +--- pascal_test2007.json
|
+ images/
+ VOCdevkit/
こちらも既にモデルの作り方が用意されていて
cd ~/apps/CenterNet/src
# train
python main.py ctdet --exp_id pascal_resdcn18_512 --arch resdcn_18 --dataset pascal --input_res 512 --num_epochs 70 --lr_step 45,60
# test
python test.py ctdet --exp_id pascal_resdcn18_512 --arch resdcn_18 --dataset pascal --input_res 512 --resume
# flip test
python test.py ctdet --exp_id pascal_resdcn18_512 --arch resdcn_18 --dataset pascal --input_res 512 --resume --flip_test
cd ..
これも動かなく、「--batch_size XX」を入れると動いた
っで完成したモデルファイルを使ってみる
(CenterNet) [illya@rockylinux ~]$ python apps/CenterNet/src/demo_voc.py ctdet --demo apps/CenterNet/images/17790319373_bd19b24cfc_k.jpg --load_model apps/CenterNet/exp/ctdet/pascal_resdcn18_512/model_last.pth --arch resdcn_18

ぅーん、、上手く拾えていない? 下図は本家様の「ctdet_pascal_resdcn18_384.pth」を使った場合

fiftyone †
(base) [illya@centos7 ~]$ conda create -n fiftyone python=3.8
(base) [illya@centos7 ~]$ conda activate fiftyone
(fiftyone) [illya@centos7 ~]$ pip install fiftyone