Python -da captcha -ni dekodlash. Testumo universal tanuvchi CAPTCHA CAPTCHA

Vir_shiv trohi poduzhati Python, ale dolaê "abi not pkhp" tsykavo emas. Korislivimga qiziqish ortdi Python CAPTCHA avtomatik hal qilish.

Men 2012 yilda Xabradan xabar yubormoqchiman (2009 yilda grafik kutubxona).
Kod: https://habrahabr.ru/post/149091/

Qutining pastki qismida varto 2.7.10, kod esa 2.5 ostida yozilgan (har qanday PIL bilan). 2.7.3 da yozishni boshlash oson.

PIL o'qi raqamlangan
Kod: # yuklab olish
curl -O -L http://effbot.org/media/downloads/Imaging-1.1.7.tar.gz
# ekstrakt
tar -xzf Tasvirlash -1.1.7.tar.gz
CD tasvirlash-1.1.7
# Qurish va o'rnatish
python setup.py tuzilishi
sudo python setup.py ni o'rnating
# Yoki administrator ruxsatini talab qilmasdan uni faqat siz uchun o'rnating:
# Python setup.py install --user

Keyin modulni eksa bo'ylab import qiling

Kod: # konsolda yozing
piton
# Tarjimonni yoqing, bu buyruq
PIL import qilish
# Hammasi yaxshi, kirish uchun Ctrl + D tugmalarini bosing

Ilon kirill alifbosi bilan do'st emas, faylga dizayn qo'shib qo'ydi (asl nusxaga izoh berish mumkin bo'ldi)
Kod: # - * - kodlash: utf -8 - * -

Dingil - bu velosipedning o'zi (men pastadir yozishni bilmayman, qanday baho berishni bilmayman, bu mening qo'lim bilan).

Kod: # - * - kodlash: utf -8 - * -
#Tsya u rus ramzlari uchun kerak

PIL import rasmidan

itemgetter operatori importidan


im = im.convert ("P")
uning = im.histogramma ()
qadriyatlar = ()

i uchun (256):
qadriyatlar [i] = uning [i]

j, k uchun tartiblangan (values.items (), key = itemgetter (1), teskari = To'g'ri) [: 15]:
chop etish "yoki pix ==", j #, k

# Qishda eng mashhur o'nta tirnoq mavjud

PIL import rasmidan

im = Image.open ("captcha.gif")
im = im.convert ("P")

im = im.convert ("P")

x uchun diapazonda (im.size):
y uchun diapazonda (im.size):
pix = im.getpixel ((y, x))
temp = piksel
#Sudi koloru
im2.piksel ((y, x), 0)

im2.save ("output.gif")

# Bu erda nachebto hamma narsani biladi

PIL import rasmidan

im = Image.open ("output.gif")
im = im.convert ("P")
im2 = Image.new ("P", im.size, 255)

im = im.convert ("P")

x uchun diapazonda (im.size):
y uchun diapazonda (im.size):
pix = im.getpixel ((y, x))
temp = piksel
agar pix == 255: # bu raqamlar
im2.piksel ((y, x), 0)

# Yangi kod shu erda boshlanadi

kirish = noto'g'ri
topilgan xat = noto'g'ri
boshlash = 0
oxiri = 0


pix = im2.getpixel ((y, x))
agar piksel! = 255:
kirish = To'g'ri
topilgan xat = To'g'ri
boshlash = y


topilgan xat = noto'g'ri
oxiri = y
harflar qo'shish ((boshlanishi, oxiri))

Kirish = noto'g'ri
harflarni chop etish

# bilish

VectorCompare klassi:
def kattaligi (o'z -o'zidan, kelishuv):
jami = 0
so'z uchun, concording.iteritems () da hisoblang:
jami + = hisoblash ** 2
matematikani qaytarish.sqrt (jami)

