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

তুমি কি শিখবে
- ক্লাউড স্টোরেজ
- ক্লাউড রান
- ক্লাউড ভিশন এপিআই
- ক্লাউড ফায়ারস্টোর
2. সেটআপ এবং প্রয়োজনীয়তা
স্ব-গতিসম্পন্ন পরিবেশ সেটআপ
- গুগল ক্লাউড কনসোলে সাইন-ইন করুন এবং একটি নতুন প্রকল্প তৈরি করুন অথবা বিদ্যমান একটি পুনরায় ব্যবহার করুন। যদি আপনার ইতিমধ্যেই একটি জিমেইল বা গুগল ওয়ার্কস্পেস অ্যাকাউন্ট না থাকে, তাহলে আপনাকে অবশ্যই একটি তৈরি করতে হবে।



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

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

এই ভার্চুয়াল মেশিনটিতে আপনার প্রয়োজনীয় সকল ডেভেলপমেন্ট টুল রয়েছে। এটি একটি স্থায়ী ৫ জিবি হোম ডিরেক্টরি অফার করে এবং গুগল ক্লাউডে চলে, যা নেটওয়ার্ক কর্মক্ষমতা এবং প্রমাণীকরণকে ব্যাপকভাবে উন্নত করে। এই কোডল্যাবে আপনার সমস্ত কাজ একটি ব্রাউজারেই করা যেতে পারে। আপনাকে কিছু ইনস্টল করার প্রয়োজন নেই।
৩. API গুলি সক্ষম করুন
এই ল্যাবের জন্য, আপনি ক্লাউড ফাংশন এবং ভিশন এপিআই ব্যবহার করবেন তবে প্রথমে এগুলি ক্লাউড কনসোলে অথবা gcloud দিয়ে সক্ষম করতে হবে।
ক্লাউড কনসোলে ভিশন এপিআই সক্ষম করতে, অনুসন্ধান বারে Cloud Vision API অনুসন্ধান করুন:

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

ENABLE বাটনে ক্লিক করুন।
বিকল্পভাবে, আপনি gcloud কমান্ড লাইন টুল ব্যবহার করে এটিকে Cloud Shell সক্ষম করতে পারেন।
ক্লাউড শেলের ভিতরে, নিম্নলিখিত কমান্ডটি চালান:
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
৪. বালতি তৈরি করুন (কনসোল)
ছবিগুলির জন্য একটি স্টোরেজ বাকেট তৈরি করুন। আপনি এটি গুগল ক্লাউড প্ল্যাটফর্ম কনসোল ( console.cloud.google.com ) থেকে অথবা ক্লাউড শেল থেকে gsutil কমান্ড লাইন টুল অথবা আপনার স্থানীয় ডেভেলপমেন্ট পরিবেশের মাধ্যমে করতে পারেন।
স্টোরেজে নেভিগেট করুন
"হ্যামবার্গার" (☰) মেনু থেকে, Storage পৃষ্ঠায় যান।

তোমার বাকেটের নাম দাও
CREATE BUCKET বোতামে ক্লিক করুন।

চালিয়ে CONTINUE ক্লিক করুন।
অবস্থান নির্বাচন করুন

আপনার পছন্দের অঞ্চলে (এখানে Europe ) একটি বহু-আঞ্চলিক বাকেট তৈরি করুন।
চালিয়ে CONTINUE ক্লিক করুন।
ডিফল্ট স্টোরেজ ক্লাস বেছে নিন

আপনার ডেটার জন্য Standard স্টোরেজ ক্লাসটি বেছে নিন।
চালিয়ে CONTINUE ক্লিক করুন।
অ্যাক্সেস নিয়ন্ত্রণ সেট করুন

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

ডিফল্ট ( Google-managed key) রাখুন, কারণ আপনি নিজের এনক্রিপশন কী ব্যবহার করবেন না।
আমাদের বাকেট তৈরি চূড়ান্ত করতে CREATE এ ক্লিক করুন।
স্টোরেজ ভিউয়ার হিসেবে allUsers যোগ করুন
Permissions ট্যাবে যান:

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

