بایگانی برچسب: s

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

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

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

تاریخچه مانی

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

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

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

مدت‌های زیادی، در نظر داشتم که پروژه «مانی» رو پیش ببرم اما پایه مناسبی نداشتم. اون‌هایی که می‌شد به راحتی به قولی پیاده‌سازی یا حتی Fine Tune بشند خروجی خوبی نداشتند و اون‌هایی که می‌تونستند خروجی‌های خوبی تولید کنند هم آموزش دادن و فاین‌تیون کردنشون منابع بسیار بسیار زیادی می‌خواست.

ظهور Stable Diffusion

اوضاع در حدود مردادماه امسال، خیلی عوض شد. یک‌باره شرکتی به اسم Stability AI (لینک) تصمیم گرفت یک مدل تولید تصویر متن‌باز ارائه کنه به اسم Stable Diffusion که خب این خودش می‌تونست یک نقطه عطف در تولید تصویر و در کل اثر هنری به کمک هوش مصنوعی محسوب بشه.

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

اما به خوبی Midjourney نبود…

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

البته این نگرانی من نبود، عمدتا نگرانی افرادی بود که به عنوان «مشتری» سراغ این پروژه می‌آمدند و میخواستند از این پروژه استفاده تجاری کنند و خب ظاهرا نُرمی در بین هموطنانمون وجود داره که با علم به این که کجا زندگی می‌کنیم و با چه امکاناتی چی توسعه می‌دیم؛ همچنان انتظار دارند در حد و اندازه غول‌ها ظاهر بشیم 🙂

خلاصه این قضیه خیلی باعث شد به من بربخوره 😁 و به همین خاطر یک دیتاست از تصاویری که در میدجرنی تولید شده بود رو برداشتم، به همراه متون ورودیشون (دیتاست حدود ۱۰۰۰ تصویر) و آخرین نسخه مانی (لینک) رو ساختم. خروجی‌ها واقعا خوب شده بودند اون هم فقط با هزار تصویر. اما یک مشکلی بود، تنوع خروجی به شکل میدجرنی نبود تا این که کمی در دیسکورد میدجرنی، چرخیدم و نتایج جالبی دستم آمد 🙂

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

خارجی‌ها یه اصطلاح جالبی دارند. وقتی میخوان ببینن چیزی چطور کار می‌کنه میگن Let’s look under the hood یا «بذار یه نگاه به زیر کاپوت بندازیم». اما مشکل اینجاست که میدجرنی کاپوتش جوش داده شده. پس چطور میشه فهمید اون زیر چه خبره؟

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

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

میدجرنی یک مدل نیست، چند مدله!

خب یکی از چیزهایی که در مورد میدجرنی خیلی جالبه اینه که همیشه در آپدیت‌هاش مدعی میشه که اضافه کردن یک کلمه یا عبارت جدید (مثلا Double Exposure) در متون ورودی می‌تونه نتیجه‌های جدیدتر و بهتری برای شما تولید کنه.

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

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

ترکیب چند مدل با هم و نتایج آن‌ها

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

حالا اگر این مدل‌ها ساختار مشابهی داشته باشند، این امکان وجود داره که اون‌ها رو با هم ترکیب کنیم و نتیجه‌های بهتری بگیریم. خب کاری که کردم این بود که اول از همه مانی رو با Open Journey و یکی دو مدل دیگه ترکیب کنم (و اسم این مدل رو new_mann_e_2 گذاشتم) و بعد یک سری مقایسه با openjourney انجام دادم.

اما حالا نیاز بود که کمی از خوبی‌های میدجرنی رو هم اینجا داشته باشیم 😁 پس حالا چه کردم؟ هیچی. آمدم و وزن‌های مانی جدید و اوپن‌جرنی رو با هم ترکیب کردم.

نتایج آزمایش‌ها

متن‌های ورودی همونطوری که مشخصه یک منظره (در سبک wasteland و cyberpunk) یک چهره (در سبک و سیاق نقاشانی چون Alphonse Mucha) و یک وسیله نقلیه (نقاشی فانتزی) بودند و مقدار seed (که تعیین‌کنندگی خوبی در جزییان نقاشی داره) در هر سه تصویر، یکی نگه داشته شد.

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

