১. ভূমিকা
আপনি যা তৈরি করবেন
এই কোডল্যাবে, আমরা SparkFun Edge Development Board- এ একটি ডিপ লার্নিং মডেল চালানোর জন্য TensorFlow Lite For Microcontrollers ব্যবহার করতে শিখব। আমরা বোর্ডটির বিল্ট-ইন স্পিচ ডিটেকশন মডেল নিয়ে কাজ করব, যেটি বোর্ডের দুটি মাইক্রোফোনের মাধ্যমে বলা 'yes' এবং 'no' শব্দ দুটি শনাক্ত করতে একটি কনভল্যুশনাল নিউরাল নেটওয়ার্ক ব্যবহার করে।

মাইক্রোকন্ট্রোলারে মেশিন লার্নিং
মেশিন লার্নিং ব্যবহার করে এমন সব বুদ্ধিমান টুল তৈরি করা যায় যা ব্যবহারকারীদের জীবনকে সহজ করে তোলে, যেমন গুগল অ্যাসিস্ট্যান্ট । কিন্তু প্রায়শই, এই অভিজ্ঞতাগুলোর জন্য প্রচুর কম্পিউটেশন বা রিসোর্সের প্রয়োজন হয়, যার মধ্যে একটি শক্তিশালী ক্লাউড সার্ভার বা ডেস্কটপ অন্তর্ভুক্ত থাকতে পারে। তবে, এখন মাইক্রোকন্ট্রোলারের মতো ক্ষুদ্র ও কম শক্তি-চালিত হার্ডওয়্যারেও মেশিন লার্নিং ইনফারেন্স চালানো সম্ভব।
মাইক্রোকন্ট্রোলার অত্যন্ত সহজলভ্য, সস্তা, খুব কম শক্তি খরচ করে এবং খুবই নির্ভরযোগ্য। এগুলো নানা ধরনের গৃহস্থালি যন্ত্রপাতির অংশ: যেমন অ্যাপ্লায়েন্স, গাড়ি এবং খেলনা। প্রকৃতপক্ষে, প্রতি বছর প্রায় ৩০ বিলিয়ন মাইক্রোকন্ট্রোলার-চালিত ডিভাইস উৎপাদিত হয়।

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

TensorFlow হলো মডেল প্রশিক্ষণ এবং চালানোর জন্য গুগলের একটি ওপেন সোর্স মেশিন লার্নিং ফ্রেমওয়ার্ক। TensorFlow Lite হলো একটি সফটওয়্যার ফ্রেমওয়ার্ক, যা TensorFlow-এর একটি অপ্টিমাইজড সংস্করণ এবং এটি মোবাইল ফোনের মতো ছোট ও তুলনামূলকভাবে কম শক্তিশালী ডিভাইসে টেনসরফ্লো মডেল চালানোর জন্য তৈরি করা হয়েছে।
মাইক্রোকন্ট্রোলারের জন্য টেনসরফ্লো লাইট হলো একটি সফটওয়্যার ফ্রেমওয়ার্ক, যা টেনসরফ্লো-এর একটি অপ্টিমাইজড সংস্করণ। এটি মাইক্রোকন্ট্রোলারের মতো ক্ষুদ্র ও কম শক্তি-চালিত হার্ডওয়্যারে টেনসরফ্লো মডেল চালানোর জন্য তৈরি করা হয়েছে। এটি এই ধরনের এমবেডেড পরিবেশে প্রয়োজনীয় সীমাবদ্ধতাগুলো মেনে চলে; যেমন—এর বাইনারি ফাইলের আকার ছোট, এবং এর জন্য অপারেটিং সিস্টেমের সমর্থন, কোনো স্ট্যান্ডার্ড C বা C++ লাইব্রেরি, বা ডাইনামিক মেমরি অ্যালোকেশন ইত্যাদির প্রয়োজন হয় না।
স্পার্কফান এজ (হার্ডওয়্যার)
স্পার্কফান এজ হলো একটি মাইক্রোকন্ট্রোলার-ভিত্তিক প্ল্যাটফর্ম: একটিমাত্র সার্কিট বোর্ডের উপর থাকা একটি ক্ষুদ্র কম্পিউটার। এতে একটি প্রসেসর, মেমরি এবং আই/ও হার্ডওয়্যার রয়েছে, যা এটিকে অন্যান্য ডিভাইসে ডিজিটাল সংকেত পাঠাতে ও গ্রহণ করতে সক্ষম করে। এতে আপনার প্রিয় গুগল রঙের চারটি সফটওয়্যার-নিয়ন্ত্রণযোগ্য এলইডি রয়েছে।

