zoukankan      html  css  js  c++  java
  • docker中基于centos7.3搭建tesseract5环境以及制作镜像

      由于需要离线安装tesseract,于是想到用docker镜像的方式部署tesseract。采用docker commit 基于容器构建镜像。

      总体思路是先拉一个基础的centos镜像,然后启动之后进入容器安装好tesseract之后commit为镜像。然后镜像save为tar包。这样就可以实现离线安装。(这也可以作为常见的一种制作自己的镜像的思路)

      其实linux环境安装tesseract也是下面步骤,只是不用下载一个基础的centos镜像以及最后将容器制作为镜像。

    0.准备文件

    (1)tesseract源码文件:

    git下载地址:https://github.com/tesseract-ocr/tesseract

     (2)leptonica-1.79.0.tar.gz。 tesseract依赖该项目

     (3)语言包

    其实只需要 chi_sim.traineddata 和 eng.traineddata

    可以从git下载。git有两个版本,一个fast版本、一个best版本。

    fast:https://github.com/tesseract-ocr/tessdata_fast

    best:https://github.com/tesseract-ocr/tessdata_best

      这两个的区别是fast版本语言库文件比较小,识别速度比较快。best版本语言库文件比较大,识别速度比较慢。识别准确率的话,待验证。

    (4)准备两张验证的图片

    1.下载centos镜像

      最好是基于centos8镜像,我第二次制作训练环境的时候是采用centos8镜像。

    docker pull hub.c.163.com/library/centos:latest

     

    2.启动镜像并进入容器查看centos版本:

    C:UsersAdministrator>docker run -i -t hub.c.163.com/library/centos:latest /bin/bash
    [root@86867025ffc7 /]# cat /etc/redhat-release
    CentOS Linux release 7.3.1611 (Core)
    [root@86867025ffc7 /]# uname -a
    Linux 86867025ffc7 4.14.154-boot2docker #1 SMP Thu Nov 14 19:19:08 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

     

    3.将tesseract-master.zip 上传到容器的/opt/tesseract 目录(宿主机执行)

    docker cp ./tesseract-master.zip 86867025ffc7:/opt/tesseract

     86867025ffc7是centos容器ID

     

    4. 在容器中解压

    需要先下载unzip:

    [root@86867025ffc7 tesseract]# yum list unzip
    Loaded plugins: fastestmirror, ovl
    Determining fastest mirrors
     * base: mirrors.cqu.edu.cn
     * extras: mirror.lzu.edu.cn
     * updates: mirrors.njupt.edu.cn
    updates/7/x86_64/primary_db                                                         | 1.3 MB  00:00:00
    Available Packages
    unzip.x86_64                                        6.0-21.el7                                         base
    [root@86867025ffc7 tesseract]# yum install unzip

    解压:

    unzip ./tesseract-master.zip

    5.开始安装编译环境

    (1)安装编译环境: gcc gcc-c++ make

    yum install gcc gcc-c++ make  

    查看g++版本,如果是4.X最好先升个到8以上版本:

    [root@0f76915a8f71 tesseract]# g++ -v
    Using built-in specs.
    COLLECT_GCC=g++
    COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/8/lto-wrapper
    OFFLOAD_TARGET_NAMES=nvptx-none
    OFFLOAD_TARGET_DEFAULT=1
    Target: x86_64-redhat-linux
    Configured with: ../configure --enable-bootstrap --enable-languages=c,c++,fortran,lto --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-gcc-major-version-only --with-linker-hash-style=gnu --enable-plugin --enable-initfini-array --with-isl --disable-libmpx --enable-offload-targets=nvptx-none --without-cuda-driver --enable-gnu-indirect-function --enable-cet --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
    Thread model: posix
    gcc version 8.3.1 20190507 (Red Hat 8.3.1-4) (GCC)

    (2)安装tesseract-ocr编译必须的包

    yum install autoconf automake libtool   libjpeg-devel libpng-devel libtiff-devel

    6.安装leptonica

    (1)上传leptonica-1.79.0.tar.gz到容器中:(宿主机执行)

    docker cp ./leptonica-1.79.0.tar.gz 86867025ffc7:/opt/tesseract

    (2)容器中解压并且安装:

    tar -zxvf ./leptonica-1.79.0.tar.gz
    cd leptonica-1.79.0
    ./autogen.sh 
    ./configure
    make && make install

    (3)添加环境变量(如果vim不是命令,yum install vim 安装一下)

    vim /etc/profile 

    最后添加如下内容:

    export LD_LIBRARY_PATH=$LD_LIBRARY_PAYT:/usr/local/lib
    export LIBLEPT_HEADERSDIR=/usr/local/include
    export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

    执行如下命令使之立即生效:

    source /etc/profile

    (4)执行如下命令,确认有lept输出,如果没有,再检查上面的步骤

    [root@86867025ffc7 leptonica-1.79.0]# pkg-config --list-all | grep lept
    lept             leptonica - An open source C library for efficient image processing and image analysis operations

    7.安装tesseract,进入到tesseract-master,执行如下命令:

    ./autogen.sh
    ./configure
    make && make install

    我在makemake install的时候报错,我升级了下GCC版本,原来的GCC版本是4.X,升级到8之后重新make && make install即可:

    第一步:安装scl源:
    yum install centos-release-scl scl-utils-build
    第二步: 列出scl可用源
    yum list all --enablerepo='centos-sclo-rh'
    yum list all --enablerepo='centos-sclo-rh' | grep "devtoolset-"
    第三步: 安装8版本的gcc、gcc-c++、gdb工具链(toolchian):
    yum install -y devtoolset-8-toolchain
    scl enable devtoolset-8 bash

     

    查看gcc版本:

    [root@86867025ffc7 tesseract-master]# gcc -v
    Using built-in specs.
    COLLECT_GCC=gcc
    COLLECT_LTO_WRAPPER=/opt/rh/devtoolset-8/root/usr/libexec/gcc/x86_64-redhat-linux/8/lto-wrapper
    Target: x86_64-redhat-linux
    Configured with: ../configure --enable-bootstrap --enable-languages=c,c++,fortran,lto --prefix=/opt/rh/devtoolset-8/root/usr --mandir=/opt/rh/devtoolset-8/root/usr/share/man --infodir=/opt/rh/devtoolset-8/root/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-gcc-major-version-only --with-linker-hash-style=gnu --with-default-libstdcxx-abi=gcc4-compatible --enable-plugin --enable-initfini-array --with-isl=/builddir/build/BUILD/gcc-8.3.1-20190311/obj-x86_64-redhat-linux/isl-install --disable-libmpx --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
    Thread model: posix
    gcc version 8.3.1 20190311 (Red Hat 8.3.1-3) (GCC)

      升级完gcc之后要重新configure和make、make install。否则会报错无效指针。如果make、make install 执行时没报错就不用升级gcc。

    8.  测试tesseract版本:

    [root@86867025ffc7 tesseract-master]# tesseract -v
    tesseract 5.0.0-alpha
     leptonica-1.79.0
      libjpeg 6b (libjpeg-turbo 1.2.90) : libpng 1.5.13 : libtiff 4.0.3 : zlib 1.2.7
     Found AVX2
     Found AVX
     Found SSE
     Found OpenMP 201511

    9.将语言包拷贝到容器中 /usr/local/share/tessdata

    tesseract --list-langs

    我执行的时候报错:

    *** Error in `tesseract': free(): invalid pointer: 0x000000000065bff0 ***

    解决办法:(到tesseract-master目录重新执行configure、make、make install)

    再次执行查看语言:

    [root@86867025ffc7 tesseract-master]# tesseract --list-langs
    List of available languages (2):
    chi_sim
    eng

    10.识别进行验证:将准备好的图片上传至容器的/opt/ocrtemplate

    [root@86867025ffc7 ocrtemplate]# tesseract ./zh.png result -l chi_sim -c preserve_interword_spaces=1 --dpi 300 --oem 1
    Tesseract Open Source OCR Engine v5.0.0-alpha with Leptonica
    [root@86867025ffc7 ocrtemplate]# ls
    result.txt  zh.png
    [root@86867025ffc7 ocrtemplate]# cat result.txt
    中文服务器

    关于tesseract命令如下:

    #控制台接收
    tesseract ./normal.png stdout -l chi_sim
    
    #只指定语言。指定语言需要用到chi_sim_vert.traineddata
    tesseract ./normal.png chi_sim__simhei_result -l chi_sim
    tesseract ./normal.png chi_sim__simhei_result -l chi_sim -c preserve_interword_spaces=1
    tesseract ./normal.png chi_sim__simhei_result -l chi_sim -c preserve_interword_spaces=1 --dpi 300
    tesseract ./normal.png chi_sim__simhei_result -l chi_sim -c preserve_interword_spaces=1 --dpi 300 --oem 1
    
    # 指定 --psm 1 需要用到 osd.traineddata
    tesseract ./normal.png chi_sim__simhei_result -l chi_sim -c preserve_interword_spaces=1 --dpi 300 --oem 1 --psm 1

    11.将该容器制作为镜像:(查到容器ID,然后commit为镜像)

    Administrator@MicroWin10-1535 MINGW64 ~/Desktop/dockertest
    $ docker ps -a
    CONTAINER ID        IMAGE                                 COMMAND             CREATED             STATUS              PORTS               NAMES
    86867025ffc7        hub.c.163.com/library/centos:latest   "/bin/bash"         18 hours ago        Up 18 hours                             objective_swanson
    
    Administrator@MicroWin10-1535 MINGW64 ~/Desktop/dockertest
    $ docker commit 86867025ffc7 zdtesseract
    sha256:46153c6cb7da8deb023aacaa46413822ee921a147151a235375e1a7f4ad64fda
    
    Administrator@MicroWin10-1535 MINGW64 ~/Desktop/dockertest
    $ docker images | grep zdte
    zdtesseract                             latest               46153c6cb7da        About a minute ago   1.64GB
    
    Administrator@MicroWin10-1535 MINGW64 ~/Desktop/dockertest
    $ docker history zdtesseract
    IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
    46153c6cb7da        7 minutes ago       /bin/bash                                       1.44GB
    328edcd84f1b        2 years ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
    <missing>           2 years ago         /bin/sh -c #(nop)  LABEL name=CentOS Base Im…   0B
    <missing>           2 years ago         /bin/sh -c #(nop) ADD file:63492ba809361c51e…   193MB

      至此,容器中安装tesseract已经完成。实际linux中安装tesseract也是上面的步骤。

     

      下面的操作都是为了docker方便进行的操作。如果我们想不进入容器就运行我们可能会执行如下命令:

    docker run --rm -v /opt/ocrtemplate:/opt/ocrtemplate zdtesseract tesseract /opt/ocrtemplate/normal.png /opt/ocrtemplate/result -l chi_sim --oem 1 --dpi 300

      --rm 指定容器结束后自动删除,-v 是指定宿主机和docker容器挂载目录关系(宿主机目录:docker容器目录)。执行完毕后会在容器内部的/opt/ocrtemplate目录下面生成result.txt,宿主机和容器/opt/ocrtemplate 目录具有挂载关系,所以会在宿主机目录也生成该文件,这就得到最终的OCR结果文件。

     

    12. 进行测试

    如果是windowsvirtualbox虚拟机需要先进入虚拟机。

     

    docker-machine ssh default  #进入虚拟机
    sudo -i    #切换用户

     

    然后执行:

    root@default:/opt/ocrtemplate# docker run --rm zdtesseract tesseract -v
    tesseract 5.0.0-alpha
     leptonica-1.79.0
      libjpeg 6b (libjpeg-turbo 1.2.90) : libpng 1.5.13 : libtiff 4.0.3 : zlib 1.2.7
     Found AVX2
     Found AVX
     Found SSE
     Found OpenMP 201511
    root@default:/opt/ocrtemplate# docker run --rm zdtesseract tesseract --list-langs
    List of available languages (2):
    chi_sim
    eng

    为了方便,我们给上面命令起个别名:

    root@default:/opt/ocrtemplate# alias tesseract='docker run --rm -v /opt/ocrtemplate:/opt/ocrtemplate zdtesseract tesseract' #起别名
    root@default:/opt/ocrtemplate# alias  #查看别名
    alias tesseract='docker run --rm -v /opt/ocrtemplate:/opt/ocrtemplate zdtesseract tesseract'
    root@default:/opt/ocrtemplate# tesseract -v  #用别名查看版本
    tesseract 5.0.0-alpha
     leptonica-1.79.0
      libjpeg 6b (libjpeg-turbo 1.2.90) : libpng 1.5.13 : libtiff 4.0.3 : zlib 1.2.7
     Found AVX2
     Found AVX
     Found SSE
     Found OpenMP 201511

    识别文件进行测试:

    (1)控制台接收:

    tesseract /opt/ocrtemplate/normal.png stdout -l chi_sim --oem 1 --dpi 300

    (2)生成文件:

    tesseract /opt/ocrtemplate/normal.png /opt/ocrtemplate/result -l chi_sim --oem 1 --dpi 300

    解释:上面实际上是执行命令

    docker run --rm -v /opt/ocrtemplate:/opt/ocrtemplate zdtesseract tesseract /opt/ocrtemplate/normal.png /opt/ocrtemplate/result -l chi_sim --oem 1 --dpi 300

      --rm 指定容器结束后自动删除,-v 是指定宿主机和docker容器挂载目录关系(宿主机目录:docker容器目录)。执行完毕后会在容器内部的/opt/ocrtemplate目录下面生成result.txt,宿主机和容器/opt/ocrtemplate 目录具有挂载关系,所以会在宿主机目录也生成该文件,这就得到最终的文件。

     

    13.将镜像打包归档,便于离线安装

    docker save -o zdtesseract.tar zdtesseract

      接下来tar包可以随便迁移,离线安装。

      当然可以提交到镜像仓库。

     

  • 相关阅读:
    (转)我是怎么治愈鼻窦炎的
    Linq to SQL 资源
    桥牌笔记:忍让几墩?
    读书笔记2013第1本:餐巾纸的背面
    《Two Dozen Short Lessons in Haskell》学习(十五) Encapsulation — modules
    《Two Dozen Short Lessons in Haskell》学习(十三)迭代及重复的常规模式
    读书笔记2013第4本:《上帝掷骰子吗?》
    用Haskell写的卡普雷尔卡kaprekar黑洞小程序
    读书笔记2013第5本:《拖延心理学》
    使用Supermemo背单词6周年了
  • 原文地址:https://www.cnblogs.com/qlqwjy/p/13028194.html
Copyright © 2011-2022 走看看