প্রতিদিনের ছবি: গুগল নেটিভ জাভা ক্লায়েন্ট লাইব্রেরির মাধ্যমে ছবি সঞ্চয় ও বিশ্লেষণ করুন

1. ওভারভিউ

প্রথম কোড ল্যাবে, আপনি একটি বালতিতে ছবি সংরক্ষণ করবেন। এটি একটি ফাইল তৈরির ইভেন্ট তৈরি করবে যা ক্লাউড রানে নিয়োজিত একটি পরিষেবা দ্বারা পরিচালিত হবে৷ পরিষেবাটি চিত্র বিশ্লেষণ করতে এবং ডেটাস্টোরে ফলাফল সংরক্ষণ করতে Vision API-তে একটি কল করবে।

427de3100de3a61e.png

আপনি কি শিখবেন

  • ক্লাউড স্টোরেজ
  • ক্লাউড রান
  • ক্লাউড ভিশন API
  • ক্লাউড ফায়ারস্টোর

2. সেটআপ এবং প্রয়োজনীয়তা

স্ব-গতিসম্পন্ন পরিবেশ সেটআপ

  1. Google ক্লাউড কনসোলে সাইন-ইন করুন এবং একটি নতুন প্রকল্প তৈরি করুন বা বিদ্যমান একটি পুনরায় ব্যবহার করুন৷ আপনার যদি ইতিমধ্যেই একটি Gmail বা Google Workspace অ্যাকাউন্ট না থাকে, তাহলে আপনাকে অবশ্যই একটি তৈরি করতে হবে।

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • প্রকল্পের নাম এই প্রকল্পের অংশগ্রহণকারীদের জন্য প্রদর্শনের নাম। এটি একটি অক্ষর স্ট্রিং যা Google API দ্বারা ব্যবহৃত হয় না। আপনি যে কোনো সময় এটি আপডেট করতে পারেন.
  • সমস্ত Google ক্লাউড প্রজেক্ট জুড়ে প্রোজেক্ট আইডি অবশ্যই অনন্য হতে হবে এবং অপরিবর্তনীয় (সেট করার পরে পরিবর্তন করা যাবে না)। ক্লাউড কনসোল স্বয়ংক্রিয়ভাবে একটি অনন্য স্ট্রিং তৈরি করে; সাধারণত আপনি এটা কি যত্ন না. বেশিরভাগ কোডল্যাবে, আপনাকে প্রজেক্ট আইডি উল্লেখ করতে হবে (এটি সাধারণত PROJECT_ID হিসাবে চিহ্নিত করা হয়)। আপনি যদি জেনারেট করা আইডি পছন্দ না করেন, তাহলে আপনি অন্য এলোমেলো আইডি তৈরি করতে পারেন। বিকল্পভাবে, আপনি নিজের চেষ্টা করে দেখতে পারেন এবং এটি উপলব্ধ কিনা। এই ধাপের পরে এটি পরিবর্তন করা যাবে না এবং প্রকল্পের সময়কালের জন্য থাকবে।
  • আপনার তথ্যের জন্য, একটি তৃতীয় মান রয়েছে, একটি প্রকল্প নম্বর যা কিছু API ব্যবহার করে। ডকুমেন্টেশনে এই তিনটি মান সম্পর্কে আরও জানুন।
  1. এরপরে, ক্লাউড রিসোর্স/এপিআই ব্যবহার করতে আপনাকে ক্লাউড কনসোলে বিলিং সক্ষম করতে হবে। এই কোডল্যাবের মাধ্যমে চালানোর জন্য খুব বেশি খরচ করা উচিত নয়, যদি কিছু থাকে। রিসোর্স বন্ধ করতে যাতে এই টিউটোরিয়ালের বাইরে আপনার বিলিং খরচ না হয়, আপনি আপনার তৈরি করা রিসোর্স মুছে ফেলতে পারেন বা পুরো প্রোজেক্ট মুছে ফেলতে পারেন। Google ক্লাউডের নতুন ব্যবহারকারীরা $300 USD বিনামূল্যের ট্রায়াল প্রোগ্রামের জন্য যোগ্য৷

ক্লাউড শেল শুরু করুন

যদিও Google ক্লাউড আপনার ল্যাপটপ থেকে দূরবর্তীভাবে পরিচালিত হতে পারে, এই কোডল্যাবে আপনি Google ক্লাউড শেল ব্যবহার করবেন, একটি কমান্ড লাইন পরিবেশ যা ক্লাউডে চলছে।

Google ক্লাউড কনসোল থেকে, উপরের ডানদিকে টুলবারে ক্লাউড শেল আইকনে ক্লিক করুন:

55efc1aaa7a4d3ad.png

পরিবেশের ব্যবস্থা করতে এবং সংযোগ করতে এটি শুধুমাত্র কয়েক মুহূর্ত নিতে হবে। এটি সমাপ্ত হলে, আপনি এই মত কিছু দেখতে হবে:

7ffe5cbb04455448.png

এই ভার্চুয়াল মেশিনটি আপনার প্রয়োজনীয় সমস্ত ডেভেলপমেন্ট টুল দিয়ে লোড করা হয়েছে। এটি একটি ক্রমাগত 5GB হোম ডিরেক্টরি অফার করে এবং Google ক্লাউডে চলে, যা নেটওয়ার্ক কর্মক্ষমতা এবং প্রমাণীকরণকে ব্যাপকভাবে উন্নত করে। এই কোডল্যাবে আপনার সমস্ত কাজ একটি ব্রাউজারে করা যেতে পারে। আপনার কিছু ইন্সটল করার দরকার নেই।

3. API সক্রিয় করুন৷

এই ল্যাবের জন্য, আপনি ক্লাউড ফাংশন এবং ভিশন API ব্যবহার করবেন তবে প্রথমে সেগুলিকে ক্লাউড কনসোলে বা gcloud এর সাথে সক্ষম করতে হবে।

ক্লাউড কনসোলে ভিশন API সক্ষম করতে, অনুসন্ধান বারে Cloud Vision API অনুসন্ধান করুন:

cf48b1747ba6a6fb.png

আপনি ক্লাউড ভিশন API পৃষ্ঠায় অবতরণ করবেন:

ba4af419e6086fbb.png

ENABLE বাটনে ক্লিক করুন।

বিকল্পভাবে, আপনি জিক্লাউড কমান্ড লাইন টুল ব্যবহার করে এটি ক্লাউড শেল সক্রিয় করতে পারেন।

ক্লাউড শেলের ভিতরে, নিম্নলিখিত কমান্ডটি চালান:

gcloud services enable vision.googleapis.com

আপনি সফলভাবে শেষ করতে অপারেশন দেখতে হবে:

Operation "operations/acf.12dba18b-106f-4fd2-942d-fea80ecc5c1c" finished successfully.

ক্লাউড রান এবং ক্লাউড বিল্ডও সক্ষম করুন:

