Image Processing

pycocotools를 이용해 masking하기!

jinmc 2022. 8. 8. 17:33
반응형

pycocotools를 통해서 masking을 하는 방법을 알아보도록 하겠습니다.

주피터 노트북에서의 파일을 준비하는 과정입니다.

coco 포맷은 yolo 포맷과는 달리 segmentation이 있기 때문에 bounding box가 아닌 masking이 가능한 것 같습니다.

 

1. COCO Dataset 사용 준비하기

%matplotlib inline
from pycocotools.coco import COCO
import numpy as np
import skimage.io as io
import matplotlib.pyplot as plt
import pylab
# pylab.rcParams['figure.figsize'] = (8.0, 10.0)

dataDir='.'
dataType='val2017'
annFile='{}/annotations/instances_{}.json'.format(dataDir,dataType)

# initialize COCO api for instance annotations
coco=COCO(annFile)

2. COCO 카테고리 불러오기

# display COCO categories and supercategories
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)))

cat_food = set([cat['name'] for cat in cats if cat['supercategory'] == 'food'])
print()
print(f"food category where supercategory is food: \n {' '.join(cat_food)}")

3. 랜덤으로 이미지 출력해보기

# get all images containing given categories, select one at random
catIds = coco.getCatIds(catNms=['donut']);
# catIds = coco.getCatIds(catNms=['person','dog','skateboard']);
# print(catIds)
imgIds = coco.getImgIds(catIds=catIds );
# print(imgIds)
# imgIds = coco.getImgIds(imgIds = [324158])
# print(imgIds)
print(imgIds[np.random.randint(0,len(imgIds))])
img = coco.loadImgs(imgIds[np.random.randint(0,len(imgIds))])[0]

# load and display image
# I = io.imread('%s/images/%s/%s'%(dataDir,dataType,img['file_name']))
# use url to load image
I = io.imread(img['coco_url'])
plt.axis('off')
plt.imshow(I)
plt.show()

 

4. showAnn을 이용하여 annotations정보 불러와서 결과 확인하기

# load and display instance annotations
plt.imshow(I); plt.axis('off')
annIds = coco.getAnnIds(imgIds=img['id'], catIds=catIds, iscrowd=None)
anns = coco.loadAnns(annIds)
for ann in anns:
    print(ann)
# print(anns)
coco.showAnns(anns)

 

5. masking하기

print(catIds)
print(annIds)
print(anns)
anns_img = np.zeros((img['height'], img['width']))
for ann in anns:
#     print(ann)
    anns_img = np.maximum(anns_img, coco.annToMask(ann) )
#     print(coco.annToMask(ann))
#     print(ann['category_id'])
    plt.imshow(anns_img)
#     print(anns_img)

 

 

참조 : COCO Dataset, How to create mask images from COCO dataset?

 

반응형