১. ভূমিকা

সর্বশেষ হালনাগাদ: ২০২২-০৪-১১
এই কোডল্যাবে, আপনি শিখবেন কীভাবে টিচেবল মেশিন (Teachable Machine) ব্যবহার করে একটি ইমেজ ক্লাসিফিকেশন মডেলকে ট্রেইন করতে হয় এবং জাভাস্ক্রিপ্টের জন্য একটি শক্তিশালী ও নমনীয় মেশিন লার্নিং লাইব্রেরি টেনসরফ্লো.জেএস (TensorFlow.js ) ব্যবহার করে কোরাল হার্ডওয়্যার অ্যাক্সিলারেশনের মাধ্যমে এটিকে রান করতে হয়। আপনি একটি ইলেকট্রন অ্যাপ তৈরি করবেন যা একটি ওয়েবক্যাম থেকে ছবি প্রদর্শন করে এবং একটি কোরাল এজ টিপিইউ (Coral edge TPU) ব্যবহার করে সেগুলোকে ক্লাসিফাই করে। এই কোডল্যাবটির একটি সম্পূর্ণ কার্যকরী সংস্করণ sig-tfjs গিটহাব রিপো- তে পাওয়া যাবে।
আমার কি কোরাল ডিভাইস প্রয়োজন?
না। আপনি কোরাল ডিভাইস ছাড়াই এই কোডল্যাবটি চেষ্টা করতে পারেন এবং এর পরিবর্তে WebNN অ্যাক্সেলারেটর ব্যবহার করে ডেস্কটপ মেশিনেও ভালো পারফরম্যান্স পেতে পারেন।
আপনি যা তৈরি করবেন
এই কোডল্যাবে, আপনি একটি ইলেকট্রন অ্যাপ তৈরি করবেন যা ছবি শ্রেণীবদ্ধ করে। আপনার অ্যাপটি:
- ওয়েবক্যাম থেকে প্রাপ্ত ছবিগুলোকে আপনার প্রশিক্ষিত মডেলে সংজ্ঞায়িত বিভাগগুলোতে শ্রেণিবদ্ধ করে।
- পারফরম্যান্স বাড়ানোর জন্য একটি কোরাল অ্যাক্সিলারেটর ব্যবহার করে, যদি তা উপলব্ধ থাকে।
- আপনার প্ল্যাটফর্মে সমর্থিত হলে, পারফরম্যান্স বাড়ানোর জন্য WebNN ব্যবহার করে।
আপনি যা শিখবেন
- Node.js-এ TFLite মডেল চালানোর জন্য tfjs-tflite-node NPM প্যাকেজটি কীভাবে ইনস্টল ও সেট আপ করবেন।
- কোরাল ডিভাইসে মডেল চালানোর জন্য এজ টিপিইউ রানটাইম লাইব্রেরি কীভাবে ইনস্টল করবেন।
- কোরাল এজ টিপিইউ ব্যবহার করে কীভাবে মডেল ইনফারেন্সের গতি বাড়ানো যায়।
- WebNN ব্যবহার করে কীভাবে মডেল ইনফারেন্সের গতি বাড়ানো যায়।
এই কোডল্যাবটি Node.js-এ TFLite-এর উপর আলোকপাত করে। অপ্রাসঙ্গিক ধারণা এবং কোড-ব্লকগুলো সংক্ষেপে আলোচনা করা হয়েছে এবং এগুলো আপনার জন্য কেবল কপি ও পেস্ট করার সুবিধার্থে সরবরাহ করা হয়েছে।
আপনার যা যা লাগবে
এই কোডল্যাবটি সম্পন্ন করতে আপনার প্রয়োজন:
- ওয়েবক্যামসহ একটি কম্পিউটার।
- Coral-এর জন্য আমরা ডেস্কটপসহ Raspberry Pi OS (64-bit) চালিত একটি Raspberry Pi ব্যবহারের পরামর্শ দিই।
- WebNN-এর জন্য আমরা Ubuntu 20.04 অথবা Windows 10 চালিত একটি Intel x86-64 মেশিনের পরামর্শ দিই।
- Node.js সংস্করণ >= 12।
- জাভাস্ক্রিপ্ট সম্পর্কে জ্ঞান।
- (সুপারিশকৃত) মডেলটির গতি বাড়ানোর জন্য একটি কোরাল ইউএসবি অ্যাক্সিলারেটর ব্যবহার করুন।
২. প্রস্তুত হন
কোডটি নিন
এই প্রোজেক্টের জন্য আপনার প্রয়োজনীয় সমস্ত কোড আমরা একটি গিট রিপো-তে রেখেছি। কাজ শুরু করার জন্য, কোডটি নিয়ে আপনার পছন্দের ডেভ এনভায়রনমেন্টে খুলুন। এই কোডল্যাবের জন্য, আমরা ডেস্কটপ সহ রাস্পবেরি পাই ওএস (৬৪-বিট) চালিত একটি রাস্পবেরি পাই ব্যবহার করার পরামর্শ দিই। এতে কোরাল অ্যাক্সিলারেটর সংযোগ করা সহজ হয়।
জোরালোভাবে সুপারিশ করা হচ্ছে: রাস্পবেরি পাই-তে রিপোটি ক্লোন করতে গিট ব্যবহার করুন।
কোডটি পেতে, একটি নতুন টার্মিনাল উইন্ডো খুলুন এবং রিপোটি ক্লোন করুন:
git clone https://github.com/tensorflow/sig-tfjs.git
কোডল্যাবের জন্য আপনার সম্পাদনা করার প্রয়োজনীয় সমস্ত ফাইল tfjs-tflite-node-codelab ডিরেক্টরিতে ( sig-tfjs ভিতরে) রয়েছে। এই ডিরেক্টরিতে, আপনি starter_code , cpu_inference_working , coral_inference_working , এবং webnn_inference_working নামের সাবডিরেক্টরিগুলো পাবেন। এগুলো এই কোডল্যাবের ধাপগুলোর চেকপয়েন্ট।
রিপোজিটরির অন্যান্য ফাইলগুলোর মধ্যে সেই NPM প্যাকেজগুলোও রয়েছে, যেগুলোর ওপর tfjs-tflite-node-codelab নির্ভরশীল। আপনার এই ফাইলগুলোর কোনোটিই সম্পাদনা করার প্রয়োজন হবে না, তবে আপনার পরিবেশটি সঠিকভাবে সেট আপ করা হয়েছে কিনা তা নিশ্চিত করার জন্য এগুলোর কিছু টেস্ট চালাতে হবে।
Edge TPU রানটাইম লাইব্রেরি ইনস্টল করুন
কোরাল ডিভাইস ব্যবহারের পূর্বে আপনাকে এজ টিপিইউ রানটাইম লাইব্রেরি ইনস্টল করতে হবে। আপনার প্ল্যাটফর্মের জন্য দেওয়া নির্দেশাবলী অনুসরণ করে এটি ইনস্টল করুন।
লিনাক্স / রাস্পবেরি পাই-তে
লিনাক্সে, লাইব্রেরিটি গুগলের পিপিএ থেকে libedgetpu1-std নামে একটি ডেবিয়ান প্যাকেজ হিসেবে x86-64 এবং Armv8 (64-বিট) আর্কিটেকচারের জন্য পাওয়া যায়। যদি আপনার প্রসেসর ভিন্ন কোনো আর্কিটেকচার ব্যবহার করে, তবে আপনাকে এটি সোর্স থেকে কম্পাইল করতে হবে।
গুগলের কোরাল পিপিএ (Coral PPA) যুক্ত করতে এবং এজ টিপিইউ রানটাইম (Edge TPU Runtime) লাইব্রেরি ইনস্টল করতে এই কমান্ডটি চালান।
# None of this is needed on Coral boards
# This repo is needed for almost all packages below
echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list
# This repo is needed for only python3-coral-cloudiot and python3-coral-enviro
echo "deb https://packages.cloud.google.com/apt coral-cloud-stable main" | sudo tee /etc/apt/sources.list.d/coral-cloud.list
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-get update
sudo apt-get install libedgetpu1-std
উইন্ডোজ / অন্যান্য অপারেটিং সিস্টেমে
MacOS এবং Windows-এর x86-64 সংস্করণগুলোর জন্য প্রি-কম্পাইলড বাইনারি পাওয়া যায় এবং ডাউনলোড করার পর আর্কাইভের মধ্যে থাকা install.sh বা install.bat স্ক্রিপ্টটি চালিয়ে সেগুলো ইনস্টল করা যায়।
আপনার ডিভাইসটি পুনরায় চালু করুন
Edge TPU Runtime ইনস্টল হয়ে গেলে, ইনস্টলারের যোগ করা নতুন Coral Udev রুলটি সক্রিয় করতে ডিভাইসটি রিস্টার্ট করুন।
আপনার কোরাল ডিভাইসটি শনাক্ত হয়েছে কিনা তা যাচাই করুন।
আপনার Coral ডিভাইসটি শনাক্ত হয়েছে এবং কাজ করছে কিনা তা যাচাই করতে, coral-tflite-delegate প্যাকেজের জন্য ইন্টিগ্রেশন টেস্টগুলো চালান। এই প্যাকেজটি রিপোজিটরির রুট ডিরেক্টরিতে পাওয়া যায়। ইন্টিগ্রেশন টেস্টগুলো চালানোর জন্য, আপনার Coral অ্যাক্সিলারেটরটি প্লাগ ইন করুন এবং প্যাকেজের ডিরেক্টরিতে এই কমান্ডগুলো চালান:
npx yarn
npx yarn build-deps
npx yarn test-integration
আপনি এইরকম একটি আউটপুট দেখতে পাবেন:
yarn run v1.22.17
$ yarn build && yarn test-integration-dev
$ tsc
$ jasmine --config=jasmine-integration.json
Platform node has already been set. Overwriting the platform with node.
Randomized with seed 78904
Started
============================
Hi there 👋. Looks like you are running TensorFlow.js in Node.js. To speed things up dramatically, install our node backend, which binds to TensorFlow C++, by running npm i @tensorflow/tfjs-node, or npm i @tensorflow/tfjs-node-gpu if you have CUDA. Then call require('@tensorflow/tfjs-node'); (-gpu suffix for CUDA) at the start of your program. Visit https://github.com/tensorflow/tfjs-node for more details.
============================
WARNING: converting 'int32' to 'uint8'
.
1 spec, 0 failures
Finished in 2.777 seconds
Randomized with seed 78904 (jasmine --random=true --seed=78904)
Done in 6.36s.
লগগুলিতে যেমন উল্লেখ করা হয়েছে, @tensorflow/tfjs-node, কারণ আপনি মডেলটি TFLite-এ চালাবেন।
যদি আউটপুটে Encountered unresolved custom op: edgetpu-custom-op লেখাটি থাকে, তাহলে আপনার Coral ডিভাইসটি শনাক্ত করা যায়নি। নিশ্চিত করুন যে আপনি edge TPU রানটাইম লাইব্রেরি ইনস্টল করেছেন এবং Coral ডিভাইসটি আপনার কম্পিউটারে প্লাগ ইন করেছেন। আপনি Coral বাইন্ডিং-এর পাইথন সংস্করণটি পরীক্ষা করার জন্য Coral-এর 'Getting Started' গাইডটিও অনুসরণ করতে পারেন। যদি পাইথন সংস্করণটি কাজ করে কিন্তু এই পরীক্ষাগুলো তারপরও ব্যর্থ হয়, তাহলে অনুগ্রহ করে একটি বাগ রিপোর্ট দাখিল করে আমাদের জানান।
স্টার্টার কোডটি চালান
এখন আপনি স্টার্টার কোডটি চালানোর জন্য প্রস্তুত। শুরু করতে এই ধাপগুলো অনুসরণ করুন।
-
tfjs-tflite-node-codelabডিরেক্টরির অধীনেstarter_codeডিরেক্টরিতে যান। - ডিপেন্ডেন্সিগুলো ইনস্টল করতে
npm installচালান। - প্রজেক্টটি চালু করতে
npm startচালান। আপনার কম্পিউটারের ওয়েবক্যাম থেকে ভিডিও ফিড দেখানো একটি অ্যাপ চালু হবে।
আমাদের সূচনা বিন্দু কী?
আমাদের সূচনা বিন্দু হলো এই কোডল্যাবের জন্য ডিজাইন করা একটি সাধারণ ইলেকট্রন ক্যামেরা অ্যাপ। কোডল্যাবের ধারণাগুলো দেখানোর জন্য কোডটিকে সরল করা হয়েছে এবং এতে খুব কম এরর হ্যান্ডলিং রয়েছে। আপনি যদি কোনো প্রোডাকশন অ্যাপে এই কোডের কোনো অংশ পুনরায় ব্যবহার করতে চান, তবে নিশ্চিত করবেন যেন আপনি যেকোনো এরর হ্যান্ডেল করেন এবং সমস্ত কোড সম্পূর্ণরূপে পরীক্ষা করেন।