gcloud services enable cloudbuild.googleapis.com \
  run.googleapis.com

4. বালতি তৈরি করুন (কনসোল)

ছবির জন্য একটি স্টোরেজ বালতি তৈরি করুন। আপনি Google ক্লাউড প্ল্যাটফর্ম কনসোল ( console.cloud.google.com ) থেকে বা ক্লাউড শেল বা আপনার স্থানীয় উন্নয়ন পরিবেশ থেকে gsutil কমান্ড লাইন টুল দিয়ে এটি করতে পারেন।

"হ্যামবার্গার" (☰) মেনু থেকে, Storage পৃষ্ঠায় নেভিগেট করুন।

1930e055d138150a.png

আপনার বালতি নাম

CREATE BUCKET বাটনে ক্লিক করুন।

34147939358517f8.png

CONTINUE ক্লিক করুন।

অবস্থান নির্বাচন করুন

197817f20be07678.png

আপনার পছন্দের অঞ্চলে একটি বহু-আঞ্চলিক বালতি তৈরি করুন (এখানে Europe )।

CONTINUE ক্লিক করুন।

ডিফল্ট স্টোরেজ ক্লাস বেছে নিন

53cd91441c8caf0e.png

আপনার ডেটার জন্য Standard স্টোরেজ ক্লাস বেছে নিন।

CONTINUE ক্লিক করুন।

অ্যাক্সেস কন্ট্রোল সেট করুন

8c2b3b459d934a51.png

যেহেতু আপনি সর্বজনীনভাবে অ্যাক্সেসযোগ্য চিত্রগুলির সাথে কাজ করবেন, আপনি চান এই বালতিতে সংরক্ষিত আমাদের সমস্ত ছবি একই অভিন্ন অ্যাক্সেস নিয়ন্ত্রণ থাকুক৷

Uniform অ্যাক্সেস কন্ট্রোল বিকল্পটি নির্বাচন করুন।

CONTINUE ক্লিক করুন।

সুরক্ষা/এনক্রিপশন সেট করুন

d931c24c3e705a68.png

ডিফল্ট রাখুন ( Google-managed key) , কারণ আপনি নিজের এনক্রিপশন কী ব্যবহার করবেন না।

শেষ পর্যন্ত আমাদের বালতি তৈরির চূড়ান্ত রূপ দিতে CREATE ক্লিক করুন।

স্টোরেজ ভিউয়ার হিসাবে সমস্ত ব্যবহারকারীদের যোগ করুন

Permissions ট্যাবে যান:

d0ecfdcff730ea51.png

Storage > Storage Object Viewer এর ভূমিকা সহ বালতিতে একজন allUsers সদস্য যোগ করুন, নিম্নরূপ:

e9f25ec1ea0b6cc6.png

SAVE ক্লিক করুন।

5. বালতি তৈরি করুন (gsutil)

আপনি বালতি তৈরি করতে ক্লাউড শেল-এ gsutil কমান্ড লাইন টুল ব্যবহার করতে পারেন।

ক্লাউড শেলে, অনন্য বালতি নামের জন্য একটি পরিবর্তনশীল সেট করুন। ক্লাউড শেল ইতিমধ্যেই আপনার অনন্য প্রকল্প আইডিতে GOOGLE_CLOUD_PROJECT সেট করেছে৷ আপনি বালতি নামের সাথে যে যোগ করতে পারেন.

যেমন:

export BUCKET_PICTURES=uploaded-pictures-${GOOGLE_CLOUD_PROJECT}

ইউরোপে একটি মানক মাল্টি-রিজিওন জোন তৈরি করুন:

gsutil mb -l EU gs://${BUCKET_PICTURES}

ইউনিফর্ম বালতি স্তর অ্যাক্সেস নিশ্চিত করুন:

gsutil uniformbucketlevelaccess set on gs://${BUCKET_PICTURES}

বালতিটি সর্বজনীন করুন:

gsutil iam ch allUsers:objectViewer gs://${BUCKET_PICTURES}

আপনি যদি কনসোলের Cloud Storage বিভাগে যান, আপনার কাছে একটি সর্বজনীন uploaded-pictures থাকা উচিত:

a98ed4ba17873e40.png

পরীক্ষা করুন যে আপনি বালতিতে ছবি আপলোড করতে পারেন এবং আপলোড করা ছবিগুলি সর্বজনীনভাবে উপলব্ধ, যেমনটি পূর্ববর্তী ধাপে ব্যাখ্যা করা হয়েছে।

6. বালতিতে পাবলিক অ্যাক্সেস পরীক্ষা করুন

স্টোরেজ ব্রাউজারে ফিরে গেলে, আপনি "পাবলিক" অ্যাক্সেস সহ তালিকায় আপনার বালতি দেখতে পাবেন (একটি সতর্কতা চিহ্ন সহ আপনাকে মনে করিয়ে দেয় যে সেই বালতির সামগ্রীতে যে কারও অ্যাক্সেস রয়েছে)।

89e7a4d2c80a0319.png

আপনার বালতি এখন ছবি গ্রহণ করার জন্য প্রস্তুত.

আপনি যদি বালতির নামের উপর ক্লিক করেন, আপনি বালতির বিবরণ দেখতে পাবেন।

131387f12d3eb2d3.png

সেখানে, আপনি বালতিতে একটি ছবি যোগ করতে পারেন তা পরীক্ষা করতে আপনি Upload files বোতামটি চেষ্টা করতে পারেন। একটি ফাইল চয়নকারী পপআপ আপনাকে একটি ফাইল নির্বাচন করতে বলবে। একবার নির্বাচিত হলে, এটি আপনার বালতিতে আপলোড করা হবে, এবং আপনি আবার দেখতে পাবেন public অ্যাক্সেস যা এই নতুন ফাইলটিতে স্বয়ংক্রিয়ভাবে দায়ী করা হয়েছে।

e87584471a6e9c6d.png

Public অ্যাক্সেস লেবেল বরাবর, আপনি একটি ছোট লিঙ্ক আইকনও দেখতে পাবেন। এটিতে ক্লিক করার সময়, আপনার ব্রাউজার সেই চিত্রটির সর্বজনীন URL-এ নেভিগেট করবে, যা ফর্মের হবে:

https://storage.googleapis.com/BUCKET_NAME/PICTURE_FILE.png

BUCKET_NAME হল বিশ্বব্যাপী অনন্য নাম যা আপনি আপনার বাকেটের জন্য বেছে নিয়েছেন এবং তারপরে আপনার ছবির ফাইলের নাম৷

ছবির নামের পাশে চেক বক্সে ক্লিক করলে, DELETE বোতামটি সক্রিয় হবে এবং আপনি এই প্রথম ছবিটি মুছে ফেলতে পারবেন।

7. ডাটাবেস প্রস্তুত করুন

