نحوه تشخیص اشیا با استفاده از یادگیری عمیق روی رسپبری پای

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

می توانید به پایین صفحه بروید و Github Repos را مشاهده کنید.

تشخیص خودرو ها با رسپبری پای
تشخیص خودرو ها در جاده ها

چرا تشخیص شی ؟ چرا رسپبری پای ؟

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

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

تشخیص اشیا روی رسپبری پای

تشخیص شی چیست؟

سیر تکاملی ۲۰ میلیون ساله انسان ها، باعث ایجاد تحول در بینایی ما شده است. ۳۰ درصد از فعالیت  نورون های مغز انسان، مربوط به پردازش بینایی است، در حالی که ۸ درصد این فعالیت برای حس لامسه و تنها ۳ درصد برای شنوایی می باشد. انسان ها نسبت به ماشین ها دارای دو مزیت عمده هستند. یک، بینایی استریو اسکوپیک و دیگری تأمین داده های آموزشی تقریباً نامحدود است. یک کودک ۵ ساله تقریباً دارای ۲٫۷B تصویر نمونه برداری شده در نرخ ۳۰ فریم بر ثانیه است.

تشخیص اشیا با محلی سازی

دانشمندان جهت تقلید از عملکرد انسان ها، کار ادراک دیداری را به چهار دسته مختلف تقسیم بندی کرده اند:

  1. طبقه بندی : اختصاص یک برچسب به هر تصویر.
  2. محلی سازی : تخصیص یک کادر محصور کننده به یک برچسب خاص.
  3. تشخیص شی : رسم چندین کادر محصورکننده در یک تصویر.
  4. ناحیه بندی تصویر : ایجاد ناحیه های دقیق از جایی که اشیا در آن تصویر قرار گفته اند.

تشخیص شی برای بسیاری از کاربرد ها به اندازه کافی، مناسب است. هرچند ناحیه بندی تصویر، نتایج بسیار دقیق تری به دست می دهد، اما با مشکل پیچیدگی در ایجاد داده های آموزشی روبه رو است. یک حاشیه نگار انسانی، نسبت به ترسیم کادر های محصورکننده، ۱۲ برابر بیشتر طول می کشد تا یک تصویر را ناحیه بندی کند؛ در واقع این موضوع بدین صورت بیان شده است و فاقد منبع می باشد. همچنین پس از تشخیص اشیا، بخش بندی شی به صورت مجزا امکان پذیر می باشد.

استفاده از تشخیص شی

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

کاربرد های تشخیص اشیا

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

تشخیص شی می تواند برای پاسخ دهی به بسیاری از پرسش ها استفاده شود. این پرسش ها به دسته های وسیعی تقسیم بندی می شوند:

  1. آیا شی مورد نظر در تصویر من وجود دارد یا خیر، بعنوان مثال، ایا یک مزاحم در منزل من وجود دارد؟
  2. شی در کجای تصویر قرار گرفته است؟ برای مثال، مهم است بدانیم خودرویی که در تلاش برای مسیریابی است، در کجای تصویر قرار گرفته است.
  3. چه تعداد شی در یک تصویر وجود دارد؟ تشخیص شی یکی از کار آمدترین روش ها برای شمارش اشیا است، برای مثال چه تعداد جعبه در یک قفسه داخل یک انبار وجود دارد.
  4. انواع مختلف اشیا در تصویر کدامند؟ برای مثال کدام حیوان در کدام بخش از باغ وحش وجود دارد.
  5. اندازه یک شی چقدر است؟ اگر یک دوربین استاتیک به کار برده شود، تشخیص اندازه شی آسان است. به عنوان مثال اندازه انبه چقدر است.
  6. آیا اشیای مختلف با یکدیگر تعامل دارند؟ به عنوان مثال چگونه شکل گیری یک زمین فوتبال روی نتیجه آن تاثیر می گذارد.
  7. یک شی با توجه به زمان کجا قرار می گیرد (ردیابی شی). به عنوان مثال ردیابی یک شی متحرک مانند قطار و محاسبه سرعت آن.

تشخیص شی در کمتر ۲۰ خط کد

الگوریتم تشخیص شی yolo
نمایشی از الگوریتم YOLO

انواع مختلفی از مدل ها و یا معماری های مربوط به تشخیص شی وجود دارد. در هر کدام از این مدل ها بین سرعت، اندازه و دقت مصالحه وجود دارد. یکی از از معروفترین این مدل ها YOLO است. در صورت نادیده گرفتن کامنت های این برنامه، این مدل در کمتر است از ۲۰ سطر کد کار می کند.