কম্পিউটারের মতো মাইক্রোকন্ট্রোলারে কোনো অপারেটিং সিস্টেম চলে না। এর পরিবর্তে, আপনার লেখা প্রোগ্রামগুলো সরাসরি হার্ডওয়্যারে চলে। আপনি কম্পিউটারে আপনার কোড লেখেন এবং প্রোগ্রামার নামক একটি ডিভাইসের মাধ্যমে তা মাইক্রোকন্ট্রোলারে ডাউনলোড করেন।
মাইক্রোকন্ট্রোলার শক্তিশালী কম্পিউটার নয়। এগুলোতে ছোট প্রসেসর এবং খুব কম মেমরি থাকে। কিন্তু এগুলোকে যথাসম্ভব সহজভাবে ডিজাইন করা হয় বলে, একটি মাইক্রোকন্ট্রোলার খুব কম শক্তি ব্যবহার করতে পারে। আপনার প্রোগ্রাম কী কাজ করে তার উপর নির্ভর করে, SparkFun Edge একটিমাত্র কয়েন সেল ব্যাটারিতে সপ্তাহখানেক চলতে পারে!
আপনি যা শিখবেন
- আপনার কম্পিউটারে SparkFun Edge-এর জন্য নমুনা প্রোগ্রামটি কম্পাইল করুন।
- আপনার ডিভাইসে প্রোগ্রামটি স্থাপন করুন।
- প্রোগ্রামটিতে পরিবর্তন আনুন এবং এটি পুনরায় স্থাপন করুন।
আপনার যা যা লাগবে
আপনার নিম্নলিখিত হার্ডওয়্যারগুলির প্রয়োজন হবে:
- লিনাক্স বা ম্যাকওএস কম্পিউটার
- স্পার্কফান এজ বোর্ড
- স্পার্কফান ইউএসবি-সি সিরিয়াল বেসিক প্রোগ্রামার
- ইউএসবি-সি থেকে ইউএসবি-এ ক্যাবল (যদি আপনার কম্পিউটার ইউএসবি-সি পোর্টের হয়, তবে এর পরিবর্তে ইউএসবি-সি থেকে ইউএসবি-সি ক্যাবল নিন)
- প্রোগ্রামার এবং ক্যাবল ছাড়াই ইনফারেন্স চালানোর জন্য (ঐচ্ছিক) ৩ ভোল্ট ২০ মিমি কয়েন সেল লিথিয়াম ব্যাটারি (CR2032)।
আপনার নিম্নলিখিত সফটওয়্যারগুলোর প্রয়োজন হবে:
- গিট (কমান্ড লাইনে
gitচালিয়ে দেখে নিন এটি ইনস্টল করা আছে কিনা) - পাইথন ৩ (কমান্ড লাইনে
python3অথবাpython --versionচালিয়ে ইনস্টল করা আছে কিনা তা যাচাই করুন) - পাইথন ৩-এর জন্য পিপ ( স্ট্যাকওভারফ্লো-এর একটি সহায়ক উত্তর )
- Make 4.2.1 বা উচ্চতর সংস্করণ (কমান্ড লাইনে
make --versionচালিয়ে এটি ইনস্টল করা আছে কিনা তা পরীক্ষা করুন) - স্পার্কফান সিরিয়াল বেসিক ড্রাইভার
২. আপনার হার্ডওয়্যার সেট আপ করুন
SparkFun Edge মাইক্রোকন্ট্রোলারে আগে থেকে একটি বাইনারি ইনস্টল করা থাকে যা স্পিচ মডেলটি চালাতে পারে। আমাদের নিজস্ব সংস্করণ দিয়ে এটিকে ওভাররাইট করার আগে, চলুন প্রথমে এই মডেলটি চালিয়ে দেখি।
আপনার বোর্ডকে শক্তি দিন:
- বোর্ডের পিছনের ব্যাটারি কানেক্টরে একটি কয়েন সেল ব্যাটারি প্রবেশ করান (ব্যাটারির "+" দিকটি উপরের দিকে রেখে। যদি আপনার বোর্ডে আগে থেকেই ব্যাটারি লাগানো থাকে, তাহলে প্লাস্টিকের ট্যাবটি টেনে বের করুন এবং ব্যাটারিটি পুরোপুরি ঢুকেছে কিনা তা নিশ্চিত করতে চাপ দিন)।

- আপনার কাছে কয়েন ব্যাটারি না থাকলে, বোর্ডটিকে শক্তি জোগাতে আপনি SparkFun USB-C Serial Basic প্রোগ্রামার ডিভাইসটি ব্যবহার করতে পারেন। এই ডিভাইসটি আপনার বোর্ডের সাথে সংযুক্ত করতে, নিম্নলিখিত ধাপগুলো অনুসরণ করুন:
- SparkFun Edge-এর পাশে ছয় পিনের হেডারটি খুঁজুন।
- SparkFun USB-C Serial Basic-টি এই পিনগুলোতে প্লাগ করুন এবং নিশ্চিত করুন যেন প্রতিটি ডিভাইসের "BLK" ও "GRN" লেবেলযুক্ত পিনগুলো সঠিকভাবে সারিবদ্ধ থাকে।
- SparkFun USB-C Serial Basic এবং আপনার কম্পিউটারের মধ্যে একটি USB-C কেবল সংযোগ করুন।