আপনি ক্লাউড ফায়ারস্টোর ডাটাবেস, একটি দ্রুত, সম্পূর্ণরূপে পরিচালিত, সার্ভারহীন, ক্লাউড-নেটিভ NoSQL ডকুমেন্ট ডাটাবেসে ভিশন API দ্বারা প্রদত্ত ছবি সম্পর্কে তথ্য সংরক্ষণ করবেন। ক্লাউড কনসোলের Firestore বিভাগে গিয়ে আপনার ডাটাবেস প্রস্তুত করুন:

9e4708d2257de058.png

দুটি বিকল্প দেওয়া হয়: Native mode বা Datastore mode । নেটিভ মোড ব্যবহার করুন, যা অফলাইন সমর্থন এবং রিয়েল-টাইম সিঙ্ক্রোনাইজেশনের মতো অতিরিক্ত বৈশিষ্ট্যগুলি অফার করে৷

SELECT NATIVE MODE ক্লিক করুন।

9449ace8cc84de43.png

একটি বহু-অঞ্চল বেছে নিন (এখানে ইউরোপে, তবে আদর্শভাবে অন্তত একই অঞ্চলে আপনার ফাংশন এবং স্টোরেজ বালতি)।

CREATE DATABASE বোতামে ক্লিক করুন।

একবার ডাটাবেস তৈরি হয়ে গেলে, আপনাকে নিম্নলিখিতগুলি দেখতে হবে:

56265949a124819e.png

+ START COLLECTION বোতামে ক্লিক করে একটি নতুন সংগ্রহ তৈরি করুন৷

নাম সংগ্রহের pictures

75806ee24c4e13a7.png

আপনি একটি নথি তৈরি করতে হবে না. নতুন ছবিগুলি ক্লাউড স্টোরেজে সংরক্ষণ করা এবং Vision API দ্বারা বিশ্লেষণ করা হলে আপনি সেগুলিকে প্রোগ্রাম্যাটিকভাবে যুক্ত করবেন৷

Save ক্লিক করুন।

Firestore নতুন তৈরি সংগ্রহে একটি প্রথম ডিফল্ট নথি তৈরি করে, আপনি নিরাপদে সেই দস্তাবেজটি মুছে ফেলতে পারেন কারণ এতে কোনও দরকারী তথ্য নেই:

5c2f1e17ea47f48f.png

