【선박분류】 facebook API - detectron2 사용법 연구해보기
원본 글 위치 : https://junha1125.tistory.com/45?category=836123
@#### **<전체 구조="">**전체>
@ 오리지널 깃 사이트 : [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](https://colab.research.google.com/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을 시킨다.
여기서 주의할 점은, os.makedirs(cfg.OUTPUT_DIR) 에 의해서 현재 나의 위치(pwd)에 output이라는 폴더가 만들어졌고, 그 안에 파일들이 저장되고 있음을 확인할 수 있다.
**
\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](https://junha1125.tistory.com/1239.png)
\- images
\- 0.png
\- ...
\- [1664.png](https://junha1125.tistory.com/1664.png) (maybe)
\- [labels.json](https://junha1125.tistory.com/labels.json) (for images)
\- output
\- [model_final.pth](https://junha1125.tistory.com/model_final.pth)
\- ....
**
이를 위해 다음과 같은 과정을 거쳤다.
1. 튜토리얼을 통해 코드 및 변수 분석하기
2. 그 코드와 변수를 이용해서, 내가 원하는 데이터 뽑아내기
3. 뽑아낸 데이터가 잘 뽑아졌느지 확인하기
4. csv모듈 공부하기
csv 모듈을 이용해서 파일을 저장한다. csv모듈을 다루는데 2차원 행렬만 생각하면 된다. [[],[], … ]
그리고 writerow라는 함수를 사용하여 한 행 씩 저장하는게 보통이지만,
나는 writerows라는 함수를 이용해서 한방에 결과를 저장하려고 한다.
5. ship detector model에 적용하여 원하는 정보 뽑아내기
6. 뽑아낸 정보를 csv로 만들어 파일 저장하기
옮바른 형식으로 출력 완료.