دور زدن کپچا با شبکه عصبی پیچشی در پایتون – راهنمای گام به گام


مکانیزم «کپچا» (CAPTCHA) که مخفف اصطلاح «مکانیزم کاملا خودکار شده و عمومی تورینگ جهت تمایز قائل شدن میان انسان و کامپیوتر» (Completely Automated Public Turing to tell Computers and Humans Apart) است، یک مکانیزم امنیتی به شمار میآید که در بسترهای آنلاین و برای تشخیص انسان یا ربات بودن متقاضی سرویس اینترنتی بهکار میرود.
در غالب جریانهای امنیتی که برای تضمین امنیت کاربران و اطلاعات آنها در سطح وب پدید میآیند، جریانی در جهت مخالف و با هدف پیدا کردن حفرههای امنیتی در آنها شکل میگیرند. مکانیزم کپچا نیز از این قاعده مستثنی نیست. در طی چند سال اخیر روشهای مختلفی برای دور زدن کپچا و دور زدن مکانیزمهای امنیتی آن طراحی شده است. البته غالب تلاشها برای دور زدن کپچا با هدف افزایش امنیت این مکانیزم امنیتی انجام میشود.
هدف اصلی مکانیزمهای امنیتی CAPTCHA «حل کننده کپچا» (CAPTCHA Solver)، جلوگیری از دسترسی غیر مجاز به اطلاعات توسط باتها و دیگر نرمافزارهای خودکار «خزنده» (Crawler) اطلاعات است. حل کننده کپچا که به آن «استخراجگر متن کپچا» (CAPTCHA Text Extractor) نیز گفته میشود، فرایندی جهت استخراج متن از تصاویر کپچا است.
بسیاری از تکنیکهای حل کننده کپچا، از روشهای «بازشناسی کاراکترهای نوری» (Optical Character Recognition) و ابزارهایی نظیر Tesseract در «زبان برنامهنویسی پایتون» (Python Programming Language) جهت استخراج متن از تصاویر کپچا استفاده میکنند.
با این حال، برای درک بهتر مفاهیم «بینایی کامپیوتر» (Computer Vision) و چگونگی استفاده از این روشها برای استخراج متن از تصاویر کپچا، به خوانندگان و مخاطبان این مطلب توصیه میشود که «ابزارهای سفارشی شده» (Custom Tools) خود را جهت چنین کاری پیادهسازی نمایند. چنین رویهای، نه تنها درک و فهم خوانندگان و مخاطبان را از روشهای بینایی ماشین و چگونگی استخراج اطلاعات از تصاویر بالاتر میبرد، بلکه سبب میشود تا آنها بتوانند با کسب دانش در این زمینه، دقت مکانیزمهای موجود را نیز ارتقاء دهند. در این مطلب، برای استخراج متن از تصاویر و دور زدن کپچا، از کتابخانههای Keras و openCV در زبان برنامهنویسی پایتون استفاده شده است.
ساختن مدل یادگیری برای دور زدن کپچا
جهت تشخیص متنهای موجود در تصاویر کپچا، از مدلهای «شبکه عصبی پیچشی» (Convolutional Neural Network) استفاده خواهد شد. مدل شبکه عصبی پیچشی روی تصاویر مربوط به حروف موجود در تصاویر کپچا آموزش خواهید دید. برای ساختن مدل یادگیری لازم برای دور زدن کپچا، لازم است تا ابتدا هر کدام از حروف موجود در تصاویر جداسازی شوند و برای آموزش شبکه عصبی پیچشی، مورد پردازش قرار بگیرند.
پس از آموزش شبکه عصبی پیچشی روی تصاویر مربوط به حروف موجود در تصاویر، مدل قادر خواهد بود تا «تصاویر کپچای دیده نشده» (Unseen CAPTCHA Images) را به عنوان ورودی دریافت کند و متنهای موجود در آنها را تشخیص دهد.

