۱. مقدمه

آخرین بهروزرسانی: 2022-04-11
در این Codelab، شما یاد میگیرید که چگونه یک مدل طبقهبندی تصویر را با استفاده از Teachable Machine آموزش دهید و آن را با شتابدهنده سختافزاری Coral با استفاده از TensorFlow.js ، یک کتابخانه یادگیری ماشین قدرتمند و انعطافپذیر برای جاوا اسکریپت، اجرا کنید. شما یک برنامه Electron میسازید که تصاویر را از یک وبکم نمایش میدهد و آنها را با استفاده از Coral edge TPU طبقهبندی میکند. نسخه کاملاً کاربردی این Codelab در مخزن GitHub sig-tfjs موجود است.
آیا به دستگاه کورال نیاز دارم؟
خیر. شما میتوانید این codelab را بدون دستگاه Coral امتحان کنید و همچنان با استفاده از شتابدهنده WebNN، عملکرد خوبی را روی یک دستگاه دسکتاپ دریافت کنید.
آنچه خواهید ساخت
در این آزمایشگاه کد، شما یک برنامه Electron میسازید که تصاویر را طبقهبندی میکند. برنامه شما:
- تصاویر وبکم را در دستههای تعریفشده در مدلی که آموزش دادهاید، طبقهبندی میکند.
- در صورت موجود بودن، از شتابدهندهی کورال برای افزایش عملکرد استفاده میکند.
- در صورت پشتیبانی پلتفرم شما، از WebNN برای افزایش عملکرد استفاده میکند.
آنچه یاد خواهید گرفت
- نحوه نصب و راهاندازی بسته NPM tfjs-tflite-node برای اجرای مدلهای TFLite در Node.js.
- نحوه نصب کتابخانه زمان اجرای Edge TPU برای اجرای مدلها روی دستگاه Coral.
- چگونه با استفاده از یک TPU لبه مرجانی، استنتاج مدل را تسریع کنیم.
- چگونه با WebNN استنتاج مدل را تسریع کنیم؟
این آزمایشگاه کد بر TFLite در Node.js تمرکز دارد. مفاهیم و بلوکهای کد نامربوط نادیده گرفته شدهاند و برای کپی و پیست ساده در اختیار شما قرار گرفتهاند.
آنچه نیاز دارید
برای تکمیل این Codelab، به موارد زیر نیاز دارید:
- یک کامپیوتر با وب کم.
- برای کورال، ما یک رزبری پای با سیستم عامل رزبری پای (64 بیتی) و نسخه دسکتاپ آن را توصیه میکنیم.
- برای WebNN، ما یک دستگاه Intel x86-64 با سیستم عامل Ubuntu 20.04 یا Windows 10 را توصیه میکنیم.
- نسخه Node.js >= 12.
- آشنایی با جاوا اسکریپت.
- (توصیه میشود) یک شتابدهندهی USB کورال برای افزایش سرعت مدل.
۲. آماده شوید
کد را دریافت کنید
ما تمام کدهای مورد نیاز برای این پروژه را در یک مخزن گیت قرار دادهایم. برای شروع، کد را بردارید و آن را در محیط توسعه مورد علاقه خود باز کنید. برای این آزمایشگاه کد، توصیه میکنیم از یک رزبری پای با سیستم عامل رزبری پای (64 بیتی) و دسکتاپ استفاده کنید. این کار اتصال شتابدهنده کورال را آسان میکند.
اکیداً توصیه میشود: از گیت برای کپی کردن مخزن روی رزبری پای استفاده کنید
برای دریافت کد، یک پنجره ترمینال جدید باز کنید و مخزن را کلون کنید:
git clone https://github.com/tensorflow/sig-tfjs.git
تمام فایلهایی که برای codelab باید ویرایش کنید در دایرکتوری tfjs-tflite-node-codelab (داخل sig-tfjs ) قرار دارند. در این دایرکتوری، زیردایرکتوریهایی با نامهای starter_code ، cpu_inference_working ، coral_inference_working و webnn_inference_working را خواهید یافت. اینها نقاط بررسی مراحل این codelab هستند.
در میان سایر فایلهای موجود در مخزن، بستههای NPM وجود دارند که tfjs-tflite-node-codelab به آنها وابسته است. نیازی به ویرایش هیچ یک از این فایلها نخواهید داشت، اما باید برخی از تستهای آنها را اجرا کنید تا مطمئن شوید محیط شما به درستی تنظیم شده است.
کتابخانه زمان اجرای Edge TPU را نصب کنید
دستگاههای Coral قبل از استفاده نیاز دارند که کتابخانه زمان اجرای Edge TPU را نصب کنید. آن را با دنبال کردن دستورالعملهای مربوط به پلتفرم خود نصب کنید.
روی لینوکس / رزبری پای
در لینوکس، این کتابخانه از طریق PPA گوگل به عنوان یک بسته دبیان ، 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
در ویندوز / سایر سیستم عاملها
فایلهای باینری از پیش کامپایل شده برای نسخههای x86-64 سیستمعاملهای مک و ویندوز در دسترس هستند و میتوان آنها را با اجرای اسکریپت install.sh یا install.bat در آرشیو پس از دانلود، نصب کرد.
دستگاه خود را مجدداً راه اندازی کنید
پس از نصب Edge TPU Runtime، دستگاه را مجدداً راهاندازی کنید تا قانون جدید Coral Udev که نصبکننده اضافه کرده است، فعال شود.
تأیید کنید که دستگاه Coral شما شناسایی شده است
برای تأیید اینکه دستگاه 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 را دنبال کنید. اگر نسخه پایتون کار میکند اما این آزمایشها هنوز با شکست مواجه میشوند، لطفاً با ثبت گزارش اشکال به ما اطلاع دهید.
کد شروع را اجرا کنید
اکنون آماده اجرای کد اولیه هستید. برای شروع، این مراحل را دنبال کنید.
- به پوشه
starter_codeدر زیر پوشهtfjs-tflite-node-codelabبروید. - برای نصب وابستگیها
npm installاجرا کنید. - دستور
npm startبرای شروع پروژه اجرا کنید. برنامهای که در حال نمایش فید ویدیویی از وبکم رایانه شماست، باید باز شود.
نقطه شروع ما کجاست؟
نقطه شروع ما یک برنامه دوربین الکترون پایه است که برای این آزمایشگاه کد طراحی شده است. کد برای نمایش مفاهیم موجود در آزمایشگاه کد ساده شده است و مدیریت خطای کمی دارد. اگر تصمیم دارید از هر یک از کدها در یک برنامه تولیدی دوباره استفاده کنید، مطمئن شوید که هرگونه خطایی را مدیریت میکنید و تمام کد را به طور کامل آزمایش میکنید.

