在计算机视觉领域,语义分割指的是将数字图像细分为多个图像子区域的过程
语义分割的目的是简化或改变图像的表示形式,使得图像更容易理解和分析
语义分割通常用于定位图像中的物体和边界(线,曲线等)
更精确的,语义分割是对图像中的每个像素加标签的一个过程,
这一过程使得具有相同标签的像素具有某种共同视觉特性
语义分割的领域非常多,无人车、地块检测、表计识别等等
根据GitHub上开源的代码 Sharpiless FCN-DenseNet 进行一些更改:
可以通过以下渠道下载:
本案例使用飞桨里的一个例子的 Oxford-IIIT Pet数据集
里面包含了宠物照片和对应的标签数据
宠物图片在 /images
标签数据在 /annotations/trimaps
具体详情参考 飞桨官方文档说明
这边标签是灰度图,还需要在处理一下,利用 tool_img2mask.py
根据实际情况将所有标签图片转换为所需的格式
左边为原图标签,宠物为1,背景为2,边缘为3,这里处理后只保留宠物特征
然后通过 tool_img2data.py
将原图和标签打乱并按比例分配到新的地址成为训练集和测试集
原图训练集:/resources/images/data/train/img
标签训练集:/resources/images/data/train/mask
原图测试集:/resources/images/data/test/img
标签测试集:/resources/images/data/test/mask
在工程中新建文件夹 /resources/images/data_json
,将所有数据原图均放置于此
这里以Oxford-IIIT Pet数据集的第一张图片为例
使用 开源的数据标注工具Labelme
安装也比较简单,版本不要太高了,后面用的时候会有问题:
$ pip3 install labelme==3.16.2
在 /resources/images/data_json
启动 Labelme
$ labelme
保存为 json 格式,并在同一地址,后续方便转换处理
此时再通过 tool_json2dataset.py
转化所有文件并生成原图和标签图片
此时所有可以利用的数据均在 /resources/images/dataset
文件夹中
然后同样通过 tool_dataset2data.py
将 dataset 中的原图和标签打乱并按比例分配到新的地址成为训练集和测试集
原图训练集:/resources/images/data/train/img
标签训练集:/resources/images/data/train/mask
原图测试集:/resources/images/data/test/img
标签测试集:/resources/images/data/test/mask
为了有足够强大的数据,这里使用处理过的Oxford-IIIT Pet数据集
根据自己电脑硬件合理调整参数进行训练,执行train.py
文件
默认每5次迭代验证并保存最优的模型于 parameters_densenet121
文件夹
parser.add_argument('--svae_interval', type=int, default=5) # svae interval
执行test.py
文件
可以在 resources/images/data/test
看到分割的效果图:
抽取mask里的图片出来对比效果:
还是可以的
谢谢