mmyolo 实例分割labelme标准数据

上篇对自带的demo数据进行了测试,这篇要变为自己的数据进行训练和测试了

准备数据

这里的数据为SAM自动标注的GWHD2021年数据,保存为了labelme格式,并对数据进行了校对和修改,到底实例分割数据集GWHIS。

安装labelme,用于对数据进行标注

pip install labelme

数据分割

将标记好的数据分割为训练集、验证集和测试集,分割代码如下:

# 将图片和标注数据按比例切分为 训练集和测试集
import shutil
import random
import os
import argparse
 
 
# 检查文件夹是否存在
def mkdir(path):
    if not os.path.exists(path):
        os.makedirs(path)
 
def main(image_dir, txt_dir, save_dir):
    # 创建文件夹
    mkdir(save_dir)
    images_dir = os.path.join(save_dir, 'images')
    labels_dir = os.path.join(save_dir, 'labels')
 
    img_train_path = os.path.join(images_dir, 'train')
    img_test_path = os.path.join(images_dir, 'test')
    img_val_path = os.path.join(images_dir, 'val')
 
    label_train_path = os.path.join(labels_dir, 'train')
    label_test_path = os.path.join(labels_dir, 'test')
    label_val_path = os.path.join(labels_dir, 'val')
 
    mkdir(images_dir);
    mkdir(labels_dir);
    mkdir(img_train_path);
    mkdir(img_test_path);
    mkdir(img_val_path);
    mkdir(label_train_path);
    mkdir(label_test_path);
    mkdir(label_val_path);
 
    # 数据集划分比例,训练集75%,验证集15%,测试集15%,按需修改
    train_percent = 0.8
    val_percent = 0.1
    test_percent = 0.1
 
    total_txt = os.listdir(txt_dir)
    num_txt = len(total_txt)
    list_all_txt = range(num_txt)  # 范围 range(0, num)
 
    num_train = int(num_txt * train_percent)
    num_val = int(num_txt * val_percent)
    num_test = num_txt - num_train - num_val
 
    train = random.sample(list_all_txt, num_train)
    # 在全部数据集中取出train
    val_test = [i for i in list_all_txt if not i in train]
    # 再从val_test取出num_val个元素,val_test剩下的元素就是test
    val = random.sample(val_test, num_val)
 
    print("训练集数目:{}, 验证集数目:{},测试集数目:{}".format(len(train), len(val), len(val_test) - len(val)))
    for i in list_all_txt:
        name = total_txt[i][:-4]
        name = total_txt[i][:-5]
 
        srcImage = os.path.join(image_dir, name + '.png')
        srcLabel = os.path.join(txt_dir, name + '.json')
 
        if i in train:
            dst_train_Image = os.path.join(img_train_path, name + '.png')
            dst_train_Label = os.path.join(label_train_path, name + '.json')
            shutil.copyfile(srcImage, dst_train_Image)
            shutil.copyfile(srcLabel, dst_train_Label)
        elif i in val:
            dst_val_Image = os.path.join(img_val_path, name + '.png')
            dst_val_Label = os.path.join(label_val_path, name + '.json')
            shutil.copyfile(srcImage, dst_val_Image)
            shutil.copyfile(srcLabel, dst_val_Label)
        else:
            dst_test_Image = os.path.join(img_test_path, name + '.png')
            dst_test_Label = os.path.join(label_test_path, name + '.json')
            shutil.copyfile(srcImage, dst_test_Image)
            shutil.copyfile(srcLabel, dst_test_Label)
 
 
if __name__ == '__main__':
    """
    python split_datasets.py --image-dir my_datasets/color_rings/imgs --txt-dir my_datasets/color_rings/txts --save-dir my_datasets/color_rings/train_data
    """
    parser = argparse.ArgumentParser(description='split datasets to train,val,test params')
    parser.add_argument('--image-dir', type=str,default='datasets/D0002/JPEGImages', help='image path dir')
    parser.add_argument('--txt-dir', type=str,default='datasets/D0002/labelme' , help='txt path dir')
    parser.add_argument('--save-dir', default='datasets/D0002/split',type=str, help='save dir')
    args = parser.parse_args()
    image_dir = args.image_dir
    txt_dir = args.txt_dir
    save_dir = args.save_dir
 
    main(image_dir, txt_dir, save_dir)

将数据集分割得到训练集数目:5109, 验证集数目:638,测试集数目:640 

数据转换

下载labelme转换格式时需要使用到其中的文件:

git clone https://github.com/wkentaro/labelme.git

转COCO格式需要用到这个文件:labelme2coco.py

转VOC格式需要用到这个文件:labelme2voc.py

本篇以COCO格式为例,VOC同理

创建一个labels.txt

参考labelme实例分割的labels.txt创建一个labels.txt文件

__ignore__
_background_
wheat

 前面两行即使没有标注,也是需要的

注意:这里的类别1类别2在实际应用的时候最好不要使用中文,否则可能会出现转换失败的情况

 python ./labelme2coco.py <labelled_data_folder> <out_folder> --labels labels.txt

<labelled_data_folder>就是存放标注数据json文件的文件夹
<out_folder>就是输出的路径,不存在的话会自动创建,存在的话会强制对出程序

因为标注数据时labelme已经将图片数据转为字节流数据保存到json文件中imageData字段,在转换时,会将字节流数据保存为jpg放到<out_folder>/JPEGImages下,会将标注数据可视化保存到<out_folder>/Visualization下,转换后的COCO格式的数据在<out_folder>/annotations.json