کد شروع را بررسی کنید
فایلهای زیادی در این کد اولیه وجود دارد، اما تنها فایلی که باید ویرایش کنید renderer.js است. این فایل آنچه را که در صفحه نمایش داده میشود، از جمله فید ویدیو و عناصر HTML، کنترل میکند و جایی است که مدل یادگیری ماشین خود را به برنامه اضافه میکنید. در میان فایلهای دیگر، یک فایل index.html وجود دارد، اما تنها کاری که انجام میدهد بارگذاری فایل renderer.js است. همچنین یک فایل main.js وجود دارد که نقطه ورود Electron است. این فایل چرخه عمر برنامه را کنترل میکند، از جمله اینکه هنگام باز شدن چه چیزی نشان داده شود و هنگام بسته شدن چه کاری انجام شود، اما نیازی به ایجاد تغییر در آن نخواهید داشت.
باز کردن دیباگر
ممکن است لازم باشد هنگام دنبال کردن این آزمایشگاه کد، برنامه خود را اشکالزدایی کنید. از آنجایی که این برنامه مبتنی بر Electron است، دارای اشکالزدای Chrome داخلی است. در اکثر پلتفرمها، میتوانید آن را با Ctrl + Shift + i باز کنید. برای مشاهده گزارشها و پیامهای خطا از برنامه، روی برگه Console کلیک کنید.
چیز زیادی برای بررسی اینجا وجود ندارد، پس بیایید مستقیماً به آموزش طبقهبندیکننده تصویر بپردازیم!
۳. آموزش یک طبقهبندیکننده تصویر
در این بخش، شما نسخههای TFLite و Coral از یک مدل طبقهبندی تصویر سفارشی را آموزش میدهید.
آموزش طبقهبندیکننده
یک طبقهبندیکننده تصویر، تصاویر ورودی را دریافت کرده و به آنها برچسب اختصاص میدهد. برای این آزمایشگاه کد، شما از Teachable Machine برای آموزش یک مدل در مرورگر خود استفاده میکنید. برای سرعت بخشیدن به آموزش در این بخش، میتوانید به جای Raspberry Pi از یک رایانه رومیزی یا لپتاپ استفاده کنید، اما باید فایلهای حاصل را در Pi کپی کنید.
حالا شما آماده آموزش یک مدل هستید. اگر مطمئن نیستید چه نوع مدلی را آموزش دهید، یک مدل آسان برای آموزش، یک آشکارساز شخص است که فقط تشخیص میدهد که آیا یک شخص در قاب تصویر وجود دارد یا خیر.
- صفحه آموزش Teachable Machine را در یک تب جدید باز کنید.
- پروژه تصویر و سپس مدل تصویر استاندارد را انتخاب کنید.
- برای هر کلاس نمونه تصویر اضافه کنید. استفاده از ورودی وبکم سادهترین راه برای انجام این کار است. همچنین میتوانید نام کلاسها را تغییر دهید.
- وقتی دادههای کافی برای هر کلاس جمعآوری کردید (معمولاً ۵۰ نمونه کافی است)، روی Train Model کلیک کنید.
وقتی آموزش مدل تمام شد، باید پیشنمایشی از خروجی مدل را ببینید.

