论文复现——Mask Transfiner for High-Quality Instance Segmentation

这篇博客详细介绍了如何利用TransFiner进行目标检测任务的数据预处理,包括使用Labelme标注数据,转换为COCO格式,配置环境,注册数据集到Detectron2,并提供了训练和验证的步骤。此外,还展示了训练和验证过程。
摘要由CSDN通过智能技术生成

论文地址:https://arxiv.org/abs/2111.13673
代码地址:https://github.com/SysCV/transfiner

一、 数据集预处理

1.标注数据集(labelme)

①安装labelme

pip install labelme#提前配置好环境

②按照如下目录格式准备数据

├── img_data: 存放你要标注的所有图片
├── data_annotated: 存放后续标注好的所有json文件
└── label.txt: 所有类别信息

③创建label.txt,内容如下:

__ignore__
_background_
car

④启动labelme并读取标签文件

labelme --labels label.txt

将img_data文件夹在labelme中打开,选择Create Polygonts绘制多边形和Create rectangle绘制矩形,将生成的json标签保存在data_annotated中。
在这里插入图片描述

2.将数据集转化为coco格式

将图片和标签按照一定比例分为训练集和验证集
运行下面的代码,得到coco格式的标签

python labelme2voc.py data_annotated data_dataset_coco --labels label.txt

最终数据集目录如下:
在这里插入图片描述

3.环境配置

conda create -n transfiner python=3.7 -y
conda activate transfiner
conda install pytorch==1.7.1 torchvision==0.8.2 torchaudio==0.7.2 cudatoolkit=11.0 -c pytorch
# Coco api and visualization dependencies
pip install ninja yacs cython matplotlib tqdm
pip install opencv-python==4.4.0.40
# Boundary dependency
pip install scikit-image
pip install kornia==0.5.11
export INSTALL_DIR=$PWD
# install pycocotools. Please make sure you have installed cython.
cd $INSTALL_DIR
git clone https://github.com/cocodataset/cocoapi.git
cd cocoapi/PythonAPI
python setup.py build_ext install
# install transfiner
cd $INSTALL_DIR
git clone --recursive https://github.com/SysCV/transfiner.git
cd transfiner/
python3 setup.py build develop
unset INSTALL_DIR

4.在detectron2注册数据集

首先将数据集文件夹datasets移动到transfiner文件夹下
在transfiner/tools/train_net.py中增添以下代码,将car数据集注册到detectron2中

from detectron2.data import DatasetCatalog, MetadataCatalog
from detectron2.data.datasets.coco import load_coco_json
import pycocotools
os.environ['CUDA_VISIBLE_DEVICES'] = '1'
CLASS_NAMES = ["_background_", "car"]
DATASET_ROOT = '/home/zl/myprojects/transfiner/datasets/car'
ANN_ROOT = os.path.join(DATASET_ROOT, 'COCOformat')
TRAIN_PATH = DATASET_ROOT
VAL_PATH = DATASET_ROOT
TRAIN_JSON = os.path.join(ANN_ROOT, 'train.json')
VAL_JSON = os.path.join(ANN_ROOT, 'val.json')
PREDEFINED_SPLITS_DATASET = {
    "coco_my_train": (TRAIN_PATH, TRAIN_JSON),
    "coco_my_val": (VAL_PATH, VAL_JSON),
}


def plain_register_dataset():
    # 训练集
    DatasetCatalog.register(
        "coco_my_train", lambda: load_coco_json(TRAIN_JSON, TRAIN_PATH))
    MetadataCatalog.get("coco_my_train").set(thing_classes=CLASS_NAMES,
                                             evaluator_type='coco',
                                             json_file=TRAIN_JSON,
                                             image_root=TRAIN_PATH)
    # 验证/测试集
    DatasetCatalog.register(
        "coco_my_val", lambda: load_coco_json(VAL_JSON, VAL_PATH))
    MetadataCatalog.get("coco_my_val").set(thing_classes=CLASS_NAMES,
                                           evaluator_type='coco',
                                           json_file=VAL_JSON,
                                           image_root=VAL_PATH)
# def setup(args):
#     """
#     Create configs and perform basic setups.
#     """
#     cfg = get_cfg()
#     cfg.merge_from_file(args.config_file)
#     cfg.merge_from_list(args.opts)
#     cfg.freeze()
#     default_setup(cfg, args)
#     return cfg
def setup(args):
    """
    Create configs and perform basic setups.
    """
    cfg = get_cfg()
    args.config_file = "configs/transfiner/mask_rcnn_R_50_FPN_1x.yaml"
    cfg.merge_from_file(args.config_file)   # 从config file 覆盖配置
    cfg.merge_from_list(args.opts)          # 从CLI参数 覆盖配置

    # 更改配置参数
    cfg.DATASETS.TRAIN = ("coco_my_train",)  # 训练数据集名称
    cfg.DATASETS.TEST = ("coco_my_val",)
    cfg.DATALOADER.NUM_WORKERS = 4  # 单线程

    cfg.INPUT.CROP.ENABLED = True
    cfg.INPUT.MAX_SIZE_TRAIN = 4090  # 训练图片输入的最大尺寸
    cfg.INPUT.MAX_SIZE_TEST = 4090  # 测试数据输入的最大尺寸
    cfg.INPUT.MIN_SIZE_TRAIN = (512, 768)  # 训练图片输入的最小尺寸,可以设定为多尺度训练
    cfg.INPUT.MIN_SIZE_TEST = 640
    # cfg.INPUT.MIN_SIZE_TRAIN_SAMPLING,其存在两种配置,分别为 choice 与 range :
    # range 让图像的短边从 512-768随机选择
    # choice : 把输入图像转化为指定的,有限的几种图片大小进行训练,即短边只能为 512或者768
    cfg.INPUT.MIN_SIZE_TRAIN_SAMPLING = 'range'
