همه‌ی نوشته‌های محمدرضا حقیری

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

چرا قالب وبلاگ تغییر کرد؟

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

از طرفی، قالب قبلی مشکلات زیادی در خوانده‌شدگی داشت که عبارت بودند از مشکلات مرتبط با حالت تاریک مرورگر (ظاهرا اگر کاربر از افزونه‌هایی که حالت تاریک رو به وبسایت‌های فاقد اون حالت هستند اضافه می‌کنه؛ استفاده می‌کرد، حالتش تغییر نمی‌کرد) و مشکلات خواندن در گوشی تلفن همراه. بسیاری از این ایرادات رو از طریق سرچ کنسول گوگل متوجه شدم و خب همینطوری که دنبال قالب می‌گشتم چیزهای جالبی دیدم.

اما می‌دونید چه چیزی باعث شد به این قالب بیام؟ یادمه سالیان پیش، برای وبسایت پروژه جبیر (بایگانی وب) از قالب Pinboard استفاده می‌کردم که الان هم در وبلاگ آزادقلم (لینک) داره استفاده می‌شه. بعد یادم آمد که برای استفاده از این قالب با زبان فارسی، نیازمند کلی تغییر در CSS و غیره هستیم.

از همین رو، رفتم سراغ وبلاگ‌های قدیمی وبلاگستان فارسی که ببینم کی، از چی استفاده می‌کنه (یا می‌کرده) و هیچی به نظرم دم دست تر از کی‌برد آزاد جادی نیومد 🙂 نتیجه این شد که از همون قالبی که جادی استفاده می‌کنه، استفاده کردم. البته با شکل متفاوتی.

Share

نصب Phosh روی دبیان

گنوم، چندسال اخیر رو در حال بهبود تجربه کاربریش روی دستگاه‌هایی مثل گوشی‌های همراه و همچنین تبلت‌هاست. در کل، داره برای یک انقلاب در صفحات لمسی آماده میشه. حالا، یک رابط کاربری جالب به اسم Phosh (مخففی برای Phone Shell) ارائه کرده که روی دبیان (بله، حتی دسکتاپ!) قابل نصب و اجراست.

نماگرفت زیر، نماگرفتی از صفحه قفل این رابط کاربریه:

و خب همونطوری که می‌بینید، کار تمیز و نسبتا زیباییه. حالا سوال اینه چطور نصبش کنیم؟ در ادامه مطلب مفصلا توضیح میدم 🙂

نصب قدم به قدم Phosh روی دبیان

گام اول: نصب دبیان

توجه داشته باشید که دبیان مد نظر من اینجا، دبیانیه که شما روی پردازنده‌های x86 نصب می‌کنید. اگر قراره این دبیان روی رزبری پای باشه، یا سیستم شخصی شما صفحه لمسی داره، می‌تونید این قسمت رو نادیده بگیرید. اما من نصب رو روی یک ماشین مجازی با کمک Virtual Box انجام دادم. آموزش نصب دبیان، در اینترنت زیاد پیدا میشه؛ فلذا اینجا حرفی از آموزش نصب به میان نمیارم. فقط حواستون باشه نسخه Net Install دبیان رو دانلود و نصب کنید که چیز اضافه‌ای نداشته باشیم. برای دانلود دبیان هم می‌تونید به وبسایت دبیان مراجعه کنید و آخرین ISO مورد نظر رو بگیرید.

گام دوم: قبل از نصب Phosh چه کنیم؟

خب اولین کاری که قبل از نصب Phosh کنید اینه که با خودتون یک فنجان قهوه یا نوشیدنی خنک داشته باشید چون پروسه نصب ممکنه شما رو خسته و تشنه کنه. بعد از اون، بد نیست که سیستم رو بروزرسانی کنید. بعد از بروزرسانی سیستم‌عامل، نوبتی هم باشه نوبت اینه که مستقیم بریم سر نصب Phosh. اینجا هم جا داره نکته مهم رو متذکر بشم که من phosh رو از مخازن نصب می‌کنم تا صرفا کنجکاوی رفع شده باشه وگرنه روش درست‌تر نصب phosh نصب از کد منبعه (حداقل اگر روی سیستم x86 و به قصد توسعه نصب می‌کنید).

گام سوم: نصب و راه‌اندازی Phosh

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

sudo apt install phosh-core

و اگر می‌خواهید Phosh شما مناسب تبلت باشه:

sudo apt install phosh-tablet

و اگر می‌خواهید نسخه کامل Phosh رو نصب کنید، کافیه که دستور رو به این شکل تغییر بدید:

sudo apt install phosh-full

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

sudo systemctl enable phosh
sudo systemctl start phosh

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

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

خب، حالا با خیال راحت می‌تونیم از Phosh استفاده کنیم و لذت ببریم 😁

نکات مهم

از اونجایی که Phosh نرم‌افزار نوپا و نسبتا جدیدیه، لازمه چند نکته مهم رو در موردش متذکر بشم:

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

کدوم توزیع‌ها از Phosh پشتیبانی می‌کنند؟

این هم سوال مهمیه، تا جایی که دیدم PostmarketOS (که برمبنای آلپاین ساخته شده) و همچنین Mobian (که برپایه دبیانه) از این میزکار (یا بهتر بگم پوسته) پشتیبانی می‌کنند. در مورد سایر توزیع‌ها/سیستم‌عامل‌هایی که ممکنه گنوم رو اجرا کنند، ایده‌ای ندارم.

جمع‌بندی

این بلاگ اصلا قرار نبود نوشته شه، ولی امروز از سر خستگی (دقیقا خستگی 😂) جستجو کردم ببینم Phosh چطور می‌تونه روی دبیان دسکتاپ نصب بشه. امتحانش کردم و به نظرم پروژه تمیز، باحال و آینده‌داری اومد. حالا هم تستش کردم و هم یک سری ایده‌ اومد به ذهنم. در آینده، احتمالا بیشتر با Phosh کار کنم و در موردش بنویسم. در آخر هم بابت وقتی که صرف کردید و این مطلب رو خوندید، ازتون تشکر می‌کنم.

Share

[آرشیو مطالب قدیمی] : مصاحبه با محمدرضا حقیری ، مدیر پروژه جبیر

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

خودتون رو برای دوستان معرفی کنید.

