谷歌MediaPipe KNIFT的打包

如果刚开始接入,环境配置可以看我的另一篇文章 如果你已经配置了环境,出现了一些问题,也可以参考一下。

谷歌官方Mediapipe KNIFT文档写的操作步骤看着很简单,但是我每执行一条命令,都会错误,解决一个错误就要半天甚至两天时间,真的无语。

谷歌Github存放Mediapipe的项目,里面只有facedetection、facemesh、hands这3个例子项目,是可以用Android Studio运行的,打开路径是mediapipe\examples\android\solutions,把根目录下的res文件夹复制到你想打包的module里就行了。

前言

有些童鞋会跟我一样linux小白,命令不会,也没用过linux电脑(ps:其实我几年前看过一点点的linux特别基础的命令,装过Ubuntu玩玩,现在居然现在用上了),其实不用慌,打开“此电脑”(就是win + E快捷键),在地址栏里输入\\wsl$回车,就会进到wsl虚拟机目录了,所以下面有些修改文件命令,文件拷贝都可以在这里弄,是不是很简单咧。其实我是喜欢敲命令的,感觉比鼠标点还快一些,顺便复习。

如果有些命令报 Permission denied的错误,就是你没权限,命令前面加sudo

有些童鞋可能不懂linux的环境,这里要强调一下,谷歌官网操作的bazel命令,一定要在你的mediapipe目录下执行,就是当前目录下必须有WORKSPACE文件的目录下,你问我为什么,因为WORKSPACE文件就是整个项目的配置文件,就跟Android项目根目录下的build.gradle一样。

我之前想看一下是java怎么调用knift里面的so库和模型的,就反编译了谷歌官方demo apk,其实里面的代码很简单,就一个Java文件,反正你是修改不了里面的c/c++源码的,只能看到里面相机申请权限和相机开启加载模型。如果你懒得反编译,可以看看我反编译之后的项目代码文件 ,其实这个很有用,后面你调试模型的时候,直接打新模型替换就好,不用每次跑bazel命令等半天,或者只是修改模型文件名顺序,直接在Android Studio里修改,我真是个小机灵鬼。如果你打apk成功了,也可以不用打aar包,谷歌官网打aar包的操作是有!!问!!题!!,是不会打成功的,你打apk包解压再拷贝也是一样的。

步骤1.打包apk

执行下面两行命令,很重要啊,官网解释了,默认是opencv3,打apk包前要切到opencv4,这两条命令是修改两个配置文件的opencv的版本号,不然打apk包的时候会错误,或者你运行的时候闪退,报so库的错误

sed -i -e 's:3.4.3/opencv-3.4.3:4.0.1/opencv-4.0.1:g' WORKSPACE

再执行

sed -i -e 's:libopencv_java3:libopencv_java4:g' third_party/opencv_android.BUILD

好了,开始执行下面两条命令打包apk了

bazel build -c opt --config=android_arm64 mediapipe/examples/android/src/java/com/google/mediapipe/apps/templatematchingcpu:templatematchingcpu

bazel build -c opt --fat_apk_cpu=arm64-v8a,armeabi-v7a mediapipe/examples/android/src/java/com/google/mediapipe/apps/templatematchingcpu:templatematchingcpu

上面打apk包的第二条命令,跟官网有点区别,最末尾那里不能加templatematchingcpu.apk,不然命令报错找不到该文件,因为那个路径下有BUILD文件,谷歌已经帮你配置好了。

成功之后,会显示apk的路径,这样你就可以拿到apk了

看到 红框框里的templatematchingcpu.apk了吧,这就是新打包出来的路径。

上面opencv从3切到4,打完apk之后一定要切回opencv3,不然后面打模型的时候,app运行又报错,运行下面两行命令切回来。

sed -i -e 's:4.0.1/opencv-4.0.1:3.4.3/opencv-3.4.3:g' WORKSPACE

sed -i -e 's:libopencv_java4:libopencv_java3:g' third_party/opencv_android.BUILD

步骤2.安装apk

如果你按谷歌官网那里直接命令安装,可能安装不了,找不到设备,应该是wsl找不到设备,但是windows是可以找到的,上面前言说的打开“此电脑”(就是win + E快捷键),在地址栏里输入\\wsl$回车,进入到wsl的目录可以按windows那样操作。

bazel-bin在windows这里是看不到了里面的子目录和子文件的,所以要用命令把apk复制出来先。

sudo cp mediapipe/examples/android/src/java/com/google/mediapipe/apps/templatematchingcpu/templatematchingcpu.apk ./

就会把apk复制到当前目录下,然后在windows刚才打开的那里的目录,刷新一下就看到了。如果你电脑已经配置了apk环境变量,直接在当前目录下(省得你输入一大串的地址),按住shift键,右键鼠标打开powershell,在powershell里输入命令安装

adb install -r templatematchingcpu.apk

好吧,你没有配置adb环境变量,你可以拷贝到u盘或者别的存储介质里啊,你都拿到apk了。

步骤3.打包识别模型

打包模型之前,确保opencv版本一定要切回opencv3,就在上面步骤1那里切回来,不然app运行会出错。

