Python capper tanıma. CAPS tanıma: yöntemler ve teknolojiler. Görüntüleri tanırken AI ve vektör alanı

  • 23.06.2020

Çoğu insan bilmiyor, ancak tezimim görüntüden metin okumak için bir programdı. Yüksek seviye tanıma alabilseydim, arama sonuçlarını iyileştirmek için kullanılabilir. Büyük Danışmanım Dr. Gao Dzhunbin bana bu konuda tez yazmayı teklif etti. Sonunda, bu makaleyi yazma zamanı buldum ve burada öğrendiğim her şey hakkında konuşmaya çalışacağım. Keşke yeni başladığımda böyle bir şey olsaydı ...

Dediğim gibi, internetten sıradan görüntüleri almaya çalıştım ve arama sonuçlarını iyileştirmek için metni onlardan çıkarmaya çalıştım. Fikirlerimin çoğu, CAPP'yi hackleme yöntemlerine dayanıyordu. Herkes bildiği gibi, Tutamlar, "Resimde gördüğünüz harfleri girin" gibi, Kayıt veya Geri Bildirim sayfalarında "Görüntünüz harfleri girin" gibi en sıkıcı şeylerdir.

Capcha, bir kişinin metni zorluk çekmeden okuyabilmesi için düzenlenmiştir (merhaba, recaptcha!). Uygulamada, hiç işe yaramadı, çünkü siteye yerleştirilen hemen hemen her captcha ay boyunca hacklendi.

İyi çıktı - görüntülerin% 60'ından fazlası, küçük koleksiyonumdan başarıyla çözüldü. İnternetteki çeşitli görüntülerin sayısı göz önüne alındığında oldukça iyi.

Araştırmamla bana yardım edecek herhangi bir malzeme bulamadım. Evet, makaleler var, ancak çok basit algoritmalar yayınladılar. Aslında, PHP ve Perl'de çeşitli çalışmayan örnekleri buldum, birkaç parçayı aldı ve çok basit bir CAPP için iyi sonuçlar aldı. Ama hiçbiri gerçekten bana yardımcı oldu, çünkü çok basitti. Ben teoriyi okuyabilen insanlardan, ancak gerçek örnekler olmadan hiçbir şey anlamadım. Ve çoğu makalede, kodu yayınlamadıkları için, kötü amaçlarla kullanılacağından korktukları için yazılmıştır. Şahsen, CAPTCHA'nın zaman kaybı olduğunu düşünüyorum, çünkü nasıl geçmesi oldukça kolay olduğundan, nasıl.

Aslında, yeni başlayanlar için CAPTCHA'yı hack gösteren bazı malzemelerin eksikliği nedeniyle bu makaleyi yazdım.

Hadi başlayalım. İşte bu makalede vurgu yapacağımın bir listesi:

  • İkinci el teknolojiler
  • Capcha nedir
  • II kullanarak görüntü tanıma
  • Eğitim
  • Hepinizi topluyoruz
  • Sonuçlar ve sonuçlar

İkinci el teknolojiler

Tüm örnekler Pily Library kullanarak Python 2.5'te yazılmıştır. Python 2.6'da çalışmalı.

Onları yukarıdaki sırayla ayarlayın ve örnekleri başlatmaya hazırsınız.

Geri çekilmek

Örneklerde, doğrudan kodda birçok değeri sağlam bir şekilde ayarlayacağım. Evrensel bir numara tanıyıcı oluşturmak için hedefim yok, ancak sadece nasıl yapılacağını göstermek için.

Capper, sonunda ne var?

Temel olarak, CAPTCHA tek taraflı dönüşümün bir örneğidir. Kolayca karakter kümesi alabilir ve ondan yakalayabilirsiniz, ancak tam tersi değil. Başka bir incelik - bir kişi tarafından okunması kolay olmalı, ancak makine tanıma için yenilmez. Capper, basit bir tür tip olarak düşünülebilir "Bir erkeğin misiniz?". Temel olarak, bazı semboller veya kelimeler içeren bir görüntü olarak uygulanır.

Spam'ı birçok internet sitesinde önlemek için kullanılırlar. Örneğin, CAPTCHA, Windows Live ID'deki Kayıt sayfasında bulunabilir.

Görüntüyü gösterdiniz ve eğer gerçekten bir kişiyseniz, metnini ayrı bir alanda girmeniz gerekir. SPAM'u spam için binlerce otomatik kayıttan koruyabilen veya forumunuza viagra yaymak için sizi koruyan iyi bir fikir mi görünüyor? Sorun şu ki, AI ve özellikle de, görüntü tanıma yöntemlerinin önemli değişiklikler yaşadığı ve belirli alanlarda çok etkili oluyor. OCR (Optik Sembol Tanıma) Bu günler oldukça doğrudur ve basılı metni kolayca tanır. Kullanıcılar için rahatsızlık vermeden bir bilgisayarla çalışmayı zorlaştırmak için biraz renk ve çizgiler eklemeye karar verildi. Bu bir tür silah yarışıdır ve her zamanki gibi, daha ciddi silahlar herhangi bir koruma ile ortaya çıkıyor. Güçlendirilmiş CAPTCHA'yı yenmek daha zordur. Ayrıca, Sıradan insanlardan tahriş olmaması için görüntü oldukça basit kalmalıdır.

Bu görüntü, deşifre edeceğimiz bir kapaklama örneğidir. Bu, gerçek siteye gönderilen gerçek bir CAPTCHA'dır.

Bu, aynı renkteki karakterlerden oluşan ve bazı gürültü (piksel, renkler, satırlar) beyaz bir arka planda olan karakterlerden oluşan oldukça basit bir CAPTCHA'dır. Arka plandaki bu gürültünün tanımak zor olduğunu düşünüyorsunuz, ancak onu çıkarmak için nasıl kolay olduğunu göstereceğim. Çok güçlü bir kapaklama olmasa da, programımız için iyi bir örnek.

Resimlerden Metin Nasıl Bulun ve Çıkarılır

Metnin görüntüdeki konumunu ve ekstraksiyonunu belirlemek için birçok yöntem vardır. Google ile, metin aramak için yeni yöntemleri ve algoritmaları açıklayan binlerce makale bulabilirsiniz.

Bu örnek için, renkten çıkarmayı kullanacağım. Bu, oldukça iyi sonuçlar aldığım oldukça basit bir tekniktir. Tezim için bu tekniği kullandım.

Örneklerimiz için, çok değerli görüntü ayrışmasının algoritmasını kullanacağım. Özünde, bu ilk önce görüntü renklerinin histogramı yaptığımız anlamına gelir. Bu, bir görüntüdeki tüm pikselleri sınıf gruplandırması olan bir görüntüdeki, ardından her grup için hesaplanır. Test Captcha'ımıza bakarsanız, üç ana renk görebilirsiniz:

  • Beyaz arkaplan)
  • Gri (gürültü)
  • Kırmızı (metin)

Python'da çok basit görünecek.

Aşağıdaki kod görüntüyü açar, onu GIF'e dönüştürür (sadece 255 renk olduğundan, çünkü sadece 255 renk olduğundan bu yana daha kolay hale getirir).

Pil İthalat Görüntüsü Im \u003d Image.Open ("captcha.gif") im \u003d im.Convert ("P") Yazdır Im.Histogram ()

Sonuç olarak, aşağıdakileri alacağız:

Burada, görüntüdeki 255 renklerin her birinin piksel sayısını görüyoruz. Beyaz (255, sonuncusu) en sık karşılaştığını görebilirsiniz. Kırmızı gider (metin). Bundan emin olmak için küçük bir komut dosyası yazın:

PIL İçe Aktarma Görüntüsünden Operatör İçe Aktarım Itemgetter Im \u003d Image.Open ("captcha.gif") im \u003d im.Convert ("P") ("P") HIS \u003d IM.Histogram () değerleri \u003d () için aralık (256) : Değerler [i] \u003d J, K için [i] 'de sıralandı (değerler.items (), anahtar \u003d itemgetter (1), ters \u003d true) [: 10]: Yazdır J, K

Ve böyle verileri alıyoruz:

Bu, görüntüdeki en yaygın 10 renklerin bir listesidir. Beklendiği gibi, beyaz en sık tekrarlanır. Sonra gri ve kırmızı git.

Bu bilgiyi aldığımız anda, bu renk gruplarına göre yeni görüntüler oluştururuz. En yaygın renklerin her biri için, bu rengin piksellerinin siyahla doldurulduğu ve her şeyin beyaz olduğu yeni bir ikili görüntüyü (2 renk) yaratıyoruz.

Kırmızı, en yaygın renkler arasında üçüncü oldu ve bu, bir grup piksel grubunu rengiyle tutmak istediğimiz anlamına gelir. Deneme yaptığım zaman, rengin 220 olduğunun 220'ye yakın olduğunu buldum, bu yüzden bu grubu kurtaracağız. piksel. Aşağıdaki kod CAPTCHA'yı açar, onu GIF'e dönüştürür, beyaz bir arka plana sahip aynı boyutta yeni bir görüntü oluşturur ve daha sonra ihtiyacımız olan rengi arayarak orijinal görüntüyü atlar. İhtiyacımız olan renge sahip bir piksel bulursa, siyahın ikinci görüntüsündeki aynı pikselleri işaretler. İşlemi tamamlamadan önce, ikinci görüntü kaydedilir.

PIL İçe Aktarma Resminden IM \u003d Image.Open ("captcha.gif") im \u003d im.Convert ("P") IM2 \u003d Image.New ("P", IM.Size, 255) im \u003d im.Convert ("P ") TEMP \u003d () aralığında x için (IM.Size): aralık (IM.Size) içindeki Y için: pix \u003d im.getpixel ((Y, x)) Temp \u003d pix pix \u003d\u003d 220 veya pix \u003d\u003d 227: # Bunlar IM2.Putpixel ((Y, X), 0) IM2.Save ("çıkış.gif") almak için sayıdır.

Bu kod parçasının piyasaya sürülmesi bize aşağıdaki sonucu verir.

Resimde, arka plandan metin çıkarmayı başarıyla yönettiğimizi görebilirsiniz. Bu işlemi otomatikleştirmek için, birinci ve ikinci komut dosyasını birleştirebilirsiniz.

Nasıl istediğinizi duyuyorum: "ve ne metin farklı renklerde yazılırsa?". Evet, tekniğimiz hala çalışabilir. En yaygın rengin arka planın rengi olduğunu ve sonra karakterlerin renklerini bulabileceğini varsayalım.

Böylece, şu anda metni görüntüden kaldırdık. Bir sonraki adım, görüntünün metin içerip içermediğini belirleyecektir. Burada bir kod yazmayacağım, çünkü algoritmanın kendisi oldukça basittir.

Her piksel görüntüsü için: Pixel açıksa: Daha önce gördüğümüz herhangi bir piksel ise yanında ise: Aynı sete ekleyin: Yeni bir sete ekleyin

Çıktımda bir dizi sembol sınırına sahip olacaksınız. O zaman yapmanız gereken her şeyin kendileri aralarında karşılaştırmak ve art arda olup olmadıklarını görmek. Eğer öyleyse, jack-terinden düştün ve etrafta çalışan karakterleri doğru şekilde tanımladınız. Algoritma doğruluğunun olduğundan emin olmak için elde edilen alanların boyutlarını da kontrol edebilir veya basitçe yeni bir görüntü oluşturabilir ve (resimdeki gösteri ()).

