Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >mask rcnn训练自己的数据集_fasterrcnn训练自己的数据集

mask rcnn训练自己的数据集_fasterrcnn训练自己的数据集

作者头像
全栈程序员站长
发布于 2022-09-23 03:15:35
发布于 2022-09-23 03:15:35
84300
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

这篇博客是 基于 Google Colab 的 mask rcnn 训练自己的数据集(以实例分割为例)文章中 数据集的制作 这部分的一些补充

温馨提示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
实例分割是针对同一个类别的不同个体或者不同部分之间进行区分
我的任务是对同一个类别的不同个体进行区分,在标注的时候,不同的个体需要设置不同的标签名称

在进行标注的时候不要勾选 labelme 界面左上角 File 下拉菜单中的 Stay With Images Data 选项
否则生成的json会包含 Imagedata 信息(是很长的一大串加密的软链接),会占用很大的内存

1.首先要人为划分训练集和测试集(图片和标注文件放在同一个文件夹里面)

2.在同级目录下新建一个 labels.txt 文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
__ignore__
__background__
seedling #根据自己的实际情况更改

3.在datasets目录下新建 seed_trainseed_val 两个文件夹

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
分别存放的训练集和测试集图片和整合后的标签文件
seed_train 
seed_val

把整合后的标签文件剪切复制到同级目录下
seed_train_annotation.josn
seed_val_annotation.json

完整代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
说明:
一次只能操作一个文件夹,也就是说:
训练集生成需要执行一次代码
测试集生成就需要更改路径之后再执行一次代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import argparse
import collections
import datetime
import glob
import json
import os
import os.path as osp
import sys
import uuid
import time

import imgviz
import numpy as np

import labelme

try:
    import pycocotools.mask
except ImportError:
    print("Please install pycocotools:\n\n pip install pycocotools\n")
    sys.exit(1)

#https://github.com/pascal1129/kaggle_airbus_ship_detection/blob/master/0_rle_to_coco/1_ships_to_coco.py

def main():
    parser = argparse.ArgumentParser(description="json2coco")
    #原始json文件保存的路径
    parser.add_argument("--input_dir", help="input annotated directory",default="E:/Deep_learning/seed-mask/data/seed/seed_train")
    #整合后的json文件保存的路径
    parser.add_argument("--output_dir", help="output dataset directory",default="E:/Deep_learning/seed-mask/data/seed/datasets/seed_train")
    parser.add_argument("--labels", help="labels file", default='E:/Deep_learning/seed-mask/data/seed/labels.txt')#required=True
    parser.add_argument( "--noviz", help="no visualization", action="store_true" ,default="--noviz")
    args = parser.parse_args()

    now = datetime.datetime.now()
    start= time.time()

    data = dict(
        info=dict(
            description="seedling datasets",
            url=None,
            version="label=4.5.6",
            year=now.year,
            contributor=None,
            date_created=now.strftime("%Y-%m-%d %H:%M:%S.%f"),
        ),
        #licenses=[dict(url=None, id=0, name=None,)],
        images=[
            # license, url, file_name, height, width, date_captured, id
        ],
        type="instances",
        annotations=[
            # segmentation, area, iscrowd, image_id, bbox, category_id, id
        ],
        categories=[
            # supercategory, id, name
        ],
    )

    class_name_to_id = { 
   }
    for i, line in enumerate(open(args.labels).readlines()):
        class_id = i - 1  # starts with -1
        class_name = line.strip()
        if class_id == -1:
            assert class_name == "__ignore__"
            continue
        if class_id == 0:
            assert class_name == "__background__"
            continue        
        class_name_to_id[class_name] = class_id
        #print(class_id,class_name,'\n')
        data["categories"].append(
            dict(supercategory="seedling", id=class_id, name=class_name,)#一类目标+背景,id=0表示背景
        )
    print("categories 生成完成",'\n')

    out_ann_file = osp.join(args.output_dir, "seed_train_anno.json")#自动添加"/" 这里要改 
    
    
    label_files = glob.glob(osp.join(args.input_dir, "*.json"))#图像id从json文件中读取
    for image_id, filename in enumerate(label_files):
        print(image_id, filename)
        #print("Generating dataset from:", filename)

        label_file = labelme.LabelFile(filename=filename)

        base = osp.splitext(osp.basename(filename))[0]#图片名
        out_img_file = osp.join(args.output_dir, base + ".jpg")# 保存图片路径

        img = labelme.utils.img_data_to_arr(label_file.imageData)
        imgviz.io.imsave(out_img_file, img)
        data["images"].append(
            dict(
                #license=0,
                #url=None,
                file_name=osp.relpath(out_img_file, osp.dirname(out_ann_file)),
                height=img.shape[0],
                width=img.shape[1],
                #date_captured=None,
                id=image_id,
            )
        )

        masks = { 
   }  # for area
        segmentations = collections.defaultdict(list)  # for segmentation
        for shape in label_file.shapes:
            points = shape["points"]
            label = shape["label"]
            group_id = shape.get("group_id")
            shape_type = shape.get("shape_type", "polygon")
            mask = labelme.utils.shape.shape_to_mask(img.shape[:2], points, shape_type)#labelme=4.5.6的shape_to_mask函数
            if group_id is None:
                group_id = uuid.uuid1()

            instance = (label, group_id)
            #print(instance)

            if instance in masks:
                masks[instance] = masks[instance] | mask
            else:
                masks[instance] = mask

            if shape_type == "rectangle":
                (x1, y1), (x2, y2) = points
                x1, x2 = sorted([x1, x2])
                y1, y2 = sorted([y1, y2])
                points = [x1, y1, x2, y1, x2, y2, x1, y2]
            else:
                points = np.asarray(points).flatten().tolist()

            segmentations[instance].append(points)
        segmentations = dict(segmentations)

        for instance, mask in masks.items():            
            cls_name, group_id = instance