سعی کنید ورودیهای مختلفی به مدل بدهید. اگر ورودیای پیدا کردید که به اشتباه طبقهبندی شده است، آن را به دادههای آموزشی اضافه کنید و مدل را دوباره آموزش دهید.
- وقتی از دقت مدل راضی بودید، روی «خروجی مدل» کلیک کنید. باید دو نسخه جداگانه از مدل را دانلود کنید.
- مدل خود را به عنوان یک مدل ممیز شناور Tensorflow Lite صادر کنید. این کار فایلی به نام
converted_tflite.zipرا دانلود میکند که روی CPU اجرا میشود. - مدل خود را به عنوان یک مدل Tensorflow Lite EdgeTPU صادر کنید. این کار فایلی به نام
converted_edgetpu.zipرا دانلود میکند که روی Coral Edge TPU اجرا میشود.
۴. مدل CPU را در برنامه خود اجرا کنید
حالا که یک مدل را آموزش دادهاید، وقت آن رسیده که آن را به برنامه خود اضافه کنید. در پایان این بخش، برنامه قادر خواهد بود مدل شما را با استفاده از CPU دستگاه اجرا کند.
فایل مدل را به برنامه اضافه کنید
فایل مدل converted_tflite.zip را که هنگام آموزش طبقهبندیکننده دانلود کردهاید، از حالت فشرده خارج کنید. دو فایل در آرشیو وجود دارد. model_uquant.tflite مدل TFLite ذخیره شده است که شامل نمودار مدل و وزنها میشود. labels.txt شامل برچسبهای قابل خواندن توسط انسان برای کلاسهایی است که مدل پیشبینی میکند. هر دو فایل را در پوشه model قرار دهید.
نصب وابستگیها
بارگذاری یک مدل و پیشپردازش ورودیها به چند وابستگی از TensorFlow.js نیاز دارد:
-
tfjs-tflite-node: بسته TensorFlow.js برای اجرای مدلهای TFLite در Node.js. -
@tensorflow/tfjs: بسته اصلی TensorFlow.js.
@tensorflow/tfjs از قبل نصب شده است، اما شما باید tfjs-tflite-node را با این دستور نصب کنید:
npm install --save tfjs-tflite-node
پس از نصب، آن را به برنامه در بالای renderer.js اضافه کنید:
بخش اول CODELAB: ایمپورت کردن tfjs-tflite-node.
const {loadTFLiteModel} = require('tfjs-tflite-node');
مدل را بارگذاری کنید
اکنون آماده بارگذاری مدل هستید. tfjs-tflite-node تابع loadTFLiteModel را برای انجام این کار فراهم میکند. این تابع میتواند مدلها را از یک مسیر فایل، یک ArrayBuffer یا یک URL TFHub بارگذاری کند. برای بارگذاری مدل و وزنهای آن، این کد را به تابع main اضافه کنید:
بخش اول CODELAB: مدل را اینجا بارگذاری کنید.
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() اضافه کنید:
بخش اول CODELAB: tf.data.webcam را اینجا تنظیم کنید.
const tensorCam = await tf.data.webcam(webcam);
سپس، برای گرفتن تصویر در هر فریم، کد زیر را به run() اضافه کنید:
بخش اول CODELAB: فریمهای وبکم را اینجا ضبط کنید.
const image = await tensorCam.capture();
همچنین باید هر فریم را پیشپردازش کنید تا با مدل سازگار باشد. مدلی که این آزمایشگاه کد استفاده میکند، شکل ورودی [1، 224، 224، 3] دارد، بنابراین انتظار یک تصویر RGB با ابعاد 224 در 224 پیکسل را دارد. tensorCam.capture() شکلی با ابعاد [224، 224، 3] ارائه میدهد، بنابراین باید با استفاده از tf.expandDims یک بُعد اضافی در جلوی تانسور اضافه کنید. علاوه بر این، مدل CPU انتظار یک ورودی Float32 بین -1 و 1 را دارد ، اما وبکم مقادیری از 0 تا 255 را ثبت میکند. میتوانید تانسور ورودی را بر 127 تقسیم کنید تا محدوده آن از [0، 255] به [0، ~2] تغییر کند و سپس 1 را کم کنید تا محدوده مورد نظر [-1، ~1] را بدست آورید. برای انجام این کار، این خطوط را به tf.tidy() در تابع run() اضافه کنید:
بخش اول CODELAB: پیشپردازش فریمهای وبکم در اینجا.
const expanded = tf.expandDims(image, 0);
const divided = tf.div(expanded, tf.scalar(127));
const normalized = tf.sub(divided, tf.scalar(1));
مهم است که پس از استفاده از تانسورها، آنها را دور بریزید. tf.tidy() این کار را به طور خودکار برای کد موجود در فراخوانی خود انجام میدهد، اما از توابع async پشتیبانی نمیکند. شما باید با فراخوانی متد dispose() آن، تانسور تصویری را که قبلاً ایجاد کردهاید، به صورت دستی دور بریزید.
بخش اول CODELAB: فریمهای وبکم را اینجا قرار دهید.
image.dispose();
اجرای مدل و نمایش نتایج
برای اجرای مدل روی ورودی پیشپردازششده، تابع model.predict() را روی تانسور نرمالشده فراخوانی کنید. این تابع یک تانسور تکبعدی حاوی احتمال پیشبینیشده هر برچسب را برمیگرداند. این احتمال را در ۱۰۰ ضرب کنید تا درصد احتمال هر برچسب را به دست آورید و از تابع showPrediction که در کد آغازین گنجانده شده است، برای نمایش پیشبینی مدل روی صفحه استفاده کنید.
این کد همچنین از stats.js برای محاسبهی مدت زمان پیشبینی با قرار دادن فراخوانیهای stats.begin و stats.end در اطراف model.predict استفاده میکند.
بخش اول CODELAB: اجرای مدل و نمایش نتایج در اینجا.
stats.begin();
const prediction = model.predict(normalized);
stats.end();
const percentage = tf.mul(prediction, tf.scalar(100));
showPrediction(percentage.dataSync(), labels);
برنامه را دوباره با yarn start اجرا کنید، و باید طبقهبندیهای مدل خود را ببینید.