همانطور که پیش از این نیز اشاره شد، برای استخراج متن از تصاویر و دور زدن کپچا، از کتابخانههای Keras و openCV در زبان برنامهنویسی پایتون استفاده خواهد شد.
آمادهسازی دادههای آموزشی
اولین قدم برای پیادهسازی مدل شبکه عصبی پیچشی، آمادهسازی دادههای لازم برای آموزش مدل یادگیری است. برای چنین کاری، هر کدام از تصاویر موجود در مجموعه داده آموزشی، به ترتیب وارد سیستم میشوند. سپس، حروف موجود در تصاویر جداسازی و به عنوان یک فایل تصویری جدید ذخیره میشوند. همانطور که در تصویر بالا نیز قابل مشاهده است، ساختار مجموعه داده آموزشی و تست به این گونه است که نام انتخاب شده برای هر کدام از تصاویر، نمایش دهنده حروف موجود در تصویر است.
بنابراین، در مرحله اول از پیادهسازی شبکه عصبی پیچشی جهت دور زدن کپچا و هک کردن آن، تمامی «وابستگیهای برنامهنویسی» (Programming Dependencies) بارگیری و تصاویر توسط کتابخانه openCV در محیط برنامهنویسی پایتون خوانده خواهند شد.
در هنگام بررسی تصاویر موجود در مجموعه آموزشی، مشاهده شده است که بعضا حروف موجود در تصاویر کپچا، به «مرز» (Border) تصویر بسیار نزدیک هستند. چنین نقیصهای ممکن است فرایند تشخیص حرفهای موجود در تصاویر را با اختلال مواجه کند. برای رفع چنین نقیصهای در تصاویر کپچا، از فرایند «لایهگذاری» (Padding) استفاده میشود تا دو پیکسل به حاشیه تصاویر اضافه شود.
در مرحله بعد، از روشهای «آستانهگذاری» (Thresholding) استفاده میشود تا میان پیکسلهای حروف و پیکسلهای «پسزمینه» (Background) تمایز ایجاد شود و از این طریق، پیکسلهای پسزمینه از پیکسلهای حروف جدا شوند. در این مطلب، از روش آستانهگذاری THRESH_BINARY_INV استفاده شده است؛ با این حال، کاربران میتوانند از هر روش آستانهگذاری دلخواهی برای جداسازی پیکسلهای پسزمینه از پیکسلهای حروف استفاده کنند.
برای جدا کردن هر کدام از حروف موجود در تصویر، از روشهای پیدا کردن «کانتور» (Contour) استفاده میشود. با توجه به اینکه پسزمینه تصاویر سفید است و کنتراست بسیار بالایی با حروف موجود در تصویر دارد، روشهای شناسایی کانتور با دقت بالایی خواهند توانست تا حروف موجود در تصاویر را جدا کنند. برای چنین کاری، از تابع cv2.findcontours در کتابخانه openCV استفاده شده است.
پس از شناسایی کانتورِ حروف موجود در تصاویر، مختصات پیکسلی مستطیل ایجاد شده در اطراف تصویر حروف (کانتور) استخراج میشوند. در برخی از تصاویر کپچا، حروف ممکن است بسیار به یکدیگر نزدیک باشند و یا حتی با یکدیگر همپوشانی داشته باشند. برای مقابله با چنین نقیصهای در سیستم پیادهسازی شده، ابتدا کانتورهای «عریض» (Wide) ایجاد شده در تصاویر کپچا شناسایی میشوند. سپس، کانتورهای عریض به دو نیمه تقسیم و مختصات پیکسلی مربوط به دو نیمه کانتور، در یک لیست خالی ذخیره میشوند.
در این مرحله، تصاویر استخراج شده از حروف باید به وسیله نام صحیحشان ذخیره شوند. به عنوان نمونه، تصاویر مربوط به حرف (2) باید به شکل ذخیره شود. همانطور که پیش از این نیز اشاره شد، نام انتخاب شده برای هر کدام از تصاویر، نمایش دهنده حروف موجود در تصویر است. به عبارت دیگر، برای ذخیره تصاویر حروف توسط نام صحیحشان، لازم است تا هر کدام از حروف شناسایی شده در تصویر را به وسیله حرفِ متناظر با آن در نامِ فایلِ تصویر ذخیره کنیم.
برای تطابق دادن تصاویر حروف با نام صحیح حروف، لازم است تا تصاویر حروف بر اساس مختصات پیکسلی آنها در محور X مرتبسازی و نام صحیح حروف، از چپ به راست و از روی نام فایل تصویر استخراج شوند. سپس، تصویر حروف از تصویر اصلی استخراج و از طریق فرایند «لایهگذاری» (Padding)، دو پیکسل به حاشیه تصاویر اضافه میشود.
در مرحله بعد، پارامتر save_path با مکان فیزیکی مشخص شده برای ذخیرهسازی تصاویر حروف، مقداردهی میشود. سپس، تصاویر حروف استخراج شده در پوشههای جداگانه و براساس نام حروف ذخیره خواهند شد. از قطعه کد زیر، برای استخراج حروف از تمامی تصاویر کپچا در یک پوشه خاص، استفاده میشود.
تا این مرحله، تصاویر آموزشی لازم برای آموزش مدل یادگیری (تصاویر حروف موجود در کپچا) استخراج و ذخیره شدهاند. در ادامه لازم است تا تصاویر آموزشی استخراج شده «پیش پردازش» (Preprocess) شوند تا برای آموزش مدل شبکه عصبی پیچشی آماده شوند. برای چنین کاری، ابتدا تصاویر استخراج شده در محیط برنامهنویسی پایتون وارد و به تصاویر «سطح خاکستری» (Grayscale) تبدیل میشوند. از آنجایی که تصاویر استخراج شده ابعاد یکسانی ندارند، ابعاد این تصاویر باید توسط فرایندهای پیش پردازشی، به ابعاد دلخواه کاربر (X و Y دلخواه) تغییر کنند (Resize).
نکته مهم در مورد پیادهسازی شبکههای عصبی پیچشی با استفاده از کتابخانه Keras این است که دادههای ورودی توابع این کتابخانه باید سهبعدی باشند. از آنجایی که تصاویر سطح خاکستری حروف در کپچا، دادههای دوبعدی هستند، با استفاده از تابع (expand_dims) در کتابخانه numpy، یک بعد به ابعاد تصاویر سطح خاکستری حروف اضافه میشود. آرایه مرتبط با دادههای تصاویر حروف در یک «لیست» (List) خالی به نام data و «برچسب» (Label) دادهها (که مترادف با نام تصاویرِ حروف است) در لیستی به نام labels ذخیره میشوند.
برای بهینه کردن فرایند آموزش مدل یادگیری شبکه عصبی پیچشی، مقادیر پیکسلی تصاویر حروف به مقادیری بین صفر و یک نگاشت میشوند. در مرحله بعد، تمامی تصاویر موجود در مجموعه داده، به دو دسته «تصاویر آموزشی» (Training Images) و تصاویر «تست» (Test) یا «صحتسنجی» (Validation) تقسیمبندی میشوند. در ادامه، «متغیرهای هدف» (Target Variables) یا همان برچسبهای دادهها، توسط تابع LabelBinarizer در کتابخانه SciKit-Learn کدبندی خواهند شد.
ساختن و آموزش مدل شبکه عصبی پیچشی برای دور زدن کپچا
تا این مرحله، تمامی پیشنیازهای لازم برای ساختن یک مدل شبکه عصبی پیچشی آماده شدهاند. از مدل شبکه عصبی پیچشی برای استخراج متن از تصاویر و دور زدن کپچا استفاده میشود.
در این مرحله، با استفاده از توابع موجود در کتابخانه Keras جهت تولید «مدلهای ترتیبی» (Sequential Models)، یک مدل شبکه عصبی پیچشی ساخته خواهد شد.
در مرحله بعد، فرایند مدلسازی شبکه عصبی پیادهسازی شده با استفاده از دادههای آموزشی آغاز میشود. در این مطلب، برای جلوگیری از «بیشبرازش» (Overfitting) مدل شبکه عصبی پیچشی، از روش «توقف زودهنگام» (Early Stopping) استفاده میشود.

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

