Jetson Xavier AGXでYOLOXを動かす　ちょっとだけベンチマーク

# はじめに
Yolov4を使って野鳥の検出をしていたのですが、Yoloxがどんなものかと試したくなって動かすことにしました。
動かそうとしたらpythonのバージョンかえるところから始まってたので、せっかくならばと、Jetpack5.02に入れ替えてDocker上でGPU使ってYOLOXを動かしました。

# やったこと
Jetson Xavier AGX上のDockerでGPUがイネーブルの状態でYOLOXを動かしました

# 前提
Jetpack5.02
XavierAGX　たぶん　XavierNXでも行ける
l4t-pytorch:r35.1.0-pth1.13-py3　をベースにして使う

# いじったところ
onnx関連でエラーが出まくるのと、もともとのコンテナにtorchvision, opencv, pytorchが入っていてバッティングしてエラーが出まくるのでこれらを全部放置して動かしてます。

# Dockerfile
```Dockerfile
FROM nvcr.io/nvidia/l4t-pytorch:r35.1.0-pth1.13-py3
RUN apt update
RUN apt install sudo
RUN apt-get install -y zip
RUN apt-get install -y build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
RUN apt-get install -y libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev
RUN apt-get install -y libv4l-dev v4l-utils qv4l2
RUN apt-get install -y curl
RUN apt-get install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
RUN python3 -m pip install -U pip
RUN python3 -m pip install loguru tqdm thop ninja tabulate
RUN python3 -m pip install pycocotools
RUN cd /root && git clone https://github.com/Megvii-BaseDetection/YOLOX.git
RUN cd /root/YOLOX && \
    sed -i '/torchvision/d' requirements.txt && \
    sed -i '/numpy/d' requirements.txt && \
    sed -i '/torch/d' requirements.txt && \
    sed -i '/opencv/d' requirements.txt && \
    sed -i '/pycocotools/d' requirements.txt && \
    sed -i '/onnx/d' requirements.txt && \
    sed -i '/onnx/d' requirements.txt && \
    sed -i '/onnx/d' requirements.txt
RUN cd /root/YOLOX && python3 -m pip install -v -e .
RUN cd /root/YOLOX && wget https://github.com/Megvii-BaseDetection/YOLOX/releases/download/0.1.1rc0/yolox_s.pth
```
コマンド並べただけですが、とりあえず動くはず
余計なv4l2がらみがいっぱい入ってますが、これは個人的に必要なためです。カメラを遠隔で使う都合があるので。

# 実行
docker build -t yolox:100 .
とかしてBUILDして
sudo docker run -it --rm --net=host --runtime nvidia -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix yolox:100
とかしてコンテナを実行
コンテナ上で
cd /root/YOLOX して
python3 tools/demo.py image -n yolox-s -c ./yolox_s.pth --path assets/dog.jpg --conf 0.25 --nms 0.45 --tsize 640 --save_result --device gpu
で実行
結果は、
```
2022-11-20 04:35:42.994 | INFO     | __main__:main:259 - Args: Namespace(camid=0, ckpt='./yolox_s.pth', conf=0.25, demo='image', device='gpu', exp_file=None, experiment_name='yolox_s', fp16=False, fuse=False, legacy=False, name='yolox-s', nms=0.45, path='assets/dog.jpg', save_result=True, trt=False, tsize=640)
2022-11-20 04:35:44.345 | INFO     | __main__:main:269 - Model Summary: Params: 8.97M, Gflops: 26.93
2022-11-20 04:35:47.383 | INFO     | __main__:main:282 - loading checkpoint
2022-11-20 04:35:47.811 | INFO     | __main__:main:286 - loaded checkpoint done.
2022-11-20 04:35:51.695 | INFO     | __main__:inference:165 - Infer time: 3.7249s
2022-11-20 04:35:51.701 | INFO     | __main__:image_demo:202 - Saving detection result in ./YOLOX_outputs/yolox_s/vis_res/2022_11_20_04_35_47/dog.jpg
```
とかでてきてJPGの形でセーブされます。

# おまけとちょっとだけベンチマーク
ビデオだったら
python3 tools/demo.py video -n yolox-s -c ./yolox_s.pth --path [VIDEOFILE] --conf 0.25 --nms 0.45 --tsize 640 --save_result --device gpu
とかやるとビデオのファイル、もしくは[VIDEOFILE] のとこに０とか指定するとリアルタイムに０番のカメラからデータをキャプチャして推論します。
ちなみにGPUをイネーブルにしてやるとこんな感じ
```
2022-11-20 04:49:44.112 | INFO     | __main__:inference:165 - Infer time: 0.0631s
2022-11-20 04:49:44.224 | INFO     | __main__:inference:165 - Infer time: 0.0597s
2022-11-20 04:49:44.340 | INFO     | __main__:inference:165 - Infer time: 0.0501s
2022-11-20 04:49:44.438 | INFO     | __main__:inference:165 - Infer time: 0.0455s
2022-11-20 04:49:44.532 | INFO     | __main__:inference:165 - Infer time: 0.0430s
2022-11-20 04:49:44.631 | INFO     | __main__:inference:165 - Infer time: 0.0436s
```
一方でCPUでやると同じファイルが
python3 tools/demo.py video -n yolox-s -c ./yolox_s.pth --path [VIDEOFILE] --conf 0.25 --nms 0.45 --tsize 640 --save_result --device cpu

```
2022-11-20 04:52:50.873 | INFO     | __main__:inference:165 - Infer time: 1.4069s
2022-11-20 04:52:52.088 | INFO     | __main__:inference:165 - Infer time: 1.1500s
2022-11-20 04:52:53.281 | INFO     | __main__:inference:165 - Infer time: 1.1185s
2022-11-20 04:52:54.350 | INFO     | __main__:inference:165 - Infer time: 0.9998s
2022-11-20 04:52:55.453 | INFO     | __main__:inference:165 - Infer time: 1.0002s

```
こんな感じ

参考
[Jetson(NX)でPyTorchとYOLOv5を動かす(Dockerを使用)](https://zenn.dev/phpmyadmin/articles/e607bee5702921)

[How to Run Object Detection YOLOX on PyTorch with Docker on NVIDIA® Jetson™ Modules?](https://www.forecr.io/blogs/ai-algorithms/how-to-run-object-detection-yolox-on-pytorch-with-docker-on-nvidia%C2%AE-jetson%E2%84%A2-modules)
こっちは、やりはじめたトリガで、結局ここからはなれちゃったんですが、これでGPU使えるんでしょうか。。。
末尾の数字はCPUでやったときの時間になってるとおもうんですが。。