PIL İçe Aktarma Resminden IM \u003d Image.Open ("captcha.gif") im \u003d im.Convert ("P") IM2 \u003d Image.New ("P", IM.Size, 255) im \u003d im.Convert ("P ") TEMP \u003d () aralığında x için (IM.Size): aralık (IM.Size) içindeki Y için: pix \u003d im.getpixel ((Y, x)) Temp \u003d pix pix \u003d\u003d 220 veya pix \u003d\u003d 227: # Bunlar IM2.Putpixel ((Y, X), 0) # Yeni Kod burada başlar. Burada başlar \u003d Yanlış foxletter \u003d false Start \u003d 0 End \u003d 0 harfler \u003d Y aralığına göre (IM2.Size): # Aralıkta (IM2.Size) içindeki # dilim (IM2.Size): # Dilim aşağı pix \u003d im2.getpixel (((Y, X)) pix! \u003d 255: inletter \u003d true triped \u003d\u003d false ve inletter \u003d\u003d true: foundaretter \u003d DOĞRU BAŞLATı \u003d Y Rakolu \u003d\u003d Doğru ve intletter \u003d\u003d Yanlış: FOUNDETTER \u003d FALSE UND \u003d Y harfleri.Append ((Başlat, Son)) GirişTer \u003d Yanlış Baskı Harfleri

Sonuç olarak, aşağıdakiler vardı:

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

Bunlar, her sembolün yatay olarak başlayıp bitmesi konumlarıdır.

Görüntüleri tanırken AI ve vektör alanı

Görüntü tanıma, her türlü ticari başvuruda uygulanmasını sağlayan modern AI'nin en büyük başarısı olarak kabul edilebilir. Bunun mükemmel bir örneği posta kodlarıdır. Aslında, birçok ülkede otomatik olarak okunur, o zamandan beri bilgisayara sayıları tanımak için öğretmek oldukça basit bir görevdir. Bu açık olmayabilir, ancak görüntülerin tanınması çok uzmanlaşmış olmasına rağmen AI'nin bir problemi olarak kabul edilir.

Bir nöronal ağ, görüntüleri tanımadaki ilk şeyin neredeyse ilk şeydir. Şahsen, karakterleri tanırken sinir ağlarında hiç başarılı olmadım. Genelde 3-4 sembolü öğretirim, daha sonra doğruluk o kadar düşük düşüyor ki, daha yüksek bir sıralama emri olacaktır, sembolleri rastgele tahmin ediyorum. İlk başta bana bir ışık paniğine neden oldu, çünkü tezimde bir bağlantının olmamasıydı. Neyse ki, yakın zamanda arama motorlarının vektör alanı hakkında bir makaleyi okudum ve alternatif bir veri sınıflandırma yöntemi olarak kabul ediyorum. Sonunda, o zamandan beri en iyi seçim olduğu ortaya çıktı.

  1. Kapsamlı çalışma gerektirmezler
  2. Yanlış veri ekleyebilir / silebilir ve hemen sonucu görebilirsiniz.
  3. Anlamak ve programları daha kolay
  4. Sınıflandırılmış sonuçlar veriyorlar, böylece üst X tesadüflerini görebilirsiniz.
  5. Bir şey bir şey tanımıyor mu? Ekleyin ve daha önce fark edilen bir şeyden tamamen farklı olsa bile anında e-posta gönderebilirsiniz.

Tabii ki, ücretsiz peynir olmaz. Hızdaki ana dezavantaj. Sinir ağlarından daha yavaş olabilirler. Ama bence avantajlarının hala bu kusur ağır bastığını düşünüyorum.

Vektör alanın nasıl çalıştığını anlamak istiyorsanız, vektör uzay arama motoru teorisini okumanızı tavsiye ederim. Bu, yeni başlayanlar için en iyisidir.

Yukarıda belirtilen belgeye dayanarak imaj tanınmamı geliştirdim ve o zamanlar okuduğum sevgili Jap'a yazmaya çalıştığım ilk şeydi. Bu belgeyi okuyun ve özünü nasıl anlayacaksınız - buraya gelin.

İade ettin mi? Tamam. Şimdi vektör alanımızı programlamalıyız. Neyse ki, zor değil. Hadi devam edelim.

İthalat Matematik Sınıfı Vektör Karışımı: DEF Büyüklük (öz, uyum): Toplam \u003d 0 kelime için, ConcorDance'de sayar.iteritems (): TOPLAM + \u003d COUNT ** 2 Dönüş Math.SQRT (Toplam) def ilişkisi (Öz, Concordance1, ConcorDance2) : Alaka düzeyi \u003d 0 Topvalue \u003d 0 kelime için, ConcorDance1.Ieritems () 'de sayılır: Eğer ConcorDance2.Has_key (Word): TopValue + \u003d Count * ConcorDance2 İade TopValue / (Self.Magnitude (Concorca1) * Self.Magnitude (Concorca2))

Bu, Python'daki vektör alanının 15 satırda uygulanmasıdır. Temel olarak, sadece 2 sözlük alır ve 0 ile 1 arasında bir sayı verir, nasıl bağlandıklarını gösterir. 0, bağlı olmadıkları, 1, aynı oldukları anlamına gelir.

Eğitim

İhtiyacımız olan bir sonraki şey, karakterlerimizi karşılaştıracağımız bir dizi resimdir. Bir öğrenme setine ihtiyacımız var. Bu set, kullanacağımız her türlü AI öğretmek için kullanılabilir (sinir ağları, vb.).

Kullanılan veriler tanınmanın başarısı için kader olabilir. Veriler daha iyi olursa, başarı şansı ne kadar büyük olur. Belirli bir Captcha'yı tanımayı planladığımız ve zaten ondan kaldırılabilir, sonra neden onları bir öğrenme seti olarak kullanmıyorsunuz?

Yaptığım. Üretilen çok sayıda haç indirdim ve programım onları mektuplara kırdı. Sonra ortaya çıkan görüntüleri koleksiyona (gruplar) topladım. Birkaç denemeden sonra, bir PIN ürettiği her sembolün en az bir örneğine sahiptim. Daha fazla sayıda örnek eklemek, tanıma doğruluğunu artıracak, ancak teorimi onaylamak için yeterince var.

PIL İçe Aktarma Görüntüsü'nden İçe Aktarma Hashlib Im \u003d Image.Open ("captcha.gif") IM2 \u003d Image.New ("P", IM.Size, 255) im \u003d im.Convert ("P") temp \u003d () Range (IM.Size) için x için IM.Histogram () için yazdırın: aralık (IM.Size) içindeki Y için: pix \u003d im.getpixel ((Y, X)) temp \u003d pix pix \u003d\u003d 220 veya pix \u003d\u003d 227: # Bunlar IM2.Putpixel ((Y, X), 0) intletter \u003d Yanlış FoundLetter \u003d False Start \u003d 0 End \u003d 0 harfler \u003d Y aralığında (IM2.Siz): # Dilim x için X için Aralıkta (IM2.Size): # Dilim aşağı pix \u003d im2.getpixel (((Y, X)) pix! \u003d 255: inletter \u003d TRUEFOUTTER \u003d\u003d false ve inletter \u003d\u003d true: foundLetter \u003d true start \u003d y FOUDETTER \u003d\u003d True ve inletter \u003d\u003d Yanlış: FOUNDLETTER \u003d YANLIŞ SON \u003d Y harfleri.Apt ((Başlat, Son)) GirişTer \u003d Yanlış # Yeni kod burada. Sadece her görüntüyü ayıklıyoruz ve diske kaydederiz, umarım, harflerdeki harf için benzersiz bir isim sayımı \u003d 0 olan, m \u003d hashlib.md5 () IM3 \u003d IM2.Crop ((harf, 0, harf, IM2.Siz)) M .Update ("% S% s"% (time.Time (), sayım)) IM3.Save ("./% S.GIF"% (M.HexDigest ())) Sayım + \u003d 1

Çıktımda, aynı dizinde bir dizi görüntü alıyoruz. Bunların her birinde, birkaç kapak yapmanız durumunda eşsiz bir karma atanır.
Test Captcha için bu kodun sonucu:

Bu görüntüleri nasıl saklayacağınıza karar verirsiniz, ancak onları yalnızca resimdeki aynı adı olan dizine (sembol veya şekil) yerleştirdim.

Hepinizi topluyoruz

Son adım. Metin çıkarım, karakterlerin çıkarılması, tanıma tekniğini ve eğitim setine sahibiz.

Bir kapak görüntüsü alıyoruz, metni vurguluyoruz, karakter alıyoruz ve daha sonra onları öğrenme setimizle karşılaştırır. Son programı bu linkte birden fazla ve az sayıda kapak ile indirebilirsiniz.

Burada sadece ile karşılaştırabilen öğrenmeyi yükleriz:

DEF BuiltVector (IM): D1 \u003d () Sayım \u003d 0 I'de I için IM.GetData (): D1 \u003d i Say + \u003d 1 Dönüş D1 V \u003d vectorCompare () iconset \u003d ["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 \u003d Iconset'teki mektup için: os.listdir'deki IMG için ("./iconset/%s/"%(letter)): Temp \u003d IF IMG! \u003d" thumbs.db ": Temp.Append (Image.Open (" ./ SimgeSet /% S /% S "(Mektup) , İmg))))) imageset.append ((Mektup: Temp))

Ve burada tüm büyü gerçekleşiyor. Her karakterin nerede olduğunu ve vektör alanımızın yardımıyla nerede olduğunu tanımlıyoruz. Ardından sonuçları sıralıyoruz ve yazdırırız.

Mektuplardaki harf için \u003d 0: M \u003d hashlib.md5 () IM3 \u003d IM2.Crop ((harf, 0, harf, IM2.Siz)) Guess \u003d ImageSet'teki resim için: Image.iteritems () içindeki x, y için : Eğer LEN (Y)! \u003d 0: tahmin.append ((V.Relation (Y, BuiltVector (IM3)), X)) Guess.SORT (Ters \u003d Doğru) Yazdır "", Tahmin Sayı + \u003d 1

sonuç

Şimdi ihtiyacınız olan her şeyimiz var ve mucize makinemizi başlatmaya çalışabiliriz.

Giriş Dosyası - CAPTCHA.GIF. Beklenen Sonuç: 7S9T9J

Python Crack.py (0.96376811594202894, "7") (0.96234028545977002, "S") (0.92868842868888929, "9") (0.98350370609844473, "T") (0.96751165072506273, "9") (0.96989711688772626262626, "J")

Burada iddia edilen sembolü ve gerçekten olduğu güven derecesini görüyoruz (0'dan 1'e kadar).

Görünüşe göre ben gerçekten her şeyi yaptım!

Aslında, test kapaklarında, bu komut dosyası, vakaların yaklaşık% 22'sinde başarılı bir sonuç verecektir.

Python crack_test.py doğru guesesses - 11.0 yanlış gueses - 37.0 yüzde doğru - 22.916666667 Yanlış - 77.0833333333

Yanlış sonuçların çoğu, "0" sayılarının ve "O" harflerinin yanlış tanımlanmasına düşer. Beklenmedik bir şey yoktur, çünkü insanlar bile sık sık karışır. Hala sembolleri kırarken bir sorunumuz var, ancak bölümün sonucunu kontrol ederek ve altın bir orta bularak çözülebilir.

