احتمالا شما هم در دهه هشتاد شمسی، تبلیغ معروف تلویزیونی «به همین سادگی، به همین خوشمزگی، پودر کیک رشد» رو یادتون باشه. پودرهای کیک آماده، یکی از اختراعات جالب بشر بودند که هنوز هم فکر کردن بهشون برای من شخصا جالبه. اما موضوعی که وجود داره، اینه که این پودرها، باعث شدند مفهومی به اسم اثر IKEA یا IKEA Effect به وجود بیاد.
در این مقاله، قصد دارم که ربط پودر کیک آماده به آیکیا رو توضیح بدم و بگم که چرا مهمه که از اثر آیکیا در تولید محصول استفاده کنیم و در نهایت هم یک نمونه خیلی خوبی از اثر آیکیا رو با هم نظارهگر خواهیم بود.
پودر کیک آماده: مردها هم آشپزی میکنند!
در سال ۱۹۳۰ میلادی شرکتی با نام Duff and Sons محصولی به بازار ارائه کرد. پودر کیک آماده! این محصول با شعار مردها هم آشپزی میکنند سعی داشت بگه در حدی کار پختن کیک رو ساده کرده که آقایون هم میتونن صرفا با اضافه کردن آب یا شیر به این پودر و قرار دادنش در فر، کیک بپزند.
اما یک مشکلی به مدت دو دهه، گریبان این محصول رو گرفت. نه فقط شرکت Duff and Sons بلکه هر شرکت دیگری که پودر کیک تولید میکرد، چنین معضلی رو باهاش روبرو بود. نمیتونستند بفروشند.
اما چرا یک محصولی که همه جوره کامل بود نمیتونست بفروشه؟ آیا مساله اعتماد بود؟ آیا مساله کیفیت بود؟ نه. اتفاقا مشتریان هرچند اندک این شرکتها، از کیفیت کیکی که به دست میآوردند راضی بودند و کاملا به تولیدکننده اعتماد میکردند.
باگ ماجرا جای دیگری بود. شاید جایی که این محصول سعی داشت به طور کلی دخالت انسان در پخت کیک رو حذف کنه و این خوشایند خیلی از افراد نبود. مثل همون کاری که خیلیها انتظار دارند ایجنتهای هوش مصنوعی انجام بدند.
یک تخم مرغ اضافه کنید!
بالاخره بعد از دو دهه که محصول «پودر کیک آماده» در بازار موجود بود، شرکتی به نام Betty Crocker اومد و یک ایده بهتری داد. اینها گفتند که چطوره خود مشتری هم بخشی از پروسه تولید کیک بشه؟
درسته که این محصول میخواست زحمت پختن کیک رو کم کنه، اما در عین حال این کاهش زحمت و هزینه تا حد خیلی زیادی هم خوشایندی فرایند پخت کیک رو کم میکرد. به همین خاطر اینها گفتن قبل از این که آب یا شیر به این پودر اضافه کنید، یک عدد تخم مرغ هم اضافه کنید.
همین هک ساده، باعث افزایش چند برابری فروش این محصول شد. اما حالا ربطش به آیکیا چیه؟ بهتره یه بررسی روی آیکیا داشته باشیم!
آیکیا: کسب و کار اضافه کردن تخم مرغ به پودر کیک
اگر در فضای کسب و کار و بخصوص حوزه لوازم خانگی فعال باشید حتما اسم آیکیا رو شنیدید. یک برند سوئدی که بخاطر یک موضوع خیلی معروفه:
هرچیزی که ازش میخرید رو خودتون باید سر هم کنید.
در واقع آیکیا کار طراحی، برش، سوراخکاری و به طور کلی فرایندهای کارگاهی رو روی محصول مورد نظر مثل کتابخونه، انجام داده. شما فقط و فقط باید اینها رو به هم وصل کنید. حتی میتونید هزینهای پرداخت کنید که کارشناسی از آیکیا بیاد و برای شما چنین کاری کنه.
اما چرا این موضوع «سرهم کردن کتابخونه توسط خودمون» خیلی مهمه؟ چون داره مشتری رو وارد پروسه تولید میکنه و این یعنی فروش حس به مشتری.
اگر دقت کنید، خیلی از برندهای معروف جهان، مثل اپل، رولکس، گوچی، لامبورگینی و … بیش از این که روی محصول تمرکز کنند دارند روی حسی که مشتری از محصولشون دریافت میکنه تمرکز میکنند. برای مثال شعار خودروساز ایتالیایی، فراری؛ این بوده که شما وقتی یک فراری میخرید که بخواهید برای خودتون کسی باشید. در واقع به این شکل خاص بودن خودروهای خودش رو نشون داده و این خاص بودن رو به مشتری هم انتقال داده.
این مورد که مشتری رو بخشی از فرایند تولید محصول کنیم، بخاطر همین حرکت آیکیا به اثر آیکیا معروف شده و حتی باعث شده که آیکیا طرفدار خاص خودش رو پیدا کنه. یک برندی که نه لاکچریه نه حتی عقبه خیلی خاصی داره و صرفا یک برند مبلمان و لوازم خانگی با کیفیت مطلوبه، بتونه برای خودش یک جامعه هواداری تشکیل بده و این رو با ایجاد یک حس خوب در مشتری تونسته داشته باشه!
اثر آیکیا در خدمت تکنولوژی
قبل از این که بخوام از نمونههای عملی اثر آیکیا در تکنولوژی صحبت کنم، لازمه ذکر کنم خود آیکیا، از اثر آیکیا در تکنولوژی استفاده کرده. چطور؟ خیلی سادهست.
آیکیا از اولین برندهای لوازم خانگی بوده که تکنولوژی واقعیت افزوده رو به سیستمهای نرمافزاریش منجمله وبسایت و اپلیکیشنش اضافه کرد و اینطوری حتی حس داشتن محصولاتش رو قبل از خرید هم تونست به کاربران منتقل کنه.
اما در یک سال اخیر، ابزارهای جالبی مثل Bolt یا v0 دیدیم. این ابزارها هم در واقع همین اثر آیکیا رو دارند در زمینه برنامهنویسی و تولید نرمافزار پیادهسازی میکنند.
این ابزارها به افرادی که تجربه زیادی در راهاندازی استارتاپ یا ساخت نرمافزار ندارند، کمک میکننده ایدههاشون رو بتونن پیادهسازی و ارزیابی کنند و اون دسته افرادی که کمی کارکشتهتر بودند، تونستند از این ابزارها برای جلو انداختن کار خودشون نهایت استفاده رو ببرند و در مدتزمان بسیار کوتاهی، نرمافزارهایی بسازند که بتونه درآمدزایی داشته باشه یا اصلا به صورت کامل توسط یک موجودیت دیگر تملیک بشه.
خلاصه اثر آیکیا، یک حجم خوبی دوپامین رو در مغز مشتری شما ترشح میکنه و این امر باعث میشه مشتری شما نوعی اعتیاد به محصولتون پیدا کنه. احتمالا در آینده از این که چطور میتونیم این اثر رو در محصولاتمون داشته باشیم، بنویسم!
جمعبندی
در عصر امروز، جذب مشتری سختتر از گذشته شده. بسیاری از محصولاتی که ما میسازیم، بهترش توسط غولهای بازار ساخته و عرضه میشه و ما باید بتونیم از چنین آشفتهبازاری، جان سالم به در ببریم. استفاده از هکهای سادهای مثل یک تخممرغ اضافه کن یا همین اثر آیکیا، میتونه به راحتی جذب تعداد خوبی از مشتریهای ما رو تضمین کنه. به همین دلیل، پس از مدت نسبتا طولانی دست به قلم (کیبرد؟) شدم و این مطلب رو نوشتم تا اگر شما هم در حال توسعه محصولی هستید، به نکاتی که حول جذب مشتری با این هکهای شناختی وجود داره توجهی دوچندان کنید.
مدتی پیش، پروژههای مختلفی مثل مارال یا جبیر رو با هدف انتشار و ساخت یک مدل زبانی بزرگ با همون LLM (مخفف Large Language Model) شروع کرده بودم اما بحث این مدلها و شاید همزمان شدن انتشار اینها با نسخههای جدیدی از پلتفرمهای مانی و آتلیه، کمی باعث شده بود که از هدف اصلی دور بشیم.
در همین مدت، مدل ۸ میلیارد پارامتری هرمز منتشر شد که خب یک بازخورد بسیار خوب از جامعه فارسیزبان تونست بگیره. مدل هرمز، از طریق وبسایت هاگینگفیس، کاملا در دسترس شماست و میتونید ازش استفاده کنید.
اما هرمز شد بخشی از یک پروژه بزرگتر، چرا که کمی دقت به بزرگان این حوزه، نشون از این بود که تقریبا همه شرکتهای خوب و موفق در این حوزه، به جای این که «یک مدل» منتشر کنند «یک خانواده مدل» منتشر کردند که خب باید از این قضیه تا حدی الگوگیری میشد.
تصمیم به ساخت یک خانواده از مدلها
از تولیدکنندگان بزرگ و تجاری مدلهای جنریتیو که بگذریم، بسیاری از شرکتهایی که مدلهای اوپن سورس تولید میکنن و نامداران این عرصه هم هستند (مثل Alibaba Cloud, DeepSeek, Mistral و حتی Meta) عموما به یک عدد مدل کفایت نمیکنند.
مدلهایی که این شرکتها تولید میکنند عموما در یک «خانواده» قرار داره و این خانواده هم بر اساس تعداد پارامتر، توانایی استنتاج (یا همون Reasoning) توانایی بینایی ماشین (یا همون vision) و …، تعیین میشن. برای مثال یکی از مدلهای معروف این حوزه که LLaMA نام داره و توسط شرکت متا ساخته شده، معمولا در یک نمونه کوچک (۷ یا ۸ میلیارد پارامتری)، یک نمونه متوسط (۱۱ یا ۱۳ پارامتری) و نمونههای بزرگ (۷۰ میلیارد پارامتر و بیشتر) تولید میشه.
اما خب یک مورد دیگری هم که به چشمم خورد، کاری بود که DeepSeek با R1 کرده بود. در واقع اومده بودن مدلهای کوچکتر (از یک و نیم میلیارد تا هفتاد میلیارد پارامتر) رو با روش Distillation درست کرده بودند.
در واقع مدلهایی مثل LLaMA, Qwen, Mistral و … رو با دادههایی که از مدل دیپسیک ۶۷۱ میلیارد پارامتری به دست آورده بودند، مجدد آموزش دادند که در اختیار افراد بیشتری قرار بگیره.
همین موضوع، باعث شد که به این فکر بیفتیم که در سال ۱۴۰۴ به جای این که هفتهای یک LLM ریلیز کنیم 😁 یک خونواده خوب از LLMها برای تمام فصول ریلیز کنیم که باز هم از DeepSeek V3 و ترین کردن QLoRA و مرج کردن روی اون شروع شد.
اسم Xei از کجا میاد؟
پیش از این که بخواهیم در مورد خود مدلها و روش اجراشون صحبت کنیم، کمی در مورد اسم توضیح بدم.
ریاضیدانان ایرانی مثل خوارزمی، موقعی که معادلات خاصی رو حل میکردند از عبارت «شیء» بعنوان مجهول استفاده میکردند. وقتی اروپاییها آثار این دانشمندان رو به زبانهای خودشون ترجمه کردند، درک کردند که این «شیء» در واقع مجهوله و به جای این که Object (یا چیزی معادلش) ترجمهش کنند، برای حفظ حالت مجهولش از عبارت xei استفاده کردند که بعدا شد xای که در معادلات مختلف استفاده میکنیم.
یکی از دلایل این اسم، اینه که هم تلفظش برای داخلیها راحته هم خارجیها و هم یک بکگراند جالب ایرانی داره.
اما حالا مدلها چی هستند؟ چرا انقدر این خونواده از مدلها مهم بود؟
اهمیت خانواده مدل Xei
یکی از دلایل اصلی ساخته شدن Xei این بود که این مدلها بتونن هم روی دستگاههای کاربر نهایی مثل من و شما اجرا شن هم روی زیرساختهای بزرگ و صنعتی.
در واقع هم تعدادی مدل On Device داشته باشیم و هم تعداد زیادی مدل برای استفاده Enterprise و به همین خاطر ۷ تا مدل در این خونواده، قرار گرفته که در ادامه بررسی میکنیم.
مدلهای Xei
مدل ۰.۱ میلیارد پارامتری، مبتنی بر لاماست و صرفا زبان انگلیسی میفهمه و میتونه در کارهایی مثل کدنویسی به شما کمک کنه.
مدل ۰.۵ میلیارد پارامتری، مبتنی بر Qwen ساخته شده. با این که از دیتای چندزبانی درش استفاده شده ولی بهترین عملکرد رو روی انگلیسی داره و همچنان برای کارهایی مثل کدنویسی و نوشتن ایمیل، مناسبه.
مدل ۲ میلیارد پارامتری که مبتنی بر Gemma 2 ساخته شده و محمد شجاعی عزیز زحمت ساختش رو کشیده، اولین مدلیه که به خوبی فارسی رو درک میکنه و میتونه به زبان فارسی به شما پاسخهای درست بده.
مدل ۸ میلیارد پارامتری که در واقع همون هرمز قدیمی خودمونه و مبتنی بر Command-R از Cohere ساخته شده.
مدل ۳۲ میلیارد پارامتری که باز هم مبتنی بر Command-R ساخته شده و نتایج بهتر و دقیقتری میتونه تولید کنه.
مدل ۱۰۰ میلیارد پارامتری که باز هم مبتنی بر Command-R ساخته شده 😁
و در نهایت مدل ۶۷۱ میلیارد پارامتری که مبتنی بر DeepSeek V3 ساخته شده و از معماری MoE بهره میبره.
و خب همونطوری که میبینید، تا مدل ۸ میلیارد پارامتری به سادگی روی اکثر رایانههای شخصی حتی بدون کارت گرافیک NVIDIA قابل اجراست ولی نمونه ۳۲ و ۱۰۰ و ۶۷۱ نیاز به منابع بیشتری دارند که در ادامه به اونها هم میپردازیم.
چطوری به Xei دسترسی پیدا کنیم؟
اگر میخواهید مستقیما به سمت مدل ۶۷۱ میلیارد پارامتری بریم، کافیه که به این سرویس برید، یک حساب کاربری بسازید و شروع به چت کنید.
ولی اگر دوست دارید که این مدل رو روی سیستم شخصی خودتون اجرا کنید، میتونید از کتابخونه Ollama نسخه مناسب رو دانلود کنید (با کارت ۲۰۵۰ تا مدل ۳۲ میلیاردی قابل اجراست، گرچه بهترین نتیجه مربوط به همون ۸ میلیاردیه).
در آموزشهای بعدی، نحوه راهاندازی و کار کردن با Ollama رو هم قرار خواهم داد که ببینید چطور میشه به سادگی یک سری مدل خوب هوش مصنوعی رو روی کامپیوتر شخصی، اجرا کرد.
جمعبندی و سخن آخر
در حال حاضر، پروژه Xei بعنوان یکی از پرچمداران مجموعه مانی که تحت برند Aqua Regia فعالیت میکنه قراره مدتها آخرین و مهمترین پروژه ما باشه. از همین رو، پست بلاگ مربوط بهش هم زود نوشته شد تا این که بتونیم روی اون مانور لازم رو بدیم.
اما کل داستان این نیست و به زودی با سورپرایزهای جدیدتری، در خدمت شما خواهیم بود. امیدوارم تا اون موقع با Xei کارهای خفنی کرده باشید 😎
پاییز دو سال پیش بود که ChatGPT آمد و به شکل خاصی بازار همه چیز رو عوض کرد یا بهتره بگم که به هم ریخت 😁 در این مدت نه فقط OpenAI که هزاران شرکت دیگر هم دست به کار شدند و شروع کردند به ارائه مدلهای زبانی بزرگ یا همون LLMها و خواستند که به شکلی با OpenAI رقابت کنند.
الان که دو سالی از اون روزها گذشته منتها موضوع کمی تفاوت داره و بیش از این که سمت ارائه مدل بریم، بهتره به سمت agent یا «عامل» بریم که خب خودش یک بحث مفصله.
دیشب، در بلاگ انگلیسیم کمی در مورد مدلهای بزرگ و ایجنتها صحبت کردم و امروز تصمیم گرفتم که بلاگ فارسیش رو هم بنویسم که هر دو طرف، محتوای مناسب رو داشته باشیم.
ایجنتها، عملگرایی به LLMها اضافه میکنند.
اگر دنبالکننده بلاگ و در کل محتوای من باشید، احتمالا میدونید که من هم در بازی LLM بودم و مثلا یکی از LLMهای اوپن سورسی که روش کار کردم مدل مارال هفت میلیارد پارامتری بود که روی Alpaca Persian تمرین داده شد.
اما آیا یک مدلی که سوال-جواب کنه کافیه یا به چیزی بیشتر نیاز داریم؟ در واقع برای این که LLMها بتونن موثر واقع بشن، باید بتونن با ابزارهای مختلف تعامل کنند. حالا شما فرض کنید که بخواهیم این تعامل رو در سطح فاینتیون کردن، به مدل اضافه کنیم.
یعنی فرض کنید که ما APIهایی از دیجیکالا، اسنپ، دیوار و مثلا ابر آروان بگیریم. سعی کنیم با کمک تعدادی API Call نمونه، مدل رو تیون کنیم. حالا فرض کنید یک نفر بخواد این مدل رو برای استفاده از تپسی یا باسلام به کار بگیره. چی میشه؟ هیچی! مجددا بار فاینتیون با APIهای جدید میفته روی دوش کاربر.
برای حل این مشکل، ما نیاز به agentها داریم. در واقع در مثالهای فوق هر API و ابزاری که لازم داریم رو برمیداریم، میبریم یک جایی براشون توابع درستی مینویسیم و سپس با کمک LLMها خروجی رو «انسانی» یا Humanize میکنیم. به این شکل بار فاینتیون کردن LLMهم به دوش نمیکشیم و همه چیز هم عالی پیش خواهد رفت.
ساخت ایجنت بدون استفاده از فریمورک
دقیقا از زمانی که OpenAI و سایر شرکتهایی که LLM ارائه دادند APIهای چت و یا Instruction Following خودشون رو هم ارائه کردند، فریمورکهای زیادی مثل Flowise یا Crew AI ساخته شدند که به شما کمک کنند تا ایجنت بسازید.
اما راستش رو بخواهید – همونطور که در بلاگ انگلیسی هم توضیح داده بودم – خیلی از این فریمورکها یه حجم عجیب و غریبی از پیچیدگی رو به فرایند ساخت ایجنت دارند اضافه میکنند.
نتیجه این شد که شخصا به دنبال روشی گشتم که بتونم بدون استفاده از فریمورک خاصی، به راحتی بتونیم یک ایجنت بسازیم. برای همین لازم بود که درک کنم ایجنت اصلا چی کار میکنه؟ چرا انقدر مهمه که ما بتونیم ایجنت رو درک کنیم؟ و صدالبته از هر ایجنتی که اسمش «اسمیت» باشه دوری بجوییم 😂
ایجنتها یک سری «وظیفه» و «ورودی مناسب هر وظیفه» رو درک میکنند. این وظایف یا تسکها در واقع توابعی هستند که در برنامهمون قرار ادادیم که بتونن یک کاری رو انجام بدن (مثلا بره رخداد n ام سری فیبوناچی رو حساب کنه) و ورودیهاشون هم دیتاییه که ایجنت باید با هوش خودش تشخیص بده و بسازه.
در نهایت نیاز به مکانیزمی داریم که بیاد این وظایف و ورودیها رو اجرا کنه، خروجیشون رو دوباره بده به LLM و ازش بخواد که Humanizeش کنه. گذشته از این بد نیست که ایجنت ما یک حافظه کوچکی هم داشته باشه.
نمونه یک ایجنت ساده با پایتون
سلب ادعا: از اونجایی که کد این ایجنت رو در گیتهاب گذاشتم، صرفا مراحل ساخت ایجنت ساده رو توضیح میدم و باقیش رو میتونید از گیتهابم ببینید و ایده بگیرید.
اولین گام ما برای ساخت ایجنت باید این باشه که یک LLM مناسب انتخاب کنیم. شما مختارید هر LLMای که یک OpenAI Compatible API ارائه میده انتخاب کنید اما من شخصا دارم از پروژه جبیر خودم استفاده میکنم 😁
بعد از اون، لازم داریم که بیاییم یک کلاینت ساده OpenAI درست کنیم که بتونه با API مورد نظر ما کار کنه:
from openai import OpenAI
client = OpenAI(api_key="FAKE", base_url="https://openai.jabirpoject.org/v1")
همونطور که قبلا در این پست توضیح داده بودم، کتابخونه OpenAI در پایتون نیازمند یک API Keyئه که اینجا ما از FAKE استفاده کردیم براش.
حالا یک کلاس ایجنت ساده درست میکنیم که حافظه هم داشته باشه:
class Agent:
def __init__(self, system=""):
self.system = system
self.messages = []
if self.system:
self.messages.append({"role" : "system", "content" : system})
def __call__(self, message):
self.messages.append({"role" : "user", "content" : message})
result = self.execute()
self.messages.append({"role" : "assistant", "content" : result})
return result
def execute(self):
completion = client.chat.completions.create(
model = "jabir-400b",
messages = self.messages,
temperature = 0.0
)
return completion.choices[0].message.content
همونطوری که میبینید، این ایجنت میتونه یک تاریخچه از چیزهایی که بهش گفتیم (و بهمون گفته) نگه داره و کم کم باید بریم سراغ این که بهش اکشنهای مورد نظر رو اضافه کنیم.
ولی خب بهتره قبل از اضافه کردن اکشن، تستش کنیم. برای تستش هم این کد رو میتونید اجرا کنید:
sample_agent = Agent("You are a helpful assistant")
print(sample_agent("What is 1+1?"))
کد نمونه با اکشن
اگر دوست دارید بدونید که این ایجنت ما با اکشن چطوری کار میکنه، میتونید به این مخزن گیتهاب مراجعه کنید و ببینید که چطور به راحتی میشه یک اکشن به همین ایجنت ساده اضافه کرد و بار فریمورکها رو هم به دوش نکشید.
جمعبندی
اگر طی دو سه سال گذشته محتوای این بلاگ رو خونده باشید میبینید که علاقه من به هوش مصنوعی از پروژههایی مثل ریاضی ۱ رو با هوش مصنوعی پاس کن یا پلاکخوان فارسی که با Yolo v5 پیاده کرده بودم جدی شد.
این علاقه، کم کم به سمت Generative AI رفت و خب طبیعتا همین علاقه باعث ساختهشدن پلتفرم مانی و همچنین آتلیه شد. اما خب در سال ۲۰۲۵ احتمالا بیش از این که به مدلهای جدید نیاز داشته باشیم، نیاز داریم که مدلها رو به سمت agentic شدن بیاریم و اپلیکیشنها رو به شکل AI agent داشته باشیم.
گنوم، چندسال اخیر رو در حال بهبود تجربه کاربریش روی دستگاههایی مثل گوشیهای همراه و همچنین تبلتهاست. در کل، داره برای یک انقلاب در صفحات لمسی آماده میشه. حالا، یک رابط کاربری جالب به اسم 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 برای شما نصب خواهد شد. پس از نصب، کافیه که اول سرویسش رو فعال و سپس راهاندازی کنیم:
سپس، صفحه قفل (که بالاتر عکسش رو قرار دادم) و بعد از اون، صفحه ورود رمز به شما نمایش داده میشه.
پس از ورود رمز، وارد صفحه منوی اصلی میشیم که از اونجا میتونیم به نرمافزارها و ابزارهای نصب شده روی سیستم دسترسی داشته باشیم:
خب، حالا با خیال راحت میتونیم از Phosh استفاده کنیم و لذت ببریم 😁
نکات مهم
از اونجایی که Phosh نرمافزار نوپا و نسبتا جدیدیه، لازمه چند نکته مهم رو در موردش متذکر بشم:
نسخه خاصی ازش در مخازن دبیان پایدار موجوده که خب برای یک تست دم دستی و ویرچوالباکسی، بهترین گزینه بود (حداقل برای من) و خب قاعدتا روی مخازن تستینگ و ناپایدار هم قرارش دادند. موقع نصب، مراقب باشید تا به ضررتون نشه 😁 ترجیحا نصب رو روی یک ماشین مجازی انجام بدید.
این میزکار خاص، برای صفحات لمسی خیلی بهینه شده و استفاده ازش با ماوس و کیبرد تا حد زیادی سخته. اگر صفحه لمسی دارید که میتونید به سیستمتون وصلش کنید، احتمالا تجربه کاربری بهتری داشته باشید.
بعضی نرمافزارها اندازهشون برای من مشکل داشت (که احتمالا برمیگرده به ویرچوال باکس). اگر در جای دیگری امتحان بشه شاید اندازه صفحه و برنامهها، مناسب باشه.
کدوم توزیعها از Phosh پشتیبانی میکنند؟
این هم سوال مهمیه، تا جایی که دیدم PostmarketOS (که برمبنای آلپاین ساخته شده) و همچنین Mobian (که برپایه دبیانه) از این میزکار (یا بهتر بگم پوسته) پشتیبانی میکنند. در مورد سایر توزیعها/سیستمعاملهایی که ممکنه گنوم رو اجرا کنند، ایدهای ندارم.
جمعبندی
این بلاگ اصلا قرار نبود نوشته شه، ولی امروز از سر خستگی (دقیقا خستگی 😂) جستجو کردم ببینم Phosh چطور میتونه روی دبیان دسکتاپ نصب بشه. امتحانش کردم و به نظرم پروژه تمیز، باحال و آیندهداری اومد. حالا هم تستش کردم و هم یک سری ایده اومد به ذهنم. در آینده، احتمالا بیشتر با Phosh کار کنم و در موردش بنویسم. در آخر هم بابت وقتی که صرف کردید و این مطلب رو خوندید، ازتون تشکر میکنم.
چندی پیش، در مورد پیشنیازهای یادگیری بینایی ماشین در همین وبلاگ نوشته بودم (لینک) و بعد از اون هم در مطلبی در ویرگول، در مورد این که چرا موجودیتی به اسم «جامعه بینایی ماشین» رو راه انداختم (لینک) صحبت کردم. پس از انجام چندین پروژه و تولید چندین محتوا پیرامون این موضوع، امروز در این پست قراره که ایده هایی که شما میتونید در پروژه های بینایی ماشین و پردازش تصویر خودتون به کار بگیرید رو بررسی کنیم.
توجه داشته باشید که در این پست، فرض رو بر این گذاشتیم که شما با هوش مصنوعی، پایتون، بینایی ماشین و … آشنایی لازم و کافی رو دارید و حالا قصد دارید یک پروژه جدی باهاش انجام بدید اما نمیدونید باید چی کار کنید. اگر آشنایی ندارید هم مشکلی نیست، میتونید این مطلب رو صرفا برای ایجاد علاقه و یا رفع کنجکاوی بخونید 😁
ایده های مرتبط با تشخیص چهره
تشخیص چهره، همیشه یکی از پرطرفدارترین شاخههای پردازش تصویر و بینایی ماشین بوده است. چرا که با استفاده از تشخیص چهره، میتوانیم عملیات جالبی انجام دهیم و پروسههای زیادی از یک کار بزرگتر را، خودکار کنیم. همچنین میتوانیم امنیت خانه و محل کار و … را نیز با استفاده از تشخیص چهره تامین کنیم.
در لیست زیر، تعدادی از پروژههای مرتبط با تشخیص چهره رو برای شما فهرست کردهام:
حضور و غیاب مبتنی بر چهره
دوربین امنیتی (به این شکل که وقتی شخص ناشناسی وارد حریم دوربین شد از طریق ایمیل یا SMS و … به شما اطلاع بده)
قفل هوشمند ( به شکلی که اگر شما رو دید در رو باز کنه و در غیر این صورت، یک سیستم مانند دزدگیر یا سیستم امنیت خونه رو راهاندازی کنه)
تشخیص حالت و احساسات چهره
تشخیص خوابآلودگی (مثلا در یک کلاس این پروژه میتونه کاربردی باشه).
همه ایدههای بالا، به سادگی قابل انجام هستند. فقط کافیه که کار با کتابخانهها و تئوری پردازش تصویر رو بلد باشید. شاید دو سه روزه بتونید یکی از این پروژهها رو به ثمر برسونید 😁
ایده های مرتبط با تشخیص کرکتر
تشخیص نوری نویسه یا Optical Character Recognition که به اختصار به اون OCR هم گفته میشه، یکی از شاخههای پرطرفدار دیگر در حوزه بینایی ماشین میتونه به حساب بیاد. پروژههایی که در این حوزه انجام میشن به شدت کاربردی هستند و طبیعیه که در حوزههای مختلفی کاربرد خواهند داشت. در اینجا تعدادی از ایدههایی که میتونید روش کار کنید رو اینجا فهرست کردم:
تشخیص و استخراج شماره پلاک (که پیشتر در موردش نوشتم – لینک)
تشخیص و حل مسائل ریاضی/فیزیک (که این هم پیشتر در مورد نوشتم – لینک)
تشخیص دستخط فارسی
تشخیص خط نستعلیق (و در کل خوشنویسی) فارسی
تشخیص نسخه پزشکی (نکته جالب اینه که در نسخ پزشکی، بسیاری از خطخطیهایی که میبینید در واقع روش مصرف و دوزاژ دارو هستند، که طبق کدگذاری خاصی نوشته میشن).
البته باید این نکته رو هم عرض کنم خدمتتون که دنیای OCR خیلی گستردهست. تقریبا هرجایی که شما با نوشتن سر و کار داشته باشید، میتونید از OCR هم اونجا استفاده کنید. خیلی چیزا اینجا به خلاقیت و نیازهای خودتون برمیگرده. اگر ایده دیگری داشتید، میتونید در بخش نظرات همین مطلب با من به اشتراک بذارید.
ایده های مرتبط با پزشکی
هوش مصنوعی در علم پزشکی، جایگاه خاصی در سالهای اخیر داشته. چرا که همه دانشمندان کامپیوتر و همچنین پزشکی، دریافتند که با استفاده از راهحلهای هوشمند، میتونند به حد قابل توجهی، خطاهای پزشکی رو کاهش بدند. همچنین تحقیقات دارو و واکسن هم به شدت سریعتر میتونن انجام بدند. برای مثال، همین دنیاگیری ویروس کرونا که در سال ۲۰۱۹ آغاز شد و کماکان ادامه داره رو بررسی کنیم، بارها از این که از هوش مصنوعی برای پیدا کردن ترکیبات دارویی موثر بر ویروس استفاده شده، صحبت کردند. همچنین در پروسه ساخت واکسن هم بسیاری از مراحل رو به ماشین سپردند و به هوش ماشینی اعتماد کردند. شاید یکی از دلایلی که واکسن این بیماری انقدر سریع ساخته شد، استفاده از همین راهکارهای هوشمند در تولید بوده.
بینایی ماشین هم استثناء نیست و طبیعتا میتونه خیلی به کمک افراد بیاد. در این بخش، تعداد زیادی از ایدههایی که میتونه به پزشکها در شناخت بهتر مشکلات بیمارهاشون کمک کنه رو فهرست کردم و خب بد نیست اگر شما هم سراغش برید و سعی کنید یکیش رو پیاده کنید (این بخش میتونه برای دانشجویان مهندسی پزشکی و پزشکی؛ بسیار مفید باشه)
تشخیص نوع تومور مغزی (تصویر این بخش، پروژهای که خودم انجام دادم)
تشخیص رتینوپاتی دیابتی در اشخاص مبتلا به دیابت
تشخیص MS و مراحل مختلف اون بر اساس MRI
تشخیص سلولهای سرطانی
تشخیص میزان درگیری ریه در بیماریهای تنفسی (مانند COVID-19)
تشخیص ناهنجاریهای پوستی
تشخیص آسیبهای استخوان
تشخیص آسیبدیدگیها و پوسیدگیهای دندان
طبیعتا اینها، همه کارهایی که میتونیم در حوزه پزشکی با کمک بینایی ماشین و پردازش تصویر انجام بدیم نیستن و این دامنه میتونه به شدت گستردهتر باشه. طبیعیه که گستردگی این دامنه به خلاقیت خودتون و نیازهاتون برمیگرده. همچنین طبیعتا اگر شما دانشجوی مهندسی پزشکی یا رشته پزشکی و رشتههای مرتبط باشید، احتمالا ایدههای بهتری خواهید داشت.
سایر حوزهها
چندین و چند حوزه دیگر هست که خب مثل باقی حوزههای پوشش داده شده در این مطلب، نمیشه ایدههای پروژههای بینایی ماشین و پردازش تصویرشون رو فهرست کرد. به همین خاطر، توضیح اجمالی راجع به هر کدوم میدم تا شما ببینید که کدوم حوزه رو بیشتر دوست خواهید داشت و در کدوم حوزه ممکنه بتونید ایدهپردازی بهتری داشته باشید.
تشخیص حرکت یا Action Detection
این حوزه به طور خاص، میتونه برای کارهایی مثل تشخیص و ترجمه همزمان زبان اشاره (لینک)، تشخیص حرکات ورزشی و یا تشخیص «نیت» افراد بشه. برای مثال، میتونیم سیستمی بسازیم که حرکات بعدی فرد در یک نبرد تن به تن (مثل مسابقه بوکس) رو پیشبینی کنه و به مربیها و نوآموزهای اون رشته اطلاع بده.
خودروهای خودران
خودروهای خودران یا Self-Driving که پیشتر هم ازشون در همین وبلاگ صحبت کرده بودم (لینک) میتونن با استفاده از بینایی ماشین و پردازش تصویر، تابلوهای راهنمایی، رفتار سایر رانندگان، موانع در مسیر و … رو تشخیص بدند. این حوزه البته پیچیدگی زیادی داره اما کار کردن روی بخشهای مختلفش میتونه برای یادگیری جوانب مختلف ماجرا جذاب و جالب و مفید باشه.
مصرف انرژی
حوزه انرژی هم حوزه جالبی میتونه برای پروژههای بینایی ماشین باشه. برای مثال OCR ای که بتونه دیتای کنتور گاز/برق رو به متن تبدیل کنه و اون رو با یک مرکز محاسبه قیمت، چک کنه و قیمت رو به ما اعلام کنه. همچنین میشه عکسهای حرارتی از خانهها و … تهیه کرد و با استفاده از بینایی ماشین دقیقا بررسی کرد که کجاها انرژی بیشتری داره از دست میره و … .
این پروژهها به خودی خود شاید جالب به نظر نرسن اما ترکیبشون با IoT و هوشمندسازی در سطوح دیگر، طبیعتا میتونه جذاب و حتی پولساز هم باشه.
کشاورزی
این هم گفتن نداره، شما کافیه که یک سری عکس هوایی از زمینهای کشاورزی داشته باشید. احتمالا خیلی راحت بتونید سیستمی توسعه بدید که آفات رو شناسایی کنه. همینطور میتونید نوع خاک و … هم از روی این عکسها طبقهبندی کنید و پیشنهاد بدید که چه محصولی در این زمین کشت بشه بهتره. در حوزه مصرف انرژی هم میتونید یکی از پروژهها رو بردارید بیارید اینجا و ازش بهرهبرداری کنید. چی از این بهتر؟
ضمن این که امنیت زمین کشاورزی و گلخانه، بررسی نور و رنگ و … هم میتونن اینجا کاربردی باشند.
جمعبندی مطلب
در این مطلب، ایدههایی که میتونید بعنوان یک پروژه تفریحی یا جدی پیادهسازی کنید رو بررسی کردیم. همچنین این ایدهها، به جز این که میتونن رزومه خوبی برای شما بسازند طبیعتا میتونن پایه یک کسب و کار و یا یک استارتاپ باشند که شانس خوبی برای به پول رسیدن داره. به همین خاطر هم ممنون میشم اگر هر کدوم از این ایدهها رو پیادهسازی کردید در بخش کامنت همین مطلب در موردش بنویسید و به من اطلاع بدید تا ببینم چه کردید.
همچنین لازم به ذکره که اگر دوست دارید مطالب فنی/علمی دیگری از من بخونید، میتونید به ویرگول من هم مراجعه کنید. در پایان هم بابت وقتی که گذاشتید، ازتون تشکر میکنم و امیدوارم در آینده باز هم بتونم در این وبلاگ، مطلب بنویسم.
مدتها پیش، من شروع به نوشتن پیرامون بینایی ماشین و پردازش تصویر کردم (برای مثال، یکی از نتایجی که از این موضوع گرفتم راهاندازی جامعه بینایی ماشین بود) و کم کم تلاشم بر این شد که هوش مصنوعی و یادگیری عمیق و یادگیری ماشین و … هم وارد ماجرا کنم چرا که دونستن 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 منتشر شده و بازنشر و استفاده از محتویاتش کاملا آزاده. فقط توجه لازم داشته باشید که دیتاستی که برای آموزش استفاده شده آزاد نیست و این آزادی در استفاده شامل بخشهایی از این مطلب میشه که مسولیتش با منه (به طور کلی هرچی که شما در این پست خوندید)
سخن آخر
این پست برخلاف پستهای دیگر این وبلاگ به شدت طولانی شد و از بابت این که وقت زیادی برای خوندنش گذاشتید، واقعا از شما متشکرم. در پایان جا داره از شما دعوت کنم که به ویرگول من هم سر بزنید تا اونجا موارد فنی و تجربیات دیگر من رو بخونید. همچنین، اگر این مطلب برای شما مفید بود کافیه که روی تصویر زیر کلیک کنید و من رو به یک فنجان قهوه به انتخاب خودتون مهمان کنید 🙂
دقیقا دو هفته پیش، در نسخه انگلیسی وبلاگ در مورد 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 و از همه مهمتر درگیر شدن با چند مساله و به قولی، دردهای دنیای واقعی. از نتیجه کاملا راضی بودم و هستم، اما فکر نکنم در آینده این پروژه خیلی برام راضیکننده باشه.
احتمالا بعد از مدتی به این پروژه برگردم و بزرگترین مشکلش – یعنی شباهت زیاد ورودیها به هم – رو طور دیگری هندل کنم. برای این که ببینیم یه چیزی در پوزیشن توان یه چیز دیگه قرار گرفته یه چارهای بیاندیشم و … . خلاصه که راه برای بهبودش زیاده و این بهبودها رو شخصا پیگیر هستم که در این پروژه اعمال کنم. شاید هم لازم باشه داده ورودی رو افزایش داد یا حتی مدل مورد استفاده رو عوض کرد.
در نهایت، از شما بابت وقتی که برای خوندن این مطلب گذاشتید، ممنونم. امیدوارم که این مطلب مفید واقع شده باشه و به دردتون خورده باشه. ضمن این که اگر به این تیپ مسائل و مطالب علاقمند هستید، میتونید من رو در ویرگول هم دنبال کنید و اونجا هم مطالبم رو بخونید. اگرچه در ویرگول عمده مطالبم مرتبط با بیزنس، موفقیت و ایناست.
در نهایت از شما خواهش میکنم که اگر این مطلب براتون مفید بود، یک قهوه به انتخاب خودتون مهمانم کنید تا موقع نوشیدن قهوه به یادتون باشم و از این دست مطالب، بیشتر تولید کنم.
در پست پیشین، یعنی قسمت اول داستان برنامهنویس شدنم (لینک) از زمانی که شروع به خوندن کتابهای ویژوال بیسیک کردم تا زمانی که پروژه جبیر رو راه انداختم رو به تفصیل توضیح دادم. فکر میکنم داستان برنامهنویس شدن من، داستان جالبی برای خیلی از دوستانی که وبلاگم رو میخونن بوده و به همین دلیل، تصمیم گرفتم که قسمت دومش هم حتما بنویسم.
همونطوری که در قسمت قبلی قولش رو داده بودم، قراره که در این قسمت از بعد از پروژه جبیر تا زمانی که وارد بازار کار شدم رو توضیح بدم و بگم چی شد که اینطوری شد. در مورد مسیرهای شغلی قبلتر توضیح دادم (مثلا در پست چگونه توزیع لینوکس بسازیم و یا پست چگونه بازیساز شویم) همینطور حتی ابزارها و وسایلی که در مسیر شغلهای مختلف طراحی و تولید کردم (مثل صداگذاری روی بازی کامپیوتری) هم در این وبلاگ پیشتر توضیح دادم. فلذا در این مطلب، اصلا و ابدا به مسیرهای شغلی اشاره نخواهم کرد.
ورود به دانشگاه
در طی این سالها، یعنی از حدود ۹۱ تا ۹۳ راههای زیادی رو رفتم که سرویسها و نرمافزارهای خاصی رو طراحی کنم و خب دروغ چرا، تا حد زیادی هم رویای استیو جابز یا زاکربرگ شدن هم در سر داشتم و خب کارهای مختلفی مثل ایجاد انجمنهای اینترنتی مختلف (ایرانبیاسدی، ایرانهکینتاش و …) گرفته تا برپا کردن شبکههای اجتماعی و نرمافزارهای آنلاین دیگر (اکسوال، نکستکلود و …) رو انجام میدادم. راستش این راهها من رو به قول خارجیها Satisfy نمیکرد و همچنان دنبال این بودم که یک سیستم عامل خوب بسازم!
خلاصه شد سال ۹۲ و ما از شهر بندرعباس به تهران برگشتیم. اون سال، سال پیشدانشگاهی من بود (و بد نیست این داستانکم رو هم پیرامونش بخونید) و اون سال، یک تصمیم بزرگ هم گرفتم. تصمیمم این شد که جبیر به جای این که مبتنی بر اوبونتو (یک توزیع از گنو/لینوکس)، یک نسخه شخصیسازیشده از FreeBSD باشه. از همین رو، شروع کردم به رفتن به IRC های مختلف، سوال پرسیدن و مستندات خوندن. بعد از چندین ماه مطالعه، وضعیت اینترنت خونه و خودم تا حد خوبی پایدار شد و بعد شروع کردم به انجام تغییرات روی کد FreeBSD.
بعد از مدتی، پروژه جبیر تا حد خوبی پیش رفت و گذشت و گذشت و من کنکور دادم (داستانی از کنکور هم اینجا نوشتم) و وقتی نتایج اومد، فهمیدم که در دانشگاه آزاد اسلامی واحد تهران مرکز در رشته مهندسی کامپیوتر و گرایش سختافزار قبول شدم.
شرکت در لاگها و رویدادها و آخر و عاقبت پروژه جبیر
حضور در تهران و دانشجو شدن، به من کمک کرد که وارد جامعه بشم و در رویدادهای نرمافزار آزاد و متنباز و سایر رویدادها (مثل PyCon و …) شرکت کنم. اولین رویدادی که شرکت کردم، رویدادی بود به اسم «جامعه رایانش ابری آزاد». در اون رویداد با KVM و Docker آشنا شدم و تا حد زیادی هم دانشم در زمینه Containerها و مجازیسازی تا حد خوبی بالا رفت.
در حاشیه شرکت در این رویدادها، بسیاری از افرادی که از انجمن اوبونتو و یا تکنوتاکس یا لینوکسریویو میشناختم رو حضوری دیدم و باهاشون آشنا شدم و حتی رفاقتهایی شکل گرفت. پس از مدتی، در بحثی دوستانه، تصمیم بر آن شد که پروژه جبیر کلا منحل بشه و پروژهای به این بزرگی که نیازمند دانش فنی بالا، پول زیاد و همچنین حوصله فراوونه، به زمانی موکول شه که بتونم از پس حداقل یک موردش بربیام. فلذا پروژه جبیر اعلام شد که دیگه قرار نیست ادامه پیدا کنه.
اگر دوست دارید ببینید که پروژه جبیر چه شکلی بوده، میتونید این لینک مربوط به وب آرکایو رو هم ببینید: لینک. در ادامه، بنا به دلایلی (که در ادامه این مطلب بهش میپردازیم) تصمیم شد که پروژه جبیر بیشتر روی فاز سختافزاری باشه و چند مطلب هم در موردش حتی نوشتم(لینک).
یادگیری روبی، ورود به حوزه سختافزار و دیگر هیچ!
مهرماه ۹۳ بود که من خیلی جدی تصمیم گرفتم حداقل یک زبان برای توسعه وب رو جدی یاد بگیرم. قبلترش، کتاب «از این پس پایتون» رو خونده بودم و به همین خاطر هم کمی با پایتون و فلسک آشنا بودم. دوستی یک کتاب جنگو هم برای من ارسال کرد. اما در همون هنگام در بحثی در IRC که دقیق یادم نیست مربوط به occc بود یا لاگ کرج، دوستی به من پیشنهاد کرد که روبی و روبیآنریلز رو یاد بگیرم. در ادامهش، توصیه کرد که حتما با دیتابیسها آشنا شم و کمی هم مهندسی نرمافزار یاد بگیرم.
من هم این توصیه رو عملی کردم و شروع کردم به خوندن روبی. شاید باورتون نشه ولی از اونجایی که دیدم زبون روبی، خیلی در ایران زبون روتینی نیست و خیلیها باهاش غریبهند، تصمیم گرفتم دانش خودم رو در قالب یک کتاب الکترونیکی دربیارم و خب نتیجه پس از مدت نسبتا طولانی شد کتاب آموزش روبی که به رایگان قابل دانلوده.
خب همونطوری که ابتدای متن گفتم، من گرایش سختافزار بودم و حقیقتا این وسط به سرم زده بود دانش سختافزاری خودم رو هم بالا ببرم. به همین خاطر ترم ۳ یا ۴ که بودم، قبل از این که به مدار منطقی برسم، خودخوان شروعش کردم. برام جالب بود و خب در عین حال ریاضیات گسسته هم برای من داشت مرور میشد. این مرور، در کنار دانش مدار منطقی من رو وادار کرد که کمی بیشتر بخوام در این حوزه ورود کنم. به همین خاطر، معماری کامپیوتر و ریزپردازنده رو هم حتی پیش از این که درسم بهشون برسه، مطالعه کردم.
وقتی به نتایج جالبی رسیدم، تصمیم گرفتم دوباره دانشم رو با مردم به اشتراک بذارم. به همین خاطر، این بار هم محتوا رو به زبون انگلیسی تولید کردم (لینک) و به رایگان در نسخه انگلیسی همین وبلاگ منتشرش کردم. خلاصه که اینجا تموم نمیشه. در اون سالها، بازار «اینترنت چیزها» یا IoT هم داغ بود و خب طبیعتا شروع کردم به یادگیری آردوینو، رزبریپای و … و پروژههای جالبی هم با اونها انجام دادم. البته خیلی از این پروژهها رو هنوز که هنوزه عمومی نکردم.
خلاصه این مورد هم گذشت و رسیدیم به شهریور ۹۶. یعنی جایی که من خیلی جدی و رسمی وارد بازار کار شدم.
ورود به بازار کار
در تیرماه ۹۶، در رویدادی شرکت کردیم که مرتبط با فعالان صنعت بازی رایانهای بود. این رویداد، به طور خاص به آهنگسازان و مهندسین صدا اختصاص داشت و خب بخاطر علاقه شخصیم به موسیقی، در این رویداد شرکت کردم. آخر رویداد گپ و گفتی با سخنران رویداد داشتم که باعث شد شخصی بیاد خودش رو معرفی کنه و بگه که تیمشون نیاز به آهنگساز داره. پس از مدتی، مدیر استودیو به من پیام داد و گفت بازیای در ژانر کودکه و خب نمیدونم چی شد که اون موقع، این بحث ادامه پیدا نکرد.
اما شهریور ۹۶ یکی از دوستانی که در همون استودیو مشغول بود، برای یک بازی دیگر من رو دعوت کرد به همکاری. یک مصاحبه ریزی داشتیم و پس از اون مصاحبه، قرار شد من برم و همکاری کنم. پس از این ماجرا، من رسما وارد اکوسیستم و بازار کار شدم تا به امروز.
سخن آخر
خب، در این مطلب هم مثل مطلب قبلی حجم خوبی از خاطرات من رو شاهد بودید. کل حرفی که میخواستم بزنم این بود که دوستان، از تجربه کردن و حتی شاخه شاخه پریدن؛ نترسید. این پرشها به خودی خود باعث میشن که شما در کارتون – حتی کارهای فریلنسری و پروژهای – به شدت موفقتر عمل کنید. یادتون باشه که زندگی، فانتر از اونیه که بخواید با زیادی جدی گرفتن؛ خرابش کنید.
مدتی میشه که در جامعه بینایی ماشین، دارم به صورت خیلی جدی در مورد بیناییماشین و ملزوماتش، تولید محتوا میکنم. از همین رو، تصمیم گرفتم که در قالب این پست وبلاگی، در مورد این که بینایی ماشین چیه و کجا کاربرد داره و چرا باید بلدش باشیم و از کجا باید شروع کنیم؛ بنویسم.
این مطلب، اصلا و ابدا قرار نیست «آموزش» باشه و همونطوری که ابتدای مطلب گفتم، صرفا «نقشه راه» برای شماست.
بینایی ماشین چیه؟
بینایی ماشین در واقع یکی از شاخههای علوم کامپیوتر محسوب میشه که هدفش، اینه که پردازش و درک تصاویر دیجیتال رو سادهتر کنه. بینایی ماشین در ترکیب با هوش مصنوعی، رباتیکز و سایر شاخههای مرتبط با علوم و یا مهندسی کامپیوتر، میتونه به بهبود زندگی افراد کمک شایستهای کنه.
شاخههای زیادی برای بینایی ماشین داریم اعم از تشخیص چهره، تشخیص متن، خواندن نویسههای نوری (OCR)، واقعیت افزوده، واقعیت مجازی و … . هرکدوم از این شاخهها، تخصصهای خاص خودش رو میطلبه که در ادامه مطالب بهش خواهیم پرداخت.
کجا کاربرد داره؟
کاربردهای بینایی ماشین، میتونه در بسیاری از جاها باشه. نمونهش مثلا همین پروژهای که من زده بودم:
همونطور که میبینید، این پروژه برای اندازهگیری اشیاء مختلف با کمک بینایی ماشین ساخته شده بود. همچنین، یک پروژه دیگر این بود که حروف اشاره (که مورد استفاده ناشنوایانه) رو تشخیص میداد. در دنیای امروز تقریبا در هر جایی که کوچکترین استفادهای از تصویر میشه، مثل ویرایش و ساخت تصویر؛ تشخیص اقلام درون تصویر و …؛ بینایی ماشین داره در ابعاد وسیعی استفاده میشه.
چرا باید بلدش باشیم؟
بایدی وجود نداره. یادگیریش به عنوان یک مهارت، کاملا میتونه شما رو به یک پروژه خفن، کار یا پول نزدیک کنه. حتی اگر قصد ندارید در این زمینه کار کنید هم میتونید با یادگیری بینایی ماشین به سادگی برای خودتون یک تفریح سالم بسازید.
از کجا شروع کنیم؟
خب مهمترین بخش این مطلب دقیقا همینجاست که قراره با هم یاد بگیریم که چه پیشنیازهایی برای یادگیری بینایی ماشین وجود داره. هر پیشنیاز رو با هم کمی بررسی خواهیم کرد 🙂
برنامهنویسی پایتون: از اونجایی که پایتون زبان سادهایه و اکثر آدمها دنبال یادگیریشن (و این یعنی منابع آموزشی خیلی خوبی براش هست) بهتره که پایتون رو تا حد خوبی یاد بگیرید. حد خوب، یعنی حدی که شما بتونید یک نرمافزار ساده ولی کاربردی رو باهاش توسعه بدید (مثلا یه ماشین حساب یا چیزی مشابه اون).
مقدمات یادگیری ماشین: بینایی ماشین به شکلی یکی از زیرمجموعههای هوش مصنوعی محسوب میشه. این نشون میده که اگر شما به الگوریتمها و تئوری یادگیری ماشین و … آشناییت کافی داشته باشید، میتونید در این فیلد هم پیشرفت قابل توجهی کنید. گذشته از این، یادگیری ماشین میتونه بهتون در «هوشمندسازی» بیشتر نرمافزارهای بینایی ماشین کمک کنه.
آشنایی مختصر با جاوا یا سی++: از اونجایی که پایتون یک زبان مفسری محسوب میشه، ممکنه خیلیجاها (مثلا در یک برد آردوینو) نتونیم مستقیم ازش استفاده کنیم و همچنین استفاده ازش پیچیدگی خاصی به همراه داشته باشه؛ بهتره یک زبان سطح پایینتر مثل سی++ هم کمی آشنا باشیم. همچنین اگر قصد این رو دارید که اپلیکیشن تلفن همراه بنویسید که از بینایی ماشین استفاده میکنه، بد نیست دستی هم در جاوا داشته باشید.
آشنایی با سختافزارها و سیستمهای نهفته (Embedded Systems): یکی از کاربردهای عظیم بینایی ماشین، فعالیتهای Surveillance میتونه باشه (البته این که این فعالیتها بد یا خوب هستند بحث جداییه). یکی از نمونههاش میتونه «سیستم حضور و غیاب با تشخیص چهره» باشه، یا حتی «دفترچه تلفن هوشمند» و … 🙂 به همین دلیل، بد نیست که کمی با سیستمهای نهفته و سختافزارهایی مثل Jetson Nano و Raspberry Pi آشنایی داشته باشید.
آشنایی با لینوکس: این واقعا نیاز به توضیح خاصی نداره، روایت داریم اگر لینوکس بلد نیستی، برنامهنویس نیستی 🙄
لیست بالا به شما کمک میکنه که محکمتر در زمینه بینایی ماشین، قدم بردارید. هرجاش رو که بلد نباشید میتونید با جستجو پیداش کنید و یاد بگیرید و از یادگیری، لذت ببرید 🙂
سخن آخر
از این که وقت گذاشتید و این مطلب رو خوندید ممنونم. در آینده، در قالب پستهای وبلاگ در مورد پروژههای بینایی ماشین و سایر پروژههای باحال، صحبت خواهم کرد. امیدوارم که این مطلب مفید فایده واقع شده باشه و وقتی که براش گذاشتید ارزشش رو داشته باشه.
خیلی از افرادی که این روزها، میخوان پروژههایی در حوزههای مختلف هوش مصنوعی مثل یادگیری ماشین، یادگیری عمیق، علوم داده و … انجام بدن یک گلوگاه بسیار بزرگ دارند و اون «داده» است. خیلیها واقعا نمیدونن از کجا میتونن دادههای مناسب پروژههاشون به دست بیارن. در این مطلب، قراره که این موضوع رو پوشش بدم.
منابع مناسب داده برای پروژههای شما
در این بخش، با هم چندین منبع مناسب برای پیدا کردن داده رو بررسی خواهیم کرد. فقط قبل از هرچیز این رو بگم که این منابع میتونن تغییر کنن در طول زمان پس هرچه که در این مطلب بیان شده رو در مرداد ۱۴۰۰ معتبر بدونید و اگر مدتی بعد از انتشار این مطلب دارید مطالعهش میکنید، با جستوجو و پرسوجو در مورد این منابع، اطلاعات بهروزتر دریافت کنید.
Kaggle
وبسایت کگل، یک محیط تقریبا مشابه شبکههای اجتماعی برای دانشمندان داده و متخصصین هوش مصنوعی به حساب میاد. در این وبسایت شما میتونید مجموعه داده (Dataset) های خوبی رو پیدا کنید. همچنین، میتونید کارهایی که ملت روی اون دادهها انجام دادن رو در قالب Kaggle Kernel (به نوعی همون جوپیتر نوتبوک خودمون) ببینید و یا کارهای خودتون هم به اشتراک بذارید.
برای دسترسی به کگل، میتونید روی این لینک کلیک کنید.
Academic Torrents
این وبسایت هم وبسایت جالبیه (و به نوعی مرتبط با بخش بعدی). در واقع هر حرکت آکادمیکی که زده شده و اطلاعاتش هم همزمان منتشر کردند رو در خودش داره. چرا؟ چون جست و جو در محتوای آکادمیک نسبتا سخته و این وبسایت اون کار رو براتون راحت کرده. همچنین یک بخش خوبی برای مجموعهداده (لینک) هم در این وبسایت در نظر گرفته شده.
برای دسترسی به این وبسایت، میتونید از طریق این لینک اقدام کنید.
وبسایت دانشگاهها
همونطوری که در بخش قبلی گفتم، بسیاری از دانشگاهها (و در کل، فضاهای آکادمیک) تحقیقات زیادی انجام میدن و دادههای اون تحقیقات رو هم معمولا منتشر میکنن. چرا که یکی از اصول مطالعات آماری، اینه که دادهها به صورت شفاف منتشر بشن (شاید دلیلش اینه که بعدها، یکی بخواد خودش اون آزمایش و مطالعه رو تکرار کنه و …).
به همین خاطر، وبسایت دانشگاهها – چه ایرانی و چه خارجی – میتونه محل خوبی باشه برای مراجعه و پیدا کردن دادههای خوب برای مطالعه.
دیتاستهای متنباز شرکتها
بسیاری از شرکتهای بزرگ مثل گوگل، فیسبوک، آمازون و …، میان و حجم خوبی از دادههایی که قبلتر در تحقیقاتشون استفاده کردند رو به صورت اوپنسورس، منتشر میکنن. پیدا کردن این دیتاستها هم اصلا کار سختی نیست.
برای مثال، در این لینک میتونید دیتاستهای گوگل رو ببینید. یکی از نمونههایی که خود گوگل اینجا مطرح کرده، دیتاست مرتبط با بیماری کووید-۱۹ است. (لینک)
چرا این شرکتها، دیتاستها رو منتشر میکنن؟ باز هم میگم دقیقا به همون دلیلی که دانشگاهها منتشر میکنن. شاید افراد یا سازمانهایی باشن که بخوان تحقیقات و مطالعات رو برای خودشون تکرار کنند و یا نتیجه آزمایشات و … رو صحتسنجی کنند.
خزیدن (Crawling) صفحات وب
خب، بعضی وقتا هم دادهای که ما نیاز داریم، توسط شرکتها یا دانشگاهها منتشر نشده. پس در این حالت چه کار میکنیم؟ اگر داده مورد نظر، در اینترنت موجود باشه، میتونیم یک خزنده (Crawler) بسازیم و با اون کارمون رو پیش ببریم.
در بسیاری از زبانهای برنامهنویسی و چارچوبهاشون، ابزارهای بسیار خوبی برای کراول کردن صفحات وب وجود داره. یکی از بهترین نمونههاش میتونه BeautifulSoup در پایتون باشه. در مطالب بعدی، احتمالا با استفاده از این ابزار، یک خزنده برای وبسایتهای مختلف خواهیم نوشت.
دوربین، میکروفن، حرکت!
اگر دادههای مورد نیاز ما حتی به شکلی که بتونیم کراول کنیم موجود نبود چی؟ سادهست. ابزارهای ورودی خوبی برای کامپیوتر وجود داره که میتونه بهمون کمک کنه تا داده مورد نظر رو جمعآوری کنید.
گذشته از این، دوربین تلفنهای همراه، میتونه منبع خوبی باشه برای جمع آوری تصاویر(پروژههای بینایی ماشین و …)، میکروفنهای استودیویی برای دریافت صدا خوبن. اگر نیاز به دیتایی مثل گرما یا رطوبت نیاز دارید، طراحی مداری که این داده رو از محیط بخونه و روی دیتابیس خاصی ذخیره کنه کار سختی نیست.
جمعبندی
پروژههای هوش مصنوعی به ذات سخت نیستند. چیزی که اونها رو سخت میکنه، همین دیتای ورودی و تمیزکاری و مرتب کردنشه. بعضی وقتا دادههای ما کم هستند و ما مجبور خواهیم شد که Data augmentation انجام بدیم. بعضی وقتا ممکنه نویز به قدری زیاد باشه که اصلا مرحله جمعآوری دیتا رو مجبور بشیم دوباره از نو انجام بدیم و … .
خلاصه هدف از این مطلب این بود که اگر پا در این عرصه گذاشتید، بدونید همیشه جایی هست که بتونید بدون مشکل، دادههایی رو دریافت و در پروژهتون استفاده کنید و از بابت نویز و …، خیالتون تا حد خوبی راحت باشه.
وبلاگ شخصی محمدرضا حقیری، برنامهنویس، گیک و یک شخص خوشحال