در این مجموعه مقاله قصد دارم تا نشون بدم چطوری میشه با استفاده از تنسورفلو لایت (نسخه مخصوص موبایل) روی Raspberry Pi B+ 2014 (رزبری دوران عهد عتیق) اشیاء موجود در تصویر رو شناسایی کرد!
کسایی که میخوان هوش مصنوعی رو با شبکههای عصبی / یا شبکههای عصبی عمیق کنند، (برای مثال در بینایی ماشین و تشخیص اشیاء ) معمولاً به سراغ یکی از دو غول فریم ورک شبکههای عصبی، PyTorch یا TensorFlow میرن.
یک تاریخچه خیلی کوتاه
تنسورفلو رو شرکت گوگل و پایتورچ رو شرکت فیسبوک توسعه میده، هر دو فریم ورک زبان های سی پلاس پلاس و پایتون رو پشتیبانی میکنند.
معمولا تنسورفلو در پروژه های تجاری استفاده میشه (به دلیل یک سری اتوماسیون ها و البته پشتیبانی از موبایل و پردازنده های میکرو) و پروژه های غیر تجاری با پایتورچ نوشته میشن (پروژه های شخصی، مقالات و … به دلیل ساده تر بودن API).
تنسورفلو از نسخه 2 به بعد تغییرات بنیادی در API خودش داد و استفاده ازش به شدت ساده شد. پایتورچ از نسخه 1.3 به بعد موبایل رو هم پشتیبانی میکنه و البته قبلتر هم کسانی بودند که پایتورچ رو برای پردازنده های معروف بیلد گرفته باشند. با نسخه های فعلی این دو فریم ورک و بهینه سازی هایی که شدند، اینکه چه فریم ورکی استفاده کنید، شاید بیشتر سلیقه ای باشه!
من شخصا فرقی برام نمیکنه از چه فریم ورکی استفاده میکنم، من فقط میخوام نتیجه خیلی خوب بگیرم از کدم حالا میخواد هر زبان یا فریم ورکی باشه!
نسخه های جدیدتر رزبری
خوب، قرار شد با یه رزبری پای قدیمی، یه پروژه تشخیص اشیاء انجام بدیم. اگه پردازنده رزبری شما ARMv7 به بعد باشه و دیسترو (Distro) مبتنی بر Debian روش نصب کرده باشین، با دستورات زیر میتونینکتابخانه تنسورفلو لایت (TensorFlow Lite) رو برای پایتون نصب کنین:
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 و …) باید از دستور زیر استفاده کنین:
pip3 install --index-url https://google-coral.github.io/py-repo/ tflite_runtime
به جز جستجو در اینترنت، چطوری بفهمیم پردازنده رزبری ما چیه؟
این دستور رو استفاده کنید:
cat /proc/cpuinfo
رزبری گوشه انباری برای تشخیص اشیاء
اگه پردازنده رزبری شما ARMv6 باشه، با دستورات قبلی کتابخانه برای شما غیر قابل استفادست، چونکه Instruction Set ها با هم در این دو پردازنده متفاوته.
خوب چرا نسخه صحیح نصب نشده؟ چونکه تنسورفلو دیگه از ARMv6 بیلد آماده تهیه نمیکنه و باید خودمون بیلد بگیریم.
سیستمی که برای بیلد استفاده میکنم یک ماشین مجازی Ubuntu 20.04 با 8 گیگابایت رم و یک پردازنده 2 هسته ایه.
بیلد گرفتن TensorFlow Lite برای ARMv6 جهت استفاده در یک پروژه سی پلاس پلاس [1] [2]
اول باید cmake و مجموعه ابزار و کتابخانه های مورد نیاز کامپایل رو نصب کنین:
(مطمئن بشین که git رو هم نصب داشته باشین)
sudo apt-get install git build-essential cmake
الان باید ریپازیتوری تنسورفلو رو کلون کنیم:
git clone https://github.com/tensorflow/tensorflow.git tensorflow_src
بعد پوشه های بیلد رو میسازیم و واردش میشیم:
mkdir tflite_build cd tflite_build
و حالا باید toolchain مناسب برای معماری ARMv6 رو دانلود کنیم:
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
خوب رسیدیم به مرحله آماده سازی قبل از بیلد:
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/
و هم اکنون، مرحله بیلد:
cmake --build . -j N_JOBS
به جای اون N_JOBS بسته به منابع سیستمیتون، میتونین مشخص کنین به صورت موازی چند کامپایلر میتونه اجرا باشه (هر چی بالاتر سرعت بیلد بیشتر) ولی این به شدت حافظه میخوره و من با 8 گیگابایت حافظه اختصاصی برای این کار به مشکل خوردم (در حالت بدون گرافیک سیستم رو اجرا کردم) و مجبور شدم این عدد رو روی 2 تنظیم کنم.
در نتیجه یک کتابخانه استاتیک ایجاد میشه به اسم libtensorflow-lite.a که برای استفاده ازش توی پروژتون میتونین ازاین لینک کمک بگیرین.
بیلد گرفتن TensorFlow Lite برای ARMv6 جهت استفاده در یک پروژه پایتون [1] [2]
احتمالا نسخه پایتون روی دیسترویی که روی رزبری استفاده میکنید، 3.7 باشه، با اجرای دستور python3 –version از این مطمئن بشید.
باید داکر (Docker) رو نصب کنیم:
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
باید بریم به ریپازیتوری که کلون کردیم:
cd tensorflow_src
بعد این دستور رو برای بیلد میزنیم (یک ایمیج داکر رو دانلود میکنه و بیلد اونجا انجام میشه):
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 در این مسیر قرار میگیره:
tensorflow/lite/tools/pip_package/gen/tflite_pip/python3.7/dist/
با توجه به نسخه سورسی که دانلود کردین، این فایل میتونه به این اسم باشه: tflite_runtime-2.6.0-cp37-cp37m-linux_armv6l.whl
در رزبری برای استفاده از این فایل در پایتون، باید در ابتدا با pip نصبش کنید:
pip3 install tflite_runtime-2.6.0-cp37-cp37m-linux_armv6l.whl
اگه دستور pip نصب نبود، از این دستور استفاده کنید:
sudo apt install python3-pip
در قسمت بعدی پیاده سازی تشخیص اشیاء در پایتون رو باهاتون به اشتراک میذارم.
منتظر قسمت بعدی باشید…
منبع:سیسوگ