1. Giới thiệu
Trong thời đại các ứng dụng dựa trên dữ liệu hiện nay, việc tận dụng các dịch vụ học máy và trí tuệ nhân tạo tiên tiến như thị giác máy tính ngày càng trở nên quan trọng. Một trong những dịch vụ như vậy là Vision API, cung cấp các chức năng phân tích hình ảnh mạnh mẽ. Trong lớp học lập trình này, bạn sẽ tìm hiểu cách tạo một ứng dụng Thị giác máy tính bằng Spring Boot và Java, cho phép bạn khai thác tiềm năng của tính năng nhận dạng và phân tích hình ảnh trong các dự án của mình. Giao diện người dùng của ứng dụng sẽ chấp nhận URL công khai của những hình ảnh có chứa văn bản viết hoặc in làm dữ liệu đầu vào, trích xuất văn bản, phát hiện ngôn ngữ và nếu đó là một trong những ngôn ngữ được hỗ trợ, thì ứng dụng sẽ tạo bản dịch tiếng Anh cho văn bản đó.
Sản phẩm bạn sẽ tạo ra
Bạn sẽ tạo một
- Ứng dụng Java Spring Boot để sử dụng Vision API và Google Cloud Translation API
- Được triển khai trên Cloud Run
2. Yêu cầu
- Một trình duyệt, chẳng hạn như Chrome hoặc Firefox
- Một dự án trên Google Cloud đã bật tính năng thanh toán
Sau đây là các điều kiện tiên quyết:
Tạo dự án
- Một tài khoản Google Cloud có dự án đã tạo và đã bật thanh toán
- Đã bật Vision API, Translation, Cloud Run và Artifact Registry API
- Cloud Shell đã kích hoạt
- Cloud Storage API được bật với một vùng lưu trữ đã tạo và hình ảnh có văn bản hoặc chữ viết tay bằng các ngôn ngữ được hỗ trợ tại địa phương đã tải lên (hoặc bạn có thể sử dụng các đường liên kết đến hình ảnh mẫu được cung cấp trong blog này)
Hãy tham khảo tài liệu để biết các bước bật Cloud APIs của Google.
Kích hoạt Cloud Shell
- Bạn sẽ sử dụng Cloud Shell, một môi trường dòng lệnh chạy trong Google Cloud và được tải sẵn bq:
Trong Cloud Console, hãy nhấp vào Activate Cloud Shell (Kích hoạt Cloud Shell) ở góc trên cùng bên phải

- Sau khi kết nối với Cloud Shell, bạn sẽ thấy rằng mình đã được xác thực và dự án đã được đặt thành mã dự án của bạn. Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:
gcloud auth list
- Chạy lệnh sau trong Cloud Shell để xác nhận rằng lệnh gcloud biết về dự án của bạn
gcloud config list project
- Nếu bạn chưa đặt dự án, hãy dùng lệnh sau để đặt:
gcloud config set project <PROJECT_ID>
Tham khảo tài liệu để biết các lệnh và cách sử dụng gcloud.
3. Khởi động một dự án Spring Boot
Để bắt đầu, hãy tạo một dự án Spring Boot mới bằng IDE hoặc Spring Initializr mà bạn muốn. Đưa các phần phụ thuộc cần thiết (chẳng hạn như Spring Web, Spring Cloud GCP và Vision AI) vào cấu hình của dự án. Ngoài ra, bạn có thể sử dụng Spring Initializr từ Cloud Shell theo các bước bên dưới để dễ dàng khởi động ứng dụng Spring Boot.
Chạy lệnh sau để tạo dự án 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 là tên dự án của bạn, hãy thay đổi tên này theo yêu cầu của bạn.
bootVersion là phiên bản của Spring Boot, hãy nhớ cập nhật phiên bản này nếu cần tại thời điểm triển khai.
type là phiên bản của loại công cụ xây dựng dự án, bạn có thể thay đổi thành gradle nếu muốn.

Thao tác này sẽ tạo một cấu trúc dự án trong "spring-vision" như bên dưới:

pom.xml chứa tất cả các phần phụ thuộc cho dự án (các phần phụ thuộc mà bạn đã định cấu hình bằng lệnh này đã được thêm vào pom.xml).
src/main/java/com/example/demo có các tệp .java của lớp nguồn.
resources chứa hình ảnh, XML, tệp văn bản và nội dung tĩnh mà dự án sử dụng và được duy trì độc lập.
application.properties cho phép bạn duy trì các tính năng quản trị để xác định các thuộc tính dành riêng cho hồ sơ của ứng dụng.
4. Định cấu hình Vision API
Sau khi bật Vision API, bạn có thể định cấu hình thông tin đăng nhập API trong ứng dụng của mình. Bạn có thể tuỳ ý sử dụng Thông tin xác thực mặc định của ứng dụng để thiết lập quy trình xác thực. Tuy nhiên, trong bản minh hoạ này, tôi chưa triển khai việc sử dụng thông tin đăng nhập.
Triển khai các dịch vụ về hình ảnh và bản dịch
Tạo một lớp dịch vụ tương tác với Vision API. Chèn các phần phụ thuộc cần thiết và sử dụng ứng dụng Vision API để gửi yêu cầu phân tích hình ảnh. Bạn có thể triển khai các phương thức để thực hiện những việc như gắn nhãn hình ảnh, phát hiện, nhận dạng khuôn mặt, v.v., dựa trên các yêu cầu của ứng dụng. Trong bản minh hoạ này, chúng ta sẽ sử dụng các phương pháp trích xuất và dịch chữ viết tay.
Để làm việc này, hãy đảm bảo bạn thêm các phần phụ thuộc sau vào 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>
Sao chép / Thay thế các tệp sau đây từ repo và thêm các tệp đó vào các thư mục / đường dẫn tương ứng trong cấu trúc dự án:
- 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
Phương thức extractTextFromImage trong dịch vụ org.springframework.cloud.gcp.vision.CloudVisionTemplate cho phép bạn trích xuất văn bản từ dữ liệu đầu vào là hình ảnh. Phương thức getTranslatedText từ dịch vụ com.google.cloud.translate.v3 cho phép bạn truyền văn bản đã trích xuất từ hình ảnh và nhận văn bản đã dịch bằng ngôn ngữ đích mong muốn dưới dạng phản hồi (nếu nguồn bằng một trong các ngôn ngữ trong danh sách được hỗ trợ).
Tạo API REST
Thiết kế và triển khai các điểm cuối REST sẽ cung cấp các chức năng của Vision API. Tạo các bộ điều khiển xử lý yêu cầu đến và sử dụng dịch vụ Vision API để xử lý hình ảnh và trả về kết quả phân tích. Trong bản minh hoạ này, lớp VisionController của chúng tôi triển khai điểm cuối, xử lý yêu cầu đến, gọi API Vision và dịch vụ Cloud Translation, đồng thời trả về kết quả cho lớp hiển thị. Việc triển khai phương thức GET cho điểm cuối REST như sau:
@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;
}
Lớp TranslateText trong quá trình triển khai ở trên có phương thức gọi dịch vụ 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);
}
Với lớp VisionController, chúng ta đã triển khai phương thức GET cho REST.
Tích hợp Thymeleaf để phát triển giao diện người dùng
Khi xây dựng một ứng dụng bằng Spring Boot, một lựa chọn phổ biến cho quá trình phát triển giao diện người dùng là tận dụng sức mạnh của Thymeleaf. Thymeleaf là một công cụ mẫu Java phía máy chủ, cho phép bạn tích hợp liền mạch nội dung động vào các trang HTML. Thymeleaf mang đến trải nghiệm phát triển mượt mà bằng cách cho phép bạn tạo các mẫu HTML có biểu thức phía máy chủ được nhúng. Bạn có thể dùng các biểu thức này để hiển thị động dữ liệu từ phần phụ trợ Spring Boot, giúp bạn dễ dàng hiển thị kết quả phân tích hình ảnh do dịch vụ Vision API thực hiện.
Để bắt đầu, hãy đảm bảo rằng bạn có các phần phụ thuộc cần thiết cho Thymeleaf trong dự án Spring Boot. Bạn có thể thêm phần phụ thuộc Thymeleaf Starter vào pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
Trong phương thức bộ điều khiển, hãy truy xuất kết quả phân tích từ dịch vụ Vision API và thêm kết quả đó vào mô hình. Mô hình này đại diện cho dữ liệu mà Thymeleaf sẽ dùng để hiển thị mẫu HTML. Sau khi mô hình được điền sẵn, hãy trả về tên của mẫu Thymeleaf mà bạn muốn hiển thị. Thymeleaf sẽ xử lý mẫu, thay thế các biểu thức phía máy chủ bằng dữ liệu thực tế và tạo ra HTML cuối cùng sẽ được gửi đến trình duyệt của máy khách.
Trong trường hợp phương thức extractText trong VisionController, chúng ta đã trả về kết quả dưới dạng String và không thêm vào mô hình. Nhưng chúng ta đã gọi phương thức GET extractText trên index.html khi gửi trang. Với Thymeleaf, bạn có thể tạo trải nghiệm liền mạch cho người dùng, trong đó người dùng có thể tải hình ảnh lên, kích hoạt các phân tích của Vision API và xem kết quả theo thời gian thực. Khai thác toàn bộ tiềm năng của ứng dụng Vision AI bằng cách tận dụng sức mạnh của Thymeleaf để phát triển giao diện người dùng.
<form action="/extractText">
Web URL of image to analyze:
<input type="text"
name="imageUrl"
value=""
<input type="submit" value="Read and Translate" />
</form>
5. Triển khai ứng dụng thị giác máy tính trên Cloud Run
Viết các kiểm thử đơn vị cho các lớp dịch vụ và lớp bộ điều khiển để đảm bảo chức năng phù hợp trong thư mục /src/test/java/com/example. Sau khi bạn tin tưởng vào tính ổn định của ứng dụng, hãy đóng gói ứng dụng đó thành một cấu phần phần mềm có thể triển khai, chẳng hạn như tệp JAR, rồi triển khai ứng dụng đó vào Cloud Run, một nền tảng điện toán không máy chủ trên Google Cloud. Trong bước này, chúng ta sẽ tập trung vào việc triển khai ứng dụng Spring Boot được chứa trong vùng chứa bằng Cloud Run.
- Đóng gói ứng dụng của bạn bằng cách thực hiện các bước sau trong Cloud Shell(đảm bảo thiết bị đầu cuối đang nhắc ở thư mục gốc của dự án)
Phiên bản:
./mvnw package
Sau khi bản dựng thành công, hãy chạy cục bộ để kiểm thử:
./mvnw spring-boot:run
- Quản lý ứng dụng Spring Boot theo vùng chứa bằng Jib:
Thay vì tự tạo Dockerfile và tạo hình ảnh vùng chứa, bạn có thể sử dụng tiện ích Jib để đơn giản hoá quy trình tạo vùng chứa. Jib là một trình bổ trợ tích hợp trực tiếp với công cụ tạo bản dựng (chẳng hạn như Maven hoặc Gradle) và cho phép bạn tạo các hình ảnh vùng chứa được tối ưu hoá mà không cần viết Dockerfile. Trước khi tiếp tục, bạn cần bật Artifact Registry API (Bạn nên sử dụng Artifact Registry thay vì container registry). Sau đó, hãy chạy Jib để tạo một hình ảnh Docker và xuất bản lên Registry:
$ ./mvnw com.google.cloud.tools:jib-maven-plugin:3.1.1:build -Dimage=gcr.io/$GOOGLE_CLOUD_PROJECT/vision-jib
Lưu ý: Trong thử nghiệm này, chúng tôi không định cấu hình trình bổ trợ Jib Maven trong pom.xml, nhưng để sử dụng nâng cao, bạn có thể thêm trình bổ trợ này vào pom.xml với nhiều lựa chọn định cấu hình hơn
- Triển khai vùng chứa (mà chúng ta đã chuyển đến Artifact Registry ở bước trước) lên Cloud Run. Đây cũng là một bước chỉ cần dùng một lệnh:
gcloud run deploy vision-app --image gcr.io/$GOOGLE_CLOUD_PROJECT/vision-jib --platform managed --region us-central1 --allow-unauthenticated --update-env-vars
Ngoài ra, bạn cũng có thể thực hiện việc này trên giao diện người dùng. Chuyển đến Google Cloud Console rồi tìm dịch vụ Cloud Run. Nhấp vào "Tạo dịch vụ" rồi làm theo hướng dẫn trên màn hình. Chỉ định hình ảnh vùng chứa mà bạn đã đẩy vào sổ đăng ký trước đó, định cấu hình các chế độ cài đặt triển khai mong muốn (chẳng hạn như phân bổ CPU và tính năng tự động mở rộng quy mô) rồi chọn khu vực phù hợp để triển khai. Bạn có thể thiết lập các biến môi trường dành riêng cho ứng dụng của mình. Các biến này có thể bao gồm thông tin xác thực (khoá API, v.v.), chuỗi kết nối cơ sở dữ liệu hoặc bất kỳ cấu hình nào khác cần thiết để ứng dụng Vision AI của bạn hoạt động đúng cách. Khi quá trình triển khai hoàn tất, bạn sẽ nhận được một điểm cuối cho ứng dụng của mình.
Chơi với ứng dụng Vision AI
Để minh hoạ, bạn có thể dùng URL hình ảnh bên dưới để ứng dụng đọc và dịch: https://storage.googleapis.com/img_public_test/tamilwriting1.jfif

