개요
딥러닝 기반 얼굴감지(face detection) 알고리즘인 retinaface
training 에 대한 posting
환경
- RTX 3090 TI
- WSL Ubuntu 20.04
- CUDA 11.6
- cuDNN 8.4.1
- NCCL 2.17.1
repository download
본인이 학습을 할 수 있도록 insightface
에서 retinaface
에 대한 내용만 repo에 작업하였다. 라이센스는 MIT
라이센스이다. 참고하자.
$ git clone https://github.com/dongle94/retinaface.git
Dataset 준비
images
데이터셋은 retinaface
모델 기본 학습 데이터셋인 widerface
데이터셋을 사용한다. 다음 WIDERFACE 링크를 눌러 데이터셋을 다운로드 받는다.
- WIDER Face Training Images
- WIDER Face Validation Images
- WIDER Face Testing Images
labels
widerface
이미지 에 대한 라벨 데이터가 아닌 retinaface
에 대한 데이터셋을 받는다.
data structure
해당 리포지토리 내 data
폴더에 다운로드 받은 이미지와 라벨을 옮긴다. 라벨 파일을 기준으로 이미지를 적당히 이름을 바꿔 넣는다.
data
└── retinaface
├── test
│ ├── images
│ └── label.txt
├── train
│ ├── images
│ └── label.txt
└── val
├── images
└── label.txt
Pretrained Model download for transfer learning
retinaface
의 백본으로 resnet50
, resnet152
가 있다.
pretrained model을 내려받아 다음 경로와 같이 위치시켰다.
model
└── imagenet-resnet-152
├── resnet-152-0000.params
└── resnet-152-symbol.json
train
학습을 하기 위해 configuration 작업을 해준다.
config setting for train
$ cp rcnn/sample_config.py rcnn/config.py
해당 rcnn/config.py
을 나의 현재 리포지토리 파일 구조에 맞게 수정한다. 크게 network
, dataset
에 관한 부분과 default
에 관한부분이다. 사용하지 않는 건 주석처리하고 필요한 구문만 활성화 한다.
network.resnet = edict()
network.resnet.pretrained = 'model/imagenet-resnet-152/resnet-152'
network.resnet.pretrained_epoch = 0
dataset.retinaface = edict()
dataset.retinaface.dataset = 'retinaface'
dataset.retinaface.image_set = 'train'
dataset.retinaface.test_image_set = 'val'
dataset.retinaface.root_path = 'data'
dataset.retinaface.dataset_path = 'data/retinaface'
dataset.retinaface.NUM_CLASSES = 2
default.network = 'resnet'
default.pretrained = 'model/imagenet-resnet-152/resnet-152'
default.pretrained_epoch = 0
default.dataset = 'retinaface'
default.image_set = 'train'
default.test_image_set = 'val'
default.root_path = 'data'
default.dataset_path = 'data/retinaface'
default.frequent = 100
default.kvstore = 'device'
default.prefix = 'model/my-retinaface'
default.end_epoch = 1
default.lr_step = '55,68,80'
default.lr = 0.01
default.wd = 0.0005
default.frequent
은 로깅 주기이므로 취향에 맞게 설정.default.pretrained
보다network.resnet.pretrained
가 우선순위가 높다.
execute train
옵션들을 직접 수정했다면 학습 시 GPU 번호인 CUDA_VISIBLE_DEVICE
만 설정해주고 바로 train.py
를 돌릴 수 있다.
$ CUDA_VUISIBLE_DEVICES=0 python train.py
혹은 위의 설정들을 직접 옵션들로 지정해주어도 된다.
$ CUDA_VUISIBLE_DEVICES=0 python train.py \
--network resnet \
--dataset retinface \
--image_set train \
--root_path data \
--dataset_path data/retinaface \
--frequent 100 \
--pretrained model/imagenet-resnet-152/resnet-50 \
--pretrained_epoch 0 \
--prefix model/my-retinaface \
--end_epoch 100
check train
학습이 진행되면 다음과 같이 설정한 frequent
에 맞게 학습 로그가 출력되는 것을 볼 수 있다.
...
INFO:root:Epoch[0] Batch [0-1200] Speed: 17.93 samples/sec RPNAcc_s32=0.969854 RPNAcc_s32_BG=0.995917 RPNAcc_s32_FG=0.00246RPNL1Loss_s32=0.277066 RPNLandMarkL1Loss_s32=0.521750 RPNAcc_s16=0.969941 RPNAcc_s16_BG=0.995448 RPNAcc_s16_FG=0.104389 RPNL1Loss_s16=0.221863 RPNLandMarkL1Loss_s16=0.427273 RPNAcc_s8=0.978689 RPNAcc_s8_BG=0.994790 RPNAcc_s8_FG=0.001279 RPNL1Loss_s8=0.268217RPNLandMarkL1Loss_s8=0.658713
INFO:root:Epoch[0] Batch [0-1300] Speed: 17.65 samples/sec RPNAcc_s32=0.970084 RPNAcc_s32_BG=0.996230 RPNAcc_s32_FG=0.00246RPNL1Loss_s32=0.271963 RPNLandMarkL1Loss_s32=0.507266 RPNAcc_s16=0.970832 RPNAcc_s16_BG=0.995754 RPNAcc_s16_FG=0.128238 RPNL1Loss_s16=0.218799 RPNLandMarkL1Loss_s16=0.416961 RPNAcc_s8=0.979052 RPNAcc_s8_BG=0.995189 RPNAcc_s8_FG=0.004791 RPNL1Loss_s8=0.264745RPNLandMarkL1Loss_s8=0.641720
...
댓글남기기