একবার ব্যাটারি ঢুকিয়ে বা ইউএসবি প্রোগ্রামার সংযোগ করে আপনার বোর্ডে পাওয়ার দিলে, বোর্ডটি সচল হয়ে উঠবে এবং এর মাইক্রোফোন দিয়ে শোনা শুরু করবে। নীল আলোটি জ্বলতে-নিভতে শুরু করবে।
বোর্ডের মেশিন লার্নিং মডেলটিকে 'হ্যাঁ' এবং 'না' শব্দ দুটি চিনতে এবং কথার উপস্থিতি ও অনুপস্থিতি শনাক্ত করতে প্রশিক্ষণ দেওয়া হয়েছে। এটি রঙিন এলইডি জ্বালিয়ে এর ফলাফল জানায়। নিচের সারণিতে প্রতিটি এলইডি রঙের অর্থ দেখানো হলো:
সনাক্তকরণের ফলাফল | এলইডি রঙ |
"হ্যাঁ" | হলুদ |
"না" | লাল |
অজানা বক্তৃতা | সবুজ |
কোনো বক্তব্য শনাক্ত করা যায়নি | কোন এলইডি জ্বলেনি |
চেষ্টা করে দেখুন
বোর্ডটি আপনার মুখের কাছে ধরুন এবং কয়েকবার "হ্যাঁ" বলুন। আপনি হলুদ এলইডি-টি জ্বলতে-নিভতে দেখবেন। "হ্যাঁ" বলার পরেও যদি কিছু না ঘটে, তাহলে এই উপায়গুলো চেষ্টা করে দেখতে পারেন:
- বোর্ডটি আপনার মুখ থেকে প্রায় ১০ ইঞ্চি দূরে ধরুন।
- অতিরিক্ত পারিপার্শ্বিক কোলাহল এড়িয়ে চলুন
- দ্রুত পরপর কয়েকবার 'হ্যাঁ' বলুন (যেমন 'হ্যাঁ হ্যাঁ হ্যাঁ' বলার চেষ্টা করুন)।
৩. আপনার সফ্টওয়্যার সেট আপ করুন
এখন আমরা নিজেরাই মাইক্রোকন্ট্রোলারে স্পিচ মডেলটি ডাউনলোড, ইনস্টল এবং রান করব। এর জন্য, প্রথমে আমরা এই প্রোগ্রামটির সোর্স কোড এবং এটি বিল্ড করার জন্য প্রয়োজনীয় ডিপেন্ডেন্সিগুলো ডাউনলোড করব। প্রোগ্রামটি C++ ভাষায় লেখা, যা বোর্ডে ডাউনলোড করার আগে অবশ্যই একটি বাইনারিতে কম্পাইল করতে হবে। বাইনারি হলো এমন একটি ফাইল, যাতে প্রোগ্রামটি এমন একটি ফর্মে থাকে যা SparkFun Edge হার্ডওয়্যার দ্বারা সরাসরি চালানো যায়।
নিম্নলিখিত নির্দেশাবলী লিনাক্স বা ম্যাকওএস-এর জন্য লেখা হয়েছে।
TensorFlow রিপোটি ডাউনলোড করুন
কোডটি গিটহাবের টেনসরফ্লো রিপোজিটরিতে নিম্নলিখিত স্থানে পাওয়া যাবে:
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/micro
আপনার কম্পিউটারে একটি টার্মিনাল খুলুন, সেই ডিরেক্টরিতে যান যেখানে আপনি সাধারণত কোডিং প্রজেক্টগুলো সংরক্ষণ করেন, TensorFlow রিপোজিটরিটি ডাউনলোড করুন এবং তৈরি হওয়া ডিরেক্টরিতে প্রবেশ করুন, যেমনটি নিচে দেখানো হয়েছে:
cd ~ # change into your home (or any other) directory git clone --depth 1 https://github.com/tensorflow/tensorflow.git cd tensorflow
পাইথন নির্ভরতা ডাউনলোড করুন
আমরা আমাদের বাইনারি প্রস্তুত করতে এবং ডিভাইসে ফ্ল্যাশ করতে পাইথন ৩ ব্যবহার করব। পাইথন স্ক্রিপ্টগুলো নির্দিষ্ট কিছু লাইব্রেরির প্রাপ্যতার উপর নির্ভরশীল। এই নির্ভরতাগুলো ইনস্টল করতে নিম্নলিখিত কমান্ডটি চালান:
pip3 install pycrypto pyserial --user
৪. বাইনারিটি তৈরি ও প্রস্তুত করুন
আমরা বাইনারিটি তৈরি করব এবং ডিভাইসে ডাউনলোডের জন্য এটিকে প্রস্তুত করতে কমান্ডগুলো চালাব।
বাইনারি তৈরি করুন
প্রয়োজনীয় সকল ডিপেন্ডেন্সি ডাউনলোড করতে এবং বাইনারি তৈরি করতে, নিম্নলিখিত কমান্ডটি চালান:
make -f tensorflow/lite/micro/tools/make/Makefile TARGET=sparkfun_edge micro_speech_bin
বিল্ড সফলভাবে সম্পন্ন হলে, আউটপুটের শেষ লাইনটি নিম্নরূপ দেখাবে:
arm-none-eabi-objcopy tensorflow/lite/micro/tools/make/gen/sparkfun_edge_cortex-m4/bin/micro_speech tensorflow/lite/micro/tools/make/gen/sparkfun_edge_cortex-m4/bin/micro_speech.bin -O binary
বাইনারিটি সফলভাবে তৈরি হয়েছে কিনা তা নিশ্চিত করতে, নিম্নলিখিত কমান্ডটি চালান:
test -f \ tensorflow/lite/micro/tools/make/gen/sparkfun_edge_cortex-m4/bin/micro_speech.bin && \ echo "Binary was successfully created" || echo "Binary is missing"
আপনি কনসোলে Binary was successfully created লেখাটি দেখতে পাবেন! যদি দেখেন Binary is missing , তাহলে বিল্ড প্রক্রিয়ায় কোনো সমস্যা হয়েছে, যার জন্য ডিবাগিংয়ের প্রয়োজন হবে।
বাইনারি প্রস্তুত করুন
ডিভাইসে স্থাপন করার জন্য বাইনারিটিকে অবশ্যই ক্রিপ্টোগ্রাফিক কী দিয়ে স্বাক্ষর করতে হবে। আমরা এখন কিছু কমান্ড চালাব যা আমাদের বাইনারিটিকে স্বাক্ষর করবে, যাতে এটি SparkFun Edge-এ ডাউনলোড করা যায়।
ডেভেলপমেন্টের জন্য ব্যবহারযোগ্য কিছু ডামি ক্রিপ্টোগ্রাফিক কী সেট আপ করতে নিম্নলিখিত কমান্ডটি প্রবেশ করান:
cp tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/keys_info0.py tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/keys_info.py
এখন, একটি স্বাক্ষরিত বাইনারি তৈরি করতে নিম্নলিখিত কমান্ডটি চালান:
python3 tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/create_cust_image_blob.py \ --bin tensorflow/lite/micro/tools/make/gen/sparkfun_edge_cortex-m4/bin/micro_speech.bin \ --load-address 0xC000 \ --magic-num 0xCB \ -o main_nonsecure_ota \ --version 0x0
এটি main_nonsecure_ota.bin ফাইলটি তৈরি করবে। এখন আমরা ফাইলটির একটি চূড়ান্ত সংস্করণ তৈরি করতে আরেকটি কমান্ড চালাব, যা দিয়ে পরবর্তী ধাপে ব্যবহৃত বুটলোডার স্ক্রিপ্টটি আমাদের ডিভাইসে ফ্ল্যাশ করা যাবে:
python3 tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/create_cust_wireupdate_blob.py \ --load-address 0x20000 \ --bin main_nonsecure_ota.bin \ -i 6 \ -o main_nonsecure_wire \ --options 0x1
আপনি যে ডিরেক্টরিতে কমান্ডগুলো চালিয়েছেন, সেখানে এখন main_nonsecure_wire.bin নামের একটি ফাইল থাকার কথা। এই ফাইলটিই আমরা ডিভাইসে ফ্ল্যাশ করব।
৫. বাইনারি ফ্ল্যাশ করার জন্য প্রস্তুত হন।
কী ঝলকাচ্ছে?
SparkFun Edge বর্তমানে চলমান প্রোগ্রামটিকে তার ৫১২ কিলোবাইট ফ্ল্যাশ মেমরিতে সংরক্ষণ করে। যদি আমরা বোর্ডটিকে দিয়ে একটি নতুন প্রোগ্রাম চালাতে চাই, তবে সেটি বোর্ডে পাঠাতে হয়, যা ফ্ল্যাশ মেমরিতে প্রোগ্রামটি সংরক্ষণ করে এবং পূর্বে সংরক্ষিত যেকোনো প্রোগ্রামকে মুছে দেয়।
এই প্রক্রিয়াটিকে 'ফ্ল্যাশিং' বলা হয়, এবং আমরা আমাদের প্রোগ্রামটি বোর্ডে পাঠানোর জন্য এটি ব্যবহার করব।
প্রোগ্রামারটিকে বোর্ডের সাথে সংযুক্ত করুন।
বোর্ডে নতুন প্রোগ্রাম ডাউনলোড করার জন্য আমরা SparkFun USB-C Serial Basic সিরিয়াল প্রোগ্রামারটি ব্যবহার করব। এই ডিভাইসটি আপনার কম্পিউটারকে USB-এর মাধ্যমে মাইক্রোকন্ট্রোলারের সাথে যোগাযোগ করতে দেয়।
এই ডিভাইসটি আপনার বোর্ডে সংযুক্ত করতে, নিম্নলিখিত ধাপগুলো অনুসরণ করুন:
- SparkFun Edge-এর পাশে ছয় পিনের হেডারটি খুঁজুন।
- SparkFun USB-C Serial Basic-টি এই পিনগুলোতে প্লাগ করুন এবং নিশ্চিত করুন যেন প্রতিটি ডিভাইসের "BLK" ও "GRN" লেবেলযুক্ত পিনগুলো সঠিকভাবে সারিবদ্ধ থাকে।

