網頁

顯示具有 tlt 標籤的文章。 顯示所有文章
顯示具有 tlt 標籤的文章。 顯示所有文章

2022年5月13日 星期五

Gazenet 視線追蹤

參考 Nvidia TAO(Train, Adapt, and Optimize) 安裝一些環境
開啟 http://0.0.0.0:8888/notebooks/gazenet/gazenet.ipynb
並參考說明文件 Gaze Estimation

修改
%env LOCAL_PROJECT_DIR=FIXME
%env SAMPLES_DIR=FIXME
os.environ["LOCAL_PROJECT_DIR"]="/your_host_path_to/cv_samples_vv1.3.0"
os.environ["SAMPLES_DIR"]="/your_host_path_to/cv_samples_vv1.3.0"

放到 /your_host_path_to/cv_samples_vv1.3.0/gazenet/data
$ unzip MPIIFaceGaze.zip
$ cp ../sample_labels/data_factory.zip MPIIFaceGaze
$ cd MPIIFaceGaze/
$ unzip data_factory.zip
$  cd ../../specs
$ vi gazenet_tlt_pretrain.yaml
修改 num_epoch

但結果不如預期

2022年5月11日 星期三

Nvidia TAO(Train, Adapt, and Optimize)

Nvidia TLT(Transfer Learning Toolkit) 改版變成 Nvidia TAO(Train, Adapt, and Optimize)


$ curl https://get.docker.com | sh \
  && sudo systemctl --now enable docker
$ sudo groupadd docker
$ sudo usermod -aG docker $USER
$ docker run hellow-world

$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
      && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
      && curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
            sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
            sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
$ sudo apt-get update
$ sudo apt-get install -y nvidia-docker2
$ sudo systemctl restart docker
$  sudo docker run --rm --gpus all nvidia/cuda:11.0.3-base-ubuntu20.04 nvidia-smi

$ wget -O ngccli_linux.zip https://ngc.nvidia.com/downloads/ngccli_linux.zip && unzip -o ngccli_linux.zip && chmod u+x ngc
$ md5sum -c ngc.md5
$ echo "export PATH=\"\$PATH:$(pwd)\"" >> ~/.bash_profile && source ~/.bash_profile
$ ngc config set
$ docker login nvcr.io
Username: $oauthtoken
Password: YOUR_NGC_API_KEY
$ ngc registry model list
$ ngc registry image list

$ pip3 install virtualenv virtualenvwrapper
$ mkdir $HOME/.virtualenvs
$ vi ~/.bashrc
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source /home/mark/.local/bin/virtualenvwrapper.sh
$ source ~/.bashrc

$ mkvirtualenv tao -p /usr/bin/python3
$ deactivate
$ workon tao

$ pip3 install nvidia-pyindex
$ pip3 install nvidia-tao
$ pip3 install jupyter
$ tao info

$ cd Data/tao/
# 下載 使用 WGET
$ wget --content-disposition https://api.ngc.nvidia.com/v2/resources/nvidia/tao/cv_samples/versions/v1.3.0/zip -O cv_samples_v1.3.0.zip
$ unzip -u cv_samples_v1.3.0.zip  -d ./cv_samples_v1.3.0 && rm -rf cv_samples_v1.3.0.zip && cd ./cv_samples_v1.3.0
# 下載 使用 CLI
$ ngc registry resource download-version "nvidia/tao/cv_samples:v1.3.0"
$ cd ./cv_samples_v1.3.0
# 啟動 jupyter
$ jupyter notebook --ip 0.0.0.0 --port 8888 --allow-root
# 開啟網頁 http://0.0.0.0:8888/tree

以 http://0.0.0.0:8888/notebooks/detectnet_v2/detectnet_v2.ipynb 為例
並參考 TAO 命令及參數文件 Object Detection/DetectNet_v2
修改
os.environ["LOCAL_PROJECT_DIR"] = FIXME
os.environ["LOCAL_PROJECT_DIR"] = "your_host_path_to/cv_samples_vv1.3.0"

會自動產生 ~/.tao_mounts.json

安裝 TAO launcher
!pip3 install nvidia-pyindex
!pip3 install nvidia-tao

下載 kitti object detection 資料集
到 http://www.cvlibs.net/datasets/kitti/eval_object.php?obj_benchmark=2d 網站
申請帳號,並下載
Download left color images of object data set (12 GB) 左眼看到的景
Download training labels of object data set (5 MB)

產生 Tfrecords
下載並安裝 NGC CLI
使用 ngc 下載 pretrained_detectnet_v2:resnet18
train evaluate prune (re)train evaluate inference 
export 產生 resnet18_detector.etlt

