1. مقدمه
آخرین به روز رسانی: 2022-04-11
در این Codelab، یاد می گیرید که چگونه یک مدل طبقه بندی تصویر را با استفاده از Teachable Machine آموزش دهید، و آن را با شتاب سخت افزاری Coral با استفاده از TensorFlow.js ، یک کتابخانه یادگیری ماشینی قدرتمند و انعطاف پذیر برای جاوا اسکریپت اجرا کنید. شما یک برنامه Electron می سازید که تصاویر را از یک وب کم نمایش می دهد و آنها را با استفاده از Coral edge TPU طبقه بندی می کند. یک نسخه کاملاً کارآمد از این Codelab در مخزن sig-tfjs GitHub موجود است.
آیا به دستگاه کورال نیاز دارم؟
نه. میتوانید این کد لبه را بدون دستگاه Coral امتحان کنید و در عوض با استفاده از شتابدهنده WebNN، عملکرد خوبی روی یک دستگاه رومیزی داشته باشید.
چیزی که خواهی ساخت
در این کد، شما یک برنامه Electron می سازید که تصاویر را طبقه بندی می کند. برنامه شما:
- تصاویر را از وب کم به دسته بندی های تعریف شده در مدلی که آموزش داده اید طبقه بندی می کند.
- در صورت موجود بودن از شتاب دهنده Coral برای افزایش عملکرد استفاده می کند.
- از WebNN برای افزایش عملکرد استفاده میکند، اگر در پلتفرم شما پشتیبانی شود.
چیزی که یاد خواهید گرفت
- نحوه نصب و راه اندازی بسته NPM tfjs-tflite-node برای اجرای مدل های TFLite در Node.js.
- نحوه نصب کتابخانه زمان اجرا Edge TPU برای اجرای مدل ها در دستگاه Coral.
- نحوه تسریع استنتاج مدل با استفاده از Coral edge TPU.
- نحوه تسریع استنتاج مدل با WebNN
این کد لبه روی TFLite در Node.js تمرکز دارد. مفاهیم و بلوکهای کد غیرمرتبط محو شدهاند و برای شما ارائه میشوند تا به سادگی کپی و جایگذاری کنید.
آنچه شما نیاز دارید
برای تکمیل این Codelab شما نیاز دارید:
- یک کامپیوتر با وب کم.
- برای Coral، ما Raspberry Pi را با سیستم عامل Raspberry Pi (64 بیتی) با دسکتاپ توصیه می کنیم.
- برای WebNN، ما یک دستگاه Intel x86-64 با اوبونتو 20.04 یا ویندوز 10 را توصیه می کنیم.
- نسخه Node.js >= 12.
- آشنایی با جاوا اسکریپت.
- (توصیه می شود) یک شتاب دهنده USB Coral برای افزایش سرعت مدل.
2. راه اندازی شوید
کد را دریافت کنید
ما تمام کدهای مورد نیاز برای این پروژه را در یک مخزن Git قرار داده ایم. برای شروع، کد را بردارید و آن را در محیط برنامه نویس مورد علاقه خود باز کنید. برای این نرم افزار کد، توصیه می کنیم از Raspberry Pi با سیستم عامل Raspberry Pi (64 بیتی) با دسکتاپ استفاده کنید. این کار اتصال شتاب دهنده کورال را آسان می کند.
اکیداً توصیه می شود: از Git برای شبیه سازی مخزن در Raspberry Pi استفاده کنید
برای دریافت کد، یک پنجره ترمینال جدید باز کنید و مخزن را شبیه سازی کنید:
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
را خواهید یافت. اینها نقاط بازرسی برای مراحل این Codelab هستند.
در میان فایلهای دیگر موجود در مخزن، بستههای NPM هستند که tfjs-tflite-node-codelab
به آنها وابسته است. شما نیازی به ویرایش هیچ یک از این فایل ها نخواهید داشت، اما باید برخی از تست های آنها را اجرا کنید تا مطمئن شوید که محیط شما به درستی تنظیم شده است.
کتابخانه Edge TPU Runtime را نصب کنید
دستگاههای Coral نیاز دارند که کتابخانه زمان اجرا Edge TPU را قبل از استفاده نصب کنید. آن را با دنبال کردن دستورالعمل های پلتفرم خود نصب کنید.
در لینوکس / رزبری پای
در لینوکس، این کتابخانه از PPA Google بهعنوان یک بسته Debian ، 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 MacOS و Windows در دسترس هستند و پس از دانلود با اجرای اسکریپت 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 Runtime Library را نصب کرده اید و دستگاه Coral را به رایانه خود وصل کرده اید. همچنین میتوانید برای آزمایش نسخه پایتون پیوندهای مرجانی ، راهنمای شروع Coral را دنبال کنید. اگر نسخه پایتون کار میکند اما این تستها همچنان با شکست مواجه میشوند، لطفاً با ارسال یک گزارش اشکال به ما اطلاع دهید.
کد شروع را اجرا کنید
اکنون آماده اجرای کد شروع هستید. برای شروع این مراحل را دنبال کنید.
- به دایرکتوری
starter_code
زیر پوشهtfjs-tflite-node-codelab
بروید. -
npm install
برای نصب وابستگی ها اجرا کنید. -
npm start
را اجرا کنید تا پروژه راه اندازی شود. برنامه ای که فید ویدیویی را از وب کم رایانه شما نشان می دهد باید باز شود.
نقطه شروع ما چیست؟
نقطه شروع ما یک برنامه اصلی دوربین Electron است که برای این نرم افزار کد طراحی شده است. کد برای نشان دادن مفاهیم موجود در Codelab ساده شده است و مدیریت خطای کمی دارد. اگر تصمیم به استفاده مجدد از هر یک از کدها در یک برنامه تولیدی دارید، مطمئن شوید که خطاها را کنترل کرده و همه کدها را به طور کامل آزمایش کنید.
کد شروع را کاوش کنید
فایل های زیادی در این کد شروع وجود دارد، اما تنها موردی که باید ویرایش کنید renderer.js
است. آنچه را که در صفحه نشان داده میشود، از جمله فید ویدیو و عناصر HTML را کنترل میکند، و جایی است که مدل یادگیری ماشین خود را به برنامه اضافه میکنید. در میان فایل های دیگر یک فایل index.html
است، اما تنها کاری که انجام می دهد این است که فایل renderer.js
بارگذاری می کند. همچنین یک فایل main.js
وجود دارد که نقطه ورود Electron است. چرخه عمر برنامه را کنترل می کند، از جمله اینکه چه مواردی را در هنگام باز شدن نشان دهد و چه کارهایی را هنگام بسته شدن انجام دهد، اما نیازی به ایجاد هیچ تغییری در آن نخواهید داشت.
دیباگر را باز کنید
ممکن است لازم باشد برنامه خود را با پیروی از این کد لبه اشکال زدایی کنید. از آنجایی که این برنامه مبتنی بر Electron است، دارای دیباگر کروم است. در اکثر پلتفرمها، میتوانید آن را با Ctrl + Shift + i باز کنید. برای مشاهده گزارشها و پیامهای خطا از برنامه، روی تب Console کلیک کنید.
در اینجا چیز زیادی برای کاوش وجود ندارد، بنابراین بیایید مستقیماً به آموزش طبقه بندی کننده تصویر بپردازیم!
3. یک طبقه بندی کننده تصویر را آموزش دهید
در این بخش، نسخه های TFLite و Coral یک مدل طبقه بندی تصویر سفارشی را آموزش می دهید.
Classifier را آموزش دهید
یک طبقهبندی کننده تصویر، تصاویر ورودی را میگیرد و به آنها برچسبهایی اختصاص میدهد. برای این کد لبه، شما از Teachable Machine برای آموزش یک مدل در مرورگر خود استفاده می کنید. برای سرعت بخشیدن به آموزش این بخش، می توانید به جای Raspberry Pi از رایانه رومیزی یا لپ تاپ استفاده کنید، اما باید فایل های به دست آمده را در Pi کپی کنید.
اکنون شما آماده آموزش یک مدل هستید. اگر مطمئن نیستید که چه نوع مدلی را آموزش دهید، یک مدل آسان برای آموزش یک آشکارساز شخص است که فقط تشخیص می دهد که آیا فرد در کادر است یا خیر.
- صفحه آموزش ماشین قابل آموزش را در یک تب جدید باز کنید.
- Image Project و سپس Standard image Model را انتخاب کنید.
- نمونه های تصویر را برای هر کلاس اضافه کنید. استفاده از ورودی وب کم ساده ترین راه برای انجام این کار است. همچنین می توانید نام کلاس ها را تغییر دهید.
- وقتی داده های کافی برای هر کلاس جمع آوری کردید (50 نمونه معمولاً کافی است)، Train Model را فشار دهید.
وقتی آموزش مدل به پایان رسید، باید پیش نمایشی از خروجی مدل را مشاهده کنید.
سعی کنید به مدل ورودی های مختلف بدهید. اگر ورودی ای پیدا کردید که به اشتباه طبقه بندی شده است، آن را به داده های آموزشی اضافه کنید و مدل را دوباره آموزش دهید.
- وقتی از دقت مدل راضی بودید، روی Export Model کلیک کنید. شما باید دو نسخه جداگانه از مدل را دانلود کنید.
- مدل خود را به عنوان یک مدل ممیز شناور Tensorflow Lite صادر کنید. با این کار فایلی به نام
converted_tflite.zip
دانلود می شود. که روی CPU اجرا می شود. - مدل خود را به عنوان یک مدل Tensorflow Lite EdgeTPU صادر کنید. با این کار فایلی به نام
converted_edgetpu.zip
دانلود می شود که روی Coral Edge TPU اجرا می شود.
4. مدل CPU را در برنامه خود اجرا کنید
اکنون که یک مدل را آموزش داده اید، وقت آن است که آن را به برنامه خود اضافه کنید. تا پایان این بخش، اپلیکیشن میتواند مدل شما را با استفاده از CPU دستگاه اجرا کند.
فایل مدل را به برنامه اضافه کنید
فایل مدل converted_tflite.zip را که هنگام آموزش طبقهبندی کننده دانلود کردهاید، از حالت فشرده خارج کنید. دو فایل در آرشیو موجود است. model_uquant.tflite
مدل ذخیره شده TFLite است که شامل نمودار مدل و وزن است. labels.txt
حاوی برچسب های قابل خواندن توسط انسان برای کلاس هایی است که مدل پیش بینی می کند. هر دو فایل را در modeldirectory قرار دهید.
وابستگی ها را نصب کنید
بارگیری یک مدل و پیش پردازش ورودی ها به چند وابستگی از 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 قسمت 1: وارد کردن tfjs-tflite-node.
const {loadTFLiteModel} = require('tfjs-tflite-node');
مدل را بارگذاری کنید
اکنون آماده بارگذاری مدل هستید. tfjs-tflite-node
تابع loadTFLiteModel
را برای انجام این کار فراهم می کند. می تواند مدل ها را از مسیر فایل، یک ArrayBuffer یا یک URL TFHub بارگیری کند. برای بارگذاری مدل و وزن آن، این را به تابع main
اضافه کنید:
CODELAB قسمت 1: مدل را در اینجا بارگذاری کنید.
const modelPath = './model/model_unquant.tflite';
const model = await loadTFLiteModel(modelPath);
const labels = fs.readFileSync('./model/labels.txt', 'utf8')
.split('\n');
مدل را اجرا کنید
اجرای مدل شما به سه مرحله نیاز دارد. ابتدا یک فریم ورودی را از وبکم میکشید و پیش پردازش میکنید. سپس، مدل را روی آن فریم اجرا میکنید و پیشبینی میکنید. پس از آن، پیش بینی را در صفحه نمایش می دهید.
ورودی وب کم را از قبل پردازش کنید
در حال حاضر، وب کم فقط یک عنصر HTML است و فریم هایی که نمایش می دهد برای فایل JavaScript renderer.js در دسترس نیستند. برای کشیدن فریمها از وبکم، TensorFlow.js tf.data.webcam را ارائه میکند، که یک روش capture()
با استفاده آسان برای گرفتن فریمها از دوربین ارائه میکند.
برای استفاده از آن، این کد راه اندازی را به main()
اضافه کنید:
CODELAB قسمت 1: tf.data.webcam را در اینجا راه اندازی کنید.
const tensorCam = await tf.data.webcam(webcam);
سپس، برای گرفتن یک تصویر در هر فریم، موارد زیر را به run()
اضافه کنید:
CODELAB قسمت 1: قاب های وب کم را در اینجا ضبط کنید.
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 قسمت 1: فریم های وب کم را در اینجا پیش پردازش کنید.
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 قسمت 1: فریم های وب کم را در اینجا دور بیندازید.
image.dispose();
مدل را اجرا کنید و نتایج را نمایش دهید
برای اجرای مدل بر روی ورودی از پیش پردازش شده، model.predict()
روی تانسور نرمال شده فراخوانی کنید. این یک تانسور یک بعدی حاوی احتمال پیشبینیشده هر برچسب را برمیگرداند. این احتمال را در 100 ضرب کنید تا درصد شانس هر برچسب را بدست آورید و از تابع showPrediction
همراه با کد شروع برای نشان دادن پیش بینی مدل بر روی صفحه استفاده کنید.
این کد همچنین از stats.js برای زمانبندی مدت زمان پیشبینی با برقراری تماس با stats.begin
و stats.end
در اطراف model.predict
استفاده میکند.
CODELAB قسمت 1: مدل را اجرا کنید و نتایج را در اینجا نمایش دهید.
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 FPS را خواهید دید که ممکن است برای برخی از برنامه ها به اندازه کافی سریع نباشد. برای دستیابی به عملکرد بهتر بدون استفاده از دستگاه سریعتر، می توانید از سیلیکون مخصوص برنامه به شکل Coral Edge TPU استفاده کنید.
5. مدل Coral را در اپلیکیشن خود اجرا کنید
اگر دستگاه کورال ندارید، می توانید از این بخش صرف نظر کنید.
این مرحله از نرمافزار کد از کدهایی است که در بخش آخر نوشتید، اما اگر میخواهید با یک صفحه تمیز شروع کنید، میتوانید به جای آن از چک پوینت cpu_inference_working استفاده کنید.
مراحل اجرای مدل Coral تقریباً مشابه مراحل اجرای مدل CPU است. تفاوت اصلی در قالب مدل است. از آنجایی که Coral فقط از تانسورهای uint8 پشتیبانی می کند، مدل کوانتیزه می شود. این روی تانسورهای ورودی ارسال شده به مدل و تانسورهای خروجی که برمیگرداند تأثیر میگذارد. تفاوت دیگر این است که مدل ها باید با استفاده از کامپایلر Edge TPU برای اجرا بر روی Coral TPU کامپایل شوند. TeachableMachine قبلاً این مرحله را انجام داده است، اما میتوانید با مراجعه به مستندات Coral ، نحوه انجام این کار را برای مدلهای دیگر بیاموزید.
فایل مدل Coral را به برنامه اضافه کنید
فایل مدل converted_edgetpu.zip را که هنگام آموزش طبقهبندی کننده دانلود کردهاید، از حالت فشرده خارج کنید. دو فایل در آرشیو موجود است. model_edgetpu.tflite
مدل ذخیره شده TFLite است که شامل نمودار مدل و وزن ها می شود. labels.txt
حاوی برچسب های قابل خواندن توسط انسان برای کلاس هایی است که مدل پیش بینی می کند. فایل مدل را در دایرکتوری coral_model قرار دهید.
وابستگی ها را نصب کنید
اجرای مدلهای Coral به کتابخانه زمان اجرا Edge TPU نیاز دارد. قبل از ادامه، با دنبال کردن دستورالعملهای راهاندازی، مطمئن شوید که آن را نصب کردهاید.
دستگاه های مرجانی به عنوان نمایندگان TFLite قابل دسترسی هستند. برای دسترسی به آنها از جاوا اسکریپت، بسته coral-tflite-delegate را نصب کنید:
npm install --save coral-tflite-delegate
سپس، با افزودن این خط به بالای فایل renderer.js ، نماینده را وارد کنید:
CODELAB قسمت 2: نماینده را در اینجا وارد کنید.
const {CoralDelegate} = require('coral-tflite-delegate');
مدل را بارگذاری کنید
اکنون آماده بارگیری مدل Coral هستید. شما این کار را به همان روشی که برای مدل CPU انجام میدهید، انجام میدهید، با این تفاوت که اکنون گزینههایی را به تابع loadTFLiteModel
میدهید تا نماینده Coral بارگذاری شود.
CODELAB قسمت 2: مدل نماینده را در اینجا بارگیری کنید.
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 قسمت 2: دکمه نمایندگی را در اینجا ایجاد کنید.
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
نادرست است، باید نسخه CPU را اجرا کند. در غیر این صورت، نسخه Coral را اجرا می کند (اما فعلاً هیچ کاری انجام نمی دهد). کد حاصل از اجرای مدل CPU را در یک دستور if قرار دهید . توجه داشته باشید که تانسور expanded
از دستور if حذف می شود زیرا مدل Coral از آن استفاده می کند.
CODELAB قسمت 2: بررسی کنید که آیا از نماینده در اینجا استفاده شود یا خیر.
// 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 را از 0 تا 255 دارد، بنابراین ورودی آن نیازی به نرمال سازی ندارد. با این حال، خروجی نیز یک تانسور uint8 در محدوده 0 تا 255 است. قبل از نمایش باید به یک شناور از 0 تا 100 تبدیل شود.
CODELAB قسمت 2: پیش بینی مرجانی را در اینجا اجرا کنید. (این بخشی از قطعه کد بالا است)
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 متر تا زمانی که تأخیر (بر حسب میلیثانیه) را نشان دهد، که فقط تماس model.predict
.predict را اندازهگیری میکند، ایده بهتری از عملکرد دریافت کنید. با این حال، این هنوز شامل زمان لازم برای انتقال تانسورها به اتصالات C اصلی TFLite و سپس به دستگاه Coral است، بنابراین اندازهگیری کاملی نیست. برای معیارهای عملکرد دقیقتر که در C++ نوشته شدهاند، به صفحه بنچمارک EdgeTPU مراجعه کنید.
همچنین نکته قابل توجه این است که ویدیو به جای Raspberry Pi بر روی یک لپ تاپ ضبط شده است، بنابراین ممکن است FPS متفاوتی ببینید.
سرعت بخشیدن به پیش پردازش مرجان
در برخی موارد، میتوانید با تعویض پشتیبانهای TFJS، سرعت پیشپردازش را افزایش دهید. باطن پیشفرض WebGL است که برای عملیاتهای بزرگ و قابل موازیسازی خوب است، اما این برنامه در مرحله پیشپردازش، این کار را انجام نمیدهد (تنها عملیاتی که استفاده میکند expandDims
است که موازی نیست). میتوانید با اضافه کردن این خط پس از وارد کردن در بالای فایل، به پشتیبان CPU بروید تا از تأخیر اضافی حرکت تانسورها به و از GPU جلوگیری کنید.
tf.setBackend(‘cpu');
این همچنین بر پیش پردازش مدل CPU TFLite که موازی شده است تأثیر می گذارد، به طوری که با این تغییر آن مدل بسیار کندتر اجرا می شود.
6. مدل CPU را با WebNN تسریع کنید
اگر شتابدهنده Coral ندارید، یا اگر فقط میخواهید روش دیگری را برای افزایش سرعت مدل امتحان کنید، میتوانید از نماینده WebNN TFLite استفاده کنید. این نماینده از سخت افزار یادگیری ماشین ساخته شده در پردازنده های اینتل برای تسریع استنتاج مدل با جعبه ابزار OpenVINO استفاده می کند. در نتیجه، نیازمندیهای اضافی دارد که در بخش راهاندازی این کد لبه پوشش داده نشدهاند، و شما باید جعبه ابزار OpenVINO را نصب کنید. قبل از ادامه، حتماً تنظیمات خود را با پلتفرمهای سیستم هدف پشتیبانی شده بررسی کنید، اما توجه داشته باشید که نماینده WebNN هنوز از macOS پشتیبانی نمیکند.
جعبه ابزار OpenVINO را نصب کنید
جعبه ابزار OpenVINO از سخت افزار یادگیری ماشینی ساخته شده در پردازنده های اینتل برای سرعت بخشیدن به مدل ها استفاده می کند. می توانید یک نسخه از پیش کامپایل شده را از اینتل دانلود کنید یا آن را از منبع بسازید . راه های مختلفی برای نصب OpenVINO وجود دارد، اما برای اهداف این Codelab، توصیه می کنیم از اسکریپت نصب برای ویندوز یا لینوکس استفاده کنید. حتماً نسخه 2021.4.2 LTS را نصب کنید، زیرا ممکن است نسخههای دیگر سازگار نباشند . پس از اجرای نصب کننده، مطمئن شوید که متغیرهای محیطی پوسته خود را همانطور که در دستورالعمل های نصب لینوکس یا ویندوز ( راه حل دائمی ) توضیح داده شده است، یا با اجرای setupvars.sh
(لینوکس) یا setupvars.bat
(ویندوز) پیکربندی کنید. در دایرکتوری webnn-tflite-delegate
.
بررسی کنید که WebNN Delegate کار می کند
برای تأیید اینکه نماینده 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 را پشتیبانی نمی کند ، بنابراین مطمئن شوید که آن و سایر دستورات را از این کد لبه از خط فرمان ویندوز اجرا کنید.
WebNN Delegate را نصب کنید
با نصب OpenVINO، اکنون آماده شتاب بخشیدن به مدل CPU با WebNN هستید. این بخش از codelab کدی را که شما در بخش "Run the CPU Model in Your App" نوشته اید، ایجاد می کند. می توانید از کدی که در این مرحله نوشتید استفاده کنید، اما اگر قبلاً قسمت Coral را تکمیل کرده اید، به جای آن از چک پوینت cpu_inference_working استفاده کنید تا با یک صفحه تمیز شروع کنید.
بخش Node.js از نماینده WebNN بر روی npmjs توزیع شده است. برای نصب آن، این دستور را اجرا کنید:
npm install --save webnn-tflite-delegate
سپس، با افزودن این خط به بالای فایل renderer.js ، نماینده را وارد کنید:
CODELAB قسمت 2: نماینده را در اینجا وارد کنید.
const {WebNNDelegate, WebNNDevice} = require('webnn-tflite-delegate');
نماینده WebNN از اجرای بر روی CPU یا GPU پشتیبانی می کند. WebNDevice به شما امکان می دهد انتخاب کنید که از کدام مورد استفاده کنید.
مدل را بارگذاری کنید
اکنون آماده بارگیری مدل با فعال بودن نماینده WebNN هستید. برای Coral، شما باید یک فایل مدل متفاوت را بارگیری میکردید، اما WebNN از همان قالب مدل TFLite پشتیبانی میکند. WebNDelegate را به لیست نمایندگان ارسال شده به مدل اضافه کنید تا آن را فعال کنید:
CODELAB قسمت 2: مدل نماینده را در اینجا بارگیری کنید.
let webnnModel = await loadTFLiteModel(modelPath, {
delegates: [new WebNNDelegate({webnnDevice: WebNNDevice.DEFAULT})],
});
شما نیازی به بارگذاری مجدد برچسب ها ندارید زیرا این همان مدل است.
یک دکمه برای جابجایی بین CPU TfLite و WebNN اضافه کنید
اکنون که نسخه WebNN مدل آماده است، یک دکمه برای جابجایی بین WebNN و استنتاج CPU TfLite اضافه کنید. اجرای هر دوی آنها به طور همزمان، مشاهده تفاوت عملکرد را دشوار می کند.
دکمه را با این کد اضافه کنید (توجه داشته باشید که هنوز مدل را تغییر نمی دهد):
CODELAB قسمت 2: دکمه نمایندگی را در اینجا ایجاد کنید.
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 مورد استفاده را تغییر دهد، یک شنونده به رویداد تغییر عنصر انتخابگر کشویی اضافه کنید. هنگامی که مقدار انتخاب شده تغییر کرد، مدل 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 و CPU TfLite هنوز مدل را تغییر نمیدهد. برای تغییر مدل، ابتدا باید نام متغیر model
از زمانی که مدل CPU TfLite را در بخش اول Codelab بارگذاری کردید تغییر دهید.
خط زیر را تغییر دهید...
const model = await loadTFLiteModel(modelPath);
... به طوری که با این خط مطابقت دارد.
const cpuModel = await loadTFLiteModel(modelPath);
با تغییر نام متغیر model
به cpuModel
، این را به تابع run
اضافه کنید تا بر اساس وضعیت دکمه، مدل صحیح را انتخاب کنید:
CODELAB قسمت 2: بررسی کنید که آیا از نماینده در اینجا استفاده شود یا خیر.
let model;
if (useWebNNDelegate) {
model = webnnModel;
} else {
model = cpuModel;
}
اکنون، هنگامی که برنامه را اجرا می کنید، دکمه بین CPU TfLite و WebNN تغییر می کند.
همچنین در صورت داشتن یک GPU یکپارچه اینتل، می توانید بین CPU WebNN و استنتاج GPU سوئیچ کنید.
نکته ای در مورد عملکرد
نرخ فریمی که مشاهده می کنید شامل پیش پردازش و پس پردازش است، بنابراین نشان دهنده توانایی WebNN نیست. میتوانید با کلیک بر روی FPS متر تا زمانی که تأخیر (بر حسب میلیثانیه) را نشان دهد، که فقط تماس model.predict
.predict را اندازهگیری میکند، ایده بهتری از عملکرد دریافت کنید. با این حال، این هنوز شامل زمان لازم برای انتقال تانسورها به اتصالات C اصلی TFLite است، بنابراین اندازهگیری کاملی نیست.
7. تبریک می گویم
تبریک می گویم! شما به تازگی اولین پروژه Coral / WebNN خود را با استفاده از tfjs-tflite-node در Electron تکمیل کرده اید.
آن را امتحان کنید و آن را روی تصاویر مختلف آزمایش کنید. همچنین می توانید یک مدل جدید را در TeachableMachine آموزش دهید تا چیزی کاملاً متفاوت را طبقه بندی کنید.
خلاصه
در این کد لبه یاد گرفتید:
- نحوه نصب و راه اندازی بسته tfjs-tflite-node npm برای اجرای مدل های TFLite در Node.js.
- نحوه نصب کتابخانه زمان اجرا Edge TPU برای اجرای مدل ها در دستگاه Coral.
- نحوه تسریع استنتاج مدل با استفاده از Coral edge TPU.
- نحوه تسریع استنتاج مدل با WebNN
بعدش چی؟
اکنون که یک پایگاه کاری برای شروع دارید، چه ایدههای خلاقانهای میتوانید برای گسترش این رانر مدل یادگیری ماشین به یک مورد استفاده در دنیای واقعی که ممکن است روی آن کار میکنید ارائه دهید؟ شاید بتوانید صنعتی را که در آن کار می کنید با استنتاج سریع و مقرون به صرفه متحول کنید، یا شاید بتوانید یک توستر را طوری تغییر دهید که وقتی نان درست به نظر می رسد، برشته شدن را متوقف کند. امکانات بی پایان هستند.
برای ادامه بیشتر و کسب اطلاعات بیشتر در مورد اینکه چگونه TeachableMachine مدل مورد استفاده شما را آموزش داده است، به آزمایشگاه کد ما در Transfer Learning مراجعه کنید. اگر به دنبال مدلهای دیگری هستید که با Coral کار میکنند، مانند تشخیص گفتار و تخمین ژست، به coral.ai/models نگاهی بیندازید. همچنین میتوانید نسخههای CPU آن مدلها و بسیاری دیگر را در TensorFlow Hub پیدا کنید.
آنچه را که می سازید با ما به اشتراک بگذارید
شما به راحتی می توانید آنچه را که امروز ساخته اید برای سایر موارد استفاده خلاقانه نیز گسترش دهید و ما شما را تشویق می کنیم که خارج از چارچوب فکر کنید و به هک کردن ادامه دهید.
به خاطر داشته باشید که ما را در رسانه های اجتماعی با استفاده از هشتگ #MadeWithTFJS تگ کنید تا فرصتی برای نمایش پروژه شما در وبلاگ TensorFlow یا حتی رویدادهای آینده داشته باشید. ما دوست داریم ببینیم شما چه چیزی درست می کنید.