আমাদের সংগ্রহে প্রোগ্রাম্যাটিকভাবে তৈরি করা নথিগুলিতে 4টি ক্ষেত্র থাকবে:

  • নাম (স্ট্রিং): আপলোড করা ছবির ফাইলের নাম, যা তিনি নথির কীও
  • লেবেল (স্ট্রিংগুলির অ্যারে): ভিশন API দ্বারা স্বীকৃত আইটেমগুলির লেবেল৷
  • রঙ (স্ট্রিং): প্রভাবশালী রঙের হেক্সাডেসিমেল রঙের কোড (যেমন #ab12ef)
  • তৈরি করা হয়েছে (তারিখ): এই ছবির মেটাডেটা কখন সংরক্ষণ করা হয়েছিল তার টাইমস্ট্যাম্প
  • থাম্বনেইল (বুলিয়ান): একটি ঐচ্ছিক ক্ষেত্র যা উপস্থিত থাকবে এবং এই ছবির জন্য একটি থাম্বনেইল চিত্র তৈরি করা হলে তা সত্য হবে

থাম্বনেইল উপলব্ধ ছবিগুলি খুঁজে পেতে এবং তৈরির তারিখ বরাবর সাজানোর জন্য আমরা Firestore-এ অনুসন্ধান করব, আমাদের একটি অনুসন্ধান সূচক তৈরি করতে হবে।

আপনি ক্লাউড শেলে নিম্নলিখিত কমান্ড দিয়ে সূচক তৈরি করতে পারেন:

gcloud firestore indexes composite create \
  --collection-group=pictures \
  --field-config field-path=thumbnail,order=descending \
  --field-config field-path=created,order=descending

অথবা আপনি ক্লাউড কনসোল থেকেও এটি করতে পারেন, বাম দিকের নেভিগেশন কলামে Indexes এ ক্লিক করে, এবং তারপরে নীচে দেখানো হিসাবে একটি যৌগিক সূচক তৈরি করুন:

ecb8b95e3c791272.png

Create ক্লিক করুন। সূচক তৈরিতে কয়েক মিনিট সময় লাগতে পারে।

8. কোড ক্লোন করুন

কোডটি ক্লোন করুন, যদি আপনি ইতিমধ্যে পূর্ববর্তী কোড ল্যাবে না থাকেন:

git clone https://github.com/GoogleCloudPlatform/serverless-photosharing-workshop

তারপর আপনি ল্যাব নির্মাণ শুরু করতে পরিষেবা ধারণকারী ডিরেক্টরিতে যেতে পারেন:

cd serverless-photosharing-workshop/services/image-analysis/java

পরিষেবাটির জন্য আপনার কাছে নিম্নলিখিত ফাইল বিন্যাস থাকবে:

f79613aff479d8ad.png

9. পরিষেবা কোড অন্বেষণ করুন

আপনি একটি BOM ব্যবহার করে pom.xml এ জাভা ক্লায়েন্ট লাইব্রেরিগুলি কীভাবে সক্রিয় করা হয়েছে তা দেখে শুরু করুন:

প্রথমে, pom.xml ফাইলটি সম্পাদনা করুন যা আমাদের জাভা ফাংশনের নির্ভরতা তালিকাভুক্ত করে। ক্লাউড ভিশন API Maven নির্ভরতা যোগ করতে কোড আপডেট করুন:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>cloudfunctions</groupId>
  <artifactId>gcs-function</artifactId>
  <version>1.0-SNAPSHOT</version>

  <properties>
    <maven.compiler.target>11</maven.compiler.target>
    <maven.compiler.source>11</maven.compiler.source>
  </properties>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>com.google.cloud</groupId>
        <artifactId>libraries-bom</artifactId>
        <version>26.1.1</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
    <dependency>
      <groupId>com.google.cloud.functions</groupId>
      <artifactId>functions-framework-api</artifactId>
      <version>1.0.4</version>
      <type>jar</type>
    </dependency>
    <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>google-cloud-firestore</artifactId>
    </dependency>
    <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>google-cloud-vision</artifactId>
    </dependency>
    <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>google-cloud-storage</artifactId>
    </dependency>
  </dependencies>

কার্যকারিতা EventController ক্লাসে প্রয়োগ করা হয়। প্রতিবার বালতিতে একটি নতুন ছবি আপলোড করা হলে, পরিষেবাটি প্রক্রিয়া করার জন্য একটি বিজ্ঞপ্তি পাবে:

@RestController
public class EventController {
  private static final Logger logger = Logger.getLogger(EventController.class.getName());
    
  private static final List<String> requiredFields = Arrays.asList("ce-id", "ce-source", "ce-type", "ce-specversion");

  @RequestMapping(value = "/", method = RequestMethod.POST)
  public ResponseEntity<String> receiveMessage(
    @RequestBody Map<String, Object> body, @RequestHeader Map<String, String> headers) throws IOException, InterruptedException, ExecutionException {
...
}

কোডটি Cloud Events শিরোনাম যাচাই করতে এগিয়ে যাবে:

System.out.println("Header elements");
for (String field : requiredFields) {
    if (headers.get(field) == null) {
    String msg = String.format("Missing expected header: %s.", field);
    System.out.println(msg);
    return new ResponseEntity<String>(msg, HttpStatus.BAD_REQUEST);
    } else {
    System.out.println(field + " : " + headers.get(field));
    }
}

System.out.println("Body elements");
for (String bodyField : body.keySet()) {
    System.out.println(bodyField + " : " + body.get(bodyField));
}

if (headers.get("ce-subject") == null) {
    String msg = "Missing expected header: ce-subject.";
    System.out.println(msg);
    return new ResponseEntity<String>(msg, HttpStatus.BAD_REQUEST);
} 

একটি অনুরোধ এখন তৈরি করা যেতে পারে এবং কোডটি Vision API এ পাঠানোর জন্য অনুরূপ একটি অনুরোধ প্রস্তুত করবে:

try (ImageAnnotatorClient vision = ImageAnnotatorClient.create()) {
    List<AnnotateImageRequest> requests = new ArrayList<>();
    
    ImageSource imageSource = ImageSource.newBuilder()
        .setGcsImageUri("gs://" + bucketName + "/" + fileName)
        .build();

    Image image = Image.newBuilder()
        .setSource(imageSource)
        .build();

    Feature featureLabel = Feature.newBuilder()
        .setType(Type.LABEL_DETECTION)
        .build();
    Feature featureImageProps = Feature.newBuilder()
        .setType(Type.IMAGE_PROPERTIES)
        .build();
    Feature featureSafeSearch = Feature.newBuilder()
        .setType(Type.SAFE_SEARCH_DETECTION)
        .build();
        
    AnnotateImageRequest request = AnnotateImageRequest.newBuilder()
        .addFeatures(featureLabel)
        .addFeatures(featureImageProps)
        .addFeatures(featureSafeSearch)
        .setImage(image)
        .build();
    
    requests.add(request);

আমরা ভিশন API এর 3টি মূল ক্ষমতার জন্য জিজ্ঞাসা করছি:

  • লেবেল সনাক্তকরণ : সেই ছবিগুলিতে কী রয়েছে তা বোঝার জন্য
  • ছবির বৈশিষ্ট্য : ছবির আকর্ষণীয় বৈশিষ্ট্য দিতে (আমরা ছবির প্রভাবশালী রঙে আগ্রহী)
  • নিরাপদ অনুসন্ধান : ছবিটি দেখানোর জন্য নিরাপদ কিনা তা জানার জন্য (এতে প্রাপ্তবয়স্ক / চিকিৎসা / জাতিগত / সহিংস বিষয়বস্তু থাকা উচিত নয়)

এই মুহুর্তে, আমরা ভিশন API এ কল করতে পারি:

...
logger.info("Calling the Vision API...");
BatchAnnotateImagesResponse result = vision.batchAnnotateImages(requests);
List<AnnotateImageResponse> responses = result.getResponsesList();
...

রেফারেন্সের জন্য, ভিশন API থেকে প্রতিক্রিয়া কেমন দেখায় তা এখানে:

{
  "faceAnnotations": [],
  "landmarkAnnotations": [],
  "logoAnnotations": [],
  "labelAnnotations": [
    {
      "locations": [],
      "properties": [],
      "mid": "/m/01yrx",
      "locale": "",
      "description": "Cat",
      "score": 0.9959855675697327,
      "confidence": 0,
      "topicality": 0.9959855675697327,
      "boundingPoly": null
    },
    ✄ - - - ✄
  ],
  "textAnnotations": [],
  "localizedObjectAnnotations": [],
  "safeSearchAnnotation": {
    "adult": "VERY_UNLIKELY",
    "spoof": "UNLIKELY",
    "medical": "VERY_UNLIKELY",
    "violence": "VERY_UNLIKELY",
    "racy": "VERY_UNLIKELY",
    "adultConfidence": 0,
    "spoofConfidence": 0,
    "medicalConfidence": 0,
    "violenceConfidence": 0,
    "racyConfidence": 0,
    "nsfwConfidence": 0
  },
  "imagePropertiesAnnotation": {
    "dominantColors": {
      "colors": [
        {
          "color": {
            "red": 203,
            "green": 201,
            "blue": 201,
            "alpha": null
          },
          "score": 0.4175916016101837,
          "pixelFraction": 0.44456374645233154
        },
        ✄ - - - ✄
      ]
    }
  },
  "error": null,
  "cropHintsAnnotation": {
    "cropHints": [
      {
        "boundingPoly": {
          "vertices": [
            { "x": 0, "y": 118 },
            { "x": 1177, "y": 118 },
            { "x": 1177, "y": 783 },
            { "x": 0, "y": 783 }
          ],
          "normalizedVertices": []
        },
        "confidence": 0.41695669293403625,
        "importanceFraction": 1
      }
    ]
  },
  "fullTextAnnotation": null,
  "webDetection": null,
  "productSearchResults": null,
  "context": null
}

যদি কোনো ত্রুটি ফিরে না আসে, তাহলে আমরা এগিয়ে যেতে পারি, তাই কেন আমাদের কাছে এটি যদি ব্লক থাকে:

if (responses.size() == 0) {
    logger.info("No response received from Vision API.");
    return new ResponseEntity<String>(msg, HttpStatus.BAD_REQUEST);
}

AnnotateImageResponse response = responses.get(0);
if (response.hasError()) {
    logger.info("Error: " + response.getError().getMessage());
    return new ResponseEntity<String>(msg, HttpStatus.BAD_REQUEST);
}

আমরা ছবিতে স্বীকৃত জিনিস, বিভাগ বা থিমগুলির লেবেল পেতে যাচ্ছি:

List<String> labels = response.getLabelAnnotationsList().stream()
    .map(annotation -> annotation.getDescription())
    .collect(Collectors.toList());
logger.info("Annotations found:");
for (String label: labels) {
    logger.info("- " + label);
}

আমরা ছবির প্রভাবশালী রঙ জানতে আগ্রহী:

String mainColor = "#FFFFFF";
ImageProperties imgProps = response.getImagePropertiesAnnotation();
if (imgProps.hasDominantColors()) {
    DominantColorsAnnotation colorsAnn = imgProps.getDominantColors();
    ColorInfo colorInfo = colorsAnn.getColors(0);

    mainColor = rgbHex(
        colorInfo.getColor().getRed(), 
        colorInfo.getColor().getGreen(), 
        colorInfo.getColor().getBlue());

    logger.info("Color: " + mainColor);
}

ছবি দেখানোর জন্য নিরাপদ কিনা তা পরীক্ষা করা যাক:

boolean isSafe = false;
if (response.hasSafeSearchAnnotation()) {
    SafeSearchAnnotation safeSearch = response.getSafeSearchAnnotation();

    isSafe = Stream.of(
        safeSearch.getAdult(), safeSearch.getMedical(), safeSearch.getRacy(),
        safeSearch.getSpoof(), safeSearch.getViolence())
    .allMatch( likelihood -> 
        likelihood != Likelihood.LIKELY && likelihood != Likelihood.VERY_LIKELY
    );

    logger.info("Safe? " + isSafe);
}

আমরা প্রাপ্তবয়স্ক / স্পুফ / চিকিৎসা / সহিংসতা / জাতিগত বৈশিষ্ট্যগুলি পরীক্ষা করে দেখছি যে সেগুলি সম্ভবত বা খুব সম্ভব নয়৷

নিরাপদ অনুসন্ধানের ফলাফল ঠিক থাকলে, আমরা Firestore-এ মেটাডেটা সংরক্ষণ করতে পারি:

// Saving result to Firestore
if (isSafe) {
    FirestoreOptions firestoreOptions = FirestoreOptions.getDefaultInstance();
    Firestore pictureStore = firestoreOptions.getService();

    DocumentReference doc = pictureStore.collection("pictures").document(fileName);

    Map<String, Object> data = new HashMap<>();
    data.put("labels", labels);
    data.put("color", mainColor);
    data.put("created", new Date());

    ApiFuture<WriteResult> writeResult = doc.set(data, SetOptions.merge());

    logger.info("Picture metadata saved in Firestore at " + writeResult.get().getUpdateTime());
}

10. GraalVM দিয়ে অ্যাপের ছবি তৈরি করুন (ঐচ্ছিক)

এই ঐচ্ছিক ধাপে, আপনি GraalVM ব্যবহার করে একটি JIT(JVM) based app image , তারপর একটি AOT(Native) Java app image তৈরি করবেন।

বিল্ড চালানোর জন্য, আপনাকে নিশ্চিত করতে হবে যে আপনার কাছে একটি উপযুক্ত JDK এবং নেটিভ-ইমেজ নির্মাতা ইনস্টল এবং কনফিগার করা আছে। বিভিন্ন বিকল্প উপলব্ধ আছে.

To start , GraalVM 22.2.x কমিউনিটি সংস্করণ ডাউনলোড করুন এবং GraalVM ইনস্টলেশন পৃষ্ঠায় নির্দেশাবলী অনুসরণ করুন।

এই প্রক্রিয়াটি SDKMAN এর সাহায্যে অনেক সহজ করা যেতে পারে!

SDKman এর সাথে উপযুক্ত JDK বিতরণ ইনস্টল করতে, install কমান্ডটি ব্যবহার করে শুরু করুন:

sdk install java 22.2.r17-grl

JIT এবং AOT উভয়ের জন্য এই সংস্করণটি ব্যবহার করার জন্য SDKman কে নির্দেশ করুন:

sdk use java 22.2.0.r17-grl

GraalVM এর জন্য native-image utility ইনস্টল করুন:

gu install native-image

Cloudshell -এ, আপনার সুবিধার জন্য, আপনি এই সাধারণ কমান্ডগুলির সাথে GraalVM এবং নেটিভ-ইমেজ ইউটিলিটি ইনস্টল করতে পারেন:

# install GraalVM in your home directory
cd ~

# download GraalVM
wget https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.2.0/graalvm-ce-java17-linux-amd64-22.2.0.tar.gz
ls
tar -xzvf graalvm-ce-java17-linux-amd64-22.2.0.tar.gz

# configure Java 17 and GraalVM 22.2
echo Existing JVM: $JAVA_HOME
cd graalvm-ce-java17-22.2.0
export JAVA_HOME=$PWD
cd bin
export PATH=$PWD:$PATH

echo JAVA HOME: $JAVA_HOME
echo PATH: $PATH

# install the native image utility
java -version
gu install native-image

cd ../..

প্রথমে, GCP প্রকল্পের পরিবেশ ভেরিয়েবল সেট করুন:

export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project)

তারপর আপনি ল্যাব নির্মাণ শুরু করতে পরিষেবা ধারণকারী ডিরেক্টরিতে যেতে পারেন:

cd serverless-photosharing-workshop/services/image-analysis/java

JIT(JVM) অ্যাপ্লিকেশন ইমেজ তৈরি করুন:

./mvnw package -Pjvm

টার্মিনালে বিল্ড লগ পর্যবেক্ষণ করুন:

...
[INFO] --- spring-boot-maven-plugin:2.7.3:repackage (repackage) @ image-analysis ---
[INFO] Replacing main artifact with repackaged archive
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  24.009 s
[INFO] Finished at: 2022-09-26T22:17:32-04:00
[INFO] ------------------------------------------------------------------------

AOT(নেটিভ) ইমেজ তৈরি করুন:।

./mvnw package -Pnative -DskipTests

নেটিভ ইমেজ বিল্ড লগ সহ টার্মিনালে বিল্ড লগ পর্যবেক্ষণ করুন:

মনে রাখবেন যে আপনি যে মেশিনে পরীক্ষা করছেন তার উপর নির্ভর করে বিল্ডটি বেশ কিছুটা বেশি সময় নেয়।

...
[2/7] Performing analysis...  [**********]                                                              (95.4s @ 3.57GB)
  23,346 (94.42%) of 24,725 classes reachable
  44,625 (68.71%) of 64,945 fields reachable
 163,759 (70.79%) of 231,322 methods reachable
     989 classes, 1,402 fields, and 11,032 methods registered for reflection
      63 classes,    69 fields, and    55 methods registered for JNI access
       5 native libraries: -framework CoreServices, -framework Foundation, dl, pthread, z
[3/7] Building universe...                                                                              (10.0s @ 5.35GB)
[4/7] Parsing methods...      [***]                                                                      (9.7s @ 3.13GB)
[5/7] Inlining methods...     [***]                                                                      (4.5s @ 3.29GB)
[6/7] Compiling methods...    [[6/7] Compiling methods...    [********]                                                                (67.6s @ 5.72GB)
[7/7] Creating image...                                                                                  (8.7s @ 4.59GB)
  62.21MB (54.80%) for code area:   100,371 compilation units
  50.98MB (44.91%) for image heap:  465,035 objects and 365 resources
 337.09KB ( 0.29%) for other data
 113.52MB in total
------------------------------------------------------------------------------------------------------------------------
Top 10 packages in code area:                               Top 10 object types in image heap:
   2.36MB com.google.protobuf                                 12.70MB byte[] for code metadata
   1.90MB i.g.xds.shaded.io.envoyproxy.envoy.config.core.v3    6.66MB java.lang.Class
   1.73MB i.g.x.shaded.io.envoyproxy.envoy.config.route.v3     6.47MB byte[] for embedded resources
   1.67MB sun.security.ssl                                     4.61MB byte[] for java.lang.String
   1.54MB com.google.cloud.vision.v1                           4.37MB java.lang.String
   1.46MB com.google.firestore.v1                              3.38MB byte[] for general heap data
   1.37MB io.grpc.xds.shaded.io.envoyproxy.envoy.api.v2.core   1.96MB com.oracle.svm.core.hub.DynamicHubCompanion
   1.32MB i.g.xds.shaded.io.envoyproxy.envoy.api.v2.route      1.80MB byte[] for reflection metadata
   1.09MB java.util                                          911.80KB java.lang.String[]
   1.08MB com.google.re2j                                    826.48KB c.o.svm.core.hub.DynamicHub$ReflectionMetadata
  45.91MB for 772 more packages                                6.45MB for 3913 more object types
------------------------------------------------------------------------------------------------------------------------
                        15.1s (6.8% of total time) in 56 GCs | Peak RSS: 7.72GB | CPU load: 4.37
------------------------------------------------------------------------------------------------------------------------
Produced artifacts:
 /Users/ddobrin/work/dan/serverless-photosharing-workshop/services/image-analysis/java/target/image-analysis (executable)
 /Users/ddobrin/work/dan/serverless-photosharing-workshop/services/image-analysis/java/target/image-analysis.build_artifacts.txt (txt)
========================================================================================================================
Finished generating 'image-analysis' in 3m 41s.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  03:56 min
[INFO] Finished at: 2022-09-26T22:22:29-04:00
[INFO] ------------------------------------------------------------------------

11. কন্টেইনার ইমেজ তৈরি এবং প্রকাশ করুন

আসুন দুটি ভিন্ন সংস্করণে একটি কন্টেইনার ইমেজ তৈরি করি: একটি JIT(JVM) image হিসেবে এবং অন্যটি AOT(Native) Java image হিসেবে।

প্রথমে, GCP প্রকল্পের পরিবেশ ভেরিয়েবল সেট করুন:

export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project)

JIT(JVM) ইমেজ তৈরি করুন:.

./mvnw package -Pjvm-image

টার্মিনালে বিল্ড লগ পর্যবেক্ষণ করুন:

[INFO]     [creator]     Adding layer 'process-types'
[INFO]     [creator]     Adding label 'io.buildpacks.lifecycle.metadata'
[INFO]     [creator]     Adding label 'io.buildpacks.build.metadata'
[INFO]     [creator]     Adding label 'io.buildpacks.project.metadata'
[INFO]     [creator]     Adding label 'org.opencontainers.image.title'
[INFO]     [creator]     Adding label 'org.opencontainers.image.version'
[INFO]     [creator]     Adding label 'org.springframework.boot.version'
[INFO]     [creator]     Setting default process type 'web'
[INFO]     [creator]     Saving docker.io/library/image-analysis-jvm:r17...
[INFO]     [creator]     *** Images (03a44112456e):
[INFO]     [creator]           docker.io/library/image-analysis-jvm:r17
[INFO]     [creator]     Adding cache layer 'paketo-buildpacks/syft:syft'
[INFO]     [creator]     Adding cache layer 'cache.sbom'
[INFO] 
[INFO] Successfully built image 'docker.io/library/image-analysis-jvm:r17'
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  02:11 min
[INFO] Finished at: 2022-09-26T13:09:34-04:00
[INFO] ------------------------------------------------------------------------

AOT(নেটিভ) ইমেজ তৈরি করুন:।

./mvnw package -Pnative-image

UPX ব্যবহার করে নেটিভ ইমেজ বিল্ড লগ এবং ইমেজ কম্প্রেশন সহ টার্মিনালে বিল্ড লগ পর্যবেক্ষণ করুন।

মনে রাখবেন যে আপনি যে মেশিনে পরীক্ষা করছেন তার উপর নির্ভর করে বিল্ডটি বেশ কিছুটা বেশি সময় নেয়

...
[INFO]     [creator]     [2/7] Performing analysis...  [***********]                    (147.6s @ 3.10GB)
[INFO]     [creator]       23,362 (94.34%) of 24,763 classes reachable
[INFO]     [creator]       44,657 (68.67%) of 65,029 fields reachable
[INFO]     [creator]      163,926 (70.76%) of 231,656 methods reachable
[INFO]     [creator]          981 classes, 1,402 fields, and 11,026 methods registered for reflection
[INFO]     [creator]           63 classes,    68 fields, and    55 methods registered for JNI access
[INFO]     [creator]            4 native libraries: dl, pthread, rt, z
[INFO]     [creator]     [3/7] Building universe...                                      (21.1s @ 2.66GB)
[INFO]     [creator]     [4/7] Parsing methods...      [****]                            (13.7s @ 4.16GB)
[INFO]     [creator]     [5/7] Inlining methods...     [***]                              (9.6s @ 4.20GB)
[INFO]     [creator]     [6/7] Compiling methods...    [**********]                     (107.6s @ 3.36GB)
[INFO]     [creator]     [7/7] Creating image...                                         (14.7s @ 4.87GB)
[INFO]     [creator]       62.24MB (51.35%) for code area:   100,499 compilation units
[INFO]     [creator]       51.99MB (42.89%) for image heap:  473,948 objects and 473 resources
[INFO]     [creator]        6.98MB ( 5.76%) for other data
[INFO]     [creator]      121.21MB in total
[INFO]     [creator]     --------------------------------------------------------------------------------
[INFO]     [creator]     Top 10 packages in code area:           Top 10 object types in image heap:
[INFO]     [creator]        2.36MB com.google.protobuf             12.71MB byte[] for code metadata
[INFO]     [creator]        1.90MB i.g.x.s.i.e.e.config.core.v3     7.59MB byte[] for embedded resources
[INFO]     [creator]        1.73MB i.g.x.s.i.e.e.config.route.v3    6.66MB java.lang.Class
[INFO]     [creator]        1.67MB sun.security.ssl                 4.62MB byte[] for java.lang.String
[INFO]     [creator]        1.54MB com.google.cloud.vision.v1       4.39MB java.lang.String
[INFO]     [creator]        1.46MB com.google.firestore.v1          3.66MB byte[] for general heap data
[INFO]     [creator]        1.37MB i.g.x.s.i.e.envoy.api.v2.core    1.96MB c.o.s.c.h.DynamicHubCompanion
[INFO]     [creator]        1.32MB i.g.x.s.i.e.e.api.v2.route       1.80MB byte[] for reflection metadata
[INFO]     [creator]        1.09MB java.util                      910.41KB java.lang.String[]
[INFO]     [creator]        1.08MB com.google.re2j                826.95KB c.o.s.c.h.DynamicHu~onMetadata
[INFO]     [creator]       45.94MB for 776 more packages            6.69MB for 3916 more object types
[INFO]     [creator]     --------------------------------------------------------------------------------
[INFO]     [creator]         20.4s (5.6% of total time) in 81 GCs | Peak RSS: 6.75GB | CPU load: 4.53
[INFO]     [creator]     --------------------------------------------------------------------------------
[INFO]     [creator]     Produced artifacts:
[INFO]     [creator]      /layers/paketo-buildpacks_native-image/native-image/services.ImageAnalysisApplication (executable)
[INFO]     [creator]      /layers/paketo-buildpacks_native-image/native-image/services.ImageAnalysisApplication.build_artifacts.txt (txt)
[INFO]     [creator]     ================================================================================
[INFO]     [creator]     Finished generating '/layers/paketo-buildpacks_native-image/native-image/services.ImageAnalysisApplication' in 5m 59s.
[INFO]     [creator]         Executing upx to compress native image
[INFO]     [creator]                            Ultimate Packer for eXecutables
[INFO]     [creator]                               Copyright (C) 1996 - 2020
[INFO]     [creator]     UPX 3.96        Markus Oberhumer, Laszlo Molnar & John Reiser   Jan 23rd 2020
[INFO]     [creator]     
[INFO]     [creator]             File size         Ratio      Format      Name
[INFO]     [creator]        --------------------   ------   -----------   -----------
 127099880 ->  32416676   25.50%   linux/amd64   services.ImageAnalysisApplication
...
[INFO]     [creator]     ===> EXPORTING
...
[INFO]     [creator]     Adding cache layer 'paketo-buildpacks/native-image:native-image'
[INFO]     [creator]     Adding cache layer 'cache.sbom'
[INFO] 
[INFO] Successfully built image 'docker.io/library/image-analysis-native:r17'
------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  05:28 min
[INFO] Finished at: 2022-09-26T13:19:53-04:00
[INFO] ------------------------------------------------------------------------

যাচাই করুন যে ছবিগুলি তৈরি করা হয়েছে:

docker images | grep image-analysis

দুটি ছবিকে GCR-তে ট্যাগ করুন এবং পুশ করুন:

# JIT(JVM) image
docker tag image-analysis-jvm:r17 gcr.io/${GOOGLE_CLOUD_PROJECT}/image-analysis-jvm:r17
docker push gcr.io/${GOOGLE_CLOUD_PROJECT}/image-analysis-jvm:r17

# AOT(Native) image
docker tag image-analysis-native:r17 gcr.io/${GOOGLE_CLOUD_PROJECT}/image-analysis-native:r17
docker push  gcr.io/${GOOGLE_CLOUD_PROJECT}/image-analysis-native:r17

12. ক্লাউড রানে স্থাপন করুন

পরিষেবা স্থাপনের সময়।

আপনি দুইবার পরিষেবা স্থাপন করবেন, একবার JIT(JVM) ইমেজ ব্যবহার করে এবং দ্বিতীয়বার AOT(নেটিভ) ইমেজ ব্যবহার করে। উভয় পরিষেবার স্থাপনা তুলনার উদ্দেশ্যে, সমান্তরালভাবে বালতি থেকে একই চিত্র প্রক্রিয়া করবে।

প্রথমে, GCP প্রকল্পের পরিবেশ ভেরিয়েবল সেট করুন:

export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project)
gcloud config set project ${GOOGLE_CLOUD_PROJECT}
gcloud config set run/region 
gcloud config set run/platform managed
gcloud config set eventarc/location europe-west1

JIT(JVM) চিত্রটি স্থাপন করুন এবং কনসোলে স্থাপনার লগ পর্যবেক্ষণ করুন:

gcloud run deploy image-analysis-jvm \
     --image gcr.io/${GOOGLE_CLOUD_PROJECT}/image-analysis-jvm:r17 \
     --region europe-west1 \
     --memory 2Gi --allow-unauthenticated

...
Deploying container to Cloud Run service [image-analysis-jvm] in project [...] region [europe-west1]
✓ Deploying... Done.                                                                                                                                                               
  ✓ Creating Revision...                                                                                                                                                           
  ✓ Routing traffic...                                                                                                                                                             
  ✓ Setting IAM Policy...                                                                                                                                                          
Done.                                                                                                                                                                              
Service [image-analysis-jvm] revision [image-analysis-jvm-00009-huc] has been deployed and is serving 100 percent of traffic.
Service URL: https://image-analysis-jvm-...-ew.a.run.app

AOT(নেটিভ) চিত্রটি স্থাপন করুন এবং কনসোলে স্থাপনার লগ পর্যবেক্ষণ করুন:

gcloud run deploy image-analysis-native \
     --image gcr.io/${GOOGLE_CLOUD_PROJECT}/image-analysis-native:r17 \
     --region europe-west1 \
     --memory 2Gi --allow-unauthenticated 
...
Deploying container to Cloud Run service [image-analysis-native] in project [...] region [europe-west1]
✓ Deploying... Done.                                                                                                                                                               
  ✓ Creating Revision...                                                                                                                                                           
  ✓ Routing traffic...                                                                                                                                                             
  ✓ Setting IAM Policy...                                                                                                                                                          
Done.                                                                                                                                                                              
Service [image-analysis-native] revision [image-analysis-native-00005-ben] has been deployed and is serving 100 percent of traffic.
Service URL: https://image-analysis-native-...-ew.a.run.app

13. Eventarc ট্রিগার সেটআপ করুন

ইভেন্টর্ক ডিকপলড মাইক্রোসার্ভিসের মধ্যে রাষ্ট্রীয় পরিবর্তনের প্রবাহ পরিচালনা করার জন্য একটি প্রমিত সমাধান অফার করে, যাকে ইভেন্ট বলা হয়। ট্রিগার করা হলে, Eventarc এই ইভেন্টগুলিকে পাব/সাবস্ক্রিপশনের মাধ্যমে বিভিন্ন গন্তব্যে রুট করে (এই নথিতে, ইভেন্টের গন্তব্যগুলি দেখুন) আপনার জন্য ডেলিভারি, নিরাপত্তা, অনুমোদন, পর্যবেক্ষণযোগ্যতা এবং ত্রুটি-হ্যান্ডলিং পরিচালনা করার সময়।

আপনি একটি Eventarc ট্রিগার তৈরি করতে পারেন যাতে আপনার ক্লাউড রান পরিষেবা একটি নির্দিষ্ট ইভেন্ট বা ইভেন্টের সেটের বিজ্ঞপ্তি পায়৷ ট্রিগারের জন্য ফিল্টার নির্দিষ্ট করে, আপনি ইভেন্টের উৎস এবং টার্গেট ক্লাউড রান পরিষেবা সহ ইভেন্টের রাউটিং কনফিগার করতে পারেন।

প্রথমে, GCP প্রকল্পের পরিবেশ ভেরিয়েবল সেট করুন:

export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project)
gcloud config set project ${GOOGLE_CLOUD_PROJECT}
gcloud config set run/region 
gcloud config set run/platform managed
gcloud config set eventarc/location europe-west1