فاین تیون کردن مانی با داده‌های شما

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

اما مانی رو میشه به کمک Dream Booth فاین‌تیون کرد و احتمالا بعدتر در مورد اون هم خواهم نوشت. ولی اگر شما ایده یا دیتایی دارید، می‌تونید به من بگید تا در نسخه ۴ اضافه کنم و مدل بهتری در نهایت ارائه کنم.

جمع‌بندی و سخن آخر

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

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

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

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

یادتان هم نره که یادگیری مستمر به بهبود زندگی شما در هر شرایطی کمک می‌کنه و همیشه شما رو می‌تونه به شخص بهتری تبدیل کنه ✌️

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

سایر حوزه‌ها

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

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

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

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

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

مصرف انرژی

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

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

کشاورزی

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

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

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

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

 

Share

خواندن پلاک خودرو با کمک YOLOv5 و پایتون

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

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

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

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

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

نتیجه آزمایش مدل

طرح کلی مساله

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

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

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

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

کارهای پیش تر انجام شده

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

پلاک‌ خوان دیوار

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

مراحل اولیه تشخیص پلاک در این پروژه
مراحل اولیه پروژه مورد بحث در همین پست – تلاش برای بازسازی پلاک‌خوان دیوار

پروژه تشخیص پلاک با پایتون (با استفاده از OpenCV و KNN)

این یکی پروژه هم یکی از پروژه‌های خوبی در زمینه بینایی ماشین و تشخیص پلاکه که یکی از کاربران آپارات، با پیروی از یک شخص خارجی – که در یوتوب کار مشابهی انجام داده – پیاده‌سازیش کرده. یک ویدئوی دو ساعت و نیمه که به نظرم ارزش دیدن و فکر کردن داره.

در بخش بعدی، اشاره خواهم کرد که چرا این روش رو اتخاذ نکردم و ترجیح دادم که از YOLOv5 استفاده کنم. برای دیدن این ویدئو، می‌تونید از این لینک استفاده کنید.

انتخاب ابزار و تکنولوژی

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

استفاده از Tesseract

تسرکت یکی از نرم‌افزارهای آزاد مشهور در زمینه OCR محسوب میشه که امتیازات ویژه خودش رو هم داره. برای مثال شاید بشه گفت بزرگترین امتیازش اینه که بدون مشکل روی همه سیستم‌عامل‌های مرسوم دنیا نصب و اجرا میشه و مهم نیست شما مک داشته باشید یا ویندوز یا گنو/لینوکس؛ به سادگی می‌تونید اجراش کنید و ازش استفاده کنید. مورد بعدی که باعث میشه افراد به سمت تسرکت برن هم اینه که کتابخونه‌ای برای استفاده مستقیم در پایتون داره و این خودش یک امتیاز بزرگه که نرم‌افزاری که به صورت stand-alone اجرا میشه رو بشه با یک wrapper ساده وارد زبان برنامه‌نویسی مورد علاقمون کنیم.

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

استفاده از KNN

خود کتابخانه OpenCV تابعی برای آموزش یک طبقه‌بند KNN یا K-Nearest Neighbor ارائه می‌کنه که در ویدئویی که در بخش قبل لینک دادیم هم استفاده شده. این مورد هم مشکلات خاص خودش رو داشت و از لیست حذف شد. یکی از واضح‌ترین دلایل این بود که ممکن بود این روش خاص، در اعداد شبیه به هم کمی مشکل ایجاد کنه. در کل، علیرغم این که الگوریتم K نزدیک‌ترین همسایه، الگوریتم مورد اطمینانی در یادگیری ماشین کلاسیک محسوب میشه، ریسک خطای مدل نهایی رو هم می‌تونه بالا ببره.

استفاده از EasyOCR