توجه: این یک شبه کد است و معرف یک نمونه کاری نمی باشد. همچنین، دارای یک جعبه سیاه است که بخش CNN آن می باشد و نسبتاً استاندارد بوده و در شکل زیر نمایش داده شده است.

شما می توانید مقاله کامل را از اینجا مشاهده کنید.

معماری شبکه عصبی کانولوشنی در yolo
معماری شبکه عصبی کانولوشنی استفاده شده در YOLO

YOLO در کمتر از ۲۰ سطر کد!

چگونه می توان یک مدل یادگیری عمیق را برای تشخیص شی ایجاد نمود؟

گردش کار یادگیری عمیق دارای شش مرحله اولیه است که به سه بخش تقسیم می شود:

  1. جمع آوری داده های آموزشی
  2. آموزش مدل
  3. پیش بینی روی تصاویر جدید
چرخه ی تشخیص شب شبکه های عصبی عمیق

مرحله اول : جمع آوری داده های آموزشی

 گام ۱ . جمع آوری تصاویر ( برای هر شی حداقل ۱۰۰ تصویر )

برای انجام این کار، برای هر شی احتمالاً به ۱۰۰ تصویر نیاز دارید. سعی کنید داده هایی را جمع آوری کنید که به داده هایی که در نهایت می خواهید پیش بینی را روی آن ها انجام دهید، نزدیک باشند.

تصاویر پرندگان مجموعه داده

 گام ۲ . حاشیه نویسی ( کادر هایی را روی آن تصاویر به صورت دستی ترسیم کنید ) :

 در این مرحله کادر های محصورکننده روی تصاویر ترسیم می شوند. شما می توانید از ابزاری مانند labelImg استفاده کنید. همچنین، معمولاً به چندین نفر نیاز دارید که در حاشیه نویسی تصاویر به شما کمک نمایند که یک کار نسبتاً فشرده و زمان بر می باشد.

حاشیه نویسی تصاویر با labelimg

مرحله دوم : آموزش یک مدل روی یک ماشین دارای GPU

 گام ۳ . یافتن یک مدل از پیش آموزش داده شده برای یادگیری انتقالی :

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

 گام ۴ . آموزش روی یک GPU ( خدمات ابری مانند AWS/GCP یا ماشین GPU خودتان )

آموزش شبکه عصبی در فضای ابری

ایمیج داکر ( Docker Image )

فرایند آموزش یک مدل، دشوار می باشد که می توان با ایجاد یک ایمیج داکر ، این فرایند را تسهیل نمود. برای شروع آموزش مدل می توانید کد زیر را اجرا نمایید:

sudo nvidia-docker run -p 8000:8000 -v `pwd`:data docker.nanonets.com/pi_training -m train -a ssd_mobilenet_v1_coco -e ssd_mobilenet_v1_coco_0 -p '{"batch_size":8,"learning_rate":0.003}' 

 لطفاً برای آگاهی از جزئیات نحوه استفاده، به این لینک مراجعه کنید.

ایمیج داکر دارای یک اسکریپت run.sh می باشد که می تواند با پارامتر های زیر فراخوانی شود:

run.sh [-m mode] [-a architecture] [-h help] [-e experiment_id] [-c checkpoint] [-p hyperparameters]
-h          display this help and exit
-m          mode: should be either `train` or `export`
-p          key value pairs of hyperparameters as json string
-e          experiment id. Used as path inside data folder to run current experiment
-c          applicable when mode is export, used to specify checkpoint to use for export

برای آموزش یک مدل، نیاز است ابرپارامتر های درست را انتخاب نمایید.

یافتن پارامتر های صحیح

یادگیری عمیق تلاش می کند بهترین پارامتر ها را برای به دست آوردن بالاترین دقت برای مدل شما به دست آورد. اینجا یک منبع عالی برای یافتن پارامتر های صحیح است.

کوانتیزاسیون مدل ( کوچکتر کردن آن جهت قرار گرفتن روی یک دستگاه کوچک مانند رسپبری پای یا تلفن همراه )

دستگاه های کوچک مانند تلفن های همراه و  رسپبری پای دارای حافظه و توان مصرفی بسیار کمی هستند.

آموزش شبکه های عصبی، با اعمال تغییرات بسیار کوچک به وزن ها انجام می شود و این افزایش های کوچک، برای کار کردن معمولاً به دقت ممیز شناور نیاز دارند ( اگرچه تلاش های تحقیقاتی برای استفاده از بازنمایی های کوانتیزه شده نیز وجود دارند ).

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

