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

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

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

مصاحبه با محمدرضا حقیری، مهندس هوش مصنوعی

ما با محمدرضا حقیری، توسعه‌دهنده‌ای از ایران که هم‌اکنون مشغول کار بر روی یک مدل متن به تصویر متن‌باز به نام مانی است، صحبت کردیم.

او دانشش درباره فناوری‌هایی که برای توسعه این مدل استفاده کرده را با ما به اشتراک گذاشته است. هوش مصنوعی چندمدلی او، از Stable Diffusion و Dream Booth استفاده می‌کند.

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

لطفا خودت رو برای خوانندگان ما معرفی کن. چه کارهایی کردی که به اینجا رسیدی؟ و چطور؟

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

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

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

در حال حاضر روی مدل متن به تصویری به اسم Mann-E کار می‌کنی. می‌تونی یکم در موردش توضیح بدی و بگی چطور کار می‌کنه؟

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

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

اگر دوست دارید بدونید چطور می‌تونید از مانی استفاده کنید، می‌تونید به گیتهاب من مراجعه کنید. یک دفترچه یادداشت جوپیتر اونجا هست که می‌تونه به Google Colab وارد بشه. حجم زیادی از کد هم از دید کاربر مخفی شده که حسی مشابه Midjourney یا Dall-E داشته باشه.

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

این چیزیه که من بهش میگم «سوال مورد علاقه‌م». می‌تونم ساعت‌ها در مورد فناوری‌هایی که استفاده کردم، صحبت کنم. اول بذارید یک تاریخچه‌ای براتون بگم. وقتی اکثر تولیدکنندگان تصویر خوب «آزاد» نبودند (در مصاحبه گفتم free و ظاهرا یادم رفته مشخص کنم free as in freedom) تنها پایه و مبنای خوب برای یک تولیدکننده اثر هنری با کمک هوش مصنوعی VQGAN بود. یادمه که اگر نتایجش رو با CLIP ترکیب می‌کردی می‌تونست نتایج خوبی ارائه بده. در واقع این یک بازی انکودر-دیکودر بین دوتا مدل هوش مصنوعی بود.

ولی به قدر کافی خوشحال‌کننده نبود، مخصوصا این که midjourney در همون نسخه‌ها هم تصاویری تولید می‌کرد که انگار همین الان از ذهن یک هنرمند چیره‌دست بیرون آمده. پس من چه کردم؟ شخصا به این فکر بودم که چه اتفاقی می‌افتاد اگر یک نسخه متن‌باز از Midjourney داشتیم؟ و همزمان افرادی در شرکت Stability AI هم فکر مشابهی داشتند. وقتی انتشار Sable Diffusion رو اعلام کردند، من واقعا خوشحال شده بودم. کانسپت رو واقعا دوست داشتم با خودم گفتم که این به درد پروژه من هم میخوره! اینجا دقیقا جایی بود که من رفتم هرچی مقاله و تحقیق در مورد Stable Diffusion بود رو خوندم. این برای من یک دنیا ارزش داشت، چون بالاخره یک مدل تولید تصویر بسیار خوب داشت منتشر می‌شد.

این Stable Diffusion فناوری ابتدایی من بود. بی‌نهایت دوستش داشتم. همیشه تلاش می‌کردم بهترین نتایج رو ازش بگیرم. از prompt engineering صرف بگیر تا نوشتن کد‌هایی که بتونه برای من نتایج بهتری ازش بگیره. در ماه‌هایی که از انتشار نسخه اولیه‌ش گذشت، دو تا اتفاق خیلی بزرگ افتاد. اول این که Dream Booth برای Stable Diffusion ریلیز شد ( و صادقانه بخوام بگم، فاین تیون کردن Stable Diffusion رو به شدت ساده کرده) و همزمان RunwayML هم ورژن ۱.۵ از Stable Diffusion رو منتشر کرد. من مواد اولیه اصلی برای ساخت Midjourney متن‌باز رو داشتم!