স্টার্টার কোডটি অন্বেষণ করুন
এই স্টার্টার কোডে অনেকগুলো ফাইল আছে, কিন্তু আপনাকে শুধু renderer.js ফাইলটিই এডিট করতে হবে। এটি পেজে কী কী দেখানো হবে তা নিয়ন্ত্রণ করে, যার মধ্যে ভিডিও ফিড এবং HTML এলিমেন্ট অন্তর্ভুক্ত। এখানেই আপনি আপনার অ্যাপে মেশিন লার্নিং মডেলটি যুক্ত করবেন। অন্যান্য ফাইলগুলোর মধ্যে একটি index.html ফাইলও আছে, কিন্তু এর কাজ শুধু renderer.js ফাইলটি লোড করা। এছাড়াও একটি main.js ফাইল আছে, যা Electron- এর এন্ট্রি পয়েন্ট। এটি অ্যাপের লাইফসাইকেল নিয়ন্ত্রণ করে, যার মধ্যে অ্যাপটি খোলার সময় কী দেখানো হবে এবং বন্ধ করার সময় কী করা হবে তা অন্তর্ভুক্ত। তবে, আপনাকে এতে কোনো পরিবর্তন করতে হবে না।
ডিবাগার খুলুন
এই কোডল্যাবটি অনুসরণ করার সময় আপনার অ্যাপটি ডিবাগ করার প্রয়োজন হতে পারে। যেহেতু এই অ্যাপটি ইলেকট্রন (Electron) ভিত্তিক, তাই এতে ক্রোম ডিবাগার (Chrome debugger) বিল্ট-ইন রয়েছে। বেশিরভাগ প্ল্যাটফর্মে, আপনি Ctrl + Shift + i চেপে এটি খুলতে পারেন। অ্যাপের লগ এবং ত্রুটির বার্তা দেখতে কনসোল (Console) ট্যাবে ক্লিক করুন।
এখানে আর বিশেষ কিছু অন্বেষণ করার নেই, তাই চলুন সরাসরি ইমেজ ক্লাসিফায়ারটির প্রশিক্ষণ শুরু করা যাক!
৩. একটি ইমেজ ক্লাসিফায়ারকে প্রশিক্ষণ দিন
এই অংশে, আপনি একটি কাস্টম ইমেজ ক্লাসিফিকেশন মডেলের TFLite এবং Coral সংস্করণকে প্রশিক্ষণ দেবেন।
ক্লাসিফায়ারকে প্রশিক্ষণ দিন
একটি ইমেজ ক্লাসিফায়ার ইনপুট ইমেজ গ্রহণ করে এবং সেগুলিতে লেবেল নির্ধারণ করে। এই কোডল্যাবের জন্য, আপনি আপনার ব্রাউজারে একটি মডেলকে প্রশিক্ষণ দিতে টিচেবল মেশিন ব্যবহার করবেন। এই অংশের প্রশিক্ষণ দ্রুত করার জন্য, আপনি রাস্পবেরি পাই-এর পরিবর্তে একটি ডেস্কটপ বা ল্যাপটপ কম্পিউটার ব্যবহার করতে পারেন, কিন্তু সেক্ষেত্রে আপনাকে ফলাফলস্বরূপ ফাইলগুলি পাই-তে কপি করতে হবে।
এখন আপনি একটি মডেলকে প্রশিক্ষণ দেওয়ার জন্য প্রস্তুত। আপনি যদি নিশ্চিত না হন যে কোন ধরনের মডেলকে প্রশিক্ষণ দেবেন, তাহলে একটি সহজ মডেল হলো পার্সন ডিটেক্টর, যা কেবল ফ্রেমে কোনো ব্যক্তি আছে কিনা তা শনাক্ত করে।
- একটি নতুন ট্যাবে টিচেবল মেশিন প্রশিক্ষণ পৃষ্ঠাটি খুলুন।
- ইমেজ প্রজেক্ট এবং তারপর স্ট্যান্ডার্ড ইমেজ মডেল নির্বাচন করুন।
- প্রতিটি ক্লাসের জন্য ছবির নমুনা যোগ করুন। ওয়েবক্যাম ইনপুট ব্যবহার করে এটি করা সবচেয়ে সহজ উপায়। আপনি ক্লাসগুলোর নামও পরিবর্তন করতে পারেন।
- যখন আপনি প্রতিটি ক্লাসের জন্য পর্যাপ্ত ডেটা সংগ্রহ করে ফেলবেন (সাধারণত ৫০টি নমুনাই যথেষ্ট), তখন 'Train Model' চাপুন।
মডেলটির প্রশিক্ষণ শেষ হলে, আপনি মডেলটির আউটপুটের একটি প্রিভিউ দেখতে পাবেন।