ক্লাউড স্টোরেজ পরিষেবা অ্যাকাউন্টে pubsub.publisher অনুদান দিন:

SERVICE_ACCOUNT="$(gsutil kms serviceaccount -p ${GOOGLE_CLOUD_PROJECT})"

gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
    --member="serviceAccount:${SERVICE_ACCOUNT}" \
    --role='roles/pubsub.publisher'

ইমেজ প্রক্রিয়া করতে JVM(JIT) এবং AOT(নেটিভ) সার্ভিস ইমেজ উভয়ের জন্য Eventarc ট্রিগার সেট আপ করুন:

gcloud eventarc triggers list --location=eu

gcloud eventarc triggers create image-analysis-jvm-trigger \
     --destination-run-service=image-analysis-jvm \
     --destination-run-region=europe-west1 \
     --location=eu \
     --event-filters="type=google.cloud.storage.object.v1.finalized" \
     --event-filters="bucket=uploaded-pictures-${GOOGLE_CLOUD_PROJECT}" \
     --service-account=${PROJECT_NUMBER}-compute@developer.gserviceaccount.com

gcloud eventarc triggers create image-analysis-native-trigger \
     --destination-run-service=image-analysis-native \
     --destination-run-region=europe-west1 \
     --location=eu \
     --event-filters="type=google.cloud.storage.object.v1.finalized" \
     --event-filters="bucket=uploaded-pictures-${GOOGLE_CLOUD_PROJECT}" \
     --service-account=${PROJECT_NUMBER}-compute@developer.gserviceaccount.com    