প্রোগ্রামারটি আপনার কম্পিউটারের সাথে সংযুক্ত করুন।
আমরা বোর্ডটি ইউএসবি-র মাধ্যমে আপনার কম্পিউটারের সাথে সংযুক্ত করব। বোর্ডটি প্রোগ্রাম করার জন্য, আপনার কম্পিউটার ডিভাইসটিকে যে নামটি দেয়, তা আমাদের জানতে হবে। এটি করার সবচেয়ে ভালো উপায় হলো, বোর্ডটি সংযুক্ত করার আগে ও পরে কম্পিউটারের সমস্ত ডিভাইসের একটি তালিকা তৈরি করা এবং নতুন ডিভাইসটি কোনটি তা খুঁজে বের করা।
USB-এর মাধ্যমে ডিভাইসটি সংযুক্ত করার আগে , নিম্নলিখিত কমান্ডটি চালান:
If you are using Linux: ls /dev/tty* If you are using MacOS: ls /dev/cu*
এর ফলে সংযুক্ত ডিভাইসগুলির একটি তালিকা আউটপুট হিসেবে পাওয়া যাবে, যা দেখতে অনেকটা নিচের মতো হবে:
/dev/cu.Bluetooth-Incoming-Port /dev/cu.MALS /dev/cu.SOC
এখন, প্রোগ্রামারটি আপনার কম্পিউটারের ইউএসবি পোর্টে সংযুক্ত করুন। নিচের কমান্ডটি আবার প্রবেশ করান:
If you are using Linux: ls /dev/tty* If you are using MacOS: ls /dev/cu*
আউটপুটে আপনি একটি অতিরিক্ত আইটেম দেখতে পাবেন, যেমনটি নিচের উদাহরণে দেখানো হয়েছে। আপনার নতুন আইটেমটির নাম ভিন্ন হতে পারে। এই নতুন আইটেমটিই হলো ডিভাইসটির নাম।
/dev/cu.Bluetooth-Incoming-Port /dev/cu.MALS /dev/cu.SOC /dev/cu.wchusbserial-1450
প্রথমে, ডিভাইসের নাম শনাক্ত করার জন্য আমরা একটি এনভায়রনমেন্ট ভেরিয়েবল তৈরি করব:
export DEVICENAME=put your device name here
এরপরে, আমরা বাউড রেট নির্দিষ্ট করার জন্য একটি এনভায়রনমেন্ট ভেরিয়েবল তৈরি করব, যা হলো সেই গতি যেটিতে ডিভাইসে ডেটা পাঠানো হবে:
export BAUD_RATE=921600
৬. বাইনারিটি ফ্ল্যাশ করুন
আপনার বোর্ড ফ্ল্যাশ করতে স্ক্রিপ্টটি চালান।
বোর্ডটি ফ্ল্যাশ করার জন্য, এটিকে একটি বিশেষ 'বুটলোডার' অবস্থায় আনতে হবে, যা এটিকে নতুন বাইনারি গ্রহণ করার জন্য প্রস্তুত করে। এরপর আমরা বোর্ডে বাইনারিটি পাঠানোর জন্য একটি স্ক্রিপ্ট চালাব।
চলুন বোর্ডের নিম্নলিখিত বাটনগুলোর সাথে পরিচিত হয়ে নিই:

বোর্ডটি রিসেট এবং ফ্ল্যাশ করতে নিম্নলিখিত ধাপগুলো অনুসরণ করুন:
- নিশ্চিত করুন যে আপনার বোর্ডটি প্রোগ্রামারের সাথে এবং সম্পূর্ণ সেটআপটি ইউএসবি-র মাধ্যমে আপনার কম্পিউটারের সাথে সংযুক্ত আছে।
- বোর্ডে
14চিহ্নিত বোতামটি চেপে ধরুন । ধাপ ৬ পর্যন্ত এটি চেপে ধরে রাখুন। - বোর্ডটিকে বুটলোডার অবস্থায় রিসেট করার জন্য,
14চিহ্নিত বাটনটি চেপে ধরে রেখেRSTচিহ্নিত বাটনটিতে ক্লিক করুন। -
14চিহ্নিত বাটনটি চেপে ধরে রেখে, নিচের কমান্ডটি আপনার টার্মিনালে পেস্ট করুন এবং এটি চালানোর জন্য এন্টার চাপুন (সুবিধার জন্য, আপনি বাটনটি চেপে ধরা শুরু করার আগেই এই কমান্ডটি আপনার টার্মিনালে পেস্ট করতে পারেন, কিন্তু এই ধাপে না পৌঁছানো পর্যন্ত এন্টার চাপবেন না)।
python3 tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/uart_wired_update.py -b ${BAUD_RATE} ${DEVICENAME} -r 1 -f main_nonsecure_wire.bin -i 6
-
14চিহ্নিত বোতামটি চেপে ধরে রাখলে, এখন আপনি স্ক্রিনে নিচের মতো কিছু দেখতে পাবেন:
Connecting with Corvette over serial port /dev/cu.usbserial-1440... Sending Hello. Received response for Hello Received Status length = 0x58 version = 0x3 Max Storage = 0x4ffa0 Status = 0x2 State = 0x7 AMInfo = 0x1 0xff2da3ff 0x55fff 0x1 0x49f40003 0xffffffff [...lots more 0xffffffff...] Sending OTA Descriptor = 0xfe000 Sending Update Command. number of updates needed = 1 Sending block of size 0x158b0 from 0x0 to 0x158b0 Sending Data Packet of length 8180 Sending Data Packet of length 8180 [...lots more Sending Data Packet of length 8180...]
-
Sending Data Packet of length 8180লেখাটি দেখার পর বোর্ডের14চিহ্নিত বাটনটি চেপে ধরা বন্ধ করুন (তবে আপনি চেপে ধরে রাখলেও কোনো সমস্যা নেই)। প্রোগ্রামটি টার্মিনালে লাইন প্রিন্ট করতে থাকবে। অবশেষে এটি দেখতে নিচের মতো হবে:
[...lots more Sending Data Packet of length 8180...] Sending Data Packet of length 8180 Sending Data Packet of length 6440 Sending Reset Command. Done.
যদি আপনি Done দেখতে পান, তাহলে এটি একটি সফল ফ্ল্যাশিং নির্দেশ করে। যদি প্রোগ্রাম আউটপুট কোনো ত্রুটির মাধ্যমে শেষ হয়, তবে Sending Reset Command প্রিন্ট হয়েছে কিনা তা পরীক্ষা করুন। যদি হয়ে থাকে, তাহলে ত্রুটি থাকা সত্ত্বেও ফ্ল্যাশিং সম্ভবত সফল হয়েছে।
লিনাক্স মেশিনে আপনি একটি NoResponse Error সম্মুখীন হতে পারেন। এর কারণ হলো, বিদ্যমান সিরিয়াল ড্রাইভারের পাশাপাশি ch34x সিরিয়াল ড্রাইভারটি ইনস্টল হয়ে গেছে, যা নিম্নোক্তভাবে সমাধান করা যেতে পারে:
ধাপ ১ : ch34x লাইব্রেরির সঠিক সংস্করণটি পুনরায় ইনস্টল করুন। ইনস্টলেশন চলাকালীন ডিভাইসটি যেন কম্পিউটার থেকে সংযোগ বিচ্ছিন্ন থাকে, তা নিশ্চিত করুন।
git clone https://github.com/juliagoda/CH341SER.git cd CH341SER/ make sudo insmod ch34x.ko sudo rmmod ch341
ধাপ ২ : বোর্ডের USB প্লাগটি লাগান এবং চালান:
dmesg | grep "ch34x"
আপনি এইরকম একটি বার্তা দেখতে পাবেন:
[ 1299.444724] ch34x_attach+0x1af/0x280 [ch34x] [ 1299.445386] usb 2-13.1: ch34x converter now attached to ttyUSB0
যদি ব্যবহৃত ড্রাইভারটি 'ch34x' না হয় (যেমন: ch341), তাহলে নিম্নলিখিত কমান্ডটি চালিয়ে অন্য ড্রাইভারটি নিষ্ক্রিয় করার চেষ্টা করুন:
rmmod <non-ch34x driver name>
ডিভাইসটি আনপ্লাগ করে আবার প্লাগ করুন এবং নিশ্চিত করুন যে ব্যবহৃত ড্রাইভারটি "ch34x"।
৭. ডেমো
প্রোগ্রামটি ব্যবহার করে দেখুন
আপনার বোর্ডটি সফলভাবে ফ্ল্যাশ হয়ে গেলে, চিহ্নিত বোতামটি চাপুন।
বোর্ডটি রিস্টার্ট করতে এবং প্রোগ্রামটি শুরু করতে RST । যদি নীল LED-টি মিটমিট করে জ্বলতে শুরু করে, তাহলে ফ্ল্যাশিং সফল হয়েছে। যদি তা না হয়, তাহলে নিচের " যদি কাজ না করে?" অংশটিতে স্ক্রল করে যান।