Def munosabati (o'zini, kelishuv1, kelishuv2):
aloqadorlik = 0
topvalue = 0
so'z uchun, muvofiqlikda hisoblang1.iteritems ():
agar muvofiqlik2.has_key (so'z):
topvalue + = count * muvofiqligi2
qaytish topvalue

# Belgilar to'plami

PIL import rasmidan
hashlib import qilish
import vaqti

im = Image.open ("captcha.gif")
im2 = Image.new ("P", im.size, 255)
im = im.convert ("P")

im.histogrammani chop etish ()

x uchun diapazonda (im.size):
y uchun diapazonda (im.size):
pix = im.getpixel ((y, x))
temp = piksel
#Sudi koloru
agar pix == 187 yoki pix == 224 yoki pix == 188 yoki pix == 223 yoki pix == 145 yoki pix == 151 yoki pix == 181 yoki pix == 144 yoki pix == 225 yoki pix == 182 bo'lsa yoki pix == 189 yoki pix == 12 yoki pix == 17 yoki pix == 139 yoki pix == 152: # yoki pix ==
im2.piksel ((y, x), 0)

kirish = noto'g'ri
topilgan xat = noto'g'ri
boshlash = 0
oxiri = 0

y uchun diapazonda (im2.size): # tilim bo'ylab
diapazonidagi x uchun (im2.size): # tilim pastga
pix = im2.getpixel ((y, x))
# Mana bulo "tayyor emas 255" tobto - bulo "bilomga tayyor emas"
agar pix == 255 bo'lsa:
kirish = To'g'ri

Agar topilgan xat == noto'g'ri va kirish == rost bo'lsa:
topilgan xat = To'g'ri
boshlash = y

Agar topilgan xat == rost va kirish == noto'g'ri bo'lsa:
topilgan xat = noto'g'ri
oxiri = y
harflar qo'shish ((boshlanishi, oxiri))
kirish = noto'g'ri

# Yangi kod bu erda. Biz har bir tasvirni ajratib olib, diskka saqlaymiz
# Umid qilamanki, bu noyob ism

hisoblash = 0
harfli xat uchun:
m = hashlib.md5 ()
im3 = im2.crop ((harf, 0, harf, im2.size))
m. yangilash ("% s% s"% (time.time (), son))
im3.save ("./% s.gif"% (m.hexdigest ()))
hisoblash + = 1

Robotlarning printsipi quyidagicha: gistogrammani buking, ekranning katta qismini tartibga soling, agar siz oq-qora rangni juda ko'p yo'qotib qo'ysangiz, chiziqlar bo'ylab belgilarni sindirib tashlang, ramzlarni buzib tashlang.

Original captcha, 10 ta ommabop ko'rinishlarsiz, 15 ta mashhur ko'rinishlarsiz (ramzlarga aylanmasdan - belgidan ko'proq).

Asl captcha, 15 ta mashhur tursiz, 2 ta belgiga bo'linadi (qattiq).

Oddiy captcha uchun o'quvchi uni chindan ham yuvib tashlagan. Tugatish va yugurish uchun oddiy captcha uchun zarur fokuslar.

Yaxshi soat, tugating! Yaqinda deyakidan keyin sizga "tsikavih" dan Pythonda captcha kerak bo'ladi. Google -ga hayron bo'lish va ularsiz hech narsa Django urish emas. Natijada, biz visnovkani ko'ramiz, men yak okreme yozmayman WSGI qo'shimcha, lekin faqat CGI skript

Buv orqa tasvirli tasvirli robotlar uchun Python tasvirlar kutubxonasi... Afsuski, PIL, ha, kontekstda ozgina energiya bor PHP -da GD2.

Python 2 va 3 versiyalari uchun paketni bu erdan yuklab olishingiz mumkin: http://www.lfd.uci.edu/~gohlke/pythonlibs/

Men darhol sizni hurmat qilmoqchiman Python 3.1 Python 2.6+ ni ishga tushirish mumkin deb o'ylayman.

Shunday qilib, ayblov natijasida, ramz asosida 5-6 ta belgi tasvirining paydo bo'lishi tan olinadi.

Shunday qilib, biz arxivlarni tayyorlayotganimizda, men bu erda viklad emasman, hamma narsa standartga muvofiq bo'ladi.

Kataloglar va hujjatlar:

Cgi-bin
-kapcha
-orqa fon
-shriftlar
-indeks.py

Menimcha, bu ajoyib, lekin cgi-bin papkasida fon va shriftlarda captcha papkasi va index.py skriptining o'zi bor.

Endi bizga fon kerak. "Orqa fonda" google. Xaritalar va sifatli qismlar 15-20. Formatda o'lchamlari 200x60 piksel bo'lgan bunday to'rtburchaklar qutilarni qurish kerak Jpeg.

Hamma narsa fon papkasiga o'tadi.

Endi shriftlar. Biz TrueType shriftlar (* .ttf). Biz shriftlar papkasida 15 dona qadoqlangan va kidmo shriftlarini olamiz.

Barcha fon, shriftlar, endi index.py o'zi.

Chop etish ("Kontent turi: image / jpeg"); chop etish (""); import sys, os, re, tasodifiy PIL importidan Image, ImageFont, ImageDraw class captcha (object): def __init __ (self): self.string = ""; self.root = os.getcwd (); self.path_backgrounds = self.root + " / backgrounds /"; self.path_fonts = self.root + " / shriftlar /"; def gen_string (o'zini): belgilar = ("a", "b", "d", "e", "f", "g", "h", "j", "m", "n", "") q "," r "," t "," u "," y "," A "," B "," D "," E "," F "," G "," H "," J " , "M", "N", "Q", "R", "T", "U", "Y", "1", "2", "3", "4", "5", " 6 "," 7 "," 8 "," 9 "); i uchun diapazonda (random.randint (5, 6)): self.string + = belgilar; return self.string; def gen_backgrounds (o'zini): tasvirlar =; agar os.path.exists (self.path_backgrounds): os.listdirda f uchun (self.path_backgrounds): agar os.path.isdir (self.path_backgrounds + "/" + f): davom eting; agar re.search ("\. (jpeg | jpg) $", f, re.IGNORECASE): images.append (self.path_backgrounds + "/" + f); boshqa: sys.exit (); if len (rasmlar) == 0: sys.exit (); rasmlarni qaytarish; def gen_fonts (o'zini): shriftlar =; agar os.path.exists (self.path_fonts): os.listdirda f uchun (self.path_fonts): agar os.path.isdir (self.path_fonts + "/" + f): davom eting; agar re.search ("\. (ttf) $", f, re.IGNORECASE): fonts.append (self.path_fonts + "/" + f); boshqa: sys.exit (); if len (shriftlar) == 0: sys.exit (); shriftlarni qaytarish; def gen_image (o'zini): string = self.gen_string (); fon = self.gen_backgrounds (); shriftlar = self.gen_fonts (); image = Image.new ("RGB", (200,60), "#FFF") chizish = ImageDraw.Draw (rasm); i uchun diapazonda (5): fon = Image.open (fonlar); x = tasodifiy.randint (0, 160); cp = background.crop ((x, 0, x + 40, 60)); image.paste (cp, (i * 40, 0)); if len (string) == 5: x = random.randint (25, 30); else: x = random.randint (8, 11); string uchun char uchun: shrift = shriftlar; y = tasodifiy.randint (5, 25); font_size = random.randint (24, 30); color_dark = "rgb (" + str (random.randint (0,150)) + "," + str (random.randint (0,100)) + "," + str (random.randint (0,150)) + ")"; color_font = "rgb (" + str (random.randint (50,200)) + "," + str (random.randint (0,150)) + "," + str (random.randint (50,200)) + ")"; ttf = ImageFont.truetype (font, font_size) draw.text ((x + 1, y + 1), char, fill = color_dark, font = ttf) draw.text ((x, y), char, fill = color_font, shrift = ttf) x + = tasodifiy.randint (13, 15) + 18; image.save (sys.stdout, "JPEG") cp = captcha (); cp.gen_image (); # Cp. string; belgilar qatori

Hamma narsadan. Men uchun http: //localhost/cgi-bin/captcha/index.py manzili ortida rasm yaratilgan. Keyin hosil qilingan qatorlarni yaratish mexanizmini qo'shishingiz mumkin ( cp.tarmoq) Baribir sessiyalarda de-nebud.

Є CAPTCHA -ni chetlab o'tishning turli usullari, masalan, o'g'irlangan saytlar. Birinchidan, maxsus xizmat, shuningdek arzon qo'lda ishlash va tom ma'noda 1 dollarga 1000 ta captcha sotish mumkin. Shu bilan bir qatorda, intellektual tizimni yozishga urinish mumkin, xuddi qo'shiq algoritmlari to'g'ri echimni aniqlash uchun ishlatiladi. Qolganini qo'shimcha maxsus xizmatlar uchun amalga oshirish mumkin.

Virishiti CAPTCHA

CAPTCHA dizayni ko'pincha xususiy emas. Tasvirga ko'plab yosh filtrlarni o'rnatish, tozalash va o'zgartirish kerak, chunki ishlab chiquvchilar farq qilmoqchi. Ko'pincha, tizimni neyronli ramka asosida amalga oshirish mumkin (bu juda aniq emas, siz boshlashingiz mumkin), captcha -larning avtomatlashtirilgan echimida maqbul natijaga erishish. Aqlli bo'lish uchun men bu haqda gapirayapman, arxivlarni o'qish va "Yomon CAPTCHA: nazariya va amaliyot" maqolasining mo''jizalarini o'qish yanada chiroyli. Yoq lamayut captchas "va" ni tanlang va ko'ring. Yomon Captcha-filtrlari »har bir holatda 135 va 126 raqamlardan. Bugun men sizga TesserCap taqsimoti haqida aytmoqchiman, chunki muallif CAPTCHA universal hal qiluvchi deb ataydi. Tsikava bo'lagi, yak burilmaydi.

Birinchi qarashda TesserCap

Dasturlarning muallifi nima? Siz CAPTCHA -ning avtomatlashtirilgan yechim muammosiga o'tishni va reklamani bitta vositada sinab ko'rishni xohlaysizmi, deb o'ylaysiz. Muallifni hurmat qilgan holda, tasvirdan shovqinni ko'rish uchun, shuning uchun captchas uchun eng yaxshi aktsiyalarning echimi yaratiladi, ko'pincha filtrlar turg'un bo'ladi. Agar siz biror asbobni qo'llamoqchi bo'lsangiz, matematik qayta ishlashni katlamasdan tasvirga filtrlarni qo'yishingiz mumkin va siz matnni tanib olish uchun OCR tizimidan foydalanishingiz mumkin, keyin siz dasturni qutidan chiqarib olishingiz mumkin. Tse, vlasne, men McAfee'dan Gurs Singx Kalreni mag'lubiyatga uchratdim. Endi sizga kerakmi? Muallif bunday darajani qayta ko'rib chiqish, buyuk manbalarning ishonchli kaltakini topish uchun ishlatgan. Boullarni sinab ko'rish uchun biz statistika xizmatining mavjud versiyasi uchun eng yangilangan Internet -saytlarni tanladik. Vikipediya, eBay kabi yirtqich hayvonlar, shuningdek reCaptcha captcha provayderi sinov taqdiriga nomzod bo'lishdi. Agar siz guruchda dasturlarni ishlash tamoyiliga qarasangiz, biz soddaligiga chidashimiz kerak. Tizimga kirish uchun Vixidna captcha tobut oldida Rasm, captcha-ni har qanday shovqindan va OCR tizimining uzatuvchi tasvirining usulidan tozalaydi, chunki u matnni yangisiga o'tkazadi. TesserCap interaktiv grafik interfeysi va quvvatiga ega:
  1. Rasmni frontal qayta ishlashning universal tizimi mavjud, chunki captcha teri yuzasini sozlash mumkin.
  2. Tesseract tizimini o'z ichiga oladi, bu avval tahlil qilingan va tayyorlangan CAPTCHA tasviriga asoslangan matn.
  3. Pidtrimu vikorystannya izníkh koduvannya in sistemy izpiznavannya.
O'ylaymanki, aqlning zm_sti, men bunga hushyor odam kabi hayron bo'laman. Kommunal xizmatlarning ko'p qirraliligi interfeysning tezlashishiga olib kela olmadi, bu esa dasturlar yordamida biroz chalkashlikka olib kelishi mumkin. Shunday qilib, yakdan oldin, captcha bo'shatilgunga qadar o'rtasiz davom eting va interfeysdan foydalaning va funksionallikni qo'shing.
Old obrobny tasvir va ritsar
captcha bilan matn

Haqida

Biz yordam berolmadik, lekin men mo''jizaviy TesserCap kommunallari muallifiga pul tikmoqchiman. Yogo Gurs Singx Kalrega o'xshaydi. U McAfee omborining bir qismi bo'lgan Foundstone kompaniyasining professional xizmatlarining bosh maslahatchisi. Gurslar ToorCon, NullCon va ClubHack kabi konferentsiyalarda qatnashgan. Є TesserCap va SSLSmart vositalari muallifi. Krym tsyogo, kompaniyaning ichki ehtiyojlari uchun asboblar zanjirini buzdi. Ko'chib yuruvchi dasturlar - Ruby, Ruby on Rails va C #. Foundstone® professional xizmatlari, bu holda u pratsyuê, ekspert xizmatlarini tashkil etish tarafdorlari va yangi kelganlar, aktivlarni eng jiddiy tahdidlardan doimiy ravishda himoya qila olmaydi. Professional xizmatlar jamoasi galuzi xavfsizlik va chakana savdo kompaniyalarining bilimli mutaxassislari bilan to'ldirilgan, chunki ular xalqaro korporatsiyalar va davlatga qarashli kompaniyalar haqida ko'p ma'lumotga ega bo'lishlari mumkin.

Interfeys. Asosiy yorliq

Dasturlarni ishga tushirish uchun oldimizda uchta yorliqli oyna bor: Asosiy, Tanlovlar, Tasvirni oldindan qayta ishlash. Asosiy yorliq-bu CAPTCHA-tasvir testini ishga tushirish va yangilash, test statistikasini tuzish (javoblar yo'q, lekin yo'q), navigatsiya va tasvirni oldingi ishlov berish uchun tanlash mumkin bo'lgan boshqaruv elementlarini o'rnatish. URLni kiritish maydonida (nazorat elementi No1) aniq URL aybdor, bu captcha uchun veb -addon. URLni keyingi daraja bilan tanib olish mumkin: CAPTCHA tasvirining o'ng tomonini bosing, nusxa ko'chiring yoki havola kodini va src atributining URL manziliga qarang ..site / common / rateit / captcha. asp ?. Manzil qatori yonida bir nechta captcha tayinlaydigan element mavjud bo'lib, ular sinov uchun qo'shilishi kerak bo'ladi. Shunday qilib, qo'shimcha sifatida, siz bir soatda atigi 12 ta tasvirni, chigallashgan kapchalarning gırtlaktan keyingi boshqaruv elementlarini yangi uzatishda ko'rsatishingiz mumkin. Bunday darajada, keng ko'lamli test bilan, kapchalarni haddan tashqari oshirib, ularning dizayn natijalarini ko'rish mumkin. Ishga tushirish va to'xtatish tugmalari har safar testni boshlaydi va to'xtatadi. Sinov uchun tasvirning natijalarini baholash kerak, ya'ni terining to'g'ri yoki noto'g'ri ekanligi. Xo'sh, oxirgi narsa, eng muhim vazifa - bu tasvirni shovqini va ishlashini ko'rib turganingizdek, filtr o'rnatilgan oldingi ishlov berish tizimiga har qanday tasvirni o'tkazishga xizmat qilish. Rasmni oldingi ishlov berish oldidagi tizimga o'tkazish uchun kerakli tasvirni sichqonchaning o'ng tugmasi bilan bosish kerak. kontekst menyusi Rasmni oldindan ishlovchiga yuborish -ni tanlang.

Interfeys. Tanlovlar yorlig'i

TesserCap konfiguratsiyasi uchun keruvanny elementlarini sozlash uchun Tanlovlar yorlig'i. Bu erda siz OCR tizimini tebratishingiz, veb-proksi-server parametrlarini o'rnatishingiz, tasvirni qayta yo'naltirish va oldingi ishlov berishni yoqishingiz, HTTP sarlavhalarini qo'shishingiz, shuningdek tizim va tanib olish uchun belgilar oralig'ini belgilashingiz mumkin: raqamlar, harflar pastki registr, harflar yuqori registr, maxsus belgilar. Endi terining varianti haqida batafsilroq. Birinchidan, siz OCR tizimini tebratishingiz mumkin. O'zgartirish uchun faqat bittasi - Tesseract -ORC mavjud, shuning uchun siz vibor bilan alday olmaysiz. Yana bir hiyla - bu dasturlarning kuchi - ramzlar diapazonini tebranish. Ehtimol, masalan, saytdan captcha - shuni ko'rish mumkinki, xat uchun qasos olishning hojati yo'q, faqat raqamlardan. Xo'sh, biz noto'g'ri dizayn sifatini yaxshilash uchun ramzlarni o'z qo'limizga olsak nima bo'ladi? Ale scho yaksho vibrati Katta harfmi? Captcha -ni tanib olishni qanday dasturlash mumkin, qanday qilib ajoyib harflar bilan qurish mumkin? Siz qilolmaysiz. Dasturda \ Program Files \ Foundstone Free Tools \ TesserCap 1.0 \ tessdata \ configs -da joylashgan konfiguratsiya fayllarini olish uchun ishlatilishi mumkin bo'lgan belgilar ro'yxati keltirilgan. Tushuntirishga ruxsat bering: agar raqamlar va kichik harflar variantlari tanlangan bo'lsa, dastur past raqamli faylga qaytadi va u tessedit parametridan qaytariladi. char oq ro'yxat. Undan keyin captcha displeyi uchun g'olib bo'ladigan ramzlar ro'yxati keladi. Fayllardagi o'zgarishlar uchun faqat lotin alifbosidagi harflarni topish mumkin, shuning uchun kirill talablarini ishlab chiqish uchun belgilar ro'yxatini o'zgartiring yoki qo'shing. Endi Http so'rov sarlavhalari maydoni zarur bo'lganlar haqida uchta so'z bor. Masalan, captcha olish uchun ba'zi veb -saytlarga kirish kerak. TesserCap captcha -ga kirishni rad etishi mumkin, dastur HTTP sarlavhalarini, masalan, Accept, Cookie va Referrer va boshqalarni o'tkazishi kerak, ularni qayta yozish kerak bo'ladi. Yana bir variant, Nagodada ohangdor hayratda qolganidek, "Qayta yo'naltirishlarni kuzatish". O'ng tomonda, TesserCap javoblarni qayta yo'naltirishga amal qilmaydi. Sinov URL -ning aksariyati tasvirni olib tashlash uchun tasvirni qayta yo'naltirishda aybdor, siz variantni tebratishingiz kerak. Xo'sh, qolgan variant yo'qolgan, bu bizdan uzoqda joylashgan tasvirni oldingi ishlov berish mexanizmini o'z ichiga oladi / yoqadi. Oldidagi o'zgarish uchun tasvir yoqilgan. Kichkina miqyosda doljin, old tasvir oldidagi filtrlarni rostlang. CAPTCHA tasviri sinovdan o'tkazildi va keyin modul yoqildi. Rasmni qayta ishlashni yoqish opsiyasi yoqilganda yoqilgan barcha CAPTCHA-tasvirlar oldingi ishlovdan o'tadi va keyin matnni qayta ishlash uchun Tesseract OCR tizimiga o'tkaziladi.

Interfeys. Rasmni oldindan qayta ishlash yorlig'i

Xo'sh, mi o'qi yangi varaqqa o'tdi. Aynan shu erda filtrlar o'sayotgan shovqin va o'sishning captchalarini vizualizatsiya qilish uchun o'rnatiladi, chunki tizimni o'rnatish tezligini maksimal darajada oshirish mumkin. Umumjahon filtrni o'rnatish jarayoni chegarada oddiy va to'qqiz qadamni oladi. Teri sahnasida ilonning tasviri tasvirning old qismidan oldin paydo bo'ladi. Bundan tashqari, boshqa tomondan, filtr qo'llanilganda captcha to'g'riligini baholash imkonini beruvchi konversion komponent mavjud. Teri bosqichining aniq hisoboti. Bosqich 1. Rangni o'zgartirish Bu bosqichda CAPTCHA tasviri uchun piksellar rangi teskari bo'ladi. Quyidagi kod uni qanday ko'rishni ko'rsatadi: uchun (har bir piksel CAPTCHAda) (agar (invertRed rost bo'lsa) yangi qizil = 255 - joriy qizil bo'lsa (invertBlue rost bo'lsa) yangi ko'k = 255 - agar ko'k bo'lsa (invertGreen to'g'ri bo'lsa) yangi yashil = 255 - hozirgi yashil) Bir yoki bir nechta dekorativ ranglarning teskarisi ko'pincha CAPTCHA -ning tekshirilgan tasvirini teskari o'zgartirish uchun yangi imkoniyatlar ochadi. 2 -bosqich Bu bosqichda siz tasvirning barcha tasvirlari uchun komponent rangini o'zgartirishingiz mumkin. Teri raqami maydoni 257 ( 1 dan 255 gacha) mumkin bo'lgan qiymatlarga ega. Teri pikselining RGB-komponentlari uchun mo'l-ko'l, maydon qiymati quyidagicha:
  1. Yo'l qiymati -1 bo'lsa -da, o'ziga xos rang komponenti o'zgarmaydi.
  2. Agar qiymat -1 ga mos kelmasa, belgilangan rangning barcha ma'lum komponentlari (chervoniya, ko'katlar yoki ko'k) maydonlarga kiritilgan qiymatlarga qarab o'zgaradi. 0 qiymati komponentni ko'rdi, 255 qiymati, bu maksimal intensivlikni va boshqalarni o'rnatadi.