# if cls_name not in class_name_to_id:
# continue
# cls_id = class_name_to_id[cls_name]

            mask = np.asfortranarray(mask.astype(np.uint8))
            
            mask = pycocotools.mask.encode(mask)
            
            area = float(pycocotools.mask.area(mask))
            bbox = pycocotools.mask.toBbox(mask).flatten().tolist()
            

            data["annotations"].append(
                dict(
                    id=len(data["annotations"]),
                    image_id=image_id,
                    category_id=1,#都是1类cls_id
                    segmentation=segmentations[instance],
                    area=area,
                    bbox=bbox,
                    iscrowd=0,
                )
            )
    
    print("annotations 生成完成",'\n')

# if not args.noviz:
# labels, captions, masks = zip(
# *[
# (class_name_to_id[cnm], cnm, msk)
# for (cnm, gid), msk in masks.items()
# if cnm in class_name_to_id
# ]
# )
# viz = imgviz.instances2rgb(
# image=img,
# labels=labels,
# masks=masks,
# captions=captions,
# font_size=15,
# line_width=2,
# )
# out_viz_file = osp.join(
# args.output_dir, "Visualization", base + ".jpg"
# )
# imgviz.io.imsave(out_viz_file, viz)
    
    with open(out_ann_file, "w") as f:
        json.dump(data, f,indent = 2)
        
    cost_time =(time.time()-start)/1000
    print("cost_time:{:.2f}s".format(cost_time) )


