这两天准备把pytorch的分类模型导入到android stdio进行部署。发现以下问题,主要是pytorch 1.9 和1.10的问题。
最初参考的是 https://wanghao.blog.csdn.net/article/details/122860445?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-122860445-blog-104751029.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-122860445-blog-104751029.pc_relevant_default&utm_relevant_index=2#t0
这篇文章。
首先官网有一些简单的示例:https://github.com/pytorch/android-demo-app。
按照官网的提示,其实也可以直接就跑起来。几乎不用改什么东西。
但是由于我自己的模型是torch1.10版本的,所以下个换成1.10的依赖
implementation ‘org.pytorch:pytorch_android:1.10.0’
implementation ‘org.pytorch:pytorch_android_torchvision:1.10.0’
还要注意的是如果转换模型用的是lite优化了:
optimized_traced_model = optimize_for_mobile(traced_script_module)
optimized_traced_model._save_for_lite_interpreter(“app/src/main/assets/model.pt”)
那就得用org.pytorch:pytorch_android_lite:1.10.0’。没有优化就用org.pytorch:pytorch_android:1.10.0。
烦人的事出现了,如果用优化的,那么会出现类重复,尝试改成 compileOnly org.pytorch:pytorch_android_lite:1.10.0。会报错litemodulelist找不到,但是这个明明就在里面,无法解决,奇怪的是用torch 1.9版本就什么事都没有。
所以只能用未优化的1.10,注意两点,因为1.10的jar包中没有litemodulelist这个类,所以注意把载入方式改成module.load。第二就是sdk版本太低会造成xxx.so找不到,升级一下到30以上就可以。
遗憾的是,未优化的模型测出来好像不是很准,不知道为什么。优化的模型就可以测出来这是个车。用的都是1000的imagenet数据集预训练模型
最后,如果用最新的torch1.12就会报错,版本太高了。所以最好是用1.9的,可以优化。