SAVE করুন ক্লিক করুন।
৫. বালতি তৈরি করুন (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 বাকেট থাকা উচিত:

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

আপনার বালতি এখন ছবি গ্রহণের জন্য প্রস্তুত।
আপনি যদি বাকেটের নামের উপর ক্লিক করেন, তাহলে আপনি বাকেটের বিবরণ দেখতে পাবেন।

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

Public অ্যাক্সেস লেবেলের পাশে, আপনি একটি ছোট লিঙ্ক আইকনও দেখতে পাবেন। এটিতে ক্লিক করার সময়, আপনার ব্রাউজারটি সেই ছবির পাবলিক URL-এ নেভিগেট করবে, যা এই ধরণের হবে:
https://storage.googleapis.com/BUCKET_NAME/PICTURE_FILE.png
আপনার বাকেটের জন্য BUCKET_NAME হলো বিশ্বব্যাপী অনন্য নাম, এবং তারপর আপনার ছবির ফাইলের নাম।
ছবির নামের পাশে থাকা চেক বক্সে ক্লিক করলে, DELETE বোতামটি সক্রিয় হবে এবং আপনি এই প্রথম ছবিটি মুছে ফেলতে পারবেন।
৭. ডাটাবেস প্রস্তুত করুন
আপনি ভিশন এপিআই দ্বারা প্রদত্ত ছবি সম্পর্কে তথ্য ক্লাউড ফায়ারস্টোর ডাটাবেসে সংরক্ষণ করবেন, যা একটি দ্রুত, সম্পূর্ণরূপে পরিচালিত, সার্ভারহীন, ক্লাউড-নেটিভ NoSQL ডকুমেন্ট ডাটাবেস। ক্লাউড কনসোলের Firestore বিভাগে গিয়ে আপনার ডাটাবেস প্রস্তুত করুন:

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

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

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

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

আমাদের সংগ্রহে প্রোগ্রাম্যাটিকভাবে তৈরি করা নথিগুলিতে 4টি ক্ষেত্র থাকবে:
- নাম (স্ট্রিং): আপলোড করা ছবির ফাইলের নাম, যা ডকুমেন্টের মূল চাবিকাঠিও।
- লেবেল (স্ট্রিং অ্যারে): ভিশন এপিআই দ্বারা স্বীকৃত আইটেমগুলির লেবেল
- রঙ (স্ট্রিং): প্রভাবশালী রঙের হেক্সাডেসিমেল রঙ কোড (অর্থাৎ #ab12ef)
- তৈরি (তারিখ): এই ছবির মেটাডেটা কখন সংরক্ষণ করা হয়েছিল তার টাইমস্ট্যাম্প
- থাম্বনেইল (বুলিয়ান): একটি ঐচ্ছিক ক্ষেত্র যা উপস্থিত থাকবে এবং যদি এই ছবির জন্য একটি থাম্বনেইল ছবি তৈরি করা হয় তবে এটি সত্য হবে।
যেহেতু আমরা ফায়ারস্টোরে থাম্বনেইল সহ ছবিগুলি খুঁজব এবং তৈরির তারিখ অনুসারে সাজাব, তাই আমাদের একটি অনুসন্ধান সূচী তৈরি করতে হবে।
আপনি ক্লাউড শেলে নিম্নলিখিত কমান্ডটি ব্যবহার করে সূচক তৈরি করতে পারেন:
gcloud firestore indexes composite create \
--collection-group=pictures \
--field-config field-path=thumbnail,order=descending \
--field-config field-path=created,order=descending
অথবা আপনি ক্লাউড কনসোল থেকেও এটি করতে পারেন, বাম দিকের নেভিগেশন কলামে Indexes এ ক্লিক করে, এবং তারপর নীচে দেখানো হিসাবে একটি কম্পোজিট ইনডেক্স তৈরি করে:

Create ক্লিক করুন। সূচী তৈরি করতে কয়েক মিনিট সময় লাগতে পারে।
৮. কোডটি ক্লোন করুন
যদি পূর্ববর্তী কোড ল্যাবে কোডটি ক্লোন না করে থাকেন, তাহলে কোডটি ক্লোন করুন:
git clone https://github.com/GoogleCloudPlatform/serverless-photosharing-workshop
এরপর আপনি ল্যাব তৈরি শুরু করার জন্য পরিষেবা সম্বলিত ডিরেক্টরিতে যেতে পারেন:
cd serverless-photosharing-workshop/services/image-analysis/java
পরিষেবাটির জন্য আপনার কাছে নিম্নলিখিত ফাইল লেআউট থাকবে:

৯. পরিষেবা কোডটি অন্বেষণ করুন
আপনি প্রথমে pom.xml এ BOM ব্যবহার করে জাভা ক্লায়েন্ট লাইব্রেরিগুলি কীভাবে সক্রিয় করা হয় তা দেখে নিন:
প্রথমে, 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);
আমরা ভিশন এপিআই-এর ৩টি মূল ক্ষমতার জন্য অনুরোধ করছি:
- লেবেল সনাক্তকরণ : ছবিগুলিতে কী আছে তা বোঝার জন্য
- ছবির বৈশিষ্ট্য : ছবির আকর্ষণীয় বৈশিষ্ট্যগুলি প্রদান করতে (আমরা ছবির প্রভাবশালী রঙের প্রতি আগ্রহী)
- নিরাপদ অনুসন্ধান : ছবিটি দেখানো নিরাপদ কিনা তা জানার জন্য (এতে প্রাপ্তবয়স্ক / চিকিৎসা / বর্ণবাদী / হিংসাত্মক বিষয়বস্তু থাকা উচিত নয়)
এই মুহুর্তে, আমরা Vision API-তে কল করতে পারি:
...
logger.info("Calling the Vision API...");
BatchAnnotateImagesResponse result = vision.batchAnnotateImages(requests);
List<AnnotateImageResponse> responses = result.getResponsesList();
...
রেফারেন্সের জন্য, ভিশন এপিআই থেকে প্রাপ্ত প্রতিক্রিয়াটি কেমন দেখাচ্ছে তা এখানে দেওয়া হল:
{
"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 block কেন আছে:
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());
}
১০. 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(Native) ইমেজ তৈরি করুন:।
./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] ------------------------------------------------------------------------
১১. কন্টেইনার ছবি তৈরি এবং প্রকাশ করুন
আসুন দুটি ভিন্ন সংস্করণে একটি কন্টেইনার ইমেজ তৈরি করি: একটি 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(Native) ইমেজ তৈরি করুন:।
./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
১২. ক্লাউড রানে স্থাপন করুন
পরিষেবাটি স্থাপনের সময় এসেছে।
আপনি দুবার পরিষেবা স্থাপন করবেন, একবার JIT(JVM) চিত্র ব্যবহার করে এবং দ্বিতীয়বার AOT(Native) চিত্র ব্যবহার করে। তুলনামূলক উদ্দেশ্যে, উভয় পরিষেবা স্থাপনা বাকেট থেকে একই চিত্র সমান্তরালভাবে প্রক্রিয়া করবে।
প্রথমে, 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(Native) ইমেজটি স্থাপন করুন এবং কনসোলে স্থাপন লগটি পর্যবেক্ষণ করুন:
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
১৩. Eventarc ট্রিগার সেটআপ করুন
Eventarc ডিকপলড মাইক্রোসার্ভিসেসের মধ্যে স্টেট পরিবর্তনের প্রবাহ, যাকে ইভেন্ট বলা হয়, পরিচালনা করার জন্য একটি স্ট্যান্ডার্ডাইজড সমাধান প্রদান করে। ট্রিগার করা হলে, Eventarc এই ইভেন্টগুলিকে Pub/Sub সাবস্ক্রিপশনের মাধ্যমে বিভিন্ন গন্তব্যে (এই নথিতে, ইভেন্ট ডেস্টিনেশন দেখুন) রুট করে এবং আপনার জন্য ডেলিভারি, নিরাপত্তা, অনুমোদন, পর্যবেক্ষণযোগ্যতা এবং ত্রুটি-পরিচালনা পরিচালনা করে।
আপনি একটি 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(Native) পরিষেবা চিত্র উভয়ের জন্য 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
১৪. টেস্ট সার্ভিস ভার্সন
পরিষেবা স্থাপন সফল হলে, আপনি ক্লাউড স্টোরেজে একটি ছবি পোস্ট করবেন, আমাদের পরিষেবাগুলি ব্যবহার করা হয়েছে কিনা, ভিশন API কী ফেরত দেয় এবং ফায়ারস্টোরে মেটাডেটা সংরক্ষণ করা হয়েছে কিনা তা দেখবেন।
Cloud Storage ফিরে যান, এবং ল্যাবের শুরুতে তৈরি বাকেটটিতে ক্লিক করুন:

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