Int8 Optimization (效果不好,請改用 QAT)
 calibration_tensorfile 產生 calibration.tensor
 export 產生 calibration.bin resnet18_detector.etlt resnet18_detector.trt.int8(可用於 inference)
 converter 產生 resnet18_detector.trt(可用於 inference)
 inference (效果不好,請改用 QAT)

QAT 需要重新 train
  train evaluate export evaluate inference
 
列出 tao task
$ tao list
刪除 tao task
$ tao stop --container_id 40e28a67c2

inference config file
inferencer_config {
  tensorrt_config {
    etlt_model: "/workspace/tao-experiments/detectnet_v2/experiment_dir_final/resnet18_detector.etlt"
    save_engine: true
    trt_engine: "/workspace/tao-experiments/detectnet_v2/experiment_dir_final/resnet18_detector.trt"
    calibrator_config {
      calibration_cache: "/workspace/tao-experiments/detectnet_v2/experiment_dir_final/calibration.bin"
    }
  }
}
若是 trt_engine 檔案尚未產生,會由 etlt_model 產生 trt_engine
若是已經有 trt_engine,直接使用

2021年6月17日 星期四

LPD LPR on DeepStream

參考
https://developer.nvidia.com/blog/creating-a-real-time-license-plate-detection-and-recognition-app
https://github.com/NVIDIA-AI-IOT/deepstream_lpr_app
https://blogs.nvidia.com.tw/2021/05/12/creating-a-real-time-license-plate-detection-and-recognition-app/

依據 CUDA cuDNN TensorRT 的版本,下載 tlt-converter
https://developer.nvidia.com/tlt-get-started


完整程序
~/Data/DeepStream$ mkdir deepstream_lpr_app
~/Data/DeepStream$ cd deepstream_lpr_app/
~/Data/DeepStream/deepstream_lpr_app$ git clone https://github.com/NVIDIA-AI-IOT/deepstream_lpr_app.git
~/Data/DeepStream/deepstream_lpr_app$ cd deepstream_lpr_app/
~/Data/DeepStream/deepstream_lpr_app/deepstream_lpr_app$ ./download_us.sh
~/Data/DeepStream/deepstream_lpr_app/deepstream_lpr_app$ ../../tlt-converter/cuda11.0_cudnn8.0_trt7.2/tlt-converter -k nvidia_tlt -p image_input,1x3x48x96,4x3x48x96,16x3x48x96 models/LP/LPR/us_lprnet_baseline18_deployable.etlt -t fp16 -e models/LP/LPR/lpr_us_onnx_b16.engine
~/Data/DeepStream/deepstream_lpr_app/deepstream_lpr_app$ make
~/Data/DeepStream/deepstream_lpr_app/deepstream_lpr_app$ cd deepstream-lpr-app/
~/Data/DeepStream/deepstream_lpr_app/deepstream_lpr_app/deepstream-lpr-app$ cp dict_us.txt dict.txt
~/Data/DeepStream/deepstream_lpr_app/deepstream_lpr_app/deepstream-lpr-app$ ./deepstream-lpr-app 1 2 0 /opt/nvidia/deepstream/deepstream-5.1/samples/streams/sample_720p.mp4 output.264
以上可以執行,並在第一次執行時產生 engine
也可以利用下列命令 tlt-converter 產生 engine
~/Data/DeepStream/deepstream_lpr_app/deepstream_lpr_app/deepstream-lpr-app$ cd ../models/tlt_pretrained_models/trafficcamnet/
~/Data/DeepStream/deepstream_lpr_app/deepstream_lpr_app/models/tlt_pretrained_models/trafficcamnet$ mv trafficnet_int8.txt trafficnet_int8.bin
~/Data/DeepStream/deepstream_lpr_app/deepstream_lpr_app/models/tlt_pretrained_models/trafficcamnet$ ../../../../../tlt-converter/cuda11.0_cudnn8.0_trt7.2/tlt-converter -k tlt_encode -o output_bbox/BiasAdd,output_cov/Sigmoid -d 3,544,960 -t int8 -c trafficnet_int8.bin -e resnet18_trafficcamnet_pruned.etlt_b1_gpu0_int8.engine resnet18_trafficcamnet_pruned.etlt
~/Data/DeepStream/deepstream_lpr_app/deepstream_lpr_app/models/tlt_pretrained_models/trafficcamnet$ cd ../../LP/LPD/
~/Data/DeepStream/deepstream_lpr_app/deepstream_lpr_app/models/LP/LPD$ ../../../../../tlt-converter/cuda11.0_cudnn8.0_trt7.2/tlt-converter -k nvidia_tlt -o output_bbox/BiasAdd,output_cov/Sigmoid -d 3,480,640 -t int8 -c usa_lpd_cal.bin -e usa_pruned.etlt_b16_gpu0_int8.engine usa_pruned.etlt
~/Data/DeepStream/deepstream_lpr_app/deepstream_lpr_app/models/LP/LPD$ cd ../../../deepstream-lpr-app/
~/Data/DeepStream/deepstream_lpr_app/deepstream_lpr_app/deepstream-lpr-app$ vi lpd_us_config.txt