3 -bosqich. Kulrang rang (rang shkalasi) Uchinchi bosqichda barcha tasvirlar kulrang gradatsiyalardagi tasvirlarga aylanadi. Qayta tasavvur qilinadigan tasvirning bitta obovazkovy bosqichi, uni o'tkazib yuborib bo'lmaydi. Keyingi qadamlardan biri, koloniya omborining teri pikselidan bog'langan:
  1. O'rtacha -> (Qizil + Yashil + Moviy) / 3.
  2. Odam -> (0,21 * Qizil + 0,71 * Yashil + 0,07 * Moviy).
  3. Minimal va maksimal rang komponentlarining o'rtacha qiymati -> (Minimal (Qizil + Yashil + Moviy) + Maksimal (Qizil + Yashil + Moviy)) / 2.
  4. Minimal -> Minimal (Qizil + Yashil + Moviy).
  5. Maksimal -> Maksimal (Qizil + Yashil + Moviy).
CAPTCHA rangli omborining intensivligi va taqsimlanishidan qat'i nazar, bir nechta filtrlardan bo'lsin, siz tasvirni keyingi ishlov berish uchun o'zgartirishingiz mumkin.
4 -bosqich. Yumshoqlik va egiluvchanlik CAPTCHA-tasvir yordamida matnni tezlashtirish uchun ular bitta pikselli yoki ko'p pikselli nuqtalar, yon chiziqlar va keng sahnalar ko'rinishida shovqin qo'shadilar. Rasm tekislanganda, kichik shovqin paydo bo'ladi, buning uchun chelak yoki kesish filtri ishlatiladi. Pass maydonining raqamli maydoniga murojaat qilish kerak, garchi hujum bosqichiga o'tishdan oldin tasvir niqobini yaratish zarur bo'lsa. Keling, filtrning o'lchamlarini tekislash va sozlash uchun komponentlarini ko'rib chiqaylik. Tasvir niqoblarining ikki turi mavjud:
  1. Ruxsat etilgan niqoblar. TesserCap eng mashhur tasvir niqoblariga ega. Tsi niqoblari tasvirni yaxshiroq ko'rsatishi yoki hajmini oshirishi mumkin (Laplasning ixtirosi). O'zgarishlar qo'shimcha tugmalar orqasida niqob tanlanganidan so'ng darhol ko'rsatiladi.
  2. Rasm niqobi uchun mo'ljallangan. Raqamli maydonlarga qiymatlarni kiritish va Niqobni saqlash tugmasini bosish orqali tasvir niqobi parametrlarini sozlashingiz mumkin. nolga yaqin bo'lmagan tsixdagi kofitsíntív yig'indisi, siz kechirim ko'rasiz va niqob yopishmaydi. Ruxsat etilgan niqobni tanlashda Maskani saqlash tugmasi shart emas.
5 -bosqich. Yashildan tanishtirildi Bosqich oxirida tasvirni qayta ishlash har xil turdagi tasvirlarga bo'linishi mumkin. Butun filtr 20 chelak / diapazonda kulrang gradatsiyani ko'rsatadi. Yashil diapazonda saqlanadigan piksellar soni 0 dan 12 gacha, chelakdagi qiymatlar 0, yashil diapazonda saqlanadigan piksellar soni 13 dan 25 gacha, - 1 paqir tebranishida Teri diapazoni uchun bu qiymatlardan quyidagilar ko'rsatiladi:
  1. Oldingidek qoldiring.
  2. Bilim (oq) ni almashtiring.
  3. Qora bilan almashtiring.
