
搭建opencv和JavaOnnxRuntime环境
Windows环境搭建
安装环境信息
系统: Windows10
显卡信息: RTX 1060 6GB
Java: 1.8_202
安装清单
NVIDIA CUDA: 11.8
NVIDIA CUDNN: 8.5.0.96
OpenCV: 4.7.0
CUDA和CUDNN具体的版本需要根据所选用的OnnxRuntime版本决定,因为博主通过Java调用的onxx,所以在java项目中通过maven引入了OnnxRuntim,所以此处就不单独安装,以下是OnnxRuntime Maven配置:
<dependency>
<groupId>com.microsoft.onnxruntime</groupId>
<artifactId>onnxruntime_gpu</artifactId>
<version>1.17.3</version>
</dependency>
版本参考信息:OnnxRuntime版本依赖关系,如下图(只限于onnx runtime v1.17及以下,更高版本请前往官网查看)
opencv4.7.0所需要的java环境为jdk11,opencv直接对jdk8支持的最大版本为4.6.0,后续版本最低需要jdk11。
如果系统当前是使用jdk8,并且不能轻易升版本以及还需要使用opencv4.6更高版本,可以采用javacv,博主就是采用的这种方案。
Javacv Maven配置
<properties>
<javacv.version>1.5.9</javacv.version>
<system.windowsx64>windows-x86_64</system.windowsx64>
<system.liunx64>linux-x86_64</system.liunx64>
</properties>
<dependencies>
<!-- javacv+javacpp核心库-->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>${javacv.version}</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacpp-platform</artifactId>
<version>${javacv.version}</version>
</dependency>
<!-- 最小opencv依赖包 ,必须包含上面的javacv+javacpp -->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>opencv</artifactId>
<version>4.7.0-${javacv.version}</version>
<classifier>${system.windowsx64}</classifier>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>opencv</artifactId>
<version>4.7.0-${javacv.version}</version>
<classifier>${system.liunx64}</classifier>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>openblas</artifactId>
<version>0.3.23-${javacv.version}</version>
<classifier>${system.windowsx64}</classifier>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>openblas</artifactId>
<version>0.3.23-${javacv.version}</version>
<classifier>${system.liunx64}</classifier>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>flycapture</artifactId>
<version>2.13.3.31-${javacv.version}</version>
<classifier>${system.windowsx64}</classifier>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>flycapture</artifactId>
<version>2.13.3.31-${javacv.version}</version>
<classifier>${system.liunx64}</classifier>
</dependency>
</dependencies>
安装步骤
opencv安装
下载完毕后,直接运行.exe安装,安装完毕后进入到安装目录,例如博主的目录为D:\Dev-tools\opencv-4.7.0
,在该目录下寻找到opencv470.dll文件,具体路径为D:\Dev-tools\opencv-4.7.0\opencv\build\java\x64
,将该dll复制到jdk对应安装目录下的bin目录中,例如C:\Program Files\Java\jdk-1.8\bin
cuda安装
下载之前首先需要确定自己电脑显卡是否支持CUDA,查询地址
cuda下载地址,此处我们选择的是11.8版本。
点击CUDA Toolkit 11.8.0,然后选择电脑系统对应配置,点击下载。
下载完毕后,直接双击运行安装程序。
安装cuda时,会让设置临时解压目录,不用管它,直接使用默认目录就行,安装完毕会自动删除的。
安装过程中会让选择精简安装还是自定义安装,直接精简安装即可。
等待安装完毕后,cmd中输入nvcc -V
验证是否安装成功。
cudnn安装
cudnn地址如下,不过要注意的是,我们需要注册一个账号,才可以进入到下载界面。大家可以放心注册的(以前有NVIDIA账号直接登录就行了)。
cuDNN Download | NVIDIA Developer
选择跟自己的cuda版本适配的cudnn版本,此处我安装的是CUDA11.8,因此我选取下面的版本:
下载完毕后是一个安装包
解压后会是这个样子,会有三个文件夹和一个LICENSE文件
将解压后的这个三个文件夹复制到cuda的安装目录中。
如果没有改过Windows默认安装路径和安装cuda路径的情况下,默认cuda是安装在C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8
目录下。
拷贝时看到,CUDA 的安装目录中,有和 cuDNN 解压缩后的同名文件夹,这里注意,不需要担心,直接复制即可。cuDNN 解压缩后的同名文件夹中的配置文件会添加到 CUDA安装目录中的同名文件夹中。
验证是否配置成功:
配置完成后,我们可以验证是否配置成功,主要使用CUDA内置的deviceQuery.exe
和 bandwidthTest.exe
:
首先win+R启动cmd,cd到安装目录下的…\extras\demo_suite
,然后分别执行bandwidthTest.exe
和deviceQuery.exe
(进到目录后需要直接输bandwidthTest.exe
和deviceQuery.exe
),得到下图:
Java调用onnx runtime和opencv问题
安装opencv和cuda和cudnn完毕后,在java中调用opencv和onnxruntime处理图像和推理时,可能会在碰到程序突然无缘无故退出,控制台中没有出现任何报错信息,只出现进程已退出,退出代码为-1073740791(0xC0000409)
提示,当碰到该现象时,有多种可能性,比如显存不足或者版本不对以及缺少依赖,博主碰到的正是因为java bin目录中不存在opencv需要调用的zlibwapi.dll
依赖,下载依赖放到JDK的bin目录下即可。(该问题是笔者maven打成jar包后,java -jar
在控制台中发现的问题,碰到相同情况的小伙伴可以这样试一下)
根据自己的CPU选择对应的链接下载就行了
Docker环境搭建
已制作好现成的docker镜像
# 获取docker镜像
docker pull junpzx/jdk:8-ubuntu20.04-opencv4.7.0-cuda11.8.0-cudnn8-runtime
# 启动镜像
# --gpus all 表示给予容器使用GPU的权限,如果不使用GPU进行推理的情况,那么则不用指定
docker run --gpus all --name onnx-runtime-test junpzx/jdk:8-ubuntu20.04-opencv4.7.0-cuda11.8.0-cudnn8-runtime
该镜像所采用的系统为ubuntu20.04。
该镜像为Java运行环境的基础镜像,如需制作项目系统镜像,基于该镜像制作就行了。
制作OnnxRuntime镜像
Dockerfile
FROM nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu20.04
## 维护人信息
MAINTAINER junpzx<junpzx@163.com>
## 创建文件夹
RUN mkdir -p /mnt/workspace/app
## 设置工作目录
WORKDIR /usr/local/java/jdk
## 往镜像中复制
ADD jdk-8u202-linux-x64.tar.gz /usr/local/java/jdk
## 配置环境变量
ENV JAVA_HOME=/usr/local/java/jdk/jdk1.8.0_202
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$PATH
ENV LD_LIBRARY_PATH=$JAVA_HOME/lib:$LD_LIBRARY_PATH
## 更新国内镜像源
RUN cp /etc/apt/sources.list /etc/apt/sources.list.bak
COPY sources.list /etc/apt/
## 安装opencv
ARG DEBIAN_FRONTEND=noninteractive
ARG OPENCV_VERSION=4.7.0
RUN apt-get update && apt-get upgrade -y &&\
# Install build tools, build dependencies and python
apt-get install -y \
python3-pip \
ant \
build-essential \
cmake \
git \
wget \
unzip \
yasm \
pkg-config \
libswscale-dev \
libtbb2 \
libtbb-dev \
libjpeg-dev \
libpng-dev \
libtiff-dev \
libavformat-dev \
libpq-dev \
libxine2-dev \
libglew-dev \
libtiff5-dev \
zlib1g-dev \
libjpeg-dev \
libavcodec-dev \
libavformat-dev \
libavutil-dev \
libpostproc-dev \
libswscale-dev \
libeigen3-dev \
libtbb-dev \
libgtk2.0-dev \
pkg-config \
## Python
python3-dev \
python3-numpy \
&& rm -rf /var/lib/apt/lists/*
ENV ANT_HOME=/usr/share/ant
ENV PATH=$PATH:$ANT_HOME/bin
RUN cd /opt/ &&\
# Download and unzip OpenCV and opencv_contrib and delte zip files
wget https://github.com/opencv/opencv/archive/$OPENCV_VERSION.zip &&\
unzip $OPENCV_VERSION.zip &&\
rm $OPENCV_VERSION.zip &&\
wget https://github.com/opencv/opencv_contrib/archive/$OPENCV_VERSION.zip &&\
unzip ${OPENCV_VERSION}.zip &&\
rm ${OPENCV_VERSION}.zip &&\
# Create build folder and switch to it
mkdir /opt/opencv-${OPENCV_VERSION}/build && cd /opt/opencv-${OPENCV_VERSION}/build &&\
# Cmake configure
cmake \
-DOPENCV_EXTRA_MODULES_PATH=/opt/opencv_contrib-${OPENCV_VERSION}/modules \
-DWITH_CUDA=ON \
# -DBUILD_opencv_java=ON \
-DBUILD_SHARED_LIBS=OFF \
-DBUILD_TESTS=OFF \
-DCUDA_ARCH_BIN=7.5,8.0,8.6 \
-DCMAKE_BUILD_TYPE=RELEASE \
# Install path will be /usr/local/lib (lib is implicit)
-DCMAKE_INSTALL_PREFIX=/usr/local \
.. &&\
# Make
make -j"$(nproc)" && \
# Install to /usr/local/lib
make install && \
ldconfig && \
# Remove OpenCV sources and build folder
rm -rf /opt/opencv-${OPENCV_VERSION} && rm -rf /opt/opencv_contrib-${OPENCV_VERSION}
RUN chmod 777 /usr/local/share/java/opencv4/*
RUN cp /usr/local/share/java/opencv4/* /usr/local/java/jdk/jdk1.8.0_202/lib/
# 配置中文环境
ENV LANG C.UTF-8
ENV LC_ALL C.UTF-8
# 设置时区为上海
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
#容器启动时需要执行的命令
CMD ["java", "-version"]
sources.list
# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
deb http://cn.archive.ubuntu.com/ubuntu focal main restricted
# deb-src http://cn.archive.ubuntu.com/ubuntu focal main restricted
## Major bug fix updates produced after the final release of the
## distribution.
deb http://cn.archive.ubuntu.com/ubuntu focal-updates main restricted
# deb-src http://cn.archive.ubuntu.com/ubuntu focal-updates main restricted
## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.
deb http://cn.archive.ubuntu.com/ubuntu focal universe
# deb-src http://cn.archive.ubuntu.com/ubuntu focal universe
deb http://cn.archive.ubuntu.com/ubuntu focal-updates universe
# deb-src http://cn.archive.ubuntu.com/ubuntu focal-updates universe
## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team, and may not be under a free licence. Please satisfy yourself as to
## your rights to use the software. Also, please note that software in
## multiverse WILL NOT receive any review or updates from the Ubuntu
## security team.
deb http://cn.archive.ubuntu.com/ubuntu focal multiverse
# deb-src http://cn.archive.ubuntu.com/ubuntu focal multiverse
deb http://cn.archive.ubuntu.com/ubuntu focal-updates multiverse
# deb-src http://cn.archive.ubuntu.com/ubuntu focal-updates multiverse
## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
deb http://cn.archive.ubuntu.com/ubuntu focal-backports main restricted universe multiverse
# deb-src http://cn.archive.ubuntu.com/ubuntu focal-backports main restricted universe multiverse
## Uncomment the following two lines to add software from Canonical's
## 'partner' repository.
## This software is not part of Ubuntu, but is offered by Canonical and the
## respective vendors as a service to Ubuntu users.
# deb http://archive.canonical.com/ubuntu focal partner
# deb-src http://archive.canonical.com/ubuntu focal partner
deb http://cn.archive.ubuntu.com/ubuntu focal-security main restricted
# deb-src http://cn.archive.ubuntu.com/ubuntu focal-security main restricted
deb http://cn.archive.ubuntu.com/ubuntu focal-security universe
# deb-src http://cn.archive.ubuntu.com/ubuntu focal-security universe
deb http://cn.archive.ubuntu.com/ubuntu focal-security multiverse
# deb-src http://cn.archive.ubuntu.com/ubuntu focal-security multiverse
jdk-8u202
自行下载,然后替换Dockerfile文件中的第9行和第11行以及第98行的文件名和路径