ছবির মধ্যে বস্তু সনাক্ত করতে একটি Android অ্যাপ তৈরি করুন

1. আপনি শুরু করার আগে

এই কোডল্যাবে, আপনি REST এবং gRPC এর সাথে TensorFlow সার্ভিং ব্যবহার করে একটি Android অ্যাপ থেকে একটি অবজেক্ট-ডিটেকশন ইনফারেন্স চালানো শিখবেন।

পূর্বশর্ত

  • জাভা দিয়ে অ্যান্ড্রয়েড ডেভেলপমেন্টের প্রাথমিক জ্ঞান
  • টেনসরফ্লো সহ মেশিন লার্নিং এর প্রাথমিক জ্ঞান, যেমন প্রশিক্ষণ এবং স্থাপনা
  • টার্মিনাল এবং ডকার সম্পর্কে প্রাথমিক জ্ঞান

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

  • TensorFlow Hub-এ প্রি-ট্রেইনড অবজেক্ট ডিটেকশন মডেল কীভাবে খুঁজে পাবেন।
  • কিভাবে একটি সাধারণ অ্যান্ড্রয়েড অ্যাপ তৈরি করবেন এবং টেনসরফ্লো সার্ভিং (REST এবং gRPC) এর মাধ্যমে ডাউনলোড করা অবজেক্ট ডিটেকশন মডেল দিয়ে ভবিষ্যদ্বাণী করবেন।
  • UI-তে সনাক্তকরণের ফলাফল কীভাবে রেন্ডার করবেন।

আপনি কি প্রয়োজন হবে

2. সেট আপ করুন

এই কোডল্যাবের জন্য কোড ডাউনলোড করতে:

  1. এই কোডল্যাবের জন্য GitHub সংগ্রহস্থলে নেভিগেট করুন।
  2. এই কোডল্যাবের জন্য সমস্ত কোড ডাউনলোড করতে কোড > জিপ ডাউনলোড করুন ক্লিক করুন।

a72f2bb4caa9a96.png

  1. আপনার প্রয়োজনীয় সমস্ত সংস্থান সহ একটি codelabs রুট ফোল্ডার আনপ্যাক করতে ডাউনলোড করা জিপ ফাইলটি আনজিপ করুন।

এই কোডল্যাবের জন্য, আপনার শুধুমাত্র সংগ্রহস্থলের TFServing/ObjectDetectionAndroid সাবডিরেক্টরিতে ফাইলগুলির প্রয়োজন, যাতে দুটি ফোল্ডার রয়েছে:

  • starter ফোল্ডারে স্টার্টার কোড থাকে যা আপনি এই কোডল্যাবের জন্য তৈরি করেন।
  • finished ফোল্ডারে সমাপ্ত নমুনা অ্যাপ্লিকেশনের জন্য সম্পূর্ণ কোড রয়েছে।

3. প্রকল্পে নির্ভরতা যোগ করুন

স্টার্টার অ্যাপটি অ্যান্ড্রয়েড স্টুডিওতে আমদানি করুন

  • অ্যান্ড্রয়েড স্টুডিওতে, ফাইল > নতুন > আমদানি প্রকল্পে ক্লিক করুন এবং তারপরে আপনি আগে ডাউনলোড করা সোর্স কোড থেকে starter ফোল্ডারটি বেছে নিন।

OkHttp এবং gRPC-এর জন্য নির্ভরতা যোগ করুন

  • আপনার প্রকল্পের app/build.gradle ফাইলে, নির্ভরতাগুলির উপস্থিতি নিশ্চিত করুন৷
dependencies {
  // ...
    implementation 'com.squareup.okhttp3:okhttp:4.9.0'
    implementation 'javax.annotation:javax.annotation-api:1.3.2'
    implementation 'io.grpc:grpc-okhttp:1.29.0'
    implementation 'io.grpc:grpc-protobuf-lite:1.29.0'
    implementation 'io.grpc:grpc-stub:1.29.0'
}