不顯示
~/Data/DeepStream/deepstream_lpr_app/deepstream_lpr_app/deepstream-lpr-app$ ./deepstream-lpr-app 1 2 0 /opt/nvidia/deepstream/deepstream-5.1/samples/streams/sample_720p.mp4 output.264
有顯示
~/Data/DeepStream/deepstream_lpr_app/deepstream_lpr_app/deepstream-lpr-app$ ./deepstream-lpr-app 1 3 0 /opt/nvidia/deepstream/deepstream-5.1/samples/streams/sample_720p.mp4 output.264


重新訓練模型
使用 tlt-launcher
python3 -m venv --system-site-packages tlt
source ~/envs/tlt/bin/activate
(tlt) $ pip3 install nvidia-pyindex
(tlt) $ pip3 install nvidia-tlt
(tlt) $ cat ~/.tlt_mounts.json
{
    "Mounts": [
        {
            "source": "/home/username/Data/DeepStream/deepstream_lpr_app/tlt-lpdr/tlt-experiments",
            "destination": "/workspace/tlt-experiments"
        },
        {
            "source": "/home/username/Data/DeepStream/deepstream_lpr_app/tlt-lpdr/openalpr",
            "destination": "/workspace/openalpr"
        }

    ]
}
(tlt) ~/Data/DeepStream/deepstream_lpr_app/tlt-lpdr$ git clone https://github.com/openalpr/benchmarks benchmarks
(tlt) ~/Data/DeepStream/deepstream_lpr_app/tlt-lpdr$ mkdir tlt-experiments
(tlt) ~/Data/DeepStream/deepstream_lpr_app/tlt-lpdr$ mkdir openalpr
重新訓練 LPD 模型
(tlt) ~/Data/DeepStream/deepstream_lpr_app/tlt-lpdr$ cd openalpr/
下載 https://github.com/NVIDIA-AI-IOT/deepstream_tlt_apps/blob/release/tlt3.0/misc/dev_blog/LPDR/lpd/lpd_prepare_data.py
(tlt) ~/Data/DeepStream/deepstream_lpr_app/tlt-lpdr/openalpr$ python3 lpd_prepare_data.py --input_dir ../benchmarks/endtoend/us --output_dir lpd --target_width 640 --target_height 480
下載 https://github.com/NVIDIA-AI-IOT/deepstream_tlt_apps/blob/release/tlt3.0/misc/dev_blog/LPDR/lpd/SPECS_tfrecord.txt
(tlt) ~/Data/DeepStream/deepstream_lpr_app/tlt-lpdr/openalpr$ tlt detectnet_v2 dataset_convert -d /workspace/openalpr/SPECS_tfrecord.txt -o /workspace/openalpr/lpd_tfrecord/lpd
下載 https://github.com/NVIDIA-AI-IOT/deepstream_tlt_apps/blob/release/tlt3.0/misc/dev_blog/LPDR/lpd/SPECS_train.txt
下載預先訓練模型 (tlt) ~/Data/DeepStream/deepstream_lpr_app/tlt-lpdr/openalpr$ ngc registry model download-version "nvidia/tlt_lpdnet:unpruned_v1.0"
(tlt) ~/Data/DeepStream/deepstream_lpr_app/tlt-lpdr/openalpr$ mv tlt_lpdnet_vunpruned_v1.0/usa_unpruned.tlt .
訓練
(tlt) ~/Data/DeepStream/deepstream_lpr_app/tlt-lpdr/openalpr$ tlt detectnet_v2 train -e /workspace/openalpr/SPECS_train.txt -r /workspace/openalpr/exp_unpruned -k nvidia_tlt
修剪
(tlt) ~/Data/DeepStream/deepstream_lpr_app/tlt-lpdr/openalpr$ tlt detectnet_v2 prune -m /workspace/openalpr/exp_unpruned/weights/model.tlt -o /workspace/openalpr/exp_pruned/model_pruned_06.tlt -pth 0.6 -k nvidia_tlt
(tlt) ~/Data/DeepStream/deepstream_lpr_app/tlt-lpdr/openalpr$ cp SPECS_train.txt SPECS_retrain.txt
修改 pretrained_model_file: "/workspace/openalpr/exp_pruned/model_pruned_06.tlt"
再次訓練
(tlt) ~/Data/DeepStream/deepstream_lpr_app/tlt-lpdr/openalpr$ tlt detectnet_v2 train -e /workspace/openalpr/SPECS_retrain.txt -r /workspace/openalpr/exp_pruned -k nvidia_tlt
匯出
(tlt) ~/Data/DeepStream/deepstream_lpr_app/tlt-lpdr/openalpr$ tlt detectnet_v2 export -m /workspace/openalpr/exp_unpruned/weights/model.tlt -o /workspace/openalpr/export/unpruned_model.etlt --cal_cache_file /workspace/openalpr/export/unpruned_calibration.bin -e /workspace/openalpr/SPECS_train.txt -k nvidia_tlt --cal_image_dir /workspace/openalpr/lpd/data/image --data_type int8 --batch_size 4 --batches 10 --engine_file /workspace/openalpr/export/unpruned_int8.trt
(tlt) ~/Data/DeepStream/deepstream_lpr_app/tlt-lpdr/openalpr$ tlt detectnet_v2 export -m /workspace/openalpr/exp_pruned/weights/model.tlt -o /workspace/openalpr/export/pruned_model.etlt --cal_cache_file /workspace/openalpr/export/pruned_calibration.bin -e /workspace/openalpr/SPECS_train.txt -k nvidia_tlt --cal_image_dir /workspace/openalpr/lpd/data/image --data_type int8 --batch_size 4 --batches 10 --engine_file /workspace/openalpr/export/pruned_int8.trt
評估
(tlt) ~/Data/DeepStream/deepstream_lpr_app/tlt-lpdr/openalpr$ tlt detectnet_v2 evaluate -m /workspace/openalpr/exp_unpruned/weights/model.tlt -k nvidia_tlt -e /workspace/openalpr/SPECS_train.txt
(tlt) mark@z390:~/Data/DeepStream/deepstream_lpr_app/tlt-lpdr/openalpr$ tlt detectnet_v2 evaluate -m /workspace/openalpr/exp_pruned/weights/model.tlt -k nvidia_tlt -e /workspace/openalpr/SPECS_train.txt
重新訓練 LPR 模型
(tlt) ~/Data/DeepStream/deepstream_lpr_app/tlt-lpdr/tlt-experiments$ mkdir lprnet
(tlt) ~/Data/DeepStream/deepstream_lpr_app/tlt-lpdr/tlt-experiments$ cd lprnet/
下載 https://github.com/NVIDIA-AI-IOT/deepstream_tlt_apps/blob/release/tlt3.0/misc/dev_blog/LPDR/lpr/preprocess_openalpr_benchmark.py
(tlt) ~/Data/DeepStream/deepstream_lpr_app/tlt-lpdr/tlt-experiments/lprnet$ python3 preprocess_openalpr_benchmark.py --input_dir=../../benchmarks/endtoend/us --output_dir=../data/openalpr
下載 https://github.com/NVIDIA-AI-IOT/deepstream_tlt_apps/blob/release/tlt3.0/misc/dev_blog/LPDR/lpr/tutorial_spec.txt
修改 tutorial_spec.txt
augmentation_config {
    output_width: 96
    output_height: 48
    output_channel: 3
    keep_original_prob: 0.3
    transform_prob: 0.5
    rotate_degree: 5
}
成為
augmentation_config {
    output_width: 96
    output_height: 48
    output_channel: 3
    keep_original_prob: 0.3
    max_rotate_degree: 5
    rotate_prob: 0.5
    blur_prob: 0.5
}