লক্ষ্য করুন যে দুটি ট্রিগার তৈরি করা হয়েছে:

gcloud eventarc triggers list --location=eu

14. টেস্ট সার্ভিস সংস্করণ

পরিষেবা স্থাপন সফল হলে, আপনি ক্লাউড স্টোরেজে একটি ছবি পোস্ট করবেন, দেখুন আমাদের পরিষেবাগুলি চালু করা হয়েছে কিনা, ভিশন API কী রিটার্ন করে এবং মেটাডেটা Firestore এ সংরক্ষণ করা হয় কিনা৷

Cloud Storage -এ ফিরে যান এবং ল্যাবের শুরুতে আমরা যে বালতি তৈরি করেছি তাতে ক্লিক করুন:

ff8a6567afc76235.png

একবার বালতি বিবরণ পৃষ্ঠায়, একটি ছবি আপলোড করতে Upload files বোতামে ক্লিক করুন৷

উদাহরণস্বরূপ, একটি GeekHour.jpeg ইমেজ /services/image-analysis/java অধীনে আপনার কোডবেসের সাথে প্রদান করা হয়েছে। একটি ছবি নির্বাচন করুন এবং Open button টিপুন:

347b76e8b775f2f5.png

আপনি এখন image-analysis-jvm দিয়ে শুরু করে, image-analysis-native দ্বারা অনুসরণ করে পরিষেবাটির কার্য সম্পাদন পরীক্ষা করতে পারেন।

