在本文中,将通过一系列步骤来训练一个自定义的实例分割模型。实例分割是计算机视觉中的一个高级任务,它不仅能够识别图像中的对象,还能精确地描绘出对象的轮廓。这比传统的对象检测更为复杂,因此通常只在需要精确对象轮廓的应用中使用。
如果之前有接触过教学,可能已经训练过自定义的对象检测模型。对象检测的任务是在图像中绘制一个边界框,并对该对象进行分类。而实例分割则是在此基础上进一步绘制出对象的轮廓。由于需要精确的轮廓信息,因此实例分割的建模难度稍高。
在本教程中,使用的是公开的美国手语实例分割数据集,该数据集可以从Roboflow Universe免费下载。可以使用Roboflow的pip包进行下载,前提是需要使用Roboflow API密钥进行认证。
from roboflow import Roboflow
VERSION = 2
rf = Roboflow(api_key="YOUR API KEY HERE")
project = rf.workspace("paul-guerrie-tang1").project("asl-poly")
dataset = project.version(VERSION).download("coco")
对于自己的用例,需要收集一个有代表性的标记实例分割数据集。使用Roboflow Annotate进行标记可以使这个过程变得简单。在Roboflow中创建新项目时,选择“实例分割”作为项目类型,并使用“多边形工具”来绘制形状。
为了在Detectron2上训练自定义数据集,首先需要在Detectron2的数据集注册表中注册数据集。然后,运行一个快速测试以确保数据集注释已正确注册。
register_coco_instances("asl_poly_train", {}, "./american-sign-language-poly-{}/train/_annotations.coco.json", "./american-sign-language-poly-{}/train/")
register_coco_instances("asl_poly_valid", {}, "./american-sign-language-poly-{}/valid/_annotations.coco.json", "./american-sign-language-poly-{}/valid/")
register_coco_instances("asl_poly_test", {}, "./american-sign-language-poly-{}/test/_annotations.coco.json", "./american-sign-language-poly-{}/test/")
注册训练集、验证集和测试集到Detectron2。然后,可以在Detectron2格式下可视化训练数据。
现在已经让数据集被Detectron2库正确识别,可以继续配置自定义训练管道。从Detectron2模型库中,选择了一个基本的、经过验证的模型COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x来进行实例分割。然后定义了评估器和训练循环,并启动训练。
# 训练代码的一部分
optimizer.zero_grad()
losses.backward()
optimizer.step()
对于自定义训练例程的更多细节,可以参考自定义实例分割训练笔记本。
在示例笔记本中,启动了10,000次迭代的训练——可以尝试缩短或延长这个数字来缩短或延长模型训练时间。该例程应该在找到饱和性能的模型状态时提前停止。
在网络训练期间,可以通过观察损失度量收敛(越低越好)来判断网络是否正在从数据集中学习。
训练完成后,可以加载模型,以便在示例图像上测试模型的预测。
cfg.MODEL.WEIGHTS = os.path.join(cfg.OUTPUT_DIR, "model_final.pth")
cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.2
predictor = DefaultPredictor(cfg)
在调用模型进行测试图像推理后,确实可以看到它学会了如何分割自定义对象。
作为最后一步,下载自定义实例分割模型的权重工件以备将来在部署中使用。在重新构建选择的部署位置的Detectron2库后,可以使用上面用于测试推理的相同命令来加载和调用模型。
from google.colab import files
files.download(os.path.join(cfg.OUTPUT_DIR, "model_final.pth"))
现在知道如何训练Detectron2来识别自定义对象,并提供实例分割所提供的细粒度。如果正在寻找更多关于训练Detectron2的信息,有额外的指南供查看。
使用这种方法训练实例分割模型还有其他选择。Roboflow提供了一个AutoML解决方案,让可以一键训练模型。