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

    文章

    38

    浏览量

    4298
收藏 人收藏

    评论

    相关推荐

    机智云开发者中心:让移动APP应用开发更智能化

    移动应用市场的蓬勃发展中,开发者们面临着不断提高效率和创新的挑战。为了帮助开发者更好地实现移动应用开发的目标,机智云物联网的新版
    的头像 发表于 03-26 16:45 126次阅读
    机智云<b class='flag-5'>开发</b>者中心:让<b class='flag-5'>移动</b>APP应用<b class='flag-5'>开发</b>更智能化

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

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

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

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

    机器视觉图像分割的方法有哪些?

    现有的图像分割方法主要分以下几类:基于阈值(threshold)的分割方法、基于区域的分割方法、基于边缘的分割方法以及基于特定理论的分割方法
    发表于 11-02 10:26 383次阅读
    机器视觉图像<b class='flag-5'>分割</b>的方法有哪些?

    机器视觉(六):图像分割

    基于阈值的分割方法是一种应用十分广泛的图像分割技术,其实质是利用图像的灰度直方图信息获取用于分割的阈值,一个或几个阈值将图像的灰度级分为几个部分,认为属于同一部分的像素是同一个物体。
    的头像 发表于 10-22 11:34 539次阅读
    机器视觉(六):图像<b class='flag-5'>分割</b>

    艺术人像定制如何实现彩色三维扫描

    双光源手持彩色3D扫描仪EinScan H2凭借其强大的色彩还原能力及细节捕捉能力,可以快速获取高质量真彩人像三维模型,为基于人像3D数据的实物创作提供可靠的数据支撑。 → 真人3D手办 → 蜡像定制 → 人像
    的头像 发表于 10-16 14:11 185次阅读

    有限状态机分割设计

    有限状态机分割设计,其实质就是一个状态机分割成多个状态机
    的头像 发表于 10-09 10:47 359次阅读

    使用PyTorch加速图像分割

    使用PyTorch加速图像分割
    的头像 发表于 08-31 14:27 495次阅读
    使用PyTorch加速图像<b class='flag-5'>分割</b>

    什么是图像分割?图像分割的体系结构和方法

    图像分割(Image Segmentation)是计算机视觉领域中的一项重要基础技术,是图像理解中的重要一环。前端时间,数据科学家Derrick Mwiti在一篇文章中,就什么是图像分割、图像分割架构、图像
    的头像 发表于 08-18 10:34 2626次阅读
    什么是图像<b class='flag-5'>分割</b>?图像<b class='flag-5'>分割</b>的体系结构和方法

    机器视觉应用软件开发步骤及流程设计

    所谓图像分割是指将图像中具有特殊含义的不同区域分割开来,这些区域是互相不交叉的,每个区域都满足特定区域的一致性。
    发表于 08-05 10:07 652次阅读

    基于深度学习的点云分割的方法介绍

      摘 要:点云分割是点云数据理解中的一个关键技术,但传统算法无法进行实时语义分割。近年来深度学习被应用在点云分割上并取得了重要进展。综述了近四年来基于深度学习的点云分割的最新工作,按
    发表于 07-20 15:23 0次下载

    人体分割识别图像技术的原理及应用

    人体分割识别图像技术是一种将人体从图像中分割出来,并对人体进行识别和特征提取的技术。该技术主要利用计算机视觉和图像处理算法对人体图像进行预处理、分割、特征提取和识别等操作,以实现自动化的身份认证
    的头像 发表于 06-15 17:44 695次阅读

    SAM分割模型是什么?

    SAM是一类处理图像分割任务的通用模型。与以往只能处理某种特定类型图片的图像分割模型不同,SAM可以处理所有类型的图像。
    的头像 发表于 05-20 09:30 1575次阅读

    AI算法说-图像分割

    语义分割是区分同类物体的分割任务,实例分割是区分不同实例的分割任务,而全景分割则同时达到这两个目标。全景
    的头像 发表于 05-17 14:44 890次阅读
    AI算法说-图像<b class='flag-5'>分割</b>

    没你想的那么难 | 一文读懂图像分割

    来源:图灵Topia(ID:turingtopia)图像分割(ImageSegmentation)是计算机视觉领域中的一项重要基础技术,是图像理解中的重要一环。近日,数据科学家
    的头像 发表于 05-16 09:21 621次阅读
    没你想的那么难 | 一文读懂图像<b class='flag-5'>分割</b>