下載預先訓練模型
(tlt) ~/Data/DeepStream/deepstream_lpr_app/tlt-lpdr/tlt-experiments/lprnet$ ngc registry model download-version "nvidia/tlt_lprnet:trainable_v1.0"
(tlt) ~/Data/DeepStream/deepstream_lpr_app/tlt-lpdr/tlt-experiments/lprnet$ cp tlt_lprnet_vtrainable_v1.0/us_lprnet_baseline18_trainable.tlt .
(tlt) ~/Data/DeepStream/deepstream_lpr_app/tlt-lpdr/tlt-experiments/lprnet$ mkdir specs
(tlt) ~/Data/DeepStream/deepstream_lpr_app/tlt-lpdr/tlt-experiments/lprnet$ cp tlt_lprnet_vtrainable_v1.0/us_lp_characters.txt specs/
訓練模型
(tlt) ~/Data/DeepStream/deepstream_lpr_app/tlt-lpdr/tlt-experiments/lprnet$ tlt lprnet train -e /workspace/tlt-experiments/lprnet/tutorial_spec.txt -r /workspace/tlt-experiments/lprnet/ -k nvidia_tlt -m /workspace/tlt-experiments/lprnet/us_lprnet_baseline18_trainable.tlt --use_amp
匯出模型
(tlt) ~/Data/DeepStream/deepstream_lpr_app/tlt-lpdr/tlt-experiments/lprnet$ tlt lprnet export -m /workspace/tlt-experiments/lprnet/weights/lprnet_epoch-24.tlt -k nvidia_tlt -e /workspace/tlt-experiments/lprnet/tutorial_spec.txt
(tlt) ~/Data/DeepStream/deepstream_lpr_app/tlt-lpdr/tlt-experiments/lprnet$ ls weights/lprnet_epoch-24.etlt
評估
(tlt) ~/Data/DeepStream/deepstream_lpr_app/tlt-lpdr/tlt-experiments/lprnet$ tlt lprnet evaluate -m /workspace/tlt-experiments/lprnet/weights/lprnet_epoch-24.tlt -k nvidia_tlt -e /workspace/tlt-experiments/lprnet/tutorial_spec.txt

