一小时徒手从0到1搭建一套图片文字识别的OCR平台

在我们日常的工作学习中,图片中的文件识别功能是非常常用的(如用户上传的图片做风控)。我们根据面向的对象不同,一般可以分成两类:

(1)面向普通用户;现有的图片文件识别工具有很多,常见有的微信截图工具中的自带的文字识别功能、专业OCR文字识别软件(如AI识别王、迅捷OCR识别软件);

(2)面向程序;在编码的过程中,需要实现自动识别图片中的文字功能,常见有供应商有阿里的OCR文字识别、百度的OCR文字识别等等,当然也可以自己使用Tesseract搭建一套图片文字识别的服务。

下面我们将使用Tesseract搭建一套自己的图片文字识别的服务平台。本平台中使用的技术有:java8 + maven + Tess4J + Springboot + Swagger。

Tesseract是一个开源的光学字符识别(OCR)引擎,Tess4J是一个基于Tesseract OCR引擎的Java接口。

1、Tesseract-OCR环境搭建

(1)基础依赖安装

Tesseract放在Linux上搭建的,以下是搭建的如下:

#1、基础依赖 
yum -y install gcc-c++ make 
yum install -y autoconf automake libtool libjpeg libpng libtiff zlib libjpeg-devel libpng-devel libtiff-devel zlib-devel 
#2、下载pkg-config 
wget https://pkg-config.freedesktop.org/releases/pkg-config-0.29.tar.gz 
#解压 
tar -zxvf pkg-config-0.29.tar.gz 
#编译 
cd pkg-config-0.29/ 
 ./configure --with-internal-glib 
make 
make check 
make install

完成基础依赖安装后可以看到

(2)上传Tesseract的压缩包和相关的文件

依赖可以到官方网站下载(我这里下载好,直接可以使用,需要的软件的可以私信我)

上传文件到Linux上

(3)安装 leptonica

#1、解压文件 
tar -zxvf leptonica-1.79.0.tar.gz 
#2、编译 
./autogen.sh 
./configure --prefix=/usr/local/ 
make 
make install

编译完成之后的效果:

配置leptonica:

vi /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)安装tesseract

#1、解压文件 
tar -zxvf tesseract-1.1.tar.gz 
#2、编译 
./autogen.sh 
./configure --with-extra-includes=/usr/local/include --with-extra-libraries=/usr/local/include 
make 
make install

编译之后的效果:

(5)测试安装是否成功

tesseract --version

安装成功的效果:

(6)语言库放到Tesseract-OCR指定的目录中

将这两个文件放在/usr/local/share/tessdata文件夹下

以上就完成了Tesseract-OCR基础环境的搭建。在这个过程中可能出现如下的问题:

configure: error: Leptonica 1.74 or higher is required. Try to install libleptonica-dev package.

问题的原因是没有安装pkg-congfig。

2、Springboot搭建Tesseract-OCR平台服务

(1)搭建基础的springboot工程(不详细介绍)

(2)添加依赖

<!-- tess4j --> 
<dependency> 
    <groupId>net.sourceforge.tess4j</groupId> 
    <artifactId>tess4j</artifactId> 
    <version>4.5.4</version> 
</dependency>

(3)配置yml文件

server: 
  port: 8081 
#指定识别语言库的位置 
tess4j: 
  datapath: /usr/local/share/tessdata

(4)配置 Tess4J

@Configuration 
public class TesseractOcrConfig { 
    @Value("${tess4j.datapath}") 
    private String dataPath; 
    @Bean 
    public Tesseract tesseract() { 
        Tesseract tesseract = new Tesseract(); 
        //设置数据文件夹路径 
        tesseract.setDatapath(dataPath); 
        //设置为中文简体 
        tesseract.setLanguage("chi_sim"); 
        return tesseract; 
    } 
}

(5)编写识别的图片的服务

@Service 
@Slf4j 
public class OcrService { 
    @Resource 
    private Tesseract tesseract; 
    /** 
     * 
     * @param imageFile 要识别的图片 
     * @return 
     */ 
    public String recognizeText(MultipartFile imageFile) throws IOException, TesseractException { 
        // 转换 
        InputStream sbs = new ByteArrayInputStream(imageFile.getBytes()); 
        BufferedImage bufferedImage = ImageIO.read(sbs); 
        // 对图片进行文字识别 
        return tesseract.doOCR(bufferedImage); 
    } 
}

(6)编写识别的图片的Controller服务

@RestController 
@RequestMapping("/api") 
@Slf4j 
@Api(description = "OCR服务") 
public class OcrController { 
    @Resource 
    private OcrService ocrService; 
    @PostMapping(value = "/recognize") 
    public String recognizeImage(@RequestParam("file") MultipartFile file) throws TesseractException, IOException { 
        // 调用OcrService中的方法进行文字识别 
        String result = ocrService.recognizeText(file); 
        log.info("识别图片的结果:{}", result); 
        return result; 
    } 
}

(7)本平台就不写页面了,直接使用swagger展示效果,配置swagger

#1、添加依赖 
<!--swagger--> 
  <dependency> 
      <groupId>io.springfox</groupId> 
      <artifactId>springfox-swagger2</artifactId> 
      <version>2.7.0</version> 
   </dependency> 
<!--swagger ui--> 
   <dependency> 
       <groupId>io.springfox</groupId> 
       <artifactId>springfox-swagger-ui</artifactId> 
       <version>2.7.0</version> 
   </dependency> 
#2、配置swagger 
@Configuration 
@EnableSwagger2 
public class SwaggerConfig { 
    @Bean 
    public Docket webApiConfig(){ 
        System.out.println("启动swagger"); 
        return new Docket(DocumentationType.SWAGGER_2) 
                .groupName("webApi") 
                .apiInfo(webApiInfo()) 
                .select() 
                //接口中由/admin   /error就不显示 
                .paths(Predicates.not(PathSelectors.regex("/admin/.*"))) 
                .paths(Predicates.not(PathSelectors.regex("/error.*"))) 
                //扫描指定的包 
                .apis(RequestHandlerSelectors.basePackage("com")) 
                .build(); 
    } 
    private ApiInfo webApiInfo(){ 
        return new ApiInfoBuilder() 
                .title("OCR-API文档")     //swagger页面上大标题 
                .description("OCR微服务接口定义")    //描述 
                .version("1.0") 
                .contact(new Contact("java", "http://baidu.com", "1733150517@qq.com")) 
                .build(); 
    } 
}

搭建完成之后的整体项目架构:

3、测试搭建的Tesseract OCR平台

(1)上传服务的jar包到了Linux上

(2)启动项目(需要预先安装jdk和maven)

java -jar ocr-test-1.0-SNAPSHOT.jar

启动成功的效果:

(3)启动swagger(http://ip:port/swagger-ui.html

至此整个平台就搭建完成。

下面进行图片测试:

后端打印的日志:

我们的图片文字识别的平台就搭建好了。

3