度小熊分割---PaddleX之Mask RCNN实例分割

用PaddleX中的Mask RCNN快速实现实例分割训练

比赛的链接:aistudio.baidu.com/aistudio/co…

PaddleX 1.3 版本文档:paddlex.readthedocs.io/zh_CN/relea…

直接使用paddle进行测试

验证飞桨安装

python -c "import paddle;paddle.utils.run_check()"
复制代码

获得下图,则安装成功 image.png

准备工作

用pip install安装paddlex
pip install paddlex==1.3.7 -i https://mirror.baidu.com/pypi/simple
复制代码
用pip install安装pycocotools
pip install pycocotools -i https://mirror.baidu.com/pypi/simple
复制代码
验证PaddleX安装
python -c "import paddlex as pdx;print(pdx.__version__)"
复制代码

获得下图,则安装成功

image.png

飞桨 - PaddleX 是一套更加简明易懂的API,并配套一键下载安装的图形化开发客户端。用PaddleX实现实例分割训练非常快速,代码量也小。

数据的处理

! wget https://bj.bcebos.com/paddlex/datasets/xiaoduxiong_ins_det.tar.gz
! tar xzf xiaoduxiong_ins_det.tar.gz
复制代码

image.png

解压完成,我们进入insert_det中查看下数据

image.png

制造annotations.json

image.png

分割实例

image.png

  • train.json和test.json、val.json(训练图片的路径和分割实例)

其实就是从annotations.json中分割出来的

image.png

image.png

数据展示

我们以其中一个数据为例进行展示

  • 图片数据

image.png

json的数据

{
    "images": [{
            "height": 1008,
            "width": 756,
            "id": 1,
            "file_name": "Xiaoduxiong114.jpeg"
    }],
    "categories": [{
            "supercategory": "component",
            "id": 1,
            "name": "xiaoduxiong"
    }],
    "annotations": [{
            "segmentation": [
                    [544, 224, 515, 250, 506, 275, 506, 285, 498, 289, 502, 299, 508, 308, 521, 334, 541, 348, 580, 338, 592, 349, 626, 366, 638, 374, 650, 364, 650, 354, 636, 348, 642, 340, 650, 344, 664, 334, 664, 328, 652, 322, 630, 304, 619, 300, 621, 295, 635, 294, 645, 285, 635, 276, 622, 278, 619, 251, 600, 232, 564, 221, 558, 209, 546, 209]
            ],         # 多边形的坐标点
            "iscrowd": 0,
            "image_id": 1,    # image_id
            "bbox": [498, 209, 166, 165],     # 物体的矩形框 
            "area": 27390.0,
            "category_id": 1,
            "id": 1
    }, {
            "segmentation": [
                    [294, 340, 301, 369, 292, 395, 271, 409, 256, 412, 252, 422, 244, 430, 235, 420, 210, 409, 186, 388, 178, 369, 168, 368, 160, 348, 176, 345, 191, 314, 214, 296, 248, 298, 246, 285, 256, 274, 266, 279, 269, 284, 288, 271, 290, 256, 306, 271, 304, 279, 309, 286, 316, 275, 334, 286, 329, 300, 315, 309, 325, 320, 310, 330]
            ],
            "iscrowd": 0,
            "image_id": 1,
            "bbox": [160, 256, 174, 174],
            "area": 30276.0,
            "category_id": 1,
            "id": 2
    }, {
            "segmentation": [
                    [190, 538, 171, 512, 136, 511, 112, 521, 95, 516, 80, 520, 84, 531, 88, 542, 84, 579, 88, 608, 81, 619, 88, 630, 101, 628, 111, 624, 145, 640, 178, 625, 189, 611, 200, 611, 199, 594, 220, 599, 241, 596, 255, 600, 264, 600, 268, 579, 251, 578, 248, 571, 266, 569, 270, 555, 266, 551, 239, 550, 216, 550, 199, 555, 209, 545, 205, 530]
            ],
            "iscrowd": 0,
            "image_id": 1,
            "bbox": [80, 511, 190, 129],
            "area": 24510.0,
            "category_id": 1,
            "id": 3
    }, {
            "segmentation": [
                    [404, 440, 419, 425, 449, 418, 469, 425, 480, 435, 491, 421, 504, 425, 504, 432, 526, 426, 539, 420, 548, 430, 548, 436, 535, 444, 534, 456, 549, 452, 558, 464, 552, 470, 529, 481, 536, 494, 522, 499, 501, 495, 484, 525, 464, 538, 430, 535, 428, 545, 411, 542, 406, 536, 409, 524, 392, 499, 390, 461, 386, 442, 390, 435]
            ],
            "iscrowd": 0,
            "image_id": 1,
            "bbox": [386, 418, 171, 128],
            "area": 21888.0,
            "category_id": 1,
            "id": 4
    }, {
            "segmentation": [
                    [339, 674, 321, 648, 292, 644, 266, 649, 262, 651, 252, 642, 242, 651, 244, 662, 234, 690, 232, 712, 238, 732, 225, 748, 234, 760, 249, 754, 281, 768, 315, 766, 335, 739, 358, 749, 372, 740, 372, 732, 401, 736, 405, 716, 388, 712, 385, 702, 404, 701, 405, 686, 401, 681, 362, 678, 356, 669]
            ],
            "iscrowd": 0,
            "image_id": 1,
            "bbox": [225, 642, 180, 125],
            "area": 22500.0,
            "category_id": 1,
            "id": 5
    }, {
            "segmentation": [
                    [588, 589, 592, 578, 601, 572, 625, 539, 641, 548, 635, 560, 649, 569, 655, 559, 672, 568, 651, 594, 671, 599, 659, 618, 646, 624, 650, 660, 626, 696, 612, 702, 606, 721, 592, 722, 585, 711, 585, 705, 549, 691, 534, 666, 521, 664, 516, 652, 529, 635, 538, 605, 558, 589]
            ],
            "iscrowd": 0,
            "image_id": 1,
            "bbox": [516, 539, 156, 184],
            "area": 28704.0,
            "category_id": 1,
            "id": 6
    }]
}
复制代码