سلام :) . محمدرضا حقیری هستم متولد نهم خرداد ماه ۱۳۷۵ در شهر تهران و اکنون ساکن بندرعباس. در حال حاضر در دوره متوسطه مشغول تحصیل هستم. از جمله مقامات و رتبه هایی هم که کسب کردم ، میتونم به رتبه سوم رباتیک مدارس راهنمایی استان تهران ، رتبه دوم تولید محتوای آموزشی (نرم افزار) در استان تهران ، رتبه اول مسابقات گرافیک رایانه استان هرمزگان و رتبه ۶۴ المپیاد کامپیوتر کشوری. همچنین طرح سیستم عامل جبیر هم رتبه ۱۲ کشوری جشنواره جوان خوارزمی رو کسب کرده :)

از کی شروع به فعالیت کردید؟

از سال ۱۳۸۹ به فکر طراحی سیستم عامل بودم. البته اون زمان قصد داشتم همه چیز رو خودم بنویسم. ولی با Remastersys آشنایی پیدا کردم اما چون اینترنت پرسرعتی نداشتم ترجیح دادم توزیع لینوکسی رو روی ماشین مجازی پرورش بدم و ازش خروجی بگیرم (ویرچوال باکس چنین کاری رو میکنه) و بعد اسمش رو prp-e خالی گذاشتم. البته prp-e مخفف اسم کلوپ رباتیک مدرسه راهنماییمون بود (پرشیا رایان پرداز شرق). و در سال ۱۳۹۰ که همکار جدیدی در پروژه پیدا شده بود و تیم «ایران هکینتاش» رو تشکیل دادیم ، این توزیع رو پرورش دادیم و خروجی ISO رو با Remastersys تهیه کردیم. اواخر ۹۰ بود که IranHackintoshOS رو بین خودمون رد و بدل کردیم :). کمی کار اون موقع سخت بود چون که دو نفر بودیم و اطلاعات لینوکسی متوسطی داشتیم. اما اینکه توزیعی رو ایجاد کرده بودیم که ویژگی هایی از سیستم عامل مک به ارث برده باشه. اما در نسخه ۱ که به «جبیر او اس» مشهور هست ، سعی کردیم یک توزیع همه جانبه تهیه کنیم .

هدف اصلی پروژه چیست؟

یک سیستم عامل عام منظوره که تمرکز خاصی رو دسکتاپ و کاربران تازه کار داشته باشه. یعنی کاربران بتونند بعد از نصب و کار روی این سیستم عامل بتونند به راحتی روی سایر سیستم عاملها(حتی مک یا ویندوز یا BSD ها و …) سوییچ کنند.

تیم دارید؟ چند نفر هستند؟

بله. تیم ۳ نفره متشکل از من (محمدرضا حقیری) ، رضا باقرزاده و محمد اسماعیلی.

الان در چه وضعیتی هستید؟

بستگی داره منظورت چی باشه :) . خب وقتی از «وضعیت» سوال به میون میاد کمی میشه گفت که وضعیت تیم ، که خدا رو شکر خوبه. وضعیت مالی  و … هم در حد مطلوبی هست که بتونه یک Foundation کوچک رو زنده و سر پا نگه داره.

تا حالا چند تا نسخه منتشر کردین و تو هر کدوم جه پیشرفت هایی بوده؟

نسخه ۱ — ۲۵ فروردین ۹۱ — ویژگی خاصی نداشت.
نسخه ۲ — شهریور ۹۱ — میزکار Legendary UI رو در خود داشت.
نسخه ۳ — آبان ۹۱ — اولین توزیعی که به طور رسمی مبتنی بر گنوم ۳.۶ بود (قبل از Ubuntu GNOME Remix منتشر شد).

چرا جبیر رو با میزکار های مختلف منتشر می کنید و روی یه میزکار تمرکز نمی کنید؟

برای اینکه دوست داریم همه ازش استفاده کنند. مثلا شما توزیعی مثل چاکرا رو ببینید ، حتی الان فقط به ۶۴ بیت محدود شده! این در صورتی هست که جبیر فقط در ۳۲ بیت منتشر میشه و امکان اجرا روی همه سیستم ها رو داره.

چرا یه میزکار برای جبیر نمی سازید و از گنوم شل و xfce و بقیه میزکار ها استفاده می کنید؟

چون توسعه میزکار سخت و هزینه بر و همچنین کار بر هست. مثلا KDE از سال تولد من (۱۹۹۶) متولد شده و الان ۱۷ سال هست که داره توسعه داده میشه :)

خیلی از منتقدان شما ازتون این سوال رو می پرسند که چرا روی یه توزیع مثل اوبونتو کار نمی کنید و یه سیستم عامل جدید ساختین. جواب شما به این دوستان چیه؟

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

نظرتون در مورد توزیع های ایرانی مثل آریویس چیه؟

همه توزیع های ایرانی خوب هستند. مخصوصا پارسیکس ، آریوس و زمین. البته پارسیکس و پارسیدورا تقریبا میشه گفت که روند توسعشون خیلی کند هست (مطلبی در وبلاگم هست در موردشون). ولی آریوس که تقریبا همزمان با مینت و زمین هم که توزیع نسبتا مستقل هست خوب و کارامد هستند. گفتم کارامد! راستی کارامد لینوکس هم خوب بود. با این اوصاف هزاران سیستم عامل ایرانی قبل از «قاصدک» بودند ولی نمیدونم چرا عنوان «اولین سیستم عامل ایرانی» رو به خودشون نسبت دادن :))

چرا کاربر باید اوبونتو یا دیگر توزیع های لینوکس رو رها کنه و بیاد سمت جبیر؟

فکر کنم به اندازه کافی روی این مورد در بالا توضیح دادم :)

چه چیز جدیدی رو تصمیم دارید توی جبیر پیاده سازی کنید یا که پیاده سازی کردید , تا منحصر به فرد بشه؟

اول از همه لجندری یو آی ، بعد از اون پروژه های EasyShell و JetGet که اولی یک شل یونیکس و دومی یک رابط متنی برای همه مدیر بسته های یونیکس و لینوکس هست. تا الان Legendary UI پیاده سازی شده.

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

Legendary UI گام اول بود تا فضای خالی زیادی رو دسکتاپ ایجاد بشه. بعد از اون روی Plasma Active که شرکت Basyscom و KDE مشترکا منتشرش کردند رو انتخاب کردیم.

فکر نمی کنید جبیر کمی نیاز به تبلیغ داره تا بین کاربران شناخته بشه؟به نظر میرسه آریوس تو این زمینه بهتر از شما نیست؟

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

اگه نکته یا حرفی با خوانندگان دارید بگید.

نکته یا حرف خاصی ندارم :) با تشکر  آرزوی توفیق روز افزون برای همه :)

پیوندهای مرتبط

Share

