<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های هادی عبدی خجسته | Hadi Abdi Khojasteh</title>
        <link>https://virgool.io/feed/@hadiakhojasteh</link>
        <description>معمار نرم افزار، پژوهشگر یادگیری ماشین، زبان و بینایی کامپیوتر، عاشق سفر و خلق تجربیات جدید</description>
        <language>fa</language>
        <pubDate>2026-04-15 02:08:34</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/7843/avatar/yZFMkQ.png?height=120&amp;width=120</url>
            <title>هادی عبدی خجسته | Hadi Abdi Khojasteh</title>
            <link>https://virgool.io/@hadiakhojasteh</link>
        </image>

                    <item>
                <title>واکسن کرونای فایزر چطور کار می‌کند؟</title>
                <link>https://virgool.io/@hadiakhojasteh/how-biontechpfizer-sars-cov-2-vaccine-works-eiknrq5pjiua</link>
                <description>در این نوشتار می‌خواهیم کد برنامه واکسن mRNA ویروس SARS-CoV-2، تولید BioNTech/Pfizer را حرف‌به‌حرف بشکافیم و از دیدگاه یک نفر که با سازوکارِ کامپیوتر آشنایی دارد، چگونگی عملکرد آن را بررسی کنیم. این ادّعا ممکن است کمی عجیب و غریب به‌نظر برسد! بالاخره واکسن مایعی است که به بازوی ما تزریق می‌شود، چطور ممکن است که در مورد کدِ‌منبعِ آن صحبت کرد؟این سوال خوبی است، بگذارید با قسمت کوچکی از کدِ منبعِ واکسنِ BioNTech/Pfizer یا همان BNT162b2 یا Tozinameran یا Comirnaty شروع کنیم.۵۰۰ کاراکتر از کدِ منبعِ BNT162b2 mRNA برگرفته از سازمان جهانی بهداشت در قلب واکسن BNT162b2 mRNA این کد دیجیتال وجود دارد. این کد ۴۲۸۴ کاراکتر طول دارد و درنتیجه در تعدادی توییت هم می‌گنجد. در مراحلِ اوّلیه‌ی تولیدِ واکسن، یک‌نفر این کد را با یک چاپگر DNA (بله، چنین دستگاهی وجود دارد) از بایت‌های روی دیسک به مولکول‌های واقعی‌ِ DNA تبدیل کرده‌است.یک دستگاه چاپگر دی‌ان‌ایخروجی چنین دستگاهی، مقدار بسیار کمی DNA است که بعد از کلّی فرآیندِ شیمیایی و بیولوژیکی در نهایت تبدیل به RNA  (جلوتر، بیشتر در این مورد صحبت می‌کنیم) در واکسنِ ما می‌شود. یک دوز ۳۰ میکروگرمی، در واقع ۳۰ میکروگرم RNA دارد. علاوه بر آن، یک بسته‌بندیِ هوشمندانه‌ی لیپیدی (چربی) در واکسن، باعث ورود این mRNA به سلول‌های می‌شود.یک RNA یک نسخه‌ی ناپایدار و در واقع نسخه‌ای از DNA در حافظه‌ی موقّت سلول است. DNA معادل فلش‌درایو در بیولوژی است. DNA مانایی زیادی دارد و با مکانیزم‌های مختلفی ساختار پایدار و قابل اعتمادی را حفظ می‌کند. با این‌حال، همان‌طور که کامپیوترها برنامه‌ها را مستقیم از روی فلش‌درایو اجرا نمی‌کنند و قبل از اجرا، آن‌ها را به یک محیط سریع‌تر و منعطف‌تر کپی می‌کنند و از آن‌جا برنامه را اجرا می‌کنند، DNA هم به‌طور مستقیم عامل انفعالات منجر به تغییر نیست.برای کامپیوترها، آن محیط سریع‌تر و انعطاف‌پذیرتر، حافظه‌ی RAM است، برای بیولوژی RNA. شباهت‌های این دو چشمگیر است. برخلافِ فلش‌درایو، در صورت عدم مراقبت و رسیدگی دایم، محتویاتِ حافظه‌ی RAM به سرعت از بین می‌روند. علّت این‌که واکسن mRNA ساخت Pfizer/BioNTech هم نیاز به محیط بسیار خنک برای نگهداری دارد هم همین است، RNA گُلِ بسیار حساسی است.هر کاراکتر در RNA حدود ۰.۵۳x۱۰-۲۳ گرم وزن دارد، یعنی در یک دوز تکّیِ ۳۰ میکروگرمی واکسن ۶x۱۰۱۶ کاراکتر وجود دارد. در فرمتِ بایتی، این حدود ۲۵ پتابایت اطلاعات است. البته لازم به یادآوری است که در واقع معادل ۲۰۰ میلیارد تکرار یک ترکیب از ۴۲۸۴ کاراکتر است. محتویاتِ اصلیِ واکسن کمی بیشتر از یک کیلوبایت هستند. خود SARS-CoV-2 حدود ۷.۵ کیلوبایت حجم دارد.یک پیش‌زمینه‌ی خیلی خلاصه:مولکول DNA یک کد دیجیتال است. بر خلاف کامپیوترها که از ۰ و ۱ استفاده می‌کنند، ماشینِ زندگی، از A، C، G و U/T برای ساخت نوکلئوتید و نوکلئوزید یا بازها استفاده می‌کند.در کامپیوترها، ما ۰ و ۱ را به عنوان علامت حضور یا غیابِ یک بار، جریان الکتریکی، تغییر جهت آهن‌ربایی یا ولتاژ یا مدولاسیونِ یک سیگنال یا تغییر وضعیت انعکاس نور در نظر می‌گیریم. یعنی ۰ و ۱، مفاهیم انتزاعی‌ای نیستند که وجود خارجی نداشته‌باشند، آن‌ها در الکترون‌ها یا گونه‌های دیگری از مادّیات، نمود فیزیکی دارند.در طبیعت، A، C، G و U/T مولکولهایی هستند که به‌صورتِ زنجیروار در DNA یا RNA ذخیره‌شده‌اند.در کامپیوترها، ما ۸ بیت را یک بایت می‌گیریم و بایت واحد رایج پردازش داده توسط کامپیوتر است.در طبیعت، ۳ نوکلئوتید (از این به بعد اشاره به نوکلئوتید، اشاره به یکی از چهار مولکول نام‌برده شده، یعنی C، G، A و U است، که با نام T هم شناخته می‌شود) یک رمز‌ژنتیکی را می‌سازند و این رمزِ ژنتیکی، واحدِ رایجِ پردازش است. یک رمز ژنتیکی معادل ۶ بیت اطلاعات دارد (۲ بیت به‌ازای هر کاراکتر DNA و ثبت ۳ کاراکتر در یک رمز، می‌کند به‌عبارتی ۶ بیت. این یعنی ۲ به توان ۶، یا درواقع ۶۴ رمز ژنتیکی مختلف.)تا این‌جا که خیلی دیجیتال بود. اگر تردید دارید، مستند سازمانِ جهانی بهداشت با کدِ دیجیتال را ببینید تا با چشمانِ خودتان این شباهت را باور کنید.نوشتارهای بیشتری این‌جا موجود است، این لینک، زندگی چیست، ممکن است به درکِ بهترِ بقیه‌ی این نوشتار کمک کند، یا اگر ویدیو را ترجیح می‌دهید، دو ساعت ویدیو این‌جا هست.حالا این کد چه می‌کند؟ایده‌ی واکسن بر این اساس است که به سیستم‌ایمنی بدنِ ما می‌آموزد که چگونه با یک پاتوژن (بیماری‌زا) بجنگد، بدونِ این‌که ما واقعاً درگیر آن بیماری شویم. به‌صورتِ کلاسیک، این‌کار با تزریق یک ویروسِ ضعیف‌شده یا فلج‌شده (محدود شده و دست‌پا و بسته و یا فقط قسمتی از ظاهر ویروس اصلی) به‌همراه یک مادّه‌ی کمکی یا مساند (adjuvant) به‌عنوانِ عاملی که سیستم ایمنی را طوری تحریک می‌کند که دست به عمل بزند و فعّال شود، به‌بدن انجام می‌شد. این یک شیوه‌ی «آنالوگ» شامل میلیاردها تخمک (و یا حشره) بود. در ضمن، موفقیتِ این روش شانسِ خیلی زیاد و زمانِ زیادی لازم داشت. گاهی اوقات هم از یک ویروس بی‌ربط و نامرتبط استفاده می‌شد.یک واکسن mRNA هم کار مشابهی می‌کند: به سیستم ایمنی بدنِ ما آموزش می‌دهد تا با دیدن نشانه‌های مشخصی وارد عمل شود و عامل آن نشانه‌ها را از بین ببرد. ولی با روشی بسیار دقیق هدف‌گیری شده و قدرتمند.داستان از این قرار است: محلول تزریقیِ واکسن، شامل مواد ناایستای ژنتیکی است که شاخکِ معروفِ پوشش پروتئینی SARS-CoV-2 را توصیف می‌کند. با شیوه‌های هوشمندانه‌ی شیمیایی، واکسن راه انتقال قسمتی از محتویات ژنتیکی خودش به بعضی از سلول‌های ما را پیدا می‌کند.سپس این سلول‌های بدنِ ما، خیلی مسوولانه شاخک مذکور را در تعداد زیاد تکثیر می‌کنند، تا جایی که سیستم ایمنی بدنِ ما نگران شده و وارد عمل می‌شود. رودررو با پروتئین‌های شاخک، و مهم‌تر از آن شواهد و علایمی که سلول‌های ما تسخیر شده‌اند، سیستمِ ایمنی بدنِ ما پاسخِ قوی‌ای برای مقابله با زوایای مختلفِ شاخک و همچنین سازوکارِ تکثیر آن می‌کند، و این همان چیزی است که به ما یک واکسن با موفقیت ۹۵ درصد می‌دهد. با این‌که در واکسنِ ما اثری از خودِ ویروس نیست و ما فقط سیستم‌ایمنی را برای مقابله با تکثیر شاخک‌های ویروس تربیت کرده‌ایم، ولی همین برای جلوگیری از امکان فعّالیت ویروس در درونِ بدنِ ما کافی‌است.کُدِ منبع واکسن!ابتدای کُد، جای خیلی خوبی برای شروع است. مستند سازمانِ جهانیِ بهداشت این تصویر راه‌گشا را دارد:این درواقع یک‌جور فهرست است. با «cap» که در تصویر با یک کلاه نشان‌داده شده‌است شروع می‌کنیم.همان‌طوری که شما نمی‌توانید یک‌سری دستورالعمل بنویسید و انتظار داشته‌باشید که کامپیوتر مستقیم آن‌ها را اجرا کند، سیستم‌عامل بیولوژیکی ما هم قبل از شروع به اجرای دستورالعمل‌ها نیازمند دریافتِ یک سرآیند یا Header است که درآن چیزهایی مثلِ پیوند‌دهنده‌ها یاهمان linkerها و قراردادهای صدازدن یا calling conventionها تعریف‌شده باشند. کد واکسن با دو نوکلئوتید شروع می‌شود.GAاین کدِ شروع، خیلی شبیه کدِ شروع فایل‌های اجرایی داس و ویندوز است که با MZ شروع می‌شوند و یا اسکریپت‌های یونیکس که با که !# شروع می‌شوند. هم در ماشینِ زندگی و هم در سیستم‌های عامل، این کاراکترها در واقع اجرا نمی‌شوند و دستوری برای انجامِ عملی نیستند، امّا باید در شروع ورودی ما باشند وگرنه هیچ عملی اتّفاق نمی‌افتد.این کلاه در mRNA چند کارکرد دارد. یکی از آن‌ها این است که منبع کد را هسته‌ی سلولی معرفی می‌کند. در مورد واکسن‌ِ ما، واضح است که منبع این واکسن هسته‌ی  سلول نیست ولی در عین‌حال هیچ لزومی هم ندارد که ما این موضوع را به سلول اطلاع‌دهیم! این کلاه، ظاهر کد ما را کاملاً موجّه نشان می‌دهد و جلوی شناسایی آن به‌عنوان یک کدِ خارجی و درنتیجه نابود کردنش توسط سلول را می‌گیرد.در ضمن، این دو نوکلئوتید GA اولیه از نظرِ شیمیایی کمی متفاوت از بقیه‌ی RNA هستند. به‌همین جهت GA شامل پیام‌های دیگری به‌جز پیامِ محضِ ژنتیکی هم هست.ترتیب رهبرِ RNA یا قسمت‌ِ ترجمه‌نشو‌ی پنج ‌پریم:این‌جا با کمی زبانِ فنّی طرف هستیم، مولکول‌های RNA فقط می‌توانند از یک جهت خوانده‌شوند. اسمِ جایی که خواندنِ RNA شروع می‌شود، پنج‌ پریم (’۵) است. اسمِ جایی که خواندن متوقّف می‌شود هم سه‌ پریم (’۳) است که کمی گیج‌کننده است!مبنای زندگی یا پروتئین‌ها هستند و یا چیزهایی که توسط پروتئین‌ها ساخته‌می‌شوند. پروتیئن‌ها در RNA توصیف می‌شوند و توسط ماشین‌آلاتی که در همه‌ی سلول‌های زنده‌ی دنیا وجود دارد، تبدیل به پروتئین می‌شوند. عمل تبدیل RNA به پروتئین را ترجمه می‌گویند.این‌جا ما قسمتِ ترجمه‌نشو‌ی پنج‌پریم را داریم و درنتیجه این قسمت از کد تبدیل به پروتئین نمی‌شود:GAAΨAAACΨAGΨAΨΨCΨΨCΨGGΨCCCCACAGACΨCAGAGAGAACCCGCCACCحالا اوّلین سورپرایزمان را می‌بینیم. کاراکترهای معمولی A، C، G و U بودند، U در DNA به‌نامِ T هم شناخته می‌شود. ولی ما در این‌ ترکیب علامت Ψ (پسی، انگلیسی: سای) هم می‌بینیم. داستان چیست؟این یکی از نوآوری‌های هوشمندانه در مورد واکسن است. بدنِ ما یک آنتی‌ویروس خیلی قوی به اسم «نسخه‌ی اصلی» دارد. به‌همین دلیل هم، سلول‌ها هیچ علاقه‌ای به RNAهای خارجی ندارند و تمام تلاش خودشان را می‌کنند که قبل از این‌که هر کاری از این RNAهای خارجی سر بزند، آن‌ها را نابود کنند.این برای واکسن ما مساله‌ساز است، واکسن لازم است که بتواند از سیستم ایمنی ما عبور کند. بعد از سال‌ها آزمایش، بشر متوجّه‌شد که اگر U در RNA را با مولکول کمی متفاوتی جایگزین کند، سیستم ایمنی ما دیگر توجّهی به‌آن نمی‌کند و به آن اجازه‌ی عبور می‌دهد. جالب‌تر این‌که در هنگام ترجمه‌شدن، این مولکول متفاوت می‌تواند درست مثلِ U ترجمه‌شود و درنتیجه، پروتئین خروجی، کاملاً مشابه پروتئنی خواهد بود که از یک U آمده!برهمین اساس هم، در واکسن BioNTech/Pfizer، همه‌ی Uها با مولکول «1-methyl-3’-pseudouridylyl» که با Ψ نمایش داده‌شده است، جایگزین شده‌اند. همان‌طور که خواندید، نکته‌ی خیلی هوشمندانه‌‌ی این روش این است که این جایگزینی U  با Ψ سیستم ایمنی ما را آرام و رام می‌کند ولی توسط بقیه‌ی قسمت‌های مرتبط سلول، به‌سانِ یک U معمولی پذیرفته می‌شود.در مبحث امنیت کامپیوترها ما این کلک را می‌شناسیم. گاهی این امکان وجود دارد که با ارسال پیام‌هایی که کمی دست‌کاری شده‌اند، از فایروال‌ها و دیوارهای امنیتی عبور کنیم ولی در مقصد، همچنان اجرا شویم و باعث نفوذ به سیستم مقصد شویم.در این‌جا ما داریم نتیجه‌ی کاشتِ حاصل از تحقیقات علمی که در گذشته انجام شده‌است را برداشت می‌کنیم. مکتشفین روش Ψ مجبور به کلّی جنگ بودند که بودجه‌ی لازم برای انجام تحقیقات و قبول شدن کارشان را بگیرند. ما همه باید قدردانِ آن‌ها باشیم و مطمئن هستم به‌وقتش جایزه‌ی نوبل به آن‌ها تعلّق خواهد گرفت.آیا ویروس‌ها هم می‌توانند از روش Ψ استفاده‌کنند تا از سیستم ایمنی ما عبور کنند؟ به‌طورِ خلاصه، احتمالش فوق‌العاده کم است. خیلی ساده، زندگی ماشین‌آلاتِ تولیدِ نوکلئوتیسِ «1-methyl-3’-pseudouridylyl» را ندارد. ویروس‌ها برای بازتولید خود، متّکی به امکانات تولیدی سلول‌ها هستند و چنین امکانی در سلول‌های ما نیست. واکسن mRNA خیلی سریع در بدنِ انسان تجزیه و ترجمه می‌شود و امکان بازتولید RNA با Ψ به‌جای U از طریق RNAهای حاملِ Ψ وجود ندارد، بل‌که وقتی ماشین‌آلاتِ درون سلول ما مولکول‌های Ψ در واکسن را می‌بینند، دست به تکثیر RNA با U به‌جای Ψ می‌زنند. «نه، واقعاً قرار نیست واکسن‌های mRNA باعث تغییر DNA شما شوند» متن خوبی برای مطالعه است.خوب، برگردیم سر منطقه‌ی ترجمه‌نشو‌ی پنج ‌پریم. این ۵۱ کاراکتر چه می‌کنند؟ مثل هر چیزی در طبیعت، هیچ چیزی تنها یک کاربری مشخص و شفاف ندارد و همه چیز چند کارکرد دارد.سلول‌های ما RNA را با ماشینی به‌اسم ریبوزوم ترجمه می‌کنند، یعنی ریبوزوم، ماشینِ خواندنِ RNA و تولید پروتئین است. می‌شود گفت ریبوزوم مثل یک پرینتر سه‌بعدی برای پروتئین‌هاست. ریبوزوم یک نخ RNA را می‌گیرد و بر اساس آن یک رشته اسید آمینه تولید می‌کند که بعد از تا شدن، تبدیل به یک مولکول پروتئین می‌شوند.برگرفته از ویکی‌پدیادر انیمیشن بالا کارکردِ ریبوزوم را می‌بینیم. نوار سیاه در پایین تصویر RNA است. نوار سیاهی که در قسمت سبز می‌بینیم و رو به بالا می‌رود، پروتئینی است که دارد ساخته می‌شود. چیزهایی که داخل و خارج می‌شوند هم اسیدهای آمینه و مبدّل‌هایی هستند که آن‌ها را با اتصال مناسب روی RNA سوار می‌کنند.این ریبوزوم باید به‌صورت فیزیکی روی نوار RNA بنشیند که بتواند کار کند. بعد از نشستن، ریبوزوم می‌تواند بر اساس ادامه‌ی RNAای که دریافت می‌کند پروتئین بسازد. بر همین اساس می‌توان حدس زد که ریبوزوم نمی‌تواند ترجمه را از همان جایی که فرود آمده شروع کند، وگرنه بسته به زمانی که روی RNA نشسته‌بود و نقطه‌ی شروع، هر دفعه یک پروتئن جدید تولید می‌کرد. این یکی از کاربردهای منطقه‌ی ترجمه‌نشو‌ی پنج پریم است، ایجاد یک باند فرود برای ریبوزوم یا مشخص کردن یک نقطه‌ی شروع.فرآیند تبدیل برگرفته از ویکی‌پدیاعلاوه بر این، منطقه‌ی ترجمه‌نشو‌ شامل فراداده (metadata) هم هست. ترجمه در چه زمانی باید صورت بگیرد؟ و چقدر؟ برای واکسن، آن‌ها منطقه‌ی ترجمه‌نشده‌ای با حداکثرِ مقدارِ «همین» الآن را یافتند، ترکیبی که از ژنِ آلفا گلوبین گرفته‌بودند. این ژن برای تولید قویِ مقدار زیادی پروتئین شناخته‌شده است. در سال‌های گذشته، دانشمندان راه‌هایی برای بهینه‌سازی حتّی بیشترِ همین منطقه‌ی ترجمه‌ی نشده‌ی ژنِ آلفا گلوبین یافته‌بودند (بر اساس مستند سازمان جهانی بهداشت) و بر همین اساس، این منطقه‌ی ترجمه‌شده، دقیقاً منطقه‌ی ترجمه‌شده‌ی ژنِ آلفاگلوبین نیست، بلکه‌ نسخه‌ای است که از آن هم موثرتر است.پپتیدِ سیگنال گلیکوپروتئینِ S:همان‌طور که گفته‌شد، هدفِ واکسن راضی کردنِ سلول به تولید حداکثری پروتئین شاخکِ ویروسِ SARS-CoV-2 است. تا این‌جا ما فقط با فراداده و قراردادهای صدازدن در کدِ منبعِ واکسن طرف بوده‌ایم. از این‌جا به‌بعد، واردِ محدوده‌ی واقعیِ پروتئین ویروس می‌شویم. البته، هنوز یک لایه فراداده پیش رو داریم. وقتی که ریبوزوم -همان‌طور که در انیمیشن دیدیم- یک پروتئین ساخت، این پروتئین همچنان باید به مقصدی برود. این اطلاعات در «پپتیدِ سیگنالِ گلیکوپروتئینِ S»، یا «ترتیبِ افزوده‌ی رهبر» نوشته‌شده‌ است.راهِ دیدن این مقصد در یک نوع برچسبِ آدرس است که در شروعِ پروتئین است و در خودِ پروتئین نوشته‌شده‌است. در این نمونه‌ی خاص، پپتیدِ سیگنال می‌گوید که این پروتئین باید از طریق شبکه‌ی آندوپلاسمی از سلول خارج شود.پپتیدِ سیگنال خیلی طولانی نیست ولی وقتی که به کد آن نگاه می‌کنیم، تفاوت‌هایی بین RNA واکسن و ویروس می‌بینیم:(نکته، برای هدف مقایسه، من Ψ های جایگزین‌شده با U در RNAی ویروس را با U عوض کرده‌ام)خب؛ این‌جا چه خبر است؟ این‌که من RNA را در گروه‌های سه‌حرفی لیست‌کرده‌ام تصادفی نبوده‌است. سه کاراکتر در RNA یک رمز ژنتیک می‌سازند و هر رمز ژنتیک حاوی دستور یک اسیدآمینه‌ی خاص است. پپتیدِ سیگنال در واکسن حاوی دقیقاً همان آمینو اسیده‌هایی است که در ویروس هم هستند.پس چرا RNA متفاوت است؟از آن‌جایی که ۴ کاراکتر RNA داریم و سه‌تای آن‌ها در رمز ژنتیک هستند، معادل۴۳، یعنی ۶۴ رمز ژنتیک مختلف خواهیم داشت. با این‌حال در خروجیِ ترجمه‌ی ریبوزوم همیشه فقط ۲۰ اسید آمینه‌ی مختلف داریم. این یعنی مواردی هست که یک اسیدِ آمینه چند رمز ژنتیک متفاوت دارد که ترجمه‌ی هریک از آن رمزها منتج به تولید همان یک اسید می‌شود.ماشینِ زندگی، تقریباً در همه‌ی موارد از جدول زیر برای تبدیل رمزِهای ژنتیک به اسیدهای آمینه استفاده می‌کند. البته در اختاپوس و چند فامیل ژنتیکی آن، ماجرا متفاوت است و این موجودات می‌توانند روی RNA هم تغییر ایجاد کنند، به‌زبان کامپیوتری، یعنی اختاپوس می‌تواند در زمان Runtime بر اساس ورودی‌ها، کدِ اجرایی را تغییر دهد!جدول رمزِ ژنتیک RNA از ویکی‌پدیا در این جدول می‌بینیم که تفاوت‌هایی که در واکسن با ویروس وجود دارد (UUU -&gt; UUC) همه هم معنی هستند، یعنی با وجود تفاوتِ RNA در واکسن، اسیدآمینه‌ و پروتئین مشابه‌ای به‌عنوانِ خروجیِ عملِ ریبوزوم تولید می‌شود.اگر دقیق‌تر نگاه کنیم، می‌بینیم که بیشتر تغییرات در موقعیت رمزِ ژنتیکی سوّم هستند، که در کد با کاراکتر 3 در بالای آن‌ها را علامت‌گذاری کرده‌ام و اگر جدول رمزِ ژنتیک را نگاه کنیم، می‌بینینم که این رمزِ ژنتیکی سوّم در خیلی از موارد روی آمینو اسید تولید شده تاثیری ندارد.پس این تغییرات هم‌ارز هستند، امّا اصلاً چرا وجود دارند؟ اگر بیشتر دقّت کنیم، می‌بینیم که همه‌ی این‌تغییرات به‌جز یکی از آن‌ها در جهت داشتنِ C و Gهای بیشتر بوده‌اند.چرا باید چنین کاری بکنیم؟ همان‌طور که گفتیم، سیستم ایمنی بدنِ ما خیلی در موردَِ RNAی که از خارج از سلول وارد شده‌باشد سخت‌گیر است. برای جلوگیری از شناخته‌شدن ما پیشتر U را با Ψ جایگزین کرده‌بودیم.علاوه‌بر این، ما می‌دانیم که RNA با مقدار بیشتری G و C با بازدهی بالاتری به پروتئین ترجمه می‌شود و در RNA واکسن، با یافتن مشابه‌هایی با G و C بیشتر برای رسیدن به همان آمینواسیدهایی که ویروس هم ترجمه می‌کند، بازدهی تولید ساختار پروتئنی شاخک را بالا برده‌ایم.پروتئین شاخکِ واقعی:۳۷۷۷ کاراکتر بعدی از RNA واکسن به همان صورت برای رمزهای ژنتیکی بهینه‌سازی‌ شده‌اند تا از رمزهای ژنتیکی با حداکثر C و G ولی معادل با خروجیِ پروتئین ویروس را استفاده کنند. برای حفظ فضا من کلِّ کد را این‌جا لیست نمی‌کنم ولی یک قسمتِ خاص را بزرگ‌نمایی می‌کنم. این قسمتی است که باعث می‌شود که کد کار کند، قسمتی که باعث می‌شود ما به زندگی معمولی بازگردیم:این‌جا هم تغییرات RNA با معادل‌های هم‌ارز را می‌بینیم. برای نمونه، در رمزِ ژنتیک اوّل، می‌بینیم که CUU به CUG تبدیل شده‌است، این یک G جدید به واکسن اضافه می‌کند که ما می‌دانیم که کارآیی تولید پروتئین را بالا می‌برد. هر دو CUU و CUG منتج به تولید اسیدآمینه‌ی L یا لوسین می‌شود، پس چیزی در پروتئین تولید‌شده توسط سلول که قرار است توسط سیستم ایمنی به‌عنوانِ یک تهدید شناسایی شود، تغییر نمی‌کند.وقتی که کلِّ پروتئین شاخک در واکسن را با شاخک خودِ ویروس مقایسه می‌کنیم، همه جا چنین تغییراتی می‌بینیم، به‌جز دو جا، و این چیزی است که در این قسمت از کد می‌بینیم.رمزهای ژنتیکی سوّم و چهارم در بالا، نمایانگر تغییرات هستند. اسیدهای آمینه‌ی K و V هر دو با اسیدِ P یا پرولین تعویض شده‌اند. برای K این نیاز به سه تغییر داشته (مشخص شده‌با !!!) و برای V نیاز به دو تغییر (!!).مشخص شده که این دو تغییر، باعث افزایش بسیارزیادِ کارآمدی واکسن می‌شود.حالا سعی کنیم ببینیم در این‌جا چه اتّفاقی می‌افتد؟ اگر به ذرات ویروس SARS-CoV-2 نگاه کنید، می‌توانید پروتئین شاخک را به شکل یک‌سری، درست حدس زدید، شاخک!، ببینید:ذرات ویروس SARS-CoV-2 از ویکی‌پدیا این شاخک‌ها روی بدنه‌ی ویروس یا پروتئین کپسید هسته‌ای سوار شده‌اند. نکته‌این‌جاست که واکسن ما فقط کد ساختِ شاخک‌ها را دارد و ما آن‌ها را سوار هیچ بدنه‌ی ویروسی نمی‌کنیم.مشخص‌شده که پروتئین‌های شاخکِ تنها، به‌شکل ساختارهای دیگری «تا» می‌شوند، یعنی اگر ما فقط دستور چاپ شاخک را به ریبوزوم بدهیم، بعد از تولید نوارِ پروتئین توسط ریبوزوم، این نوار به فرمی تا می‌شود که آن را تبدیل به مولکولی متفاوت از شاخک می‌کند. اگر این شاخک‌های تا شده به‌عنوان واکسن به بدن ما تزریق شوند، باعث می‌شوند تا سیستم ایمنی ما راهی برای ایمن کردن ما در مقابل آن‌ها پیدا کند، تنها نکته‌اش این است که این شاخک‌های تا شده، مشابه شاخک‌های ویروس نیستند و درنتیجه بدنِ ما در مقابل ویروس مقاوم نخواهد شد و فقط در مقابل شاخک‌های تا شده ایمنی خواهیم یافت.پس چه باید کرد؟ در سال ۲۰۱۷ مشخص شد که چگونه جاگزینی دو اسیدآمینه با پرولین، در جای مناسب در ساختار ویروس باعث می‌شود شاخک‌های SARS-CoV-1 و MERS S حتی پس از تا شدن، فرمی مشابه با فرمِ شاخکِ سوار بر بدنه‌ی ویروس را بگیرند، حتی بدونِ این‌که ویروسی وجود داشته‌باشد که بدنه‌ای داشته‌باشد. علّت این ماجرا هم سختیِ پرولین به عنوانِ آمینو اسید است. پرولین مثلِ یک نبشی، باعث ثباتِ اسیدآمینه در وضعیتی می‌شود که ما می‌خواهیم به سیستم‌ایمنی نمایش بدهیم.مکتشفین این ماجرا باید خیلی خوشحال باشند و باید بی‌نهایت از آن‌ها قدردان بود.پایانِ پروتئین، قدم‌های بعدی:اگر بقیه‌ی کدِ منبع را نگاه کنیم، تغییرات کوچکی در پایانِ کدِ شاخک می‌بینیم:در انتهای یک پروتئین، ما رمزِ ژنتیکی «ایست» را می‌بینیم که با یک s کوچک مشخص شده‌است. این روش مودبانه‌ی اعلام توقف ترجمه‌ی پروتئین به ریبوزوم است. ویروس اصلی از ترتیبِ UAA استفاده می‌کند واکسن ولی از دو UGA استفاده می‌کند. به‌احتمال زیاد برای قطعیتِ بیشتر از اتمامِ پروسه‌ی تولید.قسمتِ ترجمه‌نشو‌ی سه‌پریم:همان‌طور که ریبوزوم برای پیدا کردنِ نقطه‌ی شروعِ ترجمه به قسمتِ ترجمه‌نشو‌ی پنج‌پریم احتیاج داشت، در محلِ انتهای ترجمه هم یک قسمت ترجمه‌نشده با ساختاری مشابه نیاز داریم که آن را سه‌پریم می‌نامند.می‌توان خیلی در مورد قسمتِ سه‌پریم نوشت ولی من به نقلِ آن‌چه که در ویکی‌پدیا آمده، اکتفا می‌کنم: «قسمتِ سه‌پریم، تاثیرگذاری حیاتی در کارآییِ  محلیّت، ثبات، صدور و ترجمه‌ی mRNA دارد... علی‌رغمِ درکِ فعلی ما از قسمتِ سه‌پریم، به‌صورتِ نسبی آن‌ها هنوز برای ما یک معمّا هستند.»چیزی که ما می‌دانیم این است که بعضی از قسمت‌های سه‌پریم خیلی موفق‌تر در ارایه‌ی توصیفی از پروتئین هستند. بر اساس مستندِ سازمانِ جهانیِ بهداشت، قسمتِ ترجمه‌نشوی سه‌پریم در واکسنِ BioNTech/Pfizer از amino-terminal enhancerهای میتوکندریایی ریبوزومی 12S تولید شده، تا به ثابت و توصیف حداکثری پروتئین برسیم.و AAAAAAAAAAAAAAAAAAAAAA در پایان همه‌ی این‌ها:انتهای mRNA چند آدننینی شده‌است. این مدل دیگری برای گفتنِ این است که این mRNA با کلّی AAAAAAAAAAAAAAAAAAA  پایان می‌یابد. ظاهراً حتّی mRNA هم از سال ۲۰۲۰ سیر شده‌است!مولکول mRNA می‌تواند بارها توسط ریبوزوم و برای تولید پروتئین، استفاده‌ی مجدد شود اما در هر استفاده تعدادی از Aهای انتها را از دست می‌دهد، وقتی که A ها تمام شوند، mRNA دیگر فایده‌ای برای ریبوزوم ندارد و به‌دور ریخته‌ می‌شود. در موردِ ما، این Aها محافظی هستند در مقابلِ بی‌مصرف‌شدنِ زودهنگامِ mRNA.تحقیقاتی در مورد تعدادِ بهینه‌ی A در انتهای واکسن‌های mRNA انجام شده‌است. چیزی که من در مقالاتِ باز دیده‌ام این است که ظاهراً عدد ۱۲۰ تعداد مناسبی برای Aها در انتهای mRNA می‌باشد.واکسن BNT162b2 با این ترتیب پایان می‌یابد:این ۳۰ تا A است، بعد ۱۰ نوکلئوتید مرتبطِ ساز و به‌دنبال آن ۷۰ A دیگر. حدس می‌زنم، چیزی که این‌جا می‌بینیم، نتیجه‌ی بهینه‌سازی بیشتر و استفاده از روشی اختصاصی برای توصیف پروتئین با کارآیی حداکثری باشد.خلاصه:با توجّه‌به این‌ها، ما الآن می‌دانیم که دقیقاً محتوای mRNA در واکسن BNT162b2 چیست و برای بیشتر آن‌ها هم توضیح مناسبی داریم:- استفاده از کلاه، تا RNA ما شبیه به یک mRNA معمولی باشد- استفاده از یک قسمتِ ترجمه‌ی نشوی پنج‌پرایمِ موفق و بهینه‌سازی شده- رمز‌ژنتیکی بهینه‌سازی شده برای ارسال پروتئین شاخک به‌جای درست که ۱۰۰٪ از روی ویروس اصلی کپی شده.- رمز ژنتیکیِ بهینه‌سازی شده‌ی شاخک اصلی، با جایگزینی دو اسیدآمینه با پرولین، به‌عنوانِ نبشی برای حفظِ فرمِ شاخک بدونِ وجودِ بدنه‌ی ویروس- استفاده از یک قسمتِ ترجمه‌نشوی سه‌پریمِ موفق و بهینه‌سازی شده- یک دُمِ چند A کمی عجیب با یک ربط دهنده‌ی توضیح داده‌نشده در میان آن- بهینه‌سازی رمز‌های ژنتیکی تعداد زیادی C و G به mRNA می‌افزاید. در همین حال، استفاده از Ψ یا همان مولکول (1-methyl-3’-pseudouridylyl) به‌‌جای U به گول زدنِ سیستم‌ِ ایمنی بدنِ ما و وارد شدنِ ویروسِ تولیدی به سلول‌ها برای تولید پروتئین شاخک ویروس و در نتیجه آموزش سیستمِ ایمنی بدنِ ما برای مقابله با ویروس.این نوشته با هدف دسترسی عمومی بیشتر از ترجمه مطلب اصلی برگرفته شده است و از طریق گیت‌هاب نیز در دسترس است. اگر علاقمند به موضوعات هوش مصنوعی و علوم کامیپوتر هستید می‌تونید من رو در توییتر دنبال کنید. همچنین شاید این ارائه برای مخاطبین آشنا با سازوکارِ کامپیوتر در مورد DNA، جالب باشد. همچنین مطلب DNA برای برنامه‌نویسان نیز پیشنهاد می‌شود. خوشحال میشم اگر مطلب رو پسندید با بقیه به اشتراک بذارید و ❤ کنید. https://virgool.io/@hadiakhojasteh/%DA%86%D8%B7%D9%88%D8%B1%DB%8C-%D8%A8%D8%A7-%D8%A8%DB%8C%D9%86%D8%A7%DB%8C%DB%8C%DA%A9%D8%A7%D9%85%D9%BE%DB%8C%D9%88%D8%AA%D8%B1-%D9%87%D9%88%D8%A7%D9%BE%DB%8C%D9%85%D8%A7%D9%87%D8%A7-%D8%B1%D9%88-%D8%AF%D8%B1-%D8%AA%D8%B5%D9%88%DB%8C%D8%B1-%D9%87%D9%88%D8%A7%DB%8C%DB%8C-%D9%BE%DB%8C%D8%AF%D8%A7-%DA%A9%D9%86%DB%8C%D9%85-pr9tj8klkiiu </description>
                <category>هادی عبدی خجسته | Hadi Abdi Khojasteh</category>
                <author>هادی عبدی خجسته | Hadi Abdi Khojasteh</author>
                <pubDate>Sat, 27 Feb 2021 05:21:59 +0330</pubDate>
            </item>
                    <item>
                <title>چطوری با بینایی کامپیوتر هواپیماها رو در تصویر هوایی پیدا کنیم؟</title>
                <link>https://virgool.io/@hadiakhojasteh/%DA%86%D8%B7%D9%88%D8%B1%DB%8C-%D8%A8%D8%A7-%D8%A8%DB%8C%D9%86%D8%A7%DB%8C%DB%8C%DA%A9%D8%A7%D9%85%D9%BE%DB%8C%D9%88%D8%AA%D8%B1-%D9%87%D9%88%D8%A7%D9%BE%DB%8C%D9%85%D8%A7%D9%87%D8%A7-%D8%B1%D9%88-%D8%AF%D8%B1-%D8%AA%D8%B5%D9%88%DB%8C%D8%B1-%D9%87%D9%88%D8%A7%DB%8C%DB%8C-%D9%BE%DB%8C%D8%AF%D8%A7-%DA%A9%D9%86%DB%8C%D9%85-pr9tj8klkiiu</link>
                <description>اگر شما هم از کسانی هستید که از خوندن مطالب طولانی و پیچیده در مورد هوش مصنوعی، یادگیری عمیق و شبکه‌های عصبی کانولوشنال خسته شدید و واقعا نمی‌دونید این شبکه‌ها چه تفاوتی با شبکه‌های عصبی دیگه دارند، این مطلب برای شماست.این‌بار می‌خواهیم یاد بگیریم که چطور برنامه‌هایی رو بنویسیم که اشیا رو در تصاویر با استفاده از یادگیری عمیق تشخیص بده و مدلی طراحی خواهیم کرد که در تصاویر هوایی هواپیماها رو پیدا میکنه. همچنین در این پست قصد داریم با رویکرد آموزشی یاد بگیریم که شبکه های عصبی کانولوشنال (پیچشی) چطور کار می‌کنند. یکی از کاربرد‌های این روش که ممکن است روزانه از اون استفاده کنیم جستجوی یک کلمه در اپلیکیشن گوگل فوتوز بر اساس تصویر است.تنها با جستجوی یک کلمه یا ایموجی می‌توان در بین تمام تصاویری که قبلا برچسب‌گذاری نشده‌اند، جستجو کرد. مثلا با نوشتن کلمه &#039;سگ&#039; میشه تمام تصاویر شامل این شی رو پیدا کرد. این کار واقعا چطور انجام می‌شود؟این راهنما برای کسانی است که برای یادگیری هوش مصنوعی کنجکاو هستند اما ایده‌ای برای شروع ندارند. بنابراین بدون توجه به جزئیات اضافی، سعی می‌کنیم تا یک مسئله رو با یادگیری عمیق حل کنیم. اگر علاقمند به یادگیری ماشین و بینایی کامپیوتر هستید، مطالب قبلی رو از دست ندید.واقعیت اینه که یک کودک سه ساله به راحتی می‌تونه یک عکس از هواپیما رو تشخیص بده، اما حل این مسئله که کامپیوتر چطور میتونه هواپیما رو در عکس تشخیص بده، بهترین دانشمندان کامپیوتر رو بیش از ۵۰ سال گیج کرده بود. سرانجام در چند سال گذشته، یک رویکرد خوب در هوش مصنوعی برای شناسایی اشیا با استفاده از شبکه‌های عصبی عمیق کانولوشنال پیدا شده است. این ایده‌ها ابتدا بسیار پراکنده بودند، اما بعدتر با کنار هم‌گذاشتن اون‌ها بهترین ماشین‌های تشخیص تصاویر ایجاد شدند. پس بیاید در ماجراجویی این بار، ماشینی رو درست کنیم که اشیا رو در تصاویر تشخیص میده.شروع سادهقبل از اینکه بخواییم اشیا پیچیده رو در تصاویر پیدا کنیم، بیایید ببینیم چطور میتونیم اعداد دست‌نویس در تصاویر رو تشخیص بدیم. در اینجا هم مثل شکستن کپچای سیستم گلستان با کمک یک شبکه عصبی و یادگیری ماشین این مسئله را حل خواهیم کرد. این شبکه از تعداد زیادی نورون ساده که زنجیروار به هم متصل شده‌اند، تشکیل شده است. هر نورون با دریافت یک ورودی و در نظرگرفتن یک وزن (ضرب)، و اعمال یک تابع، خروجی را مشخص میکند. با کنار هم‌گذاشتن تعداد زیادی از این سلول‌های ساده یک مدل پیچیده برای تشخیص خواهیم داشت. یک نورون مثل لوگو و مدل پیچیده مثل تعداد زیادی لگو ساده هستند که روی هم چیده‌شده‌اند تا نهایتا یک وظیفه رو بر عهده بگیرند؛ یعنی اگر تعداد زیادی لگو با رنگ‌ها و شکل‌های متخلف داشته باشیم، می‌تونیم هرچیزی رو بسازیم! در کنار شبکه عصبی ما یادگیری ماشین رو داریم که یک الگوریتم عمومی است که با تغییر داده‌های وورودی در حل مسائل مختلف کاربرد دارد. پس در اینجا یک شبکه عصبی با کمی تغییر مشابه همان چیزی که ساختیم، اعداد دست‌نویس را تشخیص می‌دهد.واقعیت این است که یادگیری ماشین تنها زمانی کار می‌کند که داده‌های کافی و مناسب داشته باشیم. پس برای شروع نیاز به تعداد زیادی تصویر از اعداد دست‌نویس داریم. به لطف مجموعه ارقام هدی، در حال حاضر تعداد زیادی تصویر از اعداد برای استفاده تحقیقاتی موجود است. این مجموعه بزرگ ارقام دستنویس فارسی، شامل ۱۰۲۳۵۳ نمونه دست‌نوشته سیاه و سفید است. داده های این مجموعه از حدود ۱۲۰۰۰ فرم ثبت نام آزمون سراسری کارشناسی ارشد و آزمون کاردانی در سال ۱۳۸۳ استخراج شده است. در واقع هر عدد یک تصویر ۲۸ در ۲۸ پیکسل است. در ادامه نمونه هایی از اعداد این مجموعه آمده است.نمونه‌هایی از اعداد نوشته‌شده با دست‌خط‌های مختلف در مجموعه ارقام دست‌نویسنمونه‌ها در ده کلاس شامل عدد صفر تا نُه هستند و درجه تفکیک تصاویر ۲۰۰ نقطه بر اینچ و در کیفیت‌های مختلف در دسترس است. همچنین دسته‌بندی اولیه برای داده‌های آموزشی و تست موجود است.ورودی تصویر یا عدد؟ مسئله این است!می‌دونیم که شبکه‌های عصبی فقط تعدادی عدد به عنوان ورودی می‌پذیرد. ولی ما در اینجا می‌خواهیم تصاویر را به عنوان ورودی در‌نظر بگیریم. خب سوال این است که تصاویر چگونه در شبکه پردازش می‌شوند؟ پاسخ ساده است. برای کامپیوتر هر تصویر یک ماتریس از اعداد بین ۰ تا ۲۵۵ است که این عدد نشان می‌دهد هر پیکسل چقدر تیره است.یک نمونه نمایش تصویر از عدد سه دست‌نویس همراه با نمایش ورودی عددی برای شبکه به‌ازای روشنایی هر پیکسل ما می‌تونیم یک ماتریس ۲۸ در ۲۸ رو به صورت یک آرایه ۷۸۴ تایی از اعداد به عنوان ورودی شبکه عصبی در نظر بگیریم. بنابراین مدل ما باید ۷۸۴ عدد ورودی بگیرد و ما به ازای هر گروه از ورودی یک خروجی تولید کند. با داشتن خروجی جداگانه برای هر نوع شی که می‌خواهیم تشخیص دهیم، می‌تونیم از شبکه برای طبقه‌بندی اشیا به گروه‌ها استفاده کنیم. منظور از گروه حالت‌های خروجی برای مدل است. مثلا مدل می تواند ۱۰ حالت خروجی برای اعداد داشته باشد یا تنها یک حالت داشته باشد که با یک عدد اعشاری بین صفر و یک احتمال سه بودن عدد داخل تصویر را مشخص می‌کند. برای سادگی فعلا فرض کنید شبکه ما یک خروجی دارد.حالا نیاز است که شبکه رو طراحی کنیم. در طراحی معماری؛ یعنی نحوه اتصال نورون‌های مختلف به‌هم، نکات و جزئیات زیادی حائز اهمیت است که شاید در یک مطلب دیگر به آن بپردازیم. اما در مورد اندازه یا تعداد نورون‌ها، شبکه می‌تواند بسیار بزرگ باشد. جالبه که بدونیم کامپیوترهای امروز می تونند محاسبات پردازش تصاویر رو در شبکه‌هایی با چندصد نود یا نورون بدون وقفه انجام دهند. حتی بسیاری از تلفن‌های همراه امروز نیز از پس اجرای دستورات محاسباتی این مدل‌ها بر می‌آیند. اگر علاقمندید تا در این مورد بیشتر بدونید، قبلا یک مدل با دقت بالا برای تشخیص این ارقام در کارگاه کنفرانس موضوعات معاصر در علوم داده ساختیم که می تونید در گیت‌هاب پیدا کنید.یافتن عدد دست‌نویس در تصاویرخیلی خوب بود اگر فقط تصویر رو به صورت آرایه‌ای از اعداد برای شناسایی به یک شبکه می دادیم. اما عملا این اتفاق نمی‌افته. خبر خوب اینه که اگر وزن‌های نورون‌ها در مدل به درستی تعیین شده باشه و عدد به درستی در وسط تصویر نوشته شده باشد، مدل کار میکنه:شبکه عصبی مصنوعی تصویر ورودی سه که در مرکز تصویر است را به درستی تشخیص می‌دهد.اما خبر بد اینه که اگر عدد به درستی در وسط تصویر نباشد، خروجی چندان رضایت بخش نخواهد بود. فقط کوچک‌ترین تغییری همه چیز رو خراب می‌کنه:مدل آموزش داده‌شده، به علت تغییر عدد ورودی با جابجایی تصویر، نمی‌تواند عدد را تشخیص دهد.دقت کم در این حالت به این خاطر است که شبکه تنها الگوی عدد سه زمانی‌که در میانه تصویر است را یاد گرفته است. در واقع هیچ ایده‌ای ندارد که اگر سه در تصویر جابجا شود، ممکن است اعداد ورودی به چه صورتی تغییر کنند. این مدل در دنیای واقعی چندان کاربردی ندارد. مشکلات دنیای واقعی هرگز تمیز و ساده نیستند. بنابراین ما باید بفهمیم که چگونه شبکه عصبی خود را در مواردی که عدد کاملا در مرکز نیست، آموزش دهیم.ایده اول؛ جستجو در تصویر تا به اینجا یک مدل خوب برای شناخت عدد سه وقتی‌که عدد در مرکز تصویر باشد، طراحی کردیم. به نظر می رسد تنها کافیست در یک پنجره کوچک‌تر در تصویر به دنبال عدد بگردیم. با اینکار در صورتی‌که عدد در تصویر باشد حتما در یک بخش از تصویر حضور خواهد داشت.جستجو اعداد در پنجره‌های کوچک‌تر در تصویراین رویکرد به پنجره کشویی (روان) یا Sliding Window معروف است که کاملا غیرهوشمندانه یا Brute-force است. این روش در موارد محدودی کار می‌کند ولی در موارد زیادی واقعا ناکارآمد است. چون باید این کار را برای تمام بخش‌های یک تصویر در اندازه‌های مختلف چند بار امتحان کنیم؛ یعنی باید از قبل بدانیم چه اندازه پنجره‌ای برای پیدا‌کردن عدد مناسب است یا اندازه‌های زیادی را امتحان کنیم. بنابراین بهتر است ایده‌های دیگری رو هم درنظر بگیریم.ایده دوم؛ داده‌های بیشتر برای آموزشما شبکه را با عدد سه در مرکز تصاویر آموزش دادیم. شاید اگر مدل با انواع مختلفی از عدد در اندازه‌ها و مکان‌های مختلف تصویر آموزش داده شود، بتواند این عدد را در حالتی غیر از مرکز تصویر نیز شناسایی کند. پس نیاز به مجموعه‌ی تصاویری با ویژگی‌های جدید مثل اندازه‌های مختلف از یک عدد یا اعدادی با اندازه‌های متفاوت داریم. برای این‌کار نیازی به تصاویر جدید آموزشی نداریم. کافی است از همان اعداد قبلی برای ساخت تصاویر جدید با حالت‌های مختلف استفاده کنیم.داده‌های آموزشی مصنوعی ساخته شده با نسخه‌های مختلف از تصاویر آموزشی که قبلا در مجموعه داشتیم.با استفاده از این روش، می‌تونیم به راحتی یک منبع عظیم از داده‌های آموزشی ایجاد کنیم. داده‌های بیشتر یادگیری را برای شبکه عصبی ما سخت‌تر میکند، اما ما می‌تونیم با افزایش تعداد نورون‌ها در شبکه، این مسئله را جبران کنیم و در نتیجه قادر به یادگیری الگوهای پیچیده‌تر باشیم. برای این‌کار تعداد لایه‌های شبکه را افزایش می‌دهیم. بنابراین ما این مدل را شبکه عصبی عمیق می‌نامیم زیرا لایه‌های بیشتری از یک شبکه عصبی سنتی دارد.این ایده از اواخر دهه ۱۹۶۰ تا کنون بوده‌است. اما تا همین اواخر، آموزش یک شبکه بزرگ عصبی برای استفاده مفید بسیار کُند بود. محققان زمانی که فهمیدند چگونه از کارت گرافیکی (که برای انجام ضرب ماتریس‌ها واقعا سریع طراحی شدند.) به جای پردازنده‌های معمولی کامپیوتر استفاده کنند، پردازش با شبکه‌های عصبی بزرگ عملی شد. در واقع همان کارت گرافیکی که برای اجرای بازی کاربرد دارد، می تواند برای آموزش سریع یک شبکه عصبی عمیق استفاده شود. با اینکه ما می‌تونیم شبکه عصبی خود را واقعا بزرگ کنیم و آن را به سرعت با یک کارت گرافیکی آموزش دهیم، هنوز راه‌حل خوبی برای حل مسئله نیست. بهتر است برای پردازش تصاویر کمی هوشمندانه عمل کنیم. حتما راه‌حل بهتری به جای استفاده از چندین نمونه مشابه تنها با تغییر مکان عدد در تصویر و صرف زمان زیاد وجود داره.کانوُلوشِنبه طور شهودی می‌دونیم که تصاویر دارای یک سلسله‌مراتب یا ساختار مفهومی هستند. این تصویر را ببینید:ماچِکول؛ تصویر مارمولک زیبایی که در یکی از سفرهایم ملاقات کردم.به عنوان یک انسان، شما فورا مفاهیم سلسله‌مراتبی را در این تصویر تشخیص می‌دهید: زمینی پوشیده از خاک و گیاهان، مارمولک زیبای سبز رنگ، مارمولک روی یک سنگ لَم داده است و سنگی که روی خاک و علف‌زار است. ما از کودکی یادگرفتیم که مفهوم مارمولک فارغ از آنچه که روی آن نشسته است تعریف می‌شود و به ازای هر سطح متفاوت یکبار این مفهوم را مجددا بازنگری نمی‌کنیم. کاری که در حال حاضر، شبکه عصبی ما نمی‌تواند انجام دهد. مدل فکر می‌کند عدد در هر بخش از تصویر یک مفهوم متفاوت است و نمی‌داند که مکان عدد تاثیری در ماهیت آن ندارد و این یعنی هربار باید دوباره مفهوم را در یک مکان جدید در تصویر یاد بگیرد. همچنین شبکه‌ای که تا به اینجا آموزش داده شده است اعداد را در یک پس‌زمینه سفید یاد می‌گیرد که همیشه اینطور نیست. پس بهتر است مدل نیز یک مفهوم از اشیا را یاد بگیرد. برای این‌کار باید از مفهومی به اسم کانوُلوشِن کمک بگیریم. ایده استفاده از کانولوشن برای جل این مسئله، تا حدی از علوم کامپیوتر و زیست‌شناسی (دانشمندان دیوانه‌ای که پروب‌های الکتریکی را برای این‌که بفهمند مغز چگونه تصاویر را پردازش میکند، در مغز گربه قرار دادند!) الهام گرفته شده است.کانولوشن چگونه کار میکند؟کانوُلوشِن یا هم‌گشت (Convolution) در ریاضیات یا به طور دقیق‌تر آنالیز تابعی، یک عملگر ریاضی است که بر روی دو تابع f و g به صورت f*g نوشته می‌شود. عمل می‌کند. کانولوشن مشابه تابع هم‌بستگی است. بنابراین این تعریف به صورت انتگرال حاصل‌ضرب دو تابع که یکی از آن‌ها نسبت به محور عمودی مختصات برعکس شده و روی آن یکی می‌لغزد تعریف می‌شود. با این تعریف، کانولوشن یک نوع خاص از تبدیل انتگرالی است. این عملگر از آمار گرفته تا بینایی رایانه‌ای، پردازش تصویر، پردازش سیگنال، مهندسی برق و معادلات دیفرانسیل کاربرد دارد. به جای این‌که کل تصویر را به شکل ماتریسی از اعداد ورودی در نظر بگیریم، با کمک این عملگر و تکنیک‌های دیگر، مفهوم اینکه شی فارغ از مکانش در تصویر همیشه یک مفهوم را می‌رساند، مرحله‌به‌مرحله پیاده‌سازی خواهیم کرد. هدف ساخت مدلی است که احتمال حضور مارمولک در تصویر را تخمین بزند.مرحله اول؛ تفکیک تصویر به تعدادی تصویر کوچکتر با هم‌پوشانیمشابه ایده پنجره روان، بیایید این بار کل تصویر رو به تصاویر کوچکتری که باهم هم‌پوشانی دارند تقسیم کنیم و به عنوان ورودی‌های متفاوتی در نظر بگیریم.تصویر شکسته شده به تصاویر کوچک‌تر هم اندازه که باهم هم‌پوشانی دارند.در این مثال بخشی مربعی از تصویر اصلی با اندازه ۵۷۶ در ۵۷۶ پیکسل را به ۶۴ کاشی تصویری کوچک‌تر با اندازه برابر که با هم هم‌پوشانی دارند، تقسیم کرده‌ایم.مرحله دوم؛ پردازش هر کاشی با یک شبکه عصبی کوچک‌تردر بخش قبلی، ما تصویر عدد سه را برای تشخیص به یک شبکه دادیم. در اینجا نیز به همین ترتیب عمل می‌کنیم، اما آن را برای هر کاشی کوچک‌تر در تصویر انجام می‌دهیم.مرحله پردازش هر کاشی کوچک‌تر ایجاد شده از تصویر بزرگتر اصلی، به ازای هر کاشی یعنی ۶۴ بار تکرار می‌شود.با این حال، در این بخش یک تفاوت بزرگ وجود دارد و اون نگهداشتن مقدارهای یادگرفته وزن‌ها در همان شبکه برای تمام کاشی‌ها است. به عبارت دیگر، شبکه با تمام کاشی‌های متفاوت به یک شکل برخورد می‌کند و  اگر چیز جالبی در آن کاشی برای یادگیری وجود داشته باشد، شبکه ما آن را بیشتر به یاد می‌سپارد.مرحله سوم؛ ذخیره نتایج حاصل از هر کاشی در یک آرایه جدیدما نمی‌خواهیم نحوه چیدمان کاشی‌های اصلی را از دست بدهیم. بنابراین نتیجه پردازش هر کاشی را در یک ساختار شطرنجی با همان چیدمان تصویر اصلی ذخیره می‌کنیم.در این مرحله تصویر بزرگ اصلی که به کاشی‌های کوچک‌تری تقسیم شده است به شبکه عصبی کوچک داده می‌شود و شبکه با اعمال عملیات کانولوشن، به ازای هر کاشی یک آرایه از اعداد ایجاد می‌کند.به بیان دیگر، ما با یک تصویر بزرگ شروع کردیم و به یک آرایه کمی کوچک‌تر رسیدیم که مشخص می‌کند کدام بخش از تصویر اصلی بزرگ ما جالب‌ترین بخش برای یادگیری است.مرحله چهارم؛ کاهش نمونهنتیجه مرحله قبل، آرایه‌ای است که نمایندگان خوبی برای بخش‌هایی از تصویر اصلی هستند که برای یادگیری جالب هستند. اما این آرایه ها هنوز هم خیلی بزرگ هستند. برای کاهش اندازه آرایه و کاهش نمونه‌ها، از روش بیشینه تجمع (Max Pooling) استفاده می‌کنم. فقط کافی است در هر ناحیه محلی ۲ در ۲ از آرایه‌ها فقط آرایه‌ای را نگه‌داریم که بیشترین مقدار (یا جالب‌ترین ناحیه برای یادگیری) را دارد. روش بیشترین تجمیع، از بین آرایه‌ها در یک ساختار محلی بیشترین مقدار را انتخاب می‌کند.در یک تصویر بزرگ چون تعداد کاشی‌ها ممکن است بسیار زیاد باشند و در عین حال باهم هم‌پوشانی هم دارند، ایده این است که از هر چهار کاشی فقط کاشی را در نظر بگیریم که بهترین بخش تصویر برای یادگیری است. با این‌کار اندازه کل مقادیر کاهش یافته و در عین حال مهمترین بخش ها حفظ می شوند.مرحله آخر؛ پیش بینی تصویر ورودیمدل تا به اینجا، یک تصویر غول پیکر را به آرایه نسبت کوچکی تقلیل داده است. حدس بزنید به چی رسیدیم؟ بله، یک آرایه که فقط دسته‌ای از اعداد است، بنابراین ما می‌توانیم از آن آرایه کوچک به عنوان ورودی یک شبکه عصبی دیگر استفاده کنیم. این شبکه عصبی نهایی تصمیم می‌گیرد که تصویر ورودی چه خواهد بود. برای متمایز‌کردن این شبکه از شبکه کانولوشن (پیچشی)، به اون شبکه عصبی تماما متصل (Fully Connected) می‌گوییم. تصویر زیر تمام پنج مرحله شناسایی تصویر را از ابتدا تا به انتها نشان می‌دهد.مدل شبکه عصبی مصنوعی برای تشخیص اشیا از روی تصویر ورودیگام‌های بیشترمدل پیشنهادی پردازش تصویر ما از مراحل کانولوشن، بیشینه مقادیر و شبکه عصبی تمام‌متصل تشکیل شده است. اگر بخواهیم یک نمونه برای شناسایی تصاویر پیچیده دنیای واقعی درست کنیم، می‌توانیم این مراحل را به روش‌های مختلف باهم ترکیب کنیم. شما می‌توانید دو، سه یا حتی ده لایه کانولوشن داشته باشید یا از روش تجمیع مقادیر بیشینه در هر‌جایی که نیاز به کاهش داده‌ها دارید، استفاده کنید.ایده اولیه این است که با یک تصویر بزرگ اولیه شروع کنیم و پیوسته و مرحله‌به‌مرحله مفاهیم بیشتری را یادبگیریم. هرچه گام‌های کانولوشن بیشتری داشته باشیم، شبکه ویژگی‌های پیچیده‌تری از تصویر را یاد خواهد گرفت. برای مثال اولین مرحله کانولوشن ممکن است لبه‌های تیز را تشخیص دهد، گام دوم اشکال بسته را با استفاده از دانش خود از اشکال بسته و نهایتا در آخرین مرحله کل مارمولک را با استفاده از دانش اشکال بسته تشخیص دهد. در تصویر زیر یک شبکه عصبی عمیق برای تشیخص تصویر مشابه آنچه در مقالات علمی خواهید یافت را مشاهده میکنید.مدل YOLO برای تشخیص بلادرنگ اشیا در تصویر با دقت بالادر این نمونه، مدل یک تصویر ۴۴۸ در ۴۴۸ پیکسل را دریافت می‌کند. سپس چهار بار کانولوشن و تجمیع انجام میدهد. اعداد یافته شده نهایی به یک شبکه عصبی تماما‌متصل با دو لایه ورودی داده می شود. در آخر شبکه می تواند کلاس تصویر را از بین ۱۰۰۰ کلاس انتخاب کند. حتی این مدل می‌تواند چند شی را در تصویر شناسایی کرده و محل دقیق آنها رو هم علامت‌گذاری کند.معماری مناسب برای یک شبکهشاید برای شما سوال شده باشد که چطور می‌توانیم این مراحل را با هم ترکیب کنیم تا یک مدل خوب داشته باشیم؟ اگر بخواهیم صادقانه به این سوال پاسخ دهیم، فقط انجام چندین و چند آزمایش می تواند خوب بودن یک مدل از شبکه را مشخص کند. شما ممکن است قبل از رسیدن به یک معماری خوب از شبکه، صد شبکه با پارامترهای مختلف را آموزش دهید تا به یک نتیجه دلخواه برسید. برای اینکه نتایج قابل مقایسه باشند نیز روش‌های مختلف کمی وجود دارد که با توجه به کاربرد شبکه انتخاب می‌شوند. خلاصه بخش زیادی از یادگیری عمیق و یادگیری ماشین سعی و خطاست!تشخیص هواپیما در تصاویر هوایی با یادگیری عمیقحالا معلومات ما به اندازه کافی برای نوشتن برنامه‌ای که تصمیم بگیرد یک تصویر هواپیما است یا خیر زیاد شده است. در دنیای دیجیتال امروز تصاویر هوایی کاربردهای زیادی در حوزه‌های مختلف از جمله کشاورزی، منابع طبیعی، انرژی، مدیریت شهری و ترافیک، مدیریت بحران و حتی مالی پیدا کرده است. شرکت‌های مختلفی با استفاده از ماهواره‌های کوچک، بالون یا پهپادها سعی در جمع آوری هرچه بیشتر تصاویر هوایی و ارائه خدمات مختلف در این بستر دارند. در این سیل عظیم تصاویری که روزانه جمع می شوند، امکان بررسی دستی توسط اوپراتور و تصمیم گیری عملا غیرممکن است. بنابراین نیاز مبرمی به هوش مصنوعی، یادگیری ماشین و بینایی کامپیوتر برای کمک به خودکار کردن روند تجزیه و تحلیل حس می‌شود.ما هم مثل همیشه برای شروع نیاز به تصاویری برای خلق ماشین خودمان داریم. برای این منظور از این مجموعه داده که از تصاویر متن‌باز ماهواره‌ای کالیفرنیا تهیه شده‌اند، استفاده می کنیم. این مجموعه داده شامل ۸۰۰۰ عکس هوایی از هواپیماها است که تصاویر تقریبا یک هواپیما در وسط تصویر است که در بیشتر آن‌ها باله، دم و نوک هواپیما قابل مشاهده هستند. بنابراین نمونه های مختلفی از هواپیما با اندازه‌ها، جهت قرارگیری و شرایط مختلف محیطی در دسترس هستند. تصویر زیر نمونه‌ای از هواپیماها در مجموعه را نشان میدهد.نمونه تصاویر هواپیما با اندازه‌ها، جهت قرارگیری و شرایط مختلف محیطی که از تصاویر هوایی استخراج شده‌اند. تصاویر دیگر موجود در مجموعه شامل اشیا دیگر در تصاویر هوایی هستند که جمعا ۲۴۰۰۰ تصویر هستند. یک سوم از نمونه ها پوشش‌های طبیعی مختلف روی زمین مثل آب، درختان، زمین‌خالی، ساختمان و غیره هستند که هیچ هواپیمایی را شامل نمی‌شوند. یک سوم دیگر تنها جزئی از هواپیما را نشان میدهند که برای یادگیری تمام مفهوم هواپیما کافی نیستند. یک سوم نهایی اما اشیا جالبی هستند که براق و شبیه هواپیما هستند و ممکن است مدل را دچار اشتباه کند. این تصاویر توسط مدل‌های هوش مصنوعی قبلا علامت‌گذاری شدند اما هواپیما نیستند.نمونه تصاویر منتخب استخراج شده از تصاویر هوایی که هواپیما در آن‌ها حضور ندارد و اشیا دیگر مثل عوارض طبیعی زمین، ساختمان، آب یا تنها بخشی از هواپیما یا اشیایی شبیه هواپیما در آن قابل مشاهده است. این مجموعه داده برای رسیدن به هدف این مطلب که یادگیری و در عین حال ایجاد یک ماشین خودکار شناسایی تصاویر است کفایت می‌کند. اما این تعداد محدود تصاویر آن هم با وضوح کم هنوز برای برنامه‌های تجاری واقعی نامناسب است. اگر شما به برنامه‌ای با سطح عملکرد گوگل فکر می‌کنید، نیاز به میلیون ها تصویر بزرگ با کیفیت دارید. در یادگیری ماشین برای ایجاد یک الگوریتم شناسایی خوب همیشه داشتن اطلاعات زیاد بسیار مهم است. احتمالا الان می تونید حدس بزنید چرا گوگل از در اختیار قراردادن یک فضای نامحدود در گوگل فوتوز خوشحال است!در اینجا ما برای ساخت طبقه‌بند (Classifier) خود از تنسورفلو و امکانات یادگیری عمیق در آن استفاده می کنیم. در نسخه‌های جدید ایجاد یک شبکه عصبی عمیق کانولوشن به آسانی نوشتن چند خط کد و تعریف لایه‌های مختلف شبکه است. در کنار آن نیز فراموش نکنید نیاز دارید تا این داده‌ها را دریافت کنید و برای آموزش آماده کنید. برای دریافت و آماده سازی داده‌ها از دستورات زیر استفاده می‌کنیم:pip install kaggle
