Java - 识别图片中的文字_带源码5分钟详细教程_java_文字识别_教程_代码_spring

利用大模型提升文字识别效率与准确性

在java场景中,我们经常需要处理文字识别这类的图像识别任务。过去,我们主要依赖于OCR等传统方式来实现文字识别,但效果并不稳定。随着大模型技术的发展,我们现在可以使用大模型来进行文字识别,以获得更好的效果。通过引入大模型,我们可以显著提升java文字识别的准确性和鲁棒性。

在java文字识别的应用中,我们可以利用国产大模型qwen vl来实现高效的文字识别。通过将文字图像输入到大模型中,我们可以得到更准确和可靠的识别结果。这种基于大模型的方法不仅提高了java文字识别的效果,还简化了开发流程,使我们能够更快速地构建高质量的文字识别应用。

本例子使用java spring ai和国产大模型qwen vl来做样例,您也可以换成其他实现。

Spring AI框架介绍

在过去,Java 缺乏一个高效且统一的 AI 应用框架,这使得开发者在集成和使用各种 AI 组件时面临诸多不便。为了解决这一问题,Spring 团队推出了 java spring ai,这是一个专为 Java 开发者设计的 AI 应用框架。java spring ai 的核心优势在于它提供了一套统一的接口,允许开发者轻松地调用不同 AI 提供者的组件,如 OpenAI、Azure 和阿里云等。通过配置文件即可实现无缝切换,极大地简化了开发流程。此外,java spring ai 与 Spring 生态系统完美兼容,支持 Java 的面向对象编程,使得文字识别等 AI 功能的开发变得更加便捷。这种高度的抽象化和标准化显著减少了程序员的工作量,并提升了代码的可维护性和可移植性。

千问 Qwen VL概述

Qwen VL是一款专为图像和视频识别设计的多模态大模型,在国内处于领先地位。在思南大模型评测平台 https://arena.opencompass.org.cn 上,其表现仅次于国际知名的GPT和Claude模型;而在Hugging Face的视觉大模型竞技场 https://huggingface.co/spaces/lmarena-ai/chatbot-arena-leaderboard中,Qwen VL同样位列中国第一。我们鼓励大家参与和支持这些竞技活动,并欢迎测试与投票。

目前,Qwen-VL-Plus及Qwen-VL-Max版本限时免费,用户可直接访问通义千问官网或下载通义千问APP来感受Max版本的强大功能。

Java - 识别图片中的文字_带源码5分钟详细教程_java_文字识别_教程_代码_spring_02

Spring AI Alibaba:简化大模型接入的国产框架

Spring AI Alibaba 是一个针对国产大模型的实现框架,基于 Spring AI 的 API 完成了阿里云百炼系列云产品的大模型接入。它支持多种生成式AI任务,包括对话、文生图、文生语音等,并提供了OutputParser、Prompt Template等功能,极大简化了开发者的工作。其核心优势在于能够标准化不同AI提供者的接口实现,使得一次编码即可通过简单配置切换不同的AI服务。这不仅促进了与市面上大多数流式处理机器人的兼容性,还显著降低了开发和迁移的成本。通过Spring AI Alibaba,开发者可以轻松地为自己的项目添加由阿里云通义提供的聊天、图片或语音生成等AI能力。

基于Spring AI Alibaba实现文字识别,特别是二维码中的文字,通过调用通义千问模型完成

基于Spring AI Alibaba进行文字识别,特别是针对二维码图像中的文字,可以通过配置和调用阿里云的通义千问模型来实现。下面将详细说明如何集成并构建这样的系统。

前置准备
  1. JDK版本:确保你的开发环境使用的是JDK 17或更高版本。
  2. Spring Boot版本:确认项目中使用的Spring Boot版本为3.3.x以上。
  3. 申请API Key
  • 访问 阿里云百炼页面,登录您的账号后选择开通“百炼大模型推理”服务。
  • 开通成功后,前往API-KEY管理界面创建一个新的API-KEY,并妥善保存此密钥以供后续步骤使用。
  1. 配置API KEY:在命令行中设置环境变量 AI_DASHSCOPE_API_KEY 的值为你刚才记录下来的API-KEY。
