YOLO-World Docker試行メモ

## 概要
YOLO-WorldをWSL2(ubuntu22)のDockerコンテナで動かしたときのメモを残しておく。
インストールするライブラリやDockerfileの記述はかなり適当なので、あとで直したい。
(2024/5/6時点)

## 参考サイト
https://github.com/AILab-CVC/YOLO-World

https://qiita.com/john-rocky/items/284cc692abe82ce6ceb4

## 手順

### YOLO-Worldのコード取得
```bash
git clone --recursive https://github.com/AILab-CVC/YOLO-World.git
cd YOLO-World
```

### モデル取得

- YOLO-Worldv2-S
    - https://huggingface.co/wondervictor/YOLO-World/blob/main/yolo_world_v2_s_obj365v1_goldg_pretrain-55b943ea.pth
- YOLO-Worldv2-XL
    - https://huggingface.co/wondervictor/YOLO-World/blob/main/yolo_world_v2_xl_obj365v1_goldg_cc3mlite_pretrain-5daf1395.pth

```bash shell
# 取得したモデルを格納
mkdir weights
```

### データ取得
- LVIS-minival
    - https://github.com/AILab-CVC/YOLO-World/blob/master/docs/data.md
- COCO val2017
    - https://cocodataset.org/#home
- annotation
    - https://huggingface.co/GLIPModel/GLIP/blob/main/lvis_v1_minival_inserted_image_name.json

取得したデータを格納
```bash
# annotation
mkdir -rp data/coco/Ivis
# val2017
mkdir -rp data/coco/val2017
```

### Dockerfileの作成
YOLO-Worldディレクトリ直下のDockerfileを更新
※頻発するエラーを解消させただけなので、中身はかなり適当
```Dockerfile
FROM nvidia/cuda:11.8.0-devel-ubuntu22.04

# ENV MODEL="yolo_world_l_dual_vlpan_l2norm_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py"
# ENV WEIGHT="yolo_world_l_clip_base_dual_vlpan_2e-3adamw_32xb16_100e_o365_goldg_train_pretrained-0e566235.pth"

ENV FORCE_CUDA="1"
ENV MMCV_WITH_OPS=1

RUN apt-get update && apt-get install -y --no-install-recommends \
python3-pip     \
libgl1-mesa-glx \
libsm6          \
libxext6        \
libxrender-dev  \
libglib2.0-0    \
git             \
python3-dev     \
curl            \
vim             \
less            \
wget            \
python3-wheel

RUN pip3 install --upgrade pip \
&& pip3 install   \
gradio        \
opencv-python \
supervision   \
mmengine      \
setuptools    \
openmim       \
transformers  \
&& pip3 install --no-cache-dir --extra-index-url https://download.pytorch.org/whl/cu118 \
wheel         \
torch==2.0.0  \
torchvision==0.15.1  \
torchaudio    \
&& pip3 install mmdet \
mmyolo        \
&& pip3 install git+https://github.com/lvis-dataset/lvis-api.git \
&& mim install mmcv==2.0.0

COPY . /yolo
WORKDIR /yolo

# RUN pip3 install -e .

# RUN curl -o weights/$WEIGHT -L https://huggingface.co/wondervictor/YOLO-World/resolve/main/$WEIGHT

# ENTRYPOINT [ "python3", "demo.py" ]
# CMD [configs/pretrain/${MODEL}, weights/${WEIGHT}]
```

### イメージビルド
```bash
# tag名を 0.1 とする場合
docker image build -f ./Dockerfile --tag yolo-world:0.1 .
```

### コンテナ起動
```bash
docker container run -it --gpus all -h "yolo" --rm -p 80:8080 -v /mnt/c/temp:/work_tmp --name "yolo" yolo-world:0.1 /bin/bash
  # -it : インタラクティブモード
  # --gpus <gpu指定> : 使用するgpuの指定 (番号を指定する例 : --gpus device=0,2)
  # -h <ホスト名> : コンテナ内のホスト名
  # --rm : 終了時にコンテナを自動で削除
  # -p <ホスト側port>:<コンテナ側port> : ポートマッピング
  # -v <ホスト側dir>:<コンテナ側dir> : ディレクトリマウント
  # --name <コンテナ名> : コンテナ名
  # 末尾から2つ目の引数 : イメージ名:タグ名
  # 末尾 : 起動時コマンド  
```

### 実行例(image_demo.py)
```bash
# YOLO-Worldv2-S
PYTHONPATH=./ python3 demo/image_demo.py configs/pretrain/yolo_world_v2_s_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py weights/yolo_world_v2_s_obj365v1_goldg_pretrain-55b943ea.pth data/lvis_val2017/val2017/ 'person,dog,cat' --topk 100 --threshold 0.25 --output-dir out

# YOLO-Worldv2-XL
PYTHONPATH=./ python3 demo/image_demo.py configs/pretrain/yolo_world_v2_xl_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py weights/yolo_world_v2_xl_obj365v1_goldg_cc3mlite_pretrain-5daf1395.pth data/coco/val2017 'person, dog, cat, horse, car' --topk 100 --threshold 0.1 --output-dir out
```

以上