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

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

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

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

 

کسایی که می‌خوان هوش مصنوعی رو با شبکه‌های عصبی / یا شبکه‌های عصبی عمیق کنند، (برای مثال در بینایی ماشین و تشخیص اشیاء ) معمولاً به سراغ یکی از دو غول فریم ورک شبکه‌های عصبی، PyTorch یا TensorFlow میرن.

 

 

یک تاریخچه خیلی کوتاه

تنسورفلو رو شرکت گوگل و پایتورچ رو شرکت فیسبوک توسعه میده، هر دو فریم ورک زبان های سی پلاس پلاس و پایتون رو پشتیبانی میکنند.

معمولا تنسورفلو در پروژه های تجاری استفاده میشه (به دلیل یک سری اتوماسیون ها و البته پشتیبانی از موبایل و پردازنده های میکرو) و پروژه های غیر تجاری با پایتورچ نوشته میشن (پروژه های شخصی، مقالات و … به دلیل ساده تر بودن API).

تنسورفلو از نسخه 2 به بعد تغییرات بنیادی در API خودش داد و استفاده ازش به شدت ساده شد. پایتورچ از نسخه 1.3 به بعد موبایل رو هم پشتیبانی میکنه و البته قبلتر هم کسانی بودند که پایتورچ رو برای پردازنده های معروف بیلد گرفته باشند. با نسخه های فعلی این دو فریم ورک و بهینه سازی هایی که شدند، اینکه چه فریم ورکی استفاده کنید، شاید بیشتر سلیقه ای باشه!

من شخصا فرقی برام نمیکنه از چه فریم ورکی استفاده میکنم، من فقط میخوام نتیجه خیلی خوب بگیرم از کدم حالا میخواد هر زبان یا فریم ورکی باشه!

 

نسخه های جدیدتر رزبری

خوب، قرار شد با یه رزبری پای قدیمی، یه پروژه تشخیص اشیاء انجام بدیم. اگه پردازنده رزبری شما ARMv7 به بعد باشه و دیسترو (Distro) مبتنی بر Debian روش نصب کرده باشین، با دستورات زیر میتونین کتابخانه تنسورفلو لایت (TensorFlow Lite) رو برای پایتون نصب کنین:

 

اگه دیسترو دیگه ای دارین (مثلا Fedora و …) باید از دستور زیر استفاده کنین:

 

به جز جستجو در اینترنت، چطوری بفهمیم پردازنده رزبری ما چیه؟

این دستور رو استفاده کنید:

 

رزبری گوشه انباری برای تشخیص اشیاء

اگه پردازنده رزبری شما ARMv6 باشه، با دستورات قبلی کتابخانه برای شما غیر قابل استفادست، چونکه Instruction Set ها با هم در این دو پردازنده متفاوته.

خوب چرا نسخه صحیح نصب نشده؟ چونکه تنسورفلو دیگه از ARMv6 بیلد آماده تهیه نمیکنه و باید خودمون بیلد بگیریم.

سیستمی که برای بیلد استفاده میکنم یک ماشین مجازی Ubuntu 20.04 با 8 گیگابایت رم و یک پردازنده 2 هسته ایه.

 

بیلد گرفتن TensorFlow Lite برای ARMv6 جهت استفاده در یک پروژه سی پلاس پلاس  [1] [2]

اول باید cmake و مجموعه ابزار و کتابخانه های مورد نیاز کامپایل رو نصب کنین:

(مطمئن بشین که git رو هم نصب داشته باشین)

 

الان باید ریپازیتوری تنسورفلو رو کلون کنیم:

 

بعد پوشه های بیلد رو میسازیم و واردش میشیم:

 

و حالا باید toolchain مناسب برای معماری ARMv6 رو دانلود کنیم:

 

خوب رسیدیم به مرحله آماده سازی قبل از بیلد:

و هم اکنون، مرحله بیلد:

