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:\Users\Administrator>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包可以随便迁移,离线安装。

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

 

posted @ 2020-06-03 22:42  QiaoZhi  阅读(2314)  评论(0编辑  收藏  举报