کتابخانه EasyOCR یکی از محبوب‌ترین کتابخانه‌ها در میان مهندسین بینایی ماشین در دنیاست. یکی از دلایلش اینه که با سرعت خوبی (بخصوص با داشتن GPU) می‌تونه متون رو تشخیص بده و از همه مهم‌تر، دور متون مورد نظر ما Bounding Box قرار بده. این کتابخانه هم زبان‌های زیادی مثل انگلیسی، آلمانی، نروژی و … رو پشتیبانی می‌کنه اما نقطه قوتش نسبت به Tesseract اینجاست که در زبان‌های فارسی و عربی هم بدون نیاز به استفاده از فونت و …؛ می‌تونه تشخیص خوبی بده.

با این وجود، مدلی که EasyOCR ازش استفاده می‌کنه هنوز به خوبی برای زبان فارسی fine-tune نشده و پروژه حال حاضر رو نمی‌تونه به سرانجام برسونه. به همین دلیل، این ابزار هم از لیست ابزارهای مورد استفاده در پروژه ما، خط می‌خوره. البته این هم باید اشاره کرد که EasyOCR نرم‌افزاری آزاده که میشه بهش کمک کرد و بهبودش بخشید (روشش رو اینجا می‌تونید پیدا کنید).

استفاده از سیستم‌ها و سرویس‌های OCR ایرانی

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

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

توسعه CNN اختصاصی

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

استفاده از YOLOv5

در نهایت، لازم بود که از مدلی مثل YOLOv5 استفاده بشه برای این که بتونیم OCR مخصوص پلاک رو توسعه بدیم. چرا YOLOv5 و چرا سایر نسخه‌های یولو نه؟ پیش‌تر این مورد رو به تفصیل توضیح دادم اما توضیح کوتاه ماجرا میشه سهل‌الوصول بودن نتیجه transfer learning و fine-tuning این مدل خاص. این مدل، یعنی YOLOv5 به سادگی می‌تونه روی سیستم شخصی من (مکبوک پرو آخر ۲۰۱۹ با سیستم عامل مک) و روی گوگل کولب اجرا بشه. همچنین انتقالش به سایر سیستم‌ها هم راحت انجام میشه و از این نظر، خیالم می‌تونست راحت باشه.

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

جمع‌آوری و پیش‌پردازش داده مورد نیاز

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

پس از این که داده‌های مورد نظر خریداری و دانلود شد، نوبت به لیبل زدن بود. لیبل‌های ما اعداد ۰ تا ۹ بودند و گذشته از اون، برای این که داده تستی کافی داشته باشیم و مراحل پیاده‌سازی سریع‌تر پیش بره، فقط ۷۵ تا عکس رو با کمک labelImg لیبل کردیم.

پیاده‌سازی پروژه

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

داده‌های ما روی Google Colab آپلود شدند چرا که آموزش YOLOv5 نیازمند داشتن GPU است. بعد از اون، آموزش به این صورت شکل گرفت که هفتصد و پنجاه epoch (یا نسل) طول کشید، سایز batch ما ۳۲ بود، اندازه تصویر به ۴۱۶ د ۴۱۶ پیکسل تغییر کرد (اسکریپتی که برای آموزش YOLOv5 توسط تیم Ultralytics ارائه شده خودش امکان تغییر سایز رو فراهم کرده) و مدل پایه مورد استفاده yolov5m بود که با ۲۱.۲ میلیون پارامتر آموزش داده شده. پس از حدود ۳ ساعت و ۴۰ دقیقه، مدل ما آماده بود و نیاز داشتیم که تستش کنیم.

نتایج آزمایش

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

نتیجه آزمایش مدل

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

جدول میزان دقت مدل - دیتاست آموزشی

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

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

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

داده استخراج شده از پلاک - دیتاست آزمایشی

جمع‌بندی و نتیجه‌گیری

در اینجا لازمه که پروسه‌هایی که طی شده رو یک بار دیگه بررسی کنیم تا به یک جمع‌بندی روی پروژه برسیم:

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

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

کارهای آینده

در این قسمت، کارهایی که در آینده میشه برای این پروژه انجام داد رو با هم یک بررسی اجمالی می‌کنیم:

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

مجوز نشر

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

سخن آخر

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

Share

با هوش مصنوعی، ریاضی ۱ رو پاس کن!

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

