Cài đặt docker Detectron2 và mmdetection

0. Cài đặt GPU docker

Setting up NVIDIA Container Toolkit

Chạy 2 command line sau:

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
curl -s -L https://nvidia.github.io/nvidia-container-runtime/experimental/$distribution/nvidia-container-runtime.list | sudo tee /etc/apt/sources.list.d/nvidia-container-runtime.list

Cài nvidia-docker2

sudo apt-get update
sudo apt-get install -y nvidia-docker2

Khởi động lại docker:

sudo systemctl restart docker

1. Detectron2

Chuẩn bị dockerfile

Tạo một thư mục mới detectron2_docker, tải 2 file Dockerfiledocker-compose.ymlđây về.

Cài đặt

Chạy lệnh sau việc cài đặt được thực hiện từ A -> Z:

sudo docker build --build-arg USER_ID=$UID -t detectron2:v0 .

2. mmdetection

Chuẩn bị dockerfile

Tạo một thư mục mới mmdetection_docker, tải file Dockerfileđây về.

Cài đặt

Chạy lệnh sau việc cài đặt được thực hiện từ A -> Z:

sudo docker build --build-arg USER_ID=$UID -t mmdetection:v0 .

3. Sử dụng

Khởi động docker:

systemctl start docker

Sau đó chọn user cần dùng (gõ stt user), nhập pass.

Sau khi cài đặt xong, gõ lệnh sau để thấy rằng 2 docker mmdetection và detectron2 đã được cài đặt:

sudo docker images

Muốn khởi động docker thì chỉ cần sử dụng:

sudo docker run --gpus <số gpu sử dụng> <image id>>

Ví dụ sử dụng 1 GPU cho detectron2 thì sử dụng

sudo docker run --gpus 1 -it 20a7c98efc33

Docker sẽ tạo ra một container để làm việc, sau này muốn train hay test chỉ cần đưa data vào container rồi thực hiện như hướng dẫn bên tutorial của detectron2.

Cách mount thư mục dữ liệu của host vào trong container:

sudo docker run \ 
-v /output:/home/appuser/detectron2_repo/outputs \
--gpus 1 \
8538a3c34fb7

Lúc này, thư mục outputs bên trong docker image đã kết nối với thư mục output bên ngoài. Mọi thao tác lấy/xuất file trong thư mục outputs bên trong docker image đều cho lấy/xuất ra thư mục output bên ngoài.

Sau 2 bước trên thì sử dụng docker image bình thường như một máy linux.

Share permission for user (use docker without sudo)

If you want to run docker as non-root user then you need to add it to the docker group.

Create the docker group if it does not exist

$ sudo groupadd docker

Add your user to the docker group.

$ sudo usermod -aG docker $USER

Run the following command or Logout and login again and run (that doesn't work you may need to reboot your machine first)

$ newgrp docker

Check if docker can be run without root

$ docker run hello-world

Reboot if still got error

$ reboot

Taken from the docker official documentation: manage-docker-as-a-non-root-user

Train custom data mmdetection

Trong document này hướng dẫn train mmdetection trên dữ liệu custom định dạng COCO.

1. Chuẩn bị dữ liệu

Chuẫn bị dữ liệu theo cấu trúc thư mục sau:

<thư mục data>/
├── images (chứa toàn bộ ảnh)
├── annotations
    ├── train.json (chứa annotation của tập train)
    ├── val.json (chứa annotation của tập val)
    ├── test.json (chứa annotation của tập test)

(Có thể chỉ chuẩn bị 1 trong 2 file val/ test.json)

2. Kết nối docker mount thư mục dữ liệu vào

Thư mục dữ liệu đang nằm trên host, ta khởi động docker và mount thư mục data nằm trong host lên docker.

Trước hết ta cd vào thư mục data nằm trên host (tức là đi vào trong thư mục data)

cd <thư mục data>

Kiểm tra thử các thư mục có bên trong

ls

Kết quả sau đây là đúng:

images annotations

Sau đó chạy lệnh sau để khởi động image docker mmdetection

docker run -d \
        --shm-size 8G \
        --gpus 1 -it --name thu_nghiem \
        --mount type=bind,source="$(pwd)",target=/mmdetection/data_train \
         mmdetection:latest

lúc này thư mục data_train trong docker đã mount với thư mục data host bên ngoài. Kiểm tra lại các thư mục bên trong data_train bằng lệnh ls

3. Chuẩn bị file config

Để huấn luyện mmdetection custom data trước hết chuẩn bị file config. Ở đây hướng dẫn train bằng faster r-cnn. Có thể sử dụng backbone khác.

File config có dạng như sau:

# The new config inherits a base config to highlight the necessary modification _base_ = 'faster_rcnn/faster_rcnn_r50_fpn_2x_coco.py' # We also need to change the num_classes in head to match the dataset's annotation model = dict( roi_head=dict( bbox_head=dict(num_classes=8))) # Modify dataset related settings dataset_type = 'COCODataset' classes = ('cam_nguoc_chieu', 'cam_do_xe', 'cam_re', 'gioi_han_toc_do', 'cam_con_lai', 'nguy_hiem', 'hieu_lenh',) data = dict( train=dict( img_prefix='./data_train/images/', classes=classes, ann_file='./data_train/annotations/train.json'), val=dict( img_prefix='./data_train/images/', classes=classes, ann_file='./data_train/annotations/val.json'), test=dict( img_prefix='./data_train/images/', classes=classes, ann_file='./data_train/annotations/test.json'))

Trong đó:

Cơ bản các đường dẫn trong dictionary data đã được chỉnh để phù hợp với hướng dẫn chuẩn bị dữ liệu ở Mục 1. Nếu đã thực hiện chuẩn bị dữ liệu như Mục 1 và mount vào docker như Mục 2 thì dictionary data có thể giữ nguyên các đường dẫn như vậy.

Đặt tên file config. Ví dụ : config_train.py. Tiến hành cp file config này vào thư mục configs nằm trong docker.

Trước hết cần biết container id của mình đang dùng

docker ps

lấy container id ra, sử dụng lệnh sau để cp vào mmdetection:

docker cp <đường dẫn của config_train.py> container_id:/mmdetection/configs

4. Huấn luyện.

Trong docker mmdetection,
Chạy lệnh sau để tiến hành huấn luyện:

python tools/train.py configs/config_train.py

Weight lưu ở thư mục work_dirs