【CV】基于UNet网络实现的人像分割 | 附数据集
文章来源于AI算法与图像处理,作者AI_study
今天要分享的是人像分割相关的内容,如果你喜欢的话,欢迎三连哦
主要内容
人像分割简介
UNet的简介
UNet实现人像分割
人像分割简介
人像分割的相关应用非常广,例如基于人像分割可以实现背景的替换做出各种非常酷炫的效果。我们将训练数据扩充到人体分割,那么我们就是对人体做美颜特效处理,同时对背景做其他的特效处理,这样整张画面就会变得更加有趣,更加提高颜值了,这里我们对人体前景做美颜调色处理,对背景做了以下特效:
①景深模糊效果,用来模拟双摄聚焦效果;
②马赛克效果
③缩放模糊效果
④运动模糊效果
⑤油画效果
⑥线条漫画效果
⑦Glow梦幻效果
⑧铅笔画场景效果
⑨扩散效果
例子:
例子来源:https://blog.csdn.net/Trent1985/article/details/80578841
https://zhuanlan.zhihu.com/p/48080465 (实现背景灰化)
而在在实现这些效果之前,所需要的一步操作都是需要将人像抠出来。今天的主要内容是要介绍如何使用UNet实现人像分割。
UNet的简介
UNet的结构非常简单,广泛应用于医学图像分割,2015年发表在 MICCAI,谷歌学术上目前引用量8894,可以看出来其影响力。
UNet的结构,有两个最大的特点,U型结构和skip-connection(如下图)。
UNet网络,类型于一个U字母:首先进行Conv(两次)+Pooling下采样;然后Deconv反卷积进行上采样(部分采用resize+线性插值上采样),crop之前的低层feature map,进行融合;然后再次上采样。重复这个过程,直到获得输出388x388x2的feature map,最后经过softmax获得output segment map。总体来说与FCN思路非常类似。
U-Net采用了与FCN完全不同的特征融合方式:拼接!
参考资料:https://zhuanlan.zhihu.com/p/57437131
https://www.zhihu.com/question/269914775/answer/586501606
https://www.zhihu.com/people/george-zhang-84/posts
UNet实现人像分割
该项目是基于 https://github.com/milesial/Pytorch-UNet (2.6k star 车辆分割)修改的,并提供人像分割的数据集(1.15G)。
人像分割项目链接:https://github.com/leijue222/portrait-matting-unet-flask
官方下载链接:http://www.cse.cuhk.edu.hk/leojia/projects/automatting/index.html
或者:
百度网盘:http://pan.baidu.com/s/1dE14537
密码:ndg8
该项目已经提供了预训练模型,如果你不想重新训练,可以自己clone下来,按照下面的操作一步一步运行即可。
环境配置
Python 3.6
PyTorch >= 1.1.0
Torchvision >= 0.3.0
Flask 1.1.1
future 0.18.2
matplotlib 3.1.3
numpy 1.16.0
Pillow 6.2.0
protobuf 3.11.3
tensorboard 1.14.0
tqdm==4.42.1
# clone 项目
git clone https://github.com/leijue222/portrait-matting-unet-flask.git# 进入到文件夹中
cd portrait-matting-unet-flask/# 准备好一张待分割的人像图片,运行下面的代码即可生成mask并保存
python predict.py -i image.jpg -o output.jpg
作者提供的测试demo
如果你想重新训练的话,也很容易,根据上面提供的数据集,将原图和mask分别
放置在 文件夹 data/imgs和 data/masks 路径下即可
然后运行下面的代码
python train.py -e 200 -b 1 -l 0.1 -s 0.5 -v 15.0
各个参数的含义
-e 表示 epoch 数
-b 表示 batch size
-l 表示学习率
-s 表示 scale
-v 表示 验证集所占的百分比
最后我们在看一下 UNet 网络的核心代码
定义UNet 需要用的主要模块
class DoubleConv(nn.Module):"""(convolution => [BN] => ReLU) * 2"""def __init__(self, in_channels, out_channels):super().__init__()self.double_conv = nn.Sequential(nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1),nn.BatchNorm2d(out_channels),nn.ReLU(inplace=True),nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1),nn.BatchNorm2d(out_channels),nn.ReLU(inplace=True))def forward(self, x):return self.double_conv(x)class Down(nn.Module):"""Downscaling with maxpool then double conv"""def __init__(self, in_channels, out_channels):super().__init__()self.maxpool_conv = nn.Sequential(nn.MaxPool2d(2),DoubleConv(in_channels, out_channels))def forward(self, x):return self.maxpool_conv(x)class Up(nn.Module):"""Upscaling then double conv"""def __init__(self, in_channels, out_channels, bilinear=True):super().__init__()# if bilinear, use the normal convolutions to reduce the number of channelsif bilinear:self.up = nn.Upsample(scale_factor=2, mode='bilinear', align_corners=True)else:self.up = nn.ConvTranspose2d(in_channels // 2, in_channels // 2, kernel_size=2, stride=2)self.conv = DoubleConv(in_channels, out_channels)def forward(self, x1, x2):x1 = self.up(x1)# input is CHWdiffY = torch.tensor([x2.size()[2] - x1.size()[2]])diffX = torch.tensor([x2.size()[3] - x1.size()[3]])x1 = F.pad(x1, [diffX // 2, diffX - diffX // 2,diffY // 2, diffY - diffY // 2])x = torch.cat([x2, x1], dim=1)return self.conv(x)class OutConv(nn.Module):def __init__(self, in_channels, out_channels):super(OutConv, self).__init__()self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=1)def forward(self, x):return self.conv(x)
利用上面定义好的模块,轻松的实现UNet网络
class UNet(nn.Module):def __init__(self, n_channels, n_classes, bilinear=True):super(UNet, self).__init__()self.n_channels = n_channelsself.n_classes = n_classesself.bilinear = bilinearself.inc = DoubleConv(n_channels, 64)self.down1 = Down(64, 128)self.down2 = Down(128, 256)self.down3 = Down(256, 512)self.down4 = Down(512, 512)self.up1 = Up(1024, 256, bilinear)self.up2 = Up(512, 128, bilinear)self.up3 = Up(256, 64, bilinear)self.up4 = Up(128, 64, bilinear)self.outc = OutConv(64, n_classes)def forward(self, x):x1 = self.inc(x)x2 = self.down1(x1)x3 = self.down2(x2)x4 = self.down3(x3)x5 = self.down4(x4)x = self.up1(x5, x4)x = self.up2(x, x3)x = self.up3(x, x2)x = self.up4(x, x1)logits = self.outc(x)return logits
资料汇总
人像分割项目链接:https://github.com/leijue222/portrait-matting-unet-flask
数据集下载
百度网盘:http://pan.baidu.com/s/1dE14537
密码:ndg8
官方下载链接:http://www.cse.cuhk.edu.hk/leojia/projects/automatting/index.html
UNet相关知识点参考资料:
https://zhuanlan.zhihu.com/p/57437131
https://www.zhihu.com/question/269914775/answer/586501606
https://www.zhihu.com/people/george-zhang-84/posts
感谢你能看到这里,希望你能给我来一个一键三连(分享、在看+点赞),文章都是在我996工作后挤出来时间分享给大家,你的支持是我坚持的最大动力!
往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑获取一折本站知识星球优惠券,复制链接直接打开:https://t.zsxq.com/yFQV7am本站qq群1003271085。加入微信群请扫码进群:
【CV】基于UNet网络实现的人像分割 | 附数据集相关推荐
- unet训练自己的数据集_基于UNet网络实现的人像分割 | 附数据集
点击上方↑↑↑"OpenCV学堂"关注我 来源:公众号 AI算法与图像处理 授权 以后我会在公众号分享一些关于算法的应用(美颜相关的),工作之后,发现更重要的能力如何理解业务并将算 ...
- 基于UNet网络实现的人像分割 | 附数据集
点击上方"AI算法与图像处理",选择加"星标"或"置顶" 重磅干货,第一时间送达 以后我会在公众号分享一些关于算法的应用(美颜相关的),工作 ...
- python人像精细分割_基于UNet网络实现的人像分割 | 附数据集
点击上方"AI算法与图像处理",选择加"星标"或"置顶" 重磅干货,第一时间送达 以后我会在公众号分享一些关于算法的应用(美颜相关的),工作 ...
- 基于图像分割网络HRNet实现人像分割
基于图像分割网络HRNet实现人像分割 人像分割是图像分割领域非常常见的应用,PaddleSeg推出了在大规模人像数据上训练的人像分割PPSeg模型,满足在服务端.移动端.Web端多种使用场景的需求. ...
- 【PytorchLearning】基于 UNet 的肺部影像语义分割案例保姆教程
基于 UNet 的肺部影像分割 一般而言,计算机视觉领域包含三大主流任务:分类.检测.分割.其中,分类任务对模型的要求较为简单,在之前的Pytorch入门教程中已进行了较为详尽的介绍,有兴趣的小伙伴可 ...
- 零基础基于U-Net网络实战眼底图像血管提取
文章目录 1 前言 2 血管提取任务概述 3 U-Net架构简介 4 眼底图像血管分割代码 5 结果评估可视化(ROC曲线) 6 改进U-Net网络完成眼底图像血管提取任务思路 1 前言 本文基于U- ...
- 基于U-Net图像分割的划痕缺陷分割(课程设计)
基于U-Net的划痕缺陷分割(课程设计) 论文:**U-Net: Convolutional Networks for Biomedical Image Segmentation** https:// ...
- 基于U-Net的眼底图像血管分割实例
[英文说明]https://github.com/orobix/retina-unet#retina-blood-vessel-segmentation-with-a-convolution-neur ...
- 视频/图像 人像分割/Matting数据集
视频分割数据集真是让我好找,好家伙,要不就特别大,动辄上百G,要不就是找不到,针对人像开源的毕竟少数,就我目前电脑上存下来的三个数据集和大家分享,另外给大家指明一些我知道的. 一.视频人像数据集 1. ...
最新文章
- linux 串口编程_ARM-Linux开发与MCU开发有何不同?上篇
- Windows下编译和安装Boost库
- TimeInterval value and value2 determination in SalesPipeline
- mysql下一个版本号_mysql下一个版本应该且实现并不复杂增加的常用功能
- Spark 性能优化指南(官网文档)
- 《python透明人士,他是凭什么成为主流编程的宠儿?!》Python 逻辑
- Android之AsyncTask学习笔记
- 动态二维数组外圈元素值的和_C语言 | 用指向元素的指针变量输出二维数组元素的值...
- kong网关从入门到精通_可能国内最好的网关开源项目,支持 Dubbo、SpringCloud,经历多年双11高并发的场景验证
- 以太坊合约24小时新增2.44万ETH
- mysql maria引擎_MySQL/mariadb知识点——存储过程及存储引擎
- PAIP.ASP技术手册
- 小米r1d安装php,小米路由器 一键安装LLM教程
- Linux无法下载GCC
- Activiti7 表介绍
- imagenet2012 label
- c软件查表获得电量代码_energy.c 源代码在线查看 - 基于单片机的多费率电能表源程序 资源下载 虫虫电子下载站...
- 【TVM帮助文档学习】Relay的代数数据类型
- 基于Java毕业设计大学生兼职网站源码+系统+mysql+lw文档+部署软件
- SD 格式化錯誤提示Windows無法完成格式化