1. 14类道海面船舶实例分割数据集概述
作为一名长期从事计算机视觉研究的工程师,我最近整理并开源了一个专门针对海面船舶的实例分割数据集。这个数据集包含了14类常见船舶部件,总计1360张高分辨率图像(1920×1080),采用labelme工具进行精细标注,可直接用于主流实例分割模型的训练与验证。
在实际项目中,船舶识别与分割一直是个具有挑战性的任务。不同于常规目标检测,实例分割需要精确到像素级别的识别,这对数据质量提出了更高要求。本数据集特别关注了船舶的细粒度部件划分,例如:
- 船体结构(hull、forecastle、aftercastle)
- 功能组件(anchor、radar、chimney)
- 装载设备(container、belt conveyor)
- 船载设施(passenger cabin、cab)
注:数据集已按7:1:2比例划分为训练集(840张)、验证集(100张)和测试集(420张),这种划分方式既能保证模型充分学习特征,又能有效评估泛化性能。
2. 数据集技术细节解析
2.1 数据采集与标注规范
原始图像采集自多个国际港口的高清监控视频,覆盖不同光照条件(晴天/阴天/夜间)和船舶状态(停泊/航行)。标注过程遵循以下标准:
- 边缘精度:标注线与物体实际边缘偏差不超过3个像素
- 遮挡处理:被遮挡超过50%的物体不标注
- 小目标规则:最小标注尺寸为30×30像素
标注文件采用JSON格式存储,每个文件包含:
json复制{
"version": "4.5.6",
"flags": {},
"shapes": [
{
"label": "container",
"points": [[x1,y1], [x2,y2], ...],
"shape_type": "polygon"
}
],
"imagePath": "ship_001.jpg",
"imageData": null
}
2.2 类别分布与数据平衡
通过统计分析发现,各类别样本数量存在自然差异:
| 类别 | 样本数 | 占比 |
|---|---|---|
| hull | 287 | 21.1% |
| container | 198 | 14.6% |
| radar | 53 | 3.9% |
这种分布反映了真实场景中船舶部件的出现频率。建议训练时采用类别加权损失函数:
python复制class_weights = torch.tensor([1.0, 1.2, 0.8, ...]) # 根据逆频率设置
criterion = nn.CrossEntropyLoss(weight=class_weights)
3. 模型基准测试与性能对比
3.1 测试环境配置
- 硬件:NVIDIA RTX 3090 (24GB显存)
- 框架:PyTorch 1.10 + MMDetection 2.25
- 训练参数:
- batch_size: 8
- lr: 0.001 (余弦退火)
- epochs: 100
3.2 主流模型表现
测试结果如下表所示(均使用相同训练策略):
| 模型 | mAP50 | mAP50-95 | 推理速度(FPS) |
|---|---|---|---|
| Mask R-CNN | 0.688 | 0.387 | 12.3 |
| SOLOv2 | 0.712 | 0.401 | 9.8 |
| YOLACT++ | 0.653 | 0.362 | 15.6 |
| Mask2Former | 0.735 | 0.423 | 7.2 |
实测发现:对于"rope"等细长物体,基于query的Mask2Former表现最优;而对"container"等规则物体,YOLACT++的实时性更具优势。
4. 实战应用指南
4.1 数据加载最佳实践
推荐使用以下数据增强组合:
python复制train_pipeline = [
dict(type='LoadImageFromFile'),
dict(type='LoadAnnotations'),
dict(type='Resize', img_scale=(1333, 800), keep_ratio=True),
dict(type='RandomFlip', flip_ratio=0.5),
dict(type='Normalize', mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375]),
dict(type='Pad', size_divisor=32),
dict(type='DefaultFormatBundle'),
dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks'])
]
4.2 调参经验分享
-
学习率设置:
- 骨干网络:初始lr/10
- 检测头:初始lr
- 建议使用渐进式热身(warmup)策略
-
正负样本分配:
python复制train_cfg=dict( rpn=dict( assigner=dict( type='MaxIoUAssigner', pos_iou_thr=0.7, neg_iou_thr=0.3, min_pos_iou=0.3, match_low_quality=True, ignore_iof_thr=-1), ... ) )
5. 常见问题解决方案
5.1 小目标检测效果差
- 现象:radar、anchor等小类别AP较低
- 解决方案:
- 修改FPN特征层级:
python复制neck=dict( type='FPN', in_channels=[256, 512, 1024, 2048], out_channels=256, num_outs=5, # 增加特征图尺度 ) - 使用更密集的anchor设置:
python复制anchor_generator=dict( scales=[4, 6, 8], # 原为[8,16,32] ratios=[0.5, 1.0, 2.0], strides=[4, 8, 16, 32, 64] )
- 修改FPN特征层级:
5.2 模型过拟合
- 现象:训练集mAP远高于验证集
- 应对策略:
- 增加随机裁剪(RandomCrop)
- 使用更强的正则化:
python复制optimizer_config = dict( grad_clip=dict(max_norm=35, norm_type=2), weight_decay=0.0001 ) - 早停机制(patience=15)
我在实际使用中发现,对于"ore sand"这类纹理复杂的类别,采用CutMix数据增强能提升约2%的mAP。具体实现可参考:
python复制def cutmix(img1, target1, img2, target2):
lam = np.random.beta(1.0, 1.0)
bbx1, bby1, bbx2, bby2 = rand_bbox(img1.size(), lam)
img1[:, :, bbx1:bbx2, bby1:bby2] = img2[:, :, bbx1:bbx2, bby1:bby2]
# 同步调整target...
return img1, target1
6. 扩展应用方向
基于该数据集,我们还可以开展以下研究:
- 多任务学习:联合训练实例分割与OBB旋转检测
- 跨模态分析:结合AIS船舶自动识别系统数据
- 异常检测:通过分割结果识别船舶损坏情况
对于工业部署,建议将模型转换为TensorRT格式以获得加速。实测Mask R-CNN在Jetson AGX Xavier上的推理速度可从5.2FPS提升至18.7FPS:
bash复制trtexec --onnx=maskrcnn.onnx \
--saveEngine=maskrcnn.engine \
--fp16 \
--workspace=4096