جمعبندی
روش ارائه شده برای دور زدن کپچا در این مطلب، برای نوع خاصی از تصاویر کپچا بسیار عالی عمل میکند. با این حال، انواع مختلفی از کپچا با درجه پیچیدگی متفاوت وجود دارند و مدل شبکه عصبی ارائه شده در این مطلب، در تمامی این حالات، عملکرد خوبی از خود نشان نخواهد داد.
هدف این مطلب، آموزش پیادهسازی یک سیستم مبتنی بر یادگیری برای دور زدن کپچا و آشنا کردن خوانندگان و مخاطبان این مطلب با فرایندهای اساسی و لازم برای پیادهسازی یک سیستم بینایی کامپیوتر ساده و شخصی شده برای استخراج متن از تصاویر و دور زدن کپچا است.
اگر نوشته بالا برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای دادهکاوی و یادگیری ماشین
- آموزش اصول و روشهای دادهکاوی (Data Mining)
- مجموعه آموزشهای هوش مصنوعی
- پردازش تصویر در متلب — راهنمای جامع
- پیشبینی سهام با شبکههای عصبی مصنوعی در پایتون — راهنمای کاربردی
- پیشبینی قیمت بیتکوین با شبکه عصبی — راهنمای کاربردی
^^
کد رو کپی کردم بدون اینکه خطا داشته باشه هیج نتیجه ایی هم نداره . من ادرس فایل تصویر کپچا و پوشه ی solv و output رو ست کردم فقط. اما کار نمیکنه
سلام شما تونستی بااین کد کپچا حل کنی ممنون میشم بهم بگید
سلام
ممنون بابت اطلاعات مفید
اگر بخوایم اصلا به کپچا برنخوریم چطور راهی هست؟
سلام
وقت شما بخیر
شما میتونید رباتی رو برای رد کردن کپچای فرم بنویسین؟