প্রতিদিনের ছবি: ল্যাব 1—ছবি সংরক্ষণ করুন এবং বিশ্লেষণ করুন (নেটিভ জাভা)

1. ওভারভিউ

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

c0650ee4a76db35e.png

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

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

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

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

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

295004821bab6a87.png

37d264871000675d.png

96d86d3d5655cdbe.png

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

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

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

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

84688aa223b1c3a2.png

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

320e18fedb7fbe0.png

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

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

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

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

8f3522d790bb026c.png

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

d785572fa14c87c2.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 পৃষ্ঠায় নেভিগেট করুন।

d08ecb0ae29330a1.png

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

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

8951851554a430d2.png

CONTINUE ক্লিক করুন।

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

24b24625157ab467.png

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

CONTINUE ক্লিক করুন।

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

9e7bd365fa94a2e0.png

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

CONTINUE ক্লিক করুন।

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

1ff4a1f6e57045f5.png

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

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

CONTINUE ক্লিক করুন।

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

2d469b076029d365.png

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

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

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

Permissions ট্যাবে যান:

19564b3ad8688ae8.png

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

d655e760c76d62c1.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 থাকা উচিত:

65c63ef4a6eb30ad.png

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

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

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

e639a9ba625b71a6.png

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

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

1f88a2290290aba8.png

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

1209e7ebe1f63b10.png

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

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

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

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

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

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

e57a673537b5deca.png

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

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

1a2e363fae5c7e96.png

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

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

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

7dcc82751ed483fb.png

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

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

dce3d73884ac8c83.png

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

Save ক্লিক করুন।

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

63e95c844b3f79d3.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 এ ক্লিক করে, এবং তারপরে নীচে দেখানো হিসাবে একটি যৌগিক সূচক তৈরি করুন:

2236d3a024a59232.png

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

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

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

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

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

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

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

4c2a18a2c8b69dc5.png

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

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

প্রথমে, pom.xml ফাইলটি খুলুন যা আমাদের জাভা অ্যাপের নির্ভরতা তালিকাভুক্ত করে; দৃষ্টি, ক্লাউড স্টোরেজ এবং ফায়ারস্টোর API-এর ব্যবহারের উপর ফোকাস করা হয়

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.0-M3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>services</groupId>
        <artifactId>image-analysis</artifactId>
        <version>0.0.1</version>
        <name>image-analysis</name>
        <description>Spring App for Image Analysis</description>
    <properties>
        <java.version>17</java.version>
        <maven.compiler.target>17</maven.compiler.target>
        <maven.compiler.source>17</maven.compiler.source>        
        <spring-cloud.version>2023.0.0-M2</spring-cloud.version>
        <testcontainers.version>1.19.1</testcontainers.version>
    </properties>
...
  <dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.google.cloud</groupId>
            <artifactId>libraries-bom</artifactId>
            <version>26.24.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
  </dependencyManagement>
 
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
                <dependency>
                        <groupId>org.springframework.cloud</groupId>
                        <artifactId>spring-cloud-function-web</artifactId>
                </dependency>
        <dependency>
            <groupId>com.google.cloud.functions</groupId>
            <artifactId>functions-framework-api</artifactId>
            <version>1.1.0</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>        

কার্যকারিতা 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) {
          ApiFuture<WriteResult> writeResult = 
               eventService.storeImage(fileName, labels,
                                       mainColor);
          logger.info("Picture metadata saved in Firestore at " + 
               writeResult.get().getUpdateTime());
}
...
  public ApiFuture<WriteResult> storeImage(String fileName, 
                                           List<String> labels, 
                                           String mainColor) {
    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());

    return doc.set(data, SetOptions.merge());
  }

10. GraalVM দিয়ে অ্যাপ ইমেজ তৈরি করুন

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

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

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

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

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

sdk install java 17.0.8-graal

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

sdk use java 17.0.8-graal

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

# download GraalVM
wget https://download.oracle.com/graalvm/17/latest/graalvm-jdk-17_linux-x64_bin.tar.gz 
tar -xzf graalvm-jdk-17_linux-x64_bin.tar.gz

ls -lart

# configure Java 17 and GraalVM for Java 17
# note the name of the latest GraalVM version, as unpacked by the tar command
echo Existing JVM: $JAVA_HOME
cd graalvm-jdk-17.0.8+9.1

export JAVA_HOME=$PWD
cd bin
export PATH=$PWD:$PATH

echo JAVA HOME: $JAVA_HOME
echo PATH: $PATH

cd ../..

# validate the version with
java -version 