Gradle ফাইলের সাথে আপনার প্রকল্প সিঙ্ক করুন

  • নির্বাচন করুন 541e90b497a7fef7.png নেভিগেশন মেনু থেকে Gradle ফাইলের সাথে প্রকল্প সিঙ্ক করুন

4. স্টার্টার অ্যাপ চালান

অ্যাপটি চালান এবং অন্বেষণ করুন

অ্যাপটি আপনার অ্যান্ড্রয়েড ডিভাইসে চালু করা উচিত। UI বেশ সহজবোধ্য: একটি বিড়ালের ছবি রয়েছে যাতে আপনি বস্তুগুলি সনাক্ত করতে চান এবং ব্যবহারকারী REST বা gRPC সহ ব্যাকএন্ডে ডেটা পাঠানোর উপায় বেছে নিতে পারেন। ব্যাকএন্ড ইমেজে অবজেক্ট ডিটেকশন সঞ্চালন করে এবং ক্লায়েন্ট অ্যাপে সনাক্তকরণের ফলাফল ফেরত দেয়, যা আবার UI রেন্ডার করে।

24eab579530e9645.png

এই মুহূর্তে, আপনি রান ইনফারেন্স ক্লিক করলে, কিছুই হবে না। কারণ এটি এখনও ব্যাকএন্ডের সাথে যোগাযোগ করতে পারে না।

5. TensorFlow সার্ভিং সহ একটি বস্তু সনাক্তকরণ মডেল স্থাপন করুন

অবজেক্ট ডিটেকশন একটি খুব সাধারণ ML টাস্ক এবং এর লক্ষ্য হল ইমেজের মধ্যে অবজেক্ট সনাক্ত করা, যথা বস্তুর সম্ভাব্য বিভাগ এবং তাদের চারপাশের বাউন্ডিং বক্সের পূর্বাভাস দেওয়া। এখানে একটি সনাক্তকরণ ফলাফলের একটি উদাহরণ:

a68f9308fb2fc17b.png

Google TensorFlow Hub- এ বেশ কয়েকটি পূর্বপ্রশিক্ষিত মডেল প্রকাশ করেছে। সম্পূর্ণ তালিকা দেখতে, অবজেক্ট_ডিটেকশন পৃষ্ঠায় যান। আপনি এই কোডল্যাবের জন্য তুলনামূলকভাবে লাইটওয়েট SSD MobileNet V2 FPNLite 320x320 মডেল ব্যবহার করেন যাতে এটি চালানোর জন্য আপনাকে GPU ব্যবহার করতে হবে না।

টেনসরফ্লো সার্ভিংয়ের সাথে বস্তু সনাক্তকরণ মডেল স্থাপন করতে:

  1. মডেল ফাইল ডাউনলোড করুন।
  2. ডাউনলোড করা .tar.gz ফাইলটিকে ডিকম্প্রেশন টুল দিয়ে আনকম্প্রেস করুন, যেমন 7-জিপ।
  3. একটি ssd_mobilenet_v2_2_320 ফোল্ডার তৈরি করুন এবং তারপরে এটির ভিতরে একটি 123 সাবফোল্ডার তৈরি করুন।
  4. এক্সট্র্যাক্ট করা variables ফোল্ডার এবং saved_model.pb ফাইলটি 123 সাবফোল্ডারে রাখুন।

আপনি SavedModel ফোল্ডারটিকে ssd_mobilenet_v2_2_320 ফোল্ডার হিসাবে উল্লেখ করতে পারেন। 123 একটি উদাহরণ সংস্করণ নম্বর। আপনি যদি চান, আপনি অন্য নম্বর চয়ন করতে পারেন.

ফোল্ডার গঠন এই ছবির মত দেখতে হবে:

42c8150a42033767.png

TensorFlow পরিবেশন শুরু করুন

  • আপনার টার্মিনালে, ডকারের সাথে টেনসরফ্লো সার্ভিং শুরু করুন, তবে আপনার কম্পিউটারে ssd_mobilenet_v2_2_320 ফোল্ডারের পরম পাথ দিয়ে PATH/TO/SAVEDMODEL স্থানধারকটিকে প্রতিস্থাপন করুন।