ایده‌های زیادی در سر داشتم. برای مثال ایده بازی Red Light – Green Light که در سریال اسکوییدگیم همه دیدیم. اما این ایده علیرغم خوب بودنش، آنچنان کاربردی نبود. پس تصمیم من برآن شد که یک نرم‌افزار دیگر توسعه بدم. نرم‌افزاری که هم چالش داشته باشه، هم در نهایت یک کاربرد درست ازش بشه درآورد.

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

نتیجه حل مساله توسط هوش مصنوعی

گام اول: طرح مساله

در هر پروژه‌ای، اولین گام اینه که مطرح کنیم چه مشکلی رو باید حل کنیم. یا به قول دنیل کوهن Look for the pain. خب دردی که ما اینجا به دنبال حل کردنش بودیم، چی بود؟ این که بسیاری از دانش‌آموزا و دانشجوها سر ریاضی عمومی یا Calculus مشکل دارند. این مشکل ریشه‌ش کجاست؟ برای من شخصا مهم نیست که این ریشه رو بررسی کنم (البته به معنای این نیست که نظری در موردش ندارم، اما از حوصله این مطلب خارجه).

حالا درد این که بسیاری از دانشجوها و دانش‌آموزها مشکل دارند، چطور میشه براشون یک مسکن خوب تجویز کرد؟ بعنوان یک مهندس هوش مصنوعی، یا بهتر بگم مهندس بینایی ماشین در ذهنم این ایده چرخید و اون این بود که:

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

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

گام دوم: انتخاب ابزار

گام دوم برای من، انتخاب ابزار بود. اول از همه می‌خواستم برم سراغ OCR های آماده برای تشخیص مسائل پارامتری مثل x و y و … . اما بعد دیدم که اینجا علاوه بر حروف و اعداد، نشانه‌ها هم هستند. ضمن این که به شکلی باید توان و … هم تشخیص داد. پس کمی پروژه رو نگه داشتم تا به ابزارها فکر کنم.

بعد از مدتی تحقیق و تفحص، به دارک‌نت رسیدم که برای ترین کردن YOLOv3 و YOLOv4 استفاده میشه و خب دارک‌نت مشکلات زیادی هم با خودش به همراه داره. برای مثال کاملا در سی‌پلاس‌پلاس نوشته شده و روی سیستم‌های مختلف باید از نو کامپایل بشه. با CPU درست کار نمی‌کنه. کامپایل کردنش روی مک یا ویندوز دردسره و انتقال دادنش به Google Colab هم می‌تونه تا حد زیادی مشکل‌ساز بشه.

بعد از اون الگوریتم YOLOv5 رو کشف کردم. تقریبا همه مراحل کاملا پایتونی پیش می‌رفت و این عالی بود. کم کم دیدم که میشه بعد از ترین کردن قضیه، از pytorch هم استفاده کرد و اشیاء رو تشخیص داد و از اون بهتر این بود که در تشخیص اشیاء، می‌شد خروجی pandas هم گرفت که مختصات شیء مورد نظر به همراه لیبلش در اون data frame خاص موجود بودند. پس به این شکل تشخیص این که ما با چه چیزی روبرو هستیم هم ساده‌تر از گذشته می‌شد.

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

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

نمونه داده‌های پروژه
نمونه داده‌های استفاده شده در این پروژه

گام سوم: جمع‌آوری داده

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

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

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

گام چهارم: پیش‌پردازش داده

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

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

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

پروسه برچسب‌زنی

گام پنجم: آموزش مدل YOLOv5

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

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

و گام نهایی: آزمایش مدل و نوشتن رابط ولفرام آلفا

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

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

در نهایت هم برای این که عملکرد قضیه رو ببینید، این ویدئو کوتاه رو می‌تونید تماشا کنید که هم inference رو تست می‌کنیم هم حل مساله با ولفرام رو:

جمع‌بندی و مشکلات این نرم‌افزار

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

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

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

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

Share

هرآنچه باید در مورد خودروهای خودران بدانید!

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