mkdir -p ~/.kaggle
cp kaggle.json ~/.kaggle/
chmod 600 ~/.kaggle/kaggle.json
kaggle datasets download -d rhammell/planesnet
unzip planesnet.zipتصاویر دریافت شده را با استفاده از فهرست موجود در کنار داده‌ها، به شکل زیر در برنامه فراخوانی می‌کنیم:def LoadDir(dirname):
      imgs = [np.zeros([20,20,3])]
      labels = [0]
      for imgname in os.listdir(dirname):
            if(imgname[0] == &#039;1&#039;):
                  labels.append(1)
            else:
                  labels.append(0)
            if os.path.isfile&#40;os.path.join(dirname, imgname&#41;):
                  img = Image.open(os.path.join(dirname, imgname))
                  img = np.array(img)
                  imgs.append(img)
      return np.array(imgs),np.array(labels)
imgs, labels = LoadDir(r&#039;planesnet/planesnet/&#039;)حال باید داده‌های آموزشی و آزمایشی را از هم تفکیک کنیم. در همین مرحله نیز می‌توانیم داده‌های مشابه برای یادگیری بهتر ایجاد کنیم:x_train, x_temp, y_train, y_temp = train_test_split(imgs, labels, test_size = 0.20, random_state = 42, shuffle = True)
x_valid, x_test, y_valid, y_test = train_test_split(x_temp, y_temp, test_size = 0.50, random_state = 42, shuffle = True)
x_train1 = np.rot90(x_train, k = 1, axes = (1, 2))  #Generate new samples
x_train2 = np.rot90(x_train, k = 2, axes = (1, 2))
x_train3 = np.rot90(x_train, k = 3, axes = (1, 2))
x_train = np.append(x_train, x_train1, axis = 0)
x_train = np.append(x_train, x_train2, axis = 0)
x_train = np.append(x_train, x_train3, axis = 0)
y_train = np.append(y_train, y_train)
y_train = np.append(y_train, y_train)در ادامه مدل را تعریف و آموزش شبکه عصبی کانولوشن را شروع می‌کنیم:model = Sequential()
def swish(x):
      return (K.sigmoid(x) * x)
get_custom_objects().update({&#039;swish&#039;: Activation(swish)})
model.add(Conv2D(16, 2, padding = &#039;valid&#039;, input_shape = (20,20,3)))
model.add(BatchNormalization())
model.add(Activation(&#039;tanh&#039;))
model.add(MaxPooling2D((2,2)))
model.add(Conv2D(32, 3, padding = &#039;valid&#039;))
model.add(BatchNormalization())
model.add(Activation(&#039;swish&#039;))
model.add(Dropout(0.2))
model.add(MaxPooling2D((2,2)))
model.add(Conv2D(64, 2, kernel_initializer = &#039;random_uniform&#039;, padding = &#039;valid&#039;))   #64 2
model.add(BatchNormalization())
model.add(Activation(&#039;swish&#039;))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(1, activation = &#039;sigmoid&#039;))
opt = keras.optimizers.SGD(lr = 0.01, momentum = 0.1, decay = 0.00005, nesterov = True)
model.compile(optimizer = opt, loss = &#039;binary_crossentropy&#039;, metrics = [&#039;binary_accuracy&#039;])
log = model.fit(x_train, y_train, shuffle = True, validation_data = (x_valid, y_valid), epochs = 200)اگر برای اجرای این کد از یک کارت گرافیک خوب و حافظه کافی استفاده می‌کنید، به زمانی کمتر از یک ساعت برای آموزش و تنظیم وزن های شبکه نیاز دارید. اگر از یک پردازنده معمولی استفاده می‌کنید، ممکن است این فرآیند چند ساعت زمان نیاز داشته باشد. با آموزش هرچه بیشتر مدل دقت آن نیز افزایش می‌یابد. در پیاده‌سازی که انجام دادم، بعد از اولین تکرار (Epoch) دقت مدل ۸۵.۲۸ درصد بود. تنها بعد از ۱۰ تکرار این دقت به ۹۷ درصد رسید. بعد از گذشت ۵۰ تکرار، دقت مدل آموزش داده شده به ۹۸.۵۶ درصد رسید و تغییری نکرد. شما می تونید از روش‌های مختلف مثل چرخش تصاویر، تغییر اندازه، تغییر رنگ یا غیره داده‌های بیشتری مشابه داده‌های ورودی تولید کنید یا معماری مدل را تغییر دهید تا به دقت بیشتری برسید. همچنین اگر علاقمندید می تونید با روش پنجره روان با اندازه های مختلف که در بخش اول توضیح دادیم، از یک تصویر هوایی، تصاویر کوچکتری را انتخاب کنید تا بتونید محل دقیق هواپیما در یک عکس بزرگ تشخیص دهید. تبریک میگم، حالا ما یک مدل هوش مصنوعی داریم که در تصاویر هوایی هواپیما را تشخیص می‌دهد!آزمایش شبکه با یک تصویر ورودیحال با داشتن یک تصویر ورودی یا بخشی از تصویر ماهواره‌ای، می‌تونیم مدل آموزش داده شده را بازیابی کرده و از آن برای تشخیص هوایپما در تصویر استفاده کنیم.y_pred = model.predict(x_test)
y_pred[y_pred &gt; 0.5] = 1
y_pred[y_pred &lt; 0.5] = 0
y_pred = np.asarray(y_pred, dtype=bool)اما برای اینکه واقعا ببینیم شبکه ما چقدر موثر است، باید آن را با تصاویر زیادی آزمایش کنیم. از آنجایی‌که مجموعه داده‌ای که از آن استفاده کرده‌ایم، شامل تعدادی تصاویر است که از قبل وجود یا عدم وجود هوایپما در آن مشخص شده است، از همین تصاویر استفاده می‌کنم. یعنی هر تصویر را به مدل آموزش داده شده می‌دهیم و نتیجه پیش‌بینی شبکه را با مقدار اصلی مقایسه می‌کنیم. میانگین نمونه‌های درست، دقت را مشخص می‌کند. همان‌طور که گفتیم دقت در اینجا نزدیک به ۹۹ درصد است. اما واقعا این عدد خوب است؟دقت ۹۹ درصد چقدر دقیق است؟ادعای شبکه ما این است که دقت بالایی دارد. اما این عدد در ظاهر به سادگی دقت را بیان می‌کند، اما وقتی به جزئیات فکر کنیم، دشوارتر از چیزی است که تصور می‌کنیم. به طور مثال چه اتفاقی می‌افتد اگر ۹۹ درصد از تصاویر آموزشی ما هواپیما و بقیه هواپیما نباشند؟ در این حالت تنها نیاز داریم تا برنامه همیشه بگوید ورودی یک هواپیما است و دقت هم ۹۹ درصد است! ولی خب اینکار ۱۰۰ درصد بی‌فایده است.ما باید تحلیل دقیق‌تری از یک دقت کلی داشته باشیم. برای قضاوت درباره اینکه یک سیستم طبقه‌بند واقعا چقدر خوب است، باید در مورد اینکه چطور خوب نبوده است نیز صحبت کنیم. نه فقط درصد زمانی که خوب عمل نکرده است. پس بیایید به جای فکر کردن در مورد اینکه پیش‌بینی ما «درست» یا «غلط» بوده است، آن را به چهار دسته مجزا تقسیم کنیم.اول، هواپیماهایی که شبکه به درستی به عنوان هواپیما شناخته است که آن را مثبت صحیح (True Positive) می‌نامیم. دوم، همان تصاویری که هواپیما نبودند و به درستی شناسایی شدند که به آن ها منفی صحیح (True Negative) می‌گوییم. سوم، تصاویری که مدل فکر میکرد هواپیما هستند ولی این‌طور نبودند که مثبت کاذب (False Positive)  می‌گوییم. و چهارم، تصاویری از هواپیما که شبکه نتوانسته است آن‌ها را هواپیما شناسایی کند که منفی کاذب (False Negative) گوییم.در جدول زیر با اعتبارسنجی مدل بر اساس داده‌های آزمایشی دقت با جزئیات بیشتری بر اساس معیارهای مختلف که این چهار دسته را در نظر میگیرند، آمده است:نمودارهای زیر نیز تغییرات خطای مدل در هر بار تکرار در آموزش شبکه و دقت نمونه های آموزشی و آزمایشی را نشان میدهد.دقت شبکه عصبی عمیق برای شناسایی تصاویر هواپیما در فرآیند آموزش بر اساس نمونه‌های آموزشی و آزمایشی به همراه خطا در هر تکرارشاید شما سوال بپرسید چرا ما نتایج خود را این‌گونه تجزیه و تحلیل میکنیم؟ پاسخ این است که همه اشتباهات با هم برابر نیستند. تصور کنید ما می‌خواهیم یک برنامه برای تشخیص سرطان با استفاده از تصاویر ام‌آر‌آی بنویسیم. اگر برنامه سرطان را تشخیص دهد، ترجیح می‌دهیم تا مثبت کاذب باشند تا منفی کاذب؛ یعنی اگر منفی کاذب داشته باشیم برنامه به افراد زیادی می‌گوید سرطان ندارند اما آن‌ها سرطان دارند. بنابراین ما به جای محاسبه یک دقت کلی از معیار دقت و بازیابی یا امتیاز اف یک استفاده می‌کنیم که موارد گفته شده را درنظر بگیرد.پیاده‌سازی کامل مدل و منابع مرتبط با این مطلب به صورت کامل از طریق گیت‌هاب و مطلب قبلی از اینجا در دسترس است. همچنین اگر علاقمند به موضوعات هوش مصنوعی، یادگیری ماشین و بینایی کامپیوتر هستید می‌تونید من رو در توییتر دنبال کنید. خوشحال میشم اگر مطلب رو پسندید با بقیه به اشتراک بذارید و ? کنید.ویدیو نمایشی پروژه خودروی خودران برای نظارت بر رفتار راننده برای جلوگیری از تصادفات ناشی از اشتباهات رانندهدر نوشتن این متن از ترجمه کلمات تخصصی علوم کامپیوتر و هوش مصنوعی در فارسی استفاده شده است که از دیکشنری متن‌باز تخصصی انگلیسی‌-‌فارسی علوم کامپیوتر انتخاب شده‌اند. شما هم می‌تونید از اینجا با مشارکت در تکمیل یا اصلاح فهرست واژگان رشته تخصصی خود سهمی در گسترش علم داشته باشید.این ماجراجویی تموم شد. حالا نوبت شماست که شبکه عصبی خودتون رو برای شناخت اشیا در تصاویر طراحی کنید و تجربیاتتون رو به اشتراک بذارید. به نظر شما ایجاد یک برنامه برای شناخت همزمان چندین موجودیت در تصویر چه چالش هایی به همراه داره؟ https://virgool.io/@hadiakhojasteh/how-to-build-an-intelligent-car-with-image-processing-rkgz4q8v37xg </description>
                <category>هادی عبدی خجسته | Hadi Abdi Khojasteh</category>
                <author>هادی عبدی خجسته | Hadi Abdi Khojasteh</author>
                <pubDate>Wed, 18 Nov 2020 00:34:46 +0330</pubDate>
            </item>
                    <item>
                <title>هک خودرو؛ چطوری با پردازش تصویر خودرومونو هوشمند کنیم؟</title>
                <link>https://virgool.io/@hadiakhojasteh/how-to-build-an-intelligent-car-with-image-processing-rkgz4q8v37xg</link>
                <description>در حال حاضر بیش از 20 میلیون خودرو در جاده های ایران وجود داره و این تعداد در جهان بیش از یک میلیارد هست. آماری که باعث میشه امنیت یکپارچه، بخشی جداناپذیر از وسایل نقلیه بسیاری از تولیدکنندگان خودرو باشه و بسیاری از قوانین و استانداردها برای امنیت وسایل نقلیه وجود داشته باشه. با این حال هک خودرو عمری به اندازه 15 سال داره؛ تغییر مدیریت موتور و تزریق سوخت، ارسال سیگنال های مخفی برای واحدهای کنترل الکترونیکی (Electronic Control Units یا ECUs) خودرو یا ارسال ترافیک جعلی برای سیستم مسیریابی آنلاین و تغییر مسیر خودرو در این سال ها اتفاق افتاده. جالبه بدونید به صورت غیر رسمی گروه هایی ادعای دسترسی غیرمجاز به سیستم ایمنی خودروها یا ارتباط از راه دور با خودروهای متصل رو داشتند.از طرف دیگه، در سال های اخیر هوش مصنوعی با ورود به دنیای وسایل نقلیه، نمونه های موفقی از خودروهای خودران هوشمند رو به دنیا معرفی کرده. با مستقر شدن تعداد کافی از این خودروهای خودران، جان میلیون ها انسان از خطر مرگ حفظ میشه و به شکل چشم گیری سرعت گذر جهان به انرژی های پاک بیشتر خواهد شد.خودروی خودران شرکت Waymo (زیر مجموعه هلدینگ آلفابت) با بهره گیری از تجارب خودرو خودران گوگلدر این پست قصد داریم با رویکرد آموزشی و مرحله به مرحله، سیستمی طراحی کنیم که پس از دریافت تصاویر دوربین تعبیه شده در جلوی خودرو و پردازش این تصاویر، تغییر مسیر ناگهانی راننده بر اثر خستگی یا خطای انسانی رو تشخیص داده و از طریق علائم جلو داشبورد داخل خودرو به راننده اخطار بده.برای پیاده سازی این سیستم، از یک طرف تصاویر دوربین رو به لپ تاپ ارسال کرده و از طرف دیگه فرمان های کنترلی برای هشدار به راننده رو به سامانه مالتی پلکس خودرو ارسال میکنیم؛ یعنی تصاویر به صورت بلادرنگ (Real-time) پردازش شده و در صورت تغییر مسیر ناگهانی، فرمان هشدار به راننده داده میشه. از اونجاییکه برای ایجاد این سیستم و دسترسی به سیستم شبکه خودرو نیازمند کمی قهرمان بازی هستیم، توصیه میشه اگر دنبال دردسر نیستید این کار رو روی خودرو خودتون امتحان نکنید? .در این ماجراجویی، خودرو &quot;رانا&quot; رو انتخاب کردیم. خودرویی که بر پایه پلتفرم 206 صندوق دار و با کمی تغییر در ظاهر و چراغ های جلو و عقب ساخته شده. البته با نگاهی فنی تر به این خودرو، متوجه میشید که از تمامی تولیدات خودروساز، وسیله و قطعه ای در این خودرو وجود داره. خودروی مورد آزمایش؛ هدف ایجاد یک سیستم هشدار برای مواقعی هست که خودرو از مسیر اصلی یا از باند جاده ای که در حال حرکت هست خارج میشه.در بخش اول سعی میکنیم تصاویر گرفته شده از جلوی خودرو رو پردازش کرده و مسیر حرکت اصلی خودرو رو تشخیص بدیم و در بخش دوم با هک خودرو و متصل شدن به شبکه الکترونیکی داخل خودرو، فرمان های کنترلی لازم برای هشدار به راننده رو ارسال میکنیم.پردازش تصاویر دریافتیزمانیکه ما رانندگی می کنیم، با کمک چشمامون خطوط جاده رو به عنوان یک مرجع ثابت برای تصمیم گیری ها و هدایت خودرو در نظر می گیریم. این اولین چیزیه که در طراحی خودروهای خودران توسط الگوریتم های مختلف پیاده سازی می شه. در اینجا ما تصویری مشابه تصویر سمت راست رو دریافت کرده و با الگوریتم های پردازش تصویر، مسیر (لاین) ی که در حال حرکت در اون هستیم - مشابه تصویر سمت چپ - رو مشخص میکنیم. در این پست از ویدیو هایی که در هنگام رانندگی از جاده ها در روز و شب از داخل ماشین ضبط کردیم، استفاده میکنیم. این تصاویر به علت سرعت بالای خودرو، مناسب نبودن مکان دوربین و نور و محیط واقعی دارای نویز بسیار بالایی هستند.نمونه خروجی سیستم برای تصاویر واقعی گرفته شده از رانندگی که در آنها نور محیطی و نویز مشهود است؛ سمت راست تصاویر ورودی و سمت چپ تصاویر پردازش شده برای تشخیص لاین فعلی در حال رانندگی برای روز (بالا) و شب (پایین) طیف خاکستری و حذف نویزدر این پست برای پردازش تصاویر از OpenCV فریم ورک بینایی کامپیوتر - پردازش تصویر و زبان ++C استفاده خواهیم کرد. در اولین گام بخش بالا و پایین تصاویر که اطلاعات مهمی از جاده رو شامل نمیشند، حذف میکنیم. چون بیشتر الگوریتم ها از تفاوت تغییر رنگ (یا همان نور یا تاثیر گذاری یک شی در بخشی از تصویر و در اینجا خط کشی جاده) استفاده می کنند، در همین مرحله تصویر رو به طیف خاکستری تبدیل می کنیم؛ یعنی مقدار هر پیکسل در سه کانال رنگی تصویر (قرمز، سبز و آبی یا RGB) ورودی رو به یک مقدار بین 0 تا 255 تبدیل میکنیم. https://gist.github.com/hkhojasteh/259cd19c83e9bb58eb29fb6848841a56 تبدیل تصویر رنگی ورودی دریافت شده از دوربین به تصویر طیف خاکستری و حذف بالا و پایین در تصویر روز (راست) و شب (چپ)یافتن خطوط خط کشی و جداسازیقبل از تشخیص لبه ها، به روشنی باید چیزی که در تصویر به دنبال اون هستیم رو مشخص کنیم. خط کشی جاده ها همیشه سفید یا زرد هستند. با نگاه بیشتر به تصاویر گرفته شده، یک روش ساده برای جداسازی خطوط خط کشی سفید، استخراج پیکسل هایی است که مقدار بیشتری نسبت به بقیه پیکسل های مجاور یا درون تصویر دارند. بنابراین نقاطی رو انتخاب می کنیم که مقداری کمی بیشتر از چارک بالای مقدار همه پیکسل های تصویر دارند.در ادامه چون رنگ زرد به آسانی قابل جداسازی در یک تصویر سه کاناله RGB نیست و ممکنه این مقادیر در حالت برداشت مقدار بر حسب چارک حذف بشند، فرمت نمایش تصویر رو به Hue, Saturation, Value یا HSV تبدبل میکنیم و نقاط نظیر با رنگ های زرد تصویر HSV رو در تصویر طیف خاکستری به عنوان نقاط مورد نظر استخراج می کنیم (برای یافتن طیف های رنگی می تونید از فتوشاپ یا این ابزار آنلاین استفاده کنید). نهایتا مجموع نقاط انتخاب شده سفید و زرد با اعمال یک فیلتر حذف نویز با میانگین گیری از پیکسل های همسایه، برای تحلیل های بعدی استفاده می شند. https://gist.github.com/hkhojasteh/dbd36d5f806dbd7c31626c1718dff2f5 استخراج پیکسل های مورد نیاز برای شناسایی خط کشی های جاده در تصاویر روز (راست) و شب (چپ)تشخیص لبه های خطوطخُب، بعد از اینکه خطوط اصلی رو در تصویر حفظ کردیم و مقادیر دیگر رو حذف کردیم، باید لبه های اصلی خط کشی ها رو تشخیص بدیم. برای اینکار ابتدا باید به این سوال پاسخ بدیم:از نظر ریاضی در یک تصویر (یک ماتریس از مقادیر داده رنگی)، چه چیزی لبه رو تعریف می کنه؟با نگاهی دقیق تر به داده های اطراف یک لبه، می تونیم به این نتیجه برسیم که لبه ها بخش هایی هستند که مقادیر پیکسل ها به سرعت تغییر می کنند. بنابراین تشخیص لبه، یافتن پیکسل هایی ای که در مقایسه با همسایه هاشون مقادیری به شدت متفاوت دارند.نمونه تشخیص خط کشی با استفاده از گرادیان تغییر مقادیر پیکسل ها برای یک لبهخوشبختانه در حوزه پردازش تصویر، این مسئله قبلا حل شده است. الگوریتم آشکارساز لبه Canny به همین روش و با یافتن مقادیر گرادیان در یک آستانه مشخص در طول تصویر اینکار رو انجام میده. بنابراین نیازی نیست که به مقادیر رنگ تصاویر فکر کنیم، تنها تغییرات مقدار برای ما اهمیت داره و می تونیم با این الگوریتم لبه ها رو در تصاویر مرحله قبل پیدا کنیم. https://gist.github.com/hkhojasteh/27da434736e4f4a26610edf1f1e4a791 نمونه خروجی برای الگوریتم آشکارساز لبه برای خط کشی های جاده در تصاویر روز (راست) و شب (چپ)تشخیص خطوط مسیرتا به اینجای کار، پیکسل هایی که لبه های خطوط رو نشون میدند، مشخص کردیم. حالا باید با اتصال این پیکسل ها به هم خطوط مشخص کننده مسیر رو تشخیص بدیم. مثل مرحله قبل این مسئله هم با یک تئوری ریاضی قابل حل هست. بیایید دوباره نگاهی به لبه های یافته شده بیاندازیم:لبه یافته شده در یک ناحیه مشخص شده (سبز)؛ خطوط کاندید برای لبه با رنگ آبی در تصویر مشخص شده است.با نگاه نزدیک به لبه ها، مشخصه که بهترین خطی که یک لبه رو نمایش میده، خطی است که بیشترین تعداد پیکسل از لبه رو هم شامل میشه (خط ب در تصویر بالا). یافتن این خط یک مسئله دشوار هست. چرا که ممکنه تعداد این خطوط خیلی زیاد باشه و نیاز هست تا تمام خط های ممکن بررسی بشند.برای این منظور می تونیم از تبدیل هاف استفاده کنیم. در این تبدیل، ما تمام پیکسل های لبه رو به یک فرم نمایش ریاضی دیگه تبدیل میکنیم. بعد از تبدیل کامل، هر پیکسل در &quot;فضای تصویر&quot; به یک خط یا منحنی در &quot;فضای هاف&quot; تبدیل می شه؛ یعنی در فضای هاف هر خط به شکل یک نقطه در تصویر نمایش داده میشه. نمایشی از فضای تصویر و فضای هاف متناظر به همراه پارامترها (منبع)بنابراین ما نیازی به حل مسئله یافتن خطی که از همه پیکسل های همسایه عبور کنه نداریم و تنها کافی است خطی رو پیدا کنیم که در فضای هاف هست و نهایتا این خط رو به فضای تصویر نگاشت کنیم. https://gist.github.com/hkhojasteh/a0f4e97a4d8c8d78eb936d87b78f8d17 خطوط یافت شده (زرد) با استفاده از پیکسل های لبه بعد از نگاشت از فضای هاف به فضای تصویر و قرار گرفته بر روی تصاویر اصلیگروه بندی و تصمیم گیریدر مرحله آخر پردازش تصاویر، هدف ایجاد یک معیار برای تصمیم گیری است. اگر تا اینجا همه چیز درست پیاده سازی شده باشه، خطوطی خواهیم داشت که نماینده ای از خط کشی جاده برای مسیری هستند که در حال عبور از اون هستیم. ابتدا این خطوط رو به دو دسته خط کشی سمت راست و چپ تقسیم می کنیم. یک تفاوت آشکار بین دو گروه از خط ها، جهت شیب این خطوط است. اندازه شیب هر خط زاویه رو اندازه می گیره. خطوط افقی شیب صفر و خطوط عمودی شیب بینهایت دارند. پس شیب خط های یافته شده اندازه ای بین این دو مقدار دارند، چراکه اون ها از پایین تصویر به سمت مرکز، نسبت به افق زاویه دارند.جهت شیب یک خط نشون میده که با حرکت از چپ به راست، آیا خط به بالا متمایل است یا پایین؟ خطوط با شیب منفی به سمت پایین و خطوط با شیب مثبت به بالا حرکت می کنند. این همان چیزی است که در سیستم مختصات عادی اتفاق می افته. در سیستم مختصاتی که ما از اون استفاده می کنیم، نقطه مرکز در گوشه بالا سمت چپ تصویر هست؛ یعنی در اینجا جهت شیب ما معکوس خواهد بود.پس خط های سمت راست شیب مثبت دارند و به پایین حرکت می کنند. مشاهدات نشون میدند که خطوطی که شیب خیلی کمی دارند احتمالا خطوط خوبی برای یافتن خط تصمیم گیری نیستند. بنابراین سعی می کنیم از این بین خطوطی که شیبی بیشتر/کمتر از 0.4 (+/-) دارند رو انتخاب کنیم.  https://gist.github.com/hkhojasteh/ce2a6d5ea72d2480143a8c2bc8ab4f8f نتیجه نهایی پردازش تصویر برای یافتن خط تصمیم گیری میزان انحراف خودرو از جاده (خط چین) در شب (بالا) و روز (پایین)خط تصمیم گیری که نماینده ای از انحراف خودرو از مسیر در حال حرکت هست، میانگینی از دو گروه است. برای این خط، مقدار میانگین بیشترین و کمترین x از هر گروه، مشخص کننده مقدار x خواهد بود.آخرین مرحله در اینجا دریافت تصاویر از دوربین هست. کافیه تا هر فریم (Frame) از ویدیو به صورت جداگانه دریافت شده و تمام مراحل بالا برای اون تکرار بشه. البته در مورد ویدیو میشه با دقت بیشتری اشیا مختلف رو دنبال کرد یا هر فریم رو در بازه زمان و نسبت به بقیه فریم ها در نظر گرفت که در اینجا به علت طولانی شدن مطلب به اون نمی پردازیم. اگر علاقمندید که این تصاویر رو از طریق شبکه بین موبایل و لپ تاپ دریافت کنید هم می تونید این کدها رو بررسی کنید. https://gist.github.com/hkhojasteh/e1f7ed72a62a5b91876bbfb33c2d31f5 ما موفق شدیم! الان سیستمی داریم که می تونه مسیر خودرو رو تشخیص بده. کافیه با توجه به محل قرارگیری دوربین در جلو خودرو، در صورتیکه انحراف این خط بیشتر از میزان کالیبره شده بود؛ یعنی خودرو به صورت ناگهانی تغییر مسیر داد، فرمان های هشدار به راننده داده بشه.سیستم تشخیص تغییر مسیر راننده با بهره گیری از بینایی کامپیوتر برای تصاویر واقعی از رانندگی در شباما منظور از فرمان هشدار چیه؟ در ادامه می خوایم به همین سوال پاسخ بدیم.بدون شک کاندیدای اول برای ارتباط با سامانه های الکترونیکی خودرو پورت OBD-II هست. بعد از سال 2004 تمام تولیدکنندگان اروپایی برای کاهش کابل های داخلی خودرو موظف به قرار دادن این پورت در تولیدات خود شدند که یک رابط استاندارد برای دریافت اطلاعات مختلف (مثل ولتاژ باتری، دمای روغن، دور موتور و ...) و عیب یابی (Diagnostics) خودرو است. در خودروهای جدیدتر، این پورت به عنوان یک یونیت (Unit) در باس کن (CAN bus) با دیگر بخش های داخلی خودرو در ارتباط هست. بنابراین می شه از طریق اون اطلاعات رد و بدل شده روی شبکه داخلی خودرو رو رصد کرد یا با ارسال برخی فرامین با یونیت های داخل خودرو ارتباط داشت. تمام نود (Node) ها از طریق دو رشته سیم با نام CAN high یا CANH و CAN low یا CANL که به این شبکه متصل شده اند با هم صحبت می کنند و فریم (Frame) های ارسالی همراه با یک ID عددی برای جداسازی هر فریم و حداکثر 8 بایت داده ارسال می شوند. CAN از دیفرانسیل سیگنالینگ استفاده می کنه؛ یعنی به ازای هر افزایش مقدار سیگنال روی یکی از خط ها به همان میزان مقدار رو روی خط دیگه کاهش میده. از این روش در محیط های پر نویز برای افزایش تحمل خطای سیستم استفاده میشه.قالب بیت های داده در بسته های CAN استانداردتا اونجاییکه می دونم، اطلاعات آنلاین زیادی از اطلاعات CAN برای رانا روی اینترنت پیدا نمیشه. محتویات هر فریم به صورت عمومی ثبت نشدند و با توجه به کارخونه سازنده منحصر بفرد هستند. پس تصمیم گرفتم برخی از جزئیات دسترسی  اطلاعات خودروها رو از طریق منبع کدهای این مطلب به صورت عمومی منتشر کنم.شمای نودهای مختلف در خودرو رانا با سیستم مالتی پلکس ECO MUXخودروی رانای ما با موتور TU5 مجهز به شبکه مالتی پلکس با پنج نود FCM یا Front Control Module در قسمت جلوی راننده برای کنترل چراغ ها و محدوده جلو خودرو، ICN یا Instrument Cluster Node برای کنترل بخش های مختلف جلو آمپر و BCM یا Body Control Module در داشبورد برای مدیریت قفل مرکزی، درها و شیشه بالابر که تحت پروتکل CAN Low Speed با هم در ارتباط هستند. در این سیستم BCM دستوراتی که روی سیستم اهرم های پشت فرمان به صورت آنالوگ دریافت میکنه رو به صورت دیجیتال به دستورات شبکه تبدیل میکنه تا بقیه نودها اون ها رو دریافت کنند و این نود به عنوان رابط عیب یابی مستقیما با پورت OBD در ارتباط هست. همچنین در خودرو ما ECU ی موتور و یونیت ABS در یک شبکه با استاندارد CAN High Speed هستند.ما می خوایم برای زمانیکه راننده از مسیر اصلی منحرف میشه یک هشدار ایجاد کنیم. با ساختاری که در بالا توضیح داده شد، چراغ های هشدار مربوط به راهنما در صفحه نمایش جلو داشبورد (جلو آمپر) یک انتخاب خوب هستند. پس سعی میکنیم با هک شبکه و ارسال فریم مربوط به روشن و خاموش شدن چراغ های راهنمای سمت راست و چپ در جلو داشبورد ، به راننده زمانیکه به صورت ناگهانی از مسیر خارج شد، اخطار بدیم. بنابراین اگر خودرو از مسیر اصلی منحرف بشه، راننده بدون اینکه راهنما زده باشه، چراغ راهنمای سمت مورد نظر رو روی صفحه نمایش میبنه.طبق نقشه ها، اطلاعات دسته راهنما به صورت آنالوگ تحلیل میشه؛ یعنی این اهرم با تغییر سطح سیگنال حالت فعلی رو به BCM اطلاع میده. از طرفی میدونیم که اطلاعات چراغ های راهنما از BCM به ICN در شبکه ارسال میشه. چون پورت OBD خودرو ما به صورت مستقیم در شبکه حضور نداره و به BCM متصل هست، برای دسترسی به اطلاعات شبکه با وصل شدن به عنوان فرد میانی (man-in-the-middle) مقادیر فریم های داخل باس رو شنود می کنیم. با کمی جستجو در مستندات و نقشه ها، در میابیم که سیگنال های داده شبکه مورد نیاز ما از BCM قابل ارسال و دریافت هستند. پایه 1 و 2 کانکتور 18 پایه سفید روی BCM به ترتیب مربوط به CANH و CANL هستند. نحوه دسترسی به BCM و محل کانکتور 18 پایه در شکل زیر مشخص شده اند.اتصالات و محل نود BCM داخل خودرو رانا با سیستم ECO MUX؛ دسترسی از زیر داشبورد بالای پای راننده، کنار جعبه فیوز داخل اتاقبرای دسترسی به داده ها می تونیم از کانکتورهای T استفاده کنیم یا با خراش دادن بخشی از روکش سیم با سیم دیگری داده ها رو دریافت کنیم. چون زمانبندی و مقادیر داده فریم های ارسالی در شبکه نباید تحت تاثیر قرار بگیره، پس برای دریافت داده ها از سیم ها از روش T استفاده میکنیم. سطح سیگنال CAN بین 1.25 تا 3.75 ولت هست، برای خواندن این مقادیر در سطح دیجیتال، از فرستنده و گیرنده TJA1050  کمک گرفته و خروجی رو با MAX232 و FT2232 از طریق کابل USB دریافت می کنیم. اگر همه چیز تا به اینجا خوب پیش رفته باشه، داده های ارسالی از پورت USB با درایور مربوطه از طریق یک پورت سریال مجازی قابل دریافت هستند.نحوه برقراری ارتباط برای دریافت و ارسال داده ها از طریق کانکتور T (قرمز رنگ) بر روی سوکت نری (سفید رنگ) BCM خودرو مابعد از آماده سازی سخت افزاری برای دریافت داده ها، سعی میکنیم داده ها رو دریافت کنیم. برای این منظور برنامه ای می نویسیم که داده های پورت سریال رو بخونه و تحلیل کنه. طبق توضیحات بالا، فریم های CAN بر اساس استاندارد مشخصی تولید میشند. طبق استاندارد هر فریم با مقدار 0X7F تموم میشه و فریم ها شامل ID منحصر بفرد هستند؛ بنابراین می تونیم هر فریم رو با مقدار انتهایی و ID اون ها شناسایی کرده و دیگر بخش های فریم رو جداسازی کنیم. هر نود در شبکه CAN داده های خودش رو در یک بازه زمانی در شبکه ارسال میکنه و در هر لحظه مقادیر زیادی داده روی شبکه وجود داره. این نکته هم حائز اهمیت هست که اگر به شبکه CAN پرسرعت متصل هستیم با معماری سخت افزاری که توضیح داده شد، چون سرعت سریال کمتر از میزان داده های دریافتی هست، ممکنه بخشی از داده ها از بین بره که باید این مورد رو هم توی برنامه در نظر بگیریم.برنامه نوشته شده با قابلیت نمایش داده های دریافتی، جداسازی اطلاعات فریم ها و ارسال داده های دلخواه در شبکهبا این برنامه، داده های شبکه بلادرنگ قابل تشخیص و جداسازی هستند. در صورتیکه فریم جدیدی در شبکه ارسال بشه، در ستون سمت چپ مشخص میشه. حالا نوبت این رسیده که فریم های مربوط به دستور روشن شدن چراغ راهنمای سمت راست و چپ در صفحه نمایش جلو آمپر رو پیدا کنیم. این فریم ها زمانی به جلو آمپر ارسال میشند که دسته راهنما در کنار فرمان به بالا و پایین حرکت داده بشه. پس کافیه در حالتیکه برنامه در حال اجرا هست، اهرم رو به طرفین حرکت داده و فریم های مربوطه رو دریافت کنیم.سیستم هوشمند ما با آخرین مرحله کامل میشه، این فریم ها رو به صورت جداگانه زمانیکه خودرو از مسیر اصلی منحرف شد، برای جلوآمپر ارسال میکنیم تا راننده از تغییر مسیر خودرو مطلع شود.ارسال فرمان های روشن شدن چراغ های راهنمای راست و چپ برای زمانیکه راننده از مسیر منحرف میشهاین مطلب به صورت کامل از طریق گیت هاب و مطلب قبلی از اینجا در دسترس هست. همچنین اگر علاقمند به موضوعات هوش مصنوعی، یادگیری ماشین و بینایی کامپیوتر هستید می تونید من رو در توییتر دنبال کنید.توییت مربوط به پروژه تشخیص حالت بدن تست شده بر روی تصاویر همایش فریلنداز تمامی عزیزانی که در چند هفته پیاده سازی و نگارش این مطلب راهنمایی هاشون راهگشای من بود، صمیمانه تشکر میکنم. خوشحال میشم اگر مطلب رو پسندید با بقیه به اشتراک بذارید و ? کنید.این ماجراجویی تموم شد. حالا نوبت شماست که سیستم هوشمند خودتون رو طراحی کنید و تجربیاتتون رو به اشتراک بذارید. به نظر شما چالش های ایجاد یک خودروی خودران هوشمند چیه؟ http://vrgl.ir/Eu7UE </description>
                <category>هادی عبدی خجسته | Hadi Abdi Khojasteh</category>
                <author>هادی عبدی خجسته | Hadi Abdi Khojasteh</author>
                <pubDate>Thu, 05 Jul 2018 19:04:57 +0430</pubDate>
            </item>
                    <item>
                <title>چطوری کپچای سیستم گلستان رو با کمک یادگیری ماشین بشکنیم؟</title>
                <link>https://virgool.io/dataio/how-to-break-a-golestan-captcha-system-with-machine-learning-kukzjnwwsqdx</link>
                <description>همه‌ی ما از کپچا (CAPTCHA) فراری ایم - همون تصاویر مزاحمی رو میگم که نوشته های درهم ریخته است و برای اینکه به فرم یا صفحه ای از سایت دسترسی داشته باشیم باید اونو تایپ کنیم. کپچاها برای تشخیص انسان از بات ها (همون برنامه های اتوماتیک) و معمولا برای جلوگیری از ورود به بخشی خاص، جلوگیری از پر کردن فرم ها یا کاهش برخی حملات طراحی شدند. جالبه بدونید در حال حاضر مدتی است که کپچاهای متنی محبوبیت خودشون رو از دست دادند و جای خودشون رو به کپچاهای تصویری یا موارد مشابه دادند.نمونه ای از کپچای گوگل جایگزین مناسبی برای کپچاهای متنیسیستم گلستان رو تقریبا همه می شناسند. سیستم اتوماسیون معروف دانشگاه های ایران که پیدا کردن هر چیزی داخل اون نیازمند یک دوره دکتری تخصصی &quot;زبانهای رسمی و روش های صوری&quot; است!توی این پست قصد داریم با رویکرد آموزشی و مرحله به مرحله، شکستن کپچای متنی سیستم گلستان رو با بهره گیری از قدرت یادگیری ماشین/عمیق و داده های آماری بررسی کنیم. توصیه میشه اگر دنبال دردسر نیستید این کار رو توی خونه امتحان نکنید? .برای شروع ماجراجویی، اول نگاهی به فرم ورود سیستم گلستان به همراه تصویر کپچای متنی می اندازیم:صفحه ورود سیستم گلستانتوی این صفحه یک تصویر جداگانه وجود داره که از طریق آدرس تصویر میشه بهش دسترسی داشت. بنابراین قدم اول ذخیره تعداد زیادی از این تصاویر هست تا با اون ها در مرحله بعد یک شبکه عصبی مصنوعی کانولوشنال (شبکه ای برای استخراج ویژگی ها از تصاویر و کلاس بندی) رو آموزش بدیم. نهایتا شبکه آموزش داده شده میتونه تصاویر ورودی رو به متن مورد نظر ترجمه کنه. جمع آوری داده آموزشیخُب، معمولا هر الگوریتم یادگیری ماشین برای آموزش نیازمند داده های زیادی هست. شکستن کپچا هم از این قاعده مستثنی نیست. بنابراین برای اینکه بتونیم یک کپچای متنی رو بشکنیم، نیازمند تعداد زیادی تصویر هستیم. برای اینکار یک اسکریپت ساده Shell میتونه چاره کار باشه. https://gist.github.com/hkhojasteh/51adc98053cc1d11a72aaca8e911964d این اسکریپت سعی میکنه تعداد زیادی از فایل های تصویر رو دانلود کنه و با فرمت gif. ذخیره کنه (فرمت فایل های خروجی کدی هست که کپچا رو در سیستم اصلی تولید میکنه). نمونه ای از تصاویر کپچاهای استخراج شده از سیستم گلستانحالا حدالامکان تصاویر ورودی به سیستم رو به ساده ترین شکل ممکن تبدیل می کنیم. بدین منظور سعی میکنیم تا نوشته پایین تصاویر رو حذف کنیم.در این مطلب از کتابخونه OpenCV فریم ورک محبوب بینایی کامپیوتر و پردازش تصویر و زبان ++C برای پیش پردازش تصاویر استفاده خواهیم کرد (اگر علاقمندید این کتابخونه Python API داره و می تونید از اون هم استفاده کنید). https://gist.github.com/hkhojasteh/c1a60d4bc6858db8a7dece2a0208d29d کد بالا بخش پایین تصویر ورودی رو حذف میکنه که به عنوان یک آرگومان دریافت شده. بنابراین تا اینجای کار داده های آموزشی برای سیستم یادگیری مون رو در اختیار داریم.پیش پردازش تصاویرسیستم تشخیص کپچای ما می تونه مطابق شکل از شبکه عصبی مصنوعی برای پردازش تصاویر و برای شناسایی متن تصویر تشکیل شده باشه که یک تصویر از کپچای متنی رو به عنوان ورودی دریافت کرده و جواب صحیح رو تولید میکنه.رویکرد کلی سیستم یادگیری برای شکستن کپچابا داشتن داده های آموزشی کافی، رویکرد کلی بالا پاسخ درستی تولید می کنه؛ یعنی فقط کافیه تعداد خیلی زیادی تصویر رو به یکی از لایه های شبکه عصبی کانولوشنال (Convolutional Neural Network) (احتمالا با یک معماری پیچیده و با تعداد لایه و پارامتر زیاد) که وظیفه پردازش تصویر رو داره بدیم و با یک لایه دیگه از شبکه عصبی که وظیفه پیش بینی در مورد کل تصویر رو داره مسئله رو حل کنیم. اما این رویکرد با کمی تغییرات پاسخ های بهتر با محاسبات کمتر رو تولید میکنه. پس سعی میکنیم به جای پیش بینی کل تصویر فقط یک حرف رو پیش بینی کنیم و تصویر رو به چند تصویر شامل حروف (یا اعداد) تبدیل کنیم. واضح هست که برای تعداد زیادی تصویر راه حل فتوشاپ توصیه نمیشه!خوشبختانه کپچایی که ما قصد شکستن اون رو داریم از پنج حرف تشکیل میشه. بنابراین اگر بتونیم روشی برای جداکردن حروف در تصویر داشته باشیم، شبکه عصبی تنها نیاز داره تا یک حرف رو کلاس بندی (Classify) کنه. یک روش ساده شکستن تصویر افقی به پنج قسمت مساوی هست. اما اگر به نمونه های دریافت شده در تصویر دقت کنید، ممکنه به دلیل جمع شدن حروف در یک طرف، حروف به درستی قطعه بندی (Segmentation) نشن. بنابراین برای اینکه محل دقیق تقسیم بندی در تصویر رو پیدا کنیم، سعی میکنیم تا تجمع پیکسل های غیر سفید در تصویر رو پیدا کنیم (یا به صورت ساده تعداد پیکسل در هر خط عمودی رو بشماریم)، و از اونجاییکه بین حروف فاصله کمی وجود داره، تعداد پیکسل بیشتر با تقریب خوبی جای هر حرف در تصویر رو به ما نشون میده. بعد از اینکار یک الگوریتم خوشه بندی (Clustering) می تونه به طور موثر تصویر رو به پنج بخش مختلف تقسیم کنه.ابتدا باید تصویر ورودی تبدیل به تصویر سیاه و سفید بشه و بخشی از نویز اون نیز حذف بشه تا مطمئن بشیم همه چیز به بهترین نحو ممکن انجام میشه.  https://gist.github.com/hkhojasteh/a88e6a14bfd2cd900a4ff85bfb304d1f کدهای بالا با پردازش تصویر، جادوی زیر رو انجام میده:مراحل پردازش تصویر ورودیبرای قطعه بندی تصاویر؛ یعنی برش تصویر به کاراکترهای جداگانه، ساده ترین روش استفاده از نمودار هیستوگرام (Histogram) و یافتن دسته هایی از پیکسل هاست که در جای خاصی تجمع دارند. https://gist.github.com/hkhojasteh/18cfb5efd6d1fa62796ad898e434788f نمودار هیستوگرام تعداد پیکسل ها برای قطعه بندی تصویر به ازای کپچای ورودی بالا سمت راست نمودارهمون طور که در تصویر هم می بینید نقاطی که افت شدید مقدار داره، دقیقا مکان های متناظری هستند که باید تصویر برش داده بشه تا تصاویر کاراکترها استخراج بشند.از اونجاییکه این روش با پیچیدگی هایی همراه هست، ما در اینجا با روش خوشه بندی k-means سعی میکنیم تا بهترین مکان برای جداسازی تصویر بعد از فیلتر رو پیدا کنیم. توی این روش از تصویر نهایی به شکل ماتریسی از صفر و یک ها (فقط نقاط سفید) که در مرحله قبل ایجاد کردیم، استفاده میکنیم. پنج نقطه اولیه تصادفی در ماتریس انتخاب میکنیم. با روش k-means سعی میکنیم نقاط درون تصویر رو به پنج خوشه (Cluster) تقسیم کنیم. نقطه مرکز هر خوشه، مرکز هر کاراکتر خواهد بود. https://gist.github.com/hkhojasteh/32802712b675359c309716c4d1d42ae1 نتیجه کدهای بالا باورنکردنیه:خروجی خوشه بندی پیکسل ها برای یافتن مرکز کاراکترها و قطعه بندی تصاویرپردازش های بیشتری هم میشه روی تصویر انجام داد. مثلا برخی تصاویر که کنتراست (Contrast) کمتری دارند، قابلیت نرمال سازی و افزایش کنتراست رو دارند یا برای جداسازی از روش شمارش تجمعی، کاراکترهایی با طول های متفاوت رو جدا کرد. تا همین میزان پردازش برای ایجاد ورودی های شبکه عصبی؛ یعنی همون کاراکترهای جداگانه با اندازه ثابت، کافی است (اگر دوست دارید شما می تونید تا میزان دلخواه پردازش روی تصویر انجام بدید.).ساخت و آموزش شبکه عصبی مصنوعیاز اونجاییکه ما فقط نیاز به تشخیص یک تصویر از حرف یا عدد داریم، نیازی به معماری پیچیده برای شبکه عصبی نداریم. شناسایی حروف یک مسئله بسیار ساده تر از تشخیص یک تصویر پیچیده (مثل تصاویری از سگ یا گربه که تنوع زیادی داره.) است. در اینجا ما برای حل مسئله شکستن کپچا از یک معماری شبکه عصبی مصنوعی با دو لایه کانولوشنال (Convolutional) همراه با Max Pooling و دو لایه تماما متصل (Fully-Connected) استفاده می کنیم. اگر شما این شبکه عصبی ها رو نمیشناسید نگران نباشید. در اینجا نیازی به پیاده سازی های سطح پایین نداریم. اگر علاقمند به یادگیری بیشتر در این زمینه هستید، ویکیپدیا یا این کتاب رو بررسی کنید.معماری شبکه عصبی مصنوعی کانولوشنال برای شکستن کپچابرای سادگی آموزش در اینجا از TensorFlow؛ کتابخونه یادگیری ماشین گوگل، برای ایجاد شبکه استفاده خواهیم کرد. پیاده سازی این مدل به شکل زیر خواهد بود:  https://gist.github.com/hkhojasteh/eb67fbfa751663896b54cb8d2952560e اگر بخش های دیگه کد رو هم به این مجموعه اضافه کنید و خوش شانس باشید خروجی زیر رو می بینید:2018-04-25 11:45:45.927302: step 0, loss = 4.68 (2.0 examples/sec; 64.221 sec/batch)
2018-04-25 11:45:49.133065: step 10, loss = 4.66 (533.8 examples/sec; 0.240 sec/batch)
2018-04-25 11:45:51.397710: step 20, loss = 4.64 (597.4 examples/sec; 0.214 sec/batch)
2018-04-25 11:45:54.446850: step 30, loss = 4.62 (391.0 examples/sec; 0.327 sec/batch)
...داده های آموزشی برای این شبکه نیازمند برچسب هستند، برای اینکار می تونید مدل رو ابتدا با مجموعه تصاویر EMNIST آموزش بدید و بعد با تصاویر اصلی استخراج شده آموزش رو انجام بدید. دقت این مدل رو میشه به ازای داده های ورودی اندازه گرفت، نمودارهای مختلف مثل دقت-سرعت رو در زمان اجرا با استفاده از داشبورد مربوطه رصد و بررسی کرد و کلی کار دیگه که می تونه دقت و سرعت مدل رو افزایش بده. با پیاده سازی مدل یادگیری عمیق، حالا ما می تونیم به صورت خودکار کپچای سیستم گلستان رو بشکنیم! این مطلب به صورت کامل در گیت هاب در دسترس هست. همچنین اگر علاقمند به موضوعات هوش مصنوعی، یادگیری ماشین و بینایی کامپیوتر هستید می تونید من رو در توییتر دنبال کنید. ماشین خودکار هوشمند برای بازی کمپین دیجیکالا، تخفیفان و شاتل از توییتراین ماجراجویی تموم شد. حالا نوبت شماست که دست به کار بشید، سیستم تشخیص کپچای دلخواهتون رو طراحی کنید و تجربیاتتون رو به اشتراک بذارید. به نظر شما راهکار جایگزین برای کپچاهای سنتی چه ویژگی هایی باید داشته باشه تا هوش مصنوعی نتونه اون رو بشکنه؟ https://virgool.io/@hadiakhojasteh/how-to-build-an-intelligent-car-with-image-processing-rkgz4q8v37xg </description>
                <category>هادی عبدی خجسته | Hadi Abdi Khojasteh</category>
                <author>هادی عبدی خجسته | Hadi Abdi Khojasteh</author>
                <pubDate>Thu, 26 Apr 2018 16:22:20 +0430</pubDate>
            </item>
            </channel>
</rss>