docker pull tensorflow/serving

docker run -it --rm -p 8500:8500 -p 8501:8501 -v "PATH/TO/SAVEDMODEL:/models/ssd_mobilenet_v2_2" -e MODEL_NAME=ssd_mobilenet_v2_2 tensorflow/serving

ডকার স্বয়ংক্রিয়ভাবে টেনসরফ্লো সার্ভিং ইমেজটি প্রথমে ডাউনলোড করে, যা এক মিনিট সময় নেয়। এর পরে, টেনসরফ্লো পরিবেশন শুরু করা উচিত। লগটি এই কোড স্নিপেটের মতো হওয়া উচিত:

2022-02-25 06:01:12.513231: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:206] Restoring SavedModel bundle.
2022-02-25 06:01:12.585012: I external/org_tensorflow/tensorflow/core/platform/profile_utils/cpu_utils.cc:114] CPU Frequency: 3000000000 Hz
2022-02-25 06:01:13.395083: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:190] Running initialization op on SavedModel bundle at path: /models/ssd_mobilenet_v2_2/123
2022-02-25 06:01:13.837562: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:277] SavedModel load for tags { serve }; Status: success: OK. Took 1928700 microseconds.
2022-02-25 06:01:13.877848: I tensorflow_serving/servables/tensorflow/saved_model_warmup_util.cc:59] No warmup data file found at /models/ssd_mobilenet_v2_2/123/assets.extra/tf_serving_warmup_requests
2022-02-25 06:01:13.929844: I tensorflow_serving/core/loader_harness.cc:87] Successfully loaded servable version {name: ssd_mobilenet_v2_2 version: 123}
2022-02-25 06:01:13.985848: I tensorflow_serving/model_servers/server_core.cc:486] Finished adding/updating models
2022-02-25 06:01:13.985987: I tensorflow_serving/model_servers/server.cc:367] Profiler service is enabled
2022-02-25 06:01:13.988994: I tensorflow_serving/model_servers/server.cc:393] Running gRPC ModelServer at 0.0.0.0:8500 ...
[warn] getaddrinfo: address family for nodename not supported
2022-02-25 06:01:14.033872: I tensorflow_serving/model_servers/server.cc:414] Exporting HTTP/REST API at:localhost:8501 ...
[evhttp_server.cc : 245] NET_LOG: Entering the event loop ...

6. REST-এর মাধ্যমে TensorFlow সার্ভিংয়ের সাথে Android অ্যাপের সাথে সংযোগ করুন

ব্যাকএন্ড এখন প্রস্তুত, তাই আপনি চিত্রের মধ্যে বস্তু সনাক্ত করতে টেনসরফ্লো সার্ভিং-এ ক্লায়েন্টের অনুরোধ পাঠাতে পারেন। TensorFlow সার্ভিং-এ অনুরোধ পাঠানোর দুটি উপায় আছে:

  • বিশ্রাম
  • gRPC

অনুরোধ পাঠান এবং REST এর মাধ্যমে প্রতিক্রিয়া পান

তিনটি সহজ পদক্ষেপ আছে:

  • REST অনুরোধ তৈরি করুন।
  • TensorFlow সার্ভিং-এ REST অনুরোধ পাঠান।
  • REST প্রতিক্রিয়া থেকে পূর্বাভাসিত ফলাফল বের করুন এবং UI রেন্ডার করুন।

আপনি MainActivity.java.

REST অনুরোধ তৈরি করুন

এই মুহূর্তে, MainActivity.java ফাইলে একটি খালি createRESTRequest() ফাংশন আছে। আপনি একটি REST অনুরোধ তৈরি করতে এই ফাংশনটি বাস্তবায়ন করুন।

private Request createRESTRequest() {
}