在mediapipe目录下新建my_template文件夹,

mkdir my_template

在打开my_template文件夹

cd my_template

在里面分别新建image和output两个文件夹

mkdir image

mkdir output

目录结构如下

这三个目录文件名,可以不不用按我的来的,你喜欢咋来就咋来,image是目标图片存放地方,output文件是模型输出地方。

把你要识别的图片复制到image图片里,你反正都用windows打开wsl目录结构了,直接把png图片复制进去就行,其实上面的新建目录你也可以按windows操作那样新建。 可以多张图片,图片可以不用很大,我的每张图片100kb左右。

输入下面两行命令(记得切回到mediapipe目录),开始打包pb模型文件,

bazel build -c opt --define MEDIAPIPE_DISABLE_GPU=1 mediapipe/examples/desktop/template_matching:template_matching_tflite


bazel-bin/mediapipe/examples/desktop/template_matching/template_matching_tflite --calculator_graph_config_file=mediapipe/graphs/template_matching/index_building.pbtxt --input_side_packets="file_directory=my_template/image,file_suffix=png,output_index_filename=my_template/output/knift_index.pb"

把knift_index.pb文件复制到mediapipe\models目录下覆盖原来旧的,可以用cp命令复制,也可以用windows操作复制。

打开mediapipe\models\knift_labelmap.txt,修改里面的模型名字,必须跟图片名字一样(不带.png),用linux的vim命令修改(可以看看另一篇文章的操作),或者你在上面前言那里已经打开了Android项目代码,到时候放模型的时候,在Android工程里改这个文件也行。名字跟图片名字保持一致,如下图:

然后执行上面步骤2打包新的apk,或者直接把.pb模型文件放进安卓工程里直接替换

注意:1.打包模型前,必须是opencv3,打包apk前是opencv4

2.图片格式是png的,打包模型的第二条命令里指定的是png,不然运行apk报错崩溃

--------------------------------------- 分割线 ----------------------------------

你可能会遇到的问题:

问题1:找不到opencv2问题,No such file or directory #include "opencv2/core/cvdef.h"

 解决办法:我看了安装目录,opencv4里有包含opencv2,但是你总不能把所有opencv2的include前面加opencv4吧,那海量的c文件改到啥时候,想到之前配opencv环境是看其他博客配置的,然后在mediapipe目录下,运行setup_opencv.sh,执行下面命令,自动帮你配置opencv环境,然后就可以打包模型了。

sudo ./setup_opencv.sh

问题2:app运行崩溃报错,Fatal signal 6 (SIGABRT),code -6 (SI_TKILL) in tid 8718 (mediapipe/8718), pid 8545 (latematchingcpu)

 解决办法:就是打包模型之前,按照上面步骤1,切回opencv3

打aar包

打包aar包,如果你按官网的操作步骤,一定打包不了,报错误找不到文件。

其实,你按上面的操作,先替换模型和修改txt文件后,再执行下面这行命令就可以打aar包了。

bazel build -c opt --strip=ALWAYS --host_crosstool_top=@bazel_tools//tools/cpp:toolchain --fat_apk_cpu=arm64-v8a,armeabi-v7a //mediapipe/examples/android/src/java/com/google/mediapipe/apps/templatematchingcpu

打包成功的成功之后,会显示INFO:Found 1 target...那里显示aar包所在的目录,使用上面步骤1的cp命令复制出来就可以了(复制命令的时候,把路径改成aar包的路径,别一点都不改啊)。

-------------------------------------------------以上操作结束-------------------------------------------------

后语

1.如果发现你电脑很卡,打开任务管理器,查看进程,发现Vmmem这个进程吃了很多内存,如果不用wsl了,可以用windows的“命令提示符”或者powershell,以管理员身份运行,

输入wsl --shutdown强行杀掉进程

2.如果打包apk,模型,aar等,一直卡在

Fetching @mave: Resolving and fetching the transitive closure of 29 artifact(s).

这里,解决办法看我的上一篇博客的后续

3.你会发现识别是识别成功了,但是名字对应不上,我也不知道打包模型的时候是根据什么顺序排序的,我反正没找到规律,你已经在上面前言那里拿到Android工程代码,在AS工具里直接在assets目录里那个txt文件调模型文件名的排序就可以了,不用重新打模型包。不然还是你自己用bazel打apk包跑一次。找到排序规律了的童鞋,可以评论区说一下。

4.如果你觉得识别点不够,去官网这里下载 识别keypoints,默认的是200,你可以下载其他的,比如TFLite model for up to 1000 keypoints,然后放到AS工程的assets里替换掉,名字改成knift_float.tflite,我实际测试效果,没多大用,点数高相机预览画面会变卡顿。也可以在wsl的目录mediapipe\examples\android\src\java\com\google\mediapipe\apps\templatematchingcpu里面修改BUILD文件配置。

5.如果你想修改pb和txt这两个文件名字,可以在mediapipe\examples\android\src\java\com\google\mediapipe\apps\templatematchingcpu的BULD文件里修改引用,再打包。我是为了快点跑成功,没有修改名字,所以要改名字的话,你可以自己摸索改一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值