本文共 13118 字,大约阅读时间需要 43 分钟。
自己的转labelme
# -*- coding:utf-8 -*-import argparseimport jsonimport osimport os.path as ospimport warningsimport copyimport numpy as npimport PIL.Imagefrom skimage import ioimport yamlimport cv2import copydef mkdir_os(path): if not os.path.exists(path): os.makedirs(path)#https://blog.csdn.net/u010103202/article/details/81635436#labelme标注的数据分析#https://blog.csdn.net/wc781708249/article/details/79595174#数据先转换成lableme,然后调用labelme的函数转换为VOC#https://github.com/wkentaro/labelme/tree/master/examples/semantic_segmentationori_path = "./luosi_phone_seg_20191008"save_path = "./seg_groundtruth"json_path = "./labelme_json"gray_path = "./JPEGImages_gray"mkdir_os(save_path)mkdir_os(json_path)mkdir_os(gray_path)#path = "luosi_phone_seg_20191008_20191012_185541.json"path = "luosi_phone_seg_20191008_20191014_194416.json"data = []with open(path) as f: for line in f: data.append(json.loads(line))num = 0lendata_num = 0count = len(data)file_error = open('error_null_json_biaozhu.txt',"wr")train_txt = open('train.txt',"wr")test_txt = open('test.txt',"wr")for lab in range(count): num += 1 #print num,"/",count onedate = data[lab] name = onedate["url_image"] name = str(name).split("/")[-1] print(name) # if len(onedate["result"])<2: # print name # continue # X1 = onedate["result"][0]["data"] # Y1 = onedate["result"][1]["data"] # assert len(X1)==len(Y1),"error len" img = cv2.imread(os.path.join(ori_path,name)) tempimg = copy.deepcopy(img) grayimg = copy.deepcopy(img) hh,ww,c = img.shape point_size = 1 point_color = (0, 0, 255) thickness = 4 # VID_20190924_143239_000511_img_good_931_735_1111_895 if(len(onedate["result"])==0): print(name) file_error.write(name) file_error.write("\n") continue if name == "VID_20190924_145531_000961_img_bad_791_480_1006_675.jpg": a = 1 if 'data' in onedate["result"] or 'data' in onedate["result"][0]: for key in range(len(onedate["result"])): ndata = onedate["result"][key]["data"] for k in range(len(ndata)/2): cv2.circle(img, (ndata[2*k],ndata[2*k+1]), point_size, point_color, thickness) grayimg=cv2.cvtColor(grayimg,cv2.COLOR_BGR2GRAY) cv2.imwrite(os.path.join(gray_path,name),grayimg) cv2.imwrite(os.path.join(save_path,name),img) else: print(name) file_error.write(name) file_error.write("\n") continue json_jpg={} json_jpg["imagePath"] = str(os.path.join(ori_path,name)) json_jpg["imageData"] = None shapes=[] #if name=="VID_20190924_142716_000261_img_good_670_716_772_813.jpg": # sss=1 #VID_20190924_145903 #VID_20190924_145950 for key in range(len(onedate["result"])): ndata = onedate["result"][key]["data"] points=[] if len(ndata)< 6: lendata_num += 1 continue else: for k in range(len(ndata)/2): cv2.circle(img, (ndata[2*k],ndata[2*k+1]), point_size, point_color, thickness) points.append([ndata[2*k],ndata[2*k+1]]) one_shape = {} one_shape["line_color"] = None one_shape["shape_type"] = "polygon" one_shape["points"] = points one_shape["flags"] = {} one_shape["fill_color"] = None one_shape["label"] = "luosi" shapes.append(one_shape) json_jpg["shapes"] = shapes json_jpg["version"] = "3.16.7" json_jpg["flags"] = {} json_jpg["fillColor"] = [ 255, 0, 0, 128 ] json_jpg["lineColor"] = [ 0, 255, 0, 128 ] json_jpg["imageWidth"] = ww json_jpg["imageHeight"] = hh jsonData = json.dumps(json_jpg, indent=4) jsonname = name.split(".")[0] jsonname = jsonname+".json" fileObject = open(os.path.join(json_path,jsonname), 'w') #cv2.imwrite(os.path.join(json_path,name),tempimg) fileObject.write(jsonData) fileObject.close() txtname = name.split(".")[0] if "VID_20190924_145903" in txtname or "VID_20190924_145950" in txtname: test_txt.write(txtname) test_txt.write("\n") else: train_txt.write(txtname) train_txt.write("\n")print("lendata_num:",lendata_num)file_error.close()test_txt.close()train_txt.close()
labelme转voc
#!/usr/bin/env pythonfrom __future__ import print_functionimport argparseimport globimport jsonimport osimport os.path as ospimport sysimport numpy as npimport PIL.Imageimport labelmedef mkdir_os(path): if not os.path.exists(path): os.makedirs(path)def main(): # parser = argparse.ArgumentParser( # formatter_class=argparse.ArgumentDefaultsHelpFormatter # ) # parser.add_argument('input_dir', help='input annotated directory', default='./labelme_json') # parser.add_argument('output_dir', help='output dataset directory', default='./voc_json') # parser.add_argument('--labels', help='labels file', default='labels.txt', required=True) # args = parser.parse_args() # if osp.exists(args.output_dir): # print('Output directory already exists:', args.output_dir) # sys.exit(1) input_dir = './labelme_json' output_dir = './voc_json' mkdir_os(output_dir) mkdir_os(osp.join(output_dir, 'JPEGImages')) mkdir_os(osp.join(output_dir, 'SegmentationClass')) mkdir_os(osp.join(output_dir, 'SegmentationClassPNG')) mkdir_os(osp.join(output_dir, 'SegmentationClassVisualization')) print('Creating dataset:', output_dir) class_names = [] class_name_to_id = {} for i, line in enumerate(open('labels.txt').readlines()): class_id = i - 1 # starts with -1 class_name = line.strip() class_name_to_id[class_name] = class_id if class_id == -1: assert class_name == '__ignore__' continue elif class_id == 0: assert class_name == '_background_' class_names.append(class_name) class_names = tuple(class_names) print('class_names:', class_names) out_class_names_file = osp.join(output_dir, 'class_names.txt') with open(out_class_names_file, 'w') as f: f.writelines('\n'.join(class_names)) print('Saved class_names:', out_class_names_file) colormap = labelme.utils.label_colormap(255) for label_file in glob.glob(osp.join(input_dir, '*.json')): print('Generating dataset from:', label_file) with open(label_file) as f: base = osp.splitext(osp.basename(label_file))[0] out_img_file = osp.join( output_dir, 'JPEGImages', base + '.jpg') out_lbl_file = osp.join( output_dir, 'SegmentationClassPNG', base + '.npy') #SegmentationClassPNG #SegmentationClass # out_lbl_file = osp.join( # output_dir, 'SegmentationClass', base + '.png') out_png_file = osp.join( output_dir, 'SegmentationClass', base + '.png') out_viz_file = osp.join( output_dir, 'SegmentationClassVisualization', base + '.jpg', ) data = json.load(f) #保存出错:VID_20190924_142150_000251_img_good_891_387_976_475 #img_file = osp.join(osp.dirname(label_file), data['imagePath']) img = np.asarray(PIL.Image.open(data['imagePath'])) PIL.Image.fromarray(img).save(out_img_file) lbl = labelme.utils.shapes_to_label( img_shape=img.shape, shapes=data['shapes'], label_name_to_value=class_name_to_id, ) labelme.utils.lblsave(out_png_file, lbl) np.save(out_lbl_file, lbl) viz = labelme.utils.draw_label( lbl, img, class_names, colormap=colormap) PIL.Image.fromarray(viz).save(out_viz_file)if __name__ == '__main__': main()
labelme转coco
# -*- coding: utf-8 -*-import osimport jsonimport numpy as npimport globimport shutilfrom sklearn.model_selection import train_test_splitnp.random.seed(41)import cv2#0为背景classname_to_id = {"luosi": 1}class Lableme2CoCo: def __init__(self): self.images = [] self.annotations = [] self.categories = [] self.img_id = 0 self.ann_id = 0 def save_coco_json(self, instance, save_path): import io #json.dump(instance, io.open(save_path, 'w', encoding='utf-8'), ensure_ascii=False, indent=1) # indent=2 更加美观显示 with io.open(save_path, 'w', encoding="utf-8") as outfile: my_json_str = json.dumps(instance, ensure_ascii=False, indent=1) if isinstance(my_json_str, str): my_json_str = my_json_str.decode("utf-8") outfile.write(my_json_str) # 由json文件构建COCO def to_coco(self, json_path_list): self._init_categories() for json_path in json_path_list: obj = self.read_jsonfile(json_path) self.images.append(self._image(obj, json_path)) shapes = obj['shapes'] for shape in shapes: annotation = self._annotation(shape) self.annotations.append(annotation) self.ann_id += 1 self.img_id += 1 instance = {} instance['info'] = 'spytensor created' instance['license'] = ['license'] instance['images'] = self.images instance['annotations'] = self.annotations instance['categories'] = self.categories return instance # 构建类别 def _init_categories(self): for k, v in classname_to_id.items(): category = {} category['id'] = v category['name'] = k self.categories.append(category) # 构建COCO的image字段 def _image(self, obj, path): image = {} from labelme import utils #img_x = utils.img_b64_to_arr(obj['imageData']) img_x = cv2.imread(str(obj['imagePath'])) img_x = cv2.cvtColor(img_x, cv2.COLOR_BGR2RGB) h, w = img_x.shape[:-1] image['height'] = h image['width'] = w image['id'] = self.img_id image['file_name'] = os.path.basename(path).replace(".json", ".jpg") return image # 构建COCO的annotation字段 def _annotation(self, shape): label = shape['label'] points = shape['points'] annotation = {} annotation['id'] = self.ann_id annotation['image_id'] = self.img_id annotation['category_id'] = int(classname_to_id[label]) annotation['segmentation'] = [np.asarray(points).flatten().tolist()] annotation['bbox'] = self._get_box(points) annotation['iscrowd'] = 0 annotation['area'] = 1.0 return annotation # 读取json文件,返回一个json对象 def read_jsonfile(self, path): import io #with io.open(path, "r", encoding='utf-8') as f: with open(path, "r") as f: return json.load(f) # COCO的格式: [x1,y1,w,h] 对应COCO的bbox格式 def _get_box(self, points): min_x = min_y = np.inf max_x = max_y = 0 for x, y in points: min_x = min(min_x, x) min_y = min(min_y, y) max_x = max(max_x, x) max_y = max(max_y, y) return [min_x, min_y, max_x - min_x, max_y - min_y]if __name__ == '__main__': labelme_path = "labelme_json/" saved_coco_path = "./" # 创建文件 if not os.path.exists("%scoco/annotations/"%saved_coco_path): os.makedirs("%scoco/annotations/"%saved_coco_path) if not os.path.exists("%scoco/images/train2017/"%saved_coco_path): os.makedirs("%scoco/images/train2017"%saved_coco_path) if not os.path.exists("%scoco/images/val2017/"%saved_coco_path): os.makedirs("%scoco/images/val2017"%saved_coco_path) # 获取images目录下所有的joson文件列表 json_list_path = glob.glob(labelme_path + "/*.json") # 数据划分,这里没有区分val2017和tran2017目录,所有图片都放在images目录下 train_path, val_path = train_test_split(json_list_path, test_size=0) val_path = train_path train_path = [] print("train_n:", len(train_path), 'val_n:', len(val_path)) # 把训练集转化为COCO的json格式 if len(train_path): l2c_train = Lableme2CoCo() train_instance = l2c_train.to_coco(train_path) l2c_train.save_coco_json(train_instance, '%scoco/annotations/instances_train2017.json'%saved_coco_path) for file in train_path: name = file.split('/')[-1] name = "./images_shachepian/train2017/" + name shutil.copy(name.replace("json","jpg"),"%scoco/images/train2017/"%saved_coco_path) if len(val_path): # 把验证集转化为COCO的json格式 l2c_val = Lableme2CoCo() val_instance = l2c_val.to_coco(val_path) l2c_val.save_coco_json(val_instance, '%scoco/annotations/instances_val2017.json'%saved_coco_path) for file in val_path: name = file.split('/')[-1] name = "./images_shachepian/val2017/" + name shutil.copy(name.replace("json","jpg"),"%scoco/images/val2017/"%saved_coco_path)