labelme2coco.py代码错误
Created by: zhuyushi
labelme2coco.py生成的json文件中,"annotations"数组段中每个目标的"id"值不正确,"id"值与"image_id"只不应该是完全相同的,"image_id"是图片的id值,"id"是目标的id值,如果一个图片中包含多个目标,那么"id"与"image_id"就不相同。该问题会导致训练出的模型在检测多个目标的图片时只能检测出一个目标。
代码中deal_json函数、annotations_polygon函数和annotations_rectangle函数需要修改。修改后测试OK。
deal_json函数代码修改后如下(num变量改为image_num, 增加了object_num 变量): def deal_json(img_path, json_path): data_coco = {} label_to_num = {} images_list = [] categories_list = [] annotations_list = [] labels_list = [] image_num = -1 object_num = -1 for img_file in os.listdir(img_path): img_label = img_file.split('.')[0] label_file = osp.join(json_path, img_label + '.json') print('Generating dataset from:', label_file) image_num = image_num + 1 with open(label_file) as f: data = json.load(f) images_list.append(images(data, image_num)) for shapes in data['shapes']: object_num = object_num + 1 label = shapes['label'] if label not in labels_list: categories_list.append(categories(label, labels_list)) labels_list.append(label) label_to_num[label] = len(labels_list) points = shapes['points'] p_type = shapes['shape_type'] if p_type == 'polygon': annotations_list.append( annotations_polygon(data['imageHeight'], data[ 'imageWidth'], points, label, image_num, object_num, label_to_num)) if p_type == 'rectangle': points.append([points[0][0], points[1][1]]) points.append([points[1][0], points[0][1]]) annotations_list.append( annotations_rectangle(points, label, image_num, object_num, label_to_num)) data_coco['images'] = images_list data_coco['categories'] = categories_list data_coco['annotations'] = annotations_list return data_coco
annotations_polygon函数代码修改后如下(增加了object_num 变量): def annotations_rectangle(points, label, image_num, object_num, label_to_num): annotation = {} seg_points = np.asarray(points).copy() seg_points[1, :] = np.asarray(points)[2, :] seg_points[2, :] = np.asarray(points)[1, :] annotation['segmentation'] = [list(seg_points.flatten())] annotation['iscrowd'] = 0 annotation['image_id'] = image_num + 1 annotation['bbox'] = list( map(float, [ points[0][0], points[0][1], points[1][0] - points[0][0], points[1][ 1] - points[0][1] ])) annotation['area'] = annotation['bbox'][2] * annotation['bbox'][3] annotation['category_id'] = label_to_num[label] annotation['id'] = object_num + 1 return annotation
annotations_rectangle函数代码修改后如下(增加了object_num 变量): def annotations_polygon(height, width, points, label, image_num, object_num, label_to_num): annotation = {} annotation['segmentation'] = [list(np.asarray(points).flatten())] annotation['iscrowd'] = 0 annotation['image_id'] = image_num + 1 annotation['bbox'] = list(map(float, get_bbox(height, width, points))) annotation['area'] = annotation['bbox'][2] * annotation['bbox'][3] annotation['category_id'] = label_to_num[label] annotation['id'] = object_num + 1 return annotation