写在开始
最近给自己的搜索机器人加了一个OCR识别的功能,本来想尝试着直接识别来着,不过发现效果并不是很好,接下来继续用可能得考虑下有啥方式能提高文本的识别率了。
其中有个踩坑就是Nuget上的Tesseract构建的动态链接库只有Windows版,没有构建Linux版的动态链接库,所以直接在Linux上使用就会报错,然后会缺少那几个动态链接库。
一个是libleptonica-1.80.0.so
另一个是libtesseract41.so
,除此之外如果用到了System.Drawing
的话还需要libgdiplus
库。
接下来的解决方案只针对Debian 10,如果是非glibc环境的话自己参考下解决吧,用了好一阵子的alpine之后发现,在上面折腾的时间已经远大于节约的体积了,所以在Docker里面还是用Debian比较方便。
构建leptonica
构建之前先准备好编译环境
apt update -y && \
apt upgrade -y && \
apt install automake ca-certificates g++ git libtool make pkg-config asciidoc docbook-xsl xsltproc libpango1.0-dev git cmake -y
然后准备一下LD_LIBRARY_PATH
,这个是为了给Tesseract用的,所以现在不写也可以。
export LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib
接下来准备一个存放最终输出文件的目录
mkdir -p /app/out/x64
然后在/app
目录下克隆leptonica
并进入
git clone https://github.com/DanBloomberg/leptonica
cd leptonica
切换到1.80.0版本的commit上去
git checkout 1ac72c93fef1a5eb76b76d6723d2aee843dd6e51
然后使用autogen.sh
、./configure
、make -j4
、make install
四连
./autogen.sh
./configure
make -j4
make install
这里不能用cmake方案,用cmake的话输出文件里面找不到动态链接库,至于原因我没去找,毕竟做成自动编译脚本的话还要改里面的东西就有点麻烦了。
执行完成之后就会把liblept.so
安装到/usr/local/lib
里了,然后直接复制到我定义的输出目录里
cp /usr/local/lib/liblept.so.5.0.4 /app/out/x64/libleptonica-1.80.0.so
这样子libleptonica
就算是构建完成了。
构建Tesseract
这个构建思路也是类似的,老样子在/app
目录下克隆tesseract
并进入
git clone https://github.com/tesseract-ocr/tesseract.git
cd tesseract
然后找到4.1.1版本的commit,切换过去
git checkout 75103040c94ffd7fe5e4e3dfce0a7e67a8420849
然后使用autogen.sh
来生成项目
./autogen.sh
接下来创建输出目录,然后使用cmake编译就可以了
mkdir build
cd build
cmake ..
make -j4
然后拷贝动态链接库到定义的输出目录
cp libtesseract.so.4.1.1 /app/out/x64/libtesseract41.so
这两个文件的x64版本的动态链接库就构建完成了。
配置运行环境的依赖
我使用的时候还遇到了个找不到libdl
的问题,这个应该就是缺少了libgdiplus
的问题,用下面的命令安装就行了。
bash
完整的构建命令
这个可以抄一下我的Dockerfile,下面贴上我Dockerfile的配置
FROM moderras/dotnetsdk:5.0 AS build-env
WORKDIR /app
RUN export LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib && \
apt update -y && \
apt upgrade -y && \
apt install automake ca-certificates g++ git libtool make pkg-config asciidoc docbook-xsl xsltproc libpango1.0-dev git cmake -y && \
mkdir -p /app/out/x64 && \
git clone https://github.com/DanBloomberg/leptonica && \
cd leptonica && \
git checkout 1ac72c93fef1a5eb76b76d6723d2aee843dd6e51 && \
./autogen.sh && \
./configure && \
make -j4 && \
make install && \
cp /usr/local/lib/liblept.so.5.0.4 /app/out/x64/libleptonica-1.80.0.so && \
cd /app && \
git clone https://github.com/tesseract-ocr/tesseract.git && \
cd tesseract && \
git checkout 75103040c94ffd7fe5e4e3dfce0a7e67a8420849 && \
./autogen.sh && \
mkdir build && \
cd build && \
cmake .. && \
make -j4 && \
cp libtesseract.so.4.1.1 /app/out/x64/libtesseract41.so
大概就是这样吧
写在最后
虽然最后也没用上啥吧,这个OCR功能暂时被我废弃掉了,因为识别质量太差。所以写个博客留念一下折腾的这个东西吧,不得不说 .NET 的东西和Linux总是相性不和呢,每次把在Windows上跑得好好的东西移植到Linux上跑总是会出点问题,还经常是因为Nuget包里面缺少了指定平台的动态链接库或者依赖这种问题,真令人头大。