Bununla birlikte, böyle bir çok mükemmel algoritmayla bile, her beşinci captcha'yı bir kişinin birinin birinin çözülmesi için zamanın olmadığı bir zamanda çözebiliriz.

Bu kodun Çekirdek 2 Duo E6550'deki yürütülmesi aşağıdaki sonuçları verir:

Gerçek 0m5.750s Kullanıcı 0m0.015s SYS 0M0.000S

Kataloğumuzda, bir tanesini çözmek için yaklaşık 0.12 saniye sürdüğünü takip eden kapak başına 48'dir. Başarılı katılaşmanın yüzde 22'simizle, günde yaklaşık 432.000 KAP'ı çözebilir ve 95.040 doğru sonuç alabiliyoruz. Ve eğer multithreading kullanıyorsanız?

Bu kadar. Umarım deneyimim sizin için iyi hedefler tarafından kullanılacaktır. Bu kodu zarar vermek için kullanabileceğinizi biliyorum, ancak gerçekten tehlikeli bir şey yapmak için oldukça güçlü bir şekilde değiştirmelisiniz.

Kendilerini korumaya çalışanlar için, bunun size sert bir şekilde yardımcı olmayacağını söyleyebilirim, çünkü programsal olarak ya da sadece onları manuel olarak çözecek diğer insanlara ödeme yapabilecekleri için. Korunmanın diğer yollarını düşünün.

Siteler tarafından korunan Captcha'yı atlamanın farklı yolları vardır. İlk olarak, ucuz manuel emek kullanan ve kelimenin tam anlamıyla 1 $ 'lık bir teklif için 1000 $' ı çözmek için özel hizmetler var. Alternatif olarak, belirli algoritmalara göre kendini tanınacak olan akıllı bir sistem yazmaya çalışabilirsiniz. İkincisi şimdi özel bir yardımcı program kullanılarak uygulanabilir.

CAPTCHA'yı çöz.

CAPTCHA TANITIŞI - Görev en sık nonticial değildir. Görüntü, geliştiricilerin güvenlik direncini güçlendirmek istediği bozulmayı ve parazitleri kaldırmak için birçok farklı filtre uygulamak için ihtiyacınız olan resim. Genellikle, stajyer sistemini sinir ağlarına dayanarak uygulamak gerekir (bu, bu arada, göründüğü gibi, göründüğü gibi, göründüğü kadar zor değil), CAPP'in otomatik çözümü üzerinde kabul edilebilir bir sonuç elde etmek için. Ne hakkında konuştuğumu anlamak için, arşivi yükseltmek ve harika makaleleri okumak daha iyidir "CAPTCHA: Teori ve Uygulama. Kapakların nasıl geçtiğini anlıyoruz "ve" göreceğiz ve tanıyacağız. Sırasıyla # 135 ve # 126 odadan itibaren CAPTCHA filtrelerini kesmek. Bugün, yazarın evrensel dilimlenmiş captcha'yı aradığı Tessercap'ın geliştirilmesini anlatmak istiyorum. Meraklı bir şey, ne kadar havalı olursa olsun.

Tessercap'a ilk bakış

Programın yazarı neler yaptı? Genellikle otomatik CAPTCHA çözümünün sorununa uygun olarak baktı ve bu deneyimi tek bir araçta özetlemeye çalıştı. Yazar, görüntüden gürültüyü kaldırmanın, yani CAPP'yi tanımadaki en zor görevin çözümleri, çoğu zaman aynı filtreler kullanıldığını fark etti. Görüntülerdeki filtreleri uygulamak için karmaşık matematiksel dönüşümler olmadan izin veren ve metni tanımak için bir OCR sistemiyle birleştiren uygun bir araç uygularsanız, tamamen verimli bir program alabilirsiniz. Bu, aslında, Gurs'ev Singh Calra'yı McAfee'den yaptı. Neden ihtiyacı vardı? Yardımcı programın yazarı, ana kaynakların kapaklarının ne kadar olduğunu kontrol etmeye karar verdi. Test için, ünlü istatistik hizmetlerinin versiyonuna göre en çok ziyaret edilen internet siteleri seçildi. Wikipedia, eBay gibi canavarlar ve Recapptcha sağlayıcısının yanı sıra, testlere katılım için aday oldu. Genel olarak, programın işleyişi ilkesini düşünürsek, o zaman oldukça basittir. Kaynak kapatma, yolu herhangi bir gürültü ve bozulmadan ve OCR sisteminin iletilen görüntüsünün konveyörünün ön işleme sistemine girer, bu metni tanımlamaya çalışır. TesserCap, etkileşimli bir grafiksel arayüze sahiptir ve aşağıdaki özelliklere sahiptir:
  1. Her bir CAPP için yapılandırılabilen görüntüleri ön işleme için evrensel bir sisteme sahiptir.
  2. Önceden analiz edilen ve hazırlanan CAPTCHA görüntüsünden gelen metni alan bir TessSeract tanıma sistemi içerir.
  3. Tanıma sisteminde çeşitli kodlamaların kullanımını destekler.
Genel anlamın açık olduğunu düşünüyorum, bu yüzden nasıl göründüğünü görmeyi öneriyorum. Yardımcı programın evrenselliği, arayüzünün komplikasyonuna yol açamaz, bu nedenle program penceresi küçük bir kadına girebilir. Öyleyse, doğrudan haçın tanınmasına geçmeden önce, arayüzü ve döşenen işlevselliği ile ilgilenmeyi önerdim.
Ön görüntü işleme ve çıkarma
capp metni

hakkında

Harika Tessercap yardımcı programının yazarı hakkında en az birkaç kelime söyleyemedik. Onun adı Gurs'ev Singh Calra. McAfee'de yer alan Foundstone Profesyonel Hizmetler Bölümünde ana danışman olarak çalışır. Gursyev, bu tür konferanslarda Toorcon, Nullcon ve Clubhack olarak gerçekleştirildi. Tessercap ve SSLSMART araçlarının yazarıdır. Ayrıca, şirketin iç ihtiyaçları için çeşitli araçlar geliştirmiştir. Favori Programlama Dilleri - Ruby, Ruby Rails ve C #. Çalıştığı Foundstone® Profesyonel Hizmetler Bölümü, organizasyonlar uzman hizmetleri ve eğitim sunduğu, varlıklarının en ciddi tehditlerden kalıcı ve etkili bir şekilde korunmasını sağlar. Profesyonel Hizmetler Bölümü ekibi, uluslararası şirketler ve devletle zengin işbirliği deneyimine sahip güvenlik ve geliştiriciler alanındaki tanınmış uzmanlardan oluşur.

Arayüz. Ana sekme

Programa başladıktan sonra, üç sekmeli bir pencere göründük: Ana, Seçenekler, Resim Ön İşlemciliği. Ana sekme, CAPTCHA-Image testini başlatmak ve durdurmak için kullanılan kontroller içerir, test istatistiklerinin oluşumunu (ne kadar yatırılır ve kaç tane), ön işleme için görüntüyü gezin ve seçme. URL giriş alanında (Kontrol numarası 1), tam URL, Web uygulamasının CAPP'yi çıkarmak için kullandığı belirtilmelidir. URL aşağıdaki gibi elde edilebilir: CAPTCHA-görüntüsünün sağ tarafına tıklayın, sayfa kodunu kopyalayın veya görüntüleyin ve URL'yi görüntü etiketinin SRC özniteliğinden çıkarın .. Site / Ortak / Puan / Captcha.asp ?. Adres dizesinin yakınında, test için indirilecek kapak sayısını isteyen bir unsurdur. Uygulama aynı anda sadece 12 görüntü gösterebildiğinden, sayfa dolandırıcılık için kontrol unsurlarını sağlar. Böylece, büyük ölçekli testlerle, yüklü kapaklardan geçebileceğiz ve tanınmalarının sonuçlarını görüntüleyebileceğiz. Düğmeler başlangıç \u200b\u200bve durduruldu ve test etmeyi durdurur. Testten sonra, her birini doğru veya yanlış olarak not ederek, görüntü tanıma sonuçlarını tahmin etmeniz gerekir. İkincisi, ikincisi, en önemli işlev, herhangi bir görüntüyü ön işleme sistemine iletmek için kullanılır, burada görüntüden gürültüyü ve bozulmayı kaldıran filtrenin belirtildiği. Resmi ön işleme sistemine aktarmak için, sağ fare düğmesiyle istediğiniz görüntüyü tıklamanız gerekir ve Bağlam menüsünde Resme Prep ProCessor'a Gönder'i seçin.

Arayüz. Seçenekler sekmesi

Seçenekler sekmesi, Tessercap'ı yapılandırmak için çeşitli kontroller içerir. Burada bir OCR sistemi seçebilir, Web Proxy ayarlarını ayarlayabilir, iletmeyi ve ön işleme görüntülerini açabilir, özel HTTP başlıkları ekleyebilir, ayrıca tanıma sistemi için karakter aralığını belirtebilir: sayılar, küçük harflerdeki harfler, harfler Büyük harf, özel karakterler. Şimdi her seçenek hakkında daha ayrıntılı olarak. Her şeyden önce, OCR sistemini seçebilirsiniz. Varsayılan olarak, yalnızca bir tane mevcuttur - Tesseract-Orc, böylece seçim ile uğraşmak zorunda değilsiniz. Başka bir çok ilginç program, karakter yelpazesinin seçimidir. Örneğin, Sitedeki CAPTCHA'yı alın - herhangi bir harf içermediği, ancak yalnızca sayıdan oluştuğu görülebilir. Peki neden sadece yanlış tanınma olasılığını artıracak ekstra karakterlere ihtiyacımız var? Peki ya büyük harf seçersen? Program, herhangi bir dilin büyük harflerinden oluşan bir kapak tanıyabilir mi? Hayır, yapamam. Program, \\ Program Dosyaları \\ Foundstone Free Araçları \\ Tessercap 1.0 \\ Tessdata \\ Config'lerde bulunan yapılandırma dosyalarından tanımak için kullanılan karakterlerin bir listesini alır. Örnekte açıklayacağım: sayıları ve küçük harf seçeneklerini seçtiysek, program TESDIT parametresiyle başlayan indirnemerik dosyayla irtibata geçecektir. char.beyaz listesi. CAPP'yi çözmek için kullanılacak bir karakter listesi izler. Varsayılan olarak, dosyalar yalnızca Latin alfabesinin harflerini içerir, bu nedenle Kirilleri tanımak için bir karakter listesini değiştirmek veya eklemek gerekir. Şimdi, HTTP istek başlıkları alanına ihtiyacınız olan hakkında biraz. Örneğin, bazı web sitelerinde, CAPTCHA'yı görmek için giriş yapılması gerekir. Tessercap'ı bir KAP'ye erişmek için kullanmak için, program, HTTP taleplerinde, Web Proxy (Fiddler, Burp, Charles, WebScarab, Paros, vb.) Kullanarak Kabul, Çerez ve Yönlendirme, vb. Gönderilen sorgu başlıklarını yakalayın ve bunları HTTP istek başlıkları giriş alanına girin. Muhtemelen yararlı olan bir diğer seçenek, yönlendirmeleri takip eder. Gerçek şu ki, varsayılan Tessercap'ın yönlendirilmemesi gerektiğidir. Bir görüntü elde etmek için Test URL'si görüntüyü izlemelise, bu seçeneği seçmeniz gerekir. Peki, daha sonra bakacağımız ön işleme mekanizmasının dahil edilmesini / bağlantısını kesen son seçenek kaldı. Varsayılan olarak, ön işleme görüntüleri devre dışı bırakılır. Kullanıcılar ilk önce resmin ön ayarının ön ayarını CAPTCHA görüntülerine göre test edin ve ardından bu modülü etkinleştirin. Tüm CAPTCHA imgeleri Görüntüyü Etkinleştir'i etkinleştirdikten sonra indirildikten sonra, ön işleme geçişi geçer ve metni çıkarmak için Tesseract OCR sistemine zaten iletilir.