"হ্যামবার্গার" (☰) মেনু থেকে, Cloud Run > image-analysis-jvm পরিষেবাতে নেভিগেট করুন।

লগ-এ ক্লিক করুন এবং আউটপুট পর্যবেক্ষণ করুন:

810a8684414ceafa.png

এবং প্রকৃতপক্ষে, লগের তালিকায়, আমি দেখতে পাচ্ছি যে JIT(JVM) পরিষেবা image-analysis-jvm আহ্বান করা হয়েছিল।

লগগুলি পরিষেবা সম্পাদনের শুরু এবং শেষ নির্দেশ করে৷ এবং এর মধ্যে, আমরা INFO স্তরে লগ স্টেটমেন্ট সহ আমাদের ফাংশনে যে লগগুলি রাখি তা দেখতে পারি। আমরা দেখি:

  • আমাদের ফাংশন ট্রিগার ইভেন্টের বিশদ বিবরণ,
  • ভিশন API কল থেকে কাঁচা ফলাফল,
  • আমাদের আপলোড করা ছবিতে যে লেবেলগুলি পাওয়া গেছে,
  • প্রভাবশালী রং তথ্য,
  • ছবি দেখানো নিরাপদ কিনা,
  • এবং অবশেষে ছবি সম্পর্কে সেই মেটাডেটা Firestore এ সংরক্ষণ করা হয়েছে।

