در این مجموعه مقاله قصد دارم تا نشون بدم چطوری میشه با استفاده از تنسورفلو لایت (نسخه مخصوص موبایل) روی Raspberry Pi B+ 2014 (رزبری دوران عهد عتیق) اشیاء موجود در تصویر رو شناسایی کرد!
کسایی که میخوان هوش مصنوعی رو با شبکههای عصبی / یا شبکههای عصبی عمیق کنند، (برای مثال در بینایی ماشین و تشخیص اشیاء ) معمولاً به سراغ یکی از دو غول فریم ورک شبکههای عصبی، PyTorch یا TensorFlow میرن.
یک تاریخچه خیلی کوتاه
تنسورفلو رو شرکت گوگل و پایتورچ رو شرکت فیسبوک توسعه میده، هر دو فریم ورک زبان های سی پلاس پلاس و پایتون رو پشتیبانی میکنند.
معمولا تنسورفلو در پروژه های تجاری استفاده میشه (به دلیل یک سری اتوماسیون ها و البته پشتیبانی از موبایل و پردازنده های میکرو) و پروژه های غیر تجاری با پایتورچ نوشته میشن (پروژه های شخصی، مقالات و … به دلیل ساده تر بودن API).
تنسورفلو از نسخه 2 به بعد تغییرات بنیادی در API خودش داد و استفاده ازش به شدت ساده شد. پایتورچ از نسخه 1.3 به بعد موبایل رو هم پشتیبانی میکنه و البته قبلتر هم کسانی بودند که پایتورچ رو برای پردازنده های معروف بیلد گرفته باشند. با نسخه های فعلی این دو فریم ورک و بهینه سازی هایی که شدند، اینکه چه فریم ورکی استفاده کنید، شاید بیشتر سلیقه ای باشه!
من شخصا فرقی برام نمیکنه از چه فریم ورکی استفاده میکنم، من فقط میخوام نتیجه خیلی خوب بگیرم از کدم حالا میخواد هر زبان یا فریم ورکی باشه!
نسخه های جدیدتر رزبری
خوب، قرار شد با یه رزبری پای قدیمی، یه پروژه تشخیص اشیاء انجام بدیم. اگه پردازنده رزبری شما ARMv7 به بعد باشه و دیسترو (Distro) مبتنی بر Debian روش نصب کرده باشین، با دستورات زیر میتونین کتابخانه تنسورفلو لایت (TensorFlow Lite) رو برای پایتون نصب کنین:
1 2 3 4 5 6 7 | echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - sudo apt-get update sudo apt-get install python3-tflite-runtime |
اگه دیسترو دیگه ای دارین (مثلا Fedora و …) باید از دستور زیر استفاده کنین:
1 | pip3 install --index-url https://google-coral.github.io/py-repo/ tflite_runtime |
به جز جستجو در اینترنت، چطوری بفهمیم پردازنده رزبری ما چیه؟
این دستور رو استفاده کنید:
1 | cat /proc/cpuinfo |
رزبری گوشه انباری برای تشخیص اشیاء
اگه پردازنده رزبری شما ARMv6 باشه، با دستورات قبلی کتابخانه برای شما غیر قابل استفادست، چونکه Instruction Set ها با هم در این دو پردازنده متفاوته.
خوب چرا نسخه صحیح نصب نشده؟ چونکه تنسورفلو دیگه از ARMv6 بیلد آماده تهیه نمیکنه و باید خودمون بیلد بگیریم.
سیستمی که برای بیلد استفاده میکنم یک ماشین مجازی Ubuntu 20.04 با 8 گیگابایت رم و یک پردازنده 2 هسته ایه.
بیلد گرفتن TensorFlow Lite برای ARMv6 جهت استفاده در یک پروژه سی پلاس پلاس
اول باید cmake و مجموعه ابزار و کتابخانه های مورد نیاز کامپایل رو نصب کنین:
(مطمئن بشین که git رو هم نصب داشته باشین)
1 | sudo apt-get install git build-essential cmake |
الان باید ریپازیتوری تنسورفلو رو کلون کنیم:
1 | git clone https://github.com/tensorflow/tensorflow.git tensorflow_src |
بعد پوشه های بیلد رو میسازیم و واردش میشیم:
1 2 3 | mkdir tflite_build cd tflite_build |
و حالا باید toolchain مناسب برای معماری ARMv6 رو دانلود کنیم:
1 2 3 4 5 | curl -L https://github.com/rvagg/rpi-newer-crosstools/archive/eb68350c5c8ec1663b7fe52c742ac4271e3217c5.tar.gz -o rpi-toolchain.tar.gz tar xzf rpi-toolchain.tar.gz -C ${HOME}/toolchains mv ${HOME}/toolchains/rpi-newer-crosstools-eb68350c5c8ec1663b7fe52c742ac4271e3217c5 ${HOME}/toolchains/arm-rpi-linux-gnueabihf |
خوب رسیدیم به مرحله آماده سازی قبل از بیلد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | ARMCC_PREFIX=${HOME}/toolchains/arm-rpi-linux-gnueabihf/x64-gcc-6.5.0/arm-rpi-linux-gnueabihf/bin/arm-rpi-linux-gnueabihf- ARMCC_FLAGS="-march=armv6 -mfpu=vfp -funsafe-math-optimizations" cmake -DCMAKE_C_COMPILER=${ARMCC_PREFIX}gcc \ -DCMAKE_CXX_COMPILER=${ARMCC_PREFIX}g++ \ -DCMAKE_C_FLAGS="${ARMCC_FLAGS}" \ -DCMAKE_CXX_FLAGS="${ARMCC_FLAGS}" \ -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \ -DCMAKE_SYSTEM_NAME=Linux \ -DCMAKE_SYSTEM_PROCESSOR=armv6 \ -DTFLITE_ENABLE_XNNPACK=OFF \ ../tensorflow_src/tensorflow/lite/ |
و هم اکنون، مرحله بیلد:
1 | cmake --build . -j N_JOBS |
به جای اون N_JOBS بسته به منابع سیستمیتون، میتونین مشخص کنین به صورت موازی چند کامپایلر میتونه اجرا باشه (هر چی بالاتر سرعت بیلد بیشتر) ولی این به شدت حافظه میخوره و من با 8 گیگابایت حافظه اختصاصی برای این کار به مشکل خوردم (در حالت بدون گرافیک سیستم رو اجرا کردم) و مجبور شدم این عدد رو روی 2 تنظیم کنم.
در نتیجه یک کتابخانه استاتیک ایجاد میشه به اسم libtensorflow-lite.a که برای استفاده ازش توی پروژتون میتونین از این لینک کمک بگیرین.
بیلد گرفتن TensorFlow Lite برای ARMv6 جهت استفاده در یک پروژه پایتون
احتمالا نسخه پایتون روی دیسترویی که روی رزبری استفاده میکنید، 3.7 باشه، با اجرای دستور python3 –version از این مطمئن بشید.
باید داکر (Docker) رو نصب کنیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | sudo apt-get remove docker docker-engine docker.io containerd runc sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io |
باید بریم به ریپازیتوری که کلون کردیم:
1 | cd tensorflow_src |
بعد این دستور رو برای بیلد میزنیم (یک ایمیج داکر رو دانلود میکنه و بیلد اونجا انجام میشه):
1 | tensorflow/tools/ci_build/ci_build.sh PI-PYTHON37 tensorflow/lite/tools/pip_package/build_pip_package_with_cmake.sh rpi0 |
اون rpi0 که در آخر دستور اومده، یعنی داریم برای Raspberry Pi Zero که پردازندش ARMv6 هست بیلد میگیریم.
خوب یک نکته، اینجا هم ممکنه حافظه کم بیاره سیستمتون، پس فایل build_pip_package_with_cmake.sh رو باید ویرایش کنیم و در خطی که دستور بیلد هست (خط 118) جلوی سوییچ -j به جای ${BUILD_NUM_JOBS} عدد مناسب، مثلا 2 رو بذاریم.
وقتی که کار بیلد تموم بشه، فایل با پسوند whl در این مسیر قرار میگیره:
1 | tensorflow/lite/tools/pip_package/gen/tflite_pip/python3.7/dist/ |
با توجه به نسخه سورسی که دانلود کردین، این فایل میتونه به این اسم باشه: tflite_runtime-2.6.0-cp37-cp37m-linux_armv6l.whl
در رزبری برای استفاده از این فایل در پایتون، باید در ابتدا با pip نصبش کنید:
1 | pip3 install tflite_runtime-2.6.0-cp37-cp37m-linux_armv6l.whl |
اگه دستور pip نصب نبود، از این دستور استفاده کنید:
1 | sudo apt install python3-pip |
در قسمت بعدی پیاده سازی تشخیص اشیاء در پایتون رو باهاتون به اشتراک میذارم.
منتظر قسمت بعدی باشید…
همچنین بخوانید:
با اختلاف و فاصله سال نوری از بقیه سایت ها، بهترین تولید کننده محتوا در زمینه الکترونیک هستید، خوشحالم که با سایتتون و این مطالب اون آشنا شدم، پیدا کردن این همه اطلاعات مفید به صورت یک جا و خلاصه و دقیق و نکات اساسی واقعا غیر ممکن هست و تنها با ساعت ها مطالعه میشه به این نقطه رسید. از زحماتتون ممنونم
سلام دوست عزیز
این نظر لطف شماست و ممنون بابت این همه انرژی
سلام
خیلی عالی
اگر ممکنه بفرمایید آیا میشه مراحل build را در یک کامیپوتر مجازی روی سیستم خودمان انجام دهیم و بعد image مربوط را به رزبری انتقال دهیم؟
لطفا در مورد سوئیچهای مورد استفاده هم توضیح دهید و اینکه کار کلی toolchain چی هست. در حد یک خط آموزنده خواهد بود.
سلام،
بله در مقاله گفتهام که این کارو رو روی ماشین مجازی اوبونتو انجام میدم.
این toolchain یعنی ابزار و کتابخانههای مورد نیاز برای Compile کردن برای معماری مورد نظر.
بیشتر سوییچها کارشون مشخصه، اگه موردی هست که مبهمه سوال بفرمایین سعی میکنم پاسخ بدم.