来源
b站 地址
什么是语义分割
语义分割:对图像每个像素点进行分类
常见神经网络处理过程:Encoder提取特征,接着Docoder恢复成原图大小的图片
UNet整体结构
分为三个部分
- 主干特征提取部分:
- 卷积和最大池化的堆叠
- 获得五个初步有效特征层
- 加强特征提取部分:
- 五个初步有效特征层进行上采样 + 特征融合
- 获得一个最终融合了所有特征的有效特征层
- 预测部分
最后一个有效特征层对每一个特征点进行分类
BackBone-主干特征提取网络
bubbliiing使用的是VGG16作为主干特征提取网络。
UNet具体使用VGG16红色框线内的内容
具体实现代码:
- 卷积核都是1 × 1的,所以不改变高和宽,卷积核个数改变深度
- M:最大池化,长和宽 / 2
加强特征提取网络-FPN的构建
这块的步骤:堆叠->卷积->堆叠->卷积
代码部分,主要unetUp来实现
一小步的实现如下两图:
所有,最后输出的是512, 512, 64的特征层
利用特征获得最终的预测结果
利用1 × 1卷积,指定输出类别数目,即可
预测过程详解
unet的预测效果如下:
代码过程如下所示:
数据集格式
- JPEGImages:原图
- SegmentationClass:标签(灰度图,飞机是1,人是15)
- Segmentation
- train.txt:训练集图片名字
- val.txt:验证集图片名字
数据集的制作
使用一个软件labelme,版本3.16.7
pip install labelme==3.16.7 # 安装
labelme # 运行
在界面中通过一个闭环人工标注(真肝呀,yyds)
会生成对应的json文件
利用json_to_dataset文件,输入自己的类别,得到分割结果
得到分割结果
训练参数解析
num_class = 实际类别+1(背景)
冻不冻结?
使用focal loss可以防止样本不平衡
核心是给不同的权重
训练自己的数据集
之前做好的数据集,用voc_annotation进行划分
miou 评价指标计算
看完了,完结撒花,不过想做分割的话,接下来看看sam,unet接下来可以看看变种了!