热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Pytorch目标检测模型Android移植超超超轻量人脸检测和关键点识别算法(2)

书接上文,我们实现了一个大小仅仅813k的人脸检测模型。如何移植到android呢?Pytorch1.3之后就提供了android移植的开发示例:https:pytorch.org

书接上文,我们实现了一个大小仅仅813 k的人脸检测模型。

如何移植到android呢?

Pytorch1.3之后就提供了android移植的开发示例:https://pytorch.org/mobile/android/

基本流程是Pytorch模型->TorchScrip序列化,然后android调用模型即可.

1.序列化你的模型

import torch import torchvision model = 你的模型 model.eval() example = torch.rand(1, 3, w, h) traced_script_module = torch.jit.trace(model, example) traced_script_module.save("model.pt")

2 . 预处理

读取图片,并且将bitmap转化为Pytorch的Tensor,Pytorch的TensorImageUtils.bitmapToFloat32Tensor可以实现bitmap转化为你需要的Tensor,使用方式是:

final Tensor inputTensor = TensorImageUtils.bitmapToFloat32Tensor(bitmap, TensorImageUtils.TORCHVISION_NORM_MEAN_RGB, TensorImageUtils.TORCHVISION_NORM_STD_RGB);

TensorImageUtils.bitmapToFloat32Tensor会将你的图片先除以255然后用提供的均值方差归一化。

很多时候我们使用的均值和方差以及预处理方式会不同,那么可以参考 TensorImageUtils中的实现重写预处理函数:

bitmap = BitmapFactory.decodeStream(getAssets().open("face.jpg")); float[] face_mean = new float[]{104.0f, 117.0f, 123.0f}; float[] face_std = new float[]{1.0f, 1.0f, 1.0f}; final Tensor inputTensor = bitmapToFloat32Tensor(bitmap, face_mean, face_std);

这样就实现了输入Tensor的转化。

3.模型加载

module = Module.load(assetFilePath(this, "model.pt"));

加载刚刚序列化的模型。

4. 模型推理

final IValue[] outputTensor = module.forward(IValue.from(inputTensor)).toTuple();

5. 后处理

主要是根据上面预测的offset和anchor解码出bbox,之后进行nms即可。

6 . 性能对比

测试了骁龙710和855+推理对比,速度差异挺大的,855大约50~60ms,710大约110ms。

源码:https://github.com/midasklr/facedetection_android.pytorch


推荐阅读
  • 本文分析HashMap的实现原理。数据结构(散列表)HashMap是一个散列表(也叫哈希表),用来存储键值对( ... [详细]
  • 以下不是python文件读写方法的是Python 文件I/O
    Python文件IO本章只讲述所有基本的IO函数,更多函数请参考Python标准文档。打印到屏幕最简单的输出方法是用print语句,你可以给它传递 ... [详细]
  • IDEA实用插件Lombok
    LombokLombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。通常,我们所定义的对象和b ... [详细]
  • DDOSDDOS的中文名叫分布式拒绝服务***,俗称洪水***DDoS***概念DoS的***方式有很多种,最基本的DoS***就是利用合理的服务请求来 ... [详细]
  • selenium 定位方式3css_selector
    关于页面元素定位,可以根据id、class、name属性以及link_text。其中id属性是最理想的定位方式,class与name属性, ... [详细]
  • The“travellingsalesmanproblem”asksthefollowingquestion:“Givenalistofcitiesandthedistancesb ... [详细]
  • Java的核心库提供了大量的现成的类供我们使用。本节我们介绍几个常用的工具类。Math顾名思义,Math类就是用来进行数学计算的,它提供了大量的静态 ... [详细]
  • 找出字符串中重复字符
    2019独角兽企业重金招聘Python工程师标准packagejavaBasic;importjava.util.HashMap;importjava.util.Map; ... [详细]
  • 我正在使用数组列表通过构建一个交互式菜单供用户选择来存储来自用户输入的值。到目前为止,我的两个选择是为用户提供向列表输入数据和读取列表的全部内容。到目前为止,我创建的代码由两个类组成。 ... [详细]
  • 下载完成之后解压提取jl1.0.0.1.jar这里写图片描述将jl1.0.0.1.jar拷贝到项目中,并添加到Library这里写图片描述4.源代码Tip:由于工程名 ... [详细]
  • Shiro 简单了解
    Shiro简单了解简单用过SpringSecurity安全框架后,再试试另一个安全框架——Shiro。1.Shiro简介ApacheShiro是一个强大且易用的Java安全框架:S ... [详细]
  • 1.什么是hashcode方法?hashcode方法返回对象的哈希码值在应用程序的执行期间,只要对象的equals方法的比较操作所用到的信息没有改变& ... [详细]
  • eecg的代码生成器很不错,但是可能有的时候不是那么符合我们实际项目的功能需求,这里会首先介绍jeecg原生生成的样子,以及根据需求进行的改造。Jeecg中的 ... [详细]
  • 1011-MarriageCeremoniesPDF(English)StatisticsForumTimeLimit:2second(s)MemoryLimit:32MBYouw ... [详细]
  • JavaBean和Map 转换 用反射方法实现
    由于JavaBean(实体类)结构与Map类似,我们可以把JavaBean与Map进行转换 ... [详细]
author-avatar
董雅淑_420
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有