Closed weiweics55 closed 2 weeks ago
这个问题是OCR引擎没有运行起来。很大可能是CPU不具有AVX指令集,所以不兼容。
请检查CPU兼容性(在主机或容器执行均可):
lscpu | grep avx
如果CPU支持AVX指令集,则会输出一行很长的结果,其中可以找到 avx 的字样,类似如下:
Flags: ... avx ... avx2 ...
这个问题是OCR引擎没有运行起来。很大可能是CPU不具有AVX指令集,所以不兼容。
请检查CPU兼容性(在主机或容器执行均可):
lscpu | grep avx
如果CPU支持AVX指令集,则会输出一行很长的结果,其中可以找到 avx 的字样,类似如下:
Flags: ... avx ... avx2 ...
结果如下: [root@VM-0-3-centos Umi-OCR-Docker]# lscpu | grep avx Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx lm constant_tsc rep_good nopl eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch rsb_ctxsw bmi1 avx2 bmi2 rdseed adx xsaveopt [root@VM-0-3-centos Umi-OCR-Docker]#
看来CPU是没有问题的。请尝试在容器中,运行以下路径的脚本:
/app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/run.sh
正常情况下,应该能看到 OCR init completed.
的输出。
如果有报错或别的情况,请告诉我。
[root@VM-0-3-centos Umi-OCR-Docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a90cb508e2f5 umi-ocr-paddle "/app/umi-ocr.sh" 4 minutes ago Up 4 minutes 0.0.0.0:1224->1224/tcp, :::1224->1224/tcp umi-ocr
[root@VM-0-3-centos Umi-OCR-Docker]# docker exec -it a90cb508e2f5 /app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/run.sh
/app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/bin/PaddleOCR-json: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/bin/PaddleOCR-json)
/app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/bin/PaddleOCR-json: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by /app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/bin/PaddleOCR-json)
/app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/bin/PaddleOCR-json: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found (required by /app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/bin/PaddleOCR-json)
/app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/bin/PaddleOCR-json: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.33' not found (required by /app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/bin/PaddleOCR-json)
/app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/bin/PaddleOCR-json: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/lib/libopencv_imgcodecs.so.410)
/app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/bin/PaddleOCR-json: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.33' not found (required by /app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/lib/libopencv_imgcodecs.so.410)
/app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/bin/PaddleOCR-json: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found (required by /app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/lib/libopencv_imgcodecs.so.410)
/app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/bin/PaddleOCR-json: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by /app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/lib/libopencv_imgcodecs.so.410)
/app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/bin/PaddleOCR-json: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found (required by /app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/lib/libopencv_imgproc.so.410)
/app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/bin/PaddleOCR-json: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/lib/libopencv_imgproc.so.410)
/app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/bin/PaddleOCR-json: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/lib/libopencv_core.so.410)
/app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/bin/PaddleOCR-json: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.30' not found (required by /app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/lib/libopencv_core.so.410)
/app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/bin/PaddleOCR-json: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `CXXABI_1.3.13' not found (required by /app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/lib/libopencv_core.so.410)
/app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/bin/PaddleOCR-json: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found (required by /app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/lib/libopencv_core.so.410)
/app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/bin/PaddleOCR-json: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.33' not found (required by /app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/lib/libopencv_core.so.410)
/app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/bin/PaddleOCR-json: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by /app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/lib/libopencv_core.so.410)
/app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/bin/PaddleOCR-json: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found (required by /app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/lib/libgomp.so.1)
/app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/bin/PaddleOCR-json: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by /app/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/lib/libgomp.so.1)
[root@VM-0-3-centos Umi-OCR-Docker]#
从报错中看,原因是 glibc
和 libstdc++
的版本太旧,不兼容Paddle推理库和OpenCV组件。
理论上,Docker基础镜像 debian:11
在我的测试环境中是可以正确部署的。但可能你的主机系统版本较旧,而Docker容器又使用了主机的部分环境,导致该不兼容现象。我估计,换用新的基础镜像可以解决:
FROM debian:11-slim
FROM debian:12-slim
我是本地部署遇到了这个问题,原因是 libc6
和 libstdc++
版本过低,解决办法是手动下载所需版本的库文件,放到插件的 lib
目录下,再修改插件的启动文件。
从 https://pkgs.org/ 搜索需要下载的文件,最终定位到需要下载以下两个文件:
http://ftp.de.debian.org/debian/pool/main/g/gcc-12/libstdc++6_12.2.0-14_amd64.deb
http://ftp.de.debian.org/debian/pool/main/g/glibc/libc6_2.36-9+deb12u7_amd64.deb
这两个文件下载下来之后,用归档管理器打开,再打开其中的 data.tar.xz
。
把 /usr/lib/x86_64-linux-gnu/
或 /lib/x86_64-linux-gnu/
下的所有文件解压至 Umi-OCR/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/lib/
目录。
修改 Umi-OCR/UmiOCR-data/plugins/linux_x64_PaddleOCR-json_v140_beta/run.sh
。
增加一行 LD_LOCATION="$SCRIPT_DIR/lib/ld-linux-x86-64.so.2"
。
最后一行的中间位置增加 "$LD_LOCATION"
。这样就不依赖系统本身的 libc
库了。
最终的 run.sh
:
#! /bin/bash -e
# 获取当前脚本路径
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
# 获取PaddleOCR-json路径
EXE_LOCATION="$SCRIPT_DIR/bin/PaddleOCR-json"
LIB_LOCATION="$SCRIPT_DIR/lib/"
# 以下一行是增加的
LD_LOCATION="$SCRIPT_DIR/lib/ld-linux-x86-64.so.2"
# 运行PaddleOCR-json
# 以下行的"$LD_LOCATION"是增加的
LD_LIBRARY_PATH="$LIB_LOCATION" "$LD_LOCATION" "$EXE_LOCATION" -models_path="$SCRIPT_DIR/models" "$@"
v2.1.4 新版本中,重新编译了 GLIBC 版本更低的依赖项,可解决此问题。请重新下载 Dockerfile 并构建镜像。
http://localhost:1224/api/ocr
{"code": 803, "data": "\u4efb\u52a1\u63d0\u524d\u7ed3\u675f\u3002[Error] OCR init fail. Argd: {'enable_mkldnn': True, 'cpu_threads': 2, 'config_path': 'models/config_chinese.txt', 'cls': False, 'use_angle_cls': False, 'limit_side_len': 960}\nOCR init fail."} json: cannot unmarshal string into Go struct field Response.data of type []local.DataEntry