PaddleX完成目标检测

  • 程序运行的主路径是data_sets,在此目录下新建一个output的目录

下面是程序的代码

# 设置使用0号GPU卡(如无GPU,执行此代码后仍然会使用CPU训练模型)
import matplotlib
matplotlib.use('Agg') 
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
os.environ['CPU_NUM'] = '1'
import paddlex as pdx

from paddlex.det import transforms
train_transforms = transforms.Compose([
    transforms.RandomHorizontalFlip(),
    transforms.Normalize(),
    transforms.ResizeByShort(short_size=800, max_size=1333),
    transforms.Padding(coarsest_stride=32)
])

eval_transforms = transforms.Compose([
    transforms.Normalize(),
    transforms.ResizeByShort(short_size=800, max_size=1333),
    transforms.Padding(coarsest_stride=32)
])

train_dataset = pdx.datasets.CocoDetection(
    data_dir='xiaoduxiong_ins_det/JPEGImages',
    ann_file='xiaoduxiong_ins_det/train.json',
    transforms=train_transforms,
    shuffle=True)
eval_dataset = pdx.datasets.CocoDetection(
    data_dir='xiaoduxiong_ins_det/JPEGImages',
    ann_file='xiaoduxiong_ins_det/val.json',
    transforms=eval_transforms)

num_classes = len(train_dataset.labels) + 1
model = pdx.det.MaskRCNN(num_classes=num_classes)
model.train(
    num_epochs=100,
    train_dataset=train_dataset,
    train_batch_size=1,
    eval_dataset=eval_dataset,
    learning_rate=0.00125,
    warmup_steps=10,
    lr_decay_epochs=[50, 75],
    save_interval_epochs=1,
    save_dir='output/mask_rcnn_r50_fpn',
    use_vdl=True)
复制代码

观察训练过程

image.png

image.png

我们能看到的信息是这是1个epoch训练完, Finished, Epoch=1, bbox_mmap=0.002621, segm_mmap=0.00663,bbox_map = 0.002621。

第十三个epoch

image.png

我们能看到的信息是这是13个epoch中,训练完,bbox_mmap=0.767631, segm_mmap=0.779919,已经是很高的分数了,模型被存入了最好的模型中了

第十五个epoch

image.png

我们能看到的信息是这是15个epoch中,训练完,[EVAL] Finished, Epoch=15, bbox_map=86.4486,模型被存入了最好的模型中了

第五十六个epoch

image.png

我们能看到的信息是这是100个epoch中,训练完,Current evaluated best model in eval_dataset is epoch_56, bbox_mmap=0.8673965473470424,最佳模型是在第56轮的时候存储的那个模型,最后的bbox_map的值就是0.8673

第一百个epoch

image.png

我们能看到的信息是这是100个epoch中,训练完,Current evaluated best model in eval_dataset is epoch_56, bbox_mmap=0.8673,最佳模型是在第56轮的时候存储的那个模型,最后的bbox_map的值就是0.8673

验证代码

# 模型加载
import paddlex as pdx
model = pdx.load_model('output/mask_rcnn_r50_fpn/best_model')
image_name = 'xiaoduxiong_ins_det/JPEGImages/Xiaoduxiong114.jpeg'
result = model.predict(image_name)
pdx.det.visualize(image_name, result, threshold=0.5, save_dir='./output/mask_rcnn_r50_fpn')
复制代码

比较好的测试结果

image.png

image.png

我们可以看到效果还是比较好的

猜你喜欢

转载自juejin.im/post/7074869721127976990