Optika menejerlari kulrang rangdagi o'zgarishlarni, shuningdek tezlikni nazorat qila oladilar / shovqinni ko'radilar, kulrangni oq yoki qora tomon o'zgartiradilar. 6 -bosqich. Kesish Filtrni to'liq tushirish grafigi, populyatsiyaning hozirgi chastotasining ma'nosi va populyatsiyaning tebranishining tarqalishi bo'ladi. Quyida psevdokodda o'qishni robot bilan ko'rsatish printsipi: if (pikselning kulrang o'lchami)<= Cutoff) pixel grayscale value = (0 OR 255) ->kuzda, bu yaqindan, variant sotib olindi (<= или =>: Har bir pikselni qiymat bilan belgilang<=/=>Chegara 0. Qolgan 255) Ranglar uchun CAPTCHA tasvirlarining hisobotlari va kulrang qiymatini qo'shimcha ko'rsatish uchun qo'shimcha yordam ko'rsatiladigan grafik. 7 -qadam: kesish Paqir va CAPTCHA tasvirining boshqa filtrlari hali ham bitta pikselli yoki ko'p pikselli nuqtalar, tashqi chiziqlar va keng ruhlar bilan shovqinli bo'lishi mumkin. Hujum paytida maydonda robotli filtrlash printsipi: Daniyada yuklangan xulosalar soni, sonlar sonidagi qiymatdan kam bo'lsa, yig'ish uchun filtr 0 (jigarrang) ga to'g'ri keladi. 255. Keng CAPTCHA yordamida yaqut gorizontal va vertikal yo'nalishda tahlil qilinadi. 8 -bosqich: Kordon kengligi Kommunal xizmatlar muallifi sifatida, birinchi hisobotlar va TesserCap -ni ishlab chiqish jarayonida men uni bir marta ishlatmaganman, lekin agar CAPTCHA tasviri chegaradosh bo'lishi mumkin bo'lsa, u asosiy fon tizimi asosida ko'rinmasligi mumkin. Daniya filtri chegara chiziqlari va vx sharoblarini qayta ishlash uchun belgilar. Raqamli maydonda ko'rsatilgandek, kenglikdagi chegara chiziqlari qora qirg'oqda koristuvach vibori uchun jang qilinadi. 9 -qadam: Eski versiyani o'zgartirish Butun filtr teri pikselidan o'tadi va psevdokodda ko'rsatilgandek, yangisining ma'nosini almashtiradi. Inversiya tasvirni OCR tizimining kollin sozlamalaridan sozlash uchun amalga oshiriladi. (har bir piksel CAPTCHA uchun) yangi kulrang shkalasi = 255 - kulrang shkalaning joriy qiymati 10 -qadam: teskari captcha dizayni Bu qadamning meta-OCR-tizimining CAPTCHA-tasvirini old tomonga ishlov berish uchun old tomonga o'tkazish. Yechish tugmasi kulrang inversiya filtrining tasvirini oladi va matnni manipulyatsiya qilish va grafik interfeysida matn aylanishlarini ko'rsatish uchun OCR tizimiga yo'naltiradi. Qoida tariqasida, matn captcha -dagi matn bilan bog'langan, ya'ni biz oldingi ishlov berish uchun filtrni to'g'ri o'rnatganmiz. Endi siz "Tanlovlar" yorlig'iga o'tishingiz va blokirovka qilinadigan barcha blokirovkalarni qayta ishlash uchun "Tasvirni qayta ishlashni yoqish" ni yoqishingiz mumkin.

rozp_znaêmo captcha

Xo'sh, mabut, biz foydalanishning barcha variantlarini ko'rib chiqdik va endi norozilik bildirish uchun tavba qilmayapman, men o'yin -kulgi uchun captcha bo'ldim.
Captcha saytini old tomondan tahlil qilish natijasi
obrobkoy tasvir. Natijalarni baholang, filtrlang
Iltimos, jurnal saytida mo utilizatsiya va idemoni ishga tushirib, Otzeni qo'yib yubormang. Bachimo yangi yangi narsalar ro'yxatini, birinchi ro'yxatga o'ting va o'z fikringizni qoldirishingiz mumkin bo'lsa, oxirgi daqiqaga o'ting. Ha, sharhni qo'shish oson emas (bo'lardi, aks holda hamma narsa uzoq vaqt spamlangan bo'lardi) - siz captcha kiritishingiz kerak. Xo'sh, buni bekor qilish mumkin, qanday qilib avtomatlashtirish mumkin. Rasmning URL manzilini nusxa ko'chiring va kiriting manzil qatori TesserCap. Ko'rinib turibdiki, siz 12 ta captcha va hujumni boshlashingiz kerak. Dastur ovozli ravishda 12 ta rasmni qulflab qo'ydi va sinab ko'rdi. Achinarlisi shundaki, barcha captcha -lar aniqlanmagan, chunki ular bilmaydilar - yozish muvaffaqiyatsiz tugadi, yoki bu noto'g'ri. Zagalom, ajoyib emas, chunki tashqi tovushlar va ijro ko'rinmas edi. Biz hammasini birdaniga qilamiz va band bo'lamiz. Sichqonchaning o'ng tugmasi bilan 12 ta qo'shilgan rasmning birida bo'rttirma va oldinga ishlov berish tizimiga yuboriladi (tasvirni oldindan ishlovchiga yuborish). Bachimoning 12 ta captcha -lariga hurmat bilan qarang, faqat raqamlarni ochib yuboring, keyin variantlar ko'rinishida siz faqat raqamlarni ko'rsatishingiz kerak (Belgilar to'plami = raqamlar). Endi siz filtrlarni sozlash uchun "Tasvirni qayta ishlash" yorlig'iga o'tishingiz mumkin. Men darhol aytamanki, men birinchi uchta filtr bilan o'ynayman ("Inversion Colorah", "Zmína Koloru", "Gration Gray"), men ijobiy ijobiy ta'sir ko'rsatmadim, shuning uchun men u erda hamma narsani soya qilib qo'ydim. . Men Smooth Mask 2 tebranib, paslar sonini bittaga tenglashtirdim. Kulrang o'lchovli chelaklarni filtrlang Men o'tkazib yubordim va to'g'ridan -to'g'ri ekranning boshiga bordim. Vibratsiyali 154, va agar siz aytmoqchi bo'lsangiz, kichikroq piksellarni 0 ga, yuqori bo'lganlarni esa 255 ga qo'yish kerak. Ruxsat berish nuqtalarini aylanib o'tish uchun kesishni yoqing va kengligini o'zgartiring. cordon to 10. Men darhol Solve -ni tanladim. Captcha -da menda 714945 raqami bor edi, lekin dastur uni 711435 deb e'lon qildi. Tse, yak bachish, bu yaxshi emas. Kintsevoy sumkasida, men kurashmayotganim uchun, mendan captchani tan olish yaxshi edi va u ishlamadi. Men tajribani pastebin.com bilan o'tkazdim, chunki men dizaynga hech qanday muammosiz kirib keldim. Agar siz jo'jalar va jo'jalarga duch kelsangiz va saytdagi to'g'ri captchalarni kichraytirsangiz, darhol variantlar yorlig'iga o'ting va oldingi tasvirni qayta ishlashni yoqing (Tasvirni qayta ishlashni yoqish). Keyin "Asosiy" ga o'ting va "Ishga tushirish" tugmachasini bosib, sizning oldingizda filtr bilan yopiladigan captcha -larning bir qismini qulflang. Buning uchun, dastur ko'rsatilganda, bu captcha to'g'ri / noto'g'ri tan olinganligini bildiradi (tugmachalarni to'g'ri deb belgilash / noto'g'ri deb belgilash). Ayni paytda siz "Statistikani ko'rsatish" yordamining orqasida tarqatish statistikasini ko'rishingiz mumkin. Umuman olganda, bu CAPTCHA -ni o'g'irlash haqida yaxshi gap. Agar bitta yechimning tebranishi haqida ovqatlanishga arzigulik bo'lsa, TesserCap yordamida siz uni to'liq sinab ko'rishingiz mumkin.

Ommabop saytlarda CAPTCHA konvertatsiyasi natijasi

Veb -sayt va ishlab chiqilgan captcha -larning bir qismi:
  • Vikipediya> 20-30%
  • Ebay> 20-30%
  • reddit.com> 20-30%
  • CNBC> 50%
  • foodnetwork.com> 80-90%
  • Dailymail.co.uk> 30%
  • megaupload.com> 80%
  • pastebin.com> 70-80%
  • cavenue.com> 80%

visnovok

CAPTCHA-tasvir-bu avtomatlashtirilgan shakldagi saqlashdan Internetga asoslangan ma'lumotlarni olishning eng samarali mexanizmlaridan biri. Biroq, zaif kapchalar vypadkovy robotlarini qo'lga olishiga to'sqinlik qilishi va virusni aniqlovchi zondlari oldida turmasligi mumkin. Yak va kriptografik algoritmlar, CAPTCHA-tasvirlar, tekshirilgan va himoyalangan visokiy riven xavfsiz, o'zimiz eng chiroyli tarzda Men olaman. Statistik ma'lumotlarga asoslanib, muallifni dasturlar bilan bog'lagan holda, men o'z loyihalarim uchun reCaptcha -ni tanladim va buni barcha do'stlarimga tavsiya qilaman - siz namoyishlarning eng yaxshisini ko'rdingiz. Qaysi turdagi vipadku unutilmasligi kerak, lekin Merezada CAPTCHA avtomatlashtirilgan yechimini yaratish uchun ishlatilishi mumkin bo'lgan ko'plab xizmatlar mavjud. Maxsus API orqali siz tasvirni xizmatga o'tkazasiz va bir soat o'tgach, echimni o'zgartiring. Virishu captcha - bu haqiqiy lyudin (masalan, Xitoydan), o'z puliga otrimuyuchi. Bu erda hech kimga g'ayrat yo'q. Y

Men Boltiqbo'yi fanlari va muhandisligi tanlovida taqdim etgan robotning ismi menga rim odinichkali maftunkor otani, shuningdek, yangi noutbukni olib keldi.

Robot CAPTCHA dizayniga kirib, ajoyib operatorlarni ko'rsatdi uslublar uchun havola SMS yuborish shaklida va qabul qilingan xabarning samaradorligini ko'rsatmaydi. Agar siz g'ururlanmasangiz, biz ularni alegorik tarzda nomlaymiz: chervoniya, jovti, ko'katlar va ko'k.

Men loyihaning nomini rasmiy shaxs tomonidan qo'yaman Tutib olish va norasmiy Nosoz xavfsizlik choralarini buzish... Zbígi vipadkovi kabi bo'ling.

Yak ajoyib emas, hamma narsa (ehtimol hamma narsa) va CAPTCHA zaif bo'lib chiqdi. Eng past natija - 20% - xuddi shu operatorga tegishli, eng yuqori - 86% - ko'k. Bunday unvon bilan, men vvazha, zavdaniya "samarasizlik namoyishi" muvaffaqiyatli e'lon qilindi.

Chunki eng zamonaviy operatorlarni tanlash juda ahamiyatsiz. Shanov Science Journal -ga, men ular haqida hikoya qildim " stilistik operatorlar Qanchadan -qancha tangalar bo'lsin, yaxshi sifatli dasturchini toping va shu vaqtda spam miqdorini kamaytirish kerak; Agar siz bunday martabaga ega bo'lsangiz, siz stress bilan bardosh berishingiz kerak, men sizga oxirgi marta ko'rsatganimdek, siz unday emas. " Buning uchun hamma narsa sodda edi. Men oddiy CAPTCHA g'oyasini yomonlab, qizil operatorning CAPTCHA qurboni sifatida tebranib, qabul qilmoqchi edim. Va yana, orqaga qarab, visseral tarix tug'ildi.

Otjhe, tilga yaqinroq. Mendan ko'proq CAPTCHA turlarini yaratish uchun mega-ilg'or algoritm; Teri turi uchun 4 xil algoritm yozish o'rniga CAPTCHA okremo. Ammo tafsilotlari algoritmga ega bo'lganlar uchun umuman ahamiyatsiz, hid bir xil ko'rinardi.

Mendan oldingi ko'plab mualliflar singari, men ham CAPTCHA -ning asl dizaynini 3 vazifaga ajratdim: ishlov berish (oldindan ishlov berish), segmentatsiya va dizayn oldida. Oldindan ishlov berish bosqichida, vizual tasvirdan, yaratilgan va ishlab chiqarilgan juda ko'p shovqinlarni ko'rish mumkin. Chiqish tasviridan bo'linishda ba'zi belgilar ko'rinadi va keyingi ishlov berish amalga oshiriladi (masalan, burilish). Belgilar birma -bir tan olinsa, ular miyaning old tomonidan bo'linadi.

Bu faqat oldindan ishlov berish. Bu shuni anglatadiki, yangi CAPTCHA -da tasvirlarni yaratishning turli usullari mavjud, va tasvirlarni vizualizatsiya qilish algoritmlari juda farq qiladi. Segmentatsiya teginish tarkibiy qismlarining ahamiyatsiz qo'ng'iroqlar va hushtaklari bilan hazil qilishning asosiy g'oyasini ishlatdi (muhimlari qoraqo'tirlar orasida tilka rivojlanishiga olib keldi). Bulo nomi chotirohdagi uchta operator uchun mutlaqo bir xil - yana o'sha operator ko'rinadi.

Nareshty, bilim boshqa (10 pikseldan kam) qora joylarga bo'yaladi:

Inodí (idko, ale buvaê) xat qismlar zanjiriga tushadi; butun neoporozumnnya tuzatish uchun men oddiy evristikani tugatish uchun zasosovuyu, shuning uchun sezuvchanlikning ba'zi tarkibiy qismlari bitta belgiga borligini baholang. Taxmin qilinishicha, faqat gorizontal holatda yotish va teri belgisining chegara qutilarini tasvirlash kerak.

Ta'kidlash muhim emas, lekin tarqatish uchun zarur bo'lgan ko'plab ramzlar sezuvchanlikning bir komponentiga aylandi. Bu erda tasvirlarda aynan 5 ta belgining mavjudligi yordamga keladi. Bu terining ma'lum tarkibiy qismlarida belgilar mavjud bo'lgani uchun, ularni aniqlik bilan sanab o'tishga imkon beradi.

Robotlar tamoyiliga aniqlik kiritish uchun bunday algoritm apparat vositalarini o'z ichiga oladi. Muhimi, n uchun ma'lum segmentlar soni va kenglik qatori ( to'g'rimi, ha?) [N] kenglikdagi barcha segmentlar. Biz n> 5 bosqichlari ma'nosida yozilgan vvvazat qilamiz, dizayn tasviri uzoq emas. Butun musbat omborlar bo'yicha 5 -sonning barcha mumkin bo'lgan taqsimoti aniq. Їx boy bo'lmagan - hamma narsa 16. Teri, shuningdek, sezuvchanlikning ma'lum komponentlariga muvofiq, ramzlarning o'ziga xos tartibiga ega. Uni qo'yib yuborish mantiqan, shuning uchun segment Viyshov segmentidan kengroq bo'lsa, qasos olish ramziy bo'ladi. Ko'pgina taqsimotlar faqat tebranadi, bunda qo'shimchalar soni bir n. Teri elementi kenglikdan kenglikka sozlanishi mumkin - yak bi normalizêmo íkh. Usimadan o'sha propobimo raskladannymi bilan to'lib toshgan - faqat birinchi dodanok uchun ulardagi terining soni etarli. Va hozir (hurmat, kulminatsiya!) Ajablanarlisi shundaki, siz n-vimir makonidagi nuqta kabi adashtira olasiz. Evklidga eng yaqin bo'lgan uraxuvannyam tsogo bilan p'yatirkaning normal kengliklarga tarqalishi. Bu hazil natijasi.

Nutqdan oldin, shifrlash algoritmi bilan birgalikda, men omborlardagi barcha raqamlarni shukatining boshqa tsikaviy usuli haqida o'yladim, lekin men o'zimni ma'lumotlarning Python tuzilmalariga ko'mib tashlaganimni sezmadim. Qisqacha aytganda - buni qilish ham, hurmat qilish ham aniq, lekin qo'shiqchilarning tarqatilishlari soni Paskalning trikotnikidan topiladi. Xo'sh, eslayman, uzoq vaqt oldin algoritm ingl.

Shunday qilib, eksa, terining tarkibiy qismidagi belgilar soni tayinlanganda, evristikaga kiradi - bu muhimroq, lekin distribyutorlar ramzlardan ko'ra nozikroqdir. Shu maqsadda biz maxfiy bilimlarni tezlashtiramiz, u n -1 taqsimot segmentiga joylashtirilgan, de n - segmentdagi teri distribyutorining kichik chekkasida proektsiya bo'ylab yuborilgan bir qator belgilar. tasvirning pastga qarab. Dizayn natijasida biz terining yuzdan bir qismidagi belgilar bilan qoplangan bo'lishi haqida ma'lumot beramiz. Nareshti, terining proektsiyasida biz jinoyatchilar uchun tasvirni yaratadigan minimal va halokatli tudini bilamiz.

Nareshty, dizayn. Aytganimdek, yangisi uchun men neytral tarmoqning turg'unligiman. Menda birinchi marta sarlavha ostida ikki yuzta rasmlar to'plami bor poezd Xuddi shu yozuv va nagogodzheni pershi orqali ikki bosqich, natijada juda ko'p sonli, aniq aytilgan bo'laklarga ega papkani ko'rishim mumkin. Keyin, men o'z qo'llarim bilan smittyani tozalayman (masalan, natijalar noto'g'ri segmentatsiya), shuning uchun natijani bitta o'lchamga keltiraman va FANN tarqatilishiga yuboraman. Kirish joyida neyronlar tarmog'i qurilmoqda, buning natijasida rivojlanish g'olib bo'ldi. Sxema menga faqat bir marta berdi - oxiridan bir oz ko'proq.

Sinov to'plami natijasida (men yangi test uchun viktor bo'lganim uchun im'ya kodi - testlar to'plami) Taxminan 100 ta rasm to'g'ri aniqlanadi 45. Bu unchalik yaxshi natija emas - yogo, aniqki, masalan, oldingi jarayonni aniqlashtirish yoki dizaynni qayta ishlash mumkin, lekin rostini aytsam, men band bo'laman. zanjir.

