[object detection] facebook API - detectron2
<전체 구조>
@ 오리지널 깃 사이트 : [https://github.com/facebookresearch/detectron2]
@ install : [https://github.com/facebookresearch/detectron2/blob/master/INSTALL.md]
@ doecker : [https://github.com/facebookresearch/detectron2/blob/master/docker/Dockerfile]
- dockerfile 구동 방법 : [http://pyrasis.com/Docker/Docker-HOWTO#dockerfile]
- 그냥 dockerfile이 있는 위치에서 다음의 명령어 실행
- docker로 하면, 어떻게 될지는 궁금하나,
현재는 우리의 데이터셋을 이용하기 위함까지 해야하므로, 로컬에 우선 설치하자.
$ docker build --tag detectron2:1.0
$ docker run --name facebookDetectron -d -p 80:80 -v [host path]:[container path] detectron2:1.0
@ 차근 설치법(코랩) : [drive/16jcaJoc6bCFAQ96jDe2HwtXj7BMD_-m5#scrollTo=QHnVupBBn9eR]
@ source를 다운받아서 직접 build하는 방법.
@ pre-built 되어 있는 source를 다운받는 방법.
- 쿠다 버전 관리 주의
- 이것은 가장 최신 버전의 파일이므로, 깃에 있는 파일과 양립하지 않을 수 있다.
@ Quick Start : [https://github.com/facebookresearch/detectron2/blob/master/GETTING_STARTED.md]
- 위의 코랩이, 이 내용까지 포함하고 있다.
@ Document : [https://detectron2.readthedocs.io/index.html]
ps.
- intallation를 보다 보면 드는 의문 :
'pip install' 과 'python setup.py intsall' 는 표면적으로 같은 역활을 한다.[https://stackoverflow.com/questions/15724093/difference-between-python-setup-py-install-and-pip-install]
여기서는 pythion pip install을 사용했다. pip install과 동일한 것 같다. -
남의 코드 보다가 모르는거 있으면 제발 print 해보아라. 디버깅을 해야 그게 뭔지 알지!! 눈으로만 보고 document로만 읽고 하면 기억에 남는것도 별로 없고, 확실히 알지도 못한다.
<코랩 - Run a pre-trained detectron2 model>
1. torch==1.4.0+cu100 // torchvision==0.5.0+cu100 로 파이토치 버전을 바꿔준다.
2. 코코API를 pip install을 통해서 다운받는다.
[$ pip install -U 'git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI']
3. 코랩에서는 [pre-built Scource == detectron2]를 사용한다.
4. 위에서 설치한 detectron2 패키지를 전적으로 이용한다. 다음에서 정보를 얻을 수 있다.
git : [https://github.com/facebookresearch/detectron2] -> 어떤 config가 있는지 눈으로 확인 가능
document : [https://detectron2.readthedocs.io/index.html] -> API에서 import하는 메소드 코드 확인 가능
5. 다음과 같이 내가 원하는 Cascade Rcnn을 이용하여 학습 완료
코드 설명 :
- pretrained_model을 가져오기 위해서 config_file의 경로를 설정해준다.
- 그리고 model_zoo라는 곳(pretrained model이 모두 저장되어 있다)에서 모델 파라메터를 가져온다.
- 우리가 가져온 파라메터를 사용해서, predictor를 정의한다.
- 정의한 predictor를 사용해서, 우리의 이미지를 예측해본다.
6. 예측한 결과는 output이라는 변수에 저장되어 있다.
outputs 변수 설명 :
[https://detectron2.readthedocs.io/tutorials/models.html#model-output-format]
<코랩 - Train on a custom dataset>
1. 우선 detectron2에서 우리의 데이터를 얻는 방법을 알려줘야한다. 우리의 json파일을 읽고, 그 json파일을 해석하는 방법을 다음과 같이 함수로 직접 정의하면 된다.
2. 그리고 DatasetCatalog와 MetadataCatalog 함수를 이용해서, 위에서 정의한 함수가 있다는 것을 알려준다. str으로 내가 원하는 데이터 셋을 찾을 수 있다. 다양한 데이터 셋을 한방에 관리하게 위해 DatasetCatalog와 같은 함수를 사용한다고 한다.
3. 그렇게 DatasetCatalog과 MetadataCatalog로 정의된 데이터 셋을 살펴보면 다음과 같다.
print(balloon_metadata)
print(DatasetCatalog.get("balloon_train"))
>> Metadata(name='balloon_train', thing_classes=['balloon'])
>> [{'file_name': 'balloon/train/34020010494_e5cb88e1c4_k.jpg', 'image_id': 0, 'height': 1536, 'width': 2048, 'annotations': [{'bbox': [994, 619, 1445, 1166], 'bbox_mode': <BoxMode.XYXY_ABS: 0>, 'segmentation': [[1020.5, 963.5, 1000.5, 899.5, 994.5, 841.5, 1003.5, 787.5, 1023.5, 738.5, 1050.5, 700.5, 1089.5, 663.5, 1134.5, 638.5, 1190.5, 621.5, 1265.5, 619.5, 1321.5, 643.5, 1361.5, 672.5, 1403.5, 720.5, 1428.5, 765.5, 1442.5, 800.5, 1445.5, 860.5, 1441.5, 896.5, 1427.5, 942.5, 1400.5, 990.5, 1361.5, 1035.5, 1316.5, 1079.5, 1269.5, 1112.5, 1228.5, 1129.5, 1198.5, 1134.5, 12 .....
<train>
다음과 같이 모델을 정하고, 몇가지 정보를 입력해 간단하게 train을 시킨다.
여기서 주의할 점은, os.makedirs(cfg.OUTPUT_DIR) 에 의해서 현재 나의 위치(pwd)에 output이라는 폴더가 만들어졌고, 그 안에 파일들이 저장되고 있음을 확인할 수 있다.
<inference & evaluation>
1. 학습이 완료되면 다음과 같이 pth라는 파일이 생긴다. 이것은 tensorflow에서 cpkt와 같은 역활을 한다. 즉 model의 parameter를 저장해놓는 역활을 한다.
2. 아래와 같이 predictor를 명시만 해준다. (그 predictor는 지금까지 내가 학습시킨 파라메터인 model_final을 사용한다)
3. 아래와 같은 방법으로 이미지를 가져오고, 가져온 이미지를 predictor를 이용해 predict을 진행한다. 그 후 outputs에 predict의 정보가 저장되고, 그 정보는 아래와 같은 get_fields()[output정보를 dict으로 바꿔줌]과 같은 메소드를 이용해서 해석할 수 있다.
pred_masks에 mask정보가 있다. true, false값을 사용해 이미지의 한 픽셀픽셀이 객체의 부분인지를 말해준다.(다각형 꼭지점 좌표를 이용한 mask 데이터 아님.)
<적절한 데이터 구조>
- detectron_for_alpha
- test
- 0.png
- ...
- 1239.png
- images
- 0.png
- ...
- 1664.png (maybe)
- labels.json (for images)
- output
- model_final.pth
- ....
<predictor에 의해서 나오는 ouput을 내가 원하는 정보로 바꿔 csv로 저장하기>
이를 위해 다음과 같은 과정을 거쳤다.
1. 튜토리얼을 통해 코드 및 변수 분석하기
2. 그 코드와 변수를 이용해서, 내가 원하는 데이터 뽑아내기
3. 뽑아낸 데이터가 잘 뽑아졌느지 확인하기
4. csv모듈 공부하기
csv 모듈을 이용해서 파일을 저장한다. csv모듈을 다루는데 2차원 행렬만 생각하면 된다. [[],[], ... ]
그리고 writerow라는 함수를 사용하여 한 행 씩 저장하는게 보통이지만,
나는 writerows라는 함수를 이용해서 한방에 결과를 저장하려고 한다.
5. ship detector model에 적용하여 원하는 정보 뽑아내기
6. 뽑아낸 정보를 csv로 만들어 파일 저장하기
옮바른 형식으로 출력 완료.