写点什么

Java 版人脸检测详解上篇:运行环境的 Docker 镜像 (CentOS+JDK+OpenCV)

用户头像
编程菌
关注
发布于: 4 小时前

本篇概览


当前很多博客实现人脸识别的大部分都是调用云厂家的接口,如百度,阿里云。这些都比较简单,会接开放平台,走接口请求基本上都掌握了。缺点就是有限制,收费。那么我就在想,能不能不依赖第三方,自己实现人脸检测呢。接下来一起动手实战,从无到有将这个应用开发出来吧;


  • 首先确定咱们的目标:1.开发出 java 版的人脸检测应用 2.将此应用制作成 docker 镜像 3.在 docker 环境运行这个应用

  • 基于上述目标,我们可以确定以下操作步骤:1.准备好 docker 基础镜像 2.开发 java 应用 3.将 java 应用打包成 package 文件,集成到基础镜像中,得到最终的 java 应用镜像


这篇文章我们主要是实现上面所述的第一个步骤:准备好 docker 基础镜像 ##关于人脸检测应用的基础镜像如果你有过制作 java 应用镜像的经历,一定会产生疑问:如下图红框所示,一般不都是把 OpenJDK 的官方镜像作为基础镜像吗?为啥要拿一篇文章来讲基础镜像的事情?



对于人脸检测的应用来说,OpenJDK 的官方镜像是不够用的,因为用 java 实现人脸检测需要一个关键技术:javacv,在 javacv 运行过程中需要用到 opencv 的一些本地库,因此需要在运行环境中安装 opencv


如下图所示,一个人脸检测应用自下而上由以下六部分构成,如果将底部的操作系统、JDK、OpenCV 做成基础镜像就方便多了,咱们开发应用的时候只要需关注上面三层即可,而上面三层不就是个普通的 maven 工程吗?




写到这里,现在你应该对我们接下来要做的事情就很清楚了:编写 Dockerfile 文件用来制作镜像,这个镜像中要有 CentOS + JDK1.8 + OpenCV


分两步走


  • 先做一个 CentOS + JDK 的镜像

  • 在这个基础上再做一个集成了 OpenCV 的镜像


这样在一些不需要 OpenCV 的场景中,还能单独使用 CentOS + JDK1.8 的镜像


OK,分析完成,现在开始动手吧


一、CentOS + JDK 的镜像


之所以选择 CentOS 作为操作系统,是因为平时工作中最常用的就是它了纵观 OpenJDK 官方的各种镜像,并没有发现 CentOS 作为操作系统的,因此自己动手吧,思路很简单:找到 OpenJDK 的 Dockerfile 文件,把它的基础镜像换成 CentOS7.6 即可以下是 Dockerfile 的所有内容,可见核心是根据不同的操作系统下载文件然后安装,逻辑简单清晰就不多说了:


FROM centos:7.6.1810
RUN set -eux; \ yum install -y \ gzip \ tar \ binutils \ freetype fontconfig \ ;
ENV JAVA_HOME /usr/java/openjdk-8ENV PATH $JAVA_HOME/bin:$PATH
# Default to UTF-8 file.encodingENV LANG C.UTF-8
RUN set -eux; \ \ arch="$(objdump="$(command -v objdump)" && objdump --file-headers "$objdump" | awk -F '[:,]+[[:space:]]+' '$1 == "architecture" { print $2 }')"; \ case "$arch" in \ 'i386:x86-64') \ downloadUrl='https://github.com/AdoptOpenJDK/openjdk8-upstream-binaries/releases/download/jdk8u292-b10/OpenJDK8U-jdk_x64_linux_8u292b10.tar.gz'; \ ;; \ 'aarch64') \ downloadUrl='https://github.com/AdoptOpenJDK/openjdk8-upstream-binaries/releases/download/jdk8u292-b10/OpenJDK8U-jdk_aarch64_linux_8u292b10.tar.gz'; \ ;; \ *) echo >&2 "error: unsupported architecture: '$arch'"; exit 1 ;; \ esac; \ \ curl -fL -o openjdk.tgz "$downloadUrl"; \ curl -fL -o openjdk.tgz.asc "$downloadUrl.sign"; \ \ export GNUPGHOME="$(mktemp -d)"; \# pre-fetch Andrew Haley's (the OpenJDK 8 and 11 Updates OpenJDK project lead) key so we can verify that the OpenJDK key was signed by it# (https://github.com/docker-library/openjdk/pull/322#discussion_r286839190)# we pre-fetch this so that the signature it makes on the OpenJDK key can survive "import-clean" in gpg gpg --batch --keyserver keyserver.ubuntu.com --recv-keys EAC843EBD3EFDB98CC772FADA5CD6035332FA671; \# TODO find a good link for users to verify this key is right (https://mail.openjdk.java.net/pipermail/jdk-updates-dev/2019-April/000951.html is one of the only mentions of it I can find); perhaps a note added to https://adoptopenjdk.net/upstream.html would make sense?# no-self-sigs-only: https://salsa.debian.org/debian/gnupg2/commit/c93ca04a53569916308b369c8b218dad5ae8fe07 gpg --batch --keyserver keyserver.ubuntu.com --keyserver-options no-self-sigs-only --recv-keys CA5F11C6CE22644D42C6AC4492EF8D39DC13168F; \ gpg --batch --list-sigs --keyid-format 0xLONG CA5F11C6CE22644D42C6AC4492EF8D39DC13168F \ | tee /dev/stderr \ | grep '0xA5CD6035332FA671' \ | grep 'Andrew Haley'; \ gpg --batch --verify openjdk.tgz.asc openjdk.tgz; \ rm -rf "$GNUPGHOME"; \ \ mkdir -p "$JAVA_HOME"; \ tar --extract \ --file openjdk.tgz \ --directory "$JAVA_HOME" \ --strip-components 1 \ --no-same-owner \ ; \ rm openjdk.tgz*; \ \ rm -rf "$JAVA_HOME/jre/lib/security/cacerts"; \# see "update-ca-trust" script which creates/maintains this cacerts bundle ln -sT /etc/pki/ca-trust/extracted/java/cacerts "$JAVA_HOME/jre/lib/security/cacerts"; \ \# https://github.com/oracle/docker-images/blob/a56e0d1ed968ff669d2e2ba8a1483d0f3acc80c0/OracleJava/java-8/Dockerfile#L17-L19 ln -sfT "$JAVA_HOME" /usr/java/default; \ ln -sfT "$JAVA_HOME" /usr/java/latest; \ for bin in "$JAVA_HOME/bin/"*; do \ base="$(basename "$bin")"; \ [ ! -e "/usr/bin/$base" ]; \ alternatives --install "/usr/bin/$base" "$base" "$bin" 20000; \ done; \ \# basic smoke test javac -version; \ java -version
复制代码


  • 写完之后执行 docker build -t bolingcavalry/centos7.6-jdk8:0.0.1 .即可生成镜像

  • 用 history 命令看看镜像内容,详情如下,合计五百多兆,已经不小了:


CN0014009475M:~ will$ docker history bolingcavalry/centos7.6-jdk8:0.0.1IMAGE          CREATED       CREATED BY                                      SIZE      COMMENTa5dead4a6505   2 days ago    /bin/sh -c set -eux;         arch="$(objdump…   209MB     <missing>      2 days ago    /bin/sh -c #(nop)  ENV LANG=C.UTF-8             0B        <missing>      2 days ago    /bin/sh -c #(nop)  ENV PATH=/usr/java/openjd…   0B        <missing>      2 days ago    /bin/sh -c #(nop)  ENV JAVA_HOME=/usr/java/o…   0B        <missing>      2 days ago    /bin/sh -c set -eux;     yum install -y     …   144MB     <missing>      2 years ago   /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B        <missing>      2 years ago   /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B        <missing>      2 years ago   /bin/sh -c #(nop) ADD file:54b004357379717df…   202MB
复制代码


  • 执行以下命令即可下载到本地:


docker pull bolingcavalry/centos7.6-jdk8:0.0.3
复制代码


二、CentOS+JDK+OpenCV 镜像

接下来可以集成 OpenCV 了,Dockerfile 内容如下所示,基础镜像是刚刚做好的 bolingcavalry/centos7.6-jdk8:0.0.1,先是安装一大堆编译所需的应用,然后下载 OpenCV-3.4.3 版本的源码,然后编译,就这么简单(但其间的调试工作还是不少的,不说了,说多了都是泪):


FROM bolingcavalry/centos7.6-jdk8:0.0.1
RUN echo "export LC_ALL=en_US.UTF-8" >> /etc/profile \ && source /etc/profile
RUN set -eux; \ yum install -y \ make \ cmake \ gcc \ gcc-c++ \ gtk+-devel \ gimp-devel \ gimp-devel-tools \ gimp-help-browser \ zlib-devel \ libtiff-devel \ libjpeg-devel \ libpng-devel \ gstreamer-devel \ libavc1394-devel \ libraw1394-devel \ libdc1394-devel \ jasper-devel \ jasper-utils \ swig \ python \ libtool \ nasm \ build-essential \ ant \ unzip \ ;
RUN set -eux; \ curl -fL -o opencv-3.4.3.zip https://codeload.github.com/opencv/opencv/zip/3.4.3; \ unzip opencv-3.4.3.zip; \ rm -rf opencv-3.4.3.zip; \ cd opencv-3.4.3; \ mkdir build; \ cd build; \ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..; \ make; \ make install; \ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -DBUILD_TESTS=OFF ..;\ make -j8; \ make install
复制代码


  • 写完之后执行 docker build -t bolingcavalry/opencv3.4.3:0.0.3 .即可生成镜像,如果您有 hub.docker.com 的账号,还可以将其推送到中央仓库,给更多人使用

  • 用 history 命令看看镜像内容,详情如下,倒吸一口凉气,这么大的体积,hhhh 你们会不会打我…:


CN0014009475M:~ will$ docker history bolingcavalry/opencv3.4.3:0.0.3IMAGE          CREATED       CREATED BY                                      SIZE      COMMENTf0306d7a2594   2 days ago    /bin/sh -c set -eux;     curl -fL -o opencv-…   2.99GB    <missing>      2 days ago    /bin/sh -c set -eux;     yum install -y     …   638MB     <missing>      2 days ago    /bin/sh -c echo "export LC_ALL=en_US.UTF-8" …   1.84kB    <missing>      2 days ago    /bin/sh -c set -eux;         arch="$(objdump…   209MB     <missing>      2 days ago    /bin/sh -c #(nop)  ENV LANG=C.UTF-8             0B        <missing>      2 days ago    /bin/sh -c #(nop)  ENV PATH=/usr/java/openjd…   0B        <missing>      2 days ago    /bin/sh -c #(nop)  ENV JAVA_HOME=/usr/java/o…   0B        <missing>      2 days ago    /bin/sh -c set -eux;     yum install -y     …   144MB     <missing>      2 years ago   /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B        <missing>      2 years ago   /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B        <missing>      2 years ago   /bin/sh -c #(nop) ADD file:54b004357379717df…   202MB
复制代码


  • 执行以下命令即可下载到本地:


docker pull bolingcavalry/opencv3.4.3:0.0.3
复制代码


这里要提醒一下,opencv 的编译是非常耗时的,请确保 docker 宿主机的性能不要太差,也请您耐心等待编译过程


至此,符合咱们要求的基础镜像 bolingcavalry/opencv3.4.3:0.0.3 已制作完成,有了它,咱们的 Java 应用所需的 jdk 和 opencv 就凑齐了,接下来的文章我们一起去开发这个人脸检测的应用吧;还请期待一下哦

用户头像

编程菌

关注

还未添加个人签名 2021.07.13 加入

还未添加个人简介

评论

发布
暂无评论
Java版人脸检测详解上篇:运行环境的Docker镜像(CentOS+JDK+OpenCV)