human_matting_android_demo

Introduction: 基于 PaddleSeg 的 ModNet 算法实现人像抠图(安卓版 demo)
More: Author   ReportBugs   
Tags:

基于PaddleSegMODNet算法实现人像抠图(安卓版 demo)。

可以直接下载安装本示例工程中的apk进行体验。

1. 效果展示

原图
新背景

在手机上进行人像抠图然后再替换背景:

2. 安卓 Demo 使用说明

2.1 要求

  • Android Studio 3.4;
  • Android 手机;

2.2 一键安装

  • git clone https://github.com/qianbin1989228/human_matting_android_demo.git ;
  • 打开 Android Studio,在"Welcome to Android Studio"窗口点击"Open an existing Android Studio project",在弹出的路径选择窗口中选择刚 git 下来的文件夹,然后点击右下角的"Open"按钮即可导入工程,构建工程的过程中会自动下载 demo 需要的 Lite 预测库;
  • 通过 USB 连接 Android 手机;
  • 载入工程后,点击菜单栏的 Run->Run 'App'按钮,在弹出的"Select Deployment Target"窗口选择已经连接的 Android 设备,然后点击"OK"按钮;

注:此安卓 demo 基于Paddle-Lite开发,PaddleLite 版本为 2.8.0。

2.3 预测

  • 在人像抠图 Demo 中,默认会载入一张人像图像,并会在图像下方给出 CPU 的预测结果和预测时延;
  • 在人像抠图 Demo 中,你还可以通过右上角的"打开本地相册"和"打开摄像头拍照"按钮分别从相册或相机中加载测试图像然后进行预测推理;

注意:demo 中拍照时照片会自动压缩,想测试拍照原图效果,可使用手机相机拍照后从相册中打开进行预测。

3. 二次开发

可按需要更新预测库或模型进行二次开发,其中更新模型分为模型导出和模型转换两个步骤。

3.1 更新预测库

Paddle-Lite 官网提供了预编译版本的安卓预测库,也可以参考官网自行编译。

Paddle-Lite 在安卓端的预测库主要包括三个文件:

  • PaddlePredictor.jar;
  • arm64-v8a/libpaddle_lite_jni.so;
  • armeabi-v7a/libpaddle_lite_jni.so;

下面分别介绍两种方法:

  • 使用预编译版本的预测库,最新的预编译文件参考:release,此 demo 使用的版本

    解压上面文件,PaddlePredictor.jar 位于:java/PaddlePredictor.jar;

    arm64-v8a 相关 so 位于:java/libs/arm64-v8a;

    armeabi-v7a 相关 so 位于:java/libs/armeabi-v7a;

  • 手动编译 Paddle-Lite 预测库 开发环境的准备和编译方法参考:Paddle-Lite 源码编译

准备好上述文件,即可参考java_api在安卓端进行推理。具体使用预测库的方法可参考Paddle-Lite-Demo中更新预测库部分的文档。

3.2 模型导出

此 demo 的人像抠图采用 Backbone 为 HRNet_W18 的 MODNet 模型,模型训练教程请参考官网,官网提供了 3 种不同性能的 Backone:MobileNetV2、ResNet50_vd 和 HRNet_W18。本安卓 demo 综合考虑精度和速度要求,采用了 HRNet_W18 作为 Backone。可以直接从官网下载训练好的动态图模型进行算法验证。

为了能够在安卓手机上进行推理,需要将动态图模型导出为静态图模型,导出时固定图像输入尺寸即可。

首先 git 最新的PaddleSeg项目,然后 cd 进入到 PaddleSeg/contrib/Matting 目录。将下载下来的 modnet-hrnet_w18.pdparams 动态图模型文件(也可以自行训练得到)放置在当前文件夹(PaddleSeg/contrib/Matting)下面。然后修改配置文件 configs/modnet_mobilenetv2.yml(注意:虽然采用 hrnet18 模型,但是该模型依赖的配置文件 modnet_hrnet_w18.yml 本身依赖 modnet_mobilenetv2.yml),修改其中的 val_dataset 字段如下:

val_dataset:
  type: MattingDataset
  dataset_root: data/PPM-100
  val_file: val.txt
  transforms:
    - type: LoadImages
    - type: ResizeByShort
      short_size: 256
    - type: ResizeToIntMult
      mult_int: 32
    - type: Normalize
  mode: val
  get_trimap: False

上述修改中尤其注意 short_size: 256 这个字段,这个值直接决定我们最终的推理图像采用的尺寸大小。这个字段值设置太小会影响预测精度,设置太大会影响手机推理速度(甚至造成手机因性能问题无法完成推理而奔溃)。经过实际测试,对于 hrnet18,该字段设置为 256 较好。

完成配置文件修改后,采用下面的命令进行静态图导出:

python export.py \
    --config configs/modnet/modnet_hrnet_w18.yml \
    --model_path modnet-hrnet_w18.pdparams \
    --save_dir output

转换完成后在当前目录下会生成 output 文件夹,该文件夹中的文件即为转出来的静态图文件。

3.3 模型转换

3.3.1 模型转换工具

准备好 PaddleSeg 导出来的静态图模型和参数文件后,需要使用 Paddle-Lite 提供的 opt 对模型进行优化,并转换成 Paddle-Lite 支持的文件格式。

首先安装 PaddleLite:

pip install paddlelite==2.8.0

然后使用下面的 python 脚本进行转换:

# 引用 Paddlelite 预测库
from paddlelite.lite import *

# 1. 创建 opt 实例
opt=Opt()

# 2. 指定静态模型路径 
opt.set_model_file('./output/model.pdmodel')
opt.set_param_file('./output/model.pdiparams')

# 3. 指定转化类型: arm、x86、opencl、npu
opt.set_valid_places("arm")
# 4. 指定模型转化类型: naive_buffer、protobuf
opt.set_model_type("naive_buffer")
# 5. 输出模型地址
opt.set_optimize_out("./output/hrnet_w18")
# 6. 执行模型优化
opt.run()

转换完成后在 output 目录下会生成对应的 hrnet_w18.nb 文件。

3.3.2 更新模型

将优化好的.nb文件,替换安卓程序中的 app/src/main/assets/image_matting/ models/modnet 下面的文件即可。

然后在工程中修改图像输入尺寸:打开 string.xml 文件,修改示例如下:

<string name="INPUT_SHAPE_DEFAULT">1,3,256,256</string>

1,3,256,256 分别表示图像对应的 batchsize、channel、height、width,我们一般修改 height 和 width 即可,这里的 height 和 width 需要和静态图导出时设置的尺寸一致。

整个安卓 demo 采用 java 实现,没有内嵌 C++代码,构建和执行比较简单。未来也可以将本 demo 移植到 java web 项目中实现 web 版人像抠图。

Apps
About Me
GitHub: Trinea
Facebook: Dev Tools