labelme标注后的json文件只有一个point,没有产生封闭区域

最近在尝试用unet来做一些分割实验,在数据处理过程中进行数据格式转换的时候遇到了一个问题:用labelme标注完原始的jpg图片后产生了json文件,但是在运行程序进行数据格式转换时程序一直报错。

程序内容:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
'''

from __future__ import print_function
import argparse
import glob
import math
import json
import os
import os.path as osp
import shutil
import numpy as np
import PIL.Image
import PIL.ImageDraw
import cv2


def json2png(json_folder, png_save_folder):
    if osp.isdir(png_save_folder):
        shutil.rmtree(png_save_folder)
    os.makedirs(png_save_folder)
    json_files = os.listdir(json_folder)
    for json_file in json_files:
        json_path = osp.join(json_folder, json_file)
        os.system("labelme_json_to_dataset {}".format(json_path))
        label_path = osp.join(json_folder, json_file.split(".")[0] + "_json/label.png")
        png_save_path = osp.join(png_save_folder, json_file.split(".")[0] + ".png")
        label_png = cv2.imread(label_path, 0)
        label_png[label_png > 0] = 255
        cv2.imwrite(png_save_path, label_png)
        # shutil.copy(label_path, png_save_path)
        # break


if __name__ == '__main__':
    # !!!!你的json文件夹下只能有json文件不能有其他文件
    json2png(json_folder="data/json", png_save_folder="data/label")

报错内容:

TypeError: '>' not supported between instances of 'NoneType' and 'int'

起初根据报错内容我一直以为是代码中的这两行有问题,label_png是None型的,0是int型的,两者无法用>号进行比较。

        label_png = cv2.imread(label_path, 0)
        label_png[label_png > 0] = 255

但是尝试了很多别人的方法,也一直行不通。
后来问了我的导师才知道是标注后的json文件有问题,我导师给出的回复是:第一个json标注文件有一个标注只有一个point,无法确定一个封闭区间,去掉那个标注后,程序可以正常执行。
但是我还是很疑惑他是怎么知道有一个json标注文件的一个标注只有一个point这件事的,我也不太好意思再继续追问我们导师,有没有网友能帮我解答一下?

img


首先,labelme人家本身就支持点标注,你读取json生成对应的png掩码的时候会看下他shape_type,具体shape_type信息如下。

img


至于你老师为啥会知道,那看你的json生成png的脚本是谁写的,就是你imread的png是从哪里来的,如果是你老师写的话,那我估计他有做这个判断,如果是point的话,就不生成png图片,这就会导致你去读取png的时候图片为空,就变成了None了