به جای اون N_JOBS بسته به منابع سیستمیتون، میتونین مشخص کنین به صورت موازی چند کامپایلر میتونه اجرا باشه (هر چی بالاتر سرعت بیلد بیشتر) ولی این به شدت حافظه میخوره و من با 8 گیگابایت حافظه اختصاصی برای این کار به مشکل خوردم (در حالت بدون گرافیک سیستم رو اجرا کردم) و مجبور شدم این عدد رو روی 2 تنظیم کنم.

 

در نتیجه یک کتابخانه استاتیک ایجاد میشه به اسم libtensorflow-lite.a که برای استفاده ازش توی پروژتون میتونین از این لینک کمک بگیرین.

 

بیلد گرفتن TensorFlow Lite برای ARMv6 جهت استفاده در یک پروژه پایتون [1] [2]

احتمالا نسخه پایتون روی دیسترویی که روی رزبری استفاده میکنید، 3.7 باشه، با اجرای دستور python3 –version از این مطمئن بشید.

باید داکر (Docker) رو نصب کنیم:

 

باید بریم به ریپازیتوری که کلون کردیم:

 

بعد این دستور رو برای بیلد میزنیم (یک ایمیج داکر رو دانلود میکنه و بیلد اونجا انجام میشه):

اون rpi0 که در آخر دستور اومده، یعنی داریم برای Raspberry Pi Zero که پردازندش ARMv6 هست بیلد میگیریم.

 

خوب یک نکته، اینجا هم ممکنه حافظه کم بیاره سیستمتون، پس فایل build_pip_package_with_cmake.sh رو باید ویرایش کنیم و در خطی که دستور بیلد هست (خط 118) جلوی سوییچ -j به جای ${BUILD_NUM_JOBS} عدد مناسب، مثلا 2 رو بذاریم.

 

وقتی که کار بیلد تموم بشه، فایل با پسوند whl در این مسیر قرار میگیره:

 

با توجه به نسخه سورسی که دانلود کردین، این فایل میتونه به این اسم باشه: tflite_runtime-2.6.0-cp37-cp37m-linux_armv6l.whl

در رزبری برای استفاده از این فایل در پایتون، باید در ابتدا با pip نصبش کنید:

 

اگه دستور pip نصب نبود، از این دستور استفاده کنید:

 

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

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

حمایت از علی اشتهاری پور

خوشحال میشیم برای تداوم و کیفیت ما رو حمایت کنید.

0 نفر

پــــســنــدیـده انـد

توجه

دیدگاه ها

4 دیدگاه

  • مهدی شرفی
    ۲۱ بهمن ۱۴۰۰

    با اختلاف و فاصله سال نوری از بقیه سایت ها، بهترین تولید کننده محتوا در زمینه الکترونیک هستید، خوشحالم که با سایتتون و این مطالب اون آشنا شدم، پیدا کردن این همه اطلاعات مفید به صورت یک جا و خلاصه و دقیق و نکات اساسی واقعا غیر ممکن هست و تنها با ساعت ها مطالعه میشه به این نقطه رسید. از زحماتتون ممنونم

    • Sisoog Os
      Sisoog Os
      ۲۳ بهمن ۱۴۰۰

      سلام دوست عزیز
      این نظر لطف شماست و ممنون بابت این همه انرژی

  • رضا مرتضوی
    ۲۳ خرداد ۱۴۰۰

    سلام
    خیلی عالی
    اگر ممکنه بفرمایید آیا میشه مراحل build را در یک کامیپوتر مجازی روی سیستم خودمان انجام دهیم و بعد image مربوط را به رزبری انتقال دهیم؟
    لطفا در مورد سوئیچ‌های مورد استفاده هم توضیح دهید و اینکه کار کلی toolchain‌ چی هست. در حد یک خط آموزنده خواهد بود.

    • علی اشتهاری پور
      علی اشتهاری پور
      ۲۳ خرداد ۱۴۰۰

      سلام،
      بله در مقاله گفته‌ام که این کارو رو روی ماشین مجازی اوبونتو انجام میدم.
      این toolchain یعنی ابزار و کتابخانه‌های مورد نیاز برای Compile کردن برای معماری مورد نظر.

      بیشتر سوییچ‌ها کارشون مشخصه، اگه موردی هست که مبهمه سوال بفرمایین سعی میکنم پاسخ بدم.

