solov2算法简介
SOLO系列算法将实例分割任务分解为像素级分类的两个子任务,因此模型输出会预测实例掩码以及实例掩码的类别概率。为了在像素级别区分不同实例,将输入图像在概念上分为SxS个网格,如果一个对象的中心落入到一个网格内,那么这个网格就负责预测该对象的二进制掩码以及类别。因此,模型会输出SxS个masks(掩码),其中第K个位置的特征通道负责对网格位置(i,j)的实例进行分割,而k=S*i + j。算法流程很简单,无需边界框检测,类似yolov1的思想,整体流程如下图所示:
基于mmdetection3版本进行实践
基础环境及安装
- Python 3.8+
- PyTorch 2.0
- mmcv 2.1
- mmengine 0.10.2
- mmdet 3.3.0
- 详细环境配置教程请参考:环境安装
训练流程
1.数据准备
1)使用标注工具:labelme标注工具进行标注;
2)标注方式:由于需要标注目标的边界轮廓,所以标注类型为polygon;
3)标注内容:沿着目标边界区域进行标注;
2.转换为COCO数据格式
① 划分数据集,将标注的数据集划分为训练、验证和测试集:格式如下:
data/
├── ├── train
| ├── 925rgb_1706_73.jpg
│ └── 925rgb_1706_73.json
│ └── ....
├── ├── val
| ├── 925rgb_1706_66.jpg
│ └── 925rgb_1706_66.json
│ └── ....
...
②分别对train/val/test文件夹下的数据转为coco格式,运行labelme2coco.py,可参考该网址[labelme2coco](https://github.com/Tony607/labelme2coco),最终生成的coco数据集目录如下:
train_data/
├── train
| ├── 925rgb_1703_76.jpg
│ └── 925rgb_1706_73.jpg
│ └── ....
├── val
| ├── 925rgb_1703_66.jpg
│ └── 925rgb_1706_66.jpg
│ └── ....
├── annotations
| ├── instance_train.json
│ └── instance_val.json
3.修改模型训练配置文件
1)下载mmdetection源码:git clone https://github.com/open-mmlab/mmdetection
2)为自定义数据集修改SOLOv2配置文件
① 找到配置文件:configs/solov2/solov2_r50_fpn_ms-3x_coco.py
② 配置文件修改主要涉及三个方面:
1)数据集路径指定
,在train_dataloader.dataset、val_dataloader.dataset、test_dataloader.dataset变量中指定数据集路径,如下:
首先定义相关变量
### 数据集配置
dataset_type = 'CocoDataset'
# 数据根目录
data_root = '/xxx/mmdetection-3.3.0/data/'
# 图像目录路径,相对根目录
train_img_root = 'train/'
<