টেনসরফ্লো সার্ভিং একটি POST অনুরোধ আশা করে যাতে আপনি যে SSD MobileNet মডেলটি ব্যবহার করেন তার জন্য ইমেজ টেনসর থাকে, তাই আপনাকে ছবির প্রতিটি পিক্সেল থেকে একটি অ্যারেতে আরজিবি মান বের করতে হবে এবং তারপর অ্যারেটিকে JSON-এ মুড়ে দিতে হবে, যা পেলোড। অনুরোধের

  • createRESTRequest() ফাংশনে এই কোড যোগ করুন:
//Create the REST request.
int[] inputImg = new int[INPUT_IMG_HEIGHT * INPUT_IMG_WIDTH];
int[][][][] inputImgRGB = new int[1][INPUT_IMG_HEIGHT][INPUT_IMG_WIDTH][3];
inputImgBitmap.getPixels(inputImg, 0, INPUT_IMG_WIDTH, 0, 0, INPUT_IMG_WIDTH, INPUT_IMG_HEIGHT);
int pixel;
for (int i = 0; i < INPUT_IMG_HEIGHT; i++) {
    for (int j = 0; j < INPUT_IMG_WIDTH; j++) {
    // Extract RBG values from each pixel; alpha is ignored
    pixel = inputImg[i * INPUT_IMG_WIDTH + j];
    inputImgRGB[0][i][j][0] = ((pixel >> 16) & 0xff);
    inputImgRGB[0][i][j][1] = ((pixel >> 8) & 0xff);
    inputImgRGB[0][i][j][2] = ((pixel) & 0xff);
    }
}

RequestBody requestBody =
    RequestBody.create("{\"instances\": " + Arrays.deepToString(inputImgRGB) + "}", JSON);

Request request =
    new Request.Builder()
        .url("http://" + SERVER + ":" + REST_PORT + "/v1/models/" + MODEL_NAME + ":predict")
        .post(requestBody)
        .build();

return request;    

TensorFlow সার্ভিং-এ REST অনুরোধ পাঠান

অ্যাপটি ব্যবহারকারীকে টেনসরফ্লো সার্ভিংয়ের সাথে যোগাযোগ করার জন্য REST বা gRPC বেছে নিতে দেয়, তাই অনক্লিক onClick(View view) শ্রোতার দুটি শাখা রয়েছে।

predictButton.setOnClickListener(
    new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (requestRadioGroup.getCheckedRadioButtonId() == R.id.rest) {
                // TODO: REST request
            }
            else {

            }
        }
    }
)
  • TensorFlow সার্ভিং-এ অনুরোধ পাঠাতে OkHttp ব্যবহার করতে onClick(View view) শ্রোতার REST শাখায় এই কোডটি যোগ করুন:
// Send the REST request.
Request request = createRESTRequest();
try {
    client =
        new OkHttpClient.Builder()
            .connectTimeout(20, TimeUnit.SECONDS)
            .writeTimeout(20, TimeUnit.SECONDS)
            .readTimeout(20, TimeUnit.SECONDS)
            .callTimeout(20, TimeUnit.SECONDS)
            .build();
    Response response = client.newCall(request).execute();
    JSONObject responseObject = new JSONObject(response.body().string());
    postprocessRESTResponse(responseObject);
} catch (IOException | JSONException e) {
    Log.e(TAG, e.getMessage());
    responseTextView.setText(e.getMessage());
    return;
}

TensorFlow সার্ভিং থেকে REST প্রতিক্রিয়া প্রক্রিয়া করুন

SSD MobileNet মডেলটি বেশ কয়েকটি ফলাফল প্রদান করে, যার মধ্যে রয়েছে:

  • num_detections : সনাক্তকরণের সংখ্যা
  • detection_scores : সনাক্তকরণ স্কোর
  • detection_classes : সনাক্তকরণ শ্রেণীর সূচক
  • detection_boxes : বাউন্ডিং-বক্স স্থানাঙ্ক

আপনি প্রতিক্রিয়া পরিচালনা করতে postprocessRESTResponse() ফাংশন বাস্তবায়ন করেন।

private void postprocessRESTResponse(Predict.PredictResponse response) {

}
  • postprocessRESTResponse() ফাংশনে এই কোড যোগ করুন:
// Process the REST response.
JSONArray predictionsArray = responseObject.getJSONArray("predictions");
//You only send one image, so you directly extract the first element.
JSONObject predictions = predictionsArray.getJSONObject(0);
// Argmax
int maxIndex = 0;
JSONArray detectionScores = predictions.getJSONArray("detection_scores");
for (int j = 0; j < predictions.getInt("num_detections"); j++) {
    maxIndex =
        detectionScores.getDouble(j) > detectionScores.getDouble(maxIndex + 1) ? j : maxIndex;
}
int detectionClass = predictions.getJSONArray("detection_classes").getInt(maxIndex);
JSONArray boundingBox = predictions.getJSONArray("detection_boxes").getJSONArray(maxIndex);
double ymin = boundingBox.getDouble(0);
double xmin = boundingBox.getDouble(1);
double ymax = boundingBox.getDouble(2);
double xmax = boundingBox.getDouble(3);
displayResult(detectionClass, (float) ymin, (float) xmin, (float) ymax, (float) xmax);

এখন পোস্টপ্রসেসিং ফাংশন প্রতিক্রিয়া থেকে পূর্বাভাসিত মান বের করে, অবজেক্টের সবচেয়ে সম্ভাব্য বিভাগ এবং বাউন্ডিং-বক্সের শীর্ষবিন্দুগুলির স্থানাঙ্ক চিহ্নিত করে এবং শেষ পর্যন্ত UI-তে সনাক্তকরণ বাউন্ডিং বক্স রেন্ডার করে।

চালাও এটা

  1. ক্লিক execute.png নেভিগেশন মেনুতে 'অ্যাপ' চালান এবং তারপর অ্যাপটি লোড হওয়ার জন্য অপেক্ষা করুন।
  2. REST > রান অনুমান নির্বাচন করুন।

অ্যাপটি বিড়ালের বাউন্ডিং বক্স রেন্ডার করতে কয়েক সেকেন্ড সময় নেয় এবং 17 কে অবজেক্টের বিভাগ হিসাবে দেখায়, যা COCO ডেটাসেটে cat অবজেক্টের সাথে মানচিত্র করে।

5a1a32768dc516d6.png

7. GRPC-এর মাধ্যমে টেনসরফ্লো সার্ভিং-এর সাথে অ্যান্ড্রয়েড অ্যাপ সংযুক্ত করুন

REST ছাড়াও, TensorFlow সার্ভিং এছাড়াও gRPC সমর্থন করে।

b6f4449c2c850b0e.png

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

অনুরোধ পাঠান এবং gRPC এর সাথে প্রতিক্রিয়া পান

চারটি সহজ ধাপ রয়েছে:

  • [ঐচ্ছিক] gRPC ক্লায়েন্ট স্টাব কোড তৈরি করুন।
  • জিআরপিসি অনুরোধ তৈরি করুন।
  • টেনসরফ্লো সার্ভিং-এ gRPC অনুরোধ পাঠান।
  • gRPC প্রতিক্রিয়া থেকে পূর্বাভাসিত ফলাফল বের করুন এবং UI রেন্ডার করুন।

আপনি MainActivity.java.

ঐচ্ছিক: gRPC ক্লায়েন্ট স্টাব কোড তৈরি করুন

TensorFlow সার্ভিংয়ের সাথে gRPC ব্যবহার করতে, আপনাকে gRPC ওয়ার্কফ্লো অনুসরণ করতে হবে। বিস্তারিত সম্পর্কে আরও জানতে, gRPC ডকুমেন্টেশন দেখুন।

a9d0e5cb543467b4.png

TensorFlow সার্ভিং এবং TensorFlow আপনার জন্য .proto ফাইলগুলিকে সংজ্ঞায়িত করে৷ TensorFlow এবং TensorFlow সার্ভিং 2.8 অনুযায়ী, এই .proto ফাইলগুলি প্রয়োজন:

tensorflow/core/example/example.proto
tensorflow/core/example/feature.proto
tensorflow/core/protobuf/struct.proto
tensorflow/core/protobuf/saved_object_graph.proto
tensorflow/core/protobuf/saver.proto
tensorflow/core/protobuf/trackable_object_graph.proto
tensorflow/core/protobuf/meta_graph.proto
tensorflow/core/framework/node_def.proto
tensorflow/core/framework/attr_value.proto
tensorflow/core/framework/function.proto
tensorflow/core/framework/types.proto
tensorflow/core/framework/tensor_shape.proto
tensorflow/core/framework/full_type.proto
tensorflow/core/framework/versions.proto
tensorflow/core/framework/op_def.proto
tensorflow/core/framework/graph.proto
tensorflow/core/framework/tensor.proto
tensorflow/core/framework/resource_handle.proto
tensorflow/core/framework/variable.proto

tensorflow_serving/apis/inference.proto
tensorflow_serving/apis/classification.proto
tensorflow_serving/apis/predict.proto
tensorflow_serving/apis/regression.proto
tensorflow_serving/apis/get_model_metadata.proto
tensorflow_serving/apis/input.proto
tensorflow_serving/apis/prediction_service.proto
tensorflow_serving/apis/model.proto
  • স্টাব তৈরি করতে, এই কোডটি app/build.gradle ফাইলে যোগ করুন।
apply plugin: 'com.google.protobuf'

protobuf {
    protoc { artifact = 'com.google.protobuf:protoc:3.11.0' }
    plugins {
        grpc { artifact = 'io.grpc:protoc-gen-grpc-java:1.29.0'
        }
    }
    generateProtoTasks {
        all().each { task ->
            task.builtins {
                java { option 'lite' }
            }
            task.plugins {
                grpc { option 'lite' }
            }
        }
    }
}

জিআরপিসি অনুরোধ তৈরি করুন

REST অনুরোধের মতো, আপনি createGRPCRequest() ফাংশনে gRPC অনুরোধ তৈরি করেন।

private Request createGRPCRequest() {

}
  • createGRPCRequest() ফাংশন তৈরি করতে এই কোড যোগ করুন:
if (stub == null) {
  channel = ManagedChannelBuilder.forAddress(SERVER, GRPC_PORT).usePlaintext().build();
  stub = PredictionServiceGrpc.newBlockingStub(channel);
}

Model.ModelSpec.Builder modelSpecBuilder = Model.ModelSpec.newBuilder();
modelSpecBuilder.setName(MODEL_NAME);
modelSpecBuilder.setVersion(Int64Value.of(MODEL_VERSION));
modelSpecBuilder.setSignatureName(SIGNATURE_NAME);

Predict.PredictRequest.Builder builder = Predict.PredictRequest.newBuilder();
builder.setModelSpec(modelSpecBuilder);

TensorProto.Builder tensorProtoBuilder = TensorProto.newBuilder();
tensorProtoBuilder.setDtype(DataType.DT_UINT8);
TensorShapeProto.Builder tensorShapeBuilder = TensorShapeProto.newBuilder();
tensorShapeBuilder.addDim(TensorShapeProto.Dim.newBuilder().setSize(1));
tensorShapeBuilder.addDim(TensorShapeProto.Dim.newBuilder().setSize(INPUT_IMG_HEIGHT));
tensorShapeBuilder.addDim(TensorShapeProto.Dim.newBuilder().setSize(INPUT_IMG_WIDTH));
tensorShapeBuilder.addDim(TensorShapeProto.Dim.newBuilder().setSize(3));
tensorProtoBuilder.setTensorShape(tensorShapeBuilder.build());
int[] inputImg = new int[INPUT_IMG_HEIGHT * INPUT_IMG_WIDTH];
inputImgBitmap.getPixels(inputImg, 0, INPUT_IMG_WIDTH, 0, 0, INPUT_IMG_WIDTH, INPUT_IMG_HEIGHT);
int pixel;
for (int i = 0; i < INPUT_IMG_HEIGHT; i++) {
    for (int j = 0; j < INPUT_IMG_WIDTH; j++) {
    // Extract RBG values from each pixel; alpha is ignored.
    pixel = inputImg[i * INPUT_IMG_WIDTH + j];
    tensorProtoBuilder.addIntVal((pixel >> 16) & 0xff);
    tensorProtoBuilder.addIntVal((pixel >> 8) & 0xff);
    tensorProtoBuilder.addIntVal((pixel) & 0xff);
    }
}
TensorProto tensorProto = tensorProtoBuilder.build();