Arayüz. Görüntü ön işleme sekmesi

Peki, en ilginç sekmeye vardık. Burada, filtrelerin tanıma sisteminin görevini mümkün olduğunca zorlaştırmaya çalışan çeşitli gürültü ve bulanıklığı gidermek için yapılandırılmıştır. Evrensel bir filtre kurma süreci son derece basittir ve dokuz adımdan oluşur. Ön işlemenin her aşamasında, görüntülenir. Ek olarak, sayfa bir uzatma filtresi ile kapatmanın doğruluğunu tahmin etmenizi sağlayan muayenenin bir bileşeni vardır. Her aşamada ayrıntılı olarak düşünün. Aşama 1. Renk inversiyonu Bu aşamada, CAPTCHA görüntüleri için piksellerin renkleri ters çevrilir. Aşağıdaki kod, bunun nasıl gerçekleştiğini göstermektedir: (CAPTCHA'daki her piksel) için (eğer (ters çevrilmiş ise) Yeni kırmızı \u003d 255 - Akım kırmızı ise (invertblue doğruysa) Yeni mavi \u003d 255 - Geçerli mavi ise (invertgreen doğruysa) Yeni Yeşil \u003d 255 - Mevcut Yeşil) Bir veya daha fazla rengin inversiyonu genellikle test Chaptcha-image'ı kontrol etmek için yeni özellikler açar. Aşama 2. Renk değişimi Bu adımda, görüntünün tüm pikselleri için renk bileşenlerini değiştirebilirsiniz. Her sayısal alan 257 (1 ila 255) olası değerler içerebilir. Her pikselin RGB bileşenleri için, değere bağlı olarak, aşağıdaki adımlar alanında gerçekleştirilir:
  1. Değer -1 ise, karşılık gelen renk bileşeni değişmez.
  2. Değer -1'e eşit değilse, belirtilen rengin tüm bulunan bileşenleri (kırmızı, yeşil veya mavi), alandaki girilen değere göre değiştirilir. 0 değeri, bileşeni siler, 255 değeri maksimum yoğunluğunu vb. Sarır.
Aşama 3. Gri Derecelendirme (Parlaklık Ölçeği) Üçüncü aşamada, tüm görüntüler gri tonlamalı sınıflarda görüntülere dönüştürülür. Bu, kaçırılamayan görüntüleri dönüştürmenin tek zorunlu adımdır. Seçilen düğmeye bağlı olarak, her pikselin renk bileşeni ile ilişkili aşağıdaki işlemlerden biri yapılır:
  1. Ortalama -\u003e (kırmızı + yeşil + mavi) / 3.
  2. İnsan -\u003e (0.21 * Kırmızı + 0.71 * Yeşil + 0.07 * Mavi).
  3. Minimum ve maksimum renk bileşenlerinin ortalaması -\u003e (minimum (kırmızı + yeşil + mavi) + maksimum (kırmızı + yeşil + mavi)) / 2.
  4. Minimum -\u003e Minimum (kırmızı + yeşil + mavi).
  5. Maksimum -\u003e Maksimum (kırmızı + yeşil + mavi).
CAPTCHA'nın renk bileşeninin yoğunluğuna ve dağılımına bağlı olarak, bu filtrelerin herhangi biri daha fazla işlem için çıkarılabilir görüntüyü iyileştirebilir.
Aşama 4. Düzgünleştirme ve Netlik Metnin ekstraksiyonunu CAPTCHA-görüntülerinden çıkarmak için, tek sahne veya çok taraflı noktalar, yabancı çizgiler ve mekansal bozulmalar biçiminde gürültü eklerler. Görüntüyü yumuşatırken, kova veya kesme filtrelerinin kullanıldığını ortadan kaldırmak için rastgele gürültü artar. Sayısal alanda, geçişler bir sonraki adıma geçmeden önce uygun görüntü maskesini ne kadar kullanmanız gerektiğini belirtilmelidir. Filtrenin bileşenlerine yumuşatma ve keskinliği artırmak için bakalım. İki tür görüntü maskesi mevcuttur:
  1. Sabit maskeler. Varsayılan olarak, TesserCap en popüler altı resim maskesi vardır. Bu maskeler görüntüyü düzeltebilir veya netliği (Laplace dönüşümü) arttırabilir. Uygun düğmeleri kullanarak maskeyi seçtikten hemen sonra değişiklikler görüntülenir.
  2. Özel görüntü maskeleri. Kullanıcı, özel görüntü işleme maskelerini, değerleri sayısal alanlara girerek ve Kaydet Maskesi düğmesine basarak da yapılandırabilir. Bu pencerelerdeki katsayıların toplamı sıfırdan azsa, bir hata verilir ve maske geçerli değildir. Sabit bir maske seçerken, Kaydet Maskesi düğmesi gerekli değildir.
Aşama 5. Gri tonlarını tanıtın Görüntü işleme aşamasında, pikselleri çok çeşitli gri tonlarında boyanabilir. Bu filtre, gri derecelendirmelerin 20 bakriyet (kova) / aralıklarla dağılımını gösterir. 0-12 arasında gri tonlarında boyanmış piksellerin yüzdesi, Bakketet (Kova) 1 arasındadır. vb. Kullanıcı, gri tonlarına karşılık gelen her değer aralığı için aşağıdaki adımlardan birini seçebilir:
  1. Olduğu gibi bırak.
  2. Beyaz yerine (beyaz).
  3. Siyah yerine.
Bu seçenekler sayesinde, gri tonlarının çeşitli aralıklarını kontrol edebilir, yanı sıra gri renk tonlarını beyaz veya siyaha doğru değiştirerek gürültüyü kesebilir / çıkarabilirsiniz. Adım 6. Kesme ayarı (CutOff) Bu filtre, oluşum sıklığından gelen gri seviyesinin değerinin bir grafiğini oluşturur ve bir klibi seçmek için teklifler. Kesme filtresinin çalışma prensibi, psödokodda aşağıda gösterilmiştir: (Pixel'in gri tonlamalı değeri<= Cutoff) pixel grayscale value = (0 OR 255) -> Hangi seçeneğe bağlı olarak (<= или => : Havva pikselini değeri ile ayarlayın<=/=> Eşik 0. 255'e kalır) Grafik, CAPTCHA piksellerinin renklerde ayrıntılı bir dağılımını gösterir ve gri seviyelerin seviyesini keserek parazitin giderilmesine yardımcı olur. Aşama 7: Açma (Doğrama) Düzgünleştirme, kesme, kova ve diğer captcha-görüntü filtrelerini uyguladıktan sonra, hala tek sahne veya çok taraflı noktalar, yabancılar ve mekansal bozulmalarla gevşetilebilir. Kesme filtresinin çalışma prensibi aşağıdaki gibidir: Bitişik piksellerin sayısı gri tonunda boyanmışsa, sayısal alandaki boyuttan daha az, kanal filtresi bunları 0 (siyah) veya 255 (beyaz) değerini atar. Bir kullanıcıyı seçerek. Bu durumda, CAPTCHA hem yatay hem de dikey yönde analiz ediliyor. Aşama 8: Sınır genişliğini değiştirme Yardımcı programın yazarına göre, Tessercap'ın ilk araştırması ve geliştirilmesi sırasında, CAPTCHA-görüntülerinin kalın bir sınır çizgisine sahip olduğunda ve renginin CAPTCHA'nın ana arka planından farklı olduğunda, bazı OCR sistemlerinin metni tanımadıklarında, defalarca defalarca belirtilmiştir. Bu filtre sınır çizgilerini ve değişikliklerini işlemek için tasarlanmıştır. Sayısal alanda listelenen genişliğe sahip sınır çizgileri, kullanıcı seçimine göre siyah veya beyaz olarak boyanır. Aşama 9: Gri gölgenin inversiyonu Bu filtre her pikselini geçer ve psödokodda gösterildiği gibi, gri yeni seviyesinin değerini değiştirir. Gri'nin inversiyonu, OCR sisteminin renk ayarları altında görüntüye uyacak şekilde gerçekleştirilir. İçin (CAPTCHA'daki her piksel) yeni gri tonlamalı değer \u003d 255 - Mevcut gri tonlamalı değer Adım 10: Tanınma Kontrolü Yakalama Bu aşamanın amacı, OCR sisteminin önceden işlenmiş captcha-imajını tanıma için aktarmaktır. Çözme düğmesi, gri bir inversiyon filtresinden sonra bir görüntüyü alır, metni çıkarmak için OCR sistemine gönderilir ve döndürülen metni grafiksel arayüzde görüntüler. Tanınan metin, bir pim üzerindeki metne çakışıyorsa, filtreyi önceden işleme için doğru şekilde ayarlarız. Şimdi Seçenekler sekmesine gidebilir ve ardından tüm yüklenen tüm kapakların işlenmesi için ön işleme seçeneğini etkinleştirebilirsiniz.

Capps tanımak

Belki de, bu yardımcı programın tüm seçeneklerine baktık ve şimdi her türlü gücü test etmek güzel olurdu ..
Capper sahasının önündeki analizinin sonucu
görüntü işleme. Sonuçlara göre yargılama, filtre
Almak mümkün değildi, bu yüzden yardımcı programı başlatıp dergi sitesine gidiyoruz. Yeni haberlerin bir listesini görüyoruz, karşılaşan ilk şeye gidin ve yorumunuzu bırakabileceğiniz yere gidin. Evet, yorumun eklenmesi çok kolaydır (hala olabilir, ancak uzun zamandır zaten uyudum) - bir PIN girmeniz gerekir. Otomatikleştirmenin mümkün olup olmadığını kontrol edin. Resmin URL'sini kopyalayın ve Tessercap'ın adres dizgisine yerleştirin. Kapaklar başına 12 yüklemeniz gerektiğini belirtir ve Başlat'ı tıklatın. Program itaatkar bir şekilde 12 fotoğraf yükler ve bunları tanımaya çalıştı. Ne yazık ki, tüm capps, yazıt tarafından kanıtlandığı gibi, bunların altındaki ve bunların altına alınmadığı veya tanınmamış. Genel olarak, şaşırtıcı değildir, çünkü yabancı sesler ve bozulma kaldırıldı. Bu şimdi ilgileneceğiz. İndirilen 12 resimden birine sağ tıklayın ve ön işleme sistemine gönderin (görüntü ön işlemciye gönderin). Kapsalar başına 12'sini dikkatlice inceledi, sadece sayıları içerdiklerini görüyoruz, bu yüzden Seçenekler sekmesine gidiyoruz ve yalnızca sayıların tanıdığı (Karakter seti \u003d numerics) olduğunu belirtin. Filtreleri ayarlamak için şimdi resim ön işleme sekmesine gidebilirsiniz. Hemen ilk üç filtre ile oynadığı ("Renkli inversiyon", "renk değişikliği", "Gri tonlamalı"), olumlu bir etki görmedim, bu yüzden orada her şeyi varsayılan olarak bıraktım. Pürüzsüz maske 2 maskesini seçtim ve birine eşit geçiş sayısını ayarladım. Gri tonlamalı kova filtresi, özledim ve hemen kırpma ayarına geçti. 154 değerini seçtim ve daha az olan piksellerin 0'da ayarlanması gerektiğini ve 255'te daha fazla olan piksellerin. Filtre anlamı içermiyordu, bu yüzden hemen çözülmeye bastım. Bir pim, 714945 numaralı bir numaraya sahiptim, ancak program bunu 711435 olarak tanıdı. Bu, gördüğünüz gibi, tamamen yanlış. Sonuçta, bildiğim gibi normalde çalışmadım. Herhangi bir sorun olmadan tanıyabilen pastebin.com ile denemek zorunda kaldım. Fakat eğer kendinizi ve hastayı aydınlatırsanız ve kampanyanın siteden doğru şekilde tanınmasını sağlayacaksanız, hemen Seçenekler sekmesine gelin ve görüntülerin önceden işlenmesini açın (görüntü ön işleme işlemini etkinleştir). Ardından Ana'ya gidin ve Başlat'ı tıklatarak, şimdi filtreniz tarafından önceden işlenecek olan CAPP'nin taze bir kısmını yükleyin. Program çalıştıktan sonra, doğru / yanlış tanınan kapatma (yanlış düğmeler olarak doğru / işaret olarak işaretleyin) kontrol edin. Bundan sonra, istatistikleri gösteren konsolide tanıma istatistiklerine bakabilirsiniz. Genel olarak, bu belirli bir CAPTCHA'nın güvenliği hakkında tuhaf bir rapordur. Bir veya başka bir çözüm seçme hakkında bir soru varsa, TesserCap'in yardımıyla kendi testlerini geçirmek mümkündür.

