高通AI应用快速上手:安卓图片增强开发

9 篇文章 0 订阅

“图像增强”,是通过算法将原图像附加一些信息或数据,有选择的将图像中感兴趣的部分突出. 本文介绍了基于 高通Snapdragon Neural Processing Engine SDK和EnlightenGAN模型实现一个图片增强功能的应用。该应用的所有源代码都可以在https://github.com/quic/qidk/tree/master/Solutions/VisionSolution3-ImageEnhancement 上获得。

        我们使用Snapdragon 8 Gen 2 的Android手机验证测试这些代码,实际上这些示例代码在任何支持Snapdragon Neural Processing Engine SDK的手机上都可以运行,一次编写多次部署。

      这里使用到的模型为EnlightenGAN:Deep Light Enhancement without Paired Supervision,EnlightenGAN提出了一种高效的无监督生成对抗性网络,称为EnlightenCAN,可以在没有弱光和正常光图像的情况下进行训练,但事实证明,该网络在各种真实世界的测试图像上都能很好地运用。它建议使用从输入本身提取的信息来规范不成对的训练,而不是使用基本真实数据来监督学习,并对弱光图像增强的一系列创新进行基准测试,包括全局-局部判别器结构,自正则化感知损失,以及自正则注意机制(a global-local discriminator structure, a self-regularized perceptual loss fusion, and the attention mechanism)。通过大量实验,在视觉品质和主观用户学习方面,在各种指标下都优于新近的方法。由于非配对训练带来的巨大灵活性,EnlightenGAN被证明能够轻松适应增强来自各个领域的真实世界图像。

前置条件

  • 高通Snapdragon 安卓手机,推荐Snapdragon 8 Gen 2系列手机
  • PC上下载并设置好Qualcomm Neural Processing SDK

       相关步骤参考https://developer.qualcomm.com/sites/default/files/docs/snpe/setup.html

  • Android Studio导入示例项目
  • Android NDK构建本地代码
  • 一台Ubuntu 20.04机器

操作步骤:

1. 将ONNX模型转换为DLC模型

  • 在Linux主机上完成模型转换
  • 在机器上设置ONNX。

       下载预先训练的onnx模型-https://github.com/arsenyinfo/enlightengan-inference/tree/main/enlighten_inference

        wget https://github.com/arsenyinfo/EnlightenGAN-inference/raw/main/enlighten_inference/enlighten.onnx

        onnxsim enlighten.onnx enlighten_opt.onnx

  • 使用以下命令将onnx模型转换为DLC。下面命令将输入的张量为固定shape。

            snpe-onnx-to-dlc -i enlighten_opt.onnx -d input 1,3,240,320 -o enlighten_fixed.dlc

  • 把示例代码中的data文件夹和list.txt与上一步生成的dlc文件放再同一个目录下,运行下面命令量化模型。“data”文件夹保存了实际输入到模型的张量raw文件。“list.txt”具有数据目录中所有文件的名称 

       snpe-dlc-quantize --input_dlc enlighten_fixed.dlc --input_list list.txt --use_enhanced_quantizer --

       use_adjusted_weights_quantizer --axis_quant --output_dlc enlight_axisQ_cached.dlc --enable_htp --htp_socs sm8550

2. 关键代码段

代码架构

  • demo:包含演示视频、GIF
  • snpe-release:包含AI SDK发布的AI SDK二进制文件。如果AI SDK版本随着时间出现重大改动,建议重新生成DLC并替换AI SDK版本二进制文件。
  • enhancement:包含标准Android应用程序格式的源文件。

Model初始化

在使用Model之前,必须先对其进行初始化。初始化过程需要以下参数:

  • ContextActivity Application context
  • ModelName:要使用的Model的名称
  • String runtime:一个特定的runtime(run_time可选择的有CPU、GPU_FLOAT16和DSP)。

    package com.qcom.enhancement;

    ...

    public class SNPEActivity extends AppCompatActivity {

    public static final String ENHANCEMENT_SNPE_MODEL_NAME = "enlight_axisQ_cached";

    ...

    public Result<EnhancedResults> process(Bitmap bmps, String run_time){

    ....

        enhancOps = new EnhancOps();

        // Model is initialised in below fun. Model config been set as per AI SDK.

        boolean enhancementInited = enhancOps.initializingModel(this, ENHANCEMENT_SNPE_MODEL_NAME, run_time);

        }

}

运行Model

初始化Model后,可以传递要处理的bitmaps列表。

如前所述,DLC模型可以使用特定的图像大小。因此,在将图像传递给DLC之前,我们需要将输入图像调整为DLC接受的大小

此源代码使用运算符来帮助用户进行图像预处理。sizeOperation参数为Process方法,可用于预处理图像,如下所示:

注意:如果用户已经传递了确切的输入大小240x320 sizeOperation应设置为1。

  • 0:没有更改
  • 1:if(IMAGE_WITH=INPUT_HEIGHT and IMAGE_HEIGHT=INPUT_WIDTH)(用户根据型号要求传递输入大小)
  • 2:if((IMAGE_WITH/INPUT_WIDTH)=(IMAGE_HEIGHT/INPUT_HEIGHT))(需要缩放输入)

             int sizeOperation = 1;

             // Function to process the enhancement operation

             result = enhancOps.process(new Bitmap[] {bmps}, sizeOperation);   

Results

  • 处理后的结果为EnhancedResults的Result对象中返回。
  • EnhancedResults包含一个bitmaps数组,每个bitmaps表示一个增强过程(在示例中只有一个bitmaps)。
  • 除了此列表之外,还有用于获取性能信息的inferenceTime的进程。

Release

    由于Model初始化过程发生在本地,因此不会进行内存回收;因此,您需要在结束之后释放它。

    enhancOps.freeNetwork();

3. 示例程序编译运行

  1. Clone QIDK repo。
  2. 使用上述步骤生成DLC(enlight_axisQ_cached.DLC)
  3. Qualcomm Developer Network发布的“Qualcomm Neural Processing SDK for AI”中android文件夹中的“snpe-release.aar”文件复制到此文件夹中:VisionSolution3 ImageEnhance\snpe release\

Note: 如果Windows版本无法找到snpe-release.aar,可以安装linux版本,可以找到对应的snpe-release.aar

     4. 将步骤2中生成的DLC复制到:VisionSolution3-ImageEnhancement\enhancement\src\main\assets\(enlight_axisQ_cached.DLC)

     5. 导入文件夹VisionSolution3-ImageEnhancement作为Android Studio中的项目

     6. 编译项目。

     7. 应生成APK文件:enhancement-debug.APK

     8. 使用Snapdragon 8 Gen 2手机安装应用程序(不要在模拟器上运行APK)

         如果未检测到未签名或已签名的DSP runtime,请检查logcat日志中的FastRPC错误。如果由于SELinux权限的原因,可能会无法检测到DSP runtime。请尝试以下命令来设置SELinux权限。

        adb disable-verity

        adb reboot

        adb root

        adb remount

        adb shell setenforce 0

     9. 安装和测试应用程序:enhancement-debug.apk

        adb install -r -t enhancement-debug.apk

   10. 启动应用程序

        以下是基本的“图像增强”Android应用程序

       1. 从下拉列表中选择一个给定的图像

       2. 选择 run-time来运行模型(CPU、GPU或DSP)

       3. 在屏幕上观察模型的结果

       4. 还要注意特定run-time的性能指标(mSec)

演示视频和性能细节如下所示:

文章作者:高通工程师,戴忠忠 

更多高通开发者资源及技术问题请访问:高通开发者论坛

  • 18
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值