پروژه OCR فارسی و چالش‌های آن

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

پروژه پلاک‌خوان یا Automated Number Plate Recognition که بهش ANPR هم می‌گن، من رو تشویق و تحریک کرد که یک پروژه نویسه‌خوان نوری یا همون OCR فارسی هم پیش ببرم. اما پیش‌برد پروژه OCR تا حد زیادی به تعویق افتاد چرا که درگیر توسعه محصول در استارتاپی بودم. اما از عید نوروز ۱۴۰۱ خیلی جدی‌تر به پیاده‌سازی یک OCR فارسی درست و حسابی فکر کردم. گرچه این پروژه رو تا حد زیادی به عبارتی Hold کردم، اما خب نتایج جالبی تا الان ازش به دست آمده که حیف بود در این مطلب وبلاگ در موردش ننویسم.

پروژه OCR فارسی و چالش های آن

شروع پروژه: درک کارکرد OCR

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

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

خب، الان فهمیدیم OCR چیه و چی کار می‌کنه. حالا وقتشه که بریم سراغ پروژه من. این که پروژه چی شد و به کجا رسید. یک مسیر جذاب طی شد اما خب این مسیر جذاب یه جاهایی هم تو دست‌انداز افتاده. چون پروژه هنوز تمام نشده و خیلی مونده تا به نتیجه خوبی برسه، ترجیح دادم «هرچی که تا الان انجام شده» رو در این مطلب باهاتون به اشتراک بذارم.

پروسه انجام پروژه OCR فارسی

فاز اول: تصمیم‌گیری

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

خب در این مساله، من از آخر به اول رفتم. اولین سوال این بود که چرا به یک OCR فارسی نیاز داریم؟ موضوع اینجاست که حفظ زبان، در گرو چه چیزهاییه. شاید چند قرن پیش، شعر فارسی چیزی بود که زبان فارسی رو حفظ کرد (دیگه فکر نکنم کسی باشه که ماجرای شاهنامه رو ندونه 😁). بعد از اون، نوشتن سفرنامه و حکایات روشی بود که در کنار شعر، به حفظ زبان کمک کرد. سال‌ها بعد مطبوعات و جراید و همچنین رمان و … باعث حفظ زبان فارسی شدند. در دنیای امروز هم کارهایی مثل توسعه فونت، توسعه مدل‌های هوش مصنوعی و همچنین پردازش زبان فارسی و …؛ روشی برای حفظ زبانه.

حالا که می‌دونم یکی از دلایلی که OCR فارسی رو توسعه می‌دم، اینه که از زبان فارسی حفاظت و صیانت کنم (و قطعا وقتی از حروف فارسی استفاده کنم برای زبان‌های دیگری مثل کُردی، عربی و … هم قابل استفاده خواهد بود) نیاز بود بررسی کنم که چه ابزارهایی در اختیار دارم. اولین ابزاری که به نظرم رسید، بهترین زبان برنامه‌نویسی دنیا بود (😁) یعنی پایتون! خب بررسی پایتون رو در یک بخش جداگانه توضیح میدم ولی فعلا پایتون رو در نظر داشته باشید. در پایتون PyTorch و OpenCV هم داریم که خب یعنی هر آنچه برای کارهام نیاز بود در یک پکیج داشتم.

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

فاز دوم: ابزارهای مورد استفاده برای پیاده‌سازی پروژه OCR فارسی

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

  • پایتون: همونطور که گفتم پایتون، بهترین زبان برنامه‌نویسی دنیا؛ حداقل در این قسمت ماجرا بود. پایتون زبان راحتیه و رسیدن به نتیجه درست و حسابی بهش نسبتا آسون. به همین خاطر پایتون رو انتخاب کردم. گذشته از این بسیاری از ابزارهای هوش مصنوعی و یادگیری ماشین هم در پایتون قابل استفاده هستند.
  • OpenCV: ابزار OpenCV یا Open Computer Vision که معرف حضور همه هست. این ابزار، کلی تابع و کلاس و … برای پردازش تصویر با متدهای کلاسیک یادگیری ماشین رو در خودش جای داده و گذشته از اون، پایه بسیاری از کتابخانه‌های مدیریت و ویرایش تصاویر دیگر مانند Pillow هم هست.
  • زرنویس: ابزار زرنویس (لینک) ابزاری بود که چند وقت پیش برای نوشتن متن فارسی روی تصاویر به کمک Pillow نوشتم.
  • PyTorch: کتابخانه PyTorch هم که باز معرف حضور هست. یکی از بهترین ابزارها برای پیاده‌سازی پروژه‌های یادگیری عمیق.
  • الگوریتم YOLOv5: الگوریتم YOLOv5 (لینک) هم یکی از بهترین الگوریتم‌های تشخیص اشیا یا Object Detection محسوب میشه و خب با کارهای Ultralytics کار باهاش شدیدا راحت هم شده.
  • ابزار LabelImg: ابزار LabelImg (لینک) هم یک ابزار مناسب برای برچسب زدن به تصاویر برای YOLOv5 (و در کل الگوریتم یولو) به حساب میاد.

پروژه OCR فارسی و چالش های آن

فاز سوم: جمع‌آوری داده‌های مناسب برای پروژه و آموزش مدل

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

  • بخش اول – تشخیص اعداد فارسی: در این بخش تا حد زیادی تنبلی کردم و به جای استخراج اعداد از متون، با استفاده از زرنویس و چند فونت فارسی آزاد، حدود صدتا تصویر که در هر کدوم اعداد ۴-۵ رقمی بودند تولید کردم. بعد از اون، اعداد رو لیبل کردم و بعد از لیبل کردن اون‌ها، رفتم سراغ ترین کردن مدل YOLOv5 با استفاده از داده‌ای که از اعداد به دست آورده بودم. این مدل خوب کار کرد، گرچه روی چندین فونت خاص خیلی خوب کار می‌کرد و روی چندین فونت اصلا کار نمی‌کرد. این موارد رو بعدتر در قسمت های آتی توضیح خواهم داد.
  • بخش دوم – تشخیص حروف فارسی: این بخش، یکم چالشی‌تر شد. چطور؟ از اونجا که رندم تولید کردن کلمات فارسی که تمامی حالات حروف درشون باشه (مثلا هم ک توش باشه هم کـ هم ـکـ) کار آسونی نبود. به همین خاطر کاری که کردم چه بود؟ این بود که از دیتاست شتر (لینک) استفاده کردم و حدود ۱۰۰ تا تصویر رو جدا کردم و شروع کردم لیبل زدن و ترین کردن مدل. اینجا نتیجه بهتر بود و می‌تونست فونت‌های بیشتری رو تشخیص بده. گرچه در این مورد خاص، یک سری حروف مثل ث و ژ با دقت کمتری شناخته می‌شدند.
  • بخش سوم – تشخیص بلاک‌های کلمات: دقیقا جایی که چالش داشتم، اینجا بود. لیبل زدن متون طولانی یکم دردسرش زیاد بود. به همین خاطر ابتدا اومدم متون رو «خط به خط» لیبل زدم و خط‌ها رو جدا کردم. بعد از اون با استفاده از Contour های موجود در عکس کلمات رو جدا کنم و به مدل تشخیص حروف بدم که خب اون هم خودش یکم داستان‌های خاص خودش رو داشت. به هرحال، تا اینجای کار، مدل تشخیص اعداد و حروف به خوبی کار می‌کرد و نیاز بود این اتفاق هم بیفته. اما خب متاسفانه این اتفاقه افتادنش یکم سخت بود. نمی‌گم ناممکن اما خب سخته. به همین خاطر، فعلا پروژه در همین مرحله hold شده.

