1. Giới thiệu
Trong thời đại của các ứng dụng dựa trên dữ liệu ngày nay, việc khai thác các dịch vụ trí tuệ nhân tạo và học máy tiên tiến như thị giác máy tính ngày càng quan trọng. Một trong những dịch vụ như vậy là Vision API, mang lại khả 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 ứng dụng Computer Vision bằng Spring Boot và Java, cho phép bạn khai thác tiềm năng của khả 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 dữ liệu đầu vào, URL công khai của hình ảnh chứa văn bản ở dạng văn bản hoặc văn bản in, trích xuất văn bản, phát hiện ngôn ngữ và nếu ngôn ngữ đó là một trong những ngôn ngữ được hỗ trợ thì hệ thống sẽ tạo bản dịch tiếng Anh của 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 Boot Boot để dùng Vision API và Google Cloud Translation API
- Đã 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
Dưới đây là các điều kiện tiên quyết:
Tạo dự án
- Tài khoản Google Cloud đã tạo dự án và bật tính năng thanh toán
- Đã bật Vision API, Translation, Cloud Run và Artifact Registry API
- Đã kích hoạt Cloud Shell
- Cloud Storage API hỗ trợ một bộ chứa được tạo và tải lên các 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 (hoặc bạn có thể sử dụng các đường liên kết của hình ảnh mẫu được cung cấp trong blog này)
Tham khảo tài liệu này để biết các bước bật API Google Cloud.
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 được tải sẵn bằng bq:
Trong Bảng điều khiển Cloud, hãy nhấp vào 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 mình đã được xác thực và dự án đã được đặt thành mã dự á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 dự án của bạn chưa được thiết lập, hãy sử dụng lệnh sau để thiết lập dự án:
gcloud config set project <PROJECT_ID>
Hãy tham khảo tài liệu để biết các lệnh gcloud và cách sử dụng.
3. Tự khởi động 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 Boot mà bạn ưa thích. Thêm 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 Boot (Trình khởi tạo mùa xuân) qua 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 của dự án. Bạn có thể thay đổi tên này theo yêu cầu của mình.
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 tạo cấu trúc dự án trong tiêu chí "tầm nhìn mùa xuân" như bên dưới:
pom.xml chứa tất cả phần phụ thuộc của dự án (các phần phụ thuộc mà bạn thiết lập bằng lệnh này đã được thêm vào tệp pom.xml của bạn).
src/main/java/com/example/demo có các tệp nguồn .java.
resources (tài nguyên) chứa hình ảnh, XML, tệp văn bản và nội dung tĩnh mà dự án sử dụng đượ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 cụ thể 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 xác thực của API trong ứng dụng. 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 tính năng xác thực. Tuy nhiên, trong quá trình triển khai minh hoạ này, tôi chưa triển khai việc sử dụng thông tin xác thực.
Triển khai tầm nhìn và dịch vụ dịch thuật
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 các thao tác như gắn nhãn hình ảnh, phát hiện khuôn mặt, nhận dạng và nhiều thao tác khác, dựa trên yêu cầu của ứng dụng. Trong phần minh hoạ này, chúng ta sẽ sử dụng phương pháp trích xuất và dịch chữ viết tay.
Để làm được điều này, hãy đảm bảo bạn đưa các phần phụ thuộc sau đây 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 trong kho lưu trữ rồi 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)
- Kết quả.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 của 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 được trích xuất từ hình ảnh của mình và lấy 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 thuộc một trong danh sách ngôn ngữ được hỗ trợ).
Xây dựng API REST
Thiết kế và triển khai các điểm cuối REST sẽ hiển thị các chức năng của Vision API. Tạo bộ điều khiển xử lý các yêu cầu gửi đến, đồng thời 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 ta sẽ triển khai điểm cuối, xử lý yêu cầu được gửi đến, gọi Vision API và dịch vụ Cloud Translation rồi trả về kết quả cho lớp chế độ xem. Cách 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 cách triển khai ở trên có phương thức gọi dịch vụ Dịch trên đám mây:
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 để 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 của mình. Thymeleaf mang lại trải nghiệm phát triển mượt mà bằng cách cho phép bạn tạo mẫu HTML có biểu thức phía máy chủ được nhúng. Các biểu thức này có thể dùng để kết xuất độ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 bạn có các phần phụ thuộc cần thiết cho Thymeleaf trong dự án Spring Boot của mình. Bạn có thể đưa phần phụ thuộc Thymeleaf Starter vào trong tệp pom.xml của mình:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
Trong phương thức tay đ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ẽ sử dụng để kết xuất mẫu HTML. Sau khi điền sẵn mô hình, hãy trả về tên của mẫu Thymeleaf mà bạn muốn kết xuất. Thymeleaf sẽ đảm nhận việc xử lý mẫu, thay thế biểu thức phía máy chủ bằng dữ liệu thực tế và tạo HTML cuối cùng sẽ được gửi đến trình duyệt của khách hàng.
Đối với phương thức extractText
trong VisionController
, chúng ta đã trả về kết quả dưới dạng String
chứ không thêm vào mô hình. Tuy nhiên, chúng tôi đã 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 ra một trải nghiệm người dùng liền mạch, trong đó người dùng có thể tải hình ảnh lên, kích hoạt các bản phân tích của Vision API và xem kết quả theo thời gian thực. Khai thác sức mạnh của Thymeleaf để phát triển giao diện người dùng, khai thác toàn bộ tiềm năng của ứng dụng Vision AI của bạn.
<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 mã kiểm thử đơn vị cho các lớp dịch vụ và trình điều khiển của bạn để đảm bảo chức năng phù hợp trong thư mục /src/test/java/com/example
. Khi bạn đã tự tin về độ ổn định của phiên bản này, hãy đóng gói cấu phần phần mềm này vào 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 nó lên Cloud Run, một nền tảng điện toán không máy chủ trên Google Cloud. Ở bước này, chúng ta sẽ tập trung vào việc triển khai ứng dụng Spring Boot trong vùng chứa của bạn bằng Cloud Run.
- Đóng gói ứng dụng của bạn bằng cách thực thi các bước sau đây trên 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 tạo bản dựng thành công, hãy chạy cục bộ để kiểm thử:
./mvnw spring-boot:run
- Vùng chứa ứng dụng Spring Boot của bạn bằng Jib:
Thay vì tạo Dockerfile
rồi tạo hình ảnh vùng chứa theo cách thủ công, bạn có thể sử dụng tiện ích Jib để đơn giản hoá quy trình khai thác 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ụ xây dựng (chẳng hạn như Maven hoặc Gradle) và cho phép bạn tạo 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 (Chúng tôi khuyến khích việc sử dụng Artifact Registry so với sổ đăng ký vùng chứa). Sau đó, Run Jib để tạo hình ảnh Docker và xuất bản lên Registry (Sổ đăng ký):
$ ./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 tệp pom.xml với nhiều lựa chọn cấu hình hơn
- Triển khai vùng chứa (mà chúng ta đã đẩy lên Artifact Registry trong bước trước) lên Cloud Run. Đây là bước 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
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 "Create Service" (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à trước đây bạn đã đẩy vào sổ đăng ký, định cấu hình chế độ cài đặt triển khai mong muốn (chẳng hạn như phân bổ CPU và tự động cấp tài nguyên bổ sung) và chọn khu vực thích hợp để triển khai. Bạn có thể đặt 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 hoạt động đúng cách. Khi quá trình triển khai hoàn tất thành công, bạn sẽ nhận được một điểm cuối cho ứng dụng của mình.
Chơi bằng ứng dụng Vision AI
Để minh hoạ, bạn có thể sử dụng URL hình ảnh bên dưới để ứng dụng của mình đọ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 cho các tài nguyên được sử 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 truy cập vào 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, nhập ID dự án, sau đó 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 Vision AI, ứng dụng của bạn giờ đây có thể phân tích hình ảnh phức tạp như gắn nhãn, phát hiện khuôn mặt và làm nhiều việc khác. Việc tích hợp Spring Boot cung cấp một nền tảng vững chắc để xây dựng các ứng dụng Google Cloud Native mạnh mẽ và có thể mở rộng. Tiếp tục khám phá những chức năng vô cùng đa dạng của Vision AI, Cloud Run, Cloud Translation và nhiều tính năng 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, vui lòng xem các tài liệu về Vision API, Cloud Translation và GCP Spring. Hãy thử cùng một thử nghiệm với tùy chọn Quảng cáo gốc vào mùa xuân!! Ngoài ra, đây cũng là cơ hội để bạn tìm hiểu về cách API này xuất hiện trong bài viết Khu vườn mô hình.