使用DJL+Yolov5+OpenCV部署Java应用时PyTorch引擎报错
问题背景
在Java 17环境下使用Yolov5、DJL与OpenCV开发机器学习应用,已将模型导出为torchscript。IntelliJ中运行代码可正常处理图片、识别目标,但通过Maven assembly插件构建含依赖的Jar包后,外部运行出现报错。
运行命令:
java "-Djava.library.path=C:\Program Files\OpenCV\build\java\x64" -jar app-0.1-SNAPSHOT-jar-with-dependencies.jar
报错信息:
Exception in thread "main" ai.djl.repository.zoo.ModelNotFoundException: ModelZoo doesn't support specified engine: PyTorch at ai.djl.repository.zoo.Criteria.loadModel(Criteria.java:121) at my.app.Yolov5.process(Yolov5.java:70) at my.app.Main.main(Main.java:22)
POM依赖(版本统一为0.19.0,OpenCV版本4.5.5-0与系统安装版本一致):
- ai.djl:api
- ai.djl:model-zoo
- ai.djl.pytorch:pytorch-model-zoo
- ai.djl.pytorch:pytorch-engine
- ai.djl.pytorch:pytorch-native-auto
- org.openpnp:opencv
解决方法
1. 修正Maven Assembly插件的依赖打包配置
pytorch-native-auto包含多平台的PyTorch原生库,但Assembly插件默认可能无法正确处理带分类器的依赖。需修改插件配置确保相关依赖被完整打包:
在assembly的descriptor文件中添加:
<dependencySets> <dependencySet> <outputDirectory>/</outputDirectory> <useProjectArtifact>true</useProjectArtifact> <unpack>true</unpack> <scope>runtime</scope> <includes> <include>ai.djl.pytorch:pytorch-native-auto</include> <include>ai.djl.pytorch:pytorch-engine</include> </includes> </dependencySet> </dependencySets>
也可以直接改用DJL官方提供的djl-maven-plugin打包,该插件针对DJL的依赖特性做了优化,能自动处理原生库的打包逻辑。
2. 调整原生库加载路径
外部运行时,DJL可能无法定位到PyTorch原生库。可在运行命令中同时指定OpenCV和DJL原生库的路径:
java "-Djava.library.path=C:\Program Files\OpenCV\build\java\x64;./djl-native-libs" -jar app-0.1-SNAPSHOT-jar-with-dependencies.jar
注:./djl-native-libs需替换为你解压PyTorch原生库的实际目录(可从pytorch-native-auto的Jar包中提取出libtorch*.dll等文件)。
3. 检查依赖版本一致性
确保所有DJL相关依赖的版本完全统一为0.19.0,避免版本冲突导致引擎加载失败。检查POM文件,确认没有其他依赖引入不同版本的DJL组件。
4. 补充引擎配置文件
DJL通过META-INF/djl.properties识别可用引擎,Assembly打包可能遗漏该文件。在项目src/main/resources/META-INF目录下添加该文件,内容为:
engine.pytorch=true
内容的提问来源于stack exchange,提问作者Son