Bundan tashqari, men algoritmning samaradorligini baholashning yana bir mezonini qo'lga kiritdim - o'rtacha qabr. Sharoblar shu tarzda hisoblangan. Teri tasviri uchun ma'lum bo'lishicha, Levenshteyn tasvir uchun o'ylash algoritmini va to'g'ri taqdimotni ko'rgan - buning uchun barcha tasvirlar uchun o'rtacha arifmetika olingan. CAPTCHA -ning har qanday turi uchun o'rtacha qiymat - 0,75 belgi / tasvir. Men qurishim kerak, bu juda ko'p tadqiqot emas, balki juda aniq mezon.

Nutqdan oldin, hamma joyda (operatordan tashqari) menda quyidagi sxema bor edi - poezdda 200 ta, testda 100 ta rasm.

Yashil

Men ko'kalamzorga hujum qilyapman - men matritsaning matritsalari bilan emas, balki jiddiyroq kurashmoqchi edim.

perevagi:

  • arzimas ta'sir
  • Burilish va o'zgartirish
  • asossizlik

kamchiliklar:

  • Belgilar fondan ko'ra quyuqroq
  • To'rtburchakning yuqori tomoni yaxshi ko'rinadi - siz qo'ng'iroq qilish uchun vikoristovuvati qilishingiz mumkin

Ko'rinib turibdiki, etarli bo'lmagan, lekin ahamiyatsiz bo'lganlarni boshqarish muhim emas edi va ularning ekspluatatsiyasi ularga o'tish joylaridan samarali o'tishga imkon beradi.

Men oldingi ishlov berishdan aniq bilaman. Otsenimo kut to'plami to'rtburchaklar burilishida, unda ramzlar bor. Chiquvchi tasvirdan oldin to'liq turg'unlik uchun Erode operatori (mahalliy minimal pochuk), keyin Threshold, to'rtburchaklar, nareshty, inversiya ortiqcha ko'radi. Otrimaêmo qora aphiddagi plyajdan ko'ra jozibali.

Biz muammoni hal qilishimiz kerak. Perche. Kutni baholash uchun, butun to'rtburchakni aylantiring va uni yuqoridan burab, bahoni yakunlang. Bir do'stimga. Yuqori tomonning burilishini taxmin qilish mumkin va to'g'ri, yon tomonga parallel surish. Uchinchi. To'g'ri, lekin qat'iy vertikal ekanligini tasvirlash uchun ikkita parametr etarli - vertikal bo'ylab koordinatalar markazigacha bo'lgan o'zgarish va kuta nahila, bizni faqat boshqalar tegadi. Chorak. Zavdannya hazilini hech bo'lmaganda katta qidiruv buzishi mumkin - hech qanday katta burilishlar, katta burilishlar yo'q, biz uchun yuqori aniqlik shart emas. Pyat. Kerakli aniqlik uchun, iloji boricha ko'proq tebranadiganga qanchalik yaqin bo'lganligi haqida to'g'ridan -to'g'ri teri bahosini yaratish mumkin. Shost. Naivazhivishe. Schob deyakiy kut nahilani to'g'ri baholaydi, aniqki, yuqoridan tasvir shunday kut nahilu bilan to'g'ri bo'lishi kerak. Zrozuly, qanday qilib tasvir va kuta o'lchamlaridan vertikal bo'ylab to'g'ri chiziqdagi o'zgarishni aniq hisoblash mumkin, shuning uchun sizdan qanday aniqlik bilan so'rash mumkin. Dal, asta -sekin biz pastga tushamiz. Oxirgi paytda sizni oq plyajlar uradi. Men bu daqiqani eslayman va maydon olov orqasida o'tadi. O'ylaymanki, men to'g'ri, men 8-chi qo'ng'iroq qilyapman, zaldagi gnivny viguki to'g'ri bo'lganlar haqida, faqat bitta vimir bor, va bu maydon ikkiyuzlamachi, bu erda bir xil emas. Keyin, yana o'n soat davomida biz yiqilib tushamiz, terining xotirasida, maydon to'lib ketadi, buning uchun natijalar yo'q qilinadi. Qia suma i berilgan kuta navbatini baholayman.

Pidvodyachi pidsumok shunday deyiladi: biz shunday shukati qilamizki, Rossiya tasvirga tushganda, piksellarning yorqinligi, qanday qilib to'g'ri yotish kerak, juda tez o'sadi.

Otzhe, bilimlar burilishigacha. Ale bilim tan olingandan so'ng darhol uxlamaydi. O'ng tomonda, tasvirning ovozi eksport qilinadi, lekin biz hali ham bilishimiz kerak.

Yuqoriga tikilgan to'qish - bu fonda ramzlarni ko'rsatish. Bu erda ramzning fondan ko'ra quyuqroq bo'lishi bizga yanada foydali bo'ladi. Rozrobnikiv tarafidagi mantiqiy to'qima - bulok rasmini yanada ravonroq o'qish mumkin edi. Qaysi biri noto'g'ri bo'lsa, siz tasvirlarni mustaqil ravishda binarizatsiya qilishga va ko'zingizning kuchiga o'tishga harakat qilishingiz mumkin.

Biroq, "boshdan -oyoq" borish - ramzlar va ostonaning qayta tug'ilishini ko'rishga urinish - bu erda amaliy emas. Eng chiroyli natija, go'yo men masofaga intilgandek bo'ldim - t = 140 da - velma achinarli. Juda yiqilib tushish. Buni zastosuvati obh_dniy shlyakh olib keldi. Fikr bu erda haqoratli. Belgilar, qoida tariqasida, havoladir. Bundan tashqari, ko'pincha rasmda ba'zi nuqta bor. Va agar siz to'ldirishni eng qorong'i joylardan to'ldirishga harakat qilsangiz, keyin kichik to'ldirilgan joylarni to'ldirishga harakat qilsangiz - aniq smittya?

Rostini aytsam, natija dushmanga o'xshaydi. Kattaroq hajmda tasvir fondan chiqariladi. Xo'sh, bum, ramz qismlar zanjiriga kiradi - hamma hollarda bir militsiya segmentatsiyaga yordam berishi mumkin - deyarli hamma narsa.

Narehty, Dilate va Erode operatorlarining kombinatsiyasi bizga belgilashni soddalashtirish uchun qo'shimcha yordam beradigan boshqa belgilarni ko'rishga imkon beradi.

Bu erda segmentatsiya ancha sodda, oldindan ishlov berilmagan. Birinchidan, sezuvchanlikning shukmo komponentlari mavjud.

