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
我在make和make 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. 进行测试
如果是windows的virtualbox虚拟机需要先进入虚拟机。
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包可以随便迁移,离线安装。
当然可以提交到镜像仓库。