1、论文

BiSeNet: Bilateral Segmentation Network for Real-time Semantic Segmentation

https://arxiv.org/abs/1808.00897.pdf

论文中提到:采用降低空间分辨率,实现实时推理速度会导致性能差。为此提出由空间路径(Spatial Path)和上下文路径(Context Path)两部分组成的双边分割网络(BiSeNet)。

Spatial Path:保存空间信息,生成高分辨率特征。

Context Path:采用快速下采样策略获得足够的感受野。

作者总结实时语义分割,加速模型的三种方法:

①、尝试限制输入大小,通过裁剪或调整大小来降低计算复杂度。虽然该方法简单有效,但空间细节的丢失破坏了预测,特别是在边界附近,导致度量和可视化精度下降。

②、对网络的通道进行修剪,以提高推理速度,特别是在基础模型的早期阶段。然而,它削弱了空间容量。

③、ENet建议放弃模型的最后阶段,追求一个非常紧凑的框架。然而,这种方法的缺点是很明显的:由于ENet在最后阶段放弃了降采样操作,模型的接受域不足以覆盖大对象,导致识别能力较差。

详细参考:https://blog.csdn.net/sinat_17456165/article/details/106152907

2、网络结构

各个模块

①Spatial Path:由几组 卷积+BN+relu组成 每层卷积步长为2.

特点:网络浅、通道宽。作用:保留丰富的空间信息生成高分辨率特征。

class SpatialPath(nn.Module):def __init__(self):super(SpatialPath, self).__init__()self.cbnr1=ConvBNRelu(3,64,7,2,3)self.cbnr2 = ConvBNRelu(64, 64, 3, 2, 1)self.cbnr3 = ConvBNRelu(64, 64, 3, 2, 1)self.cbnr4 = ConvBNRelu(64, 128, 1, 1, 0)self.init_weight()def init_weight(self):for ly in self.children():if isinstance(ly, nn.Conv2d):nn.init.kaiming_normal_(ly.weight, a=1)if not ly.bias is None:nn.init.constant_(ly.bias, 0)def forward(self,x):x=self.cbnr1(x)x=self.cbnr2(x)x=self.cbnr3(x)x=self.cbnr4(x)return xdef get_params(self):wd_params, nowd_params = [], []for name, module in self.named_modules():if isinstance(module, (nn.Linear, nn.Conv2d)):wd_params.append(module.weight)if not module.bias is None:nowd_params.append(module.bias)elif isinstance(module, nn.BatchNorm2d):nowd_params += list(module.parameters())return wd_params, nowd_params

②Context Path :由ARM+轻量型网络(Res18/Xception39等)

特点:网络深。作用:获取足够多的感受野。

以res18为例:

若不使用torchvision中model库,重新写res18网络并使用其预训练模型。

网络中的参数名可以不同,但是网络层数需要一致,主要是方便参数赋值。

初始化-预训练参数的加载。

 def init_weight(self):model=resnet18(pretrained=False)model.fc=Nonemodel.load_state_dict(torch.load('resnet18-5c106cde.pth'))#如果不使用临时变量,参数值不会更新self_state_dict=self.state_dict()dict=[]for k,v in  model.state_dict().items():dict.append(v)for i,(k,v) in  enumerate(self_state_dict.items()):self_state_dict.update({k:dict[i]})self.load_state_dict(self_state_dict)

ARM模块:

细化特征,特点:计算无损耗。

③FFM 特征融合模块

主要是融合两条路径的特征map

3、数据集

人脸分割数据集CelebAMask-HQ包含3w张人脸图像,以及人脸各部分分割的mask。

数据集有19个分割标签(包含背景):'skin', 'l_brow', 'r_brow', 'l_eye', 'r_eye', 'eye_g', 'l_ear', 'r_ear', 'ear_r', 'nose', 'mouth', 'u_lip', 'l_lip', 'neck', 'neck_l', 'cloth', 'hair', 'hat'。

mask图像是24位png图,且各个分类标签是独立的,需要将其量化并融合到一张图中转换为8位png图。

