实例分割
实例分割数据的标注推荐使用LabelMe标注工具。
准备工作
- 将收集的图像存放于JPEGImages文件夹下,例如存储在D:\MyDataset\JPEGImages
- 创建与图像文件夹相对应的文件夹Annotations,用于存储标注的json文件,如D:MyDataset\Annotations
- 打开LabelMe,点击”Open Dir“按钮,选择需要标注的图像所在的文件夹打开,则”File List“对话框中会显示所有图像所对应的绝对路径,接着便可以开始遍历每张图像,进行标注工作
目标边缘标注
- 打开多边形标注工具(右键菜单->Create Polygon)以打点的方式圈出目标的轮廓,并在弹出的对话框中写明对应label(当label已存在时点击即可,此处请注意label勿使用中文),具体如下提所示,当框标注错误时,可点击左侧的“Edit Polygons”再点击标注框,通过拖拉进行修改,也可再点击“Delete Polygon”进行删除。
- 点击右侧”Save“,将标注结果保存到中创建的文件夹Annotations目录中
格式转换
LabelMe标注后的数据还需要进行转换为MSCOCO格式,才可以用于实例分割任务的训练,创建保存目录D:\dataset_seg,在python环境中安装paddlex后,使用如下命令即可
paddlex --data_conversion --source labelme --to MSCOCO \
--pics D:\MyDataset\JPEGImages \
--annotations D:\MyDataset\Annotations \
--save_dir D:\dataset_coco
数据集划分
转换完数据后,为了进行训练,还需要将数据划分为训练集、验证集和测试集,同样在安装paddlex后,使用如下命令即可将数据划分为70%训练集,20%验证集和10%的测试集
paddlex --split_dataset --format COCO --dataset_dir D:\MyDataset --val_value 0.2 --test_value 0.1
执行上面命令行,会在D:\MyDataset下生成train.json, val.json, test.json,分别存储训练样本信息,验证样本信息,测试样本信息
import paddlex as pdx
from paddlex import transforms as T
#数据格式转换 labelme-->MSCOCO
#paddlex --data_conversion --source labelme --to MSCOCO --pics holder\JPEGImages --annotations holder\Annotations --save_dir holder-coco
#数据集划分
#paddlex --split_dataset --format COCO --dataset_dir D:\MyDataset --val_value 0.2 --test_value 0.1
# 输出推理模型
# paddlex -export_inference --model_dir best_model --save_dir inference
# 定义训练和验证时的transforms
# API说明:https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/apis/transforms/transforms.md
train_transforms = T.Compose([
T.RandomResizeByShort(
short_sizes=[640, 672, 704, 736, 768, 800],
max_size=1333,
interp='CUBIC'), T.RandomHorizontalFlip(), T.Normalize(
mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
eval_transforms = T.Compose([
T.ResizeByShort(
short_size=800, max_size=1333, interp='CUBIC'), T.Normalize(
mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
# 定义训练和验证所用的数据集
# API说明:https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/apis/datasets.md
train_dataset = pdx.datasets.CocoDetection(
data_dir='holder-coco/JPEGImages',
ann_file='holder-coco/train.json',
transforms=train_transforms,
shuffle=True)
eval_dataset = pdx.datasets.CocoDetection(
data_dir='holder-coco/JPEGImages',
ann_file='holder-coco/val.json',
transforms=eval_transforms)
# 初始化模型,并进行训练
# 可使用VisualDL查看训练指标,参考https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/train/visualdl.md
num_classes = len(train_dataset.labels)
model = pdx.det.MaskRCNN(
num_classes=num_classes, backbone='ResNet50', with_fpn=True)
# API说明:https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/apis/models/instance_segmentation.md
# 各参数介绍与调整说明:https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/parameters.md
model.train(
num_epochs=12,
train_dataset=train_dataset,
train_batch_size=1,
eval_dataset=eval_dataset,
pretrain_weights='COCO',
learning_rate=0.00125,
lr_decay_epochs=[8, 11],
warmup_steps=10,
warmup_start_lr=0.0,
save_dir='output/mask_rcnn_r50_fpn',
use_vdl=True)
import paddlex as pdx
import cv2
import os
#os.environ["CUDA_VISIBLE_DEVICES"]="0,1"
predictor=pdx.deploy.Predictor("output/mask_rcnn_r50_fpn-holder/inference_model",use_gpu=True)
image_name="holder/holder-test1.jpg"
img=cv2.imread(image_name)
result=predictor.predict(img)
#print(result)
vis_img=pdx.det.visualize(img,result,threshold=0.5,save_dir=None)
cv2.imshow("result",vis_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
本文暂时没有评论,来添加一个吧(●'◡'●)