মডেলটিকে বিভিন্ন ইনপুট দিয়ে চেষ্টা করুন। যদি এমন কোনো ইনপুট খুঁজে পান যা ভুলভাবে শ্রেণীবদ্ধ করা হয়েছে, তবে সেটিকে প্রশিক্ষণ ডেটাতে যোগ করুন এবং মডেলটিকে পুনরায় প্রশিক্ষণ দিন।
- মডেলটির নির্ভুলতা নিয়ে আপনি সন্তুষ্ট হলে, ‘এক্সপোর্ট মডেল’ বাটনে ক্লিক করুন। আপনাকে মডেলটির দুটি আলাদা সংস্করণ ডাউনলোড করতে হবে।
- আপনার মডেলটিকে একটি Tensorflow Lite ফ্লোটিং পয়েন্ট মডেল হিসেবে এক্সপোর্ট করুন। এটি
converted_tflite.zipনামের একটি ফাইল ডাউনলোড করে, যা সিপিইউ-তে চলে। - আপনার মডেলটিকে একটি Tensorflow Lite EdgeTPU মডেল হিসেবে এক্সপোর্ট করুন। এটি
converted_edgetpu.zipনামের একটি ফাইল ডাউনলোড করবে যা Coral Edge TPU-তে চলে।
৪. আপনার অ্যাপে সিপিইউ মডেলটি চালান।
এখন যেহেতু আপনি একটি মডেলকে প্রশিক্ষণ দিয়েছেন, এটিকে আপনার অ্যাপে যুক্ত করার সময় এসেছে। এই অংশের শেষে, অ্যাপটি ডিভাইসের সিপিইউ ব্যবহার করে আপনার মডেলটি চালাতে সক্ষম হবে।
অ্যাপে মডেল ফাইলটি যোগ করুন
ক্লাসিফায়ারটি ট্রেইন করার সময় আপনি যে converted_tflite.zip মডেল ফাইলটি ডাউনলোড করেছিলেন, সেটি আনজিপ করুন। আর্কাইভটিতে দুটি ফাইল আছে। model_uquant.tflite হলো সেভ করা TFLite মডেল, যার মধ্যে মডেল গ্রাফ এবং ওয়েটস অন্তর্ভুক্ত রয়েছে। labels.txt মডেল দ্বারা প্রেডিক্ট করা ক্লাসগুলোর পাঠযোগ্য লেবেল রয়েছে। দুটি ফাইলই modeldirectory- তে রাখুন।
নির্ভরতা ইনস্টল করুন
একটি মডেল লোড করতে এবং ইনপুট প্রিপ্রসেস করতে TensorFlow.js থেকে কয়েকটি ডিপেন্ডেন্সি প্রয়োজন হয়:
-
tfjs-tflite-node: Node.js-এ TFLite মডেল চালানোর জন্য TensorFlow.js-এর একটি প্যাকেজ। -
@tensorflow/tfjs: TensorFlow.js-এর প্রধান প্যাকেজ।
@tensorflow/tfjs ইতিমধ্যেই ইনস্টল করা আছে, কিন্তু আপনাকে এই কমান্ডটি দিয়ে tfjs-tflite-node ইনস্টল করতে হবে:
npm install --save tfjs-tflite-node
একবার ইনস্টল হয়ে গেলে, এটি অ্যাপের renderer.js ফাইলের শীর্ষে যোগ করুন:
কোডল্যাব পর্ব ১: tfjs-tflite-node ইম্পোর্ট করুন।
const {loadTFLiteModel} = require('tfjs-tflite-node');
মডেলটি লোড করুন
এখন আপনি মডেলটি লোড করার জন্য প্রস্তুত। tfjs-tflite-node এই কাজটি করার জন্য loadTFLiteModel ফাংশনটি প্রদান করে। এটি একটি ফাইল পাথ, একটি `ArrayBuffer`, বা একটি `TFHub URL` থেকে মডেল লোড করতে পারে। আপনার মডেল এবং এর ওয়েটগুলো লোড করতে, main ফাংশনে এটি যোগ করুন:
কোডল্যাব পর্ব ১: এখানে মডেলটি লোড করুন।
const modelPath = './model/model_unquant.tflite';
const model = await loadTFLiteModel(modelPath);
const labels = fs.readFileSync('./model/labels.txt', 'utf8')
.split('\n');
মডেলটি চালান
আপনার মডেলটি চালাতে তিনটি ধাপ লাগে। প্রথমত, আপনি ওয়েবক্যাম থেকে একটি ইনপুট ফ্রেম সংগ্রহ ও প্রিপ্রসেস করেন। তারপর, সেই ফ্রেমে মডেলটি চালিয়ে একটি প্রেডিকশন পান। এরপর, সেই প্রেডিকশনটি পেজে প্রদর্শন করেন।
ওয়েবক্যাম ইনপুট প্রাক-প্রক্রিয়া করুন
বর্তমানে, ওয়েবক্যামটি কেবল একটি HTML এলিমেন্ট, এবং এটি যে ফ্রেমগুলো প্রদর্শন করে তা জাভাস্ক্রিপ্টের renderer.js ফাইলের জন্য উপলব্ধ নয়। ওয়েবক্যাম থেকে ফ্রেম নেওয়ার জন্য, TensorFlow.js tf.data.webcam প্রদান করে, যা ক্যামেরা থেকে ফ্রেম ক্যাপচার করার জন্য একটি সহজে ব্যবহারযোগ্য capture() মেথড সরবরাহ করে।
এটি ব্যবহার করতে, main() ফাংশনে এই সেটআপ কোডটি যোগ করুন:
কোডল্যাব পর্ব ১: এখানে tf.data.webcam সেট আপ করুন।
const tensorCam = await tf.data.webcam(webcam);
তারপর, প্রতি ফ্রেমে একটি ছবি তোলার জন্য, run() ফাংশনে নিম্নলিখিতটি যোগ করুন:
কোডল্যাব পর্ব ১: এখানে ওয়েবক্যাম ফ্রেম ক্যাপচার করুন।
const image = await tensorCam.capture();
মডেলের সাথে সামঞ্জস্যপূর্ণ করার জন্য আপনাকে প্রতিটি ফ্রেম প্রিপ্রসেস করতে হবে। এই কোডল্যাবে ব্যবহৃত মডেলটির ইনপুট শেপ হলো [1, 224, 224, 3], তাই এটি একটি 224 বাই 224 পিক্সেলের RGB ইমেজ আশা করে। tensorCam.capture() একটি [224, 224, 3] শেপ দেয়, তাই আপনাকে tf.expandDims ব্যবহার করে টেনসরের শুরুতে একটি অতিরিক্ত ডাইমেনশন যোগ করতে হবে। এছাড়াও, সিপিইউ মডেলটি -1 এবং 1 এর মধ্যে একটি Float32 ইনপুট আশা করে , কিন্তু ওয়েবক্যাম 0 থেকে 255 পর্যন্ত মান ক্যাপচার করে। আপনি ইনপুট টেনসরকে 127 দিয়ে ভাগ করে এর রেঞ্জ [0, 255] থেকে [0, ~2]-এ পরিবর্তন করতে পারেন এবং তারপর 1 বিয়োগ করে কাঙ্ক্ষিত রেঞ্জ [-1, ~1] পেতে পারেন। এটি করার জন্য run() ফাংশনে tf.tidy() -তে এই লাইনগুলো যোগ করুন:
কোডল্যাব পর্ব ১: এখানে ওয়েবক্যাম ফ্রেমগুলো প্রিপ্রসেস করুন।
const expanded = tf.expandDims(image, 0);
const divided = tf.div(expanded, tf.scalar(127));
const normalized = tf.sub(divided, tf.scalar(1));
টেনসর ব্যবহার করার পর সেগুলোকে ডিসপোজ করা জরুরি। tf.tidy() তার কলব্যাকে থাকা কোডের জন্য এই কাজটি স্বয়ংক্রিয়ভাবে করে, কিন্তু এটি অ্যাসিঙ্ক ফাংশন সমর্থন করে না। আপনাকে আগে তৈরি করা ইমেজ টেনসরটির dispose() মেথড কল করে ম্যানুয়ালি সেটিকে ডিসপোজ করতে হবে।
কোডল্যাব পর্ব ১: এখানে ওয়েবক্যাম ফ্রেমগুলো নিষ্পত্তি করুন।
image.dispose();
মডেলটি চালান এবং ফলাফল প্রদর্শন করুন।
প্রিপ্রসেসড ইনপুটের উপর মডেলটি চালানোর জন্য, নর্মালাইজড টেনসরের উপর model.predict() কল করুন। এটি প্রতিটি লেবেলের পূর্বাভাসিত সম্ভাবনা সম্বলিত একটি এক-মাত্রিক টেনসর রিটার্ন করে। প্রতিটি লেবেলের শতকরা সম্ভাবনা পেতে এই সম্ভাবনাকে ১০০ দিয়ে গুণ করুন এবং স্ক্রিনে মডেলের পূর্বাভাস দেখানোর জন্য স্টার্টার কোডের সাথে অন্তর্ভুক্ত showPrediction ফাংশনটি ব্যবহার করুন।
এই কোডটি model.predict চারপাশে stats.begin এবং stats.end কল ব্যবহার করে প্রেডিকশনে কত সময় লাগে তা পরিমাপ করতে stats.js- ও ব্যবহার করে।
কোডল্যাব পর্ব ১: মডেলটি চালান এবং ফলাফল এখানে প্রদর্শন করুন।
stats.begin();
const prediction = model.predict(normalized);
stats.end();
const percentage = tf.mul(prediction, tf.scalar(100));
showPrediction(percentage.dataSync(), labels);
yarn start দিয়ে অ্যাপটি আবার চালান, এবং আপনি আপনার মডেল থেকে ক্লাসিফিকেশনগুলো দেখতে পাবেন।

