개요

딥러닝 기반 얼굴감지(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
...

참고: dongle94 - retinaface github

댓글남기기