一小时徒手从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)
至此整个平台就搭建完成。
下面进行图片测试:
后端打印的日志:
我们的图片文字识别的平台就搭建好了。