CAPTCHA doğrulama popüler sitelere sonucu

Web Sitesi ve Paylaş Tanınan Haç:
  • Wikipedia\u003e% 20-30
  • EBay\u003e% 20-30
  • reddit.com\u003e% 20-30
  • CNBC\u003e% 50
  • foodNetwork.com\u003e% 80-90
  • dailyMail.co.uk\u003e% 30
  • megaupload.com\u003e% 80
  • pastebin.com\u003e% 70-80
  • caveneue.com\u003e% 80

Sonuç

CAPTCHA görüntüleri, web uygulamalarını otomatik form doldurmadan korumak için en etkili mekanizmalardan biridir. Bununla birlikte, zayıf kapaklar rastgele robotlara karşı koruyabilecek ve hedeflenen girişimleri çözme girişimlerine karşı durduramazlar. Kriptografik algoritmalar gibi, CAPTCHA görüntüleri, dikkatlice test edilmiş ve yüksek düzeyde bir güvenlik sağlayan, korumanın en iyi yoludur. Programın yazarının listelendiği istatistiklere dayanarak, projelerim için ReCAPTCHA'yı seçtim ve tüm arkadaşlarıma tavsiye edeceğim - test edilenden en dirençli olduğu ortaya çıktı. Her durumda, yarı otomatik bir CAPTCHA çözümü sunan birçok hizmet olduğunu unutmamalısınız. Özel bir API aracılığıyla, görüntüyü servise geçirirsiniz ve kısa sürede bir çözüm döndürür. Repulse kişisine (örneğin, Çin'den), onun için kuruşunu aldığına karar verir. Burada koruma yok. 🙂

Python'a hafifçe ustalaşmaya karar verdim, ama "sadece PCP değil" ile ilgilenmiyorum. Çok paralı ilgi patthon yapma.

Dava, 2012'den itibaren HABRA ile başladı (genel 2009'daki Grafik Kütüphanesi).
Kod: https://habrahabr.ru/post/149091/

Bir kutu 2,7.10'um var ve kod 2.5 (Yağ PIL ile) yazılmıştır. Bunu 2.7.3'te mükemmel bir şekilde başladı.

PIL GUNNED
Kod: # indir
cURL -O -L http://effbot.org/media/downloads/imaging-1.1.7.tar.gz
# Ayıkla
tAR -XZF IMGING-1.1.7.TAR.GZ
cD Görüntüleme-1.1.7
# İnşa ve yükleme
python setup.py yapı
sudo python setup.py yüklemek
Ya da yönetici izinleri gerektirmeden sadece siz için yükleyin:
# Python setup.py kurulum - kullanıcı

Daha sonra modülü bu şekilde ithal etti

Kod: Konsol için kadran
python
# Tercümanın komuta etmesini sağlar
İthalat Pil.
# Tamamen tamamsa, çıkmak için CTRL + D tuşlarına basın.

Sızma, Cyril ile dostça değil, yapısı dosyanın başlangıcına eklendi (böylece Cyril'in zanaatında yorum yapmak mümkün olacaktır)
Kod: # - * - Kodlama: UTF-8 - * -

İşte bisikletin kendisi (nasıl döngüleri yazacağımı bilmiyorum ve nasıl değerlendireceğimi bilmiyordum, bu yüzden ellerimin üzerine çok şey yapıldı).

Kod: # - * - Kodlama: UTF-8 - * -
# Rus karakterleri için bu adam gerekli

pil İthalat Görüntüsünden

operatör ithalatından ithalatçı


im \u003d im.Convert ("P")
onun \u003d im.histogram ()
değerler \u003d ()

aralıkta (256) için:
Değerler [i] \u003d onun [i]

j, K sıralı olarak (değerler.items (), anahtar \u003d itemgetter (1), ters \u003d doğru) [: 15]:
Baskı "veya pix \u003d\u003d", j #, k

# J değişkeninde, en popüler on renk depolanır

pil İthalat Görüntüsünden

im \u003d image.Open ("captcha.gif")
im \u003d im.Convert ("P")

im \u003d im.Convert ("P")

aralıkta x için (IM.Size):
Aralıktaki Y için (IM.Size):
Pix \u003d im.getpixel ((Y, X))
temp \u003d pix.
# burada renk
im2.putpixel ((Y, X), 0)

im2.Save ("çıkış.gif")

# İşte tekrar baştan beri görünüyor

pil İthalat Görüntüsünden

im \u003d image.Open ("çıkış.gif")
im \u003d im.Convert ("P")
iM2 \u003d Image.New ("P", IM.Size, 255)

im \u003d im.Convert ("P")

aralıkta x için (IM.Size):
Aralıktaki Y için (IM.Size):
Pix \u003d im.getpixel ((Y, X))
temp \u003d pix.
Eğer pix \u003d\u003d 255: # bunlar almak için sayılar
im2.putpixel ((Y, X), 0)

# Yeni kod burada başlıyor

İnletter \u003d yanlış
kodu \u003d Yanlış
başlat \u003d 0.
sonu \u003d 0.


pix \u003d im2.getpixel ((Y, X))
Eğer pix! \u003d 255:
İnletter \u003d true.
Kodu \u003d Doğru.
Başlat \u003d Y.


Kodu \u003d Yanlış
Sonuncusu \u003d Y.
Harfler.append ((başlangıç, son))

İnletter \u003d yanlış
harfleri yazdır.

# İncir bilir

sınıf Vektör Karıştırma:
Def büyüklüğü (öz, uyum):
Toplam \u003d 0.
Kelime için, ConcorDance.ieritems () içinde say:
Toplam + \u003d Kont ** 2
Dönüş Math.SQRT (Toplam)

Def ilişkisi (öz, eşya1, uyumsuzluk2):
Alaka \u003d 0.
TopValue \u003d 0.
Kelime için, ConcorDance1.ieriterims () bölümünde say:
ConcorDance2.has_key (Word) ise:
TopValue + \u003d Count * Concordance2
İade TopValue / (Self.Magnitude (Concorca1) * Self.Magnitude (Concorca2))

# Karakter kümesi

pil İthalat Görüntüsünden
İthalat hashlib
İthalat süresi.

im \u003d image.Open ("captcha.gif")
iM2 \u003d Image.New ("P", IM.Size, 255)
im \u003d im.Convert ("P")

İm.histogram ()

aralıkta x için (IM.Size):
Aralıktaki Y için (IM.Size):
Pix \u003d im.getpixel ((Y, X))
temp \u003d pix.
# burada renk
Eğer pix \u003d\u003d 187 veya pix \u003d\u003d 224 veya pix \u003d\u003d 188 veya pix \u003d\u003d 223 veya pix \u003d\u003d 145 veya pix \u003d\u003d 151 veya Pix \u003d\u003d 145 veya PIX \u003d\u003d 151 veya PIX \u003d\u003d 181 veya PIX \u003d\u003d 144 veya PIX \u003d\u003d 225 veya PIX \u003d\u003d 182 ise ise Veya pix \u003d\u003d 189 veya pix \u003d\u003d 12 veya pix \u003d\u003d 17 veya pix \u003d\u003d 139 veya pix \u003d\u003d 152: # veya pix \u003d\u003d
im2.putpixel ((Y, X), 0)

İnletter \u003d yanlış
kodu \u003d Yanlış
başlat \u003d 0.
sonu \u003d 0.

aralıktaki Y için (IM2.Size): # dilim
Aralıkta x için (IM2.Size): # Dilim aşağı
pix \u003d im2.getpixel ((Y, X))
# burada "255'e eşit değil", bu - "beyaza eşit değil" idi.
Pix \u003d\u003d 255 ise:
İnletter \u003d true.

Foxletter \u003d\u003d false ve intletter \u003d\u003d true ise:
Kodu \u003d Doğru.
Başlat \u003d Y.

Eğer fountionter \u003d\u003d true ve inletter \u003d\u003d false ise:
Kodu \u003d Yanlış
Sonuncusu \u003d Y.
Harfler.append ((başlangıç, son))
İnletter \u003d yanlış

# Yeni kod burada. Sadece her görüntüyü çıkarırız ve diske kaydedin
# Umarım benzersiz bir isim nedir

sayım \u003d 0.
harflerdeki mektup için:
M \u003d hashlib.md5 ()
im3 \u003d im2.crop ((harf, 0, harf, im2.size))
M.update ("% S% s"% (Time.Time (), Sayım)))
im3.Save ("./% s.gif"% (M.HexDigest ()))
Sayın + \u003d 1

Çalışma prensibi budur: bir histogram yapın, en sık görülen tonları çıkarın, siyah ve beyaz dinlenin, sınırlardaki sembolleri bölün, karakterleri örneklerle karşılaştırır.

10 popüler gölge olmadan, 15 popüler gölge olmadan (karakterler üzerinde kırılmadı - bir kalp simgesi).

Orijinal CAPTCHA, 15 popüler gölgesiz, 2 karaktere (kirli) kırılmış.

Basit kapatma altında, kekeyi oldukça gerçekçidir. Son işlem ve koşmak için basit arabaları olan ilginç yerlere ihtiyacımız var.

Bu, Baltık Araştırma Mühendisliği yarışmasında benim tarafımdan sunulan çalışmanın adıydı ve bana bir Roma olanı ve yeni bir dizüstü bilgisayar ile büyüleyici bir kağıt parçası getirdi.

Çalışma, CAPTCHA'yı, SMS oluşumlarında büyük hücresel operatörler tarafından kullanılan ve bunlar tarafından kullanılan yaklaşımın yetersiz verimliliğini göstermekti. Gurur çizilmesine zarar vermemek için, bu operatörleri alegorik olarak arayacağız: kırmızı, sarı, yeşil ve mavi.

