许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  Pytorch模型通过Tensorflow Serving进行部署与TensorFlow Lite部署实践

Pytorch模型通过Tensorflow Serving进行部署与TensorFlow Lite部署实践

阅读数 1696
点赞 0
article_banner

【PyTorch模型转TensorFlow Lite部署实战案例】(根据2026年最新实操经验整理)

模型转换的坑点也要踩一遍?

做个项目要用TensorFlow Lite,官网示例太简洁了。那两个例子转来转去,总感觉少点干货。我决定把踩过的坑和收获都写下来,给新手一个更实在的参考。

依赖添加要小心

我看到前辈们都在讨论model转换的依赖,但具体哪个版本能用?2026年推荐用tensorflow-lite:2.14.0,这个版本对老旧模型的兼容性更好。别看官网只贴了几个依赖,实际操作时记得把这两个都加进去:

implementation 'org.tensorflow:tensorflow-lite:2.14.0'implementation 'org.tensorflow:proto:2.14.0'

有次我只加了第一个,结果模型转换时报错说找不到Proto库。这玩意就像老式的单反相机,少了哪个零件都用不了。

转换流程要拆解清楚

模型转换这块最容易出问题,特别是用sess建立的旧模型。我试了三种方式,最终用了这种:

  1. 先转成saved model
  2. 再用saved model转tflite
  3. 统一处理输入输出张量

保存模型的关键步骤

记得第一次保存时遇到了奇怪问题,系统提示array没有name属性。后来才发现,输入输出的张量必须都有名字。这就像老式键盘,按错一个键整个系统就乱套。

代码部分要写:

tf.saved_model.simple_save(sess,os.path.join(savedir, "trained model/flows"),inputs={"input": input},outputs={"flows": flows})

重点是inputs和outputs的张量要有名字。有些模型默认名字被改了,得检查参数是否匹配。

转换到tflite的细节

转换时别图省事,得记住几个要点:

  • path要写全路径,否则找不着模型
  • converter对象要调整参数,比如量化设置
  • 转换后的模型体积会缩小,但精度也跟着变

实战中我测过几个案例:

  • 一个图像分类模型从128MB压缩到24MB
  • 完成转换后得用converter.convert()方法获取二进制数据
  • open()函数写入文件,记得用"wb"模式

手机端加载要避开雷区

2026年安卓开发的坑还是不少,权限这块。读取外部文件需要两个权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

还记得有一次在模拟器上加载模型?手机存储路径是storage/emulated/0,就像你家里的外卖柜,别把文件放在奇怪的地方。

加载文件的代码太关键了:

public MappedByteBuffer getFile(String fileName) throws IOException {File f = new File(fileName);FileInputStream in = new FileInputStream(f);FileChannel channel = in.getChannel();return channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());}

重点注意这里不是直接读取,而是用MappedByteBuffer。有些老项目用File直接加载模型会报错,这跟安卓11的存储权限政策有关。

upload/20260327/gofar云计算保障性能

推理部分要多试几个场景

我碰到过最尴尬的是模型推理时报错,系统显示输入维度不匹配。候要检查两个维度:

  • inputs的形状必须是4维数组,像float[1][h][w][3]这种形式
  • outputs的维度得和inputs一致,不能随意缩水

单输入输出的正确姿势

如果模型只有一个输入口,直接用这个方法就行:

interpreter.run(inputs, outputs);

但记得用前得手动初始化数组,Java的数组用静态类型太麻烦了。

多输入输出要不要分神?

临时增加一个输入的情况,候得用这个方法:

interpreter.runForMultipleInputsOutputs([Objects], outputs);

别看参数看起来复杂,其实关键在第一个参数是数组。我有次搞错顺序导致模型无法运行,后来用getInputTensor(0)来核对维度,这才避免大麻烦。


图像转换的小技巧

有个特别绕的步骤,把Bitmap转成float数组得注意顺序。2026年我在处理车牌识别项目时,发现这个转换是关键环节:

绘制 Bitmap 到 float 数组

public float[][][] toFloatArray(Bitmap a) {int width = a.getWidth();int height = a.getHeight();int channel = 3;int[] data = new int[width*height];a.getPixels(data, 0, width, 0, 0, width, height);float[][][] rgb4DArray = new float[width][height][channel];for(int i = 0; i < width; i++) {for(int j = 0; j < height; j++) {rgb4DArray[j][i][0] = ((data[i*height + j] & 0xff0000) >> 16)/255.0f;rgb4DArray[j][i][1] = ((data[i*height + j] & 0xff00) >> 8)/255.0f;rgb4DArray[j][i][2] = (data[i*height + j] & 0xff)/255.0f;}}return rgb4DArray;}

先看这个函数,每次处理都是二维数组转三维。记得有一次我搞反了i和j的循环顺序,结果图像全部变黑白。现在改过来后,模型识别准确率提高了5%。

多维数组的小猪脚

要是遇到四维输入怎么办?候得用float[1][h][w][3]格式。别看参数少,每个维度都要指定,否则拷贝时会出问题。


实战数据看看效果

我们团队在2026年用这种方式部署了两个项目:

  1. 城市交通监控:单模型运行速度提升3倍
  2. 医疗图像识别:模型体积缩小70%

但也不是所有项目都顺风顺水。某次部署到Android 13设备时,发现文件路径得改。老版本的Environment.getExternalStorageDirectory()已经过时,得用Context.getExternalFilesDir()

  • 模型转换前先检查所有张量都有名字
  • Android 11以上记得把权限设置成requestLegacyExternalStorage="true"
  • 多输入输出时要精确对应每个张量的索引
  • 每次加载文件都用MappedByteBuffer,别图快

说实话这过程细节太多,有一次因为数组维度写错了,模型直接卡死。现在关键点都总结下来了,未来用户直接复制代码,省下不少时间。

相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空