چرا کوانتیزاسیون؟

مدل های شبکه عصبی، فضای بسیار زیادی را روی دیسک به خود اختصاص می دهند، به طور مثال AlexNet اولیه بیش از ۲۰۰ مگابایت در قالب ممیز شناور را به خود اختصاص می دهد. تقریباً تمامی این فضا، توسط وزن ها برای اتصالات شبکه در نظر گرفته می شود، چرا که غالباً میلیون ها وزن در یک مدل مجزا وجود دارند. گره ها و وزن های یک شبکه عصبی معمولاً به صورت اعداد ممیز شناور ۳۲ بیتی ذخیره می شوند. ساده ترین انگیزه برای انجام کوانتیزاسیون، کوچک کردن اندازه با ذخیره سازی مقادیر کمینه و بیشینه برای هر لایه، و فشرده سازی هر مقدار شناور به یک مقدار صحیح ۸ بیتی است. اندازه فایل ها تا ۷۵ درصد کاهش می یابد.

کوانتیزاسیون شبکه های عصبی

کد برای کوانتیزاسیون

curl -L "https://storage.googleapis.com/download.tensorflow.org/models/inception_v3_2016_08_28_frozen.pb.tar.gz" |
  tar -C tensorflow/examples/label_image/data -xz
bazel build tensorflow/tools/graph_transforms:transform_graph
bazel-bin/tensorflow/tools/graph_transforms/transform_graph \
--in_graph=tensorflow/examples/label_image/data/inception_v3_2016_08_28_frozen.pb \
  --out_graph=/tmp/quantized_graph.pb \
  --inputs=input \
  --outputs=InceptionV3/Predictions/Reshape_1 \
  --transforms='add_default_attributes strip_unused_nodes(type=float, shape="1,299,299,3")
    remove_nodes(op=Identity, op=CheckNumerics) fold_constants(ignore_errors=true)
    fold_batch_norms fold_old_batch_norms quantize_weights quantize_nodes
    strip_unused_nodes sort_by_execution_order

توجه: ایمیج داکر ما دارای کوانتیزاسیون داخلی در خود است.

مرحله سوم : پیش بینی ها روی تصاویر جدید با استفاده از  رسپبری پای

گام ۵ : تهیه تصویر جدید با استفاده از دوربین

شما در اینجا برای تهیه یک تصویر جدید به دوربین رسپبری پای نیاز دارید.

دوربین رسپبری پای

دستورالعمل های مربوط به نصب را در اینجا ببینید.

کد گرفتن یک عکس جدید

گام ۶ . پیش بینی یک تصویر جدید

دانلود مدل

پس از آموزش مدل خود می توانید آن را روی  رسپبری پای خود دانلود کنید. برای اکسپورت کردن مدل، کد زیر را اجرا کنید:

sudo nvidia-docker run -v `pwd`:data docker.nanonets.com/pi_training -m export -a ssd_mobilenet_v1_coco -e ssd_mobilenet_v1_coco_0 -c /data/0/model.ckpt-8998

سپس مدل را روی  رسپبری پای دانلود کنید.

نصب تنسورفلو روی رسپبری پای

بسته به دستگاهی که دارید، ممکن است تغییرات اندکی در نصب نیاز داشته باشید:

sudo apt-get install libblas-dev liblapack-dev python-dev libatlas-base-dev gfortran python-setuptools libjpeg-dev
sudo pip install Pillow
sudo pip install http://ci.tensorflow.org/view/Nightly/job/nightly-pi-zero/lastSuccessfulBuild/artifact/output-artifacts/tensorflow-1.4.0-cp27-none-any.whl
git clone https://github.com/tensorflow/models.git
sudo apt-get install -y protobuf-compiler
cd models/research/
protoc object_detection/protos/*.proto --python_out=.
export PYTHONPATH=$PYTHONPATH:/home/pi/models/research:/home/pi/models/research/slim

مدل را برای پیش بینی روی یک تصویر جدید اجرا کنید:

python ObjectDetectionPredict.py --model data/0/quantized_graph.pb --labels data/label_map.pbtxt --images /data/image1.jpg /data/image2.jpg

معیارهای عملکردی روی رسپبری پای

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

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

گردش کار با نانوشبکه ها

چرخه تشخیص شی نانو شبکه ها

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

چگونه نانوشبکه ها فرآیند را ساده تر می کنند:

  1. حاشیه نویسی مورد نیاز نمی باشد

نانوشبکه ها نیاز به حاشیه نویسی تصویر را حذف کرده اند و حاشیه نگار های خبره ای دارد که تصاویر را برای شما حاشیه نویسی می کنند.

  1. انتخاب بهترین مدل و ابرپارامتر به صورت خودکار

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

  1. هیچ نیازی به سخت افزار و GPU های گران قیمت نمی باشد

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

  1. برای دستگاه های متحرک مانند رسپبری پای بسیار خوب است

از آنجایی که دستگاه هایی مانند رسپبری پای و تلفن های همراه، به گونه ای ساخته نشده اند که کار های سنگین با محاسبات پیچیده را انجام دهند، شما می توانید حجم کاری خود را به فضای ابری نانوشبکه ها برون سپاری کنید، تا تمام محاسبات برای شما انجام شود.

اینجا یک قطعه کد ساده، برای پیش بینی یک تصویر جدید، با استفاده از API نانوشبکه بیان شده است:

نانوشبکه خود را بسازید :

نانوشبکه ها آپلود داده های آموزشی

می توانید مدل خود را بصورت زیر بسازید:

  1. استفاده از یک GUI ( همچنین حاشیه نویسی خودکار تصاویر )

https://nanonets.com/objectdetection/

  1. استفاده از API نانوشبکه ها

https://github.com/NanoNets/object-detection-sample-python

گام ۱: یک کلون از Repo درست کنید

git clone https://github.com/NanoNets/object-detection-sample-python.git
cd object-detection-sample-python
sudo pip install requests

گام ۲ : استفاده از کلید API

از طریق این آدرس کلید رایگان دریافت کنید : http://app.nanonets.com/user/api_key

گام ۳ : تنظیم کلید API بعنوان یک متغیر محیطی

export NANONETS_API_KEY=YOUR_API_KEY_GOES_HERE

گام ۴ : ایجاد یک مدل جدید

python ./code/create-model.py

نکته: بدین ترتیب یک MODEL_ID ایجاد می شود که برای مرحله بعد مورد نیاز است.

گام ۵ : اضافه کردن MODEL_ID بعنوان متغیر محیطی

export NANONETS_MODEL_ID=YOUR_MODEL_ID

گام ۶ : بارگذاری داده های آموزشی

تصاویر مربوط به اشیایی را که می خواهید تشخیص دهید، جمع آوری کنید. می توانید برای حاشیه نویسی آن ها یا از رابط کاربری وب Nanonets استفاده کنید و یا ابزاری مانند labelImg را بکارگیرید. پس از آماده سازی فلدرهای images (فایل های تصویر) و annotations (حاشیه های مربوط به فایل های تصویر)، بارگذاری پایگاه داده را آغاز کنید.

python ./code/upload-training.py

گام ۷ : آموزش مدل

پس از بارگذاری داده ها، مدل را آموزش دهید.

python ./code/train-model.py

گام ۸ : بدست آوردن حالت مدل

حدود دو ساعت زمان می برد تا مدل آموزش ببیند. پس از آموزش مدل، ایمیلی دریافت می کنید. در این میان، حالت مدل را نیز بررسی می کنید.

watch -n 100 python ./code/model-state.py

گام ۹ : انجام پیش بینی

در اینجا می توانید از مدل آموزش دیده، برای انجام پیش بینی تصاویر جدید استفاده کنید.

python ./code/prediction.py PATH_TO_YOUR_IMAGE.jpg

کد ( Github Reos )

آموزش یک مدل:

  1. Tensorflow Code for model Training and Quantization
  2. NanoNets Code for model Training

پیش بینی تصاویر جدید برای  رسپبری پای ( تشخیص اشیای جدید ) :

  1. Tensorflow Code for making Predictions on the Raspberry Pi
  2. NanoNets Code for making Predictions on the Raspberry Pi

پایگاه های داده با حاشیه نویسی

  1. Cars on Indian Roads sees, dataset for extracting vehicles from Images of Indian Roads
  2. Coco Dataset

بیشتر بخوانید : 

منبع https://medium.com/nanonets/how-to-easily-detect-objects-with-deep-learning-on-raspberrypi-225f29635c74

0/5 (0 نظر)

درباره‌ی احمدرضا جعفری

همچنین ببینید

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

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

فناوری شناسایی خودکار شماره پلاک ( پلاک خوان ) ده ها سال است که در …

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *