মাইক্রোকন্ট্রোলার এবং স্পার্কফান এজের জন্য টেনসরফ্লো লাইটের সাথে এআই স্পিচ রিকগনিশন

১. ভূমিকা

আপনি যা তৈরি করবেন

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

bf256d403a1821af.gif

মাইক্রোকন্ট্রোলারে মেশিন লার্নিং

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

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

1360b61fbfa33657.jpeg

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

মাইক্রোকন্ট্রোলারের জন্য টেনসরফ্লো লাইট (সফটওয়্যার)

358ffdb9eb758b90.png

TensorFlow হলো মডেল প্রশিক্ষণ এবং চালানোর জন্য গুগলের একটি ওপেন সোর্স মেশিন লার্নিং ফ্রেমওয়ার্ক। TensorFlow Lite হলো একটি সফটওয়্যার ফ্রেমওয়ার্ক, যা TensorFlow-এর একটি অপ্টিমাইজড সংস্করণ এবং এটি মোবাইল ফোনের মতো ছোট ও তুলনামূলকভাবে কম শক্তিশালী ডিভাইসে টেনসরফ্লো মডেল চালানোর জন্য তৈরি করা হয়েছে।

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

স্পার্কফান এজ (হার্ডওয়্যার)

স্পার্কফান এজ হলো একটি মাইক্রোকন্ট্রোলার-ভিত্তিক প্ল্যাটফর্ম: একটিমাত্র সার্কিট বোর্ডের উপর থাকা একটি ক্ষুদ্র কম্পিউটার। এতে একটি প্রসেসর, মেমরি এবং আই/ও হার্ডওয়্যার রয়েছে, যা এটিকে অন্যান্য ডিভাইসে ডিজিটাল সংকেত পাঠাতে ও গ্রহণ করতে সক্ষম করে। এতে আপনার প্রিয় গুগল রঙের চারটি সফটওয়্যার-নিয়ন্ত্রণযোগ্য এলইডি রয়েছে।

aa4493835a2338c6.png

কম্পিউটারের মতো মাইক্রোকন্ট্রোলারে কোনো অপারেটিং সিস্টেম চলে না। এর পরিবর্তে, আপনার লেখা প্রোগ্রামগুলো সরাসরি হার্ডওয়্যারে চলে। আপনি কম্পিউটারে আপনার কোড লেখেন এবং প্রোগ্রামার নামক একটি ডিভাইসের মাধ্যমে তা মাইক্রোকন্ট্রোলারে ডাউনলোড করেন।

মাইক্রোকন্ট্রোলার শক্তিশালী কম্পিউটার নয়। এগুলোতে ছোট প্রসেসর এবং খুব কম মেমরি থাকে। কিন্তু এগুলোকে যথাসম্ভব সহজভাবে ডিজাইন করা হয় বলে, একটি মাইক্রোকন্ট্রোলার খুব কম শক্তি ব্যবহার করতে পারে। আপনার প্রোগ্রাম কী কাজ করে তার উপর নির্ভর করে, SparkFun Edge একটিমাত্র কয়েন সেল ব্যাটারিতে সপ্তাহখানেক চলতে পারে!

আপনি যা শিখবেন

  • আপনার কম্পিউটারে SparkFun Edge-এর জন্য নমুনা প্রোগ্রামটি কম্পাইল করুন।
  • আপনার ডিভাইসে প্রোগ্রামটি স্থাপন করুন।
  • প্রোগ্রামটিতে পরিবর্তন আনুন এবং এটি পুনরায় স্থাপন করুন।

আপনার যা যা লাগবে

আপনার নিম্নলিখিত হার্ডওয়্যারগুলির প্রয়োজন হবে:

আপনার নিম্নলিখিত সফটওয়্যারগুলোর প্রয়োজন হবে:

২. আপনার হার্ডওয়্যার সেট আপ করুন