بخوام خلاصه بگم: هسته اصلی Stable Diffusion ئه، از چک‌پوینت‌های نسخه ۱.۵ ای که runwayml ساخته استفاده کردم و تیون/ترین کردن با Dream Booth انجام شده. اینا Mann-E رو ممکن کردند. همچنین زبان‌های مورد استفاده هم باید بگم که عمدتا از پایتون استفاده کردم و کمی هم کد روبی برای توسعه وب نوشتم. و این تمام چیزیه که من استفاده کردم.

چه تفاوتی با Dall-E, Open Journey و باقی مدل‌ها داره؟

این سوال سختیه، بخصوص که در طول سال گذشته هزاران مدل با تکنیک‌های Textual Inversion و Dream Booth منتشر شدند. ولی اگر بخوام خلاصه بگم که چه فرقی با Dall-E داره، باید بگم که مانی به اون اندازه گرون نیست. برای استفاده از مانی، فقط کافیه که Google Colab رو راه‌ بندازید، نوت‌بوک رو واردش کنید و تمام! می‌تونید بی‌نهایت تصویر باهاش بسازید. این رو با Dall-E مقایسه کنید که به شما ۵۰ تا تصویر رایگان می‌ده و بعدش باید هزینه پرداخت کنید (که البته به نظرم مدل درآمدی بدی نیست).

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

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

روی مدلی به نام Open Journey کار می‌کردی ولی اسمشو عوض کردی. می‌تونی کمی در موردش بگی؟

مانی اول کار، اسم مدل نبود؛ بلکه اسم استارتاپی بود که در تابستان ۲۰۲۲ برای همین کار راه انداخته بودم. اسم مدل Open Journey بود که اشاره به Open Source Midjourney داشت. بعدا، فهمیدم که یک نفر از تیم میدجرنی از تیم prompthero خواسته که اسم مدلشون (که فکر کنم چیزی مثل midjourney-v4-style-stable-diffusion یا چنین چیزی بود) رو عوض کنند و اون‌ها (یعنی prompthero) هم اسم مدل رو به OpenJourney تغییر دادند. من ازشون درخواست کردم که اسم مدل رو عوض کنند ولی از اونجایی که ترجیحم این بود که اون استارتاپ رو در اون برهه زمانی متوقف کنم، اسم مدل رو به مانی تغییر دادم.

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

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

باور دارم که هوش مصنوعی آینده‌ست. برخلاف چیزی که سال ۲۰۲۱ اومد و یه فازی ساخت و رفت (و بله، منظورم متاورس زاکربرگه). هوش مصنوعی واقعی و آینده‌داره. من دارم به چشم می‌بینم که افراد زیادی از این ابزارها برای تولید پست‌های بلاگ، کپی‌رایتینگ، تولید شعار برای شرکت و استارتاپ، تولید آیکون و تصویر شاخص و حتی تولید کد استفاده می‌کنند. این خیلیه، بخصوص با وجود ابزارهایی مثل GPT-3 یا ChatGPT حتی می‌تونه رایج‌تر هم بشه. از طرف دیگر قضیه هم که بخواهیم نگاه کنیم، ابزارهای متن‌بازی مثل BLOOM, BLOOMZ, Flan-T5, GPT-Neo و … رو داریم. افراد می‌تونند این مدل‌ها و API رو متناسب با نیازهای خودشون، تغییر بدند.

و باور دارم که ابزارهای هوش مصنوعی ما را به جهانی هل می‌دهند که مردم در آن هوشمندانه‌تر کار می‌کنند، نه سخت‌تر. می‌دونی، تو می‌تونی شونزده ساعت از بیست و چهار ساعت شبانه روز رو صرف توسعه یه کمپوننت تو پروژه ری‌اکتیت کنی، درسته؟ این خیلی خوبه که شغلت و کاری که می‌کنی رو دوست داره ولی حدس من اینه که این ماجرا برای کارفرما یا سرمایه‌گذار هیچ اهمیتی نداره، بخصوص وقتی می‌فهمن که با ۱۶ دقیقه prompt engineering می‌تونستی همون نتیجه رو از GPT-3 با کمی ویرایش کد بگیری. برای من، این یک دنیای بهتره.

در پایان هم از تو، الکساندر؛ تشکر می‌کنم که اومدی سراغم.

سخن آخر

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

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

Share

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

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

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

تاریخچه مانی

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

اون موقع، ابزاری به اسم 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

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

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