عملکرد
همانطور که در حال حاضر تنظیم شده است، این مدل روی CPU اجرا میشود. این برای کامپیوترهای رومیزی و اکثر لپتاپها خوب است، اما اگر آن را روی Raspberry Pi یا دستگاه کممصرف دیگری اجرا کنید، ممکن است مطلوب نباشد. در Raspberry Pi 4، احتمالاً حدود 10 فریم در ثانیه خواهید دید که ممکن است برای برخی از برنامهها به اندازه کافی سریع نباشد. برای دستیابی به عملکرد بهتر بدون استفاده از یک دستگاه سریعتر، میتوانید از سیلیکون مخصوص برنامه به شکل Coral Edge TPU استفاده کنید.
۵. مدل Coral را در برنامه خود اجرا کنید
اگر دستگاه Coral ندارید، میتوانید از این بخش صرف نظر کنید.
این مرحله از آزمایشگاه کد، بر اساس کدی که در بخش قبل نوشتید، ساخته میشود، اما اگر میخواهید با یک نسخه اولیه شروع کنید، میتوانید از نقطه بررسی cpu_inference_working به جای آن استفاده کنید.
مراحل اجرای مدل Coral تقریباً مشابه مراحل اجرای مدل CPU است. تفاوت اصلی در قالب مدل است. از آنجایی که Coral فقط از تانسورهای uint8 پشتیبانی میکند، مدل کوانتیزه میشود. این امر بر تانسورهای ورودی ارسالی به مدل و تانسورهای خروجی که برمیگرداند تأثیر میگذارد. تفاوت دیگر این است که مدلها برای اجرا روی Coral TPU باید با استفاده از کامپایلر Edge TPU کامپایل شوند. TeachableMachine قبلاً این مرحله را انجام داده است، اما میتوانید با مراجعه به مستندات Coral نحوه انجام این کار را برای سایر مدلها بیاموزید.
فایل مدل Coral را به برنامه اضافه کنید
فایل مدل converted_edgetpu.zip را که هنگام آموزش طبقهبندیکننده دانلود کردهاید، از حالت فشرده خارج کنید. دو فایل در آرشیو وجود دارد. model_edgetpu.tflite مدل TFLite ذخیره شده است که شامل نمودار مدل و وزنها میشود. labels.txt شامل برچسبهای قابل خواندن توسط انسان برای کلاسهایی است که مدل پیشبینی میکند. فایل مدل را در پوشه coral_model قرار دهید.
نصب وابستگیها
اجرای مدلهای Coral به کتابخانهی Edge TPU runtime نیاز دارد. قبل از ادامه، با دنبال کردن دستورالعملهای راهاندازی، مطمئن شوید که آن را نصب کردهاید.
دستگاههای Coral به عنوان نمایندگان TFLite قابل دسترسی هستند. برای دسترسی به آنها از طریق جاوا اسکریپت، بسته coral-tflite-delegate را نصب کنید:
npm install --save coral-tflite-delegate
سپس، با اضافه کردن این خط به بالای فایل renderer.js، نماینده را وارد کنید:
بخش دوم CODELAB: نماینده را اینجا وارد کنید.
const {CoralDelegate} = require('coral-tflite-delegate');
مدل را بارگذاری کنید
حالا آمادهاید تا مدل Coral را بارگذاری کنید. این کار را به همان روشی که برای مدل CPU انجام دادید، انجام میدهید، با این تفاوت که حالا گزینههایی را به تابع loadTFLiteModel ارسال میکنید تا نماینده Coral را بارگذاری کند.
بخش دوم CODELAB: مدل نماینده را اینجا بارگذاری کنید.
const coralModelPath = './coral_model/model_edgetpu.tflite';
const options = {delegates: [new CoralDelegate()]};
const coralModel = await loadTFLiteModel(coralModelPath, options);
لازم نیست برچسبها را بارگذاری کنید زیرا آنها مشابه مدل CPU هستند.
اضافه کردن دکمهای برای جابجایی بین CPU و Coral
شما مدل Coral را در کنار مدل CPU که در بخش قبل اضافه کردید، اضافه میکنید. اجرای همزمان هر دو، مشاهده تفاوتهای عملکردی را دشوار میکند، بنابراین یک دکمهی تغییر وضعیت بین اجرای Coral و CPU وجود دارد.
دکمه را با این کد اضافه کنید:
بخش دوم CODELAB: دکمه نماینده را اینجا ایجاد کنید.
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 را اجرا میکند (اما فعلاً هیچ کاری انجام نمیدهد). کد حاصل از اجرای مدل CPU را در یک عبارت if قرار دهید . توجه داشته باشید که تانسور expanded از عبارت if حذف شده است زیرا مدل Coral از آن استفاده میکند.
بخش دوم CODELAB: بررسی کنید که آیا از نماینده در اینجا استفاده شود یا خیر.
// 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);
}
مدل را اجرا کنید
نسخه Coral این مدل، تانسورهای uint8 از ۰ تا ۲۵۵ را انتظار دارد، بنابراین ورودی آن نیازی به نرمالسازی ندارد. با این حال، خروجی نیز یک تانسور uint8 در محدوده ۰ تا ۲۵۵ است. قبل از نمایش، باید به یک عدد اعشاری از ۰ تا ۱۰۰ تبدیل شود.
بخش دوم CODELAB: پیشبینی Coral را اینجا اجرا کنید. (این بخشی از قطعه کد بالا است)
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 اجرا کنید، باید طبقهبندیهایی از شتابدهنده Coral را نشان دهد.