if __name__ == "__main__":
    main()

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/172437.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
mask rcnn训练自己的数据集
最近迷上了mask rcnn,也是由于自己工作需要吧,特意研究了其源代码,并基于自己的数据进行训练~
3D视觉工坊
2020/12/11
2.6K0
mask rcnn训练自己的数据集
mask rcnn实现教程
链接:https://pan.baidu.com/s/1htJYyNy 密码:0r2b
全栈程序员站长
2022/11/09
6720
mask rcnn实现教程
妙啊!MMDetection 训练自定义数据集
上一篇讲到如何安装MMDetection,今天要分享如何使用 MMDetection 训练自定义数据集,其实非常简单!
AI算法与图像处理
2021/03/14
2.2K0
手把手教你训练自己的Mask R-CNN图像实例分割模型(PyTorch官方教程)
关于Mask R-CNN的详细理论说明,可以参见原作论文https://arxiv.org/abs/1703.06870,网上也有大量解读的文章。本篇博客主要是参考了PyTorch官方给出的训练教程,将如何在自己的数据集上训练Mask R-CNN模型的过程记录下来,希望能为感兴趣的读者提供一些帮助。
全栈程序员站长
2022/09/23
4K1
手把手教你训练自己的Mask R-CNN图像实例分割模型(PyTorch官方教程)
labelme标注的数据分析[通俗易懂]
注:每个对象对应一个mask(图中2个对象,对应2个mask),左边的猫标记为cat_1,右边的标记为cat_2
全栈程序员站长
2022/10/01
1.8K0
labelme标注的数据分析[通俗易懂]
CV -- YOLOv8 图像分割(GPU环境)
https://download.csdn.net/download/2403_83182682/90405543?spm=1001.2014.3001.5503
用户11404404
2025/02/20
1800
CV -- YOLOv8 图像分割(GPU环境)
如何通过labelme标注将json文件转为png的label
2、进入该环境,安装pyqt5和labelme,labelme要求3.3.1的版本
Albert_xiong
2021/06/21
5.4K0
如何通过labelme标注将json文件转为png的label
基于YOLOv8的晶体管定位识别(pose),从数据集标注到训练手把手教程
💡💡💡本文解决什么问题:教会你如何用晶体管从标注到训练Yolov8-pose关键点检测
AI小怪兽
2024/01/22
1.8K4
yolo-world 源码解析(三)
ApacheCN_飞龙
2024/03/09
3990
【图像分割】LabelMe基本使用/标注标签格式转换及可视化
之前一直在做目标检测的相关内容,使用LabelImg标注检测数据轻车熟路。不过最近尝试探索一下图像分割场景,需要用到LabelMe标注用于分割的数据标签,本文进行过程记录。
zstar
2023/04/27
9.2K0
【图像分割】LabelMe基本使用/标注标签格式转换及可视化
Mask Rcnn目标分割-训练自己数据集-详细步骤[通俗易懂]
本文接着介绍了Mask Rcnn目标分割算法如何训练自己数据集,对训练所需的文件以及训练代码进行详细的说明。
全栈程序员站长
2022/11/09
4.1K1
Mask Rcnn目标分割-训练自己数据集-详细步骤[通俗易懂]
【目标检测】MMDetection的安装与基础使用
MMDetection是商汤和港中文大学针对目标检测任务推出的一个开源工具包,统一标准化了很多前沿模型,为研究者复现代码提供了便利。本篇就来尝试安装一下MMDetection并简单跑一下官方的示例教程。
zstar
2022/09/23
2.4K0
【目标检测】MMDetection的安装与基础使用
Python的Albumentations库
对 ImageNet validation set 中的前 2000 张图片进行处理,采用 Intel Core i7-7800X CPU. 不同数据增强库的处理速度对比(以秒为单位,时间越少越好).
狼啸风云
2021/05/13
2.3K0
Python的Albumentations库
U-NET 图像预处理
首先将图像格式及大小、类型、名称 做出调整 这里将 bmp 转为 png 大小统一为 500*500, 按照数字序号命名
用户1148525
2021/12/07
5460
【Yolov5】1.认真总结6000字Yolov5保姆级教程[通俗易懂]
1.集成的资源我放在了文末,包括我自己做成的成品,可以直接train与detect。我发在百度网盘上。
全栈程序员站长
2022/07/23
7.9K1
【Yolov5】1.认真总结6000字Yolov5保姆级教程[通俗易懂]
实战 | 基于YOLOv9+SAM实现动态目标检测和分割(步骤 + 代码)
本文主要介绍基于YOLOv9+SAM实现动态目标检测和分割,并给出详细步骤和代码。
Color Space
2024/04/12
2.6K0
实战 | 基于YOLOv9+SAM实现动态目标检测和分割(步骤 + 代码)
MMDetection全流程实战指南:手把手带你构建目标检测模型
MMDetection 是一个由 OpenMMLab 开发的开源目标检测工具箱,基于 PyTorch 实现。该库提供了丰富的目标检测算法,包括经典的 Faster R-CNN、YOLO 和最新的一些研究成果,非常方便于研究者和工程师进行模型的训练和推理。具有高度模块化和可扩展性的设计,使得用户可以非常灵活地进行个性化配置和二次开发。这一工具箱已经成为目标检测领域的事实标准之一,被广泛应用于学术研究和产业界。
OpenMMLab 官方账号
2023/12/13
15K5
MMDetection全流程实战指南:手把手带你构建目标检测模型
yolo-world 源码解析(四)
For pre-training YOLO-World, we adopt several datasets as listed in the below table:
ApacheCN_飞龙
2024/03/09
3810
实现labelme批量json_to_dataset方法
labelme可以帮助我们快速的实现Mask-RCNN中数据集json文件的生成,然而还需要我们进一步的将json转成dataset,可以直接在cmd中执行labelme_json_to_dataset.exe C:\Users\Administrator\Desktop\total\1.json(路径),但是这个过程需要我们一个json文件的生成,过程很慢。
全栈程序员站长
2022/10/01
1.7K0
实现labelme批量json_to_dataset方法
【MMDetection 超全专栏】二,配置类和注册器&数据处理&训练pipline
配置方式支持python/json/yaml,从mmcv的Config解析,其功能同maskrcnn-benchmark的yacs类似,将字典的取值方式属性化.这里贴部分代码,以供学习。
BBuf
2020/06/04
2.5K0
推荐阅读
相关推荐
mask rcnn训练自己的数据集
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验