কর্মক্ষমতা
বর্তমান সেটআপ অনুযায়ী, মডেলটি সিপিইউ-তে চলে। এটি ডেস্কটপ কম্পিউটার এবং বেশিরভাগ ল্যাপটপের জন্য ঠিক আছে, কিন্তু যদি আপনি এটি একটি রাস্পবেরি পাই বা অন্য কোনো কম শক্তি সম্পন্ন ডিভাইসে চালান, তবে এটি কাম্য নাও হতে পারে। একটি রাস্পবেরি পাই ৪-এ, আপনি সম্ভবত প্রায় ১০ এফপিএস দেখতে পাবেন, যা কিছু অ্যাপ্লিকেশনের জন্য যথেষ্ট দ্রুত নাও হতে পারে। আরও দ্রুতগতির মেশিন ব্যবহার না করে ভালো পারফরম্যান্স পেতে, আপনি কোরাল এজ টিপিইউ (Coral Edge TPU)-এর আকারে অ্যাপ্লিকেশন-নির্দিষ্ট সিলিকন ব্যবহার করতে পারেন।
৫. আপনার অ্যাপে কোরাল মডেলটি চালান।
আপনার কাছে কোরাল ডিভাইস না থাকলে, আপনি এই অংশটি বাদ দিতে পারেন।
কোডল্যাবের এই ধাপটি গত বিভাগে আপনার লেখা কোডের উপর ভিত্তি করে তৈরি, কিন্তু আপনি যদি একেবারে নতুন করে শুরু করতে চান, তাহলে এর পরিবর্তে cpu_inference_working চেকপয়েন্টটি ব্যবহার করতে পারেন।
কোরাল মডেল চালানোর ধাপগুলো সিপিইউ মডেল চালানোর ধাপগুলোর প্রায় অনুরূপ। প্রধান পার্থক্য হলো মডেলের ফরম্যাট। যেহেতু কোরাল শুধুমাত্র uint8 টেনসর সমর্থন করে, তাই মডেলটি কোয়ান্টাইজড হয়। এটি মডেলে পাঠানো ইনপুট টেনসর এবং এর ফেরত দেওয়া আউটপুট টেনসর উভয়কেই প্রভাবিত করে। আরেকটি পার্থক্য হলো, কোরাল টিপিইউ-তে চালানোর জন্য মডেলগুলোকে এজ টিপিইউ কম্পাইলার ব্যবহার করে কম্পাইল করতে হয়। টিচেবলমেশিন এই ধাপটি ইতিমধ্যেই সম্পন্ন করেছে, কিন্তু অন্যান্য মডেলের জন্য এটি কীভাবে করতে হয় তা আপনি কোরাল ডকুমেন্টেশন থেকে শিখতে পারেন।
অ্যাপে কোরাল মডেল ফাইলটি যোগ করুন
ক্লাসিফায়ারটি ট্রেইন করার সময় আপনি যে converted_edgetpu.zip মডেল ফাইলটি ডাউনলোড করেছিলেন, সেটি আনজিপ করুন। আর্কাইভটিতে দুটি ফাইল রয়েছে। model_edgetpu.tflite হলো সংরক্ষিত TFLite মডেল, যার মধ্যে মডেল গ্রাফ এবং ওয়েটস অন্তর্ভুক্ত রয়েছে। labels.txt ফাইলে মডেল দ্বারা প্রেডিক্ট করা ক্লাসগুলোর পাঠযোগ্য লেবেল রয়েছে। মডেল ফাইলটি coral_model ডিরেক্টরিতে রাখুন।
নির্ভরতা ইনস্টল করুন
কোরাল মডেল চালানোর জন্য এজ টিপিইউ রানটাইম লাইব্রেরি প্রয়োজন। চালিয়ে যাওয়ার আগে, সেটআপ নির্দেশাবলী অনুসরণ করে এটি ইনস্টল করেছেন কিনা তা নিশ্চিত করুন।
কোরাল ডিভাইসগুলো TFLite ডেলিগেট হিসেবে অ্যাক্সেস করা হয়। জাভাস্ক্রিপ্ট থেকে এগুলো অ্যাক্সেস করতে, coral-tflite-delegate প্যাকেজটি ইনস্টল করুন:
npm install --save coral-tflite-delegate
এরপর, renderer.js ফাইলের শুরুতে এই লাইনটি যোগ করে ডেলিগেটটি ইম্পোর্ট করুন:
কোডল্যাব পর্ব ২: এখানে ডেলিগেটটি ইম্পোর্ট করুন।
const {CoralDelegate} = require('coral-tflite-delegate');
মডেলটি লোড করুন
এখন আপনি কোরাল মডেলটি লোড করার জন্য প্রস্তুত। আপনি সিপিইউ মডেলের মতোই এটি করবেন, তবে এখন কোরাল ডেলিগেট লোড করার জন্য loadTFLiteModel ফাংশনে অপশন পাস করতে হবে।
কোডল্যাব পর্ব ২: এখানে ডেলিগেট মডেলটি লোড করুন।
const coralModelPath = './coral_model/model_edgetpu.tflite';
const options = {delegates: [new CoralDelegate()]};
const coralModel = await loadTFLiteModel(coralModelPath, options);
আপনার লেবেলগুলো লোড করার প্রয়োজন নেই, কারণ সেগুলো সিপিইউ মডেলের লেবেলের মতোই।
সিপিইউ এবং কোরালের মধ্যে পরিবর্তন করার জন্য একটি বাটন যোগ করুন
আপনি আগের বিভাগে যোগ করা সিপিইউ মডেলটির পাশাপাশি কোরাল মডেলটিও যোগ করবেন। দুটো একসাথে চালালে পারফরম্যান্সের পার্থক্য বোঝা কঠিন হয়ে পড়ে, তাই একটি টগল বাটন কোরাল এবং সিপিইউ এক্সিকিউশনের মধ্যে পরিবর্তন করে।
এই কোড দিয়ে বাটনটি যোগ করুন:
কোডল্যাব পর্ব ২: এখানে ডেলিগেট বাটনটি তৈরি করুন।
let useCoralDelegate = false;
const toggleCoralButton = document.createElement('button');
function toggleCoral() {
useCoralDelegate = !useCoralDelegate;
toggleCoralButton.innerText = useCoralDelegate
? 'Using Coral. Press to switch to CPU.'
: 'Using CPU. Press to switch to Coral.';
}
toggleCoralButton.addEventListener('click', toggleCoral);
toggleCoral();
document.body.appendChild(toggleCoralButton);
চলুন এই শর্তটি run() ফাংশনে যুক্ত করি। যখন useCoralDelegate মান `false` হবে, তখন এটি সিপিইউ (CPU) সংস্করণটি চালাবে। অন্যথায়, এটি কোরাল (Coral) সংস্করণটি চালাবে (তবে আপাতত, এটি কিছুই করবে না)। সিপিইউ মডেলটি চালানোর কোডটিকে একটি `if` স্টেটমেন্টের মধ্যে রাখুন । লক্ষ্য করুন যে, `if` স্টেটমেন্ট থেকে expanded টেনসরটি বাদ দেওয়া হয়েছে, কারণ কোরাল মডেলটি এটি ব্যবহার করে।
কোডল্যাব পর্ব ২: এখানে ডেলিগেট ব্যবহার করতে হবে কিনা তা যাচাই করুন।
// NOTE: Don't just copy-paste this code into the app.
// You'll need to edit the code from the CPU section.
const expanded = tf.expandDims(image, 0);
if (useCoralDelegate) {
// CODELAB part 2: Run Coral prediction here.
} else {
const divided = tf.div(expanded, tf.scalar(127));
const normalized = tf.sub(divided, tf.scalar(1));
stats.begin();
const prediction = model.predict(normalized);
stats.end();
const percentage = tf.mul(prediction, tf.scalar(100));
showPrediction(percentage.dataSync(), labels);
}
মডেলটি চালান
মডেলটির কোরাল সংস্করণটি ০ থেকে ২৫৫ পরিসরের uint8 টেনসর গ্রহণ করে, তাই এর ইনপুটকে নর্মালাইজ করার প্রয়োজন হয় না। তবে, এর আউটপুটও ০ থেকে ২৫৫ পরিসরের একটি uint8 টেনসর। এটি প্রদর্শন করার আগে, এটিকে ০ থেকে ১০০ পরিসরের একটি float-এ রূপান্তর করতে হবে।
কোডল্যাব পর্ব ২: এখানে প্রবাল পূর্বাভাস চালান। (এটি উপরের কোড স্নিপেটের একটি অংশ)
stats.begin();
const prediction = coralModel.predict(expanded);
stats.end();
const percentage = tf.div(tf.mul(prediction, tf.scalar(100)), tf.scalar(255));
showPrediction(percentage.dataSync(), labels);
yarn start দিয়ে অ্যাপটি আবার চালান, এবং এটিতে কোরাল অ্যাক্সেলারেটর থেকে প্রাপ্ত ক্লাসিফিকেশনগুলো দেখানো উচিত।

