github.com/HRNet/HRNet-Semantic-Segmentation/tree/pytorch-v1.1 이걸 돌려보려고 한다.
HRNet V2 논문에서는 semantic segmentation 실험을 3가지 데이터셋에서 했다.
Cityscapes, LIP, PASCAL-Context이다.
Cityscapes
5000 장의 이미지에 대해서 pixel level로 전체 scene에 어노테이션이 되어있다.
finely-annotated image의 train:val:test 개수는 각각 2975:500:1525이다.
30개의 클래스가 있는데, evaluation에는 이중에서 19개의 클래스만 쓴다고 한다.
www.cityscapes-dataset.com/benchmarks/#scene-labeling-task
HRNet 논문에서는 random crop을 사용하여 512*1024로 사용했다.
원래 segmentation이 그런건지는 몰라도 epoch이 아니라 또 iteration 단위로 적혀있다. 120K iteration을 돌렸다.
배치 사이즈 12, 4 GPUs 사용, syncBN 적용.
컴퓨터에 'leftImg8bit_sequence_trainvaltest.zip'라는 파일이 있는데, 이것만 압축파일로 300GB가 넘는데 일단은 압축 해제중이다.
뭔가 느낌상 여기에 'gtFine' 데이터를 같이 받아야만 될 것 같은 느낌이다...
Pascal-Context
PASCAL VOC 2010 데이터셋이 있는데, 여기에 추가적인 annotation을 제공한 데이터셋이다.
전체 scene에 대해 어노테이션이 제공되기 때문에 원래 original PASCAL semantic segmentation task에서 더 나아간 형태이다.
scene image가 4998, 5105장이 각각 train, test를 위해 사용된다.
클래스는 59개의 semantic classes, 여기에 1개의 background label이 들어간다.
이 사이트에서는 어노테이션만 추가로 다운받도록 되어있다.
그래서 PASCAL VOC 2010도 받아야하는데, 이건 1.3GB tar 파일이다. 용량이 작아서 단순 실험용이라면 이걸로 돌려보는 게 좋을 것 같다.
cs.stanford.edu/~roozbeh/pascal-context/
host.robots.ox.ac.uk/pascal/VOC/voc2010/index.html
아쉽게도 지금 컴퓨터에 있는 게 PASCAL 2007인지라 다른 데이터셋을 더 보려고 한다. 가장 작은 셋에서 실험할 예정.
논문에서는 480*480 이미지로 resize하여 학습한다.
LIP
50462장의 human 이미지들이 있다. 30462가 학습, 10000가 validation이다.
class는 백그라운드 1개를 포함하여 총 20가지이다.
아래 링크에 가면 설명과 함께 다운로드를 받을 수 있는데, 구글드라이브와 바이두 링크를 제공한다.
별로 용량은 크지 않은 것 같다.
학습시에 473*473 resize 하였다.
혹시 모르니 cityscapes 압축을 풀어봤는데, 역시 원본 이미지'만' 300GB가 넘었던 것이다.
파스칼이나 LIP는 1GB 언저리인데 말이다.
역시 모델 한번 돌려볼 용도라면 PASCAL이나 LIP를 돌려주도록 하자.
다운로드 후 아래와 같이 생겼는지 확인해주자.
저 list에 있는 디렉토리와 파일들은 원래 git clone하면 딸려오니까 신경쓰지 말자.
LIP의 경우, 그냥 구글 드라이브에 있는거 압축만 풀면 저대로 그대로 설정된다.
환경설정
PASCAL-Context를 실험하려면 추가적으로 무슨 셋업을 해줘야한다고 한다.
PASCAL VOC 다운받아보니까 전부 mat 파일로 되어있는데, 그래서인건가?
둘다 다운받긴 했지만 그래서 일단은 LIP로 돌리려고 한다.
train/validation
validation은 상관 없는데 train을 보니 panoptic deeplab처럼 또 distributed 처리를 할 것 처럼 생겼다. 음... segmentation계의 국룰인건가?
각종 yaml 파일은 experiments/데이터셋명/*에 있는 것 같다.
Train
python -m torch.distributed.launch --nproc_per_node=4 tools/train.py --cfg <yaml이름>
Validation
python tools/test.py
--cfg <yaml파일명> \
DATASET.TEST_SET testval \
TEST.MODEL_FILE <모델 pth 파일> \
TEST.SCALE_LIST 0.5,0.75,1.0,1.25,1.5,1.75,2.0 \
TEST.FLIP_TEST True
그러면 tools/train.py 를 먼저 봐야겠다.
별로 어려울 부분은 없어보이는데, core.function에 train()과 validate()이 정의된 모양이다.
매 에폭마다 이 함수를 호출하여 학습하며, 한 에폭이 끝나면 pth를 저장한다.
모델과 데이터셋을 만드는 과정에서는 eval() 함수를 쓴다. 이걸 쓰는건 처음봤다.
모델
model = eval('models.'+config.MODEL.NAME + '.get_seg_model')(config)
이걸 다시 FullModel()로 감싸는데, 이건 단순히 모델이랑 loss를 담는 데에 지나지 않는다.
데이터셋
그냥 'datasets' 폴더 안에 세가지 데이터셋 정의가 각각 되어있는데 왜 굳이 eval함수를 쓴건지는 모르겠다.
아무튼 datasets/lip.py 이런식으로 보고싶은 데이터셋 정의 보면 될 것 같다.
따라서, 데이터셋 파일 / 모델 파일 / train() 및 validate() 함수 각각을 봐주면 될 것 같다.
코드가 그렇게 복잡해보이진 않다.
코드 실행 (에러)
pytorch 0.4.1 말고, 1.1.0 버전으로 git clone 하자.
이게 master branch가 아니기 때문에 주의.
왜냐면 1.1.0이라고 써있긴 한데 그 이상 버전이어도 상관 없다.
그리고 0.4.1이면 inplace_abn 이라는 게 필요한데, 여기서 코드 에러가 난다.
실제 그 inplace_abn을 설치할 필요는 없고 HRNet 코드 안에 제공이 되는데, sync_bn 폴더 내에서 import 에러가 났다.
torch 1.1.0으로 옮기면 신경쓸거 없이 그냥 통째로 sync_bn 폴더를 삭제해도 되기 때문에 그렇게 했다.
이것만 해결하면 문제 없이 코드는 돌아간다.
일단은 실험을 돌려보고 있는데, 1에폭에 내 환경에서는 1 ~ 1.5시간 걸린다.
Pretrained model은 바이두 링크를 통해서만 제공되기 때문에 LIP dataset만 사용하여 학습중이며, 현재 25에폭 기준으로 mIoU는 0.3 수준이다. 모델은 아직 수렴하지 않았다.
논문을 확인해보니 0.4, 0.5 이상은 되어야할 것 같다. 물론 이는 imageNet pretrain을 했을 것이다. Cityscapes는 pretrained 썼다고 하는데 다른 데이터셋에서는 딱히 얘기 없는걸 봐선 사용했을 것 같다.
잘 돌아가는거 확인 하고 코드 슥 봐야겠다.
Pretrained model 구버전은 다운이 안되는 게 맞는데, 신버전은 된다.
github.com/HRNet/HRNet-Image-Classification
여기 보면 ImageNet에서 test error가 기존 것 보다 더 작은 모델이 있다.
이걸 가지고 다시 돌리고 있다. 잘 돌아간다.
아무튼 동작하는 것을 확인했으니 커스텀 데이터셋에서도 돌릴 수 있도록 코드를 살펴봐야겠다.
저번 panoptic deeplab보다는 훨씬 나을 것 같다.
-
서버 접속때문에 작성중에 자꾸 글을 날려서 그냥 코드 리뷰는 생략한다. ㅡㅡ;
대략 봤는데 안까먹을거라 믿는다.
하나 기록해두자면, LIP annotation은 grayscale로 읽어야한다. 그리고 0,1,2, ... 19 이런 식으로 저장되어있다.
그래서 이미지를 보면 겉보기에는 전부 까맣다.
댓글