2020年12月9日 星期三

TLT+DeepStream on ICDAR-2013

到 ICDAR-2013 的網站下載圖片和標註
ICDAR-2013 在 Robust Reading Competition 網站
要下載前要註冊
選 Challenges/Focused Scene Text
2013 的文字比較正,標註只有兩點
2015 的文字有各種角度,標註有四點

產生 kitti 資料時,直接使用訓練效果不好
轉換圖形時採用不同策略,一圖拆成多圖
截圖時不要破壞文字

TLT 有測試過 detectnet_v2 (resnet18, resnet50, darknet19), object_detection yolov3 (darknet19)
detectnet_v2 之 resnet18 precision: 14.6133 %
雖然 precision 不高,但是 tlt-infer 可以正確抓到文字
detectnet_v2 之 darknet19 precision: 18.7146 %
但 detectnet_v2 之 darknet19 失敗,tlt-infer 可以無法正確抓到文字
yolov3 之 darknet19 AP: 0.769
效果比 detectnet_v2 好

最看重 TLT 的功能是 tlt-prune, 神經網路被裁剪後
節省記憶體,加快速度
unprune Mem:2.5G   PREF:8.33
0.5        Mem:2.1G    PREF:28.83
0.7        Mem:2.1G    PREF:30.00

DeepStream 之 nvinfer 的 config-file-path 設定檔
tlt-encoded-model=yolo_darknet19_pruned_70.etlt
model-engine-file=yolo_darknet19_pruned_70.engine
第一次啟動會很慢,因為在產生 yolo_darknet19_pruned_70.etlt_b1_gpu0_fp16.engine 檔
$ mv yolo_darknet19_pruned_70.etlt_b1_gpu0_fp16.engine yolo_darknet19_pruned_70.engine
之後會直接使用 yolo_darknet19_pruned_70.engine

以下是測試歷程記錄

2020年11月19日 星期四

Nvidia TLT 分析

DetectPostprocessor::parseBoundingBox
networkInfo 640x368

outputCoverageLayerIndex
outputCoverageBuffer [4 40 23] 4 個 class 的 confidence

outputBBoxLayerIndex
outputBboxBuffer [16 40 23] numClasses*4, x1, y1, x2, y2

targetShape [40 23]
gridSize 40*23
strideX 16
strideY 16
gcCenters0 [40] (0.5 16.5 32.5...624.5)/35
gcCenters1 [23] (0.5 16.5 32.5...352.5)/35
numClasses 4

ClassifyPostprocessor::parseAttributesFromSoftmaxLayers
m_OutputLayerInfo[1]
m_OutputLayerInfo[1].inferDims[12 1 1] 12 個 class 的 probability
numClasses=12


參考 BBox Ground Truth Generator
cov: Batch_size, Num_classes, image_height/16, image_width/16
bbox: Batch_size, Num_classes * 4, image_height/16, image_width/16 (where 4 is the number of coordinates per cell)


2020年10月22日 星期四

戴口罩辨識

參考 face_mask_detection
參考 Nvidia TLT(Transfer Learning Toolkit) 轉移學習工具 安裝所需工具

參考資料集
  戴口罩
  無口罩
下載後依據目錄格式擺放