#!/usr/bin/python
# -*- encoding: utf-8 -*-import os.path as osp
import os
import cv2
from transform import *
from PIL import Imageface_data = '/data/CelebAMask-HQ/CelebA-HQ-img'
face_sep_mask = '/data/CelebAMask-HQ/CelebAMask-HQ-mask-anno'
mask_path = '/data/CelebAMask-HQ/mask'
counter = 0
total = 0
for i in range(15):atts = ['skin', 'l_brow', 'r_brow', 'l_eye', 'r_eye', 'eye_g', 'l_ear', 'r_ear', 'ear_r','nose', 'mouth', 'u_lip', 'l_lip', 'neck', 'neck_l', 'cloth', 'hair', 'hat']for j in range(i * 2000, (i + 1) * 2000):mask = np.zeros((512, 512))for l, att in enumerate(atts, 1):total += 1file_name = ''.join([str(j).rjust(5, '0'), '_', att, '.png'])path = osp.join(face_sep_mask, str(i), file_name)if os.path.exists(path):counter += 1sep_mask = np.array(Image.open(path).convert('P'))# print(np.unique(sep_mask))mask[sep_mask == 225] = lcv2.imwrite('{}/{}.png'.format(mask_path, j), mask)print(j)print(counter, total)

合并后的mask图像为:

数据集划分:train:test=9:1

4、加载数据集

①、数据增强

数据增强方法有随机裁剪、镜像、缩放、颜色空间增强等。

随机裁剪:原图像与mask同处理。

镜像:原图像与mask 镜像处理,mask中部分标签互换:眼睛、眉毛、耳朵。

缩放:原图像与mask同处理。

颜色空间:原图像进行饱和度、对比度、透明度调整。

②、加载

DataLoader与DataSet结合使用

transform转换

图像遍历

图像的批次

5、损失函数

Li:logsoftmax

lp:主损失

li:辅助损失(cp过程)

6、优化器

随机梯度下降法,超参数设置、更新。

7、日志

使用logger库记录训练过程中数据。

8、评估指标

混淆矩阵的形式:

T(F)/P(N)

预测为真

预测为假

实际为真

真阳性(TP)