جمع‌بندی و نتایج پروژه

در نهایت ببینیم چه چیزهایی الان داریم و چه چیزهایی نداریم؟ تا نتایج پروژه رو بتونیم بهتر و بهتر و بهتر بررسی کنیم 😁 اول از همه ببینیم چیا رو داریم؟ خب در حال حاضر دو مدل خوب برای تشخیص اعداد و حروف فارسی داریم. این مدلها دارن با دقت‌های خوبی کار می‌کنن اما نیاز دارند که یکم بهتر بشن (یعنی در اینجا نیاز داریم که کمی Fine Tuning روی مدل‌های فعلی یا مدل‌های YOLOv5 و … انجام بدیم) و مدلی برای تشخیص خط و کلمه داریم که درست کار نمی‌کنه. در واقع بخواهیم بهتر ببینیم: چیزی که داریم تشخیص نسبتا با دقت حروف و اعداده و چیزی که نداریم تشخیص کلمات به صورت بلاکه.

پروژه OCR فارسی و چالش های آن

کارهای آینده

در این بخش بهتره به این فکر کنیم که چه کارهایی در آینده میشه برای بهبود این پروژه انجام داد. در لیست زیر به این مسائل می‌پردازیم که دقیقا چه کارهایی لازمه انجام بشه.

  • تغییر مدل: یا نوشتن مدل از بتدا با روش‌های Probabilistic یا استفاده از متدهای Instance segmentation
  • تشخیص بهتر بلاک‌های کلمات و شماره (یا با استفاده از Object Detection یا استفاده از سایر متدها)
  • اضافه کردن هسته این کار به یکی از OCR های مشابه مانند EasyOCR یا PaddleOCR

سخن نهایی

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

 

Share

نصب کتابخانه tensorflow روی Raspberry Pi

حدود بهمن یا اسفند سال ۱۳۹۹ بود که من، یک عدد رزبری پای ۴ مدل B (لینک) خریداری کردم که باهاش یه سری ایده رو عملی کنم. از وقتی که این دستگاه رو خریدم، مدت زیادی تقریبا گذشته اما خب چند هفته اخیر، شدیدا با این دستگاه در حال کشتی گرفتن و تست ایده‌های مختلف هستم. یکی از ایده‌های من پروژه‌ای بود که تا حد زیادی به هوش مصنوعی (و بخصوص tensorflow) نیازمند بود. مشکلی که داشتم این بود که در خود مخازن PyPi ای که روی رزبری پای در دسترسه، هیچ ساخت درستی از tensorflow وجود نداره.

اما خب، نمیشه در دنیای تِک ناامید شد؛ به همین خاطر دنبال راهکار و راه حلی گشتم که بتونم تنسرفلو رو روی رزبری پای داشته باشم. یکم سخت‌تر از حالت عادی (که استفاده از pip بود) شد اما ارزشش رو داشت. چون تونستم بدون مشکل مدلی که مدنظر داشتم رو لود و استفاده کنم. همچنین لازمه ذکر کنم که در این مطلب قراره یاد بگیریم چطور خود تنسرفلو رو نصب کنیم و به TFLite کاری نداریم.

رزبری پای چیه؟

رزبری پای (Raspberry Pi) یک کامپیوتر تک‌برد (SBC یا Single Board Computet) محسوب می‌شه که توسط یک بنیاد غیرانتفاعی به همین اسم در بریتانیا طراحی شده (البته تولیدش مثل عمده محصولات دیگر، در کشور چین انجام میشه). این بردها معمولا یک پردازنده ARM دارند و می‌شه روی اونها سیستم‌عامل نصب کرد. خیلی‌هاشون هم ورودی/خروجی عام‌منظوره (General Purpose Input/Output) یا همون GPIO دارند که می‌تونن رابطی بین این کامپیوتر و قطعات الکترونیکی دیگر باشند.

این کامپیوترهای کوچک – که در ابعاد یک کارت اعتباری ساخته شدند – اسباب‌بازی خوبی برای برنامه‌نویسان و مهندسین کامپیوتر به شمار میان. بسیاری از متخصصین و علاقمندان از رزبری پای استفاده می‌کنن تا ایده‌ها و پروژه‌هاشون رو پیاده‌سازی کنن. البته لازم به ذکره که خیلی‌ها هم حتی محصولاتشون رو برپایه رزبری‌پای توسعه دادند (پس اگر دوست داشتید یکی تهیه کنید و باهاش بازی کنید، درنگ نکنید 😁)

تنسرفلو چیه؟

از اونجایی که این مطلب، در مورد نصب Tensorflow روی رزبری پای بود، لازمه که کمی هم در مورد تنسرفلو توضیح داده بشه. تنسرفلو یک کتابخونه نرم‌افزاری آزاد و متن‌بازه که توسط تیم Google Brain توسعه‌ داده میشه. این کتابخونه، به ما اجازه میده که پروژه‌ها و پروسه‌های یادگیری ماشین، هوش مصنوعی، یادگیری عمیق، استنباط آماری و … تا توسعه شبکه‌های عصبی مصنوعی رو انجام بدیم. به خاطر پشتیبانی گوگل از این کتابخونه، به یکی از محبوب‌ترین و پراستفاده‌ترین کتابخونه‌های هوش مصنوعی تبدیل شده (مثلا در پروژه خودران، من از این کتابخونه استفاده کرده بودم).

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

نصب Tensorflow روی Raspberry Pi