Proje resmi adını aldı Captchure. Ve gayri resmi Arızalı güvenlik önlemlerini kırmak. Herhangi bir tesadüf rastgele.

Garip yeterince, hepsi (neredeyse her şey) bu captcha oldukça zayıftı. En küçük sonuç% 20'dir - Sarı operatöre, en büyüğüne aittir -% 86 - Mavi. Böylece "verimsizlik gösterimi" görevinin başarıyla çözüldüğüne inanıyorum.

Tam olarak hücresel operatörleri seçmenin nedenleri önemsiz. Saygın bir bilimsel jüri, bisiklete "hücresel operatörlerin herhangi bir nitelikte bir programcıyı işe almak için yeterli paraya sahip olduğunu ve aynı zamanda spam sayısını en aza indirmeleri gerektiğini söyledim; Böylece, captcha, araştırmalarımın gösterdiği gibi, bu kadar güçlü olmalı. " Aslında, her şey çok daha kolaydı. Herhangi bir basit captcha tanımak ve kırmızı operatörü bir Captcha kurbanı ile seçtiği deneyim kazanmak istedim. Ve bundan sonra, yukarıda belirtilen hikaye geriye doğru doğdu.

Yani, vücuda daha yakın. Sahip olmadığım dört tür tüm Captcha'yı tanımak için mega yapımı bir algoritma yoktur; Bunun yerine, her bir CAPTCHA türü için ayrı ayrı 4 farklı algoritma yazdım. Bununla birlikte, algoritmaların detaylı olarak farklı olmasına rağmen, bir bütün olarak çok benzer olduğu ortaya çıktı.

Bana göre birçok yazar gibi, CAPTCHA tanıma görevini 3 alt onaylar için kırdım: ön işleme (ön işlem), segmentasyon ve tanıma. Ön işleme aşamasında, çeşitli sesler, çarpıtma vb. Orijinal görüntüden çıkarılır. Kaynak görüntünün segmentasyonunda, bireysel karakterler vurgulanır ve post işleminden (örneğin, ters döndürme) yapılır. Tanımlanırken, karakterler önceden eğitilmiş bir sinir ağı tarafından işlenir.

Yalnızca ön baskıdan önemli ölçüde farklı. Bunun nedeni, çeşitli CAPTCHA'nın çeşitli görüntü bozulmalarının çeşitli yöntemlerinde sırasıyla kullanılması ve bu çarpıtmaların giderilmesi için algoritmalar büyük ölçüde farklılık göstermektedir. Segmentasyon, küçük fırfırlar ile bağlı bileşenler bulma fikrini kullanır (yalnızca sadece stillerde yapmak zorunda kaldılar). Tanıma kesinlikle üç operatörde aynıydı - tekrar tekrar, sadece sarı bir operatör farklıydı.