আপনি এখন image-analysis-jvm দিয়ে শুরু করে image-analysis-native লিখে পরিষেবাটির কার্যকারিতা পরীক্ষা করতে পারবেন।
"হ্যামবার্গার" (☰) মেনু থেকে, Cloud Run > image-analysis-jvm পরিষেবাতে নেভিগেট করুন।
Logs-এ ক্লিক করুন এবং আউটপুট পর্যবেক্ষণ করুন:
![810a8684414ceafa.png - [অনলাইন].](https://codelabs.developers.google.com/static/codelabs/cloud-picadaily-cloudrun-native-java/img/810a8684414ceafa.png?hl=bn)
এবং প্রকৃতপক্ষে, লগের তালিকায়, আমি দেখতে পাচ্ছি যে JIT(JVM) পরিষেবা image-analysis-jvm ব্যবহার করা হয়েছিল।
লগগুলি পরিষেবা কার্যকর করার শুরু এবং শেষ নির্দেশ করে। এবং এর মধ্যে, আমরা INFO স্তরে লগ স্টেটমেন্ট সহ আমাদের ফাংশনে রাখা লগগুলি দেখতে পাচ্ছি। আমরা দেখতে পাচ্ছি:
- আমাদের কার্যক্রম শুরু করার ইভেন্টের বিবরণ,
- ভিশন এপিআই কল থেকে প্রাপ্ত কাঁচা ফলাফল,
- আমরা যে ছবিতে আপলোড করেছি তাতে যে লেবেলগুলি পাওয়া গেছে,
- প্রভাবশালী রঙের তথ্য,
- ছবিটি দেখানো নিরাপদ কিনা,
- এবং অবশেষে ছবিটি সম্পর্কে সেই মেটাডেটা ফায়ারস্টোরে সংরক্ষণ করা হয়েছে।
আপনি image-analysis-native পরিষেবার জন্য প্রক্রিয়াটি পুনরাবৃত্তি করবেন।
"হ্যামবার্গার" (☰) মেনু থেকে, Cloud Run > image-analysis-native পরিষেবাতে নেভিগেট করুন।
Logs-এ ক্লিক করুন এবং আউটপুট পর্যবেক্ষণ করুন:

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

১৫. পরিষ্কার করা (ঐচ্ছিক)
যদি আপনি এই সিরিজের অন্যান্য ল্যাবগুলি চালিয়ে যাওয়ার ইচ্ছা না রাখেন, তাহলে খরচ বাঁচাতে এবং সামগ্রিকভাবে একজন ভালো ক্লাউড সিটিজেন হওয়ার জন্য আপনি সম্পদ পরিষ্কার করতে পারেন। আপনি নিম্নরূপ পৃথকভাবে সম্পদ পরিষ্কার করতে পারেন।
বাকেটটি মুছে ফেলুন:
gsutil rb gs://${BUCKET_PICTURES}
ফাংশনটি মুছুন:
gcloud functions delete picture-uploaded --region europe-west1 -q
সংগ্রহ থেকে সংগ্রহ মুছুন নির্বাচন করে ফায়ারস্টোর সংগ্রহটি মুছুন:

অন্যথায়, আপনি পুরো প্রকল্পটি মুছে ফেলতে পারেন:
gcloud projects delete ${GOOGLE_CLOUD_PROJECT}
১৬. অভিনন্দন!
অভিনন্দন! আপনি প্রকল্পের প্রথম গুরুত্বপূর্ণ পরিষেবাটি সফলভাবে বাস্তবায়ন করেছেন!
আমরা যা কভার করেছি
- ক্লাউড স্টোরেজ
- ক্লাউড রান
- ক্লাউড ভিশন এপিআই
- ক্লাউড ফায়ারস্টোর
- নেটিভ জাভা ছবি