builder.putInputs("input_tensor", tensorProto);

builder.addOutputFilter("num_detections");
builder.addOutputFilter("detection_boxes");
builder.addOutputFilter("detection_classes");
builder.addOutputFilter("detection_scores");

return builder.build();

টেনসরফ্লো সার্ভিং-এ gRPC অনুরোধ পাঠান

এখন আপনি onClick(View view) শ্রোতা শেষ করতে পারেন।

predictButton.setOnClickListener(
    new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (requestRadioGroup.getCheckedRadioButtonId() == R.id.rest) {

            }
            else {
                // TODO: gRPC request
            }
        }
    }
)
  • এই কোডটি gRPC শাখায় যোগ করুন:
try {
    Predict.PredictRequest request = createGRPCRequest();
    Predict.PredictResponse response = stub.predict(request);
    postprocessGRPCResponse(response);
} catch (Exception e) {
    Log.e(TAG, e.getMessage());
    responseTextView.setText(e.getMessage());
    return;
}

TensorFlow সার্ভিং থেকে gRPC প্রতিক্রিয়া প্রক্রিয়া করুন

gRPC-এর মতো, আপনি প্রতিক্রিয়া পরিচালনা করতে postprocessGRPCResponse postprocessGRPCResponse() ফাংশন প্রয়োগ করেন।

private void postprocessGRPCResponse(Predict.PredictResponse response) {

}
  • postprocessGRPCResponse() ফাংশনে এই কোড যোগ করুন:
// Process the response.
float numDetections = response.getOutputsMap().get("num_detections").getFloatValList().get(0);
List<Float> detectionScores =    response.getOutputsMap().get("detection_scores").getFloatValList();
int maxIndex = 0;
for (int j = 0; j < numDetections; j++) {
    maxIndex = detectionScores.get(j) > detectionScores.get(maxIndex + 1) ? j : maxIndex;
}
Float detectionClass =    response.getOutputsMap().get("detection_classes").getFloatValList().get(maxIndex);
List<Float> boundingBoxValues =    response.getOutputsMap().get("detection_boxes").getFloatValList();
float ymin = boundingBoxValues.get(maxIndex * 4);
float xmin = boundingBoxValues.get(maxIndex * 4 + 1);
float ymax = boundingBoxValues.get(maxIndex * 4 + 2);
float xmax = boundingBoxValues.get(maxIndex * 4 + 3);
displayResult(detectionClass.intValue(), ymin, xmin, ymax, xmax);

এখন পোস্টপ্রসেসিং ফাংশন প্রতিক্রিয়া থেকে পূর্বাভাসিত মান বের করতে পারে এবং UI-তে সনাক্তকরণ বাউন্ডিং বক্স রেন্ডার করতে পারে।

চালাও এটা

  1. ক্লিক execute.png নেভিগেশন মেনুতে 'অ্যাপ' চালান এবং তারপর অ্যাপটি লোড হওয়ার জন্য অপেক্ষা করুন।
  2. gRPC > রান ইনফারেন্স নির্বাচন করুন।

অ্যাপটি বিড়ালের বাউন্ডিং বক্স রেন্ডার করতে কয়েক সেকেন্ড সময় নেয় এবং বস্তুর বিভাগ হিসাবে 17 দেখায়, যা COCO ডেটাসেটে cat বিভাগের সাথে মানচিত্র করে।

8. অভিনন্দন

আপনি আপনার অ্যাপে বস্তু শনাক্ত করার ক্ষমতা যোগ করতে TensorFlow সার্ভিং ব্যবহার করেছেন!

আরও জানুন