labelme多目标标注问题

labelme多目标标注问题

问题:在labelme标注多目标时存在不匹配的问题,任何一张图片都是从1开始,不能自定义标签号,考虑改写json2datasets文件,使他根据标签名称去定义标签号。

解决:
我的目录层级是

/datasets_new/img1/img1_fuse.jpg
/datasets_new/img1/img1_fuse.json
/datasets_new/img2/img2_fuse.jpg
/datasets_new/img2/img2_fuse.json

执行脚本就把目录下所有json转换完毕,大家可以根据不同的目录方式,可以自行修改代码,

import os
import random
import shutil
import re

import argparse
import json
import os
import os.path as osp
import warnings
 
import PIL.Image
import yaml
 
from labelme import utils
import base64
 
def main():
    warnings.warn("This script is aimed to demonstrate how to convert the\n"
                  "JSON file to a single image dataset, and not to handle\n"
                  "multiple JSON files to generate a real-use dataset.")
    parser = argparse.ArgumentParser()
    parser.add_argument('data_path')
    parser.add_argument('-o', '--out', default=None)
    args = parser.parse_args()

    #对不同标签定义一个号,每个号有自己的颜色...从1开始排就可以
    label_name_to_value = {'_background_': 0,
                           'change':1,
                           'disappear':2,
                           'add':3}
    count = []
    for i in os.listdir(args.data_path):
        path1 = os.path.join(args.data_path,i)
        for j in os.listdir(path1):
            path2 = os.path.join(path1, j)
            if path2.split('.')[-1] != 'json':
                continue
            else:
                count.append(path2)

    for i in range(0, len(count)):
        path = count[i]

        if os.path.isfile(path):
            data = json.load(open(path))
            
            if data['imageData']:
                imageData = data['imageData']
            else:
                imagePath = os.path.join(os.path.dirname(path), data['imagePath'])
                with open(imagePath, 'rb') as f:
                    imageData = f.read()
                    imageData = base64.b64encode(imageData).decode('utf-8')
            img = utils.img_b64_to_arr(imageData)

            for shape in data['shapes']:
                label_name = shape['label']
                if label_name in label_name_to_value:
                    label_value = label_name_to_value[label_name]
                else:
                    label_value = len(label_name_to_value)
                    label_name_to_value[label_name] = label_value
            
            # label_values must be dense
            label_values, label_names = [], []
            for ln, lv in sorted(label_name_to_value.items(), key=lambda x: x[1]):
                label_values.append(lv)
                label_names.append(ln)
            assert label_values == list(range(len(label_values)))
            
            lbl = utils.shapes_to_label(img.shape, data['shapes'], label_name_to_value)
            
            captions = ['{}: {}'.format(lv, ln)
                for ln, lv in label_name_to_value.items()]
            lbl_viz = utils.draw_label(lbl, img, captions)
            
            out_dir = osp.basename(count[i]).replace('.', '_')
            out_dir = osp.join(osp.dirname(count[i]), out_dir)
            if not osp.exists(out_dir):
                os.mkdir(out_dir)
            print(out_dir)
            name=out_dir.split('/')
            rename=name[2]+'_'+name[1]
            PIL.Image.fromarray(img).save(osp.join(out_dir, rename+'_'+'img.png'))

            #PIL.Image.fromarray(lbl).save(osp.join(out_dir, rename+'label.png'))
            utils.lblsave(osp.join(out_dir,rename+'_'+'label.png'), lbl)
            PIL.Image.fromarray(lbl_viz).save(osp.join(out_dir,rename+'_'+'label_viz.png'))
 
            with open(osp.join(out_dir, 'label_names.txt'), 'w') as f:
                for lbl_name in label_names:
                    f.write(lbl_name + '\n')
 
            warnings.warn('info.yaml is being replaced by label_names.txt')
            info = dict(label_names=label_names)
            with open(osp.join(out_dir, 'info.yaml'), 'w') as f:
                yaml.safe_dump(info, f, default_flow_style=False)
 
            print('Saved to: %s' % out_dir)
if __name__ == '__main__':
    main()

执行完毕后,目录变为

/datasets_new/img1/img1_fuse.jpg
/datasets_new/img1/img1_fuse.json
/datasets_new/img1/img1_fuse_json/…(生成的东西)
/datasets_new/img2/img2_fuse.json

想把它拷贝到上一级目录,可以执行脚本处理

import os
import shutil

for index in os.listdir('./dataset_new'):
    print(index)
    #path = os.path.join('./dataset_test',index,index+'_mask_jpg')
    path = os.path.join('./dataset_new', index,index+'_fuse_json', index+'_dataset_new_label.png')
    print(path)
    #if os.path.isdir(path):
    #    os.rmdir(path)
    if (os.path.exists(path)):
        #os.remove(os.path.join('./dataset_new', index, index+'_fuse.png'))
        shutil.copyfile(path, os.path.join('./dataset_new', index, index + '_label.png'))
        #os.rename(path,os.path.join('./dataset_new', index, index+'_fuse.json'))

最后变为

/datasets_new/img1/img1_fuse.jpg
/datasets_new/img1/img1_fuse.json
/datasets_new/img1/img1_label.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
labelme标注是一种常用的目标标注工具,用于标注图像目标,并生成标注数据。当图像存在重叠的目标时,一种解决方法是通过简单的绘图技巧来完成标注。 首先,我们可以使用标注工具提供的绘制工具,例如矩形框、多边形、线条等,对目标进行逐个标注。对于重叠目标,我们可以先标注一个目标,然后将绘制工具调整到较小的尺寸,仔细选择重叠目标的边界,并对其进行标注。这样,我们可以通过在已有标注目标上绘制新的标注来完成对重叠目标标注。 其次,对于重叠目标一些不易区分的部分,我们可以使用不同颜色的标注来区分它们。例如,对于两个重叠的目标,我们可以使用红色标注一个目标,使用蓝色标注另一个目标,这样可以更加清晰地区分它们。 另外,我们还可以通过调整绘制工具的透明度来解决重叠目标标注问题。例如,将绘制工具的透明度设置为较低的数值,可以使得之前标注目标依然可见,从而更好地完成后续目标标注。 在使用labelme标注重叠目标时,需要注意标注的准确性和清晰度。在标注过程,可以通过放大图像、调整绘制工具的大小和精度,以及反复检查和确认标注结果来提高标注的质量。 综上所述,通过合理运用绘图工具和调整标注的方式,可以较好地应对labelme标注重叠目标问题标注质量的提高需要经验、技巧和耐心,同时也要根据实际情况调整标注方法来提高标注效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值