# observe
Java(TM) SE Runtime Environment Oracle GraalVM 17.0.8+9.1 (build 17.0.8+9-LTS-jvmci-23.0-b14)
Java HotSpot(TM) 64-Bit Server VM Oracle GraalVM 17.0.8+9.1 (build 17.0.8+9-LTS-jvmci-23.0-b14, mixed mode, sharing)

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

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

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

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

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

./mvnw package

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

...
[INFO] Results:
[INFO] 
[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0
[INFO] 
[INFO] 
[INFO] --- maven-jar-plugin:3.3.0:jar (default-jar) @ image-analysis ---
[INFO] Building jar: /home/user/serverless-photosharing-workshop/services/image-analysis/java/target/image-analysis-0.0.1.jar
[INFO] 
[INFO] --- spring-boot-maven-plugin:3.2.0-M3:repackage (repackage) @ image-analysis ---
[INFO] Replacing main artifact /home/user/serverless-photosharing-workshop/services/image-analysis/java/target/image-analysis-0.0.1.jar with repackaged archive, adding nested dependencies in BOOT-INF/.
[INFO] The original artifact has been renamed to /home/user/serverless-photosharing-workshop/services/image-analysis/java/target/image-analysis-0.0.1.jar.original
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  15.335 s
[INFO] Finished at: 2023-10-10T19:33:25Z
[INFO] ------------------------------------------------------------------------

নেটিভ (এওটি ব্যবহার করে) ছবি তৈরি করুন:।

./mvnw native:compile -Pnative

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

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

...
[2/7] Performing analysis...  [*********]                                                              (124.5s @ 4.53GB)
  29,732 (93.19%) of 31,905 classes reachable
  60,161 (70.30%) of 85,577 fields reachable
 261,973 (67.29%) of 389,319 methods reachable
   2,940 classes, 2,297 fields, and 97,421 methods registered for reflection
      81 classes,    90 fields, and    62 methods registered for JNI access
       4 native libraries: dl, pthread, rt, z
[3/7] Building universe...                                                                              (11.7s @ 4.67GB)
[4/7] Parsing methods...      [***]                                                                      (6.1s @ 5.91GB)
[5/7] Inlining methods...     [****]                                                                     (4.5s @ 4.39GB)
[6/7] Compiling methods...    [******]                                                                  (35.3s @ 4.60GB)
[7/7] Creating image...                                                                                 (12.9s @ 4.61GB)
  80.08MB (47.43%) for code area:   190,483 compilation units
  73.81MB (43.72%) for image heap:  660,125 objects and 189 resources
  14.95MB ( 8.86%) for other data
 168.84MB in total
------------------------------------------------------------------------------------------------------------------------
Top 10 packages in code area:                               Top 10 object types in image heap:
   2.66MB com.google.cloud.vision.v1p4beta1                   18.51MB byte[] for code metadata
   2.60MB com.google.cloud.vision.v1                           9.27MB java.lang.Class
   2.49MB com.google.protobuf                                  7.34MB byte[] for reflection metadata
   2.40MB com.google.cloud.vision.v1p3beta1                    6.35MB byte[] for java.lang.String
   2.17MB com.google.storage.v2                                5.72MB java.lang.String
   2.12MB com.google.firestore.v1                              4.46MB byte[] for embedded resources
   1.64MB sun.security.ssl                                     4.30MB c.oracle.svm.core.reflect.SubstrateMethodAccessor
   1.51MB i.g.xds.shaded.io.envoyproxy.envoy.config.core.v3    4.27MB byte[] for general heap data
   1.47MB com.google.cloud.vision.v1p2beta1                    2.50MB com.oracle.svm.core.hub.DynamicHubCompanion
   1.34MB i.g.x.shaded.io.envoyproxy.envoy.config.route.v3     1.17MB java.lang.Object[]
  58.34MB for 977 more packages                                9.19MB for 4667 more object types
------------------------------------------------------------------------------------------------------------------------
                        13.5s (5.7% of total time) in 75 GCs | Peak RSS: 9.44GB | CPU load: 6.13
------------------------------------------------------------------------------------------------------------------------
Produced artifacts:
 /home/user/serverless-photosharing-workshop/services/image-analysis/java/target/image-analysis (executable)
 /home/user/serverless-photosharing-workshop/services/image-analysis/java/target/image-analysis.build_artifacts.txt (txt)
========================================================================================================================
Finished generating '/home/user/serverless-photosharing-workshop/services/image-analysis/java/target/image-analysis' in 3m 57s.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  04:28 min
[INFO] Finished at: 2023-10-10T19:53:30Z
[INFO] ------------------------------------------------------------------------

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

আসুন দুটি ভিন্ন সংস্করণে একটি ধারক চিত্র তৈরি করি: একটি JIT image হিসাবে এবং অন্যটি একটি Native Java image হিসাবে।

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

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

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

./mvnw spring-boot:build-image -Pji

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

[INFO]     [creator]     Timer: Saving docker.io/library/image-analysis-maven-jit:latest... started at 2023-10-10T20:00:31Z
[INFO]     [creator]     *** Images (4c84122a1826):
[INFO]     [creator]           docker.io/library/image-analysis-maven-jit:latest
[INFO]     [creator]     Timer: Saving docker.io/library/image-analysis-maven-jit:latest... ran for 6.975913605s and ended at 2023-10-10T20:00:38Z
[INFO]     [creator]     Timer: Exporter ran for 8.068588001s and ended at 2023-10-10T20:00:38Z
[INFO]     [creator]     Timer: Cache started at 2023-10-10T20:00:38Z
[INFO]     [creator]     Reusing cache layer 'paketo-buildpacks/syft:syft'
[INFO]     [creator]     Adding cache layer 'buildpacksio/lifecycle:cache.sbom'
[INFO]     [creator]     Timer: Cache ran for 200.449002ms and ended at 2023-10-10T20:00:38Z
[INFO] 
[INFO] Successfully built image 'docker.io/library/image-analysis-maven-jit:latest'
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  43.887 s
[INFO] Finished at: 2023-10-10T20:00:39Z
[INFO] ------------------------------------------------------------------------

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

./mvnw spring-boot:build-image -Pnative

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

দ্রষ্টব্য:

  • আপনি যে মেশিনে পরীক্ষা করছেন তার উপর নির্ভর করে বিল্ডটি বেশ কিছুটা বেশি সময় নেয়
  • ছবিগুলিকে UPX দিয়ে আরও সংকুচিত করা যেতে পারে, তবে স্টার্ট-আপ কর্মক্ষমতার উপর একটি ছোট নেতিবাচক প্রভাব রয়েছে, তাই এই বিল্ডটি UPX ব্যবহার করে না - এটি সর্বদা একটি সামান্য ট্রেড-অফ
...
[INFO]     [creator]     Saving docker.io/library/image-analysis-maven-native:latest...
[INFO]     [creator]     *** Images (13167702674e):
[INFO]     [creator]           docker.io/library/image-analysis-maven-native:latest
[INFO]     [creator]     Adding cache layer 'paketo-buildpacks/bellsoft-liberica:native-image-svm'
[INFO]     [creator]     Adding cache layer 'paketo-buildpacks/syft:syft'
[INFO]     [creator]     Adding cache layer 'paketo-buildpacks/native-image:native-image'
[INFO]     [creator]     Adding cache layer 'buildpacksio/lifecycle:cache.sbom'
[INFO] 
[INFO] Successfully built image 'docker.io/library/image-analysis-maven-native:latest'
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  03:37 min
[INFO] Finished at: 2023-10-10T20:05:16Z
[INFO] ------------------------------------------------------------------------

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

docker images | grep image-analysis

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

# JIT image
docker tag image-analysis-maven-jit gcr.io/${GOOGLE_CLOUD_PROJECT}/image-analysis-maven-jit
docker push gcr.io/${GOOGLE_CLOUD_PROJECT}/image-analysis-maven-jit

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

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

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

আপনি দুইবার পরিষেবা স্থাপন করবেন, একবার JIT চিত্র ব্যবহার করে এবং দ্বিতীয়বার 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 চিত্রটি স্থাপন করুন এবং কনসোলে স্থাপনার লগ পর্যবেক্ষণ করুন:

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

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

নেটিভ ইমেজ স্থাপন করুন এবং কনসোলে স্থাপনার লগ পর্যবেক্ষণ করুন:

gcloud run deploy image-analysis-native \
     --image gcr.io/${GOOGLE_CLOUD_PROJECT}/image-analysis-maven-native \
     --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'

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

gcloud eventarc triggers list --location=eu

gcloud eventarc triggers create image-analysis-jit-trigger \
     --destination-run-service=image-analysis-jit \
     --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 -এ ফিরে যান এবং ল্যাবের শুরুতে আমরা যে বালতি তৈরি করেছি তাতে ক্লিক করুন:

33442485a1d76921.png

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

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

d57529452f62bd32.png

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

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

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

ae1a4a94c7c7a166.png

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

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

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

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

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

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

4afe22833c1fd14c.png

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

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

82d6c468956e7cfc.png

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

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

বালতি মুছুন:

gsutil rb gs://${BUCKET_PICTURES}

ফাংশন মুছুন:

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

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

6cc86a7b88fdb4d3.png

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

gcloud projects delete ${GOOGLE_CLOUD_PROJECT} 

16. অভিনন্দন!

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

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

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

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