قبل از هرچیزی باید بگم که من این پروسه رو روی Raspberry Pi 4 Model B (با رم ۲ گیگابایت) و سیستم عامل Raspberry Pi OS نسخه Bullseye (بله درست حدس زدید، سیستم‌عامل رزبری پای دبیانه 😁 و صدالبته که می‌تونید توزیع‌های دیگری هم روش نصب کنید) و ویرایش ۶۴ بیتی طی کردم. بسته به مدل رزبری شما و سیستم‌عاملتون، این پروسه می‌تونه متفاوت باشه.

نصب نرم‌افزارهای پایه

ما برای این که بتونیم تنسرفلو رو نصب کنیم، نیاز به نصب تعداد زیادی نرم‌افزار روی خود سیستم‌عامل داریم. به نظر بهتره که ابتدا، لیست بسته‌های مخازن رو بروزرسانی کنیم:

sudo apt update

و صدالبته بهتره که خود سیستم‌عامل هم بروزرسانی‌های آخرش رو دریافت و نصب کنه:

sudo apt full-upgrade

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

sudo apt install gfortran libhdf5-dev libc-ares-dev libeigen3-dev libatlas-base-dev libopenblas-dev libblas-dev liblapack-dev

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

نصب و بروزرسانی بسته های پایتونی

خب ما تعدادی پیش‌نیاز پایتونی هم داریم (که این‌ها رو اکثرا حتی در وبسایت تنسرفلو هم می‌شه پیدا کرد) که با دستورات زیر نصبشون می‌کنیم:

pip3 install pybind11
pip3 install Cython==0.29.21
pip3 install h5py==2.10.0

و سپس بسته setuptools رو هم بروزرسانی می‌کنیم:

pip3 install --upgrade setuptools

و این یکی رو هم نصب می‌کنیم (چرا که باید فایل تنسرفلو رو با این بزرگوار دانلود کنیم)

pip3 install gdown

دانلود و نصب Tensorflow

خب ابتدا به کمک gdown فایل wheel (فایل‌های wheel فایل‌هایی هستند که pip می‌فهمه باید نصبشون کنه) مربوط به نسخه مورد نظر تنسرفلو رو دانلود می‌کنیم:

gdown https://drive.google.com/file/d/1YpxNubmEL_4EgTrVMu-kYyzAbtyLis29

توجه کنید که اگر این دستور کار نکرد هم جای نگرانی نیست، می‌تونید این لینک رو باز کنید و فایل رو خودتون دانلود کنید.

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

pip3 install <TENSORFLOW WHL FILE>.whl

نصب رو انجام بدید.

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

جمع‌بندی

مدتهای زیادی میشه که دوست دارم در مورد پروژه‌هایی که در حوزه «اینترنت چیزها» یا همون IoT انجام میدم هم بنویسم. اما متاسفانه پروژه‌های سخت‌افزاری، وقت زیادی از آدم می‌گیرن و وقتی وقت آزاد زیادی نداشته باشید، معمولا به پروژه‌های سخت‌افزاریتون هم آنچنان نمی‌تونید رسیدگی کنید. به همین خاطر مدتی میشه که در تلاشم تا پروژه‌های شخصی و صدالبته کاریم در حوزه بینایی ماشین رو با IoT ترکیب کنم و به این شکل این حوزه رو هم وارد کارهای روتین و اصلیم کنم که وقت هم همیشه براشون باشه 😁

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

در پایان، ضمن تشکر از این که وقت گذاشتید و این مطلب رو خوندید، باید بگم که هنوز می‌تونید من رو به یک فنجان قهوه مهمان کنید 🙂

Share

پروژه خودروی خودران – قسمت دوم

در قسمت قبلی (لینک) در مورد این که چرا پروژه خودران رو آغاز کردم و این که چند فاز و چند مرحله داره، نوشتم. در این قسمت، در مورد پیاده‌سازی صحبت می‌کنم و صد البته، مشکلی که این خودرو در تشخیص مسیر داشت. لازمه به ذکره که این قسمت، آخرین قسمت از مطالبم در مورد این پروژه نخواهد بود و در آینده؛ قطعا باز هم ازش می‌نویسم. اما در حال حاضر، ترجیح دادم که پروژه خودران رو به حالت Hold در بیارم. در ادامه در این مورد هم توضیحات لازم رو خواهم داد.

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

اتصال دوربین به شبکه جهت عکس‌برداری

همونطوری که پیش‌تر در مطلبی در همین وبلاگ گفتم (لینک) یکی از بهترین ابزارها برای جمع‌آوری داده مرتبط با پروژه‌هایی مثل همین خودروی خودران، دوربین یا میکروفن خود شماست. نکته مهم و قابل توجه اینه که در پروژه خودران، نمیشه به داده‌های خارجی اتکا کرد چرا که خیلی‌هاشون اصلا اونطوری که ما پلن چیدیم، نیستن. به همین خاطر، من گوشی قدیمی خودم (سامسونگ گلکسی J7 که شاید حدود ۴ سال گوشی من بود) رو به عنوان دوربین در این پروژه انتخاب کردم.

بعد از این که گوشی رو شارژ کردم و به عبارتی به زندگی برش گردوندم، نرم‌افزار Droid Cam رو روش نصب کردم. با کمک این نرم‌افزار، به سادگی میشه گوشی رو به یک دوربین تحت شبکه تبدیل کرد و این یعنی این که حجم زیادی از دردسرهای مرتبط با اتصال دوربین به بوردهایی مثل آردوینو و ESP اینجا کنار رفته. بعد از این که این نرم‌افزار نصب شد و گوشی هم روی شاسی قرار گرفت، کدی نوشتم که به گوشی وصل شه و بتونه در حالات مختلف، عکس‌برداری کنه. کد مرتبط از این لینک در دسترسه.

عکس‌برداری و آموزش مدل هوش مصنوعی

برای این که پروژه هوش مصنوعی به خوبی بتونه از پس کاری که می‌خواهیم بربیاد، نیازمند داده‌های زیادی هستیم. اصولا این دید وجود داره که «هرچی داده بیشتر، بهتر». این دید گرچه بعضی جاها می‌تونه خطرناک باشه (مثل زمانی که overfit می‌شیم و …) اما عموما دید درستیه. به همین خاطر، ماشین رو راه انداختم و با استفاده از اون کدی که نوشته بودم، شروع کردم عکس برداری. نمونه‌ای از این عکس‌ها رو در اینجا می‌بینید:

پروژه خودروی خودران - قسمت دوم