আপনি image-analysis-native পরিষেবার জন্য প্রক্রিয়াটি পুনরাবৃত্তি করবেন।

"হ্যামবার্গার" (☰) মেনু থেকে, Cloud Run > image-analysis-native পরিষেবাতে নেভিগেট করুন।

লগ-এ ক্লিক করুন এবং আউটপুট পর্যবেক্ষণ করুন:

b80308c7d0f55a3.png

আপনি এখন পর্যবেক্ষণ করতে চাইবেন চিত্রের মেটাডেটা Fiorestore এ সংরক্ষণ করা হয়েছে কিনা।

আবার "হ্যামবার্গার" (☰) মেনু থেকে, Firestore বিভাগে যান। Data সাবসেকশনে (ডিফল্টভাবে দেখানো হয়েছে), আপনি একটি নতুন ডকুমেন্ট যোগ করার সাথে pictures সংগ্রহ দেখতে পাবেন, আপনার এইমাত্র আপলোড করা ছবির সাথে মিল রয়েছে:

933a20a9709cb006.png

15. পরিষ্কার করুন (ঐচ্ছিক)

আপনি যদি সিরিজের অন্যান্য ল্যাবগুলির সাথে চালিয়ে যেতে চান না, তাহলে খরচ বাঁচাতে এবং সামগ্রিকভাবে ভাল ক্লাউড নাগরিক হতে আপনি সংস্থানগুলি পরিষ্কার করতে পারেন। আপনি নিম্নরূপ পৃথকভাবে সম্পদ পরিষ্কার করতে পারেন.

বালতি মুছুন:

gsutil rb gs://${BUCKET_PICTURES}

ফাংশন মুছুন:

gcloud functions delete picture-uploaded --region europe-west1 -q

সংগ্রহ থেকে সংগ্রহ মুছুন নির্বাচন করে Firestore সংগ্রহ মুছুন:

410b551c3264f70a.png

বিকল্পভাবে, আপনি পুরো প্রকল্প মুছে ফেলতে পারেন:

gcloud projects delete ${GOOGLE_CLOUD_PROJECT} 

16. অভিনন্দন!

অভিনন্দন! আপনি সফলভাবে প্রকল্পের প্রথম মূল পরিষেবা বাস্তবায়ন করেছেন!

আমরা কভার করেছি কি

  • ক্লাউড স্টোরেজ
  • ক্লাউড রান
  • ক্লাউড ভিশন API
  • ক্লাউড ফায়ারস্টোর
  • নেটিভ জাভা ইমেজ

পরবর্তী পদক্ষেপ