تشخیص اشیاء با استفاده از Raspberry Pi B+ 2014 – قسمت اول

0
126
تشخیص اشیاء با استفاده از Raspberry Pi B+ 2014 – قسمت اول
در این مجموعه مقاله قصد دارم تا نشون بدم چطوری میشه با استفاده از تنسورفلو لایت (نسخه مخصوص موبایل) روی 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

 

در قسمت بعدی پیاده سازی تشخیص اشیاء در پایتون رو باهاتون به اشتراک میذارم.

منتظر قسمت بعدی باشید…

 

 

 

منبع:سیسوگ

 

مطلب قبلیانقلاب صنعتی چهارم – هوش مصنوعی
مطلب بعدیتشخیص اشیاء با استفاده از Raspberry Pi B+ 2014 – قسمت دوم

پاسخ دهید

لطفا نظر خود را وارد کنید!
لطفا نام خود را در اینجا وارد کنید