$ docker run --name face-mask --runtime=nvidia --gpus all -it -v /home/user/Data/DeepStreamer/tlt-experiments/:/workspace/tlt-experiments -p 8888:8888 nvcr.io/nvidia/tlt-streamanalytics:v2.0_py3 /bin/bash
root@0aa10155a3bd:/workspace/tlt-experiments# exit
exit
$ docker ps
CONTAINER ID        IMAGE                                         COMMAND                  CREATED             STATUS              PORTS                    NAMES
0aa10155a3bd        nvcr.io/nvidia/tlt-streamanalytics:v2.0_py3   "install_ngc_cli.sh …"   8 minutes ago       Up 6 minutes        0.0.0.0:8888->8888/tcp   face-mask
$ docker exec -it face-mask /bin/bash
# cd tlt-experiments/face-mask-detection
# python -m pip install -r requirements.txt
修改 face-mask-detection/tlt_specs/detectnet_v2_tfrecords_kitti_trainval.txt
root_directory_path: "/workspace/tlt-experiments/face-mask-detection-data/kitti/train"
修改 face-mask-detection/tlt_specs/detectnet_v2_train_resnet18_kitti.txt
tfrecords_path: "/workspace/tlt-experiments/face-mask-detection-data/kitti/tfrecords/kitti_trainval/*"
image_directory_path: "/workspace/tlt-experiments/face-mask-detection-data/kitti/train"
pretrained_model_file: "/workspace/tlt-experiments/detectnet_v2/pretrained_resnet18/tlt_pretrained_detectnet_v2_vresnet18/resnet18.hdf5"
修改 face-mask-detection/tlt_specs/detectnet_v2_retrain_resnet18_kitti.txt
tfrecords_path: "/workspace/tlt-experiments/face-mask-detection-data/kitti/tfrecords/kitti_trainval/*"
mage_directory_path: "/workspace/tlt-experiments/face-mask-detection-data/kitti/train"
pretrained_model_file: "/workspace/tlt-experiments/face-mask-detection-data/detectnet_v2/experiment_dir_pruned/resnet18_nopool_bn_detectnet_v2_pruned.tlt"
修改 face-mask-detection/tlt_specs/detectnet_v2_inference_kitti_tlt.txt
model: "/workspace/tlt-experiments/detectnet_v2/experiment_dir_retrain/weights/resnet18_detector_pruned.tlt"
修改 face-mask-detection/tlt_specs/detectnet_v2_inference_kitti_etlt.txt
trt_engine: "/workspace/tlt-experiments/detectnet_v2/experiment_dir_final_unpruned/resnet18_detector.trt"

產生 kitti 格式的標註
# vi data2kitti.sh
/usr/bin/python data2kitti.py --kaggle-dataset-path '/workspace/tlt-experiments/face-mask-detection-data/Kaggle Medical Mask Dataset/medical-masks-dataset' --mafa-dataset-path '/workspace/tlt-experiments/face-mask-detection-data/MAFA Dataset' --fddb-dataset-path '/workspace/tlt-experiments/face-mask-detection-data/FDDB Dataset' --widerface-dataset-path '/workspace/tlt-experiments/face-mask-detection-data/Wider Face Dataset' --kitti-base-path '/workspace/tlt-experiments/face-mask-detection-data/kitti' --train
/usr/bin/python data2kitti.py --kaggle-dataset-path '/workspace/tlt-experiments/face-mask-detection-data/Kaggle Medical Mask Dataset/medical-masks-dataset' --mafa-dataset-path '/workspace/tlt-experiments/face-mask-detection-data/MAFA Dataset' --fddb-dataset-path '/workspace/tlt-experiments/face-mask-detection-data/FDDB Dataset' --widerface-dataset-path '/workspace/tlt-experiments/face-mask-detection-data/Wider Face Dataset' --kitti-base-path '/workspace/tlt-experiments/face-mask-detection-data/kitti' --val
# ./data2kitti.sh
# jupyter notebook --ip 0.0.0.0 --allow-root
    To access the notebook, open this file in a browser:
        file:///root/.local/share/jupyter/runtime/nbserver-241-open.html
    Or copy and paste one of these URLs:
        http://0aa10155a3bd:8888/?token=29cbb63890972635e00320fe6c66bda30b2c81daa7400f3d
     or http://127.0.0.1:8888/?token=29cbb63890972635e00320fe6c66bda30b2c81daa7400f3d
用瀏覽器開啟 http://127.0.0.1:8888/?token=29cbb63890972635e00320fe6c66bda30b2c81daa7400f3d
進入 http://192.168.0.101:8888/notebooks/face-mask-detection.ipynb
修改下列環境變數到正確目錄
# Setting up env variables for cleaner command line commands.
%env KEY=tlt_encode
# User directory
%env USER_EXPERIMENT_DIR=/workspace/tlt-experiments/detectnet_v2
# Download directory
%env DATA_DOWNLOAD_DIR=/workspace/tlt-experiments/face-mask-detection-data/kitti
%env SPECS_DIR=/workspace/tlt-experiments/face-mask-detection/tlt_specs