বাটনটি চেপে আপনি কোরাল এবং সিপিইউ ইনফারেন্সের মধ্যে পরিবর্তন করতে পারেন। আপনি হয়তো লক্ষ্য করবেন যে কোরাল মডেলের কনফিডেন্স র্যাঙ্কিংগুলো সিপিইউ মডেলের চেয়ে কম নির্ভুল, এবং এগুলোর দশমিক স্থান সাধারণত জোড় সংখ্যায় শেষ হয়। কোরালে একটি কোয়ান্টাইজড মডেল চালানোর ফলে নির্ভুলতার এই ঘাটতিটি একটি আপোস। বাস্তবে এটি সাধারণত কোনো সমস্যা করে না, কিন্তু বিষয়টি মনে রাখা ভালো।
পারফরম্যান্স সম্পর্কে একটি নোট
আপনি যে ফ্রেম রেট দেখতে পান তাতে প্রিপ্রসেসিং এবং পোস্টপ্রসেসিং অন্তর্ভুক্ত থাকে, তাই এটি কোরাল হার্ডওয়্যারের সক্ষমতার সঠিক প্রতিফলন নয়। FPS মিটারে ক্লিক করে ল্যাটেন্সি (মিলিসেকেন্ডে) না দেখানো পর্যন্ত আপনি পারফরম্যান্স সম্পর্কে আরও ভালো ধারণা পেতে পারেন, যা শুধুমাত্র model.predict কলটিকে পরিমাপ করে। তবে, এতে টেনসরগুলোকে TFLite-এর নেটিভ C বাইন্ডিং-এ এবং তারপর কোরাল ডিভাইসে স্থানান্তর করার সময়ও অন্তর্ভুক্ত থাকে, তাই এটি একটি নিখুঁত পরিমাপ নয়। C++-এ লেখা আরও নির্ভুল পারফরম্যান্স বেঞ্চমার্কের জন্য EdgeTPU বেঞ্চমার্ক পৃষ্ঠাটি দেখুন।
আরও একটি বিষয় উল্লেখ্য যে, ভিডিওটি রাস্পবেরি পাই-এর পরিবর্তে একটি ল্যাপটপে রেকর্ড করা হয়েছে, তাই আপনি ভিন্ন এফপিএস দেখতে পারেন।
প্রবাল প্রাক-প্রক্রিয়াকরণের গতি বাড়ানো
কিছু ক্ষেত্রে, আপনি TFJS ব্যাকএন্ড পরিবর্তন করে প্রিপ্রসেসিং-এর গতি বাড়াতে পারেন। ডিফল্ট ব্যাকএন্ড হলো WebGL, যা বড় এবং সমান্তরালভাবে চালানো যায় এমন অপারেশনের জন্য ভালো, কিন্তু এই অ্যাপটি প্রিপ্রসেসিং পর্যায়ে তেমন কিছু করে না (এটি শুধুমাত্র expandDims অপটি ব্যবহার করে, যা প্যারালাল নয়)। ফাইলের শুরুতে ইম্পোর্টগুলোর পরে এই লাইনটি যোগ করে আপনি GPU-তে টেনসর আনা-নেওয়ার অতিরিক্ত ল্যাটেন্সি এড়াতে পারেন।
tf.setBackend(‘cpu');
এর ফলে TFLite CPU মডেলের প্যারালালাইজড প্রিপ্রসেসিংও প্রভাবিত হয়, তাই এই পরিবর্তনের কারণে মডেলটি অনেক ধীরগতিতে চলে।
৬. WebNN ব্যবহার করে সিপিইউ মডেলের গতি বৃদ্ধি করুন
যদি আপনার কাছে কোরাল অ্যাক্সেলারেটর না থাকে, অথবা আপনি যদি মডেলের গতি বাড়ানোর জন্য অন্য কোনো উপায় চেষ্টা করতে চান, তাহলে আপনি WebNN TFLite ডেলিগেট ব্যবহার করতে পারেন। এই ডেলিগেটটি ইন্টেল প্রসেসরের মধ্যে থাকা মেশিন লার্নিং হার্ডওয়্যার ব্যবহার করে OpenVINO টুলকিটের সাহায্যে মডেল ইনফারেন্সের গতি বাড়ায়। ফলস্বরূপ, এর জন্য কিছু অতিরিক্ত প্রয়োজনীয়তা রয়েছে যা এই কোডল্যাবের সেটআপ অংশে উল্লেখ করা হয়নি, এবং আপনাকে OpenVINO টুলকিট ইনস্টল করতে হবে। কাজ শুরু করার আগে সমর্থিত টার্গেট সিস্টেম প্ল্যাটফর্মগুলোর সাথে আপনার সেটআপ মিলিয়ে নিতে ভুলবেন না, তবে মনে রাখবেন যে WebNN ডেলিগেটটি এখনও macOS সমর্থন করে না।
OpenVINO টুলকিট ইনস্টল করুন
OpenVINO টুলকিট মডেলের গতি বাড়াতে ইন্টেল প্রসেসরের মধ্যে থাকা মেশিন লার্নিং হার্ডওয়্যার ব্যবহার করে। আপনি ইন্টেল থেকে একটি প্রি-কম্পাইলড সংস্করণ ডাউনলোড করতে পারেন অথবা সোর্স থেকে এটি বিল্ড করতে পারেন । OpenVINO ইনস্টল করার বিভিন্ন উপায় আছে, কিন্তু এই কোডল্যাবের জন্য আমরা আপনাকে উইন্ডোজ বা লিনাক্সের ইনস্টলার স্ক্রিপ্ট ব্যবহার করার পরামর্শ দিচ্ছি। অবশ্যই 2021.4.2 LTS রানটাইম সংস্করণটি ইনস্টল করবেন, কারণ অন্যান্য সংস্করণ সামঞ্জস্যপূর্ণ নাও হতে পারে । ইনস্টলারটি চালানোর পরে, লিনাক্স বা উইন্ডোজের ইনস্টলেশন নির্দেশাবলীতে বর্ণিত পদ্ধতি অনুযায়ী ( স্থায়ী সমাধান ), অথবা webnn-tflite-delegate ডিরেক্টরিতে অবস্থিত setupvars.sh (লিনাক্স) বা setupvars.bat (উইন্ডোজ) কমান্ড চালিয়ে আপনার শেলের এনভায়রনমেন্ট ভেরিয়েবল কনফিগার করে নিন।
WebNN ডেলিগেট কাজ করছে কিনা তা যাচাই করুন।
WebNN ডেলিগেটটি সঠিকভাবে কাজ করছে কিনা তা যাচাই করতে, রিপোজিটরির রুট ডিরেক্টরিতে থাকা webnn-tflite-delegate প্যাকেজের ইন্টিগ্রেশন টেস্টগুলো চালান। ইন্টিগ্রেশন টেস্টগুলো চালানোর জন্য, প্যাকেজের ডিরেক্টরিতে এই কমান্ডগুলো চালান:
# In webnn-tflite-delegate/
npx yarn
npx yarn test-integration
আপনি এইরকম একটি আউটপুট দেখতে পাবেন:
WebNN delegate: WebNN device set to 0.
INFO: Created TensorFlow Lite WebNN delegate for device Default and power Default.
============================
Hi there 👋. Looks like you are running TensorFlow.js in Node.js. To speed things up dramatically, install our node backend, which binds to TensorFlow C++, by running npm i @tensorflow/tfjs-node, or npm i @tensorflow/tfjs-node-gpu if you have CUDA. Then call require('@tensorflow/tfjs-node'); (-gpu suffix for CUDA) at the start of your program. Visit https://github.com/tensorflow/tfjs-node for more details.
============================
label: wine bottle
score: 0.934505045413971
.
1 spec, 0 failures
Finished in 0.446 seconds
Randomized with seed 58441 (jasmine --random=true --seed=58441)
Done in 8.07s.
আপনি যদি এই ধরনের আউটপুট দেখতে পান, তাহলে এটি একটি কনফিগারেশন ত্রুটি নির্দেশ করে:
Platform node has already been set. Overwriting the platform with node.
Randomized with seed 05938
Started
error Command failed with exit code 3221225477.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
এই আউটপুটের মানে সম্ভবত আপনি OpenVINO-এর এনভায়রনমেন্ট ভেরিয়েবল সেট করেননি। আপাতত, আপনি setupvars.sh (Linux) বা setupvars.bat (Windows) কমান্ড চালিয়ে সেগুলো সেট করতে পারেন, কিন্তু আপনি চাইলে Linux বা Windows ( স্থায়ী সমাধান ) নির্দেশাবলী অনুসরণ করে সেগুলো স্থায়ীভাবে সেট করতে পারেন। আপনি যদি Windows ব্যবহার করেন, তাহলে
setupvars.bat
এই কমান্ডটি গিট ব্যাশ (Git bash) সমর্থন করে না , তাই নিশ্চিত করুন যে আপনি এটি এবং এই কোডল্যাবের অন্যান্য কমান্ডগুলো উইন্ডোজ কমান্ড প্রম্পট থেকে চালাচ্ছেন।
WebNN ডেলিগেট ইনস্টল করুন
OpenVINO ইনস্টল করা হয়ে গেলে, আপনি এখন WebNN ব্যবহার করে সিপিইউ মডেলকে ত্বরান্বিত করার জন্য প্রস্তুত। কোডল্যাবের এই অংশটি "আপনার অ্যাপে সিপিইউ মডেল চালান" বিভাগে আপনার লেখা কোডের উপর ভিত্তি করে তৈরি। আপনি এই ধাপে আপনার লেখা কোড ব্যবহার করতে পারেন, কিন্তু যদি আপনি ইতিমধ্যেই কোরাল (Coral) বিভাগটি সম্পন্ন করে থাকেন, তাহলে তার পরিবর্তে cpu_inference_working চেকপয়েন্টটি ব্যবহার করুন, যাতে আপনি একেবারে নতুন অবস্থা থেকে শুরু করতে পারেন।
WebNN ডেলিগেটের Node.js অংশটি npmjs-এ বিতরণ করা হয়। এটি ইনস্টল করতে এই কমান্ডটি চালান:
npm install --save webnn-tflite-delegate
এরপর, renderer.js ফাইলের শুরুতে এই লাইনটি যোগ করে ডেলিগেটটি ইম্পোর্ট করুন:
কোডল্যাব পর্ব ২: এখানে ডেলিগেটটি ইম্পোর্ট করুন।
const {WebNNDelegate, WebNNDevice} = require('webnn-tflite-delegate');
WebNN ডেলিগেট সিপিইউ বা জিপিইউ-তে চলতে পারে; WebNNDevice আপনাকে কোনটি ব্যবহার করবেন তা বেছে নেওয়ার সুযোগ দেয়।
মডেলটি লোড করুন
এখন আপনি WebNN ডেলিগেট সক্রিয় করে মডেলটি লোড করার জন্য প্রস্তুত। Coral-এর জন্য আপনাকে একটি ভিন্ন মডেল ফাইল লোড করতে হতো, কিন্তু WebNN, TFLite-এর মতোই একই মডেল ফরম্যাট সমর্থন করে। এটিকে সক্রিয় করতে, মডেলে পাঠানো ডেলিগেটগুলোর তালিকায় WebNNDelegate যোগ করুন:
কোডল্যাব পর্ব ২: এখানে ডেলিগেট মডেলটি লোড করুন।
let webnnModel = await loadTFLiteModel(modelPath, {
delegates: [new WebNNDelegate({webnnDevice: WebNNDevice.DEFAULT})],
});
আপনাকে লেবেলগুলো আবার লোড করতে হবে না, কারণ এটি একই মডেল।
TfLite CPU এবং WebNN-এর মধ্যে পরিবর্তন করার জন্য একটি বাটন যোগ করুন।
এখন যেহেতু মডেলটির WebNN সংস্করণটি প্রস্তুত, WebNN এবং TfLite CPU ইনফারেন্সের মধ্যে পরিবর্তন করার জন্য একটি বাটন যোগ করুন। দুটো একসাথে চালালে পারফরম্যান্সের পার্থক্য বোঝা কঠিন হয়ে পড়ে।
এই কোড দিয়ে বাটনটি যোগ করুন (মনে রাখবেন, এটি এখনও মডেল পরিবর্তন করবে না):
কোডল্যাব পর্ব ২: এখানে ডেলিগেট বাটনটি তৈরি করুন।
let useWebNNDelegate = false;
const divElem = document.createElement('div');
const toggleWebNNButton = document.createElement('button');
function toggleWebNN() {
useWebNNDelegate = !useWebNNDelegate;
toggleWebNNButton.innerHTML = useWebNNDelegate
? 'Using WebNN. Press to switch to TFLite CPU.'
: 'Using TFLite CPU. Press to switch to WebNN.';
divElem.hidden = useWebNNDelegate ? false : true;
}
toggleWebNNButton.addEventListener('click', toggleWebNN);
toggleWebNN();
document.body.appendChild(toggleWebNNButton);
document.body.appendChild(divElem);
এই কোডটি একটি div এলিমেন্টও যোগ করে, যা আপনি পরবর্তী বিভাগে WebNN সেটিংস কনফিগার করতে ব্যবহার করবেন।
WebNN ডিভাইসগুলির মধ্যে পরিবর্তন করার জন্য একটি ড্রপডাউন যোগ করুন
WebNN সিপিইউ এবং জিপিইউ-তে চলতে পারে, তাই এগুলোর মধ্যে পরিবর্তন করার জন্য একটি ড্রপডাউন যোগ করুন। বাটন তৈরির কোডের পরে এই কোডটি যোগ করুন:
// Create elements for WebNN device selection
divElem.innerHTML = '<br/>WebNN Device: ';
const selectElem = document.createElement('select');
divElem.appendChild(selectElem);
const webnnDevices = ['Default', 'GPU', 'CPU'];
// append the options
for (let i = 0; i < webnnDevices.length; i++) {
var optionElem = document.createElement('option');
optionElem.value = i;
optionElem.text = webnnDevices[i];
selectElem.appendChild(optionElem);
}
এখন, আপনি অ্যাপটি চালালে একটি ড্রপডাউন দেখতে পাবেন যেখানে ডিফল্ট, জিপিইউ এবং সিপিইউ-এর তালিকা রয়েছে। এগুলোর মধ্যে থেকে কোনো একটি বেছে নিলেও এই মুহূর্তে কিছু হবে না, কারণ ড্রপডাউনটি এখনও সংযুক্ত করা হয়নি। 
ড্রপডাউনটি ডিভাইস পরিবর্তন করতে দিন
কোন WebNN ডিভাইস ব্যবহৃত হবে তা পরিবর্তন করার জন্য ড্রপডাউনটিকে সংযুক্ত করতে, ড্রপডাউন সিলেক্টর এলিমেন্টের চেঞ্জ ইভেন্টে একটি লিসেনার যোগ করুন। যখন নির্বাচিত মান পরিবর্তিত হবে, তখন ডেলিগেট অপশনগুলিতে সংশ্লিষ্ট WebNN ডিভাইসটি নির্বাচন করে WebNN মডেলটি পুনরায় তৈরি করুন।
যে কোডটি ড্রপডাউন যোগ করেছে, তার পরে নিম্নলিখিত কোডটি যোগ করুন:
selectElem.addEventListener('change', async () => {
let webnnDevice;
switch(selectElem.value) {
case '1':
webnnDevice = WebNNDevice.GPU;
break;
case '2':
webnnDevice = WebNNDevice.CPU;
break;
default:
webnnDevice = WebNNDevice.DEFAULT;
break;
}
webnnModel = await loadTFLiteModel(modelPath, {
delegates: [new WebNNDelegate({webnnDevice})],
});
});
এই পরিবর্তনের ফলে, ড্রপডাউনটি প্রতিবার পরিবর্তন করার সাথে সাথে সঠিক সেটিংস সহ একটি নতুন মডেল তৈরি করে। এখন WebNN মডেলটিকে সংযুক্ত করে ইনফারেন্সের জন্য ব্যবহার করার পালা।
WebNN মডেলটি চালান
WebNN মডেলটি ব্যবহারের জন্য প্রস্তুত, কিন্তু WebNN এবং TfLite CPU-এর মধ্যে পরিবর্তন করার বাটনটি এখনও মডেল পরিবর্তন করে না। মডেল পরিবর্তন করতে হলে, কোডল্যাবের প্রথম অংশে TfLite CPU মডেলটি লোড করার সময়কার model ভেরিয়েবলটির নাম প্রথমে পরিবর্তন করতে হবে।
নিম্নলিখিত লাইনটি পরিবর্তন করুন...
const model = await loadTFLiteModel(modelPath);
...যাতে এটি এই লাইনের সাথে মিলে যায়।
const cpuModel = await loadTFLiteModel(modelPath);
model ভেরিয়েবলটির নাম পরিবর্তন করে cpuModel রাখার পর, বাটনের অবস্থার উপর ভিত্তি করে সঠিক মডেলটি বেছে নিতে run ফাংশনে এটি যোগ করুন:
কোডল্যাব পর্ব ২: এখানে ডেলিগেট ব্যবহার করতে হবে কিনা তা যাচাই করুন।
let model;
if (useWebNNDelegate) {
model = webnnModel;
} else {
model = cpuModel;
}
এখন, আপনি যখন অ্যাপটি চালাবেন, বাটনটি TfLite CPU এবং WebNN-এর মধ্যে পরিবর্তন করবে। 
আপনার যদি একটি ইন্টিগ্রেটেড ইন্টেল জিপিইউ থাকে, তবে আপনি WebNN-এর সিপিইউ এবং জিপিইউ ইনফারেন্সের মধ্যে পরিবর্তনও করতে পারবেন।
পারফরম্যান্স সম্পর্কে একটি নোট
আপনি যে ফ্রেম রেটটি দেখতে পাচ্ছেন তাতে প্রিপ্রসেসিং এবং পোস্টপ্রসেসিং অন্তর্ভুক্ত থাকে, তাই এটি WebNN-এর সক্ষমতার সঠিক প্রতিফলন নয়। FPS মিটারে ক্লিক করে ল্যাটেন্সি (মিলিসেকেন্ডে) না দেখানো পর্যন্ত আপনি পারফরম্যান্স সম্পর্কে আরও ভালো ধারণা পেতে পারেন, যা শুধুমাত্র model.predict কল করার সময়কে পরিমাপ করে। তবে, এতে Tensors-গুলোকে TFLite-এর নেটিভ C বাইন্ডিং-এ স্থানান্তর করার সময়ও অন্তর্ভুক্ত থাকে, তাই এটি একটি নিখুঁত পরিমাপ নয়।
৭. অভিনন্দন
অভিনন্দন! আপনি এইমাত্র Electron-এ tfjs-tflite-node ব্যবহার করে আপনার সর্বপ্রথম Coral / WebNN প্রজেক্টটি সম্পন্ন করেছেন।
এটি ব্যবহার করে দেখুন এবং বিভিন্ন ধরনের ছবিতে পরীক্ষা করুন। এছাড়াও, সম্পূর্ণ ভিন্ন কিছু শ্রেণীবদ্ধ করার জন্য আপনি টিচেবলমেশিনে একটি নতুন মডেলকে প্রশিক্ষণ দিতে পারেন।
পুনরালোচনা
এই কোডল্যাবে আপনি শিখেছেন:
- Node.js-এ TFLite মডেল চালানোর জন্য tfjs-tflite-node npm প্যাকেজটি কীভাবে ইনস্টল ও সেট আপ করবেন।
- কোরাল ডিভাইসে মডেল চালানোর জন্য এজ টিপিইউ রানটাইম লাইব্রেরি কীভাবে ইনস্টল করবেন।
- কোরাল এজ টিপিইউ ব্যবহার করে কীভাবে মডেল ইনফারেন্সের গতি বাড়ানো যায়।
- WebNN ব্যবহার করে কীভাবে মডেল ইনফারেন্সের গতি বাড়ানো যায়।
এরপর কী?
এখন যেহেতু আপনার কাছে কাজ শুরু করার জন্য একটি কার্যকরী ভিত্তি আছে, এই মেশিন লার্নিং মডেল রানারটিকে আপনার বাস্তব জীবনের কোনো ব্যবহারের ক্ষেত্রে প্রসারিত করার জন্য আপনি কী কী সৃজনশীল ধারণা নিয়ে আসতে পারেন? হতে পারে আপনি দ্রুত এবং সাশ্রয়ী ইনফারেন্সের মাধ্যমে আপনার কর্মক্ষেত্রে বৈপ্লবিক পরিবর্তন আনতে পারেন, অথবা হতে পারে আপনি একটি টোস্টারকে এমনভাবে পরিবর্তন করতে পারেন যাতে রুটি দেখতে ঠিকঠাক মনে হলে এটি টোস্ট করা বন্ধ করে দেয়। সম্ভাবনা অফুরন্ত।
আপনি যে মডেলটি ব্যবহার করেছেন, TeachableMachine কীভাবে সেটিকে প্রশিক্ষণ দিয়েছে সে সম্পর্কে আরও বিস্তারিত জানতে, আমাদের ট্রান্সফার লার্নিং (Transfer Learning) কোডল্যাবটি দেখুন। আপনি যদি কোরাল (Coral)-এর সাথে কাজ করে এমন অন্যান্য মডেল, যেমন স্পিচ রিকগনিশন (speech recognition) এবং পোজ এস্টিমেশন (pose estimation) খুঁজে থাকেন, তবে coral.ai/models দেখুন। এছাড়াও আপনি TensorFlow Hub- এ সেই মডেলগুলোর এবং আরও অনেক মডেলের সিপিইউ (CPU) সংস্করণ খুঁজে পেতে পারেন।
আপনি যা তৈরি করেন তা আমাদের সাথে শেয়ার করুন
আপনি আজ যা তৈরি করেছেন তা সহজেই অন্যান্য সৃজনশীল কাজেও ব্যবহার করতে পারেন এবং আমরা আপনাকে গতানুগতিক চিন্তাধারার বাইরে ভাবতে ও নতুন কিছু উদ্ভাবন চালিয়ে যেতে উৎসাহিত করি।
আপনার প্রজেক্টটি আমাদের টেনসরফ্লো ব্লগে বা ভবিষ্যতের কোনো অনুষ্ঠানে প্রদর্শিত হওয়ার সুযোগ পেতে, #MadeWithTFJS হ্যাশট্যাগটি ব্যবহার করে সোশ্যাল মিডিয়ায় আমাদের ট্যাগ করতে ভুলবেন না। আপনি কী তৈরি করেন তা দেখার জন্য আমরা অধীর আগ্রহে অপেক্ষা করছি।