【선박분류】 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]를 사용한다.

img

\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를 사용해서, 우리의 이미지를 예측해본다.

img

\6. 예측한 결과는 output이라는 변수에 저장되어 있다.

outputs 변수 설명 :

[https://detectron2.readthedocs.io/tutorials/models.html#model-output-format]

img

<코랩 - Train on a custom dataset>

\1. 우선 detectron2에서 우리의 데이터를 얻는 방법을 알려줘야한다. 우리의 json파일을 읽고, 그 json파일을 해석하는 방법을 다음과 같이 함수로 직접 정의하면 된다.

img

\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을 시킨다.

img

img

여기서 주의할 점은, os.makedirs(cfg.OUTPUT_DIR) 에 의해서 현재 나의 위치(pwd)에 output이라는 폴더가 만들어졌고, 그 안에 파일들이 저장되고 있음을 확인할 수 있다.

**

img

\1. 학습이 완료되면 다음과 같이 pth라는 파일이 생긴다. 이것은 tensorflow에서 cpkt와 같은 역활을 한다. 즉 model의 parameter를 저장해놓는 역활을 한다.

\2. 아래와 같이 predictor를 명시만 해준다. (그 predictor는 지금까지 내가 학습시킨 파라메터인 model_final을 사용한다)

img

\3. 아래와 같은 방법으로 이미지를 가져오고, 가져온 이미지를 predictor를 이용해 predict을 진행한다. 그 후 outputs에 predict의 정보가 저장되고, 그 정보는 아래와 같은 get_fields()[output정보를 dict으로 바꿔줌]과 같은 메소드를 이용해서 해석할 수 있다.

img

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. 튜토리얼을 통해 코드 및 변수 분석하기

img

2. 그 코드와 변수를 이용해서, 내가 원하는 데이터 뽑아내기

img

3. 뽑아낸 데이터가 잘 뽑아졌느지 확인하기

img

4. csv모듈 공부하기

img

csv 모듈을 이용해서 파일을 저장한다. csv모듈을 다루는데 2차원 행렬만 생각하면 된다. [[],[], … ]

그리고 writerow라는 함수를 사용하여 한 행 씩 저장하는게 보통이지만,

나는 writerows라는 함수를 이용해서 한방에 결과를 저장하려고 한다.

5. ship detector model에 적용하여 원하는 정보 뽑아내기

img

6. 뽑아낸 정보를 csv로 만들어 파일 저장하기

img

옮바른 형식으로 출력 완료.

img


© All rights reserved By Junha Song.