SparkFun Edge মাইক্রোকন্ট্রোলারে আগে থেকে একটি বাইনারি ইনস্টল করা থাকে যা স্পিচ মডেলটি চালাতে পারে। আমাদের নিজস্ব সংস্করণ দিয়ে এটিকে ওভাররাইট করার আগে, চলুন প্রথমে এই মডেলটি চালিয়ে দেখি।

আপনার বোর্ডকে শক্তি দিন:

  1. বোর্ডের পিছনের ব্যাটারি কানেক্টরে একটি কয়েন সেল ব্যাটারি প্রবেশ করান (ব্যাটারির "+" দিকটি উপরের দিকে রেখে। যদি আপনার বোর্ডে আগে থেকেই ব্যাটারি লাগানো থাকে, তাহলে প্লাস্টিকের ট্যাবটি টেনে বের করুন এবং ব্যাটারিটি পুরোপুরি ঢুকেছে কিনা তা নিশ্চিত করতে চাপ দিন)।

25a6cc6b208e8a4e.png

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

b140822f0019f92a.png

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

বোর্ডের মেশিন লার্নিং মডেলটিকে 'হ্যাঁ' এবং 'না' শব্দ দুটি চিনতে এবং কথার উপস্থিতি ও অনুপস্থিতি শনাক্ত করতে প্রশিক্ষণ দেওয়া হয়েছে। এটি রঙিন এলইডি জ্বালিয়ে এর ফলাফল জানায়। নিচের সারণিতে প্রতিটি এলইডি রঙের অর্থ দেখানো হলো:

সনাক্তকরণের ফলাফল

এলইডি রঙ

"হ্যাঁ"

হলুদ

"না"

লাল

অজানা বক্তৃতা

সবুজ

কোনো বক্তব্য শনাক্ত করা যায়নি

কোন এলইডি জ্বলেনি

চেষ্টা করে দেখুন

বোর্ডটি আপনার মুখের কাছে ধরুন এবং কয়েকবার "হ্যাঁ" বলুন। আপনি হলুদ এলইডি-টি জ্বলতে-নিভতে দেখবেন। "হ্যাঁ" বলার পরেও যদি কিছু না ঘটে, তাহলে এই উপায়গুলো চেষ্টা করে দেখতে পারেন:

  • বোর্ডটি আপনার মুখ থেকে প্রায় ১০ ইঞ্চি দূরে ধরুন।
  • অতিরিক্ত পারিপার্শ্বিক কোলাহল এড়িয়ে চলুন
  • দ্রুত পরপর কয়েকবার 'হ্যাঁ' বলুন (যেমন 'হ্যাঁ হ্যাঁ হ্যাঁ' বলার চেষ্টা করুন)।

৩. আপনার সফ্টওয়্যার সেট আপ করুন

এখন আমরা নিজেরাই মাইক্রোকন্ট্রোলারে স্পিচ মডেলটি ডাউনলোড, ইনস্টল এবং রান করব। এর জন্য, প্রথমে আমরা এই প্রোগ্রামটির সোর্স কোড এবং এটি বিল্ড করার জন্য প্রয়োজনীয় ডিপেন্ডেন্সিগুলো ডাউনলোড করব। প্রোগ্রামটি 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-এর মাধ্যমে মাইক্রোকন্ট্রোলারের সাথে যোগাযোগ করতে দেয়।

এই ডিভাইসটি আপনার বোর্ডে সংযুক্ত করতে, নিম্নলিখিত ধাপগুলো অনুসরণ করুন:

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

b140822f0019f92a.png

প্রোগ্রামারটি আপনার কম্পিউটারের সাথে সংযুক্ত করুন।

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

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

৬. বাইনারিটি ফ্ল্যাশ করুন

আপনার বোর্ড ফ্ল্যাশ করতে স্ক্রিপ্টটি চালান।

বোর্ডটি ফ্ল্যাশ করার জন্য, এটিকে একটি বিশেষ 'বুটলোডার' অবস্থায় আনতে হবে, যা এটিকে নতুন বাইনারি গ্রহণ করার জন্য প্রস্তুত করে। এরপর আমরা বোর্ডে বাইনারিটি পাঠানোর জন্য একটি স্ক্রিপ্ট চালাব।