بعد از این که این عکس‌ها گرفته شد، نیاز بود یک مدل هوش مصنوعی درست بشه. حقیقت اینه که به جای کد زدن برای درست کردن مدل، از «ماشین قابل آموزش» گوگل (لینک) استفاده کردم و یه مدل تشخیص تصویر درست کردم و اون رو در یک کد وارد کردم (لینک کد). بعد از این که از عملکرد نسبی این قضیه مطمئن شدم، یک کد دیگر نوشتم که دستورات خودران رو اجرا کنه (لینک کد خودران) که البته خیلی هم خوب نبود :))

نمونه عملکرد خودران

جمع‌بندی

همونطوری که دیدید، این پروژه هنوز زیادی جوانه و هنوز هم مشکلاتی داره. کدهایی که تا الان براش زدم، همه در گیت‌هاب شخصی من موجودند (لینک) و می‌تونید خودتون برای پروژه‌هاتون ازش استفاده کنید. همچنین اگر ایده‌ای برای بهبود عملکرد کد دارید هم ممنون میشم Pull Request ارسال کنید. در آینده هم احتمالا کمی بیشتر روی این پروژه کار خواهم کرد و ایده‌های بیشتری رو به آزمایش خواهم گذاشت. در نهایت، از این که وقت می‌ذارید و این وبلاگ رو می‌خونید، ازتون ممنونم 🙂

Share

پروژه خودروی خودران – قسمت اول

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

بعد از چند هفته تحقیق و تفحص، اول تصمیمم بر این بود که یک ماشین کنترلی تهیه کنم و شروع کنم روی اون کار کردن. ولی موضوعات مهمی اینجا مطرح می‌شدند. اولین و مهم‌ترین موضوع – که پیش‌تر هم بهش برخورده بودم – این بود که ماشین‌های کنترلی، عموما شاسی بزرگ و قوی ندارند و چیزی که من نیاز داشتم، یک شاسی بزرگ برای جا دادن وسایلی بود که نیاز داشتم. به همین خاطر مدتی باز تحقیق کردم که چه چیزی می‌تونم تهیه کنم که این مشکل رو نداشته باشه؟ بعد از اون در مورد درایور موتور نیاز بود تحقیق کنم. بعد از این موضوعات، این که چطور مدل هوش مصنوعی رو روش مستقر کنم و … . در ادامه این مطلب، قراره با هم بخش رباتیک (مکانیکی و الکترونیکی به طور خاص) رو بررسی کنیم و بعد بریم سروقت بخش نرم‌افزاری ماجرا 🙂

پروژه خودروی خودران - قسمت اول

شاسی مورد نیاز

پس از این که تصمیم گرفتم حتما یک پروژه خودروی خودران داشته باشم، یکی از مواردی که بهش خیلی فکر می‌کردم، این بود که حتما یه شاسی مناسب تهیه کنم. اول، همونطوری که ابتدای مطلب گفتم، به ماشین‌های کنترلی اسباب‌بازی فکر می‌کردم. ماشین کنترلی، یک سری ویژگی خوب داره. مثل چی؟ مثل این که موتورها روش سوار شدند، احتمالا درایور مناسب موتور داره، جا باتری داره و … . اما خب این هم باید در نظر گرفت که برد کنترل ماشین پیشاپیش متناسب با همون شاسی خودش ساخته شده و نمیشه خیلی هم دستکاریش کرد.

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

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

درایور موتور

وقتی از موتورهای DC و بخصوص موتورهای Brushed استفاده می‌کنیم، نیازمند درایور هستیم (اگر براتون سواله که چرا، می‌تونید این ویدئو رو ببینید). به همین جهت، چیزی که نیاز داشتم یک درایور مناسب برای چنین موتوری بود. تصمیم من این شد که از L298N استفاده کنم. این درایور رو یادمه که در درس ریزپردازنده بهمون درس داده بودند و گزینه آشنایی برام بود. علاوه بر این، چندتایی از این درایور در وسایل الکترونیکیم داشتم. پس همه چیز تحت کنترل بود و کل مجموعه رو شروع کردم سوار کردن. اما مساله مهم دیگر چی بود؟ درسته؛ کنترل از راه دور 🙂

پروژه خودروی خودران - قسمت اول

کنترل از راه دور

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

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

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

دوربین

همونطور که در بخش قبلی گفتم، به ESP8266 به این راحتیا نمیشه دوربین متصل کرد. نتیجه این شد که تصمیم گرفتم از یک گوشی اندرویدی استفاده کنم. اول کمی در فروشگاه‌های اینترنتی و … جست و جو کردم و دنبال گوشی‌های اندرویدی ارزون قیمت گشتم. اما یادم افتاد که گوشی قبلی خودم یعنی Samsung Galaxy J7 ای که دارم، دوربین خوبی داره. گذشته از اون، میشه با استفاده از Droid Cam و نرم‌افزارهای مشابه، تصویر رو به کد پایتونی فرستاد و اونجا پردازش‌های لازم رو روش انجام داد.

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

پروژه خودروی خودران - قسمت اول

در آینده چه خواهیم خواند؟

بخش بزرگی از پروژه خودروی خودران من، مربوط به سخت‌افزارش بود چرا که داشتم این قسمت رو هم خودم طراحی و پیاده‌سازی می‌کردم. نتیجه این شد که این مورد خیلی طول کشید (چندین هفته مطالعه، چند ماه تهیه ابزارها و یکی دو هفته هم سوار کردن قطعات روی هم) و خب فازهای نرم‌افزاری – که به نظر خودم جذاب‌ترین قسمت‌های این کار هستند – هنوز باقی ماندند. نخستین فاز اینه که کد پایتونی نوشته بشه که بتونه تصویر رو از Droid Cam بخونه و به ما نمایش بده.

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

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

Share

چرا گولنگ زبان مناسب شما نیست؟

در دنیای امروز، یکی از بحث‌های مهم برای هر استارتاپ و سازمانی، اینه که چطور و با چه ابزاری، محصول خودشون رو بسازند. این موضوع می‌تونه از لحظه تصمیم‌گیری برای راه‌اندازی استارتاپ در ذهن بنیان‌گذاران باشه، حین پیاده‌سازی محصول کمینه ارزشمند (MVP) ذهنشون رو بیشتر درگیر کنه و حتی پس از ارائه محصول نهایی هم همیشه فکر بازسازی و بازنویسی محصول یکی از مشغله‌های ذهنیشون باقی بمونه. چند وقت اخیر، یکی از فازهایی که میان خیلی از برنامه‌نویسان – بخصوص نسل جدید و تازه‌نفس برنامه‌نویس – رایج شده، استفاده از گولنگ در ساخت MVP و … است.

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