Son olarak, siyahlar beyaz boyalıdır (10px'den az) siyah Şekerleme:

Bazen (nadiren, ancak olur) harf birkaç parçaya ayrılır; Bu sinir bozucu yanlış anlaşılmayı düzeltmek için, bağlantının birkaç bileşeninin kimliğini bir sembolle tahmin eden oldukça basit sezgisel olarak kullanıyorum. Bu değerlendirme, yalnızca her sembolün açıklayan dikdörtgenlerin (sınırlayıcı kutular) yatay konumuna ve boyutlarına bağlıdır.

Birçok karakterin bir bağlantının bir bileşenine birleştirildiği ve bu nedenle bunları bölmek için gerekli olduğuna dikkat etmek kolaydır. Burada, görüntüde her zaman tam olarak 5 karakter olduğu gerçeği. Bu, bulunan her bir bileşende kaç karakter bulunduğunu büyük bir doğrulukla hesaplamanızı sağlar.

Böyle bir algoritmanın çalışma prensibini açıklamak için maçın derinliklerine geçmesi gerekecektir. N için bulunan segment sayısını ve genişliğin masifi olduğunu gösterir ( doğru, evet?) Genişlikler için tüm bölümler [n]. Yukarıda belirtilen adımlar n\u003e 5'ten sonra, görüntü tanımayacağını varsayacağız. Tüm olumlu terimler için 5 numaranın tüm olası ayrışmalarını düşünün. Bunlardan birkaçı var - sadece 16. Her ayrışma her bir ayrışma, bulunan bağlı bileşenlerdeki bazı karakterlerin bazı olası düzenlemesine karşılık gelir. Sonuçta ortaya çıkan segmentin, ne kadar çok içerdiğinin daha fazla olduğunu varsaymak mantıklıdır. Tüm topuklu ayrışmaların, yalnızca terimlerin sayısının N'ye eşit olduğunu seçeceğiz. Her bir elemanı genişlikten genişlikten böleriz - bunları normalleştirin. Kalan tüm genişlemelerle aynısını yapıyorum - her sayıyı birinci terimde onlara böleriz. Ve şimdi (dikkat, doruk!) Nihai sipariş edilen N-KI'nin N boyutlu alandaki nokta olarak düşünebileceğini unutmayın. Bunu dikkate alarak, beşin normalize edilmiş genişliklere en yakın ayrışmayı bulacağız. Bu istenen sonuçtur.

Bu arada, bu algoritma ile bağlantılı olarak, bu sayının tüm ayrışmalarını bulmanın, gerçekten, gerçekten, gerçekten, Python veri yapılarında bulaşmamış olan bileşenlerdeki tüm ayrışmaları bulmanın bir başka bir yolu. Kısacası - Belli bir uzunluğun ayrışması sayısının, pascal üçgenin karşılık gelen seviyesiyle çakıştığını belirten açıkça ortaya çıktı. Ancak, bu algoritmanın uzun zamandır bilindiğinden eminim.

Öyleyse, her bir bileşenindeki karakter sayısını belirledikten sonra, aşağıdaki hourist oluşur - semboller arasındaki ayırıcıların karakterlerden daha ince olduğuna inanıyoruz. Bu samimi bilginden yararlanmak için, N-1 ayırıcılarının segmentini yerleştirin, burada n segmentteki karakter sayısıdır, daha sonra her ayırıcının küçük bir mahallesinde, görüntü projeksiyonunu aşağı doğru hesaplıyoruz. . Bu projenin bir sonucu olarak, birçok piksel sütunun sembollere ait olduğu hakkında bilgi alıyoruz. Son olarak, her projeksiyonda, asgari bulacağız ve orada ayırıcıyı kaydıracağız, daha sonra bu ayırıcılardaki görüntü kırılıyor.

Sonunda tanıma. Dediğim gibi, ona nöralet için başvuruyorum. Eğitimi için, ilk başta genel başlık altında iki yüz görüntü kullanıyorum tren seti. Önceden yazılı ve ilk iki aşamayı yazılı ve hata ayıkladı, bunun sonucunda çok sayıda düzgünce dilimlenmiş segmentli bir klasör alıyorum. Ardından, ellerinizle çöpleri temizlerim (örneğin, yanlış segmentasyonun sonuçları), daha sonra sonuç, bir boyuta sunar ve musluklara bir FANN veriyorum. Çıkışta, tanımak için kullanılan eğitimli sinir ağı alıyorum. Bu şema sadece bir kez başarısız oldu - ama bu daha sonra.

Sonuç olarak, test setinde (eğitim için kullanılmaz, kod adı - deneme seti.) 100 fotoğraftan 45'ten itibaren 45. Çok fazla değildi. Sonuç - elbette, örneğin ön hazırlık veya tanıma değişimini açıklığa kavuşturulabilir, ancak dürüst olmak gerekirse, onunla uğraşmak için tembel oldum.

Ek olarak, algoritmanın performansını tahmin etmek için başka bir kriter kullandım - ortalama bir hata. Aşağıdaki gibi hesaplandı. Her görüntü için, bu görüntü hakkındaki algoritmanın görüşü ile doğru cevap arasında Levenshtein mesafesi vardı - daha sonra aritmetik ortalama tüm görüntülerde alındı. Bu tür captcha için, ortalama hata 0.75 karakter / görüntü idi. Bana öyle geliyor ki bu sadece tanınma yüzdesinden ziyade daha doğru bir kriter.

Bu arada, neredeyse her yerde (sarı operatör hariç) bu şemayı kullandığım - TrainSet'te 100, test setinde 100 fotoğraf.

Yeşil.

Bir sonraki hedef yeşile seçtim - bir bozulma matrisinin seçiminden daha ciddi bir şey almak istedim.

Avantajları:

  • Üç boyutlu etki
  • Döndür ve ofset
  • Açılmamışlık

Dezavantajları:

  • Belirgin bir şekilde daha koyu arka plan sembolleri
  • Dikdörtgenin üst tarafı açıkça görülebilir - ters rotasyon için kullanabilirsiniz

Bu eksikliklerin önemsiz görünmesi durumunda bile, operasyonları tüm avantajlarla çok etkili bir şekilde başa çıkmanıza olanak sağlar.

Yine, ön işleme ile başlayacağız. İlk olarak, dikdörtgenin dönüş açısını, sembollerin yalan söylüyor. Bunu yapmak için, ERODE operatörünü orijinal görüntüye (yerel bir minimum arayın), ardından dikdörtgen artıklarını vurgulamak için eşik ve nihayet inversiyon kullanıyoruz. Siyah bir arka plan üzerinde oldukça beyaz bir nokta alıyoruz.

Sonra derin bir düşünce başlar. İlk. Tüm dikdörtgenin dönüş açısını tahmin etmek için, üst tarafının dönme açısını tahmin etmek yeterlidir. İkinci. Üst tarafın dönüş açısını doğrudan, bu tarafa paralel olarak tahmin edebilirsiniz. Üçüncü. Doğrudan dikey, yeterince iki parametre hariç, herhangi bir doğrudan tanımlamak için - Koordinatlar ve eğim açısı açısından dikey olarak kayar ve sadece ikinci ile ilgileniyoruz. Dördüncü. Düz bir çizgi arama görevi çok büyük bir büst değil - çok büyük açılar oraya dönerek gerçekleşmez ve ultra yüksek doğruluğa ihtiyacımız yok. Beşinci. Gerekli doğrudan aramak için, istediğiniz kadar yakın olan her bir değerlendirmeyi, daha sonra bir maksimum seçmek mümkündür. Altıncı. En önemli. Doğrudan bir miktar eğim açısını değerlendirmek için, üstdeki görüntülerin doğru bir eğim açısıyla doğrudan endişelendiğini düşünün. Görüntünün boyutundan ve eğim açısından açıkça dikey olarak dikey olarak kaydırılmasını açıkça hesaplayabileceği açıktır, böylece kesinlikle ayarlanmıştır. Sonra, bunu yavaş yavaş aşağı doğru hareket ettireceğiz. Bir noktada beyaz noktaya dokunuyor. Bu anı hatırlıyoruz ve geçiş alanı düz bir leke ile. Size düz çizginin düzlemde 8 bağlantılı olduğunu, bu yüzden salondan düz çizginin bir boyuta sahip olduğu ve alanın iki boyutlu olduğu konsepti olduğu, bu yüzden kızgın bağırır. Öyleyse, bir süredir bunu doğrudan aşağı doğru hareket ettireceğiz, her adımda geçiş alanını anadım, ardından elde edilen sonuçları özetliyoruz. Bu miktar ve bu dönme açısının bir değerlendirmesi olacaktır.

Yukarıdakileri özetler: Böyle bir yönden bakacağız, aşağı doğru hareket ettiğinde, bu düz üzerinde yatan piksellerin parlaklığını en keskin şekilde arttırır.

Böylece, dönme açısı bulunur. Ancak kazanılan bilgiyi uygulamak için acele etmemelisiniz. Gerçek şu ki, imajın kağınını tartışacak ve ihtiyacımız olacak.

Bir sonraki adım, arka plandan gelen sembollerin sistemidir. Burada, sembollerin çok daha koyu arka plan olduğu gerçeğine büyük ölçüde yardım edeceğiz. Geliştiriciler tarafından oldukça mantıklı bir adımdır - aksi takdirde resim okumak çok zor olurdu. Kim inanırsa - görüntüyü bağımsız olarak iklimlendirebilir ve emin olun.

Bununla birlikte, "alnında" yaklaşım - eşik dönüşümüyle sembolleri kesme girişimi - çalışmaz. Elde etmeyi başardığım en iyi sonuç T \u003d 140'dadır - çok denize edilebilir görünüyor. Çok fazla çöp var. Bu nedenle, bir geçici çözüm uygulamak zorunda kaldım. Buradaki fikir bir sonraki. Semboller genellikle bağlanır. Ve genellikle görüntüdeki en karanlık noktalara aittirler. Ve eğer bu koyu doldurma doldurmayı uygulamaya çalışırsanız ve daha sonra çok küçük sular altında suları atarsanız, açık çöp?

Sonuç, dürüstçe, şaşırtıcı. Çoğu görüntü arka plandan tamamen kurtulmayı başarır. Bununla birlikte, sembolün birkaç parçaya parçalanması, bu durumda bir koltuk değneği segmentasyonda yardımcı olabilir - ancak biraz sonra.

Son olarak, dilate ve erode operatörlerinin kombinasyonu, bizi tanıma basitleştirmeye yardımcı olan karakterlerde kalan küçük deliklerden ortadan kaldırır.

Segmentasyon burada ön hazırlıktan çok daha kolaydır. Her şeyden önce, bağlı bileşenler arıyoruz.

Ardından, yakın yatay bileşenleri birleştiriyoruz (prosedür daha önce olduğu gibi tamamen aynı):

Bu algoritma, başarılı bir şekilde tanınan görüntülerin% 69'unun bir sonucu elde etmeyi ve karakterin / görüntünün ortalama 0.3'ünü elde etmeyi mümkün kılmıştır.

Mavi

Böylece, "Yenilen" statüsü mavi bir operatör aldı. Böylece, gerçekten büyük bir balıkın önündeki eli ...

Burada onurlu bir şey yazmak zor, ama ben, deneyeceğim:

  • Karakterleri döndürün - sadece az veya daha az ciddi engel
  • Sembol arka plan gürültüsü
  • Semboller bazen birbirlerine dokunuyor

Buna zıt olarak:

  • Önemli Çakmak Sembolleri Arka Plan
  • Semboller bir dikdörtgene iyi uyuyor
  • Farklı karakter rengi onları birbirinden ayırmayı kolaylaştırır

Yani, ön hazırlık. Kesme geçmişi ile başlayalım. Görüntü bir üç renkli olduğundan, kanallara kesin ve ardından tüm kanalların üzerinde 116'yı daha parlak olan tüm noktaları atın. Bunu aldık güzel bir maske:

Ardından, görüntüyü HSV'nin (Wikipedia) renk alanına dönüştürürüz. Sembollerin rengi hakkında bilgi tasarrufu sağlar ve aynı zamanda degradeyi kenarlarından çıkarır.

Daha önceki maske sonucu başvuruyoruz:

Bu ön hazırlık sonunda. Segmentasyon da çok önemsizdir. Her zaman olduğu gibi, bağlı bileşenlerle başlayalım:

Bunu durdurmak mümkün olurdu, ancak sadece% 73'ü ortaya çıktı, bu da bana uymayan - sadece% 4'ü bilerek daha karmaşık bir captcha sonucundan daha iyidir. Böylece, bir sonraki adım, ters karakterlerin tersi olacaktır. Burada, yerel karakterlerin dikdörtgene sığması gerçeği için yararlı olacağız. Fikir, her sembol için tarif edilen dikdörtgeni ve daha sonra eğimiyle, sembolün kendisinin eğimini hesaplamaktır. Burada, dikdörtgenin altında, her şeyden önce, bu sembolün tüm piksellerini içerdiği anlaşılıyor ve ikincisi, mümkün olanların en küçük alanına sahip olduğu anlaşılıyor. OPENCV'den (minareact2) bu tür bir dikdörtgeni aramada algoritmanın bitmiş uygulanmasını kullanıyorum.

Bu algoritma, bu CAPTCHA'nın gerçekten en basit olduğu varsayımını doğrulayan 0.16 karakter / görüntüde ortalama bir hata ile görüntülerin% 86'sını başarıyla tanır. Ancak, operatör en büyük değil ...

Sarı

En ilginç olanı geliyor. Bu yüzden konuşmak için, yaratıcı etkinliğimin aslında 🙂 Bu captcha, hem bilgisayar hem de ne yazık ki bir kişi için en zor olanıdır.

Avantajları:

  • Lekeler ve çizgiler biçiminde gürültü
  • Döndür ve ölçeklendirme karakterleri
  • Karakterlerin düzenini kapatın

Dezavantajları:

  • Çok Sınırlı Palet
  • Tüm çizgiler çok ince
  • Lekeler genellikle sembollerle kesişmez
  • Tüm karakterlerin dönüş açısı yaklaşık aynıdır

İlk adımdan fazla, uzun zamandır düşündüm. Akla gelen ilk şey, küçük gürültüyü gidermek için yerel maxima (dilate) ile oynamaktır. Bununla birlikte, böyle bir yaklaşım, yalnızca şerit ana hatlarının harflerden kaldığı gerçeğine yol açtı. Sorun, karakterlerin dokusunun inhomojen olabileceği gerçeğiyle ağırlaştırıldı - büyük bir büyütme ile açıkça görülebilir. Ondan kurtulmak için, en aptalca yol açmaya karar verdim ve görüntülerde karşılaşılan tüm renklerin kodlarını kaydettim. Toplamda bu görüntülerde dört farklı doku ve üçünün üçü 4 farklı renk ve son - 3'ü olduğu ortaya çıktı. Ayrıca, bu renklerin tüm bileşenleri birden fazla 51 olduğu ortaya çıktı. Sonra, dokudan kurtulmak mümkün olduğu bir renk tablosunu derledim. Bununla birlikte, bu "remap" önce, hala karakterlerin kenarlarında bulunan tüm çok hafif pikselleri salladım - aksi takdirde, onları gürültü olarak evlenmeniz ve sonra onlarla başa çıkmanız gerekirken, bilgi bir miktar içeriyor.

Öyleyse, bu dönüşümden sonra görüntüdeki en fazla 6 renk yok - 4 renk sembolü (özellikle gri, mavi, açık yeşil ve koyu yeşil), beyaz (arka plan rengi) ve "bilinmeyen", beyaz (arka plan rengi) ve "bilinmeyen" Pikselin yerine, ünlü renklerden herhangi birini tanımlayamadı. Klimalı olarak adlandırılır - çünkü bu şu an üç kanaldan kurtulup olağan ve uygun tek renkli görüntüye dönüşürüm.

Bir sonraki adım, görüntüyü çizgilerden temizlemek idi. Burada durum bu hatların çok ince olduğu gerçeğini korur - sadece 1 piksel. Basit bir filtre başlar: Her pikselin rengini komşularının renkleri (Vita - dikey ve yatay) ile karşılaştıran tüm görüntüden geçerek; Komşular renkle çakışıyorsa ve aynı zamanda pikselin rengiyle çakışmazsa - komşularla aynı hale getirmek için. İki aşamada çalışan aynı filtrenin biraz daha güvenilir bir versiyonunu kullanıyorum. Birincisinde, komşuları 2, ikinci bir mesafedeki - bir mesafededir. Bu, bu etkiyi burada başarmanıza olanak sağlar:

Sonra, "bilinmeyen" rengin yanı sıra çoğu lekeden kurtulurum. Bunu yapmak için, ilk önce tüm küçük bağlantılı alanları arıyorum (bölgedeki küçük 15), eğer doğruysanız, onları siyah beyaz maskelerde naneliyoruz, daha sonra sonuç olan "bilinmeyen" olan alanlarla birleştikten sonra renk.

Bu maskelerle, inpaint algoritmasını (ya da daha doğrusu, OpenCV'deki uygulamasını) teşvik ediyorum. Bu, çöplerin çoğunu görüntüden en etkili şekilde temizlemenizi sağlar.

Bununla birlikte, OPENCV'deki bu algoritmanın uygulanması, bir manşon metni ile yapay olarak oluşturulan görüntüleri tanımak yerine fotoğraflar ve videolarla çalışmak üzere oluşturulmuştur. Uygulamasından sonra, segmentasyonu basitleştirmekten kaçınmak istediğim degradeler görünür. Böylece, yani ilave işleme üretmek için gereklidir - netliği artırır. Her pikselin rengi için, buna en yakın olanı hesaplıyorum (hatırlat, 5 renk var - bir karakter dokuları için biri ve beyaz).

Son olarak, ön işlemlerin son adımı, kalan tüm küçük bağlantılı alanların çıkarılması olacaktır. Inpaint kullandıktan sonra görünürler, bu yüzden burada tekrar yoktur.

Segmentasyona git. Sembollerin birbirine çok yakın olduğu gerçeğini büyük ölçüde karmaşıklaştırır. Böyle bir durum, bir sembolün diğerinin yarısı görünmemesi olabilir. Bu karakterler de bir renk olduğunda çok kötü olur. Ek olarak, çöp kalmazları da rollerini oynarlar - hattın bir yerde büyük miktarlarda kaynak görüntüsünde olabilir. Bu durumda, daha önce anlattığım algoritma onlardan kurtulmak olamaz.

Segmentasyonu yazmanın yanı sıra, önceki vakalarda verimsiz girişimlerde geçirilen bir hafta sonra, bu işten attı ve taktikleri değiştirdim. Yeni stratejim, tüm segmentasyon sürecini iki bölüme ayırmaktı. Birincisi, karakterlerin dönüş açısıdır ve ters dönüş gerçekleştirilir. Zaten açılmamış imajın ikincisinde, semboller yeniden vurgulanır. Öyleyse devam et. Her zaman olduğu gibi, bağlı bileşenler arayışı ile başlayalım.

O zaman her sembolün dönme açısını değerlendirmeniz gerekir. Greenpeace operatörüyle birlikte çalıştıktan sonra bunun için bir algoritma geldim, ancak yazdı ve sadece burada uyguladım. Çalışmalarını göstermek için bir benzetme. Sembolün siyah beyaz bir görüntüsünü aşağıdan yukarı doğru hareket ettiren bir piston hayal edin. İteklendiği piston tutacağı, dikey olarak yerleştirildiği işyeri - yatay olarak, görüntünün altına paralel ve tutamağa dik olarak yerleştirilir. Kolu, ortadaki siteye tutturulmuştur ve birleştirme bölgesinde, sitenin döndürülebileceği bir hareketli eklem vardır. Evet, bana terminoloji uzmanlarını affedeceğim.

Kolu hareket ettirin, platformu fizik yasalarına göre iter. Sembolün sadece beyaz bir görüntünün materyal olduğunu ve siyah arka plan aracılığıyla pistonun kolaylığı ile geçtiğini varsayıyoruz. Daha sonra, beyaza ulaşan piston, yani, tutamacın gücünün hala uygulanması şartıyla, yani, döndürmeye başlayacaktır. İki olguda durabilir: Eğer kuvvet uygulanmasının her iki tarafında sembolü için tasarlanmışsa veya uygulamanın kendisinin bir noktasının sembolüne damgalanmışsa. Diğer tüm durumlarda, harekete devam edebilecek. DİKKAT, Doruk: Sembolün dönme açısının, durduğunda anında pistonun eğim açısı olduğunu varsayıyoruz.

Bu algoritma oldukça doğru, ancak açıkça çok büyük sonuçlar (27 dereceden fazla) dikkate almam. Kalanlardan, aritmetik ortalamayı buluyorum, bundan sonra tüm görüntü tamamen eksi bu açıya döner. Sonra bağlantılı bileşenlerin aramasını tekrar yapıyorum.

Sonra gittikçe daha ilginç ve daha ilginç hale gelir. Önceki örneklerde, nöral ağın geçtiği, alınan segmentlerle çeşitli dolandırıcılıklara başladım. Burada her şey. İlk başta, en azından kısmen bağlantıların bileşenlerini bölündükten sonra kaybolan bilgilerin en azından kısmen geri yüklenmesi için, her birinin üzerinde "arka plan" torklayan koyu gri (96) - oyulmuş segmentin yakınında nelerdi. Bundan sonra içine girmeyin, sembollerin ana hatlarını düzelterek, çizgiler için ön ödemelerde olduğu gibi aynı prosedürü (komşuya bir mesafeye eşit).

Resmen (program modüllerinin bakış açısıyla) burada segmentasyon sona erer. Özenli okuyucu, merhametli karakterlerin ayrılmasıyla belirtilmediğini fark etmiş olmalıdır. Evet, öylesine - onları tam olarak bu formda tanıma iletiyorum ve ben yerinde bitireceğim.

Bunun nedeni, merhametli karakterleri daha önce açıklanan (en küçük projeksiyonla) ayırmanın yönteminin çalışmadığı yöntem olmasıdır - yazı tipi yazarlar tarafından çok iyi seçilir. Bu nedenle, başka, daha karmaşık bir yaklaşım uygulamak gerekir. Bu yaklaşımın temeli bunun olduğu fikridir. segmentasyon için nevralet kullanılabilir.

En başında, segmentteki karakter sayısını bu segmentin belirleyici genişliğinde ve toplam karakter sayısındaki karakter sayısını bulmanızı sağlayan algoritmayı tanımladım. Aynı algoritma burada kullanılır. Her segment için, içindeki karakter sayısı hesaplanır. Eğer oradaysa - bitirmeye gerek yoktur ve bu segment hemen \u003e\u003e \u003d sinir ağında. Sembol burada yalnız değilse, potansiyel ayırıcılar segment boyunca eşit mesafelerde yerleştirilir. Daha sonra her ayırıcı küçük mahallesinde hareket eder ve aynı anda, nöral ağın bu ayırıcının yakınındaki karakterler üzerindeki reaksiyonunu eşzamanlı olarak hesaplar, ardından sadece bir maksimum seçmek için kalır (aslında, orada oldukça aptal bir algoritma yapar, ancak Prensip, her şey gerçekten yaklaşık olarak).

Doğal olarak, sinir ağının segmentasyon sürecine katıldığı (veya lütfen), daha önce tarif ettiğim sinir ağını öğretme planını kullanma olasılığını ortadan kaldırır. Daha kesin olarak, ilk sinir ağını elde etmesine izin vermez - başkalarını eğitmek için kullanılabilir. Bu nedenle, oldukça basit yapıyorum - bir sinir ağını öğretmek için normal segmentasyon yöntemlerini (projeksiyon) kullanıyorum, çalışmaya alışkın olduğunda, yukarıda açıklanan algoritma girilir.

Bu algoritmada bir sinir ağının kullanılmasıyla ilişkili başka bir subtlet var. Önceki örneklerde, nörosette ön işleme ve segmentasyonun neredeyse tedavi edilmeyen sonuçlarında eğitildi. Burada başarılı tanınmanın% 12'sinden fazlasını elde etmeyi mümkün kıldı. Kategorik olarak beni tatmin etmiyor. Bu nedenle, bir nöral ağı öğrenme bir sonraki dönemine başlamadan önce, orijinal görüntülere farklı çarpıtmalar getirdim, kabaca gerçek simüle ederim: Beyaz / gri / siyah noktalar, gri çizgiler / daireler / dikdörtgenler ekleyin, döndürün. Ayrıca, Trainset'i 200 görüntüle 300'e çıkardım ve sözde sözde ekledim. validet. 100 görüntüde eğitim sırasında öğrenme kalitesini doğrulamak için. Bu, üretkenlikte beş için yüzde bir yerde ve birkaç şeyde segmentasyonla bir artış elde etmeyi mümkün kıldı, sadece makalenin başında konuştuğum sonucu verdi.

İstatistiklerin sağlanması, sona erdiğim gerçeği ile karmaşıktır. iki NureRetas: Biri daha büyük bir tanınma yüzdesi verdi, diğeri daha küçük bir hata. Burada önce sonuçları getiriyorum.

Toplamda, defalarca dediğim gibi, testte 100 görüntü vardı. Bunlardan 20, sırasıyla 80'i başarıyla tanındı, başarısız oldu ve hata görüntüde 1.91 karakterdi. Diğer tüm operatörlerden daha belirgin bir şekilde daha kötüdür, aynı zamanda CAPTCHA da uygundur.

Hapis cezası yerine

Her şey bu işe ait, sitemdeki özel bir şubeye, özellikle de: kaynak kodu, netsukuku). Aynı zamanda, öncelikle bir yıl boyunca (en az bir arada) yapmanın mümkün olduğu ve ikincisi, aynı ITEF'in üzerinde yüksek olduğunu iddia edeceğini iddia ettik. Belki hangi yöne taşınmam gerektiğini önerebilirsiniz?

İyi günler! Son zamanlarda, bazı ihtiyaçlar için "meraklı" dan python'a bir pin aldı. Google'a baktım ve normal bir şey yok Django. Ben görmedim. Sonuç olarak, ayrı olarak yazmadığım sonucuna geldim. WSGI. App, sadece Cgi senaryo.

Paket görüntülerle çalışmak için seçildi Python Görüntüleme Kütüphanesi. Ne yazık ki, PIL, karşılaştırıldığında bazı kıtlık olanakları verir. PHP'de GD2..

Python versiyonları 2 ve 3 için paketi buradan olabilir: http://www.lfd.uci.edu/~gohlke/pythonlibs/

Hemen ne kullanıldığını görmek istiyorum Python 3.1.Python 2,6+ 'da bunu düşünmem, aynı zamanda başlıyor.

Ve böylece, sonuç olarak, çok renkli bir arka planda 5-6 karakter bir görüntü oluşturmalıyız.

Tüm hazır arşivden beri buraya göndermiyorum, her şeyi yönetime göre yapacağız.

Kataloglar ve onların hiyerarşileri:

CGI-bin.
-Captcha
-Arka plan.
-Fonts.
-İndex.py.

Bunun CGI-Bin klasörünün, arka planların ve yazı tiplerinin yalan söylediği CAPTCHA klasörünü ve indeks.py betiğinin kendisini yattığını düşünüyorum.

Şimdi backgrown'a ihtiyacımız var. Google'da "arka planlar" sürün. Martinks ve indirin parçaları 15-20. Ve bu tür dikdörtgenleri formatta 200x60 px boyutunda yapmanız gerekir. Jpeg.

Tüm arka planlar klasörüne atın.

Şimdi yazı tipleri. İlgileniyoruz TrueType. Yazı tipleri (* .ttf). 15 Yazı tipi püskürtücü parçaları alır ve yazı tipi klasörüne atarız.

Hepsi kancalar var, yazı tipleri var, şimdi indeks.

Yazdır ("İçerik Türü: Görüntü / JPEG"); Yazdır ("); İthalat sys, os, re, rastgele PIL ithalat imajından rastgele, ImageFont, Imagedraw Class Captcha (nesne): def __it __ (öz): self.string \u003d ""; self.root \u003d os.getcwd (); self.path_backgrounds \u003d self.root + "/ arka planlar /"; self.path_fonts \u003d self.root + "/ fontları /"; DEF Gen_string (öz): chars \u003d ("A", "B", "D", "E", "F", "G", "H", "J", "M", "N", " S "," 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 "); Aralıkta i için (random.Randint (5, 6)): self.string + \u003d karakterler; Self.string dönüş; DEF Gen_Backgrounds (Öz): Resimler \u003d; os.path.exists (self.path_backgrounds): os.listdir: os.path.isdir (self.path_backgrounds + "/" + f): Devam; Eğer re.search ("\\. JPEG | jpg) $", f, re .gnorecase): images.append (self.path_backgrounds + "/" + f); Else: sys.exit (); eğer len (görüntüler) \u003d\u003d 0: sys.exit (); Görüntüleri iade; Def gen_fonts (öz): fonts \u003d; Os.path.exists (self.path_fonts): os.listdir (self.path_fonts) için F için: eğer os.path.isdir (self.path_fonts + "/" + f): Devam; Re.search ("\\. (TTF) $", f, re .gnorecase): fonts.append (self.path_fonts + "/" + f); Else: sys.exit (); Eğer LEN (yazı tipleri) \u003d\u003d 0: sys.exit (); Fontları iade; DEF Gen_Image (öz): string \u003d self.gen_string (); Arka planlar \u003d self.gen_backgrounds (); fonts \u003d self.gen_fonts (); Image \u003d Image.New ("RGB", (200.60), "#FFF") Draw \u003d imagedraw.draw (resim); Aralıkta (5): arka plan \u003d Image.Open (arka planlar); x \u003d random.Randint (0, 160); cp \u003d background.crop ((x, 0, x + 40, 60)); image.paste (cp, (i * 40, 0)); Eğer LEN (string) \u003d\u003d 5: x \u003d random.rantint (25, 30); Else: x \u003d random.rantint (8, 11); String'deki char için: font \u003d fontlar; y \u003d random.Randint (5, 25); font_size \u003d random.rantint (24, 30); Color_dark \u003d "rgb (" + str (random.Randint (0,150)) + "," + str (random.Randint (0,100) + "," + str (random.Randint (0,150) + ")" "; Color_font \u003d "rgb (" + str (random.rantint (50,200)) + "," + str (random.rantint (0.150) + "," + str (random.Randint (50,200) + "" ""; TTF \u003d ImageFont.Trutype (font, font_size) draw.Text ((x + 1, y + 1), char, dolgu \u003d color_dark, font \u003d ttf) draw.Text ((x, y), char, dolgu \u003d color_font, font \u003d ttf) x + \u003d random.rantint (13, 15) + 18; Image.Save (sys.stdout, "JPEG") CP \u003d CAPTCHA (); cp.gen_image (); # cp.string; Dize sembolleri

Bu kadar. Http: //localhost/cgi-bin/captcha/index.py oluşturulan görüntüde var. Sonra, oluşturulan bir dize depolama mekanizması ekleyebilirsiniz ( cp.string) Oturumlarla veya başka bir yerde.