Java中图像识别后提取文字
在Java开发中,图像识别中提取文字 是一个常见需求,比如用于商品文字识别、文档分析等场景。传统上,这类任务多依赖OCR技术来实现,但其准确性与灵活性往往不尽人意。随着大模型技术的发展,现在可以利用这些先进的AI模型来进行图像识别,不仅提高了识别的准确率,还能更好地理解图片内容,满足更加复杂的应用需求。
本例使用spring ai alibaba + 阿里通义 vl来实现。
spring ai alibaba 是开源的spring ai调用框架。
通义千问,Qwen vl有 100万Token 免费额度,可以用来免费做图片识别,实现简单,按本文方案一步一步做就可以实现。
同时 Qwen vl模型也是一个开源模型,可以自己部署实现类似的 免费调用效果 7B的模型就可以实现很好的效果了。
Spring AI:统一高效的AI应用框架
过去,Java 缺乏一个统一且高效的 AI 应用框架,这使得开发者在集成和切换不同 AI 提供商时面临诸多不便。为了解决这一问题,Spring 团队推出了 Spring AI,这是一个专门用于 AI 工程的应用框架。Spring AI 的设计目标是将 Spring 生态系统的设计原则,如可移植性和模块化设计,应用到 AI 领域,并推广使用 POJOs 作为应用程序的构建块。其核心优势在于提供了一套统一的接口,使得开发者可以写一次代码,仅通过更改配置就能轻松切换不同的 AI 实现。此外,Spring AI 完美兼容现有的 Java 和 Spring 生态,支持面向对象编程,使得图像识别等复杂任务变得简单易行。
Spring AI的关键功能
能力名字:模型 Model
一句话说明:支持多模态,包括文本、图像等多种数据类型的处理。
输入输出举例:输入可以是文本或图片,如一段文字描述或一张猫的图片;输出则可以是对该段文字的理解或者对图片内容的描述。
能力名字:提示 Prompt
一句话说明:定义了与AI交互时的初始输入信息。
输入输出举例:输入为用户提供的问题或命令,例如"描述这张图片的内容";输出则是基于这个提示生成的回答或执行的动作。
能力名字:提示词模板 Prompt Template
一句话说明:通过预设模板简化和规范化提示的创建过程。
输入输出举例:输入可能是包含变量的模板字符串,比如"我想知道消息id: {id} 的状态";当{id}被实际值替换后,输出就是一个完整的询问消息状态的句子。
能力名字:嵌入 Embedding
一句话说明:将不同类型的数据转换成固定长度向量表示,便于进一步处理。
输入输出举例:输入是一段自然语言文本或一个图像文件;输出是一个数值向量,代表了输入内容在高维空间中的位置。
能力名字:检索增强生成 RAG
一句话说明:结合传统检索技术和大语言模型,以提高回复的质量和准确性。
输入输出举例:输入是一个查询请求,比如"2024年6月止,云智能集团的营收是多少?";系统会从知识库中查找相关信息,并基于这些信息生成准确的答案。
能力名字:函数调用 Function Calling
一句话说明:允许LLM根据需要调用外部定义的功能来完成任务。
输入输出举例:如果提问是关于特定消息的状态(假设ID已知),则可能触发一个名为messageStatusFunction
的函数调用来获取并返回最新状态信息。
能力名字:向量存储
一句话说明:提供了高效存储及检索大规模向量数据的能力,适用于多种应用场景。
输入输出举例:输入可以是待索引的新文档或其他形式的数据,而输出则是在进行相似度匹配后找到的相关项。
Spring AI Alibaba:接入阿里云AI产品的标准化接口
Spring AI Alibaba是针对Spring AI的一个实现,它基于Spring AI的API完成了阿里云百炼系列云产品的接入。其核心优势在于提供了标准化接口来接入国产大模型如通义万象、通义千问等,支持包括对话生成、文生图、文生语音等多种AI功能,并通过OutputParser、Prompt Template等工具简化了开发者的工作流程。利用Spring AI Alibaba,开发者可以便捷地集成这些先进的AI能力到自己的应用中,从而快速构建出具有丰富交互性和智能化特性的软件解决方案。该框架特别适合希望利用国产大模型进行创新性开发的企业和个人。
QWen VL介绍:
Qwen VL 是一款专为图像和视频识别设计的多模态大模型,在国内技术水平领先。它在思南大模型评测中表现优异,仅排在国际知名模型GPT与Claude之后,并且在中国同类模型中位居首位。同时,在Hugging Face视觉大模型竞技场里,Qwen VL同样保持了中国第一的位置。欢迎各界人士参与到这些平台中来,通过实际测试体验并投票支持您喜爱的模型。此外,Qwen-VL-Plus及Qwen-VL-Max版本现提供限时免费试用机会,用户可直接访问通义千问官网或下载通义千问APP以享受Max版本的强大功能。
使用Spring AI Alibaba实现二维码图像识别的详细示例
基于Spring AI Alibaba完成一个有Prompt 和流Flux返回的二维码图像识别,可以按照以下步骤进行配置和编码。这里我们将以本地的一个二维码png图片为例,并且设置default_prompt为“识别图中的文字”,最后通过流式返回识别结果。
前置准备
- 确保你的JDK版本在JDK 17及以上。
- Spring Boot版本需在3.3.x及以上。
- 在阿里云申请通义千问的API Key,并记录下来。
配置阿里云API Key
首先,在环境变量中设置AI_DASHSCOPE_API_KEY
:
export AI_DASHSCOPE_API_KEY=${REPLACE-WITH-VALID-API-KEY}
将${REPLACE-WITH-VALID-API-KEY}
替换为你从阿里云获得的有效API Key。
开通通义万象图像生成模型
- 访问百炼控制台。
- 选择左侧列表栏中的“模型广场”,找到并选择“图像生成”类别下的“通义万象”。
- 单击“API调用”按钮后,在新页面左上角查找模型英文名称(例如:
qwen-vl-max-latest
),这将是后续配置所需使用的模型名。
添加Spring仓库及依赖
在项目的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>
<dependencies>
<!-- 添加Spring Boot父项目 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.4</version>
<relativePath/>
</parent>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter</artifactId>
<version>1.0.0-M3.1</version>
</dependency>
<!-- 其他必要依赖... -->
</dependencies>
构建读图代码
接下来创建一个控制器类ChatModelController
,用于处理图像识别请求。同时确保已将待识别的二维码图片放置于src/main/resources/
目录下,并命名为qrcode.png
。
@RestController
@RequestMapping("/ai")
public class ChatModelController {
private static final Logger logger = LoggerFactory.getLogger(ChatModelController.class);
@Value("classpath:qrcode.png")
private Resource imageResource;
private final ChatModel chatModel;
public ChatModelController(ChatModel chatModel) {
this.chatModel = chatModel;
}
private static final String DEFAULT_PROMPT = "识别图中的文字";
private static final String DEFAULT_MODEL = "qwen-vl-max-latest";
@GetMapping("/imageRecognition")
public Flux<String> imageRecognition(
@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);
Flux<ChatResponse> fluxResponse = chatModel.stream(
new Prompt(
message,
DashScopeChatOptions.builder()
.withModel(DEFAULT_MODEL)
.withMultiModel(true)
.build()));
Flux<String> fluxString = fluxResponse.map(resp -> resp.getResult().getOutput().getContent());
return fluxString;
}
}
配置API Key
在application.properties文件中添加之前获取到的API Key:
spring.ai.dashscope.api-key=${AI_DASHSCOPE_API_KEY}
确保正确设置了系统环境变量或直接在此处填写实际值。
总结
以上就是使用Spring AI Alibaba实现图像识别功能的所有步骤。本示例展示了如何集成特定的阿里云AI服务来执行图像内容分析任务,并以流的形式异步接收处理结果。用户可以通过访问http://localhost:8080/ai/imageRecognition
端点来测试该功能,其中默认提示信息为“识别图中的文字”。