export AI_DASHSCOPE_API_KEY=${REPLACE-WITH-VALID-API-KEY}
  • 1.
  1. 添加Maven仓库:因为Spring AI M3尚未被加入到官方Maven仓库,因此需要在项目的pom.xml文件里添加如下额外仓库支持:
<repositories>
    <repository>
      <id>sonatype-snapshots</id>

      <url>https://oss.sonatype.org/content/repositories/snapshots</url>

      <snapshots>
        <enabled>true</enabled>

      </snapshots>

    </repository>

    <repository>
      <id>spring-milestones</id>

      <name>Spring Milestones</name>

      <url>https://repo.spring.io/milestone</url>

      <snapshots>
        <enabled>false</enabled>

      </snapshots>

    </repository>

    <repository>
      <id>spring-snapshots</id>

      <name>Spring Snapshots</name>

      <url>https://repo.spring.io/snapshot</url>

      <releases>
        <enabled>false</enabled>

      </releases>

    </repository>

 </repositories>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  1. 依赖添加:在pom.xml中引入必要的依赖项,包括spring-ai-alibaba-starter以及指定Spring Boot的parent依赖。
<dependencies>
  <dependency>
    <groupId>com.alibaba.cloud.ai</groupId>

    <artifactId>spring-ai-alibaba-starter</artifactId>

    <version>1.0.0-M3.1</version>

  </dependency>

  <!-- 其他必要依赖 -->
</dependencies>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
构建读图代码

现在我们已经完成了基础配置,接下来是在Spring Boot应用程序内编写具体的业务逻辑代码。这里我们将创建一个简单的REST控制器,用于接收图片上传请求,并利用通义千问模型对其进行处理。

  1. 在src/main/resources目录下放置一张名为handwriting.png的文字文本图片作为示例输入。
  2. 创建一个控制器类HandwritingRecognitionController.java,注入ChatClient对象,并定义处理逻辑。
@RestController
@RequestMapping("/recognition")
public class HandwritingRecognitionController {
           
           

    private final ChatModel chatModel;

    public HandwritingRecognitionController(ChatModel chatModel) {
           
           
        this.chatModel = chatModel;
    }

    @Value("classpath:handwriting.png")
    private Resource imageResource;

    private static final String DEFAULT_PROMPT = "识别图中的文字";
    private static final String DEFAULT_MODEL = "qwen-vl-max-latest";

    @GetMapping("/handwriting")
    public Flux<String> recognizeHandwriting(@RequestParam(value = "prompt", required = false, defaultValue = DEFAULT_PROMPT) String prompt,
                                             HttpServletResponse response) throws Exception {
           
           
        response.setCharacterEncoding("UTF-8");

        List<Media> mediaList = List.of(new Media(MimeTypeUtils.IMAGE_PNG, imageResource));
        UserMessage message = new UserMessage(prompt, mediaList);
        message.getMetadata().put(DashScopeChatModel.MESSAGE_FORMAT, MessageFormat.IMAGE);

        return chatModel.stream(
                new Prompt(message, DashScopeChatOptions.builder()
                        .withModel(DEFAULT_MODEL)
                        .withMultiModel(true)
                        .build()))
                .map(resp -> resp.getResult().getOutput().getContent());
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  1. 最后,在application.properties中设置之前获取到的API key:
spring.ai.dashscope.api-key=${AI_DASHSCOPE_API_KEY}
  • 1.

通过上述步骤,您已经成功搭建了一个基于Spring AI Alibaba的文字识别应用,它能够接受PNG格式的文字图片输入,根据给定提示(默认为"识别图中的文字"),并通过流式响应返回识别结果。用户可通过访问http://localhost:8080/recognition/handwriting?prompt=识别图中的文字来进行测试。