Post

COCO API 끄적이기

API

  • 응용 프로그램 프로그래밍 인터페이스

API 다운로드 받기

  • 리눅스
1
2
3
git clone https://github.com/cocodataset/cocoapi.git
cd PythonAPI
make

make에서 c오류가 날 경우

1
pip install cython
  • window

visual studio 2015를 다운로드 받아야합니다. 다운로드가 되었다는 가정하에 진행하겠습니다.

1
2
git clone https://github.com/cocodataset/cocoapi.git
cd PythonAPI

그리고 window의 오류가 발생하기 때문에 setup.py를 수정해야한다.

1
2
3
4
5
extra_compile_args=['-Wno-cpp', '-Wno-unused-function', '-std=c99']

에서

extra_compile_args={'gcc': ['/Qstd=c99']

수정이 완료가 되었다면 make를 진행하면 된다.

1
2
python setup.py build_ext install
python setup.py build_ext --inplace

만약 이상한 오류가 난다면 관리자 권한으로 실행시키면 된다.

images와 Annotations 다운로드 받기

엄청 오래걸린다.. 저같은 경우는 다운로드가 계속 잘 안되서 리눅스에서 google cloud service를 사용해 다운로드 했습니다. 속도가 빠르다는 장점이 있습니다.

1
2
3
4
5
6
7
8
9
$ sudo apt install curl
$ curl https://sdk.cloud.google.com | bash
$ source ~/.bashrc

gsutil -m rsync gs://images.cocodataset.org/train2017 train2017
gsutil -m rsync gs://images.cocodataset.org/test2017 test2017
gsutil -m rsync gs://images.cocodataset.org/val2017 val2017
gsutil -m rsync gs://images.cocodataset.org/annotations annotations : error!!
wget -c https://images.cocodataset.org/annotations/annotations_trainval2017.zip

이제 한번 만지작 거려봅시다.

코드

코드는 기존에 깃허브에 있는 pycocoDemo를 보면서 리뷰하려고 한다.

1
2
3
dataDir='G:\dataset\COCO'
dataType='train2017'
annFile='{}/annotations/instances_{}.json'.format(dataDir,dataType)

먼저 annotations파일의 경로를 잡아줍니다. 저는 train2017을 사용했는데 val2017을 쓰는 것을 추천한다.

1
coco=COCO(annFile)

annotations파일을 초기화 시켜준다.

1
2
3
4
5
6
cats = coco.loadCats(coco.getCatIds())
nms=[cat['name'] for cat in cats]
print('COCO categories: \n{}\n'.format(' '.join(nms)))

nms = set([cat['supercategory'] for cat in cats])
print('COCO supercategories: \n{}'.format(' '.join(nms)))

단순 카테고리 출력이다.

1
2
3
4
5
6
7
8
catIds = coco.getCatIds(catNms=['person','dog','skateboard']);
print(catIds)
imgIds = coco.getImgIds(catIds=catIds);
print(imgIds)
imgIds = coco.getImgIds(imgIds = [379520])
print(imgIds)
img = coco.loadImgs(imgIds[np.random.randint(0,len(imgIds))])[0]
print('img : ',img)

여기에서 우리가 필요한 데이터를 뽑는 과정으로

  1. 카테고리를 선택해 categories ID를 만든다.
  2. 이에 해당하는 카테고리를 가지고 있는 image의 ID를 찾는다.
  3. 하나를 선택해서 이미지를 불러온다.
1
2
3
4
5
I = io.imread(img['coco_url'])
plt.axis('off')
plt.imshow(I)

plt.show()

이미지를 보여준다. 이제부터 이미지에 annotations 파일을 적용하는데 instances, keypoint, caption 이렇게 3가지를 볼수 있다.

instances

1
2
3
4
5
6
7
8
9
10
11
annFile = '{}/annotations/instances_{}.json'.format(dataDir,dataType)
coco_kps=COCO(annFile)

plt.imshow(I)
plt.axis('off')
# annotation에 쓰일 ID
annIds = coco.getAnnIds(imgIds=img['id'], catIds=catIds, iscrowd=None)
# annotation 불러오기
anns = coco.loadAnns(annIds)
# annotation 적용하기
coco.showAnns(anns)

keypoint

1
2
3
4
5
6
7
8
9
annFile = '{}/annotations/person_keypoints_{}.json'.format(dataDir,dataType)
coco_kps=COCO(annFile)

plt.imshow(I)
plt.axis('off')
ax = plt.gca()
annIds = coco_kps.getAnnIds(imgIds=img['id'], catIds=catIds, iscrowd=None)
anns = coco_kps.loadAnns(annIds)
coco_kps.showAnns(anns)

caption

1
2
3
4
5
6
7
annFile = '{}/annotations/captions_{}.json'.format(dataDir,dataType)
coco_caps=COCO(annFile)

annIds = coco_caps.getAnnIds(imgIds=img['id']);
anns = coco_caps.loadAnns(annIds)
coco_caps.showAnns(anns)
plt.imshow(I); plt.axis('off'); plt.show()

참조

This post is licensed under CC BY 4.0 by the author.