zoukankan      html  css  js  c++  java
  • coco数据集标注图转为二值图python(附代码)

    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("
    ")
    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:jianfengcodedatasetcocoapi-masterPythonAPIget_json	est"
    58     img_path=r"G:jianfengcodedatasetcoco	rain2014"
    59     color_img_save = r"G:jianfengcodedatasetcocoapi-masterPythonAPIget_jsoncolor_img"
    60     binary_img_save = r"G:jianfengcodedatasetcocoapi-masterPythonAPIget_jsoninary_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

  • 相关阅读:
    vux 局部注册组件
    vux 全局注册组件
    axios请求本地json
    vux报错 this指针问题
    Vue如何引入远程JS文件
    报错 ERROR in static/js/vendor.b3f56e9e0cd56988d890.js from UglifyJs
    封装axios
    js判断手机型号
    js判断是否在微信浏览器打开
    nginx+tomcat实现负载均衡以及session共享(linux centos7环境)
  • 原文地址:https://www.cnblogs.com/bob-jianfeng/p/11150821.html
Copyright © 2011-2022 走看看