چطور برای پروژه خود یک زبان یا فرمورک مناسب انتخاب کنیم؟

مطلب اصلی، در واقع اینجا شروع میشه. در این قسمت یک سری ویژگی رو کنار هم می‌چینیم و گولنگ رو در کنار ابزارهای قدیمی‌تر مثل PHP یا پایتون قرار می‌دیم که ببینیم کدوم یکی برنده از میدان بیرون میاد و اگر قراره که یک استارتاپ راه بندازیم، محصولمون رو با کدوم یکی از این ابزارها بنویسیم. توجه هم داشته باشید که این بخش متاثر از نظرات شخصی من هم هست و طبیعتا ازتون میخوام که در نقدهایی که به این مطلب وارد می‌کنید، این مورد هم در نظر بگیرید.

جمعیت توسعه‌دهندگان

مهم‌ترین فاکتور در انتخاب زبان و فرمورک برنامه‌نویسی، دقیقا جمعیت توسعه‌دهندگان اونه. می‌پرسید چرا؟ چون اگر امروز خودتون کد رو بزنید، طبیعتا وقتی بیشتر با جنبه بیزنسی کارتون مواجه شید، وقت کمتری برای کد زدن خواهید داشت و نیازمند بزرگ‌تر کردن تیم توسعه استارتاپتون هستید. پس از این جهت نیاز دارید که این مورد رو حتما در نظر بگیرید. دقت کنید که Go از سال ۲۰۰۹ عرضه عمومی شده و چندین ساله که داره بعنوان یک ابزار توسعه وب دیده میشه (که تعداد این سال‌ها به انگشتای دست هم نمی‌رسه).

حالا از طرف دیگر، شما نگاه کنید که چقدر می‌تونید لاراول‌کار پیدا کنید؟ افرادی که لاراول یا جنگو (یا حتی روبی آن ریلز!!!) کار می‌کنند تعدادشون به شدت بیشتر از کسانیه که با Go کار می‌کنند. نتیجه منطقی اینه که سمت ابزاری برید که بزرگ کردن تیم توسعه‌ش براتون کم‌هزینه باشه.

تعداد کتابخانه‌ها و ابزارهای توسعه

مورد مهمی که باید بهش توجه کنید، اینه که زبان مورد استفاده‌تون چقدر ابزار داره؟ چندتا ORM استخوان‌دار داره؟ چقدر طول می‌کشه تا ایده اولیتون رو صرفا با «به هم چسبوندن ابزارهای موجود» بسازید؟ متاسفانه در این مورد هم باید بگم که Go بازندست. البته این رو هم باید در نظر داشت که Go زیادی جوانه و خب طبیعتا از بین این همه شرکت بزرگی که برای توسعه به سمتش رفتند، بالاخره از این جهت هم به بلوغ کافی می‌رسه. اما بحث ما، بحث حال حاضره. در حال حاضر، پایتون از این جهت – به نظر من – بهترین گزینه می‌تونه باشه. می‌دونید چرا؟ چون برای هر چیزی که فکرش رو بکنید یک کتابخونه ارائه کرده و واقعا شما نیاز به پیاده سازی منطقی جز منطق خالص کسب و کار خودتون ندارید.

مقیاس‌پذیری

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

سهولت استقرار

قبل‌تر در همین وبلاگ در مورد مهندسین DevOps توضیح داده بودم (لینک) و خب یه حقیقت تلخ در مورد این عزیزان اینه که نیروهای گرانقیمتی هستند. وقتی شما از ابزاری مثل Go یا حتی پایتون برای توسعه محصولتون استفاده کنید، احتمالا بعد مدتی نیاز دارید که برای استقرار و … محصول، از یک مهندس DevOps کمک بگیرید. این نیاز ممکنه از لحظه استقرار MVP با شما باشه تا وقتی که محصولتون رو بازسازی و ری‌فکتور می‌کنید. در صورتی که برای مثال یک پروژه Laravel ای رو می‌تونید به سادگی روی یک هاست سی‌پنل، میزبانی کنید.

و تیر آخر: زمان توسعه محصول!

در قسمت اول به این موضوع اشاره کردم ولی لازمه که دوباره هم اشاره بشه. چرا که این بخش به بخش کدنویسی و تست (و کلا کارهای برنامه‌نویسانه) محدود نیست و لازمه که موارد دیگر مثل استراتژی ورود به بازار، ارائه بتاهای عمومی و … هم در نظر بگیرید. متاسفانه Go در این مورد بازندست چرا که ابزارهایی به کاملی و خوبی جنگو، ریلز یا لاراول نداره. تنها راه‌حلی که بتونید با Go با سرعت زیادی به این مرحله برسید؛ اینه که چند توسعه‌دهنده حرفه‌ای استخدام کنید که خب هزینه‌هاتون رو شدیدا افزایش می‌ده.

جمع‌بندی

حالا که این همه مثنوی هفتاد من سرودم، جای داره که یک جمع‌بندی کلی ارائه بدم از مباحث بالا. اگر موارد بالا رو در نظر گرفتید و دیدید که زبانی مثل Go یا Rust در فاکتورهای بالا برای شما کارآمد و مناسب هستند و انتخاب شخصیتونن و در عین حال، منابع کافی هم براشون دارید؛ خب دیگه پرسش نداره و بهتره هرچه سریع‌تر کارتون رو شروع کنید. در غیر این صورت، اگر از سر جوزدگی قراره از این ابزارها استفاده کنید، چند بار با خودتون مرور کنید که کدوم یکی از این‌ها، نیازهای شما رو مرتفع می‌کنند.

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

با تشکر از وقتی که گذاشتید و این مطلب رو خوندید. امیدوارم این مطلب براتون مفید واقع شده باشه.

Share

ایده هایی برای پروژه های بینایی ماشین

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

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

ایده های مرتبط با تشخیص چهره

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

در لیست زیر، تعدادی از پروژه‌های مرتبط با تشخیص چهره رو برای شما فهرست کرده‌ام:

  • حضور و غیاب مبتنی بر چهره
  • دوربین امنیتی (به این شکل که وقتی شخص ناشناسی وارد حریم دوربین شد از طریق ایمیل یا SMS و … به شما اطلاع بده)
  • قفل هوشمند ( به شکلی که اگر شما رو دید در رو باز کنه و در غیر این صورت، یک سیستم مانند دزدگیر یا سیستم امنیت خونه رو راه‌اندازی کنه)
  • تشخیص حالت و احساسات چهره
  • تشخیص خواب‌آلودگی (مثلا در یک کلاس این پروژه می‌تونه کاربردی باشه).

