이전 포스터에서 PASCAL-VOC 데이터셋에 대해 알아보았다. 이번 포스터에서는 PASCAL-VOC 데이터셋과 양대산맥을 이루는 COCO 데이터셋에 대해 알아볼 예정이다. PASCAL-VOC 데이터셋보다는 약간 복잡한 과정이 있어서 비교적 불편하지만 데이터가 더 많은 느낌이 든다. 여기에서 전체 코드를 볼 수 있다.

  • torch : 1.7.1
  • torchvision : 0.8.2


유명한 Dataset


흔히 모델의 성능을 평가할 때 공개된 데이터셋을 자주 사용한다. Classification의 경우 ImageNet 데이터셋을 자주 사용하고, Detection의 경우 COCO 또는 PASCAL 데이터셋을 사용한다. 대부분의 논문에서 사용하기 때문에 매우 유명한 데이터셋이다. Pytorch에서도 이러한 데이터를 쉽게 이용할 수 있도록 클래스를 제공한다.


사진1. torchvision에서 제공하는 Dataset
출처 : https://pytorch.org/vision/0.8/datasets.html


몇 개의 데이터셋을 제외하고는 대부분 download메소드도 같이 제공하기 때문에 코드 한 줄로 다운로드를 받을 수 있다. 보통 용량들이 크기 때문에 시간이 많이 걸린다. 편리하게 이용할 수 있다면야 시간은 문제가 될 것 같진 않다.


COCO Dataset


사진2. COCO Dataset Homepage
출처 : https://cocodataset.org/#home


Object Detection에서 자주 사용하는 데이터셋 중 하나는 COCO Dataset이다. 약 80개의 클래스와 object detection과 segmentation 등의 모델에 대한 데이터를 제공한다. 이미지 뿐만 아니라 Caption 연구를 할 수 있는 TEXT 또한 제공한다. 홈페이지에서 바로 데이터를 다운받을 수 있다. 하지만 데이터를 다루기 위해서는 COCO에서 제공하는 API를 따로 설치해야한다. 물론 API없이도 충분히 가능하긴 하지만, Json파일을 전처리하는데 매우 많은 시간이 걸릴 것 같다. 따라서 먼저 COCO API를 설치하는 방법에 대해 알아보겠다.


필자의 경우 Window환경에서 설치하고자 한다. 대부분의 개발영역이 그렇듯이 window환경에서는 API를 설치하는 과정이 많이 번거롭다.

  • github에서 COCO API의 폴더를 다운
  • setup.py 에서 내용 수정
  • build 실행


COCO API 다운로드

먼저 github에서 coco api 폴더를 다운받는다.

git clone https://github.com/cocodataset/cocoapi.git
cd cocoapi


사진3. Download COCO API from github


setup.py 수정

github에서 폴더를 다운받은 후 해당 폴더로 들어가면 여러 폴더들이 있는데, 그 중 PythonAPI폴더로 들어간 후에 setup.py을 수정한다.


cd PythonAPI
# 12번째 줄에 있는 해당 부분을
extra_compile_args=['-Wno-cpp', '-Wno-unused-function', '-std=c99']

# 아래와 같이 수정한 후 저장한다.
extra_compile_args={'gcc': ['/Qstd=c99']}


Build 실행

현재는 PythonAPI에 들어간 상태이다.

\cocoapi\PythonAPI>


이제 해당 폴더 안에서 아래 코드를 실행시켜 bulid를 진행하자. 만약 여기서 오류가 발생한다면 권리자 권한으로 실행시킨 후 재시도하면 된다. 필자의 경우 모든 권한을 완벽하게 하기 위해 단순 cmd창이 아닌 Anaconda Prompt권리자 권한으로 실행시킨 후에 진행했다.

python setup.py build_ext install


이후에 python을 실행시킨 후에 아래 코드를 입력해서 오류가 발생하는지 확인하자. 만약 오류가 발생하면 구글링을 통해 해결해야한다.

from pycocotools.coco import COCO


환경은 구성이 다 되었다. 마지막으로 홈페이지에서 이미지와 레이블을 다운받은 후에 진행을 해보자. 이때 이미지와 레이블의 연도가 일치해야 오류가 발생하지 않는다. 필자의 경우 2017년도 데이터를 이용했다. 레이블에 다양한 것들이 있는데, 그냥 아래 사진과 같이 두 개의 파일만 받으면 된다. 용량이 매우 크기 때문에 시간이 많이 걸린다.


사진4. COCO Dataset 데이터
출처 : https://cocodataset.org/#download


사실 필자의 경우 홈페이지에 있는 링크를 눌러도 반응이 없었다. 그래서 불가피하게 클라우드 서비스에서 wget을 이용해 다운받은 후 로컬로 옮겼다.(이유 아시는 분은 댓글 부탁드립니다…)


이제 모든 준비는 완료됐다. 본격적으로 Pytorch로 데이터를 다뤄보겠다.

Pytorch 실습


PASCAL-VOC 데이터셋과 크게 달라진 점이 없다. 단지 상속받는 class가 CocoDetection 클래스일 뿐, 모두가 동일하다. 유일한 차이점은 bbox의 좌표이다. PASCAL-VOC 데이터셋의 경우 좌상단과 우하단 좌표($[x1,y1,x2,y2])$로 구성되어 있지만, COCO 데이터셋의 경우 좌상단 좌표와 가로, 세로 길이($[x,y,h,w]$)로 구성되어 있다. 물론 데이터를 불러올 때 사용하는 코드는 동일하지만, 시각화를 하는 과정에서 차이가 있다.


class myCocoDetection(CocoDetection):
    def _load_image(self, idx: int):
        path = self.coco.loadImgs(idx)[0]["file_name"]
        return Image.open(os.path.join(self.root, path)).convert("RGB")
    
    def _load_target(self, idx):
        return self.coco.loadAnns(self.coco.getAnnIds(idx))
    
    def __getitem__(self, index: int):
        idx = self.ids[index]
        image = self._load_image(idx)
        target = self._load_target(idx)
        
        bboxes, labels = [], []
        for obj in target:
            bboxes.append(obj['bbox'])
            labels.append(obj['category_id'])
            
        labels = torch.tensor(labels)
        if self.transform:
            image = self.transform(image)
            bboxes = self.transform(np.array(bboxes))
            
        return image, bboxes, labels
  • _load_image : 필자가 참고한 버젼이 0.10.0 버젼이라 해당 메소드가 사용됐는데, 사실 0.8.1 버젼에서는 사용할 필요가 없다. 이것은 홈페이지 참고
  • _load_target : 이 메소드도 마찬가지
  • 최종 출력은 image / bboxes / labels로 구성되어 있다.


COCO API를 설치하는 것을 제외하면 PASCAL-VOC와 동일하기 때문에 자세한 사항은 PASCAL-VOC 데이터셋내용을 참고하길 바란다.


COCO Dataset에 대해 알아보았다. PASCAL-VOC랑 비슷한 데이터셋이지만, 비교적 더 많은 데이터와 class를 가지고 있는 것 같아 더 많이 사용될 것 같다. 물론 window에서 api를 다운받는 것이 좀 번거롭지만, 데이터가 많을수록 좋으니 좀 더 선호되는 것 같다. Faster-RCNN 모델의 경우도 COCO 데이터셋을 이용해 학습을 진행했다. 다음 포스터에서는 실제 모델을 이용하는 내용도 다뤄볼 예정이다. 여기에서 전체 코드를 볼 수 있다.