0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

移动端人像分割开发

张康康 2018-12-21 14:17 次阅读

作者 | Video++极链科技AI实验室谢锦滨

整理 | 包包

个人对移动端神经网络开发一直饶有兴致。去年腾讯开源了NCNN框架之后,一直都在关注。近期尝试将分割网络移植到NCNN,能够在手机端实现一些有趣的应用,本文就几个技术话题作相关介绍。

神经网络选择

目前做segmentation常用的一些神经网络网络有如下几个可以选择:

  • MaskRCNN

  • FCN

  • UNET

  • SegNet

  • Tiramisu

在移动端做人像分割有两大优势,首先是隐私,其次是可以做到实时,能够创造更多玩法。因为UNET模型比较简单,干脆就从这个入手。下面是UNET网络结构:


首先我采用了基于keras的版本: https://github.com/TianzhongSong/Person-Segmentation-Keras,训了一个基本模型,大小为39M, iphone X上15秒处理一帧。明显这个速度太慢,需要进行改造。

移动端Inference框架

经过调研,粗略比较了几个神经网络框架:

b8e564fcbf56462381f0a476d1354f71


其中使用难易程度,主要跟我个人习惯有关。NCNN框架比较好,代码不多,而且兼容iOS和安卓(台式机以及嵌入式环境同样支持),同时底层计算采用汇编做了优化。NCNN只实现神经网络的forward部分,没有反向传播,所以训练仍旧依赖其他开源框架,现在几大框架都遵守ONNX协议,理论上各种框架模型之间互相转换并不存在什么问题,工具也都是开源的。

不过keras没办法直接转成ncnn模型,研究过通过onnx模型做中间跳板,采用了一些开源的转换工具,也是一堆问题。NCNN支持几个神经网络训练框架:caffe/mxnet/pytorch,在ncnn的github有一篇issue里nihui推荐采用MXNET,因此MXNET也成为了我的首选。其他框架往NCNN转换工具:

2b40104f5a4a45379aba0c90bf743fad


NCNN转换Tensorflow模型有问题; Caffe没有Pytorch和MXNET好用; 最终在MXNet和Pytorch之间选择了MXNet。

人像数据集

  • https://github.com/lemondan/HumanParsing-Dataset

  • https://github.com/ZhaoJ9014/Multi-Human-Parsing_MHP

  • COCO人像数据集 – 加入后效果质的飞跃

  • ADE20K

网上找了上面几个数据集,抽取出人像部分,采用基本的flip/crop/rotate操作做了扩充,得到228423张训练样本,另外凑了9064张验证样本。

