Пример #1
0
def split_coco(coco_path, val_ratio, shuffle):
    with open(coco_path, 'r') as f:
        coco = f.read()
    coco = json.loads(coco)
    train_coco = create_coco(coco)
    val_coco = create_coco(coco)

    img_info_list, anns_list = find_all_img_anns(coco)
    indexs = list(range(len(img_info_list)))
    if shuffle:
        random.shuffle(indexs)
    for ii, i in enumerate(indexs):
        img_info = img_info_list[i]
        anns = anns_list[i]
        if ii < len(img_info_list) * (1 - val_ratio):
            train_coco = insert_img_anns(train_coco, img_info, anns)
        else:
            val_coco = insert_img_anns(val_coco, img_info, anns)

    save_path = osp.join(osp.dirname(coco_path), 'train.json')
    with open(save_path, 'w') as f:
        f.write(json.dumps(train_coco, indent=4, sort_keys=True))

    save_path = osp.join(osp.dirname(coco_path), 'val.json')
    with open(save_path, 'w') as f:
        f.write(json.dumps(val_coco, indent=4, sort_keys=True))
Пример #2
0
def kmeans_anchor(coco_path, n_clusters, img_size):
    wh_list = []
    with open(coco_path, 'r') as f:
        coco = f.read()
    coco = json.loads(coco)

    img_info_list, anns_list = find_all_img_anns(coco)
    for i in range(len(img_info_list)):
        img_info = img_info_list[i]
        anns = anns_list[i]
        for ann in anns:
            wh_list.append([
                ann['bbox'][2] / img_info['width'],
                ann['bbox'][3] / img_info['height']
            ])

    wh_list = np.float32(wh_list)
    estimator = KMeans(n_clusters=n_clusters)
    estimator.fit(wh_list)
    anchors = np.float32(estimator.cluster_centers_)
    anchors[:, 0] *= img_size[0]
    anchors[:, 1] *= img_size[1]
    area = anchors[:, 0] * anchors[:, 1]

    output = 'anchors: '
    for i in range(n_clusters):
        index = np.argmax(area)
        area[index] = 0
        output += '[%d,%d], ' % (int(anchors[index][0]), int(
            anchors[index][1]))
    print(output[:-2])
Пример #3
0
def crop_coco_instance(coco_path, img_root, output, square=False):
    save_path = osp.join(output, 'images')
    os.makedirs(save_path, exist_ok=True)
    with open(coco_path, 'r') as f:
        coco = f.read()
    coco = json.loads(coco)
    new_coco = create_coco(coco)
    img_info_list, anns_list = find_all_img_anns(coco)
    for img_info, anns in zip(img_info_list, anns_list):
        if len(anns) == 0:
            continue
        print(osp.join(img_root, img_info['file_name']))
        img = cv2.imread(osp.join(img_root, img_info['file_name']))
        img_name = osp.splitext(osp.basename(img_info['file_name']))[0]
        for ai, ann in enumerate(anns):
            iname = img_name + '_%05d.png' % ai
            seg = np.float32(ann['segmentation'])
            p = seg.reshape(-1, 2).transpose(1, 0).astype(np.int32)
            x1 = p[0].min()
            x2 = p[0].max()
            y1 = p[1].min()
            y2 = p[1].max()
            # square crop - it may be better for segmentation
            if square:
                center = ((x1 + x2) // 2, (y1 + y2) // 2)
                r = max(x2 - x1, y2 - y1) // 2
                x1 = center[0] - r
                x2 = center[0] + r
                y1 = center[1] - r
                y2 = center[1] + r
            x1_ = max(random.randint(x1 - 50, x1 - 10), 0)
            y1_ = max(random.randint(y1 - 50, y1 - 10), 0)
            x2_ = min(random.randint(x2 + 10, x2 + 50), img.shape[1])
            y2_ = min(random.randint(y2 + 10, y2 + 50), img.shape[0])
            cut = img[y1_:y2_, x1_:x2_]
            seg[:, ::2] -= x1_
            seg[:, 1::2] -= y1_
            ann['bbox'] = np.array([x1 - x1_, y1 - y1_, x2 - x1,
                                    y2 - y1]).tolist()
            ann['segmentation'] = seg.tolist()
            cv2.imwrite(osp.join(save_path, iname), cut)
            print(osp.join('images', iname))
            img_info = {
                'file_name': osp.join('images', iname),
                'width': cut.shape[1],
                'height': cut.shape[0],
            }
            insert_img_anns(new_coco, img_info, [ann])
    save_path = osp.join(output, 'coco_instance.json')
    with open(save_path, 'w') as f:
        f.write(json.dumps(new_coco, indent=4))
Пример #4
0
def merge_coco(path):
    merge_coco = None
    coco_list = os.listdir(path)
    coco_list = [c for c in coco_list if osp.splitext(c)[-1] == '.json']
    for coco_path in coco_list:
        coco_path = osp.join(path, coco_path)
        with open(coco_path, 'r') as f:
            coco = f.read()
        coco = json.loads(coco)
        if merge_coco is None:
            merge_coco = create_coco(coco)

        img_info_list, anns_list = find_all_img_anns(coco)
        for i in range(len(img_info_list)):
            img_info = img_info_list[i]
            anns = anns_list[i]
            merge_coco = insert_img_anns(merge_coco, img_info, anns)

    save_path = osp.join(osp.dirname(coco_path), 'merge.json')
    with open(save_path, 'w') as f:
        f.write(json.dumps(merge_coco, indent=4, sort_keys=True))
Пример #5
0
def coco2labelme(coco_path, outputs):
    os.makedirs(outputs, exist_ok=True)
    with open(coco_path, 'r') as f:
        coco = json.loads(f.read())
    img_info_list, anns_list = find_all_img_anns(coco)
    for img_info, anns in zip(img_info_list, anns_list):
        labelme_json = copy.deepcopy(DEFAULT_LABELME)
        labelme_json['imageHeight'] = img_info['height']
        labelme_json['imageWidth'] = img_info['width']
        shapes = []
        for ann in anns:
            shape = copy.deepcopy(DEFAULT_SHAPE)
            points = ann['segmentation'][0]
            points = list(zip(points[::2], points[1::2]))
            #label = coco['categories'][ann['category_id']]['name']
            label = coco['categories'][ann['category_id'] - 1][
                'name']  # 注意有的ann['category_id']是从1开始的,而coco['categories']索引是0,这样需要减1
            if len(points) == 1:
                shape_type = 'point'
            elif len(points) == 2:
                shape_type = 'line'
            elif len(points) <= 0:
                continue
            else:
                shape_type = 'polygon'
            shape['points'] = points
            shape['shape_type'] = shape_type
            shape['label'] = label
            shapes.append(shape)
        labelme_json['shapes'] = shapes
        labelme_json['imagePath'] = img_info[
            'file_name']  # osp.relpath(osp.join(osp.dirname(coco_path), img_info['file_name']), outputs)
        with open(
                osp.join(
                    outputs,
                    osp.splitext(osp.basename(img_info['file_name']))[0] +
                    '.json'), 'w') as f:
            f.write(json.dumps(labelme_json, indent=4, sort_keys=True))