Cài đặt docker Detectron2 và mmdetection
0. Cài đặt GPU docker
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 Dockerfile và docker-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:
_base_ = 'faster_rcnn/faster_rcnn_r50_fpn_2x_coco.py'
model = dict(
roi_head=dict(
bbox_head=dict(num_classes=8)))
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 đó:
- _base : file config của backbone sử dụng, xem tại đây. Ở đây sử dụng faster_rcnn/faster_rcnn_r50_fpn_2x_coco.py.
- chỉnh num_classes ở dòng 7 thành
số lớp + 1
. Tức dữ liệu có 7 lớp thì num_classes=8
- classes : tuple chứa các tên class.
- data : dictonary chứa các thông tin đường dẫn của dữ liệu & annotation của train/test.
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
Cài đặt docker Detectron2 và mmdetection
0. Cài đặt GPU docker
Setting up NVIDIA Container Toolkit
Chạy 2 command line sau:
Cài nvidia-docker2
Khởi động lại docker:
1. Detectron2
Chuẩn bị dockerfile
Tạo một thư mục mới detectron2_docker, tải 2 file Dockerfile và docker-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:
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:
3. Sử dụng
Khởi động 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:
Muốn khởi động docker thì chỉ cần sử dụng:
Ví dụ sử dụng 1 GPU cho detectron2 thì sử dụng
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:
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.
$ sudo groupadd docker
$ sudo usermod -aG docker $USER
$ newgrp docker
$ 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:
(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)
Kiểm tra thử các thư mục có bên trong
Kết quả sau đây là đúng:
Sau đó chạy lệnh sau để khởi động image docker mmdetection
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:
Trong đó:
số lớp + 1
. Tức dữ liệu có 7 lớp thìnum_classes=8
Đặt tên file config. Ví dụ :
config_train.py
. Tiến hành cp file config này vào thư mụcconfigs
nằm trong docker.Trước hết cần biết container id của mình đang dùng
lấy
container id
ra, sử dụng lệnh sau để cp vào mmdetection:4. Huấn luyện.
Trong docker mmdetection,
Chạy lệnh sau để tiến hành huấn luyện:
Weight lưu ở thư mục
work_dirs