coco数据集标注图转为二值图python(附代码)

系统 2245 0

coco数据集大概有8w张以上的图片,而且每幅图都有精确的边缘mask标注。

后面后分享一个labelme标注的json或xml格式转二值图的源码(以备以后使用)

而我现在在研究显著性目标检测,需要的是边缘mask的二值图像。搜了很久,并没有人做过这种工作,只能得到如下的掩膜图

coco数据集标注图转为二值图python(附代码)_第1张图片

而我需要的图像为二值图,如下

coco数据集标注图转为二值图python(附代码)_第2张图片

说下 我的过程 并附上代码:

首先,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文件

coco数据集标注图转为二值图python(附代码)_第3张图片

---------------------------------------------------------------------------------------------------------------------------------------

有了单张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)
          

最终出现这些结果:

coco数据集标注图转为二值图python(附代码)_第4张图片       coco数据集标注图转为二值图python(附代码)_第5张图片

最后在搜索得到二值图方法时,也找到了一个不错的源码,但是他是将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


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论