Boshqa tomondan, komponentlar gorizontal ravishda yaqin (protsedura avvalgisiga o'xshash):

Algoritm natijada 69% muvaffaqiyatli natijalarga erishishga imkon beradi va 0,3 belgi / tasvirning o'rtacha qiymatini moslashtiradi.

Moviy

Shuningdek, uchinchi holat ko'k operatorni olib tashlash orqali "mag'lubiyatga uchraydi". Tse bula, shuning uchun bi-moviti, katta riba oldida perechinok ...

Bu erda ginstida yozish oson, agar men baribir harakat qilsam:

  • Belgilarning aylanishi - dine bilsh -mensh seriozna pereshkoda
  • Belgilar fonidagi shovqin
  • Inodi ramzlari birma -bir yuradi

O'tish uchun:

  • Fon yorug'lik belgilarini bildiradi
  • To'rtburchakka sig'adigan yaxshilik ramzlari
  • Rivojlanayotgan belgilar soni bittasini osongina ko'rish imkonini beradi

Oldindan ishlov berish. Negadir, fondan. Trikolor tasvirining tebranishi, ba'zida kanallarda, so'ngra barcha kanallarda, masalan, barcha kanallarda 116 dan ortiq. Otrimaêmo o'qi shunday yoqimli niqob:

Keyin tasvirni HSV maydoniga qayta tiklash mumkin (Vikipediya). Belgilarning rangi haqida ma'lumotni saqlang va shu bilan birga gradientlarni mintaqalardan saqlang.

Zastosuêmo natijada men niqobni oldinroq kesib tashlayman:

Umuman olganda, oldingi jarayon tugaydi. Segmentatsiya ham ahamiyatsiz. Yaxshi sabablarga ko'ra, sezuvchanlikning uchta komponenti mavjud:

U juda ko'p zupinitiya uchun ishlatilishi mumkin, yoki hamma 73% ni tashkil qiladi, lekin vashtovuêdan kam emas - atigi 4% chiroyliroq, lekin natijasi katlanadigan CAPTCHA. Otzhe, keling, ramzlarning to'qilgan burilishiga qadam qo'yaylik. Bu erda biz to'g'ri chiziqqa to'g'ri keladigan ramziy va yaxshi odamlar haqidagi haqiqatni taxmin qilishning o'rtasida turamiz. Polyagaê g'oyasi - teri belgisi uchun to'g'ri ichakni bilish, so'ngra yogo nahil hisobida nahil vlasne belgisi. Bu erda men sochli odam bilan shunday fikrni tasvirlaymanki, birinchi navbatda men ramzga berilgan barcha piksellar uchun qasos olaman, lekin boshqacha qilib aytganda, men qudratli kishilardan eng yaxshi joyga egaman. Men OpenCV (MinAreaRect2) dan bunday to'rtburchak hazil qilish algoritmining tayyor amalga oshirilishini keltiraman.

Butun algoritm tasvirning 86% ni o'rtacha 0,16 ta belgi / tasvir bilan muvaffaqiyatli egallaydi, bu CAPTCHA haqiqatan ham sodda ekanligi bilan tasdiqlanadi. Biroq, operator eng zo'r emas ...

Sariq

Nastaê nytsíkavishe. Shunday qilib, bi-moviti, mening ijodiy faoliyatimning apoteozi-Qia CAPTCHA-bu kompyuter uchun eng samarali usul, shuning uchun odamlar uchun achinarli.

perevagi:

  • Viglyadida plyaj va shovqin -suron
  • Belgilarning aylanishi va masshtablanishi
  • Ramzlarning rivojlanishiga yaqin

kamchiliklar:

  • Palitra ham ramkali
  • Barcha chiziqlar yanada nozikroq
  • Plami ko'pincha belgilar bilan bir -biriga to'g'ri kelmaydi
  • Kutish barcha belgilarning aylanishi bilan bir xil bo'ladi

Men birinchi krujka haqida o'ylardim. Perche, men mahalliy maxima (Dilate) ga qaradim, lekin siz ozgina shovqin ko'rdingiz. Biroq, bunday pidhidni harflar ozgina yo'qolgan darajada ishlab chiqarganidan so'ng, u ro'molning lattalaridan mahrum bo'ladi. Muammo ramzlarning tuzilishi bir xil emasligi tufayli zaiflashdi - hamma narsa yaxshilandi. Qachonki men buni ko'rsam, men eng ahmoqona tarzda tebranaman - Paint -ni ko'rsatish va barcha ranglarning kodlarini yozish orqali ularni tasvirlarda ko'rishim uchun. Vyavilosya, umuman olganda, tasvirlar tasvirlarida kichik to'qimalarning chotiri bor va ulardan uchtasi 4 xil rangga, chapda - 3 ta; Bundan tashqari, tirnoqlarning barcha tarkibiy qismlari 51 -sonli ko'paytmalarda ko'rsatilgan. Bundan tashqari, ranglar jadvali bo'ylab, ularning yordamida siz to'qimalarni ko'rishingiz mumkin. Shu bilan birga, "remap" tugashidan oldin, men hali ham barcha chiroqlarni qayta yozaman, chunki siz ularni ramzlarning chekkasida topishni xohlaysiz-bu shovqinning ma'nosini tushuntirish uchun. siz ular bilan janjal qilasiz, o'sha paytda ular ma'lumot osmonida.

Bundan tashqari, agar tasvirlarda 6 tadan ortiq rang bo'lmasa, 6 tadan ko'p emas - 4 ta ramzli rang (biz ularni oq, kulrang, ko'k, och yashil va to'q yashil deb nomlaymiz), biliy (rangli fon), ustida oxirgi daqiqada, har xil ranglardan birida uzoq emas. Men aqlli nazyvati - shu paytgacha men uchta kanal orqali yashirinib, qo'pol va qo'lda monoxrom tasvirga o'taman.

Tasvirni chiziqlardan tozalash keyingi qadam bo'ldi. Bu erda vaziyat ryatuê, chiziqning maqsadi yanada nozik - atigi 1 piksel. Oddiy filtrni so'rang: butun tasvir bo'ylab harakatlaning, teri pikselining rangini osma kvadratlari bilan o'zgartiring (juft bo'lib - vertikal va gorizontal); Agar siz rangning orqasida o'tirsangiz, lekin ayni paytda pikselning rangiga bormang - uni xuddi shunday qilish uchun. Men turg'un trochiman, xuddi shu filtrning yanada murakkab versiyasi, bu ikki bosqichli jarayon. Birinchi marta susidivni 2 -saytda, ikkinchisida - saytda 1. Bunday ta'sir o'qiga yo'l qo'ymang:

Men uzoqdan buyuk plyajlarga, shuningdek "qarovsiz" rangga boraman. Ko'p vaqt davomida men boshqa tovushli joylarni pichirlayman (maydon 15 dan kam, men yaxshiman), men uni oq-qora niqobga qo'ydim, buning natijasida natija odamlarning ishg'ol qilgan joylaridan biridir. "Ko'rinmas" rang.

Niqoblar sonining qo'shimcha yordami uchun men Inpaint algoritmini (yoki aniqrog'i, OpenCV -da amalga oshirish) natskovyue qilaman. Bu sizga rasmning katta qismini samarali tozalash imkonini beradi.

Biroq, OpenCV-da bu algoritmni amalga oshirish shovqinli matnli bitta faylli tasvirlarni yaratish uchun emas, balki fotosuratlar va videotasvirli robotlar uchun yoqilgan. Agar siz uni saqlayotgan bo'lsangiz, segmentatsiyani soddalashtirish uchun siz o'ziga xos bo'lishni istagan gradientlar bor. Bunday darajada, dodatkov obroblya vyroblyat qilish mumkin, va o'zi - hajmini oshirish. Teri pikselining rangi uchun men eng keng tarqalgan jadvallarga eng yaqinini hisoblayman (5 ta rang bor deb o'ylayman - bittasi ramzlar va boncuklar teksturasi bo'lgan teri uchun).

Nareshty, oldingi jarayonning qolgan qismi boshqa barcha tebranish joylarida ko'rinadi. Inpaint yozishning hidi bor, bu erda takrorlanish yo'q.

Biz segmentatsiyaga o'tamiz. Men ramzlar bir -biriga yaqin bo'lishini juda tezlashtiryapman. Bunday vaziyatni aldash mumkinki, uning yarmini bitta ramz orqasida ko'rish mumkin emas. Yomon eski deb nomlang, chunki u bitta rangni anglatadi. Bundan tashqari, smittya -ning ortiqcha qismi ham o'z rolini o'ynashi mumkin - chiziqning asl hujjatlarida shunday bo'lishi mumkin. ajoyib raqam bir xilda o'zgargan. Men ilgari tasvirlab bergan algoritmda juda ko'p muammolar bor;

Mart oyida segmentatsiyani yozmoqchi bo'lganimda, segmentatsiyani yozishning hojati yo'q edi, lekin men buni yaxshi qilmadim va taktikani o'zgartirdim. Mening yangi strategiyam butun segmentatsiya jarayonini ikki qismga bo'lish edi. Birinchidan, ramzlar va burchakning burilishini taxmin qilish. Boshqa belgilar allaqachon yonmagan tasvirdan ko'rinadi. Otze, boshlang. Asosan, sezuvchanlik tarkibiy qismlarining hazili uchun.

Keyin teri belgisining aylanishini baholash kerak. Robototexnika fan-operatori bilan keyingi soat-Grínpísu, men butun algoritmni topdim yoki yozib, faqat shu erda saqladim. Bu robotni tasvirlash uchun men o'xshashlik chizaman. Belgining qora-oq tasviriga pastdan yuqoriga qulab tushgan pistonni tan oling. Piston dastasi, bo'yinturuq orqasida, vertikal ravishda tikilgan, ishchi platformasi gorizontal, tasvirning pastki qismiga parallel va qo'lga perpendikulyar o'rnatiladi. Tutqich o'rtada maydanga bog'lab qo'yilgan, kunduzi u qulab tushadi, natijada maydan aylana oladi. Xay meni terminologiyadan kamroq fahivtsi.

Tutqich tepalikka qulab tushsin, fizika qonunlariga binoan uning oldida shtovhayuchi. Biz materialni hurmat qilamiz, faqat ramzning tasviri va pistonning qora fonidan osongina o'tish mumkin. Todi pistoni, oq ranggacha ishlaydi, u bilan deyarli shug'ullanadi va shunchaki o'giriladi - aql uchun, shuning uchun dastaga kuch hali ham qo'llaniladi. Zupinitsya vini ikki xil bo'lishi mumkin: VIN kuch ishlatilgan paytdan boshlab hujum tomonidagi belgiga tayanib yoki VIN kuchga tegish nuqtasi ustiga qo'yilganidek. Oiladagi boshqa barcha odamlar prodovzhuvati ruxini davom ettirishi mumkin. Uvaga, kulminatsiya: biz vvazati bo'lamiz, qanday qilib ramzni burish kerak - tse kut shu vaqtda pistonga, agar u zupinivsya bo'lsa.

Butun algoritm aniq natijalarga erishishdir, lekin juda katta natijalarga (27 darajadan yuqori) qaramay, men ishonchli emasman. Yechimdan men o'rtacha arifmetikani bilaman, buning uchun butun tasvirni minus nuqtaga aylantiraman. Keling, komponentlarning baland ovozini yana tinchlantiraylik.

Dali hamma tsikavish va tsikavishhe eski. Old panelda men turli xil dastgohlarni kesilgan segmentlar bilan ta'mirladim va shu bilan ularni neyro yozuvlarga o'tkazdim. Hammasi shunday. Avvalo, men tez -tez ma'lumotni yangilab turishni xohlayman, men sezgirlik komponentining nozik tasvirini ishlataman, ularning terisida to'q ko'k rang bor (96) "fon" - Virizan segmentiga buyurtma berilgandek, yangisidagi ale ham bekor qilinmadi, ular uchun ramzlarning tekislangan konturlari, chiziq uchun oldingi jarayonda bo'lgani kabi (stenddan susidgacha, teng) biriga).

Rasmiy ravishda (dastur modullari nuqtai nazaridan) segmentatsiya shu erda tugaydi. Hurmatli o'quvchi, mabut, hech qaerda yomon ramzlar bo'lmaganini eslab. Shunday qilib, bu shunday - men uni o'zim shunday ko'rinishga o'tkazaman va bir vaqtning o'zida qo'shaman.

Buning sababi shundaki, bu usul yovuz belgilar uchun ishlatilgan, chunki oldingi tavsiflar (eng yaxshi proyeksiyali) bu erda emas - velma mualliflari harflarining shriftlari juda uzoqda. Bu birinchi, ko'proq katlanadigan pidhidning turg'unligi bilan bog'liq. Yondashuvning asosi g'oya, qaysi neyron tarmoq segmentatsiya uchun g'olib bo'lishi mumkin.

Men boshida segmentning kengligi ko'rsatilganda va belgilar soni tashqariga chiqqanda segmentdagi belgilar sonini bilish imkonini beradigan algoritmni tasvirlab berdim. Xuddi shu algoritm bu erda g'alaba qozonadi. Teri segmenti uchun yangisidagi belgilar soni hisobga olinadi. Bitta narsa bor ekan - hech narsa qo'shishning hojati yo'q va segment darhol neyron tarmog'iga >> = ga yuboriladi. Agar u erda bitta belgi bo'lmasa, potentsial taqsimot mahalliy devorlarga joylashtiriladi. Keyin teri ustara o'zining kichik chekkasida qulab tushadi va shu bilan birga neyrodinamikaning razdilnik belgilariga bo'lgan reaktsiyasini hisoblab chiqadi, buning uchun o'zingizni maksimal tebranishdan mahrum qilish kerak (yaxshi sababga ko'ra, hammasi bir xil, bu ahmoq algoritm.

Tabiiyki, neyro -tanishning segmentatsiya (yoki undan ham ko'proq segmentatsiyalash) jarayonida roli, men aytib o'tganimdek, neyromazorat yaratish uchun ushbu sxemadan g'alaba bilan foydalanish imkoniyatiga bog'liq. Aniqrog'i, neyron tarmoqni ta'mirlashga yo'l qo'yilmaydi - yangi tarmoqlar uchun siz undan qutulishingiz mumkin. Buni tugatishdan qo'rqishim oddiy - vikoristanna algoritmi robotga ovqat hazm qilish tavsifiga kirgan vaqtda, yangi neyromasozani ajratishning maxsus usullari (proektsiyasi).

Algorith Butun algoritmda nevrologiya testlariga yana bir noziklik bog'langan. Old tomondan, neyron tarmoq oldindan ishlov berish va segmentatsiyaning buzilmagan natijalari asosida paydo bo'ldi. Bu erda muvaffaqiyatli reytingning 12% dan ko'prog'ini ro'yxatdan o'tkazishga ruxsat berilmagan. Kamroq tsexlar vashtovuval bo'lmadi. Bunga birinchi marta Chergovning yangi neyro -kognitiv davrini tuzatish uchun men haqiqiy tasvirlarni kiritdim, taxminan haqiqiy modelni: katta / ko'k / qora dog'larni, ko'k chiziqlar / buruq / to'rtburchaklar qo'shing. Men 200 ta rasmdan 300 tagacha poezdman va shunday nomlar beraman validlar to'plami hozirgi sifatni o'zgartirish uchun soat 100 ta tasvirga o'rnatiladi. Bu bu erda mahsuldorlikni besh baravar oshirishga va yakraz neyromekanikasining segmentatsiyasiga erishishga imkon berdi va men statistikada aytadigan natijani berdi.

Biz boshqa statistikani ololmaymiz, lekin bu sumkada qoldi ikkita nevrologiya: kimdir ko'proq ma'qullashdi, va bir oz kechirim. Bu erda men birinchisining natijalarini taqdim etaman.

Hammasi bo'lib, men bir necha bor aytganimdek, testlar to'plamida 100 ta rasm bor edi. Ulardan 20 tasi muvaffaqiyatli aniqlandi, unchalik uzoq emas, 80, afv tasvirga 1,91 ta belgini qo'ydi. Boshqa operatorlar uchun emas, yaxshiroq, lekin CAPTCHA mavjud.

visnovkani almashtiring

Robototexnika bilan bog'liq hamma narsa, men o'z saytimdagi maxsus forumda viklavman, zokrem: wiki kodi, Netsukuku). Xuddi shu vaqtda men buni ko'rishni xohlardim, shuning uchun men uni rikka aylantira olaman (men buni ikki marta xohlayman) va boshqacha qilib aytganda, men o'sha erda eng yuqori pog'onada ekanligimni da'vo qildim. ISEF. Siz bo'la olasizmi?

Aksariyat odamlar darsda qatnashmaydilar, lekin men tasvirni matndan o'qish dasturini dissertatsiya qila olaman. O'ylaymanki, agar men yuqori darajadagi tahlildan xalos bo'la olsam, natijalarni hazilda jilolaganim uchun g'alaba qozonishim mumkin. Mening vidminny radnikim, doktor Gao Junbin menga shu mavzuda dissertatsiya yozishni taklif qildi. Nareshti Men maqolani yozish vaqtini bilaman va bu erda men sizga bilganlar haqida aytib berishga harakat qilaman. Yakby tilki gullab -yashnayotgan edi, chunki men uni tuzatdim ...

Men aytganimdek, men rasmlarni Internetdan olish va ularni hazilda natijalarni jilolash uchun matn yozish uchun ishlatishni o'ylayapman. Mening g'oyalarimning aksariyati yovuz captcha usullariga asoslangan. Yak vidomo, captcha - bularning hammasi bo'laklarni o'zgartiradi, "qatlamlarni rasmdagi kabi kiriting" standartida, qayta qatlamlar yoki qo'ng'iroq tovushlari.