شما میتوانید با فشار دادن دکمه، بین استنتاج Coral و CPU جابجا شوید. ممکن است متوجه شوید که رتبهبندیهای اطمینان مدل Coral دقت کمتری نسبت به مدل CPU دارند و معمولاً با یک رقم اعشار زوج به پایان میرسند. این کاهش دقت، ناشی از اجرای یک مدل کوانتیزه شده روی Coral است. معمولاً در عمل مهم نیست، اما نکتهای است که باید در نظر داشته باشید.
نکتهای در مورد عملکرد
نرخ فریمی که میبینید شامل پیشپردازش و پسپردازش است، بنابراین نمایانگر توانایی سختافزار Coral نیست. میتوانید با کلیک کردن روی FPS meter تا زمانی که تأخیر (برحسب میلیثانیه) را نشان دهد، درک بهتری از عملکرد داشته باشید، که فقط فراخوانی model.predict را اندازهگیری میکند. با این حال، این هنوز شامل زمان لازم برای انتقال Tensorها به اتصالات C بومی TFLite و سپس به دستگاه Coral است، بنابراین اندازهگیری کاملی نیست. برای معیارهای عملکرد دقیقتر نوشته شده با C++، به صفحه معیار EdgeTPU مراجعه کنید.
همچنین لازم به ذکر است که این ویدیو به جای رزبری پای، با لپتاپ ضبط شده است، بنابراین ممکن است نرخ فریم متفاوتی را مشاهده کنید.
سرعت بخشیدن به پیشپردازش کورال
در برخی موارد، میتوانید با تغییر backendهای TFJS، پیشپردازش را سرعت بخشید. backend پیشفرض WebGL است که برای عملیات بزرگ و موازیسازی مناسب است، اما این برنامه در مرحله پیشپردازش کار زیادی از این نوع انجام نمیدهد (تنها عملیاتی که استفاده میکند expandDims است که موازی نیست). میتوانید با اضافه کردن این خط بعد از importها در بالای فایل، به backend CPU تغییر دهید تا از تأخیر اضافی ناشی از انتقال تانسورها به و از GPU جلوگیری کنید.
tf.setBackend(‘cpu');
این امر همچنین بر پیشپردازش مدل CPU TFLite که موازیسازی شده است ، تأثیر میگذارد، بنابراین با این تغییر، آن مدل بسیار کندتر اجرا میشود.
۶. مدل CPU را با WebNN تسریع کنید
اگر شتابدهنده Coral ندارید، یا اگر فقط میخواهید روش دیگری را برای سرعت بخشیدن به مدل امتحان کنید، میتوانید از نماینده WebNN TFLite استفاده کنید. این نماینده از سختافزار یادگیری ماشینی تعبیهشده در پردازندههای اینتل برای تسریع استنتاج مدل با جعبه ابزار OpenVINO استفاده میکند. در نتیجه، الزامات اضافی دارد که در بخش تنظیمات این آزمایشگاه کد پوشش داده نشده است و شما باید جعبه ابزار OpenVINO را نصب کنید. قبل از ادامه، حتماً تنظیمات خود را با پلتفرمهای سیستم هدف پشتیبانیشده بررسی کنید، اما توجه داشته باشید که نماینده WebNN هنوز از macOS پشتیبانی نمیکند.
نصب جعبه ابزار OpenVINO
جعبه ابزار OpenVINO از سختافزار یادگیری ماشینی تعبیهشده در پردازندههای اینتل برای تسریع مدلها استفاده میکند. میتوانید یک نسخه از پیش کامپایلشده را از اینتل دانلود کنید یا آن را از منبع بسازید . روشهای مختلفی برای نصب OpenVINO وجود دارد، اما برای اهداف این Codelab، توصیه میکنیم از اسکریپت نصبکننده برای ویندوز یا لینوکس استفاده کنید. حتماً نسخه 2021.4.2 LTS runtime را نصب کنید، زیرا ممکن است نسخههای دیگر سازگار نباشند . پس از اجرای نصبکننده، مطمئن شوید که متغیرهای محیطی پوسته خود را مطابق دستورالعملهای نصب برای لینوکس یا ویندوز ( راه حل دائمی ) یا با اجرای دستور setupvars.sh (لینوکس) یا setupvars.bat (ویندوز) واقع در دایرکتوری webnn-tflite-delegate پیکربندی کردهاید.
تأیید کنید که نماینده 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 (لینوکس) یا setupvars.bat (ویندوز) تنظیم کنید، اما ممکن است بخواهید با دنبال کردن دستورالعملهای لینوکس یا ویندوز ( راه حل دائمی ) آنها را به طور دائم تنظیم کنید. اگر از ویندوز استفاده میکنید،
setupvars.bat
دستور از Git bash پشتیبانی نمیکند ، بنابراین مطمئن شوید که آن و سایر دستورات این codelab را از خط فرمان ویندوز اجرا میکنید.
نماینده WebNN را نصب کنید
با نصب OpenVINO، اکنون آمادهاید تا مدل CPU را با WebNN شتاب دهید. این بخش از codelab بر اساس کدی که در بخش «اجرای مدل CPU در برنامه خود» نوشتید، ساخته میشود. میتوانید از کدی که در این مرحله نوشتید استفاده کنید، اما اگر قبلاً بخش Coral را تکمیل کردهاید، به جای آن از چکپوینت cpu_inference_working استفاده کنید تا با یک صفحه خالی شروع کنید.
بخش Node.js از نماینده WebNN روی npmjs توزیع شده است. برای نصب آن، این دستور را اجرا کنید:
npm install --save webnn-tflite-delegate
سپس، با اضافه کردن این خط به بالای فایل renderer.js، نماینده را وارد کنید:
بخش دوم CODELAB: نماینده را اینجا وارد کنید.
const {WebNNDelegate, WebNNDevice} = require('webnn-tflite-delegate');
نماینده WebNN از اجرا روی CPU یا GPU پشتیبانی میکند؛ WebNNDevice به شما امکان میدهد انتخاب کنید که از کدام استفاده کنید.
مدل را بارگذاری کنید
اکنون آمادهاید تا مدل را با نماینده WebNN فعال بارگذاری کنید. برای Coral، مجبور بودید یک فایل مدل متفاوت بارگذاری کنید، اما WebNN از همان فرمت مدل TFLite پشتیبانی میکند. WebNNDelegate را به لیست نمایندگان ارسالی به مدل اضافه کنید تا آن را فعال کنید:
بخش دوم CODELAB: مدل نماینده را اینجا بارگذاری کنید.
let webnnModel = await loadTFLiteModel(modelPath, {
delegates: [new WebNNDelegate({webnnDevice: WebNNDevice.DEFAULT})],
});
لازم نیست دوباره برچسبها را بارگذاری کنید زیرا این همان مدل است.
یک دکمه برای جابجایی بین TfLite CPU و WebNN اضافه کنید
حالا که نسخه WebNN مدل آماده است، یک دکمه برای جابجایی بین WebNN و استنتاج CPU TfLite اضافه کنید. اجرای همزمان هر دو، مشاهده تفاوتهای عملکردی را دشوار میکند.
دکمه را با این کد اضافه کنید (توجه داشته باشید که هنوز مدلها را تغییر نمیدهد):
بخش دوم CODELAB: دکمه نماینده را اینجا ایجاد کنید.
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 از اجرا روی CPU و GPU پشتیبانی میکند، بنابراین یک منوی کشویی برای جابجایی بین آنها اضافه کنید. این کد را بعد از کدی که دکمه را ایجاد میکند، اضافه کنید:
// 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);
}
حالا اگر برنامه را اجرا کنید، یک منوی کشویی شامل گزینههای پیشفرض، پردازنده گرافیکی (GPU) و پردازنده مرکزی (CPU) مشاهده خواهید کرد. انتخاب یکی از آنها فعلاً کاری انجام نمیدهد، زیرا این منوی کشویی هنوز فعال نشده است. 
منوی کشویی را طوری تنظیم کنید که دستگاه را تغییر دهد
برای اینکه منوی کشویی طوری تنظیم شود که دستگاه WebNN مورد استفاده را تغییر دهد، یک شنونده (listener) به رویداد change مربوط به عنصر انتخابگر منوی کشویی اضافه کنید. وقتی مقدار انتخاب شده تغییر کرد، مدل 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 هنوز در واقع مدل را تغییر نمیدهد. برای جابجایی مدل، ابتدا باید نام متغیر model را از زمانی که مدل TfLite CPU را در بخش اول codelab بارگذاری کردید، تغییر دهید.
خط زیر را تغییر دهید...
const model = await loadTFLiteModel(modelPath);
...به طوری که با این خط مطابقت داشته باشد.
const cpuModel = await loadTFLiteModel(modelPath);
با تغییر نام متغیر model به cpuModel ، این کد را به تابع run اضافه کنید تا مدل صحیح بر اساس وضعیت دکمه انتخاب شود:
بخش دوم CODELAB: بررسی کنید که آیا از نماینده در اینجا استفاده شود یا خیر.
let model;
if (useWebNNDelegate) {
model = webnnModel;
} else {
model = cpuModel;
}
حالا، وقتی برنامه را اجرا میکنید، دکمه بین TfLite CPU و WebNN تغییر میکند. 
همچنین اگر پردازنده گرافیکی مجتمع اینتل دارید، میتوانید بین استنتاج WebNN CPU و GPU جابهجا شوید.
نکتهای در مورد عملکرد
نرخ فریمی که میبینید شامل پیشپردازش و پسپردازش است، بنابراین نمایانگر تواناییهای WebNN نیست. میتوانید با کلیک کردن روی FPS meter تا زمانی که تأخیر (برحسب میلیثانیه) را نشان دهد، درک بهتری از عملکرد داشته باشید، که فقط فراخوانی model.predict را اندازهگیری میکند. با این حال، این هنوز شامل زمانی است که برای انتقال Tensors به اتصالات C بومی TFLite لازم است، بنابراین اندازهگیری کاملی نیست.
۷. تبریک
تبریک! شما به تازگی اولین پروژه Coral/WebNN خود را با استفاده از tfjs-tflite-node در Electron به پایان رساندهاید.
آن را امتحان کنید و روی تصاویر مختلف آزمایش کنید. همچنین میتوانید یک مدل جدید را در TeachableMachine آموزش دهید تا چیزی کاملاً متفاوت را طبقهبندی کند.
خلاصه
در این آزمایشگاه کد، شما یاد گرفتید:
- نحوه نصب و راهاندازی بسته npm tfjs-tflite-node برای اجرای مدلهای TFLite در Node.js.
- نحوه نصب کتابخانه زمان اجرای Edge TPU برای اجرای مدلها روی دستگاه Coral.
- چگونه با استفاده از یک TPU لبه مرجانی، استنتاج مدل را تسریع کنیم.
- چگونه با WebNN استنتاج مدل را تسریع کنیم؟
بعدش چی؟
حالا که یک پایه کاری برای شروع دارید، چه ایدههای خلاقانهای میتوانید ارائه دهید تا این اجراکننده مدل یادگیری ماشین را به یک مورد استفاده در دنیای واقعی که ممکن است روی آن کار کنید، گسترش دهید؟ شاید بتوانید با استنتاج سریع و مقرون به صرفه، صنعتی را که در آن کار میکنید، متحول کنید، یا شاید بتوانید یک توستر را طوری تغییر دهید که وقتی نان درست به نظر میرسد، برشته شدن را متوقف کند. امکانات بیپایان هستند.
برای کسب اطلاعات بیشتر در مورد نحوه آموزش مدل مورد استفاده شما توسط TeachableMachine، به codelab ما در Transfer Learning مراجعه کنید. اگر به دنبال مدلهای دیگری هستید که با Coral کار میکنند، مانند تشخیص گفتار و تخمین ژست، به coral.ai/models نگاهی بیندازید. همچنین میتوانید نسخههای CPU این مدلها و بسیاری دیگر را در TensorFlow Hub پیدا کنید.
آنچه را که میسازید با ما به اشتراک بگذارید
شما به راحتی میتوانید آنچه را که امروز ساختهاید برای موارد استفاده خلاقانه دیگر نیز گسترش دهید و ما شما را تشویق میکنیم که خارج از چارچوب فکر کنید و به هک کردن ادامه دهید.
فراموش نکنید که برای نمایش پروژهتان در وبلاگ TensorFlow یا حتی رویدادهای آینده، ما را در شبکههای اجتماعی با استفاده از هشتگ #MadeWithTFJS تگ کنید. ما دوست داریم ببینیم چه چیزی میسازید.