اندکی تجربه از پروژه هوشمند تشخیص کپچا

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

به نظر من بد ترین کپچا رو گوگل داره. اونم از این نوعش:

یا این مدلش:

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

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

من به کپچا گوگل کاری ندارم و مورد مطالعه خودم رو روی کپچا هایی مثل مدل زیر گذاشتم (یعنی یک رشته هست که توی تصویر قرار داره و باید تشخیص داد.):




آشنایی با انواع مختلف کپچا ها

خب در ابتدا نیاز هست با هم انواع مختلف کپچا ها رو بررسی کنیم.

سختی کپچا ها می تونه به عامل های زیر بستگی داشته باشه:

  • چرخش حروف
  • تصادفی بودن رنگ حروف
  • زیاد بودن حرف ها
  • کم بودن فاصله حروف از همدیگه
  • ثابت نبودن مکان حروف
  • وجود خط روی حروف
  • کم کردن وضوح
  • و ...

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

مثال 1: این کپچا خیلی ساده هست چون :

  • مکان حروف ثابت هستند.
  • حروف چرخشی ندارند.
  • تصویر سیاه و سفید هست.

مثال 2 :
در مقایسه با مثال 1 حروف آن کمی چرخش دارد.

مثال 3:
این تصویر هم در پس زمینه و هم در رنگ فونت وضوح کمی داره.

مثال 4:
در مورد زیر می بینید که چقدر کپچای سختی هست. یعنی شاید از هر ده نفر 6 نفر بتونن این کپچا رو درست وارد کنند. چون :

  • مکان قرار گیری حروف نظم خاصی نداره.
  • تنوعی در فونت حروف دیده میشه.
  • برخی حروف مثل c برعکس هستند.
  • اندازه فونت متغیر هست.

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

حالا چطوری برنامه هوشمند رو بسازیم؟

به طور کلی برای ساخت یک همچین برنامه ای مراحل زیر نیاز هست:

فرض کنید ما 2000 هزار تصویر کپچا داریم که برچسب گذاری شده اند.
(منظور از برچسب جمله ای که توی تصویر هست تلقی میشه. در تصویر زیر این برچسب ها به نام فایل هستند.)
مثلا:

حالا میایم توی گام دوم آماده سازی این تصاویر رو انجام می دیم.
به عنوان مثال اگه تصاویر سه کاناله (RGB) باشه، به تک کاناله (GRAY SCALE) تبدیلش می کنیم. یعنی تصاویر به سیاه و سفید تبدیل میشن. (البته این مثال هست! همیشه هم اینطور نیست! درواقع بستگی به نوع کپچا داره.)

در نهایت به الگوریتم یادگیری ماشین می دیم که یادگیری رو انجام بده.

چالش ...

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

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

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

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

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

در مورد کپچای بالا که متشکل از اعداد و حروف هست، خیلی وقتا مدل ما تمایزی بین عدد 0 و حرف O انگلیسی قائل نمی شه. و این یعنی خطای مدل.

نتیجه گیری

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

امیدوارم نوشته امروز براتون مفید بوده باشه.

از همراهیتون صمیمانه ممنونم.