#  本句一定要看下注释!!!!!!!!
    # 类别数+1(因为有background,也就是你的 cate id 从 1 开始,如果您的数据集Json下标从 0 开始,这个改为您对应的类别就行,不用再加背景类!!!!!)
    cfg.MODEL.RETINANET.NUM_CLASSES = 2
    # cfg.MODEL.WEIGHTS="/home/yourstorePath/.pth"
    # cfg.MODEL.WEIGHTS = "/home/zl/myprojects/transfiner/pretrained_model/output_1x_transfiner_r50.pth"    # 预训练模型权重
    # batch_size=2; iters_in_one_epoch = dataset_imgs/batch_size
    cfg.SOLVER.IMS_PER_BATCH = 4

    # 根据训练数据总数目以及batch_size,计算出每个epoch需要的迭代次数
    # 9000为你的训练数据的总数目,可自定义
    ITERS_IN_ONE_EPOCH = int(500 / cfg.SOLVER.IMS_PER_BATCH)

    # 指定最大迭代次数
    cfg.SOLVER.MAX_ITER = (ITERS_IN_ONE_EPOCH * 12) - 1  # 12 epochs,
    # 初始学习率
    cfg.SOLVER.BASE_LR = 0.002
    # 优化器动能
    cfg.SOLVER.MOMENTUM = 0.9
    # 权重衰减
    cfg.SOLVER.WEIGHT_DECAY = 0.0001
    cfg.SOLVER.WEIGHT_DECAY_NORM = 0.0
    # 学习率衰减倍数
    cfg.SOLVER.GAMMA = 0.1
    # 迭代到指定次数,学习率进行衰减
    cfg.SOLVER.STEPS = (7000,)
    # 在训练之前,会做一个热身运动,学习率慢慢增加初始学习率
    cfg.SOLVER.WARMUP_FACTOR = 1.0 / 1000
    # 热身迭代次数
    cfg.SOLVER.WARMUP_ITERS = 1000

    cfg.SOLVER.WARMUP_METHOD = "linear"
    # 保存模型文件的命名数据减1
    cfg.SOLVER.CHECKPOINT_PERIOD = ITERS_IN_ONE_EPOCH - 1

    # 迭代到指定次数,进行一次评估
    cfg.TEST.EVAL_PERIOD = ITERS_IN_ONE_EPOCH
    #cfg.TEST.EVAL_PERIOD = 100

    # cfg.merge_from_file(args.config_file)
    # cfg.merge_from_list(args.opts)
    cfg.freeze()
    default_setup(cfg, args)
    return cfg

二、 训练

cd transfiner
python train_net.py --num-gpus 1

训练过程如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、 验证

1.定量

python tools/train_net.py --num-gpu 1 --eval-only MODEL.WEIGHTS /home/zl/myprojects/transfiner/output_r50_1x/best.pth

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.定性

预测图片1
gt1
预测图片2
gt2

### 回答1: Deep Snake是一种用于实时实例分割的算法。它基于深度学习技术,通过对图像中的每个像素进行分类,实现对目标物体的精确分割。Deep Snake算法具有高效性和准确性,可以应用于许多领域,如自动驾驶、医学影像分析等。 ### 回答2: DeepSnake是一个用于实时实例分割的新型神经网络模型。与传统的基于卷积神经网络(CNN)的实例分割方法不同,DeepSnake使用自适应的密集曲线组件,来更好地关注目标对象的形状特征,从而实现更精确的分割结果。 DeepSnake的设计基于一种称为“变形回归”的曲线回归方法。该方法使用两个CNN分支,来分别处理图像区域和曲线参数,然后将它们组合起来进行端到端的训练。其中,图像分支出自用于目标检测任务的ResNet,而曲线分支则采用了U-Net结构。 DeepSnake的优点在于可以克服目标形状多样性和大小变化等问题,能够适应各种不同的数据集,并且在计算效率上具有很高的实时性。与一些竞争的实例分割算法相比,DeepSnake在准确率和速度上都有不错的表现。在PASCAL VOC 2012和COCO 2017数据集上测试,DeepSnake的性能超过了相同条件下的大多数算法,同时具有更低的计算成本。 总之,DeepSnake为实时实例分割任务提供了一种创新的方法,可以应用于许多领域,如智能监控、自动驾驶和机器人导航等。 ### 回答3: Deep Snake是一种用于实时实例分割的新型神经网络架构,由来自华盛顿大学的研究团队开发。与目前主流的神经网络架构Mask R-CNN相比,Deep Snake的优势在于能够更加准确地分割物体,同时在速度和计算资源消耗方面表现更好。 具体来说,Deep Snake使用了一种名为“蛇形控制器”的新型机制来协调具有各自目标的多个神经元。这种机制使得网络在提取图像中物体的轮廓信息时更加准确。Deep Snake还采用了特殊的分组卷积层,用于在不同的尺度上提取特征,以更好地分割物体。 此外,Deep Snake还可以使用相对较少的内存和计算资源,快速运行实例分割任务。研究者使用COCO数据集进行了实验,结果表明Deep Snake在准确率和速度方面都优于Mask R-CNN。在单个Nvidia 1080Ti GPU上,Deep Snake可以实现每秒5.7帧的实时实例分割,准确率高达33.6%。 总的来说,Deep Snake是一种非常有潜力的神经网络架构,可用于实时实例分割。它不仅可以提高准确性,还可以节省计算资源和实现更快的运行速度。未来,深度学习的研究者将继续探索和改进这种架构,以满足不断发展的实时实例分割需求。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值