图像分割技术是计算机视觉领域的一个重要的研究方向,对于广大AI开发者来说可谓耳熟能详!对于如此重要的领域,早在2019年开源的图像分割套件PaddleSeg已经广泛被企业与开发者应用在实际生产当中。不信的话,咱们往下看!
先来个高科技——自动驾驶!正是基于图像分割技术,汽车才能分清楚哪里是路,哪里是人。
在抗疫最前线的医疗阵地上,图像分割发挥了巨大作用!连心医疗使用PaddleSeg开发上线了“基于CT影像的肺炎筛查与病情预评估AI系统”,可快速识别CT影像上的肺炎病灶信息,帮助我们的白衣战士节省了大量诊断和评估时间!
除了此之外,PaddleSeg还可以用在很多其它场景,话不多说,咱们直接上图:
- 工业场景中的表计读数自动读取
- 遥感图像分割
- 人体解析
- 人像分割 背景替换。(你以为我在旅游?其实我在加班
)
- 基于人像分割,我们还可以进一步把彩色图像变素描
看到PaddleSeg如此丰富的应用场景,大家是不是想跃跃欲试呢?在此小编吐血呼吁大家点击star支持一下。
点击文末"阅读原文"或以下链接立即Star:
https://github.com/PaddlePaddle/PaddleSeg
国际冠军都在用的PaddleSeg
PaddleSeg不仅能力覆盖全面,而且里面的独立算法还极其优秀!在刚刚结束的神经信息处理系统大会NeurIPS 2020(Conference and Workshop on Neural Information Processing Systems)上,百度团队就是使用了PaddleSeg中单个语义分割模型HRNet,该模型已在CityScapes等多个公开数据集上获得了SOTA结果。最终百度团队一举夺冠,准确性得分领先第二名0.37,推理速度更是第二名的7倍!!!
焕然一新的PaddleSeg
是不是感觉PaddleSeg很厉害呢?其实咱们刚刚看到的只是冰上一角而已!近期,随着飞桨框架升级了2.0版本,PaddleSeg也随之进行了升级。在新的版本中,PaddleSeg提供了:
更加丰富的高精度模型算法:包括20 分割网络、50 预训练模型,模型精度均优于其它实现方式。
优秀的动转静功能:PaddleSeg依托飞桨框架集成了优秀的动转静功能,让用户在部署上具有更好性能。
更加灵活易用的开发体验:PaddleSeg在原先配置文件运行方式之外又新增了API接口调用方式,更加灵活易用。
下面将为大家细细分解!
PaddleSeg全景图
更加丰富的高精度模型
PaddleSeg支持U-Net,PSPNet,DeepLabV3 ,OCRNet等20多种主流分割模型,提供了Xception、MobileNet、ResNet、HRNet等多种骨干网络,可以满足不同性能和精度的要求,同时目前开源的模型的精度均由于业内同类产品的模型。
PaddleSeg中模型精度数据
光说不练假把式!单纯说自己模型精度有多高,无异于是耍流氓。为了进一步验证PaddleSeg模型的精度,我们分别在两个主流数据集Cityscapes和PASCAL VOC 2012上和其它同类产品的模型做了详细的对比实验。
下图展示了对比结果。左边模型使用ResNet50做为骨干网络,右边模型使用ResNet101做为骨干网络。可以看到与其它实现相比,PaddleSeg模型的精度明显更加优秀!
Cityscapes数据集对比实验
(其中FCN和OCRNet使用HRNet_w18作为主干网络)
基于PASCAL VOC 2012数据集对比实验
(FCN和OCRNet使用HRNet_w18作为主干网络)
优秀的动转静功能
基于飞桨框架2.0的PaddleSeg,提供了更加易用完备的动态图体验。虽然动态图在训练过程中更加方便调试,但是在部署上却明显吃力。为此飞桨提供了一套模型动转静的方式,其基本原理是通过分析Python代码来将动态图代码转写为静态图代码,并在底层自动帮助用户使用静态图执行器运行。这种转换方式让用户可以灵活使用Python语法及其控制流来构建神经网络模型。
依托飞桨框架,PaddleSeg也拥有了一键动转静能力,仅需添加一个装饰器并调用API接口paddle.jit.save,即可完成模型的转换。具体我们可以看下面的例子:
- 定义网络
import numpy as np
import paddle
# 定义了一个简单全连接网络SimpleFcLayer
class SimpleFcLayer(paddle.nn.Layer):
def __init__(self, batch_size, feature_size, fc_size):
super(SimpleFcLayer, self).__init__()
self._linear = paddle.nn.Linear(feature_size, fc_size)
self._offset = paddle.to_tensor(
np.random.random((batch_size, fc_size)).astype('float32'))
# 添加装饰器
@paddle.jit.to_static
def forward(self, x):
fc = self._linear(x)
return fc self._offset
- 模型转换
import paddle
fc_layer = SimpleFcLayer(3, 4, 2)
in_np = np.random.random([3, 4]).astype('float32')
input_var = paddle.to_tensor(in_np)
out = fc_layer(input_var)
# 使用paddle.jit.save接口存储模型
paddle.jit.save(fc_layer, "./fc_layer_dy2stat", input_spec=[input_var])
转换成静态图模型做部署就可以获得更好的性能,实现单车变跑车的进化!
更加灵活易用的开发体验
在用户使用体验上,PaddleSeg提供了两种使用方式:
- 仅需要少量代码或指令就可以通过PaddleSeg中组合好的配置文件快速开始模型训练,从而更快捷高效地搭建出从训练到部署的图像分割模型“生产流水线”。
- 同时PaddleSeg还提供了简单的API接口,开发人员在使用pip install命令安装PaddleSeg后,仅需通过几行代码即可轻松实现图像分割模型的训练、评估和推理。
用户既可以自由选择快捷高效的配置文件方式,也可以选择使用更加定制化的API调用方式,大大提升了用户体验的灵活易用性。
PaddleSeg高精度模型探究
刚才说到模型算法,提到过PaddleSeg的模型精度都是很牛的,可是你想知道为什么这么厉害吗?
为了能有更好的性能提升,PaddleSeg开发团队在跳跃连接、空洞卷积、全局上下文、注意力机制、骨干网络优化五个方面做了深入的研究,将这些优化策略融合在已实现的模型中,极大的提升了模型的精度。尤其是基于百度自研的半监督标签知识蒸馏方案(SSLD),PaddleSeg开发团队训练出了高精度骨干网络,使得整个分割网络的精度有了明显的提升。
下表为PaddleSeg各个模型所采用的策略说明,详细的模型优化策略,用户可以根据配置文件进一步了解。
PaddleSeg模型的优化策略
结束语
介绍了这么多,小伙伴一定心动了想要跃跃欲试吧?那就请小伙伴们快快上手体验吧。如果大家觉得我们的PaddleSeg给您带来更好的体验,那就请您动动小手,给我们点击一个star吧!
Github地址:
https://github.com/PaddlePaddle/PaddleSeg