假阴性(FN

实际为假

假阳性(FP)

真阴性(TN)

计算构建:

def confusion_matrix(self,pre,lab):P_pre=pre.flatten()L_lab=lab.flatten()mask=(L_lab>=0)&(L_lab<self.num_class)confusion=np.zeros((self.num_class,self.num_class))#,dtype=np.int32#n*L+Pconfusion+=np.bincount(self.num_class*L_lab[mask].astype(int)+P_pre[mask],minlength=self.num_class**2).reshape(self.num_class,self.num_class)return confusion

由混淆矩阵计算模型的评估指标:

像素精度:

def pixel_acc(self,confusion):return np.diag(confusion).sum()/(confusion.sum())

各类别精度

 def class_acc(self,confusion):return np.diag(confusion)/np.maximum(confusion.sum(axis=1),1)#vector(1*numclass)

类别平均精度:

def mpa(self,cls_acc):return np.nanmean(cls_acc)

iou交并比

def iou(self,confusion):return np.diag(confusion) / np.maximum(np.sum(confusion,axis=1) + np.sum(confusion,axis=0) - np.diag(confusion), 1)

miou平均交并比

def miou(self,iou_):return np.nanmean(iou_)

9、结果分析

训练8w次
acc=94.95%, macc=57.41%, mIoU=52.40%

测试:

参考:

GitHub - zllrunning/face-makeup.PyTorch: Lip and hair color editor using face parsing maps.

语义分割各种评价指标实现_络小绎的博客-CSDN博客_语义分割评价指标

BiSeNetV1 面部分割相关推荐

  1. 实时头发-面部皮肤分割与人脸肤色分类

    一种基于深度卷积神经网络(DCNN)用于于头发和面部皮肤实时分割方法 原创 imalg图像算法 发布于2020-01-03 10:38:47 阅读数 7 收藏 展开 团队信息 摘要 现代的语义分割方法 ...

  2. Real-time Segmentation and Facial Skin Tones Grading-实时分割和面部皮肤骨骼分级

    论文 Summary 摘要 keyword 关键字 1.Introduction 背景介绍 2 Ready work 准备工作 2.1 Lightweight model 轻量级模型 2.2Conte ...

  3. 一种基于深度卷积神经网络(DCNN)用于于头发和面部皮肤实时分割方法

    团队信息 摘要 现代的语义分割方法通常过于关注模型的准确性,因此引入繁琐的主干,这会带来沉重的计算负担和内存占用.为了解决这个问题,作者提出了一种基于深度卷积神经网络(DCNN)的高效分割方法,用于头 ...

  4. 语义分割概念及应用介绍

    近年来,以深度学习为中心的机器学习技术引起了人们的关注.比如自动驾驶汽车已经逐渐成为可能,但在整个深度学习过程,需要算法识别和学习作为原始数据提供的图像,在这一过程中,应用到了语义分割技术.下面让我们 ...

  5. 场景解析和语义分割区别_语义分割概念及应用介绍

    摘要: 一份关于语义分割的基本概述,涵盖语义分割的特征和可能的用途,包括地质检测.自动驾驶.面部识别等. 近年来,以深度学习为中心的机器学习技术引起了人们的关注.比如自动驾驶汽车已经逐渐成为可能,但在 ...

  6. 使用PyTorch进行语义分割

    本篇文章使用进行pytorch进行语义分割的实验. 1.什么是语义分割? 语义分割是一项图像分析任务,我们将图像中的每个像素分类为对应的类. 这类似于我们人类在默认情况下一直在做的事情.每当我们看到某 ...

  7. 基于DeeplabV3+的语义分割实现

    摘要: 当今机器学习不断发展,成为社会的热点新闻,机器学习能在各个领域不断发展并且应用.其中语义分割是研究最为频繁的领域,在深度学习中,由于分割模型的参数量确实是很大,所用到的算法既耗费时间又耗费精力 ...

  8. 图像语义分割方法研究进展

    全监督学习的图像语义分割方法研究进展 简介 1 全监督学习的图像语义分割方法 1.1 基于全卷积的图像语义分割方法 1.2 基于编码器解码器结构的图像语义分割方法 1.3 基于注意力机制的图像语义分割 ...

  9. 人脸照片自动生成游戏角色_ICCV2019论文解析

    人脸照片自动生成游戏角色_ICCV2019论文解析 Face-to-Parameter Translation for Game Character Auto-Creation 论文链接: http: ...

最新文章

  1. 区块链和智能合约的关系
  2. 编写程序python输入任意大的自然数、输出各位数字之和_兰理工Python第一次上机作业源码...
  3. C语言中为什么要使用enum
  4. Hibernate关于父类子类的映射
  5. php获取访问者ip地址汇总,php获取访问者IP地址汇总_PHP
  6. java获取panel面板画笔_java - paintComponent()与paint()和JPanel vs Canvas在画笔类型的GUI中 - 堆栈内存溢出...
  7. 我的欧拉工程之路_3
  8. mysql sql优化_MySQL优化SQL语句的步骤
  9. Eclipse-习惯设置/快捷键/插件
  10. 【李宏毅2020 ML/DL】P8-9 Optimization for Deep Learnin | 优化器技术总结,SGDM 与 Adam 对比与使用建议
  11. ubuntu 分屏工具
  12. linux下echo /dev/ttys* 到字符设备文件,Linux系统的终端特殊设备文件
  13. 针式打印机打印发虚_针式打印机使用技巧
  14. split添加limit参数
  15. Android 开发中常用的库
  16. 非致命战计算机病毒战属于,《信息化战争》章节
  17. SpringBoot使用Nacos作为配置中心服务和服务注册中心
  18. EasyUI Menu 菜单和按钮
  19. discuz 论坛不同版块使用不同模板
  20. 数据库系统概述---第二章关系数据库

热门文章

  1. 有关 Java Long 型数据的比较
  2. Ahao网络传媒技术收徒
  3. Python番外篇:Flask+segno 实现个人名片二维码在线生成器
  4. 编程中的代码能看懂。。但是让自己写却写不出来。应该怎么办? 要有效果的方法...
  5. 什么是DC / AC / OC 机房?
  6. 开源PHP记事本,Boostnote 为程序员的开源式记事本
  7. 哈尔滨工程大学-济海追风-声音信标
  8. 《JavaScript AST其实很简单》五、Step4-平坦化控制流
  9. Unit Test Harness(用具)应该具备什么功能?
  10. NodeJS 文件操作 —— fs 基本使用