记录从coco数据集提取语义分割mask的问题

首先下载cocoapi
提取mask代码如下(记得修改路径):

from pycocotools.coco import COCO
import numpy as np
import skimage.io as io
import matplotlib.pyplot as plt
import pylab
import cv2
import os
from matplotlib.patches import Polygon
from matplotlib.collections import PatchCollection
pylab.rcParams['figure.figsize'] = (8.0, 10.0)
dataDir = "E:/MS_COCO/train/annotations_trainval2017/"
dataType = 'train2017'
annFile = '{}annotations/instances_{}.json'.format(dataDir, dataType)
data_dir = "E:/MS_COCO/train/train2017/"
original_img_path = 'E:/MS_COCO/FCN_images/'
seg_output_path = 'E:/MS_COCO/FCN_mask/'
coco=COCO(annFile)

#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)))

catIds = coco.getCatIds(catNms=['person'])
imgIds = coco.getImgIds(catIds=catIds )
for i in range(10): # range()里应为len(imgIds),我做测试改为的10
    img = coco.loadImgs(imgIds[i])[0]
    annIds = coco.getAnnIds(imgIds=img['id'], catIds=catIds, iscrowd=None)
    width = img['width']
    height = img['height']
    anns = coco.loadAnns(annIds)
    #print(anns)
    if len(annIds) == 1:
        #print(anns)
        #print(len(anns))
        #print(len(ann['segmentation']))
        #print(ann['segmentation'])
        for ann in anns:
            mask = coco.annToMask(ann)
            #print(mask.shape)
            file_name = img["file_name"]
            name = os.path.splitext(file_name)[0]
            file_name = os.path.join(data_dir,img['file_name'])
            original_img = cv2.imread(file_name)
            cv2.imwrite("{}{}.png".format(original_img_path, name),original_img)
            cv2.imwrite("{}{}.png".format(seg_output_path, name),mask)

提取代码参考了https://github.com/savankoradiya/Extract-Mask-From-COCO-Dataset
根据参考的代码运行保存8位灰度图,发现标签的类别为[0 1 2],真实的标签类别应为[0 1 ]。(我的是2分类)
可参考如下代码查看标签类别:

import cv2
import os
import numpy as np
from PIL import Image
def get_all_files(bg_path):
    files = []

    for f in os.listdir(bg_path):
        if os.path.isfile(os.path.join(bg_path, f)):
            files.append(os.path.join(bg_path, f))
        else:
            files.extend(get_all_files(os.path.join(bg_path, f)))
    files.sort(key=lambda x: int(x[-7:-4]))#排序从小到大
    return files
files=get_all_files('E:/MS_COCO/FCN_mask/')

# 主要代码
for i in files:
    im=cv2.imread(i)
    print(np.unique(im))

最后发现原因是参考的代码保存的图片格式为jpg格式,改为png格式就好了(给出的代码已修改)。
原因是png是无损压缩,而其他格式可能是有损压缩。所以以后保存图片格式最好保存为png格式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值