模型转换(MXNET->NCNN

MXNET的UNET版本并没有现成可用的合适版本。参照其他版本的UNET,自己coding完成一个版本。代码请参考: https://github.com/xuduo35/unet_mxnet2ncnn。

在这个基础上训练完成,用来测试ncnn转换基本可用。这里提一下转换过程遇到的一些问题和解决方案。

一个是调用ncnn extract函数会crash,经过调查,发现mxnet2ncnn工具也有bug,blob个数算错,其次是input层one_blob_only标志我的理解应该是false,不知道什么原因转换过来的模型这边是true,导致forward_layer函数里面bottoms变量访问异常。后来一层层extract出来打印输出的channel/width/height调查后又发现,自己代码里unet.py里的name为pool5写成了pool4,前面的crash跟这个致命错误有关系也有直接关联。

第二个问题是转成ncnn后的预测结果死活不对。只能一层层去检查,写了几个简单的工具可以打印中间隐藏层的结果(代码: https://github.com/xuduo35/unet_mxnet2ncnn/check.py)。在这个基础之上,发现是第一次反卷积就出了问题(mxnet神经网络trans_conv6的输出)。结果完全不一致,按个人理解,反卷积算法会出问题的可能性基本为0,所以把mxnet这一层的权重值打印了出来。再在mxnet2ncnn的代码里把对应的参数打印,最后发现是num_group出了问题,简单处理就是把mxnet2ncnn.cpp里的反卷积num_group固定为1,终于解决问题。得到正确的输出结果:


中间还遇到一些ncnn和mxnet之间图像格式之类的转换问题,特别是浮点数的处理,就不啰嗦了。另外,调试过程发现,ncnn的中间层输出和mxnet的输出不是完全一致,可能是有一些参数或者运算细节问题,不影响最后mask结果,暂时忽略。

几个问题

到目前为止还存在几个问题,1. 模型比较大;2. 单帧处理需要15秒左右的时间(Mac Pro笔记本,ncnn没有使用openmp的情况);3. 得到的mask结果不是特别理想。针对这三个问题,对网络结构进行调整。

1. 模型比较大

采取将网络卷积核数量减少4倍的方式,模型大小下降到2M,粗略用图片测试,效果也还可以。同时把之前用0值填充图片的方式,改成用边界值填充,因为测试的时候发现之前的方式总在填充的边界往往会出现检测错误。

2. 单帧处理需要15秒左右的时间

按照第一步处理之后,基本上一张图片只要1秒钟就处理完成,。在手机上由于NCNN做了优化,经过测试速度是Mac Pro的好几倍。

3. 得到的mask结果不是特别理想

在权衡模型大小和准确率的基础上修改UNET网络结构,具体不再赘述。

最终结果




声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 移动端
    +关注

    关注

    0

    文章

    40

    浏览量

    4364
收藏 人收藏

    评论

    相关推荐

    画面分割器怎么调试

    画面分割器,通常指的是视频画面分割器,它是一种可以将一个视频信号分割成多个小画面的设备。这种设备广泛应用于监控系统、视频会议、多画面显示等场景。调试画面分割器是一个技术性很强的工作,需
    的头像 发表于 10-17 09:32 284次阅读

    画面分割器怎么连接

    画面分割器,也称为视频分割器或多画面处理器,是一种可以将多个视频信号源分割成单个画面或多个画面显示在单个监视器上的设备。这种设备广泛应用于监控系统、视频会议、多媒体展示等领域。 一、画面分割
    的头像 发表于 10-17 09:29 227次阅读

    芯盾时代设备指纹技术如何助力移动安全

    随着移动互联网的快速发展,移动安全风险频发。设备指纹技术凭借高精度的设备识别能力,能够帮助企业提升移动安全防护能力,精准区分合法与风险行
    的头像 发表于 08-28 09:41 455次阅读

    图像语义分割的实用性是什么

    图像语义分割是一种重要的计算机视觉任务,它旨在将图像中的每个像素分配到相应的语义类别中。这项技术在许多领域都有广泛的应用,如自动驾驶、医学图像分析、机器人导航等。 一、图像语义分割的基本原理 1.1
    的头像 发表于 07-17 09:56 358次阅读

    图像分割和语义分割的区别与联系

    图像分割和语义分割是计算机视觉领域中两个重要的概念,它们在图像处理和分析中发挥着关键作用。 1. 图像分割简介 图像分割是将图像划分为多个区域或对象的过程。这些区域或对象具有相似的属性
    的头像 发表于 07-17 09:55 711次阅读

    图像分割与目标检测的区别是什么

    图像分割与目标检测是计算机视觉领域的两个重要任务,它们在许多应用场景中都发挥着关键作用。然而,尽管它们在某些方面有相似之处,但它们的目标、方法和应用场景有很大的不同。本文将介绍图像分割与目标检测
    的头像 发表于 07-17 09:53 1119次阅读

    机器学习中的数据分割方法

    在机器学习中,数据分割是一项至关重要的任务,它直接影响到模型的训练效果、泛化能力以及最终的性能评估。本文将从多个方面详细探讨机器学习中数据分割的方法,包括常见的分割方法、各自的优缺点、适用场景以及实际应用中的注意事项。
    的头像 发表于 07-10 16:10 1334次阅读

    图像分割与语义分割中的CNN模型综述

    图像分割与语义分割是计算机视觉领域的重要任务,旨在将图像划分为多个具有特定语义含义的区域或对象。卷积神经网络(CNN)作为深度学习的一种核心模型,在图像分割与语义分割中发挥着至关重要的
    的头像 发表于 07-09 11:51 688次阅读

    机器人视觉技术中常见的图像分割方法

    机器人视觉技术中的图像分割方法是一个广泛且深入的研究领域。图像分割是将图像划分为多个区域或对象的过程,这些区域或对象具有某种共同的特征,如颜色、纹理、形状等。在机器人视觉中,图像分割对于物体识别
    的头像 发表于 07-09 09:31 495次阅读

    Bitwarden将重写移动平台客户,采用现代开发语言以适应新系统

     据了解,Bitwarden自8年前起便是借助Microsoft Xamarin框架建立了手机平台客户,这一框架可以让开发者借助现有的安卓 / iOS平台代码,以节省开发时间及成本。
    的头像 发表于 03-04 14:55 758次阅读

    移动协作机器人的RGB-D感知的处理方案

    本文提出了一种用于具有双目视觉的自主机器人的三维语义场景感知的流程。该流程包括实例分割、特征匹配和点集配准。首先,利用RGB图像进行单视图三维语义场景分割,将2D数据集中的常见对
    发表于 02-21 15:55 625次阅读
    <b class='flag-5'>移动</b>协作机器人的RGB-D感知的<b class='flag-5'>端</b>到<b class='flag-5'>端</b>处理方案

    AWTK 串口屏开发(5) - MCU SDK 用法

    AWTK开源智能串口屏,不但开放了串口屏全部源码,还提供了MCUSDK,大大加快MCU软件的开发。本介绍一下MCUSDK在不同平台上的用法。完整示例可以参考下面的
    的头像 发表于 01-06 08:24 404次阅读
    AWTK 串口屏<b class='flag-5'>开发</b>(5) - MCU<b class='flag-5'>端</b> SDK 用法

    最强人像再封神!Find X7 系列首发全新哈苏回眸人像

    即将在1月8日发布的封神旗舰 Find X7 系列公布了全新的哈苏大师影像特性。Find X7系列将首次支持哈苏回眸人像能力,第一次为手机的人像模式带来捕捉动态的能力,可以清晰捕捉动感瞬间,让手机
    发表于 01-05 10:29 340次阅读
    最强<b class='flag-5'>人像</b>再封神!Find X7 系列首发全新哈苏回眸<b class='flag-5'>人像</b>

    【爱芯派 Pro 开发板试用体验】+ 图像分割和填充的Demo测试

    /ChaoningZhang/MobileSAM)是一个轻量化的框架,它的目标是通过用轻量化图像编码器取代复杂的图像编码器,使SAM对移动友好。MobileSAM的推理速度特别快,所以我们才能
    发表于 12-26 11:22

    时擎科技:致力于成为边智能交互和信号处理芯片的领导者

    时擎科技基于核心自研RISC-V智能处理器和向量处理器,和配套的软件开发部署工具,与构建在其上的各类边语音和视觉的分类、分割、检测、识别智能算法,算法、处理器、开发部署工具三位一体,
    的头像 发表于 12-11 10:59 682次阅读