همه ایده‌های بالا، به سادگی قابل انجام هستند. فقط کافیه که کار با کتابخانه‌ها و تئوری پردازش تصویر رو بلد باشید. شاید دو سه روزه بتونید یکی از این پروژه‌ها رو به ثمر برسونید 😁

ایده‌ های مرتبط با تشخیص کرکتر

نتایج آزمایش روی دیتاست آزمایشی

تشخیص نوری نویسه یا Optical Character Recognition که به اختصار به اون OCR هم گفته می‌شه، یکی از شاخه‌های پرطرفدار دیگر در حوزه بینایی ماشین می‌تونه به حساب بیاد. پروژه‌هایی که در این حوزه انجام می‌شن به شدت کاربردی هستند و طبیعیه که در حوزه‌های مختلفی کاربرد خواهند داشت. در اینجا تعدادی از ایده‌هایی که می‌تونید روش کار کنید رو اینجا فهرست کردم:

  • تشخیص و استخراج شماره پلاک (که پیش‌تر در موردش نوشتم – لینک)
  • تشخیص و حل مسائل ریاضی/فیزیک (که این هم پیش‌تر در مورد نوشتم – لینک)
  • تشخیص دست‌خط فارسی
  • تشخیص خط نستعلیق (و در کل خوشنویسی) فارسی
  • تشخیص نسخه پزشکی (نکته جالب اینه که در نسخ پزشکی، بسیاری از خط‌خطی‌هایی که می‌بینید در واقع روش مصرف و دوزاژ دارو هستند، که طبق کدگذاری خاصی نوشته می‌شن).

البته باید این نکته رو هم عرض کنم خدمتتون که دنیای OCR خیلی گسترده‌ست. تقریبا هرجایی که شما با نوشتن سر و کار داشته باشید، می‌تونید از OCR هم اونجا استفاده کنید. خیلی چیزا اینجا به خلاقیت و نیازهای خودتون برمی‌گرده. اگر ایده‌ دیگری داشتید، می‌تونید در بخش نظرات همین مطلب با من به اشتراک بذارید.

ایده های مرتبط با پزشکی

هوش مصنوعی در علم پزشکی، جایگاه خاصی در سال‌های اخیر داشته. چرا که همه دانشمندان کامپیوتر و همچنین پزشکی، دریافتند که با استفاده از راه‌حل‌های هوشمند، می‌تونند به حد قابل توجهی، خطاهای پزشکی رو کاهش بدند. همچنین تحقیقات دارو و واکسن هم به شدت سریع‌تر می‌تونن انجام بدند. برای مثال، همین دنیاگیری ویروس کرونا که در سال ۲۰۱۹ آغاز شد و کماکان ادامه داره رو بررسی کنیم، بارها از این که از هوش مصنوعی برای پیدا کردن ترکیبات دارویی موثر بر ویروس استفاده شده، صحبت کردند. همچنین در پروسه ساخت واکسن هم بسیاری از مراحل رو به ماشین سپردند و به هوش ماشینی اعتماد کردند. شاید یکی از دلایلی که واکسن این بیماری انقدر سریع ساخته شد، استفاده از همین راهکارهای هوشمند در تولید بوده.

بینایی ماشین هم استثناء نیست و طبیعتا می‌تونه خیلی به کمک افراد بیاد. در این بخش، تعداد زیادی از ایده‌هایی که می‌تونه به پزشک‌ها در شناخت بهتر مشکلات بیمارهاشون کمک کنه رو فهرست کردم و خب بد نیست اگر شما هم سراغش برید و سعی کنید یکیش رو پیاده کنید (این بخش می‌تونه برای دانشجویان مهندسی پزشکی و پزشکی؛ بسیار مفید باشه)

  • تشخیص نوع تومور مغزی (تصویر این بخش، پروژه‌ای که خودم انجام دادم)
  • تشخیص رتینوپاتی دیابتی در اشخاص مبتلا به دیابت
  • تشخیص MS و مراحل مختلف اون بر اساس MRI
  • تشخیص سلول‌های سرطانی
  • تشخیص میزان درگیری ریه در بیماری‌های تنفسی (مانند COVID-19)
  • تشخیص ناهنجاری‌های پوستی
  • تشخیص آسیب‌های استخوان
  • تشخیص آسیب‌دیدگی‌ها و پوسیدگی‌های دندان

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

سایر حوزه‌ها

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

تشخیص حرکت یا Action Detection

این حوزه به طور خاص، می‌تونه برای کارهایی مثل تشخیص و ترجمه همزمان زبان اشاره (لینک)، تشخیص حرکات ورزشی و یا تشخیص «نیت» افراد بشه. برای مثال، می‌تونیم سیستمی بسازیم که حرکات بعدی فرد در یک نبرد تن به تن (مثل مسابقه بوکس) رو پیش‌بینی کنه و به مربی‌ها و نوآموزهای اون رشته اطلاع بده.

خودروهای خودران

خودروهای خودران یا Self-Driving که پیش‌تر هم ازشون در همین وبلاگ صحبت کرده بودم (لینک) می‌تونن با استفاده از بینایی ماشین و پردازش تصویر، تابلوهای راهنمایی، رفتار سایر رانندگان، موانع در مسیر و … رو تشخیص بدند. این حوزه البته پیچیدگی زیادی داره اما کار کردن روی بخش‌های مختلفش می‌تونه برای یادگیری جوانب مختلف ماجرا جذاب و جالب و مفید باشه.

مصرف انرژی

حوزه انرژی هم حوزه جالبی می‌تونه برای پروژه‌های بینایی ماشین باشه. برای مثال OCR ای که بتونه دیتای کنتور گاز/برق رو به متن تبدیل کنه و اون رو با یک مرکز محاسبه قیمت، چک کنه و قیمت رو به ما اعلام کنه. همچنین می‌شه عکس‌های حرارتی از خانه‌ها و … تهیه کرد و با استفاده از بینایی ماشین دقیقا بررسی کرد که کجاها انرژی بیشتری داره از دست میره و … .

این پروژه‌ها به خودی خود شاید جالب به نظر نرسن اما ترکیبشون با IoT و هوشمندسازی در سطوح دیگر، طبیعتا می‌تونه جذاب و حتی پول‌ساز هم باشه.

کشاورزی

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

ضمن این که امنیت زمین کشاورزی و گلخانه، بررسی نور و رنگ و … هم می‌تونن اینجا کاربردی باشند.

جمع‌بندی مطلب

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

 

Share