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及以下,更高版本请前往官网查看)

Onnx版本依赖

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安装

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,查询地址

image-20240510151347301

cuda下载地址,此处我们选择的是11.8版本。

下载cuda

点击CUDA Toolkit 11.8.0,然后选择电脑系统对应配置,点击下载。

选择系统配置

下载完毕后,直接双击运行安装程序。

cuda安装包

安装cuda时,会让设置临时解压目录,不用管它,直接使用默认目录就行,安装完毕会自动删除的。

安装过程中会让选择精简安装还是自定义安装,直接精简安装即可。

等待安装完毕后,cmd中输入nvcc -V验证是否安装成功。

76b17a3b0879214fb40eec6dad1b322f

cudnn安装

cudnn地址如下,不过要注意的是,我们需要注册一个账号,才可以进入到下载界面。大家可以放心注册的(以前有NVIDIA账号直接登录就行了)。

cuDNN Download | NVIDIA Developer

选择跟自己的cuda版本适配的cudnn版本,此处我安装的是CUDA11.8,因此我选取下面的版本:

cudnn版本存档

选择安装包

下载完毕后是一个安装包

cudnn安装包

解压后会是这个样子,会有三个文件夹和一个LICENSE文件

cudnn解压

将解压后的这个三个文件夹复制到cuda的安装目录中。

如果没有改过Windows默认安装路径和安装cuda路径的情况下,默认cuda是安装在C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8目录下。

拷贝时看到,CUDA 的安装目录中,有和 cuDNN 解压缩后的同名文件夹,这里注意,不需要担心,直接复制即可。cuDNN 解压缩后的同名文件夹中的配置文件会添加到 CUDA安装目录中的同名文件夹中。

验证是否配置成功:

配置完成后,我们可以验证是否配置成功,主要使用CUDA内置的deviceQuery.exebandwidthTest.exe

首先win+R启动cmd,cd到安装目录下的…\extras\demo_suite,然后分别执行bandwidthTest.exedeviceQuery.exe(进到目录后需要直接输bandwidthTest.exedeviceQuery.exe),得到下图: bandwidthTest

deviceQuery

Java调用onnx runtime和opencv问题

安装opencv和cuda和cudnn完毕后,在java中调用opencv和onnxruntime处理图像和推理时,可能会在碰到程序突然无缘无故退出,控制台中没有出现任何报错信息,只出现进程已退出,退出代码为-1073740791(0xC0000409)提示,当碰到该现象时,有多种可能性,比如显存不足或者版本不对以及缺少依赖,博主碰到的正是因为java bin目录中不存在opencv需要调用的zlibwapi.dll依赖,下载依赖放到JDK的bin目录下即可。(该问题是笔者maven打成jar包后,java -jar 在控制台中发现的问题,碰到相同情况的小伙伴可以这样试一下)

zlibwapi.dll下载地址

image-20240510162606307

根据自己的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行的文件名和路径