训练时,需要用到<out_folder>/JPEGImages和<out_folder>/annotations.json

如果不需要可视化结果可以在上面的命令后面添加--noviz

配置准备


以 YOLOv5 算法为例,考虑到用户显存和内存有限,我们需要修改一些默认训练参数来让大家愉快的跑起来,核心需要修改的参数如下

YOLOv5 是 Anchor-Based 类算法,不同的数据集需要自适应计算合适的 Anchor

默认配置是 8 卡,每张卡 batch size 为 16,现将其改成单卡,每张卡 batch size 为 4

原则上 batch size 改变后,学习率也需要进行线性缩放,但是实测发现不需要

具体操作为在 configs/yolov5/ins_seg 文件夹下新建 yolov5_ins_s-v61_syncbn_fast_8xb16-300e_wheat_instance.py 配置文件(为了方便大家直接使用,我们已经提供了该配置),并把以下内容复制配置文件中。

_base_ = './yolov5_ins_s-v61_syncbn_fast_8xb16-300e_coco_instance.py'  # noqa
 
data_root = 'D0002/split/'
# 训练集标注路径
train_ann_file = 'train.json'
train_data_prefix = 'train/'  # 训练集图片路径
# 测试集标注路径
val_ann_file = 'val.json'
val_data_prefix = 'val/'  # 验证集图片路径
metainfo = {
    'classes': ('wheat', ), # 数据集类别名称
    'palette': [
        (220, 20, 60),
    ]
}
num_classes = 1
# 批处理大小batch size设置为 4
train_batch_size_per_gpu = 4
# dataloader 加载进程数
train_num_workers = 2
log_interval = 1
#####################
train_dataloader = dict(
    batch_size=train_batch_size_per_gpu,
    num_workers=train_num_workers,
    dataset=dict(
        data_root=data_root,
        metainfo=metainfo,
        data_prefix=dict(img=train_data_prefix),
        ann_file=train_ann_file))
val_dataloader = dict(
    dataset=dict(
        data_root=data_root,
        metainfo=metainfo,
        data_prefix=dict(img=val_data_prefix),
        ann_file=val_ann_file))
test_dataloader = val_dataloader
val_evaluator = dict(ann_file=data_root + val_ann_file)
test_evaluator = val_evaluator
default_hooks = dict(logger=dict(interval=log_interval))
#####################
 
model = dict(bbox_head=dict(head_module=dict(num_classes=num_classes)))
visualizer = dict(vis_backends = [dict(type='LocalVisBackend'), dict(type='WandbVisBackend')])


 以上配置从 yolov5_ins_s-v61_syncbn_fast_8xb16-300e_coco_instance.py 中继承,并根据 GWHIS数据的特点更新了 data_root、metainfo、train_dataloader、val_dataloader、num_classes 等配置。

模型训练

运行训练命令便可以在命令行中提示的网页链接中看到 loss、学习率和 coco/bbox_mAP 等数据可视化了。本次训练在 4090 laptop显卡上进行250echo,整个训练过程大概需要 2d 19h 31m 。

python tools/train.py configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_wheat_instance.py

在命令行中提示的网页链接中看到 loss、学习率和 coco/bbox_mAP 等数据可视化 

 

模型测试

python tools/test.py configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_wheat_instance.py  work_dirs/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_wheat_instance/best_coco_bbox_mAP_epoch_250.pth  --show-dir show_results

best_coco_bbox_mAP_epoch_300.pth每次训练结果不一样,需要修改为实际的. 

运行以上测试命令, 你不仅可以得到模型训练部分所打印的 AP 性能,还可以将推理结果图片自动保存至 work_dirs/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_wheat_instance/{timestamp}/show_results 文件夹中。下面为其中一张结果图片,左图为实际标注,右图为模型推理结果。
                        

                      
参考链接:

labelme标注实例实例分割数据并转为COCO格式/VOC格式_实例分割标注-CSDN博客

MMYOLO 实例分割balloon demo-CSDN博客

  • 30
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Labelme是一个用于制作语义分割数据集的工具。通过Labelme,用户可以将图像中的不同对象进行标注,并生成对应的语义分割数据集。语义分割数据集通常包含原始图像及其对应的标注信息,用于训练和评估深度学习模型。 在使用Labelme制作语义分割数据集时,通常需要按照一定的目录结构组织数据。例如,将标注完的原始图像放在一个名为"before"的文件夹中,并将每张图像的标注信息保存为对应的JSON文件。此外,还可以使用名为"class_name.txt"的文件来记录语义信息,以便后续的数据格式转换和使用。这些语义信息通常与Labelme中的标注相对应。 对于制作语义分割数据集,还可以使用Unet等模型来生成语义分割结果,用于上游任务。需要注意的是,制作语义分割数据集需要仔细标注和处理,以确保数据的准确性和可用性。 总结起来,Labelme是一种用于制作语义分割数据集的工具,可以通过标注图像和生成对应的标注信息来帮助用户创建自己的语义分割数据集。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [用labelme制作自己的语义分割数据集](https://blog.csdn.net/weixin_44021446/article/details/107283615)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【语义分割数据集制作】使用labelme制作自己的U-net语义分割数据集](https://blog.csdn.net/qq_38981285/article/details/122534131)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值