Computer Vision Made Easy: Vision AI در Spring Boot و Java

۱. مقدمه

در عصر امروزی که برنامه‌های کاربردی مبتنی بر داده هستند، استفاده از سرویس‌های پیشرفته یادگیری ماشین و هوش مصنوعی مانند بینایی کامپیوتر (Computer Vision) به طور فزاینده‌ای اهمیت پیدا کرده است. یکی از این سرویس‌ها، رابط برنامه‌نویسی کاربردی بینایی ماشین (Vision API) است که قابلیت‌های قدرتمندی برای تجزیه و تحلیل تصویر ارائه می‌دهد. در این آزمایشگاه کد، شما یاد خواهید گرفت که چگونه با استفاده از Spring Boot و جاوا، یک برنامه بینایی کامپیوتر ایجاد کنید و از پتانسیل تشخیص و تجزیه و تحلیل تصویر در پروژه‌های خود بهره‌مند شوید. رابط کاربری برنامه، URL های عمومی تصاویری را که حاوی متن نوشتاری یا چاپی هستند، به عنوان ورودی می‌پذیرد، متن را استخراج می‌کند، زبان را تشخیص می‌دهد و اگر یکی از زبان‌های پشتیبانی شده باشد، ترجمه انگلیسی آن متن را تولید می‌کند.

آنچه خواهید ساخت

شما یک [چیز/چیزی] ایجاد خواهید کرد

  • یک برنامه‌ی Java Spring Boot برای استفاده از Vision API و Google Cloud Translation API
  • مستقر در Cloud Run

۲. الزامات

  • یک مرورگر، مانند کروم یا فایرفاکس
  • یک پروژه گوگل کلود با قابلیت پرداخت صورتحساب

در زیر پیش‌نیازها آمده است:

پروژه خود را ایجاد کنید

  1. یک حساب Google Cloud با پروژه ایجاد شده و صورتحساب فعال شده
  2. APIهای Vision API، Translation، Cloud Run و Artifact Registry فعال شده‌اند.
  3. پوسته ابری فعال شد
  4. API ذخیره‌سازی ابری با ایجاد یک باکت و آپلود تصاویر با متن یا دست‌خط به زبان‌های پشتیبانی‌شده محلی فعال شده است (یا می‌توانید از لینک‌های تصویر نمونه ارائه شده در این وبلاگ استفاده کنید)

برای مراحل فعال‌سازی APIهای Google Cloud به مستندات مراجعه کنید.

فعال کردن پوسته ابری

  1. شما از Cloud Shell ، یک محیط خط فرمان که در Google Cloud اجرا می‌شود و bq از قبل روی آن بارگذاری شده است، استفاده خواهید کرد:

از کنسول ابری، روی فعال کردن پوسته ابری در گوشه بالا سمت راست کلیک کنید

51622c00acec2fa.png

  1. پس از اتصال به Cloud Shell، باید ببینید که از قبل احراز هویت شده‌اید و پروژه از قبل روی شناسه پروژه شما تنظیم شده است. دستور زیر را در Cloud Shell اجرا کنید تا تأیید شود که احراز هویت شده‌اید:
gcloud auth list
  1. دستور زیر را در Cloud Shell اجرا کنید تا تأیید کنید که دستور gcloud از پروژه شما اطلاع دارد.
gcloud config list project
  1. اگر پروژه شما تنظیم نشده است، از دستور زیر برای تنظیم آن استفاده کنید:
gcloud config set project <PROJECT_ID>

برای دستورات و نحوه‌ی استفاده از gcloud به مستندات مراجعه کنید.

۳. بوت‌استرپ کردن یک پروژه Spring Boot

برای شروع، یک پروژه 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 تغییر دهید.

۳۷۸۱۳d۳۹۸۲ce۲e۴۲.png

این یک ساختار پروژه تحت عنوان "spring-vision" به شرح زیر ایجاد می‌کند:

3e70d45d88ac6935.png

pom.xml شامل تمام وابستگی‌های پروژه است (وابستگی‌هایی که با استفاده از این دستور پیکربندی کرده‌اید، از قبل در pom.xml شما اضافه شده‌اند).

src/main/java/com/example/demo فایل‌های کلاس‌های منبع .java را دارد.

منابع شامل تصاویر، XML، فایل‌های متنی و محتوای استاتیک مورد استفاده پروژه هستند که به طور مستقل نگهداری می‌شوند.

application.properties شما را قادر می‌سازد تا ویژگی‌های مدیر را برای تعریف ویژگی‌های خاص پروفایل برنامه حفظ کنید.

۴. پیکربندی رابط برنامه‌نویسی کاربردی بینایی

پس از فعال کردن 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>