ابتدا که بحث خودروهای خودران خیلی مطرح شد، سال ۲۰۱۴ بود و تسلا قابلیت «خلبان خودکار» (یا البته بهتره در این مورد خاص، بگیم راننده خودکار) رو برای خودروهاش معرفی کرد. اگر می‌خواهید در مورد اتوپایلت تسلا بیشتر بدونید هم می‌تونید این لینک رو مطالعه کنید. ابتدا خیلی برام سوال بود که چطور میشه یک وسیله نقلیه مثل یک خودرو، کامیون و …؛ خودران باشه و نیازی به هیچ اپراتوری نداشته باشه. مثلا یکی از چیزایی که به ذهن من (و احتمالا خیلی‌های دیگه) می‌رسه، بینایی ماشین باشه. این درسته اما همه‌ش نیست.

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

هوش مصنوعی چطور یاد می‌گیره رانندگی کنه؟

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

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

حالا از این بگذریم، کم کم یک موضوع مهم رو یاد می‌گیریم. موضوع چیه؟ این که «تابلوها، علائم، فرمان پلیس و … همه مهم هستند و باید بهشون توجه کرد و احترام گذاشت. اما مهم‌تر از آن‌ها، دیدن رانندگی باقی راننده‌هاست». اینجا اهمیت این موضوع کم کم روشن میشه که بفهمیم همه ما، قرار نیست عین هم رانندگی کنیم. خیلی‌ها هستند که برای هضم دل‌تنگی‌هاشون تخت‌گاز میرن. خیلی‌ها هستند که در لاین سرعت با سرعت ۴۰ تا میرن. خیلی‌ها هم درست رانندگی می‌کنن ولی راهنما نمیزنن و … . در واقع ما با تجربه می‌فهمیم که رفتار راننده‌ها چطوره و این رفتار رو آنالیز می‌کنیم و به نتایجی می‌رسیم که باعث میشن ما راننده بهتری بشیم.

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

خودروهای خودران چه داده‌ای نیاز دارند؟

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

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

داده‌های علائم راهنمایی و رانندگی

خب هوش مصنوعی هم عین خودمون نیازمند اینه که آیین‌نامه رو بلد باشه. در واقع باید بتونه علائم رو تشخیص بده. البته مهم اینجا اینه که این علائم چی هستند، و بعد با باقی داده‌ای که دریافت می‌کنه بتونه در مورد نحوه رانندگی تصمیم‌گیری کنه. پس ابتدا لازمه که هزاران عکس مختلف از علائم رانندگی داشته باشیم و یک مدل خاص (معمولا از نوع Object Detection که خب می‌تونیم از مدل‌هایی مثل YOLO براش استفاده کنیم) براش آموزش بدیم. البته موضوعاتی مثل رنگ‌بندی علائم در کشورهای مختلف هم می‌تونه مساله‌ساز باشه که خب بعدتر می‌تونیم روی اون تصمیم بگیریم. مثلا یکی از این مسائل، «آبی» بودن چراغ سبز در کشور آلمانه. شما چه راه‌حلی براش دارید؟

تصویر مسیر

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

زاویه فرمان، میزان فشار روی پدال گاز و دفعات و شدت فشرده شدن ترمز

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

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

فاصله

خودروهای خودران، علاوه بر تعداد زیادی دوربین، تعداد خوبی سنسور هم برای تشخیص فواصل دارند. این سنسورها یا از نوع LiDAR (یا Light detection and ranging) یا فراصوت (Ultrasonic) یا حتی RADAR (که مخفف Radio detection and ranging است) یا ترکیبی از این موارد هستند. با استفاده از این سنسورها، فاصله از موانع، عابرین پیاده، خودروهای دیگر و … ثبت و ضبط میشه و بعدا به مدل هوش‌مصنوعی ما می‌تونه کمک بده که اینجا چه خبر بوده و در موقعیت مشابه، چه تصمیماتی باید اتخاذ کنه.

موارد دیگر

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

قوانین استفاده از خودروهای خودران

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