یک سری شوخی اینجا شد، اما بعد از مدتی بحث و بررسی در فروم با تعدادی از دوستان – که همگی از نظرم نوجوانان و جوانان باهوش و مستعدی هستند – تصمیم بر این شد که پروژه جبیر (+،+ و +) رو احیاء کنم. البته انتظار برخورد جالبی از سمت مدیریت نداشتم (با توجه به این تجربه) ولی خب اول قضیه، کار نسبتا خوب پیش رفت. کلی بحث و بررسی سر معماری ARM شد، در مورد x86 شد، حتی در مورد دیزاین وبسایت، لوگو و … شد. در نتیجه چه اتفاقی افتاد؟ این که من وبسایت پروژه جبیر رو احیا کردم 🙂 خیلی جدی هم در مورد محصولات مبتنی بر نرم‌افزار آزادی که می‌خواستم در این پروژه داشته باشم بحث شد، عمده بحث هم همین نوجوانانی که ازشون صحبت به میان میاد، پیش می‌بردند و من عملا نظاره‌گر بودم.

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

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

و حالا من پست مرتبط با «قوانین و خط مشی» انجمن اوبونتو رو بررسی کردم، تنها دو بند هستند که به «پروژه» اشاره دارند و هیچ کدام به طور خاص، به پروژه جبیر اشاره نکردند.

اولین بند اینه:

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

و البته دومیش این:

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

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

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

Share

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

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

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

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

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

Share

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

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

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

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

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

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

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

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

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

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

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

sudo apt install phosh-core

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

sudo apt install phosh-tablet

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

sudo apt install phosh-full

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

sudo systemctl enable phosh
sudo systemctl start phosh

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

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

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

نکات مهم

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

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

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

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

جمع‌بندی

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

Share

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Share

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

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

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

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

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

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

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

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

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

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

مقیاس‌پذیری

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

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

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

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

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

جمع‌بندی

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

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

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

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

داستان پروژه جبیر – استیو جابز نه، خود خودم (قسمت آخر)

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

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

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

بعد از اون، از انتشار جبیر و اشتباهاتی که در ساخت این پروژه شد نوشتم. بعد از این موضوع، وارد بحث نسخه ۴ که نسخه جنجالی جبیر بود شدیم (نسخه‌ای که به اینترنت متصل نمی‌شد، به همراه نظر جادی و تبعاتش) و بعد از اون چه شد که به سراغ BSD رفتیم و همین موضوع هم مزید بر علت شد که جبیر روز به روز به پایان خودش، نزدیک‌تر بشه.

جشنواره خوارزمی

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

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

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

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

اما این تمام ماجرا نبود …

محمدرضا حقیری (چپ) و رضا باقرزاده (راست) - توسعه‌دهندگان پروژه جبیر

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

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

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

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

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

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

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

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

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

جشنواره خوارزمی کشوری

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

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

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

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

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

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

رفتن روی BSD، بزرگترین اشتباه

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

یکی از مهم‌ترین دلایل، اینه که BSDها معمولا ساپورت سخت‌افزاریشون اونقدری که باید و شاید، خوب نیست. دلیل دیگری که به ذهنم می‌رسه اینه که استفاده از BSDها به شدت محدوده و بین هزاران شرکت و استارتاپی که مبتنی بر لینوکس هستند، شاید فقط Netflix, WhatsApp و Sony باشند که از FreeBSD (یا نسخه‌های دیگر BSDها) استفاده کنند. همین امر، باعث شده که BSDها مستندات کمتر و جوامع کوچکتری داشته باشند.

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

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

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

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

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

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

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

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

سخن آخر

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

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

از نظر فنی هم، درس‌های خوبی گرفتم. برای مثال اندازه افرادی که LPIC 1, 2 می‌گذرونند از لینوکس یاد گرفتم. تا حد خوبی پایتون یاد گرفتم. حتی همین امر باعث شد که بعدتر، روبی یاد بگیرم و … . همچنین یاد گرفتم که نیاز نیست برای متفاوت بودن حتما به سمت BSD رفت بلکه یک رابط کاربری متفاوت هم می‌تونه به خودی خود، تا حد خوبی تاثیر مثبت روی ذهن افراد داشته باشه.

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

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

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

Share