বোর্ডের মেশিন লার্নিং মডেলটিকে 'হ্যাঁ' এবং 'না' শব্দ দুটি চিনতে এবং কথার উপস্থিতি ও অনুপস্থিতি শনাক্ত করতে প্রশিক্ষণ দেওয়া হয়েছে। এটি রঙিন এলইডি জ্বালিয়ে এর ফলাফল জানায়। নিচের সারণিতে প্রতিটি এলইডি রঙের অর্থ দেখানো হলো:
সনাক্তকরণের ফলাফল | এলইডি রঙ |
"হ্যাঁ" | হলুদ |
"না" | লাল |
অজানা বক্তৃতা | সবুজ |
কোনো বক্তব্য শনাক্ত করা যায়নি | কোন এলইডি জ্বলেনি |
চেষ্টা করে দেখুন
বোর্ডটি আপনার মুখের কাছে ধরুন এবং কয়েকবার "হ্যাঁ" বলুন। আপনি হলুদ এলইডি-টি জ্বলতে-নিভতে দেখবেন। "হ্যাঁ" বলার পরেও যদি কিছু না ঘটে, তাহলে এই উপায়গুলো চেষ্টা করে দেখতে পারেন:
- বোর্ডটি আপনার মুখ থেকে প্রায় ১০ ইঞ্চি দূরে ধরুন।
- অতিরিক্ত পারিপার্শ্বিক কোলাহল এড়িয়ে চলুন
- দ্রুত পরপর কয়েকবার 'হ্যাঁ' বলুন (যেমন 'হ্যাঁ হ্যাঁ হ্যাঁ' বলার চেষ্টা করুন)।
যদি এটা কাজ না করে?
এখানে কিছু সম্ভাব্য সমস্যা এবং সেগুলো সমাধান করার উপায় দেওয়া হলো:
সমস্যা: ফ্ল্যাশ করার পর কোনো এলইডি-ই জ্বলছে না।
সমাধান: RST বাটনটি চাপার চেষ্টা করুন, অথবা প্রোগ্রামার থেকে বোর্ডটি সংযোগ বিচ্ছিন্ন করে আবার সংযোগ করুন। যদি এগুলোর কোনোটিই কাজ না করে, তবে বোর্ডটি পুনরায় ফ্ল্যাশ করার চেষ্টা করুন।
সমস্যা: নীল এলইডি-টি জ্বলছে, কিন্তু এর আলো খুবই ক্ষীণ।
সমাধান: ব্যাটারির চার্জ কমে আসায় তা পরিবর্তন করুন। বিকল্পভাবে, প্রোগ্রামার এবং ক্যাবল ব্যবহার করে কম্পিউটার থেকে বোর্ডটিতে বিদ্যুৎ সরবরাহ করা যেতে পারে।
৮. ডিবাগ আউটপুট পড়ুন (ঐচ্ছিক)
যদি আপনি কোনো সমস্যার সম্মুখীন হন এবং আপনার কোড বিস্তারিতভাবে ডিবাগ করার প্রয়োজন হয়, তবে এই অংশটি পর্যালোচনা করুন । আপনার কোড চলার সময় একটি মাইক্রোকন্ট্রোলারে কী ঘটছে তা বোঝার জন্য, আপনি বোর্ডের সিরিয়াল সংযোগের মাধ্যমে ডিবাগিং তথ্য প্রিন্ট করতে পারেন। আপনি আপনার কম্পিউটার ব্যবহার করে বোর্ডের সাথে সংযোগ স্থাপন করেন এবং বোর্ড যে ডেটা পাঠাচ্ছে তা প্রদর্শন করেন।
একটি সিরিয়াল সংযোগ খুলুন
ডিফল্টরূপে, আমাদের SparkFun Edge স্যাম্পল কোডটি যেকোনো কথিত কমান্ড, সেগুলোর কনফিডেন্স সহ, লগ করে রাখে। বোর্ডের আউটপুট দেখতে আপনি নিম্নলিখিত কমান্ডটি চালাতে পারেন:
screen ${DEVICENAME} 115200
প্রাথমিকভাবে আপনি নিচের মতো একটি আউটপুট দেখতে পারেন: (এটি কেবল তখনই দেখা যায় যখন সংযোগ করার পর বোর্ডটি রিসেট করা হয়, অন্যথায় আপনি ডিবাগ তথ্য দেখতে শুরু করতে পারেন)
Apollo3 Burst Mode is Available
Apollo3 operating in Burst Mode (96MHz)
'yes' বা 'no' বলে কিছু কমান্ড দেওয়ার চেষ্টা করুন। প্রতিটি কমান্ডের জন্য বোর্ডটি ডিবাগ তথ্য প্রিন্ট করতে দেখা যাবে:
Heard yes (202) @65536ms
উপরের লগে, yes বলতে কমান্ডটিকে বোঝানো হয়েছে। 202 সংখ্যাটি নির্দেশ করে যে কমান্ডটি শোনা গেছে, তার নিশ্চয়তার মাত্রা (যেখানে ২০০ হলো সর্বনিম্ন)। সবশেষে, 65536ms বলতে বোঝায় মাইক্রোকন্ট্রোলারটি শেষবার রিসেট করার পর থেকে অতিবাহিত হওয়া সময়।
ডিবাগ আউটপুট দেখা বন্ধ করতে, Ctrl+A চাপুন, এরপর অবিলম্বে K কী চাপুন এবং তারপরে Y কী চাপুন।
ডিবাগ লগ লিখুন
আপনি এইমাত্র যে command_responder.cc ফাইলটি নিয়ে কাজ করছিলেন, সেখানেই এই তথ্য লগ করার কোডটি দেখতে পাবেন:
tensorflow/lite/micro/examples/micro_speech/sparkfun_edge/command_responder.cc
ডেটা লগ করার জন্য, আপনি error_reporter->Report() মেথডটি কল করতে পারেন। এটি স্ট্রিং ইন্টারপোলেশনের জন্য স্ট্যান্ডার্ড printf টোকেন সমর্থন করে, যা ব্যবহার করে আপনি আপনার লগে গুরুত্বপূর্ণ তথ্য অন্তর্ভুক্ত করতে পারেন:
error_reporter->Report("Heard %s (%d) @%dms", found_command, score, current_time);
পরবর্তী বিভাগে কোডে নিজের পরিবর্তন আনার সময় এই পদ্ধতিটি কাজে আসবে।
৯. কোডটি সম্প্রসারণ করুন (ঐচ্ছিক)
এখন যেহেতু আপনি আপনার SparkFun Edge কীভাবে বিল্ড এবং ফ্ল্যাশ করতে হয় তা জানেন, আপনি কোডটি নিয়ে কাজ শুরু করতে পারেন এবং ফলাফল দেখার জন্য এটি আপনার ডিভাইসে ডেপ্লয় করতে পারেন।
কোডটি পড়ুন
কোডটি পড়া শুরু করার জন্য একটি ভালো জায়গা হলো command_responder.cc.
tensorflow/lite/micro/examples/micro_speech/sparkfun_edge/command_responder.cc
আপনি ফাইলটি গিটহাবে এখানে দেখতে পারেন।
এই ফাইলের RespondToCommand মেথডটি কোনো ভয়েস কমান্ড শনাক্ত হলে কল করা হয়। বিদ্যমান কোডটি "yes", "no", বা কোনো অজানা কমান্ড শোনা গেছে কিনা তার উপর নির্ভর করে ভিন্ন ভিন্ন LED জ্বালায়। নিচের কোড স্নিপেটটি দেখায় এটি কীভাবে কাজ করে:
if (found_command[0] == 'y') {
am_hal_gpio_output_set(AM_BSP_GPIO_LED_YELLOW);
}
if (found_command[0] == 'n') {
am_hal_gpio_output_set(AM_BSP_GPIO_LED_RED);
}
if (found_command[0] == 'u') {
am_hal_gpio_output_set(AM_BSP_GPIO_LED_GREEN);
}
found_command আর্গুমেন্টটিতে শনাক্ত হওয়া কমান্ডটির নাম থাকে। প্রথম অক্ষরটি যাচাই করে, এই if স্টেটমেন্টগুলো নির্ধারণ করে কোন LED-টি জ্বালানো হবে।
RespondToCommand মেথডটি একাধিক আর্গুমেন্ট সহ কল করা হয়:
void RespondToCommand(tflite::ErrorReporter* error_reporter,
int32_t current_time, const char* found_command,
uint8_t score, bool is_new_command) {
- ডিবাগ তথ্য লগ করার জন্য
error_reporterব্যবহার করা হয় (এ বিষয়ে পরে আরও আলোচনা করা হবে)। -
current_timeহলো সেই সময় যখন কমান্ডটি শনাক্ত করা হয়েছিল। -
found_commandআমাদের জানায় কোন কমান্ডটি শনাক্ত করা হয়েছে। -
scoreআমাদের জানায় যে আমরা একটি কমান্ড শনাক্ত করার ব্যাপারে কতটা নিশ্চিত। -
is_new_commandআমাদের জানায় যে আমরা কমান্ডটি প্রথমবার শুনছি কি না।
score হলো ০ থেকে ২৫৫ পর্যন্ত একটি পূর্ণসংখ্যা, যা একটি কমান্ড শনাক্ত হওয়ার সম্ভাবনাকে নির্দেশ করে। নমুনা কোডটি শুধুমাত্র তখনই একটি কমান্ডকে বৈধ বলে বিবেচনা করে, যখন স্কোরটি ২০০-এর বেশি হয়। আমাদের পরীক্ষা অনুযায়ী, বেশিরভাগ বৈধ কমান্ড ২০০-২১০ সীমার মধ্যে থাকে।
কোডটি পরিবর্তন করুন
SparkFun Edge বোর্ডে চারটি LED আছে। বর্তমানে, শনাক্তকরণ প্রক্রিয়া চলছে তা বোঝাতে আমরা নীল LED-টি ফ্ল্যাশ করছি। আপনি এটি command_responder.cc ফাইলে দেখতে পারেন:
static int count = 0;
// Toggle the blue LED every time an inference is performed.
++count;
if (count & 1) {
am_hal_gpio_output_set(AM_BSP_GPIO_LED_BLUE);
} else {
am_hal_gpio_output_clear(AM_BSP_GPIO_LED_BLUE);
}
যেহেতু আমাদের কাছে চারটি এলইডি-র একটি সেট আছে, তাই চলুন প্রোগ্রামটিকে এমনভাবে পরিবর্তন করি যাতে এগুলো কোনো নির্দিষ্ট কমান্ডের score দৃশ্যমান নির্দেশক হিসেবে ব্যবহৃত হয়। কম স্কোরের ক্ষেত্রে একটি এলইডি জ্বলবে এবং বেশি স্কোরের ক্ষেত্রে একাধিক এলইডি জ্বলে উঠবে।
প্রোগ্রামটি যে চলছে তা জানার একটি উপায় নিশ্চিত করতে, আমরা নীল এলইডি-র পরিবর্তে লাল এলইডি-টিকে ক্রমাগত ফ্ল্যাশ করাবো। পাশের নীল, সবুজ এবং হলুদ এলইডি-গুলো আমাদের সাম্প্রতিকতম score মাত্রা দেখানোর জন্য ব্যবহৃত হবে। আর সরলতার জন্য, আমরা কেবল তখনই ওই এলইডি-গুলো জ্বালাবো যখন 'yes' শব্দটি বলা হবে। অন্য কোনো শব্দ শনাক্ত হলে, এলইডি-গুলো নিভে যাবে।
এই পরিবর্তনটি করতে, আপনার command_responder.cc ফাইলের সমস্ত কোড নিম্নলিখিত কোড স্নিপেট দিয়ে প্রতিস্থাপন করুন :
#include "tensorflow/lite/micro/examples/micro_speech/command_responder.h"
#include "am_bsp.h"
// This implementation will light up the LEDs on the board in response to different commands.
void RespondToCommand(tflite::ErrorReporter* error_reporter,
int32_t current_time, const char* found_command,
uint8_t score, bool is_new_command) {
static bool is_initialized = false;
if (!is_initialized) {
// Setup LEDs as outputs
am_hal_gpio_pinconfig(AM_BSP_GPIO_LED_RED, g_AM_HAL_GPIO_OUTPUT_12);
am_hal_gpio_pinconfig(AM_BSP_GPIO_LED_BLUE, g_AM_HAL_GPIO_OUTPUT_12);
am_hal_gpio_pinconfig(AM_BSP_GPIO_LED_GREEN, g_AM_HAL_GPIO_OUTPUT_12);
am_hal_gpio_pinconfig(AM_BSP_GPIO_LED_YELLOW, g_AM_HAL_GPIO_OUTPUT_12);
// Ensure all pins are cleared
am_hal_gpio_output_clear(AM_BSP_GPIO_LED_RED);
am_hal_gpio_output_clear(AM_BSP_GPIO_LED_BLUE);
am_hal_gpio_output_clear(AM_BSP_GPIO_LED_GREEN);
am_hal_gpio_output_clear(AM_BSP_GPIO_LED_YELLOW);
is_initialized = true;
}
static int count = 0;
// Toggle the red LED every time an inference is performed.
++count;
if (count & 1) {
am_hal_gpio_output_set(AM_BSP_GPIO_LED_RED);
} else {
am_hal_gpio_output_clear(AM_BSP_GPIO_LED_RED);
}
if (is_new_command) {
// Clear the last three LEDs
am_hal_gpio_output_clear(AM_BSP_GPIO_LED_BLUE);
am_hal_gpio_output_clear(AM_BSP_GPIO_LED_GREEN);
am_hal_gpio_output_clear(AM_BSP_GPIO_LED_YELLOW);
error_reporter->Report("Heard %s (%d) @%dms", found_command, score,
current_time);
// Only indicate a 'yes'
if (found_command[0] == 'y') {
// Always light the blue LED
am_hal_gpio_output_set(AM_BSP_GPIO_LED_BLUE);
// Light the other LEDs depending on score
if (score >= 205) {
am_hal_gpio_output_set(AM_BSP_GPIO_LED_GREEN);
}
if(score >= 210) {
am_hal_gpio_output_set(AM_BSP_GPIO_LED_YELLOW);
}
}
}
}
যদি কোনো নতুন কমান্ড শনাক্ত করা হয়, তাহলে is_new_command মান true হবে। found_command এবং score এর মানের ওপর নির্ভর করে আমরা প্রথমে নীল, সবুজ ও হলুদ এলইডি-গুলো নিভিয়ে দেব এবং তারপর আবার জ্বালিয়ে দেব।
পুনর্নির্মাণ এবং ফ্ল্যাশ
কোডে পরিবর্তন করার পর, Build থেকে শুরু করে বাইনারি প্রস্তুত করা পর্যন্ত সমস্ত ধাপ অনুসরণ করে এটি পরীক্ষা করুন।
১০. পরবর্তী পদক্ষেপ
অভিনন্দন, আপনি সফলভাবে একটি মাইক্রোকন্ট্রোলারে আপনার প্রথম স্পিচ ডিটেক্টর তৈরি করেছেন!
আমরা আশা করি, মাইক্রোকন্ট্রোলারের জন্য টেনসরফ্লো লাইট ব্যবহার করে ডেভেলপমেন্টের এই সংক্ষিপ্ত পরিচিতিটি আপনারা উপভোগ করেছেন। মাইক্রোকন্ট্রোলারে ডিপ লার্নিং-এর ধারণাটি নতুন এবং উত্তেজনাপূর্ণ, এবং আমরা আপনাদেরকে এটি নিয়ে পরীক্ষা-নিরীক্ষা করার জন্য উৎসাহিত করছি!
রেফারেন্স নথি
- এখন যেহেতু আপনি বেসিক প্রোগ্রামটি নিয়ে কাজ করার অভিজ্ঞতা অর্জন করেছেন, আপনার নিজের মডেলকে বিভিন্ন কমান্ড বুঝতে প্রশিক্ষণ দিন । দ্রষ্টব্য: প্রশিক্ষণটিতে কয়েক ঘণ্টা সময় লাগবে!
- মাইক্রোকন্ট্রোলারের জন্য TensorFlow Lite সম্পর্কে আরও জানুন ( ওয়েবসাইট , গিটহাব )।
- অন্যান্য উদাহরণগুলো চেষ্টা করুন এবং সমর্থিত হলে SparkFun Edge-এ সেগুলো চালানোর চেষ্টা করুন।
- O'Reilly-র বই TinyML: Machine Learning with TensorFlow on Arduino and Ultra-Low Power Micro-Controllers দেখুন, যেখানে ক্ষুদ্র ডিভাইসে মেশিন লার্নিংয়ের সাথে পরিচয় করিয়ে দেওয়া হয়েছে এবং বেশ কিছু মজার প্রজেক্ট ধাপে ধাপে দেখানো হয়েছে। এই কোডল্যাবটি বইটির ৭ম ও ৮ম অধ্যায়ের উপর ভিত্তি করে তৈরি।

ধন্যবাদ, এবং নির্মাণ করতে মজা নিন!