চলুন বোর্ডের নিম্নলিখিত বাটনগুলোর সাথে পরিচিত হয়ে নিই:

64c620570b9d2f83.png

বোর্ডটি রিসেট এবং ফ্ল্যাশ করতে নিম্নলিখিত ধাপগুলো অনুসরণ করুন:

  1. নিশ্চিত করুন যে আপনার বোর্ডটি প্রোগ্রামারের সাথে এবং সম্পূর্ণ সেটআপটি ইউএসবি-র মাধ্যমে আপনার কম্পিউটারের সাথে সংযুক্ত আছে।
  2. বোর্ডে 14 চিহ্নিত বোতামটি চেপে ধরুনধাপ ৬ পর্যন্ত এটি চেপে ধরে রাখুন।
  3. বোর্ডটিকে বুটলোডার অবস্থায় রিসেট করার জন্য, 14 চিহ্নিত বাটনটি চেপে ধরে রেখে RST চিহ্নিত বাটনটিতে ক্লিক করুন।
  4. 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
  1. 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...]
  1. 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-টি মিটমিট করে জ্বলতে শুরু করে, তাহলে ফ্ল্যাশিং সফল হয়েছে। যদি তা না হয়, তাহলে নিচের " যদি কাজ না করে?" অংশটিতে স্ক্রল করে যান।

bf256d403a1821af.gif

বোর্ডের মেশিন লার্নিং মডেলটিকে 'হ্যাঁ' এবং 'না' শব্দ দুটি চিনতে এবং কথার উপস্থিতি ও অনুপস্থিতি শনাক্ত করতে প্রশিক্ষণ দেওয়া হয়েছে। এটি রঙিন এলইডি জ্বালিয়ে এর ফলাফল জানায়। নিচের সারণিতে প্রতিটি এলইডি রঙের অর্থ দেখানো হলো:

সনাক্তকরণের ফলাফল

এলইডি রঙ

"হ্যাঁ"

হলুদ

"না"

লাল

অজানা বক্তৃতা

সবুজ

কোনো বক্তব্য শনাক্ত করা যায়নি

কোন এলইডি জ্বলেনি

চেষ্টা করে দেখুন

বোর্ডটি আপনার মুখের কাছে ধরুন এবং কয়েকবার "হ্যাঁ" বলুন। আপনি হলুদ এলইডি-টি জ্বলতে-নিভতে দেখবেন। "হ্যাঁ" বলার পরেও যদি কিছু না ঘটে, তাহলে এই উপায়গুলো চেষ্টা করে দেখতে পারেন:

  • বোর্ডটি আপনার মুখ থেকে প্রায় ১০ ইঞ্চি দূরে ধরুন।
  • অতিরিক্ত পারিপার্শ্বিক কোলাহল এড়িয়ে চলুন
  • দ্রুত পরপর কয়েকবার 'হ্যাঁ' বলুন (যেমন 'হ্যাঁ হ্যাঁ হ্যাঁ' বলার চেষ্টা করুন)।

যদি এটা কাজ না করে?

এখানে কিছু সম্ভাব্য সমস্যা এবং সেগুলো সমাধান করার উপায় দেওয়া হলো:

সমস্যা: ফ্ল্যাশ করার পর কোনো এলইডি-ই জ্বলছে না।

সমাধান: 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 থেকে শুরু করে বাইনারি প্রস্তুত করা পর্যন্ত সমস্ত ধাপ অনুসরণ করে এটি পরীক্ষা করুন।

১০. পরবর্তী পদক্ষেপ

অভিনন্দন, আপনি সফলভাবে একটি মাইক্রোকন্ট্রোলারে আপনার প্রথম স্পিচ ডিটেক্টর তৈরি করেছেন!

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

রেফারেন্স নথি

26699b18f2b199f.png

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