如果刚开始接入,环境配置可以看我的另一篇文章 如果你已经配置了环境,出现了一些问题,也可以参考一下。
谷歌官方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文件里修改引用,再打包。我是为了快点跑成功,没有修改名字,所以要改名字的话,你可以自己摸索改一下。