本篇文章主要是针对yolov5s在安卓(鸿蒙)手机部署过程进行记录。
有关YOLOv5其他资料可以参考我以下文章进行学习:
C++版tensorrt YOLOv5推理
如何通过YAML文件修改YOLOv5网络
YOLOv5通道剪枝
YOLOv5图像分割代码详解1
YOLOv5图像分割之NMS
YOLOv5+霍夫变换之车道线检测
YOLOv5损失函数详解
YOLOV5+reid[支持跨视频识别]
以上内容可以帮助大家更好的学习yolov5。
好了,废话不多说,开始今天的正题。
先说一下我的开发环境:
windows 10
pytorch 1.7
Android Studio 4.1.3
Android Pytorch library 1.7.0
yolov5 6.0版本我的手机:华为mate 40(鸿蒙3.0.0.205)
安卓手机也是可以的。
需要注意Android torch版本需要与你pytorch版本对应
下载6.0代码:
git clone --branch v6.0 https://github.com/ultralytics/yolov5
打开yolov5项目代码,修改export.py文件,修改内容如下:
@try_export
def export_torchscript(model, im, file, optimize, prefix=colorstr('TorchScript:')):
# YOLOv5 TorchScript model export
LOGGER.info(f'\n{prefix} starting export with torch {torch.__version__}...')
f = file.with_suffix('.torchscript')
fl = file.with_suffix('.torchscript.pt') # 修改1
ts = torch.jit.trace(model, im, strict=False)
d = {"shape": im.shape, "stride": int(max(model.stride)), "names": model.names}
extra_files = {'config.txt': json.dumps(d)} # torch._C.ExtraFilesMap()
if optimize: # https://pytorch.org/tutorials/recipes/mobile_interpreter.html
optimize_for_mobile(ts)._save_for_lite_interpreter(str(f), _extra_files=extra_files)
else:
ts.save(str(f), _extra_files=extra_files)
(optimize_for_mobile(ts) if optimize else ts)._save_for_lite_interpreter(str(fl)) # 修改2
return f, None
在终端输入以下命令:
python export.py --weights yolov5s.pt --optimize --device cpu --include torchscript
此时会在你项目路径下生成yolov5s.torchscript.pt文件(在optimize下仅支持cpu,如果用gpu会报错).
下载pytorch官方android demo代码。
git clone https://github.com/pytorch/android-demo-app.git
现在这个代码官网github更新的为pytorch1.10的。
下载后用Android Studio打开android-demo-app/ObjectDectection项目。
然后打开app/build.gradle文件,注意修改这个地方(我的是pytorch1.7):
implementation 'org.pytorch:pytorch_android:1.7.0'
implementation 'org.pytorch:pytorch_android_torchvision:1.7.0'
如果你的pytorch是1.10的,那么是下面的:
implementation 'org.pytorch:pytorch_android_lite:1.10.0'
implementation 'org.pytorch:pytorch_android_torchvision_lite:1.10.0'
所以一定要注意自己的版本。
如果是你自己的权重,需要修改src/main/java/org/pytorch/demo/objectdetection/MainActivity.java文件,修改以下内容为自己的类和类txt文件。
try {
mModule = PyTorchAndroid.loadModuleFromAsset(getAssets(), "yolov5s.torchscript.pt");
BufferedReader br = new BufferedReader(new InputStreamReader(getAssets().open("classes.txt")));
然后是将前面说到的yolov5s.torchscript.pt文件放在ObjectDetection/app/src/main/assets/下即可.
此时assets内容如下:
ObjectDetection/app/src/main/assets/
|-- classes.txt
|-- test1.png
|-- test2.jpg
|-- test3.png
`-- yolov5s.torchscript.pt
以上工作准备完毕,下载android虚拟机。
在你Android Studio界面的右上角,有一个下图的标值按钮(AVD Manager)。
点击创建虚拟机,然后选择以下选项。我这里选的是Nexus 5X,我试过Nexus 6,但生成的APP在虚拟机和我手机端总是闪退,不知道原因。
点击next以后,选择x86 images,找到下面的选项。点击前面的Download(由于我已经下载过了,所以前面显示的是R)
等待下载成功后,界面如下(我下载的时候网络不行,所以用的科学上网工具,即便你没有下载成功,也会显示以下内容,但你点运行的时候会提示你虚拟机起不来):
成功以后会在你的app/build/outputs/apk/debug下生成一个app-debug.apk.目录形式如下:
ObjectDetection/app/build/outputs/apk/
`-- debug
|-- app-debug.apk
`-- output-metadata.json
此可你就可以点击运行来试试你的apk是否成功(会自动开启虚拟机)
app界面如下。
此时会有4个按钮。
Detect:检测
Test Image:测试图片,这个图片你可以在MainActivity.java文件修改,但前提是你要把你的测试图片放在assets中。
Select:是你可以从你相册中获取一张图片进行检测。
Live:是实时视频检测【不过我测了一下,会有卡顿,我觉得不是我手机的锅,因为我以前试过tensorflow lite部署的目标检测和关键点检测,速度都很快】
以上就是yolov5s移动端部署的全部过程了。
也可以直接下载我torch1.7对应的android demo代码。
GitHub - YINYIPENG-EN/pytorch1.7_yolov5s_android: Pytorch1.7 android environment deployment yolov5s