1. مقدمه
در عصر امروز برنامههای کاربردی مبتنی بر داده، استفاده از یادگیری ماشینی پیشرفته و خدمات هوش مصنوعی مانند بینایی کامپیوتر اهمیت فزایندهای پیدا کرده است. یکی از این سرویس ها Vision API است که قابلیت های قدرتمند تجزیه و تحلیل تصویر را ارائه می دهد. در این کد لبه، شما یاد خواهید گرفت که چگونه یک برنامه Computer Vision با استفاده از Spring Boot و Java ایجاد کنید، که به شما امکان می دهد پتانسیل تشخیص و تجزیه و تحلیل تصویر را در پروژه های خود باز کنید. رابط کاربری برنامه، URL های عمومی تصاویر را که حاوی متن نوشته شده یا چاپ شده هستند، به عنوان ورودی می پذیرد، متن را استخراج می کند، زبان را تشخیص می دهد و اگر یکی از زبان های پشتیبانی شده باشد، ترجمه انگلیسی آن متن را ایجاد می کند.
چیزی که خواهی ساخت
شما یک را ایجاد خواهید کرد
- یک برنامه Java Spring Boot برای استفاده از Vision API و Google Cloud Translation API
- در 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 Console، روی Activate 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 Web، Spring Cloud GCP و Vision AI را در پیکربندی پروژه خود بگنجانید. از طرف دیگر، می توانید از Spring Initializr از Cloud Shell با استفاده از مراحل زیر برای بوت استرپ کردن برنامه 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 تغییر دهید.
این یک ساختار پروژه تحت "چشم انداز بهار" به شرح زیر ایجاد می کند:
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
روش extractTextFromImage
در سرویس org.springframework.cloud.gcp.vision.CloudVisionTemplate
به شما امکان می دهد متن را از ورودی تصویر خود استخراج کنید. روش getTranslatedText
از سرویس com.google.cloud.translate.v3
به شما امکان می دهد متن استخراج شده را از تصویر خود منتقل کنید و متن ترجمه شده را به زبان مقصد مورد نظر به عنوان پاسخ دریافت کنید (اگر منبع در یکی از لیست زبان های پشتیبانی شده باشد).
ساخت REST API
نقاط پایانی REST را طراحی و پیاده سازی کنید که عملکردهای Vision API را نشان می دهد. کنترلکنندههایی ایجاد کنید که درخواستهای دریافتی را مدیریت میکنند و از سرویس Vision API برای پردازش تصاویر و برگرداندن نتایج تجزیه و تحلیل استفاده میکنند. در این دمو، کلاس VisionController
ما نقطه پایانی را پیاده سازی می کند، درخواست ورودی را مدیریت می کند، Vision API و خدمات ترجمه ابری را فراخوانی می کند و نتیجه را به لایه view برمی گرداند. پیاده سازی متد GET برای نقطه پایانی REST به شرح زیر است:
@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
در پیاده سازی فوق دارای روشی است که سرویس ترجمه ابری را فراخوانی می کند:
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
، متد GET را برای REST پیاده سازی کرده ایم.
ادغام Thymeleaf برای توسعه frontend
هنگام ساخت یک برنامه با Spring Boot، یکی از انتخاب های محبوب برای توسعه frontend استفاده از قدرت Thymeleaf است. Thymeleaf یک موتور قالب جاوا در سمت سرور است که به شما امکان می دهد محتوای پویا را به صورت یکپارچه در صفحات HTML خود ادغام کنید. Thymeleaf با اجازه دادن به شما برای ایجاد قالب های HTML با عبارات سمت سرور تعبیه شده، یک تجربه توسعه روان را فراهم می کند. این عبارات را می توان برای رندر دینامیکی داده ها از Backend Spring Boot استفاده کرد و نمایش نتایج تجزیه و تحلیل تصویر انجام شده توسط سرویس Vision API را آسان تر می کند.
برای شروع، اطمینان حاصل کنید که وابستگی های لازم برای Thymeleaf را در پروژه Spring Boot خود دارید. می توانید وابستگی Thymeleaf Starter را در pom.xml خود قرار دهید:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
در روش کنترلر خود، نتیجه تحلیل را از سرویس Vision API بازیابی کرده و به مدل اضافه کنید. مدل نشان دهنده داده هایی است که توسط Thymeleaf برای ارائه الگوی HTML استفاده می شود. پس از پر شدن مدل، نام قالب Thymeleaf را که می خواهید رندر کنید، برگردانید. Thymeleaf از پردازش الگو، جایگزینی عبارات سمت سرور با داده های واقعی و تولید HTML نهایی که به مرورگر مشتری ارسال می شود، مراقبت خواهد کرد.
در مورد متد extractText
در VisionController
، ما نتیجه را به عنوان یک String
به مدل برگردانده ایم و به مدل اضافه نکرده ایم. اما ما روش GET را در index.html
در صفحه ارسال extractText
کرده ایم. با Thymeleaf، میتوانید یک تجربه کاربری یکپارچه ایجاد کنید، جایی که کاربران میتوانند تصاویر را آپلود کنند، تحلیلهای Vision API را فعال کنند و نتایج را در زمان واقعی مشاهده کنند. با استفاده از قدرت Thymeleaf برای توسعه frontend، پتانسیل کامل برنامه 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، مستقر کنید. در این مرحله، ما بر روی استقرار برنامه Spring Boot کانتینری خود با استفاده از Cloud Run تمرکز خواهیم کرد.
- برنامه خود را با اجرای مراحل زیر از Cloud Shell بسته بندی کنید (مطمئن شوید که ترمینال در پوشه ریشه پروژه درخواست می کند)
ساخت:
./mvnw package
پس از موفقیت آمیز بودن ساخت، برای آزمایش به صورت محلی اجرا کنید:
./mvnw spring-boot:run
- برنامه Spring Boot خود را با Jib محفظه کنید:
به جای ایجاد دستی یک Dockerfile
و ساخت تصویر ظرف، می توانید از ابزار Jib برای ساده سازی فرآیند کانتینری استفاده کنید. Jib افزونه ای است که مستقیماً با ابزار ساخت شما (مانند Maven یا Gradle) ادغام می شود و به شما امکان می دهد بدون نوشتن Dockerfile
تصاویر کانتینر بهینه سازی شده را بسازید. قبل از ادامه، باید API رجیستری Artifact را فعال کنید (استفاده از رجیستری مصنوع در رجیستری کانتینر توصیه می شود). سپس Jib را اجرا کنید تا یک تصویر Docker بسازید و در رجیستری منتشر کنید:
$ ./mvnw com.google.cloud.tools:jib-maven-plugin:3.1.1:build -Dimage=gcr.io/$GOOGLE_CLOUD_PROJECT/vision-jib
نکته: در این آزمایش، افزونه Jib Maven را در pom.xml پیکربندی نکردیم، اما برای استفاده پیشرفته، امکان افزودن آن در 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
همچنین می توانید این کار را از UI نیز انجام دهید. به Google Cloud Console بروید و سرویس Cloud Run را پیدا کنید. روی "ایجاد سرویس" کلیک کنید و دستورالعمل های روی صفحه را دنبال کنید. تصویر محفظهای را که قبلاً به رجیستری فشار دادهاید مشخص کنید، تنظیمات استقرار مورد نظر (مانند تخصیص CPU و مقیاس خودکار) را پیکربندی کنید و منطقه مناسب را برای استقرار انتخاب کنید. شما می توانید متغیرهای محیطی خاص برنامه خود را تنظیم کنید. این متغیرها میتوانند شامل اعتبارنامههای احراز هویت (کلیدهای API و غیره)، رشتههای اتصال پایگاه داده یا هر پیکربندی دیگری که برای عملکرد صحیح برنامه Vision AI شما نیاز است، باشد. هنگامی که استقرار با موفقیت کامل شد، باید یک نقطه پایانی برای برنامه خود دریافت کنید.
بازی با برنامه Vision AI
برای اهداف نمایشی، میتوانید از URL تصویر زیر برای خواندن و ترجمه برنامه خود استفاده کنید: https://storage.googleapis.com/img_public_test/tamilwriting1.jfif
6. پاکسازی کنید
برای جلوگیری از تحمیل هزینه به حساب Google Cloud خود برای منابع استفاده شده در این پست، این مراحل را دنبال کنید:
- در کنسول Google Cloud، به صفحه مدیریت منابع بروید
- در لیست پروژه، پروژه ای را که می خواهید حذف کنید انتخاب کنید و سپس روی Delete کلیک کنید
- در محاوره، شناسه پروژه را تایپ کنید و سپس روی Shut down کلیک کنید تا پروژه حذف شود
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 امتحان کنید!! همچنین بهعنوان یک نقطه اوج به دنیای Gen-AI، نحوه نمایش این API در Model Garden را بررسی کنید.