1. 简介
在如今的数据驱动型应用时代,利用计算机视觉等先进的机器学习和人工智能服务变得越来越重要。其中一种服务是 Vision API,它提供了强大的图片分析功能。在此 Codelab 中,您将学习如何使用 Spring Boot 和 Java 创建计算机视觉应用,以便在项目中释放图像识别和分析的潜力。应用界面将接受包含书面或打印文本的图片的公开网址作为输入,提取该文本,检测该语言,如果是受支持的语言之一,则会生成该文本的英语翻译。
构建内容
您需要创建一个
- 一个使用 Vision API 和 Google Cloud Translation API 的 Java Spring Boot 应用
- 已部署在 Cloud Run 上
2. 要求
以下是前提条件:
创建项目
- 拥有已创建项目并启用了结算功能的 Google Cloud 账号
- 已启用 Vision API、Translation、Cloud Run 和 Artifact Registry API
- 已激活 Cloud Shell
- 启用了 Cloud Storage API,并创建了存储分区,并上传了以当地支持的语言使用的文本或手写内容的图片(或者,您也可以使用本博客中提供的示例图片链接)
请参阅此文档,了解启用 Google Cloud API 的步骤。
激活 Cloud Shell
- 您将使用 Cloud Shell,这是一个在 Google Cloud 中运行的命令行环境,它预加载了 bq:
在 Cloud 控制台中,点击右上角的“激活 Cloud Shell”
- 在连接到 Cloud Shell 后,您应该会看到自己已通过身份验证,并且项目已设置为您的项目 ID。在 Cloud Shell 中运行以下命令,以确认您已通过身份验证:
gcloud auth list
- 在 Cloud Shell 中运行以下命令,以确认 gcloud 命令了解您的项目
gcloud config list project
- 如果项目未设置,请使用以下命令进行设置:
gcloud config set project <PROJECT_ID>
如需了解 gcloud 命令和用法,请参阅文档。
3. 引导 Spring Boot 项目
首先,请使用您偏好的 IDE 或 Spring Initializr 创建新的 Spring Boot 项目。在项目配置中添加必要的依赖项,例如 Spring Web、Spring Cloud GCP 和 Vision AI。或者,您也可以按照以下步骤通过 Cloud Shell 使用 Spring Initializr,轻松引导 Spring Boot 应用。
运行以下命令以创建 Spring Boot 项目:
curl https://start.spring.io/starter.tgz -d packaging=jar -d dependencies=cloud-gcp,web,lombok -d baseDir=spring-vision -d type=maven-project -d bootVersion=3.0.1.RELEASE | tar -xzvf -
spring-vision 是您的项目的名称,根据您的要求进行更改。
bootVersion 是 Spring Boot 的版本,请确保在实现时根据需要进行更新。
type 是项目构建工具类型的版本,您可以根据需要将其更改为 Gradle。
这将在“spring-vision”下创建一个项目结构如下所示:
pom.xml 包含项目的所有依赖项(您使用此命令配置的依赖项已添加到 pom.xml 中)。
src/main/java/com/example/demo 包含源类 .java 文件。
资源包含项目使用独立维护的图片、XML、文本文件和静态内容。
application.properties,可让您保留管理功能,以定义特定于配置文件的应用属性。
4. 配置 Vision API
启用 Vision API 后,您可以选择在应用中配置 API 凭据。您可以选择使用应用默认凭据来设置身份验证。不过,在此演示实现中,我并未实现使用凭据这一操作。
实现视觉和翻译服务
创建与 Vision API 交互的服务类。注入必要的依赖项,并使用 Vision API 客户端发送图片分析请求。您可以根据应用的要求,实现执行图片标记、人脸检测、识别等任务的方法。在本演示中,我们将使用手写内容提取和翻译方法。
为此,请确保在 pom.xml 中添加以下依赖项。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-gcp-starter-vision</artifactId>
</dependency>
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-translate</artifactId>
</dependency>
从代码库克隆 / 替换以下文件,并将其添加到项目结构中相应的文件夹 / 路径中:
- Application.java (/src/main/java/com/example/demo)
- TranslateText.java (/src/main/java/com/example/demo)
- VisionController.java (/src/main/java/com/example/demo)
- index.html (/src/main/resources/static)
- result.html (/src/main/resources/templates)
- pom.xml
通过 org.springframework.cloud.gcp.vision.CloudVisionTemplate
服务中的 extractTextFromImage
方法,您可以从图片输入中提取文本。借助 com.google.cloud.translate.v3
服务中的 getTranslatedText
方法,您可以传递从图片中提取的文本,并获取目标语言的译文作为响应(如果源语言属于受支持语言列表之一)。
构建 REST API
设计和实现用于公开 Vision API 功能的 REST 端点。创建控制器来处理传入请求,并利用 Vision API 服务处理图像并返回分析结果。在此演示中,我们的 VisionController
类会实现端点、处理传入请求、调用 Vision API 和 Cloud Translation 服务,并将结果返回到视图层。针对 REST 端点的 GET 方法的实现如下所示:
@GetMapping("/extractText")
public String extractText(String imageUrl) throws IOException {
String textFromImage =
this.cloudVisionTemplate.extractTextFromImage(this.resourceLoader.getResource(imageUrl));
TranslateText translateText = new TranslateText();
String result = translateText.translateText(textFromImage);
return "Text from image translated: " + result;
}
上述实现中的 TranslateText
类具有调用 Cloud Translation 服务的方法:
String targetLanguage = "en";
TranslateTextRequest request =
TranslateTextRequest.newBuilder()
.setParent(parent.toString())
.setMimeType("text/plain")
.setTargetLanguageCode(targetLanguage)
.addContents(text)
.build();
TranslateTextResponse response = client.translateText(request);
// Display the translation for each input text provided
for (Translation translation : response.getTranslationsList()) {
res = res + " ::: " + translation.getTranslatedText();
System.out.printf("Translated text : %s\n", res);
}
借助 VisionController
类,我们为 REST 实现了 GET 方法。
集成 Thymeleaf 进行前端开发
使用 Spring Boot 构建应用时,一种热门前端开发选择是利用 Thymeleaf 的强大功能。Thymeleaf 是一个服务器端 Java 模板引擎,允许您将动态内容无缝集成到 HTML 页面中。Thymeleaf 允许您使用嵌入式服务器端表达式创建 HTML 模板,从而提供流畅的开发体验。这些表达式可用于动态渲染 Spring Boot 后端的数据,从而更轻松地显示 Vision API 服务执行的图片分析结果。
首先,请确保您的 Spring Boot 项目中具有 Thymeleaf 的必要依赖项。您可以在 pom.xml 中添加 Thymeleaf Starter 依赖项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
在您的控制器方法中,从 Vision API 服务检索分析结果并将其添加到模型中。模型表示 Thymeleaf 将用来呈现 HTML 模板的数据。填充模型后,返回您要渲染的 Thymeleaf 模板的名称。Thymeleaf 将负责处理模板,用实际数据替换服务器端表达式,并生成将发送到客户端浏览器的最终 HTML。
对于 VisionController
中的 extractText
方法,我们已将结果作为 String
返回给模型,而不是添加到模型中。但是,我们在提交页面时对 index.html
调用了 GET 方法 extractText
方法。借助 Thymeleaf,您可以打造无缝的用户体验,使用户能够上传图片、触发 Vision API 分析并实时查看结果。利用 Thymeleaf 的强大功能进行前端开发,释放 Vision AI 应用的全部潜力。
<form action="/extractText">
Web URL of image to analyze:
<input type="text"
name="imageUrl"
value=""
<input type="submit" value="Read and Translate" />
</form>
5. 在 Cloud Run 上部署计算机视觉应用
请为服务和控制器类编写单元测试,以确保 /src/test/java/com/example
文件夹下的功能正常运行。确信其稳定性后,您可以将其打包到可部署的工件中(例如 JAR 文件),然后将其部署到 Cloud Run(Google Cloud 上的一个无服务器计算平台)。在此步骤中,我们将重点介绍如何使用 Cloud Run 部署您的容器化 Spring Boot 应用。
- 在 Cloud Shell 中执行以下步骤,以打包应用(确保终端在项目根文件夹中发出提示)
构建:
./mvnw package
构建成功后,在本地运行以测试:
./mvnw spring-boot:run
- 使用 Jib 将 Spring Boot 应用容器化:
您可以使用 Jib 实用程序来简化容器化过程,而不是手动创建 Dockerfile
并构建容器映像。Jib 是一个直接与构建工具(如 Maven 或 Gradle)集成的插件,让您无需编写 Dockerfile
即可构建经过优化的容器映像。在继续操作之前,您需要启用 Artifact Registry API(建议使用 Artifact Registry,而不是 Container Registry)。然后,运行 Jib 以构建 Docker 映像并发布到 Registry:
$ ./mvnw com.google.cloud.tools:jib-maven-plugin:3.1.1:build -Dimage=gcr.io/$GOOGLE_CLOUD_PROJECT/vision-jib
注意:在此实验中,我们未在 pom.xml 中配置 Jib Maven 插件,但对于高级用法,可以使用更多配置选项在 pom.xml 中添加该插件
- 将容器(我们在上一步中推送到 Artifact Registry 的容器)部署到 Cloud Run。这也是一个需要一条命令的步骤:
gcloud run deploy vision-app --image gcr.io/$GOOGLE_CLOUD_PROJECT/vision-jib --platform managed --region us-central1 --allow-unauthenticated --update-env-vars
或者,您也可以通过界面执行此操作。前往 Google Cloud 控制台并找到 Cloud Run 服务。点击“创建服务”然后按照屏幕上的说明操作。指定您之前推送到注册表的容器映像,配置所需的部署设置(例如 CPU 分配和自动扩缩),然后选择适当的部署区域。您可以设置特定于应用的环境变量。这些变量可能包括身份验证凭据(API 密钥等)、数据库连接字符串或 Vision AI 应用正常运行所需的任何其他配置。部署成功完成后,您应该会获得一个指向应用的端点。
试用 Vision AI 应用
出于演示目的,您可以使用下面的图片网址,为您的应用进行阅读和翻译:https://storage.googleapis.com/img_public_test/tamilwriting1.jfif
6. 清理
为避免系统因本博文中使用的资源向您的 Google Cloud 账号收取费用,请按以下步骤操作:
- 在 Google Cloud 控制台中,前往“管理资源”页面
- 在项目列表中,选择要删除的项目,然后点击“删除”
- 在对话框中输入项目 ID,然后点击“关停”以删除项目
7. 恭喜
恭喜!您已成功使用 Spring Boot 和 Java 创建了一个 Vision AI 应用。借助 Vision AI 的强大功能,您的应用现在可以执行复杂的图片分析,包括标记、人脸检测等。Spring Boot 的集成为构建可扩缩且强大的 Google Cloud Native 应用奠定了坚实的基础。继续探索 Vision AI、Cloud Run、Cloud Translation 等产品的强大功能,通过更多特性和功能增强您的应用。如需了解详情,请参阅 Vision API、Cloud Translation 和 GCP Spring 文档。对 Spring Native 选项进行同样的实验!此外,如要抢先了解生成式 AI 领域,请查看此 API 在 Model Garden 中的显示效果。