Captcha shunday joylashtirilganki, odam matnni yozmasdan o'qishi mumkin, o'sha paytda, xuddi mashina kabi, (panjara, reCaptcha!). Amalda, nikolining narxi ishlamadi, chunki K. Mayzhe teridan tayyorlangan captcha, saytda tarqatilganidek, dekallarni cho'zish orqali ta'qib qilingan.

Menga omad etishmadi - rasmning 60% dan ko'prog'i mening kichik to'plamimdan muvaffaqiyatli topildi. Murosasiz etkazib bering, Internetda aqlli tasvirlar juda ko'p.

O'zim tayyorlagan dastlabki uchrashuvlarda menga yordam bergan materiallarni bilmayman. Shunday qilib, ular juda oddiy algoritmlarda nashr etilgan. Aslida, men PHP va Perl-da ishlamaydigan bir nechta ilovalarni bilaman, ulardan bir nechta bo'laklarni olib, noto'g'ri natijalarni hatto oddiy kapchalar uchun ham qayta ishlayman. Ulardan Alezhodenga ayniqsa ruxsat berilmaydi, chunki K. Tse bulo oddiy. Men nazariyani o'qiy oladigan odamlardan jimman, lekin haqiqiy qo'shimchalarsiz ko'rinadigan narsa yo'q. Ko'p sonli maqolalarda men yoqimsiz kodni chiqarmasligini yozganman, chunki K. Men yomon maqsadlar uchun g'alaba qozonishimdan qo'rqaman. Ayniqsa, menimcha, captcha - bu bir soatni behuda sarflash, chunki zodagonlik - bu yakka bo'lgani kabi, unga borish oson.

Vlasne har qanday materialning ko'rinishi orqali, birinchi marta qonunni yozganimda, yomon captcha qanday ko'rsatilishini ko'rsatdi.

Keling, buni juda yaxshi qilaylik. Eksa - men statistikada ko'rmoqchi bo'lgan narsalar ro'yxati:

  • vikoristovuvani texnologiyalari
  • Captcha -ni oling
  • G'alabalar tasvirini ko'rsatish II
  • navchannya
  • Hammasini birdaniga oling
  • Visnovka natijalari

vikoristovuvani texnologiyalari

Barcha tugmalar PIL kutubxona ro'yxatidan Python 2.5 da yozilgan. Python 2.6 da pratsyuvati uchun aybdor.

Belgilangan tartibda ularni o'rnating va qo'shimchalarni ishga tushirishdan oldin tayyor.

kirish

Tugmalarda men ma'nosiz qiymatni kodga to'g'ri qo'yaman. Menga universal CAPTCHA identifikatorini o'rnatish shart emas va uni faqat narx sifatida ko'rsatish.

Captcha, scho tse vreshti-resht qabul qilasizmi?

Asosiy captcha-da bir tomonlama qayta tartibga solish. Siz osongina ramzlar to'plamini olishingiz va captcha -ni to'g'rilashingiz mumkin, lekin navpaki emas. Insha nozikligi - bu aybdor, lekin uni odamlarga o'qish oson, lekin uni mashinaga kiritish shart emas. CAPTCHA "Vi lyudin?" Kabi oddiy test kabi ko'rinishi mumkin. Asosiy hidda tasvir ramzlar yoki so'zlar bilan amalga oshiriladi.

Internet saytlarida spamning oldini olish uchun vikoristovuyutsya hidi. Masalan, captcha -ni Windows Live ID -dagi tiklash sahifasida topish mumkin.

Sizga tasvirni ko'rsatish uchun, agar siz odamni ko'rsangiz, keyingi maydonga matnni kiritishingiz kerak bo'ladi. Tavba qilmaydigan fikrni yaratmoqchimisiz, qanday qilib sizni forumingizga spiam yuborish yoki joylashtirishning minglab avtomatik cheklovlaridan o'g'irlashim mumkin? Muammo shundaki, tasvirni tanib olishning tobora kuchayib borayotgan usullari muhim o'zgarishlardan xabardor bo'lib, qo'shiqchilik sohalarida yanada samaraliroq bo'ldi. OCR (optik belgilarni belgilash) - bizning vaqtimizda matnni aniq va oson ishlov berish. Troyka rangini va chizig'ini qo'shish, kompyuter robotining koristuvachiv muammosiz ishlashini qiyinlashtirish to'g'risida qaror qabul qilindi. Bu o'ziga xos poyga, shuning uchun har qanday zahist zbroya kuchliroq o'ylab topadi. Captcha -ni katlanadigan bilan engib o'ting, aks holda hammasi mumkin. Bundan tashqari, barcha tasvirlarga biz buni qilishda aybdormiz.

Tse zobrazhennya ö butt captcha, yaku biz hal qilamiz. Narx haqiqiy captcha, chunki u haqiqiy saytda joylashtirilgan.

Narx - bu oddiy captcha, chunki u bir xil rang va o'lchamdagi ramzlarda oq rangda, shovqin ko'p bo'lgan (picsel, rang, chiziq) saqlanadi. Agar siz fonda shovqin jarayonni tezlashtiradi deb o'ylasangiz, men sizga ko'rish qanchalik osonligini ko'rsataman. Men captcha kuchliroq bo'lishini istardim, lekin bizning dasturlarimiz uchun yaxshi bo'r.

Yak biladi va vityagti rasmdan matn

Matnning rasmdagi o'rnini va birinchi marta tasavvur qilishning ko'plab usullari mavjud. Google yordami bilan siz matnni hazillashning yangi usullari va algoritmlarini tushuntiradigan minglab maqolalarni topishingiz mumkin.

Qolgan qismi uchun men vicoristovuvati vityag kolyoru bo'laman. Narxi oddiy texnologiya, men otrimav yordamida yomon natijalarni tugataman. Xuddi shu texnikani men dissertatsiyam uchun vikoristovuvav.

Bizning ilovalarimiz uchun men katta hajmdagi tasvirni tarqatish algoritmini vikoristovuvati bilan tanishtiraman. Kunduzi tse to'plamdan rasm ranglarining gistogrammasi hosil bo'lishini bildiradi. Rangning orqasidagi tasvirlardagi barcha piksellardan xalos bo'lishga harakat qiling, ular uchun bolalar teri guruhiga muvofiq amalga oshiriladi. Agar siz bizning captcha testimizga hayron bo'lsangiz, unda uchta asosiy rangni qo'shishingiz mumkin:

  • Biliy von)
  • Siriy (shovqin)
  • Chervoniy (matn)

Python -da ko'rish ancha oson bo'ladi.

Boshqa Gistogramma dan GIF -ga aylantiruvchi tasvirning qadam kodi (biz robotdan chiqamiz, chunki yangisida 255 ta rang bor).

PIL import rasmidan im = Image.open ("captcha.gif") im = im.convert ("P") im.histogrammani chop etish ()

Xaltada biz boshlay olamiz:

Bu erda biz rasmdagi 255 ta rangdan bir nechta teri piksellarini ko'ramiz. Siz uni mag'lub qila olasiz, biliy (255, eng muhimi), tez -tez ko'rasiz. Uning orqasida chervoniy ketadi (matn). Schob perekonatsya tsomu, kichik skript yozing:

PIL importidan Operator import elementidan rasm im = Image.open ("captcha.gif") im = im.convert ("P") i = im.histogramma () qiymatlari = () i uchun diapazonda (256) : qiymatlar [i] = uning [i] j, k uchun tartiblangan (values.items (), key = itemgetter (1), teskari = To'g'ri) [: 10]: j, k ni chop eting

Men bu takliflarni qabul qilaman:

Mana, rasmdagi eng kengaytirilgan 10 ta tirnoq. Yak ochíkuvalosya, bíliy ko'pincha takrorlanadi. Keling, kulrang va chervoniyadan o'taylik.

Ma'lumotdan qutulishimiz bilan, biz bir xil miqdordagi guruhlar asosida yangi tasvirlar yaratdik. Eng keng tasvirlarga ega bo'lgan teri uchun tasvir yangi (2 ta rangdan);

Bizning chervoniy eng keng tarqalgan kotirovkalarning uchinchi o'rtasiga aylandi va bu shuni anglatadiki, biz 220 rangdagi piksellar guruhini saqlamoqchimiz. Kodning ostiga borib, captcha ko'rsatiladi, GIF -ga aylantiriladi, bir xil o'lchamdagi yangi tasvir katta fonda ko'rsatiladi, so'ngra bizga kerakli rangdagi hazillarda asl tasvir chetlab o'tiladi. Agar biz kerakli rangga ega bo'lgan pikselni bilsak, biz qora rangdagi boshqa tasvirdagi pikselni nazarda tutamiz. Robot qurilishi tugashidan oldin boshqa tasvirlar olinadi.

PIL import rasmidan im = Image.open ("captcha.gif") im = im.convert ("P") im2 = Image.new ("P", im.size, 255) im = im.convert ("P ") temp = () x uchun diapazonda (im.size): y oralig'ida (im.size): pix = im.getpixel ((y, x)) temp = pix, agar pix == 220 yoki pix == bo'lsa 227: # bu im2.putpixel ((y, x), 0) im2.save ("output.gif") olish uchun raqamlar

Ushbu kodni ishga tushirish bizga tajovuzkor natija beradi.

Rasmga siz zarba berishingiz mumkin, chunki biz fonda matnni muvaffaqiyatli topdik. Jarayonni avtomatlashtirish uchun siz birinchi yoki boshqa skriptdan foydalanishingiz mumkin.

Men ovqatlanayotganimni his qilyapman: "Xo'sh, kichkina ranglarning yozilishining captcha matni haqida nima deyish mumkin?". Shunday qilib, bizning texnologiyamiz tobora samaraliroq. Faraz qilaylik, ranglarning eng kengaytmasi - fon uchun bir xil rang va buning uchun siz ramzlar rangini bilishingiz mumkin.

Bunday darajada Daniya lahzasi biz tasvirni matndan muvaffaqiyatli burdik. Keling, matn tasviridan qasos oladigan odamni ko'rish uchun oldinga qadam tashlaylik. Men bu erga kod yozmoqchi emasman, chunki jarayon moslashuvchan, o'sha paytda algoritmning o'zi oddiy.

Har bir ikkilik tasvir uchun: ikkilik tasvirdagi har bir piksel uchun: agar piksel yoniq bo'lsa: agar biz ko'rgan piksellar yonida bo'lsa: o'sha to'plamga qo'shing: yangi to'plamga qo'shing

Kirish joyida sizda ramzlar to'plami bo'ladi. Agar siz o'sishni xohlasangiz, bu sizga kerak bo'ladi - qaror qilmang va kim uzoq hidlaydi deb o'ylamang. Agar shunday bo'lsa, demak sizda vip jackpot bor va siz buyurtmaga o'tish uchun ramzlarni to'g'ri belgilagansiz. Siz buni o'zingiz qilishingiz mumkin, siz olingan maydonlarning o'lchamlarini teskari o'zgartirishingiz yoki yangi tasvirni ochishingiz va uni ko'rsatishingiz mumkin (rasmdagi show () usuli), shunda siz algoritmning to'g'riligini o'zgartirishingiz mumkin.

PIL import rasmidan im = Image.open ("captcha.gif") im = im.convert ("P") im2 = Image.new ("P", im.size, 255) im = im.convert ("P ") temp = () x uchun diapazonda (im.size): y oralig'ida (im.size): pix = im.getpixel ((y, x)) temp = pix, agar pix == 220 yoki pix == bo'lsa 227: # bu im2.putpixel ((y, x), 0) olish uchun raqamlar # yangi kod bu erda boshlanadi inletter = Noto'g'ri topilgan xabar = Soxta boshlanish = 0 oxiri = 0 harflari = y uchun (im2.size): # diapazonidagi x uchun kesma (im2.size): # pix pastga tushiring = im2.getpixel ((y, x)) agar pix! = 255: kirish = topilgan bo'lsa rost == Yolg'on va kirish == To'g'ri: foundletter = Haqiqiy boshlanish = y topilgan bo'lsa == To'g'ri va kirish == Noto'g'ri: foundletter = False end = y harflari.append ((boshlanish, oxiri)) kirish = noto'g'ri harflar