فایل‌های زیر را از مخزن کپی/جایگزین کنید و آن‌ها را به پوشه‌ها/مسیر مربوطه در ساختار پروژه اضافه کنید:

  1. فایل Application.java (/src/main/java/com/example/demo)
  2. TranslateText.java (/src/main/java/com/example/demo)
  3. VisionController.java (/src/main/java/com/example/demo)
  4. index.html (/src/main/resources/static)
  5. فایل result.html (/src/main/resources/templates)
  6. 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 و سرویس‌های Cloud Translation را فراخوانی می‌کند و نتیجه را به لایه نمایش برمی‌گرداند. پیاده‌سازی روش 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 در پیاده‌سازی فوق، متدی دارد که سرویس ترجمه ابری (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 ، متد GET برای REST پیاده‌سازی شده است.

ادغام Thymeleaf برای توسعه فرانت‌اند

هنگام ساخت یک برنامه با Spring Boot، یکی از گزینه‌های محبوب برای توسعه frontend، استفاده از قدرت Thymeleaf است. Thymeleaf یک موتور قالب جاوا سمت سرور است که به شما امکان می‌دهد محتوای پویا را به طور یکپارچه در صفحات HTML خود ادغام کنید. Thymeleaf با فراهم کردن امکان ایجاد قالب‌های HTML با عبارات تعبیه شده در سمت سرور، یک تجربه توسعه روان را فراهم می‌کند. این عبارات می‌توانند برای رندر پویا داده‌ها از Spring Boot backend شما استفاده شوند و نمایش نتایج تجزیه و تحلیل تصویر انجام شده توسط سرویس 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 به مدل برگردانده‌ایم و آن را به مدل اضافه نکرده‌ایم. اما متد extractText متد GET را در فایل index.html در صفحه ارسال فراخوانی کرده‌ایم. با 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>

۵. استقرار برنامه بینایی کامپیوتر شما در Cloud Run

برای اطمینان از عملکرد صحیح سرویس و کلاس‌های کنترلر خود، در پوشه /src/test/java/com/example تست‌های واحد بنویسید. پس از اطمینان از پایداری آن، آن را در یک مصنوع قابل استقرار، مانند یک فایل JAR، بسته‌بندی کنید و آن را در Cloud Run، یک پلتفرم محاسباتی بدون سرور در Google Cloud، مستقر کنید. در این مرحله، ما بر روی استقرار برنامه Spring Boot کانتینر شده شما با استفاده از Cloud Run تمرکز خواهیم کرد.

  1. با اجرای مراحل زیر از Cloud Shell، برنامه خود را بسته‌بندی کنید (مطمئن شوید که ترمینال در پوشه ریشه پروژه درخواست می‌دهد)

ساخت:

./mvnw package

پس از موفقیت‌آمیز بودن ساخت، برای آزمایش، آن را به صورت محلی اجرا کنید:

./mvnw spring-boot:run
  1. برنامه Spring Boot خود را با Jib کانتینریزه کنید:

به جای ایجاد دستی یک Dockerfile و ساخت تصویر کانتینر، می‌توانید از ابزار Jib برای ساده‌سازی فرآیند کانتینرسازی استفاده کنید. Jib افزونه‌ای است که مستقیماً با ابزار ساخت شما (مانند Maven یا Gradle) ادغام می‌شود و به شما امکان می‌دهد تصاویر کانتینر بهینه‌شده را بدون نوشتن Dockerfile بسازید. قبل از ادامه، باید API مربوط به Artifact Registry را فعال کنید (استفاده از Artifact Registry به جای رجیستری کانتینر توصیه می‌شود). سپس 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 اضافه کرد.

  1. کانتینر (که در مرحله قبل به 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 شما لازم است. هنگامی که استقرار با موفقیت انجام شد، باید یک نقطه پایانی برای برنامه خود دریافت کنید.

بازی با برنامه هوش مصنوعی بینایی شما

برای اهداف نمایشی، می‌توانید از آدرس تصویر زیر برای خواندن و ترجمه برنامه خود استفاده کنید: https://storage.googleapis.com/img_public_test/tamilwriting1.jfif

654c1b0de0db482.gif

۶. تمیز کردن

برای جلوگیری از تحمیل هزینه به حساب Google Cloud خود برای منابع استفاده شده در این پست، این مراحل را دنبال کنید:

  1. در کنسول گوگل کلود، به صفحه مدیریت منابع بروید
  2. در لیست پروژه‌ها، پروژه‌ای را که می‌خواهید حذف کنید انتخاب کنید و سپس روی «حذف» کلیک کنید.
  3. در کادر محاوره‌ای، شناسه پروژه را تایپ کنید و سپس برای حذف پروژه، روی خاموش کردن کلیک کنید.

۷. تبریک

تبریک! شما با موفقیت یک برنامه هوش مصنوعی بینایی با استفاده از Spring Boot و جاوا ایجاد کرده‌اید. با قدرت هوش مصنوعی بینایی، برنامه شما اکنون می‌تواند تجزیه و تحلیل تصویر پیچیده، از جمله برچسب‌گذاری، تشخیص چهره و موارد دیگر را انجام دهد. ادغام Spring Boot پایه محکمی برای ساخت برنامه‌های Google Cloud Native مقیاس‌پذیر و قوی فراهم می‌کند. به بررسی قابلیت‌های گسترده هوش مصنوعی بینایی، Cloud Run، Cloud Translation و موارد دیگر ادامه دهید تا برنامه خود را با ویژگی‌ها و قابلیت‌های اضافی ارتقا دهید. برای کسب اطلاعات بیشتر، به اسناد Vision API ، Cloud Translation و GCP Spring مراجعه کنید. همین آزمایش را با گزینه Spring Native امتحان کنید!! همچنین به عنوان یک پیش‌نمایش از دنیای Gen-AI، نحوه نمایش این API را در Model Garden بررسی کنید.