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

    文章

    43

    浏览量

    4701
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Flutter 移动开发:集成淘宝 API 实现商品数据实时展示 APP

    在电商蓬勃发展的当下,移动购物成为主流趋势。对于开发者而言,利用 Flutter 构建一个能够实时展示淘宝商品数据的 APP,既能满足用户便捷获取商品信息的需求,也能为电商业务拓展新的渠道
    的头像 发表于 11-13 09:36 172次阅读

    设备管理系统移动应用(APP):外勤维保效率提升6大实操技巧

    对企业而言,落地移动的关键不是“功能多全”,而是“是否贴合外勤需求”,只要掌握这6个技巧,就能让外勤维保效率翻倍。
    的头像 发表于 10-24 16:09 466次阅读
    设备管理系统<b class='flag-5'>移动</b><b class='flag-5'>端</b>应用(APP):外勤维保效率提升6大实操技巧

    福州移动与华为联合推出国内首个智能化体验经营系统

    近日,福州移动与华为联合推出国内首个智能化体验经营系统,通过多智能管理系统协同,实现场景化体验套餐的可预估、可保障、可保护、可评估,分层分级保障用户在热门景区、大型演唱会和体育赛事的流畅
    的头像 发表于 10-24 09:46 330次阅读

    手机板 layout 走线跨分割问题

    初学习layout时,都在说信号线不可跨分割,但是在工作中为了成本不能跨分割似乎也非绝对。 在后续工作中,跨分割的基础都是相邻层有一面完整的GND参考,跨分割发生在相邻的另外一层。 但
    发表于 09-16 14:56

    负载减少50%!Arm用AI重新定义移动图形渲染

    电子发烧友网报道(文 / 吴子鹏)在移动互联网与游戏产业深度融合的当下,用户对移动游戏体验的期待持续攀升 —— 更清晰的画质、更流畅的帧率、更长的续航能力。然而,要在移动
    发表于 08-20 08:00 3852次阅读
    负载减少50%!Arm用AI重新定义<b class='flag-5'>移动</b><b class='flag-5'>端</b>图形渲染

    美光宣布:停止移动 NAND开发,包括终止UFS5开发

    产品的开发,包括终止UFS5的开发。 此项决策仅影响全球移动 NAND 产品的开发工作,美光将继续开发并支持其他 NAND 解决方案,如S
    的头像 发表于 08-12 13:39 2866次阅读

    移动电源 PCBA 开发方案全解析

    移动设备普及的当下,移动电源已成为人们日常生活和工作中不可或缺的配件。而移动电源的性能与可靠性,很大程度上取决于其内部的 PCBA(印刷电路板组件)。本文将全面解析移动电源 PCBA
    的头像 发表于 07-28 11:02 543次阅读

    北京迅为itop-3588开发板NPU例程测试deeplabv3 语义分割

    北京迅为itop-3588开发板NPU例程测试deeplabv3 语义分割
    的头像 发表于 07-22 15:51 829次阅读
    北京迅为itop-3588<b class='flag-5'>开发</b>板NPU例程测试deeplabv3 语义<b class='flag-5'>分割</b>

    迅为RK3576开发板摄像头实时推理测试-ppseg 图像分割

    迅为RK3576开发板摄像头实时推理测试-ppseg 图像分割
    的头像 发表于 07-11 14:31 718次阅读
    迅为RK3576<b class='flag-5'>开发</b>板摄像头实时推理测试-ppseg 图像<b class='flag-5'>分割</b>

    HarmonyOS 代码工坊的指尖开发,让 APP 开发所见即所得

    过去,移动 APP 的开发,往往是开发者在桌面仿真界面上的一场“隔空演练”。 虽然市面上已经有一些简化开发的工具,可以在
    的头像 发表于 06-24 12:08 653次阅读
    HarmonyOS 代码工坊的指尖<b class='flag-5'>开发</b>,让 APP <b class='flag-5'>开发</b>所见即所得

    【正点原子STM32MP257开发板试用】基于 DeepLab 模型的图像分割

    STM32MP257 开发板基于 DeepLab 模型实现图像分割的项目设计,包括 DeepLab 模型介绍、官方Demo例程测试、USB 摄像头采集画面的动态图像分割、板图片静态
    发表于 06-21 21:11

    labview使用tcp接收下位机数据,最大也就200Hz,如何提高速率到500Hz?

    labview使用tcp采集数据,使用了生产者-消费者模式,将接收功能和存储、显示功能分割开来,用队列在中间传输数据,但是这样速率也很慢,最多也就达到200Hz,有没有别的办法能够提升接收速率到500Hz呢?
    发表于 06-11 16:18

    Arm 公司面向移动市场的 ​Arm Lumex​ 深度解读

    子系统(CSS)​ ​ 在移动的落地形态,Lumex 旨在通过高度集成化的软硬件方案,解决移动设备在 AI 性能、能效比与开发效率上的挑战。以下从技术架构、性能突破、应用场景、生态系
    的头像 发表于 05-29 09:54 4069次阅读

    MWC2025亮点放送 探索Arm如何塑造移动技术未来

    ,彰显了人工智能 (AI) 和移动技术之间的共生关系。  Arm 计算平台赋能从云到边的 AI 体验。Arm 通过提供的高能效、高性能计算,致力于不断演进的技术领域,MWC 正
    的头像 发表于 03-14 15:40 1287次阅读
    MWC2025亮点放送 探索Arm如何塑造<b class='flag-5'>移动</b><b class='flag-5'>端</b>技术未来

    BEM在移动开发中的应用案例

    BEM(Block Element Modifier)在移动开发中的应用案例非常广泛,它作为一种前端开发中的命名规范和架构方法,旨在提高代码的可维护性和复用性。以下是一些具体的应用案
    的头像 发表于 02-12 17:13 839次阅读