coco数据集大概有8w张以上的图片,而且每幅图都有精确的边缘mask标注。
后面后分享一个labelme标注的json或xml格式转二值图的源码(以备以后使用)
而我现在在研究显著性目标检测,需要的是边缘mask的二值图像。搜了很久,并没有人做过这种工作,只能得到如下的掩膜图
而我需要的图像为二值图,如下
说下 我的过程 并附上代码:
首先,coco数据集将所有的8w多张图片标注信息整合到一个json文件中,所以我们需要将单张图片标注信息json文件提取出来,以下是批量提取脚本。
注: 需要改动地方 1)第6行:将json_file改为原coco数据集json文件的地址 (coco/annotations/xxxxx.json)
2) 第13行:设置需要提取的图片数量 我是提取82000张
3)第37行:设置存储json文件的目录 需要新建空文件夹 我是放在./coco_single_object下
4)第33-35行:可选 将图片的名称写入data.txt中 不需要的话可以注释掉
1 # -*- coding:utf-8 -*- 2 from __future__ import print_function 3 import json 4 5 #json文件的地址 需要手动设置 6 json_file='../pycocotools/instances_train2014.json' # # Object Instance 类型的标注 7 # person_keypoints_val2017.json # Object Keypoint 类型的标注格式 8 # captions_val2017.json # Image Caption的标注格式 9 10 data=json.load(open(json_file,'r')) 11 12 #设置需要提取的图片数量 我设置提取82000张 13 for i in range(82000): 14 data_2 = {} 15 data_2['info'] = data['info'] 16 data_2['licenses'] = data['licenses'] 17 data_2['images'] = [data['images'][i]] # 只提取第一张图片 18 data_2['categories'] = data['categories'] 19 annotation = [] 20 21 # 通过imgID 找到其所有对象 22 imgID = data_2['images'][0]['id'] 23 for ann in data['annotations']: 24 if ann['image_id'] == imgID: 25 annotation.append(ann) 26 27 data_2['annotations'] = annotation 28 # 保存到新的JSON文件,便于查看数据特点 29 #img_file 获取图片名称 30 img_file=data_2['images'][0]['file_name'] 31 img_first=img_file.split(".")[0] 32 #将提取出的图片写入data.txt文件中并换行 (optional) 33 # with open('./coco_single_object/data.txt',mode='a') as f: 34 # f.write(img_file) 35 # f.write("\n") 36 #设置存储目录 我的是存在当前目录下coco_single_object文件夹下 需要手动创建空文件夹 37 json.dump(data_2, open('./coco_single_object/'+img_first+'.json', 'w'), indent=4) # indent=4 更加美观显示
最后的结果是82000张 json文件
---------------------------------------------------------------------------------------------------------------------------------------
有了单张json文件之后,就是将mask掩膜提取出二值图片的过程了
注:函数传入4个参数 json_path,img_path,color_img_save,binary_img_save
分别对应 json_path: 上一步提取出的json文件的文件夹路径
img_path: coco数据集下载时原图目录
color_img_save: 存放原图的目录 (需要新建此文件夹)
binary_img_save: 存放二值图的目录(需要新建此文件夹)
1 from __future__ import print_function 2 from pycocotools.coco import COCO 3 import os, sys, zipfile 4 import urllib.request 5 import shutil 6 import numpy as np 7 import skimage.io as io 8 import matplotlib.pyplot as plt 9 import pylab 10 pylab.rcParams['figure.figsize'] = (8.0, 10.0) 11 import os 12 def get_single_binaryImg(json_path,img_path,color_img_save,binary_img_save): 13 # json_path json文件路径 从coco数据集的annotations标注json文件中提取出的单个json文件 14 # img_path 原图目录 下载coco数据集时的原图目录 15 # color_img_save 原图存放目录 16 # binary_img_save 二值图存放目录 17 dir=os.listdir(json_path) 18 for jfile in dir: 19 annFile =os.path.join(json_path,jfile) 20 coco = COCO(annFile) 21 imgIds = coco.getImgIds() 22 img = coco.loadImgs(imgIds[0])[0] 23 dataDir = img_path 24 shutil.copy(os.path.join(dataDir, img['file_name']), color_img_save) 25 26 # load and display instance annotations 27 # 加载实例掩膜 28 catIds = [] 29 for ann in coco.dataset['annotations']: 30 if ann['image_id'] == imgIds[0]: 31 catIds.append(ann['category_id']) 32 33 annIds = coco.getAnnIds(imgIds=img['id'], catIds=catIds, iscrowd=None) 34 width = img['width'] 35 height = img['height'] 36 anns = coco.loadAnns(annIds) 37 mask_pic = np.zeros((height, width)) 38 for single in anns: 39 mask_single = coco.annToMask(single) 40 mask_pic += mask_single 41 42 for row in range(height): 43 for col in range(width): 44 if (mask_pic[row][col] > 0): 45 mask_pic[row][col] = 255 46 47 imgs = np.zeros(shape=(height, width, 3), dtype=np.float32) 48 imgs[:, :, 0] = mask_pic[:, :] 49 imgs[:, :, 1] = mask_pic[:, :] 50 imgs[:, :, 2] = mask_pic[:, :] 51 imgs = imgs.astype(int) 52 img_name = img['file_name'].split(".")[0] 53 plt.imsave(binary_img_save + "/" + img_name + ".png", imgs) 54 55 if __name__ == '__main__': 56 57 json_path =r"G:\jianfeng\code\dataset\cocoapi-master\PythonAPI\get_json\test" 58 img_path=r"G:\jianfeng\code\dataset\coco\train2014" 59 color_img_save = r"G:\jianfeng\code\dataset\cocoapi-master\PythonAPI\get_json\color_img" 60 binary_img_save = r"G:\jianfeng\code\dataset\cocoapi-master\PythonAPI\get_json\binary_img" 61 62 get_single_binaryImg(json_path,img_path,color_img_save,binary_img_save)
最终出现这些结果:
最后在搜索得到二值图方法时,也找到了一个不错的源码,但是他是将labelme格式的json或者xml转为二值图,虽然不是将coco格式转为二值图,但是记录下也许以后也会用的到
https://github.com/samr28/labelme-to-binary-image
参考:
https://blog.csdn.net/wc781708249/article/details/79603522
https://blog.csdn.net/u013735511/article/details/79099483