產生 tfrecords
!tlt-dataset-convert -d $SPECS_DIR/detectnet_v2_tfrecords_kitti_trainval.txt \
                     -o $DATA_DOWNLOAD_DIR/tfrecords/kitti_trainval/kitti_trainval

查詢 tlt_pretrained_detectnet_v2
!ngc registry model list nvidia/tlt_pretrained_detectnet_v2:*
!mkdir -p $USER_EXPERIMENT_DIR/pretrained_resnet18/
下載 tlt_pretrained_detectnet_v2
!ngc registry model download-version nvidia/tlt_pretrained_detectnet_v2:resnet18 \
    --dest $USER_EXPERIMENT_DIR/pretrained_resnet18

訓練開始
!tlt-train detectnet_v2 -e $SPECS_DIR/detectnet_v2_train_resnet18_kitti.txt \
                        -r $USER_EXPERIMENT_DIR/experiment_dir_unpruned \
                        -k $KEY \
                        -n resnet18_detector

測試訓練結果
!tlt-evaluate detectnet_v2 -e $SPECS_DIR/detectnet_v2_train_resnet18_kitti.txt\
                           -m $USER_EXPERIMENT_DIR/experiment_dir_unpruned/weights/resnet18_detector.tlt \
                           -k $KEY

修剪模型, -ph (threshold), 越大產生的模型越小,推論速度越快,但會不準
!mkdir -p $USER_EXPERIMENT_DIR/experiment_dir_pruned
!tlt-prune -m $USER_EXPERIMENT_DIR/experiment_dir_unpruned/weights/resnet18_detector.tlt \
           -o $USER_EXPERIMENT_DIR/experiment_dir_pruned/resnet18_nopool_bn_detectnet_v2_pruned.tlt \
           -eq union \
           -pth 0.7 \
           -k $KEY

再次訓練修剪過的模型
!tlt-train detectnet_v2 -e $SPECS_DIR/detectnet_v2_retrain_resnet18_kitti.txt \
                        -r $USER_EXPERIMENT_DIR/experiment_dir_retrain \
                        -k $KEY \
                        -n resnet18_detector_pruned

測試再次訓練的模型
!tlt-evaluate detectnet_v2 -e $SPECS_DIR/detectnet_v2_retrain_resnet18_kitti.txt \
                           -m $USER_EXPERIMENT_DIR/experiment_dir_retrain/weights/resnet18_detector_pruned.tlt \
                           -k $KEY

利用模型推論測試的圖形
!tlt-infer detectnet_v2 -e $SPECS_DIR/detectnet_v2_inference_kitti_tlt.txt \
                        -o $USER_EXPERIMENT_DIR/tlt_infer_testing \
                        -i $DATA_DOWNLOAD_DIR/test/images \
                        -k $KEY

輸出可被 DeepStream 使用的模型
!mkdir -p $USER_EXPERIMENT_DIR/experiment_dir_final
# Removing a pre-existing copy of the etlt if there has been any.
import os
output_file=os.path.join(os.environ['USER_EXPERIMENT_DIR'],
                         "experiment_dir_final/resnet18_detector_thermal.etlt")
if os.path.exists(output_file):
    os.system("rm {}".format(output_file))
!tlt-export detectnet_v2 \
            -m $USER_EXPERIMENT_DIR/experiment_dir_retrain/weights/resnet18_detector_pruned.tlt \
            -o $USER_EXPERIMENT_DIR/experiment_dir_final/resnet18_detector_thermal.etlt \
            -k $KEY

修改 ds_configs/config_infer_primary_masknet_gpu.txt
tlt-encoded-model=/home/nano/Data/DeepStream/face-mask-detection/experiment_dir_final/resnet18_detector_thermal.etlt
# 不要用 model-engine-file
input-dims=3;480;640;0

修改 ds_configs/deepstream_app_source1_camera_masknet_gpu.txt
width=640
height=480

完成
$ deepstream-app -c deepstream_app_source1_camera_masknet_gpu.txt


2020年10月20日 星期二

Nvidia TLT(Transfer Learning Toolkit) 轉移學習工具


Transfer Learning 除了可以減少訓練時間,也可減少訓練所需的資料和標註
TLT 使用 docker 技術,可參考 Docker 安裝和使用
TLT 預先訓練一些模型,透過 NGC 下載,參考 NVIDIA GPU Cloud (NGC)
TLT 可以使用 docker 下的 Jupyter notebooks
TLT 產出的模型 .etlt 格式,可以在 DeepStream 和 TensorRT 下使用
Pruning 修剪模型中較不重要的 nodes, 減少記憶體的使用,加快推理
Augmenting Dataset 增強資料集,顏色變換,模糊,旋轉,縮放,翻轉,裁剪