در حال حاضر، هیچ کشوری «خودروی ۱۰۰٪ بدون راننده» رو نمی‌پذیره و حتی خودروهایی که «بدون حضور راننده» به حرکت درمیان، نیازمند این هستند که توسط اپراتور کنترل بشن. این مورد، برای اینه که خودروها بدون هیچ راننده و کنترلی ممکنه موجب تصادف و آسیب به سایر خودروها، ساختمان‌ها و افراد بشن.

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

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

جمع‌بندی و سخن آخر

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

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

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

سخن آخر هم این که مثل همیشه ممنونم از این که وقت گذاشتید و این مطلب رو خوندید و امیدوارم که این مطلب، مفید فایده واقع شده باشه 🙂

Share

نقشه راه بینایی ماشین برای مبتدیان

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

این مطلب، اصلا و ابدا قرار نیست «آموزش» باشه و همونطوری که ابتدای مطلب گفتم، صرفا «نقشه راه» برای شماست.

بینایی ماشین، بینایی کامپیوتری

بینایی ماشین چیه؟

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

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

کجا کاربرد داره؟

کاربردهای بینایی ماشین، می‌تونه در بسیاری از جاها باشه. نمونه‌ش مثلا همین پروژه‌ای که من زده بودم:

اندازه‌گیری اشیا با بینایی ماشین

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

چرا باید بلدش باشیم؟

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

از کجا شروع کنیم؟

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

  • برنامه‌نویسی پایتون: از اونجایی که پایتون زبان ساده‌ایه و اکثر آدمها دنبال یادگیریشن (و این یعنی منابع آموزشی خیلی خوبی براش هست) بهتره که پایتون رو تا حد خوبی یاد بگیرید. حد خوب، یعنی حدی که شما بتونید یک نرم‌افزار ساده ولی کاربردی رو باهاش توسعه بدید (مثلا یه ماشین حساب یا چیزی مشابه اون).
  • مقدمات یادگیری ماشین: بینایی ماشین به شکلی یکی از زیرمجموعه‌های هوش مصنوعی محسوب میشه. این نشون میده که اگر شما به الگوریتم‌ها و تئوری یادگیری ماشین و … آشناییت کافی داشته باشید، می‌تونید در این فیلد هم پیشرفت قابل توجهی کنید. گذشته از این، یادگیری ماشین می‌تونه بهتون در «هوشمندسازی» بیشتر نرم‌افزارهای بینایی ماشین کمک کنه.
  • آشنایی مختصر با جاوا یا سی++: از اونجایی که پایتون یک زبان مفسری محسوب میشه، ممکنه خیلی‌جاها (مثلا در یک برد آردوینو) نتونیم مستقیم ازش استفاده کنیم و همچنین استفاده ازش پیچیدگی خاصی به همراه داشته باشه؛ بهتره یک زبان سطح پایین‌تر مثل سی++ هم کمی آشنا باشیم. همچنین اگر قصد این رو دارید که اپلیکیشن تلفن همراه بنویسید که از بینایی ماشین استفاده می‌کنه، بد نیست دستی هم در جاوا داشته باشید.
  • آشنایی با سخت‌افزارها و سیستم‌های نهفته (Embedded Systems): یکی از کاربردهای عظیم بینایی ماشین، فعالیت‌های Surveillance می‌تونه باشه (البته این که این فعالیت‌ها بد یا خوب هستند بحث جداییه). یکی از نمونه‌هاش می‌تونه «سیستم حضور و غیاب با تشخیص چهره» باشه، یا حتی «دفترچه تلفن هوشمند» و … 🙂 به همین دلیل، بد نیست که کمی با سیستم‌های نهفته و سخت‌افزارهایی مثل Jetson Nano و Raspberry Pi آشنایی داشته باشید.
  • آشنایی با لینوکس: این واقعا نیاز به توضیح خاصی نداره، روایت داریم اگر لینوکس بلد نیستی، برنامه‌نویس نیستی 🙄

لیست بالا به شما کمک می‌کنه که محکم‌تر در زمینه بینایی ماشین، قدم بردارید. هرجاش رو که بلد نباشید می‌تونید با جستجو پیداش کنید و یاد بگیرید و از یادگیری، لذت ببرید 🙂

سخن آخر

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

Share