پر بحث ترین ها

مسابقه دوم : چالش برنامه نویسی به زبان C

مسابقه اول سیسوگ (مسابقه اول: درک سخت افزار) انتقادهای زیادی رو در پی داشت تا جایی که حتی خودمم به نتیجه مسابقه...

Zeus ‌ Zeus ‌
  • 2 سال پیش

راه اندازی LCD گرافیکی Nokia 1661 و دانلود کتابخانه آن

LCD گرافیکی یکی از مهم ترین پارامترهای موجود در طراحی انواع مدارات الکترونیکی پیچیده و حتی ساده است ، نمایش وضعیت و...

Zeus ‌ Zeus ‌
  • 4 سال پیش

ریموت کدلرن و چکونگی دکد کردن آن به همراه سورس برنامه

ریموت کنترل امروزه کاربرد زیادی پیدا کرده است؛ از ریموت‌های درب بازکن تا ریموت‌های دزدگیر و کنترل روشنایی همه از یک اصول اولیه پیروی می‌کنند و آن‌هم ارسال اطلاعات به‌صورت بی‌سیم است....

Zeus ‌ Zeus ‌
  • 5 سال پیش

مسابقه سوم: استخراج داده از رشته ها در زبان C

نزدیک به 5 ماه از مسابقه دوم سیسوگ می‌گذره و فکر کردم که بد نیست یک چالش جدید داشته باشیم! البته چالش‌ها...

Zeus ‌ Zeus ‌
  • 2 سال پیش

همه چیز درباره ریموت کنترل‌های هاپینگ

امنیت همیشه و در همه‌ی اعصار، مقوله‌ی مهم و قابل‌توجه‌ ای بوده و همیشه نوع بشر به دنبال امنیت بیشتر، دست به ابداعات و اختراعات گوناگونی زده است. ریموت کنترل یکی از این اختراعات است. در این مقاله، به بررسی امنیت انواع ریموت‌های کنترل خواهیم پرداخت....

Zeus ‌ Zeus ‌
  • 5 سال پیش

مسابقه ششم: بزن میکروکنترلر را بسوزون!

بزنم میکروکنترلر را بسوزونم اونم تو  این شرایط!، طراحی مسابقه از اون چیزی که به نظر می‌رسه سخت‌تر است، باید حواست باشه...

Zeus ‌ Zeus ‌
  • 9 ماه پیش

آموزش قدم به قدم راه اندازی +NRF24L01

آموزش قدم به قدم راه اندازی +NRF24L01  با کتابخانه سازگار با انواع میکروکنترلرها و کامپایلرها قبل از اینکه قسمت بشه با ماژول...

رسول خواجوی بجستانی رسول خواجوی بجستانی
  • 3 سال پیش

ساخت ماینر با FPGA و ARM

چند ماهی هست که تب بیت کوین و ارزهای دیجیتال خیلی بالا رفته! چه شد که این پست را نوشتم همانطور که...

Zeus ‌ Zeus ‌
  • 3 سال پیش

مسابقه چهارم: کدام حلقه سریع‌تر است؟

حدود ۷ ماه پیش، مسابقه سوم سیسوگ رو برگزار کردیم و کلی نکته در مورد خواندن رشته‌های ورودی را بررسی کردیم. فکر...

Zeus ‌ Zeus ‌
  • 1 سال پیش

کار با ماژول تمام عیار mc60 – قسمت دوم – راه اندازی OpenCPU

در قسمت اول به یکسری اطلاعات کلی ماژول mc60 پرداختیم، با نرم افزار QNavigator کار کردیم و یک هدربرد هم برای کار...

Mahdi.h   Mahdi.h  
  • 2 سال پیش
سیـــســـوگ

مرجع متن باز آموزش الکترونیک