TrafficCamNet 和 DashCamNet 都用於交通
TrafficCamNet 用於固定點,DashCamNet 用於移動的車上

PeopleNet 偵測 人,包包,臉
FaceDetectIR 專注於人臉

Transfer Learning Toolkit
下載預先訓練的模型
準備訓練和測試資料集
訓練模型
測試模型
(Prune)修剪模型
輸出模型

安裝步驟
確認 NVIDIA GPU driver 版本,v410.xx 以上,可使用
$ nvidia-smi
安裝 NVIDIA Docker 參考 nvidia-docker 和 Installing Docker CE on Ubuntu
$ curl https://get.docker.com | sh
開機自動執行 docker service
$ sudo systemctl start docker && sudo systemctl enable docker
新增 apt-key
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
$ sudo apt-get update
$ sudo apt-get install -y nvidia-docker2
$ sudo systemctl restart docker
測試是否安裝完成
$ sudo docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi
參考 NVIDIA GPU Cloud (NGC),取得 API Key
$ docker login nvcr.io
Username: $oauthtoken
Password: YOUR_NGC_API_KEY
目前 TLT version 為 v2.0_py3
下載 TLT
$ docker pull nvcr.io/nvidia/tlt-streamanalytics:<version>
執行 TLT
$ docker run --runtime=nvidia -it nvcr.io/nvidia/tlt-streamanalytics:<version> /bin/bash
利用目錄對映,存取本地資料
$ docker run --runtime=nvidia -it -v /home/<username>/tlt-experiments:/workspace/tlt-experiments nvcr.io/nvidia/tlt-streamanalytics:<version> /bin/bash
使用網路 port 對映
$ docker run --runtime=nvidia -it -v /home/<username>/tlt-experiments:/workspace/tlt-experiments -p 8888:8888 nvcr.io/nvidia/tlt-streamanalytics:<version>
執行 jupyter notebook
$ cd examples/
$ jupyter notebook --ip 0.0.0.0 --allow-root

設定 NGC API Key
$ ngc config set
顯示 NGC 上的模組列表
$ ngc registry model list <model_glob_string>
例如:
$ ngc registry model list nvidia/tlt_pretrained_*
顯示 tlt_pretrained_detectnet_v2 的各種版本
$ ngc registry model list nvidia/tlt_pretrained_detectnet_v2:*
下載模組
$ ngc registry model download-version <ORG/model_name:version> -dest <path_to_download_dir>
例如:
$ ngc registry model download-version nvidia/tlt_pretrained_classification:resnet18 --dest $USER_EXPERIMENT_DIR/pretrained_resnet18

Object Detection 物件偵測,label 檔使用 KITTI 格式
但只使用了 Class names 和 Bounding box



2020年10月19日 星期一

NVIDIA GPU Cloud (NGC)

參考 NVIDIA GPU CLOUD DOCUMENT

註冊, 啟動你的 NGC 帳號
1. 開啟網址 NGC Catalog landing page, 從右上角 Welcome Guest, 選擇 Create an Account
2. 輸入名字,郵件地址,同意使用條款,按下 Sign Up,收取信件,依據指示設定帳號
3. 依據郵件,開啟設定密碼網頁
4. 依據指示設定密碼,每次可由 https://ngc.nvidia.com/signin/email 網頁輸入郵件地址和密碼登入
5. 同意使用條款

產生 NGC API Key
1. 登入 https://ngc.nvidia.com/signin/email
2. 從右上角的 使用者帳號, 選擇 Setup
3. 按下 Get API Key
4. 按下 Confirm 產生密鑰
密鑰產生一遍即可,新產生的密鑰,會使舊的失效

安裝 NGC Registry CLI(command-line interfaces)
1. 登入 NGC website
2. 從右上角的 使用者帳號, 選擇 Setup,
3. 按下 Install NGC CLI 的 Downloads
4. 選擇安裝平台,依據命令安裝, 如下
AMD64 Linux
下載
$ wget -O ngccli_cat_linux.zip https://ngc.nvidia.com/downloads/ngccli_cat_linux.zip && unzip -o ngccli_cat_linux.zip && chmod u+x ngc
檢查下載檔案
$ md5sum -c ngc.md5
加入命令到環境變數 PATH
$ echo "export PATH=\"\$PATH:$(pwd)\"" >> ~/.bash_profile && source ~/.bash_profile
設定 API Key
$ ngc config set

ngc 命令說明
顯示版本
$ ngc --version
顯示可用選項
$ ngc -h
顯示 registry image 的選項
$ ngc registry image -h
顯示 registry image info 的選項
$ ngc registry image info -h