6. Dọn dẹp
Để tránh bị tính phí vào tài khoản Google Cloud của bạn cho các tài nguyên được dùng trong bài đăng này, hãy làm theo các bước sau:
- Trong bảng điều khiển Google Cloud, hãy chuyển đến trang Quản lý tài nguyên
- Trong danh sách dự án, hãy chọn dự án mà bạn muốn xoá rồi nhấp vào Xoá
- Trong hộp thoại, hãy nhập mã dự án rồi nhấp vào Tắt để xoá dự án
7. Xin chúc mừng
Xin chúc mừng! Bạn đã tạo thành công một ứng dụng Vision AI bằng Spring Boot và Java. Nhờ sức mạnh của AI thị giác, giờ đây, ứng dụng của bạn có thể thực hiện quy trình phân tích hình ảnh phức tạp, bao gồm cả việc gắn nhãn, phát hiện khuôn mặt, v.v. Việc tích hợp Spring Boot mang đến một nền tảng vững chắc để xây dựng các ứng dụng Google Cloud Native (Google Cloud gốc) có khả năng mở rộng và mạnh mẽ. Tiếp tục khám phá các chức năng đa dạng của Vision AI, Cloud Run, Cloud Translation và nhiều dịch vụ khác để cải thiện ứng dụng của bạn bằng các tính năng và chức năng bổ sung. Để tìm hiểu thêm, hãy xem tài liệu về Vision API, Cloud Translation và GCP Spring. Hãy thử nghiệm tương tự với lựa chọn Spring Native!! Ngoài ra, để xem trước thế giới AI tạo sinh, hãy xem cách API này xuất hiện trong Model Garden.