Natijada, biz quyidagilarga keldik:

[(6, 14), (15, 25), (27, 35), (37, 46), (48, 56), (57, 67)]

Pichoqning gorizontal chizig'i va teri belgisining uchi bo'ylab pozitsiyalar zanjiri.

III va vektorli bo'shliq tasvirlarni yaratishda

Tasvirni har kungi eng katta muvaffaqiyat bilan ishlab chiqish mumkin, bu unga har qanday tijorat qo'shimchalarini eyishga imkon berdi. Butun elementlarning ajoyib to'plami. Bagatox erlari uchun hidlar avtomatik tarzda o'qiladi, chunki K. Navchit raqamlarni shifrlashi osonroq. Bu aniq bo'lmasligi mumkin, aksincha tasvirlarning ta'rifi, agar u yanada yuqori darajada ixtisoslashgan bo'lsa, II muammoga kiradi.

Muz suv o'tkazmaydi, chunki u tasvirlar va neyron tipratikanlarning rivojlanishiga Yerning sarmoyalari haqidagi bilimlarga tayanadi. Ayniqsa, men ramzlarni tanib olishda neyronal ramka bilan muvaffaqiyat qozona olmadim. Men sizga 3-4 belgini chaqiraman, ular uchun tushish aniqligi shunchalik pastki, agar o'q vypadkovy darajali bo'lsa, o'q kattaroq tartibda bo'ladi. Men biroz vahimaga tushdim, chunki dissertatsiyamda K. Tsebuloning o'ziga Lanka etishmayotgan edi. Yaxshiyamki, men bir muncha vaqt oldin ovoz tizimlarida va ma'lumotlarni tasniflashning muqobil usulida vektor-makon haqidagi maqolani o'qiganman. Vreshti-rasht hidlari qisqa vaqt ichida keldi, K. K.

  1. Xushbo'y hid katta vivchenniyani vimagayut qilmaydi
  2. Siz noto'g'ri ma'lumotlarni qo'shishingiz / ko'rishingiz va natijani darhol qaytarishingiz mumkin
  3. Ko'rish va dasturlash osonroq
  4. Siz tasniflangan natijalarga erishasiz, bunday darajaga ega bo'lishingiz mumkin, bachiti top X zbigiv
  5. Menga nima qilishimni aytolmaysizmi? Narxni bering, shunda siz narxni darhol taniy olasiz, avval aytib o'tilganlarni ko'rish uchun uni tezroq toping.

Albatta, mushuksiz siru yo'q. Bosh shvidkostida pastga tushadi. Xushbo'y hid neyron to'siqlardan ko'ra kuchliroq bo'lishi mumkin. Ale, menimcha, yaxshi emas, balki hamma narsa bir xil emas.

Agar siz jonli bo'lishni xohlasangiz, agar siz vektor maydonini xohlasangiz, Vektorli fazo qidiruvi nazariyasini o'qing. Bu eng go'zal narsa, men pohatk_vts_v uchun bilaman.

Men o'z vaqtimni vivchav soatining oxirida bo'lgani kabi, sevimli YAP-da yozishga harakat qilib, taniqli hujjat va tse bulo first ricchu asosida tasvirni aniqlashga vaqtimni sarfladim. Hujjatni to'liq o'qing va uning mohiyatini ko'ring - aylaning.

Siz burildingizmi? Yaxshi. Endi biz vektor maydonini dasturlashda aybdormiz. Yaxshiyamki, narx oson emas. Davom eting.

Matematika sinfini kiriting VectorCompare: def magnitudasi (o'z -o'zidan, kelishuv): jami = 0 so'z uchun, kelishuvda hisoblash. : moslik = 0 topvalue = 0 so'z uchun, muvofiqlikda hisoblash 1.

Pythonda 15 qatorli vektor maydonining bajarilishi. Kuniga bor -yo'g'i 2 ta so'z boyligi bor va ularning soni 0 dan 1 gacha, agar shunday qilsangiz, to'qish hidi kabi. 0 - bu hidning bog'lanmaganligini, lekin 1 - hidning bir xilligini bildiradi.

navchannya

Bizga kerak bo'lgan narsaga qadam qo'ying - tasvirlar to'plami, ular yordamida biz ramzlarimizni yirtib tashlaymiz. Bizga juda kerak. Navchannya kabi II turdagi g'alaba qozonish qiyin bo'lishi mumkin, biz g'olib bo'lamiz (neyron tipratikan va boshqalar. D.).

Dani, siz g'alaba qozonishingiz mumkin, siz muvaffaqiyatli rivojlanish uchun foydali bo'lishingiz mumkin. Dan qanchalik chiroyli bo'lsa, muvaffaqiyatga erishish imkoniyati shuncha katta bo'ladi. Shunday qilib, men ma'lum bir captcha kashf qilishni rejalashtirganimda va uning belgilaridan foydalana olsam, nega yangi to'plamda g'alaba qozona olmas edim?

Men o'ldim. Men juda ko'p yaratilgan captcha -larni yuklab oldim va lithi -dagi dasturimni buzdim. Todi I tasvirni to'plamda oldi (guruh). Qachonki menda dekal bor edi, men kaptka generatori kabi teri belgisining bir dumini oldim. Dizaynning to'g'riligini yaxshilash uchun ko'p sonli ilovalar va nazariyamni tasdiqlash uchun biroz ko'proq ma'lumot qo'shilgan.

PIL importidan Tasvirni import qilish hashlib import vaqti im = Image.open ("captcha.gif") im2 = Image.new ("P", im.size, 255) im = im.convert ("P") temp = () im.histogrammani () x uchun diapazonda (im.size): y uchun diapazonda (im.size): pix = im.getpixel ((y, x)) temp = pix, agar pix == 220 yoki pix == bo'lsa 227: # bu im2.putpixel ((y, x), 0) kirish = Noto'g'ri topilgan ma'lumot = Noto'g'ri boshlanish = 0 oxiri = 0 harflar = y uchun diapazonda (im2.size) olish uchun raqamlar: x uchun # bo'lak diapazonda (im2.size): # piksel pastga = im2.getpixel ((y, x)) agar pix! = 255: kirish = topilgan bo'lsa to'g'ri inletter = False # Yangi kod bu erda. Biz har bir tasvirni ajratib olib, diskda saqlaymiz # deb umid qilamizki, harflarning harfi uchun yagona nom soni = 0: m = hashlib.md5 () im3 = im2.crop ((harf, 0, harf, im2.size) ) m.update ("% s% s"% (time.time (), count)) im3.save ("./% s.gif"% (m.hexdigest ())) count + = 1

Kirish joyida biz o'sha rejissyorda tasvirlar to'plamini qabul qilamiz. Agar siz captchas sepib olsangiz, ularning terisiga vipadokslar uchun noyob xash tayinlanadi.
Test captcha uchun natija o'qi:

Ko'ryapsizmi, siz suratga olayotgandirsiz, lekin men ularni rejissyorga xuddi shu tasvirlar bilan qo'ydim, bu rasmda (belgi yoki raqam).

Hammasini birdaniga oling

Ostanniy krok. Bizda matn chiqarish, ramzlar chiqarish, ishlab chiqish texnologiyasi va boshqalar mavjud.

Biz captcha tasvirini taniy olamiz, matnni ko'ramiz, ramzlarni taniy olamiz, keyin ularni boshsizligimiz bilan tuzatamiz. Siz qila oladigan hamma narsa uchun dasturning qolgan qismini oz sonli captcha bilan qo'shishingiz mumkin.

Bu erda men birinchi navbatda chalkashib ketaman, shuning uchun onam u bilan o'ynashi mumkin:

Def buildvector (im): d1 = () count = 0 i uchun im.getdata (): d1 = i count + = 1 return d1 v = VectorCompare () iconset = ["0", "1", "2" , "3", "4", "5", "6", "7", "8", "9", "0", "a", "b", "c", "d", " e "," f "," g "," h "," i "," j "," k "," l "," m "," n "," o "," p "," q " , "r", "s", "t", "u", "v", "w", "x", "y", "z"] imageset = piktogrammalardagi harflar uchun: os.listdirdagi img uchun ("./iconset/%s/"%( harf)): temp = agar img! = "Thumbs.db": temp.append (buildvector (Image.open ("./ iconset /% s /% s"% (harf, img)))) imageset.append ((harf: temp))

Va bu erda hamma joziba allaqachon ko'rinib turibdi. Meni viznachaêmo, teri belgisi mavjud va u bizning vektor maydonimizdan tashqarida o'zgartirilgan. Keling, turli xil natijalar va boshqalarni ichaylik.

Harflardagi harflar uchun = 0 hisoblang: m = hashlib.md5 () im3 = im2.crop ((harf, 0, harf, im2.size)) taxmin = rasmlar tasviridagi rasm uchun: x, y uchun image.iteritems () da: agar len (y)! = 0: guess.append ((v.relation (y, buildvector (im3)), x)) guess.sort (teskari = To'g'ri) chop etish "", taxminlar soni + = 1

visnovka

Endi bizda hamma narsa bor va biz ajoyib mashinamizni ishga tushirishga harakat qilishimiz mumkin.

Kirish fayli captcha.gif. Ballar natijasi: 7s9t9j

Python crack.py (0.96376811594202894, "7") (0.96234028545977002, "s") (0.9286884286888929, "9") (0.98350370609844473, "t") (0.967511650796966"

Bu erda biz ramz va qadamlarning bajarilishini (0 dan 1 gacha) ma'nosida uzatilishini ko'ramiz.

Aftidan, biz bilan hammasi yaxshi o'tdi!

Daniyaliklarning testchoplarida skript natijalarning taxminan 22% muvaffaqiyatli natijasini ko'rsatadi.

Python crack_test.py to'g'ri taxminlar - 11.0 noto'g'ri taxminlar - 37.0 foiz to'g'ri - 22.9166666667 foiz noto'g'ri - 77.0833333333

Noto'g'ri natijalarning aksariyati "0" raqami va "O" harfi noto'g'ri tan olinganligi haqida xabar qilinadi. Muvaffaqiyatsiz odamlar ko'p, chunki odamlar ko'pincha adashib yurishadi. Bizda hali ham ramzlar bo'yicha razbivannyh bilan muammo bor, razbittya natijasini qayta ko'rib chiqish va oltinning o'rtasini bilish mumkin.

Biroq, unchalik aniq bo'lmagan algoritm bilan harakat qilish uchun, biz bir soat ichida terining qopqog'ini hal qila olamiz, de Lyudin buni aniqlay olmadi.

Core 2 Duo E6550 -da kodni ko'rish sizga quyidagi natijalarni beradi:

Haqiqiy 0m5.750s foydalanuvchisi 0m0.015s sys 0m0.000s

Bizning katalozimizda 48 ta captcha bor, bu vyplya, shuning uchun bir tomonni hal qilish uchun taxminan 0,12 soniya kerak bo'ladi. Muvaffaqiyat haqidagi 22% hikoyalarimiz bilan biz kuniga 432 000 ga yaqin captcha olishimiz va 95 040 ta to'g'ri natijaga erishishimiz mumkin. Va vikoristovuvati haqida nima deyish mumkin?

Hamma narsadan. Sizni yaxshi maqsadlarda ko'rishim mumkinligidan dalda olaman. Bilaman, siz Skoda kodidan foydalanishingiz mumkin, lekin omadsizlikni ayblash xavfsiz emas.

Men o'zim uchun captcha olishni xohlaydiganlar uchun, bu sizga ko'p yordam bermaydi, chunki siz uni dasturiy jihatdan chetlab o'tishingiz yoki ba'zi odamlarga pul to'lashingiz mumkin, chunki men uni sizga topshiraman. Buni olishning ba'zi usullari haqida o'ylab ko'ring.

Bu stikerga loyiqmi? Do'stlar bilan do'stlashing!