junha1125 2020. 3. 11. 14:27

<전체 구조>

@ 오리지널 깃 사이트 : [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로 만들어 파일 저장하기

 

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