Herkes CAPTCHA'lardan nefret eder - bir web sitesine erişmeden önce yazmanız gereken metin içeren sinir bozucu görüntüler. CAPTCHA'lar, gerçek bir kişi olduğunuzu doğrulayarak bilgisayarların formları otomatik olarak doldurmasını önlemek için tasarlanmıştır. Ancak derin öğrenmenin ve bilgisayarlı görmenin yükselişiyle, artık kolayca yenilebiliyorlar.
Adrian Rosebrock'un Python ile Bilgisayar Vizyonu için Derin Öğrenme adlı mükemmel kitabını okuyordum . Kitapta Adrian, makine öğrenimini kullanarak E-ZPass New York web sitesinde CAPTCHA'yı nasıl atlattığını anlatıyor:
Adrian'ın CAPTCHA görüntüsünü oluşturan uygulamanın kaynak koduna erişimi yoktu. Sistemi kırmak için yüzlerce örnek görüntü indirmesi ve sistemini eğitmek için bunları manuel olarak çözmesi gerekiyordu.
Peki ya kaynak koda erişimimiz olan açık kaynaklı bir CAPTCHA sistemini kırmak istiyorsak?
WordPress.org Eklenti Kayıt Defterine gittim ve "captcha" araması yaptım . En iyi sonuç "Gerçekten Basit CAPTCHA" olarak adlandırılır ve 1 milyondan fazla etkin kuruluma sahiptir:
Ve en iyisi, kaynakla birlikte gelir! CAPTCHA'ları oluşturan kaynak koda sahip olacağımız için, bunu kırmak oldukça kolay olacaktır. İşleri biraz daha zorlaştırmak için kendimize bir zaman sınırı verelim. Bu CAPTCHA sistemini 15 dakikadan daha kısa sürede tamamen kırabilir miyiz? Hadi deneyelim!
Önemli not: Bu, hiçbir şekilde 'Really Simple CAPTCHA' eklentisine veya yazarına yönelik bir eleştiri değildir. Eklenti yazarı, artık güvenli olmadığını söylüyor ve başka bir şey kullanmanızı tavsiye ediyor. Bu sadece eğlenceli ve hızlı bir teknik zorluk olarak ifade edilmektedir. Ancak kalan 1 milyondan fazla kullanıcıdan biriyseniz, belki başka bir şeye geçmelisiniz :)
Bir saldırı planı oluşturmak için, Really Simple CAPTCHA'nın ne tür görüntüler ürettiğini görelim . Demo sitesinde şunu görüyoruz:
Tamam, bu yüzden CAPTCHA resimleri dört harf gibi görünüyor. Bunu PHP kaynak kodunda doğrulayalım:
Evet, dört farklı yazı tipinin rastgele bir karışımını kullanarak 4 harfli CAPTCHA'lar üretir. Ve kullanıcı kafa karışıklığını önlemek için kodlarda asla "O" veya "I" kullanmadığını görebiliriz. Bu bize, tanımamız gereken toplam 32 olası harf ve sayı bırakır. Sorun değil!
Şu ana kadar geçen süre: 2 dakika
Daha ileri gitmeden önce, bu sorunu çözmek için kullanacağımız araçlardan bahsedelim:
Python 3
Python, makine öğrenimi ve bilgisayar görüşü için harika kitaplıklara sahip eğlenceli bir programlama dilidir.
OpenCV
OpenCV, bilgisayarla görme ve görüntü işleme için popüler bir çerçevedir. CAPTCHA görüntülerini işlemek için OpenCV kullanacağız. Bir Python API'ye sahiptir, böylece onu doğrudan Python'dan kullanabiliriz.
Keras
Keras, Python'da yazılmış bir derin öğrenme çerçevesidir. Minimum kodlama ile derin sinir ağlarını tanımlamayı, eğitmeyi ve kullanmayı kolaylaştırır.
TensorFlow
TensorFlow, Google'ın makine öğrenimi kitaplığıdır. Keras'ta kodlayacağız, ancak Keras aslında sinir ağı mantığının kendisini uygulamıyor. Bunun yerine, ağır işi yapmak için perde arkasında Google'ın TensorFlow kitaplığını kullanıyor.
Tamam, meydan okumaya geri dön!
Herhangi bir makine öğrenimi sistemini eğitmek için eğitim verilerine ihtiyacımız var. Bir CAPTCHA sistemini kırmak için şuna benzer eğitim verileri istiyoruz:
WordPress eklentisinin kaynak koduna sahip olduğumuzdan, onu her bir görsel için beklenen yanıtla birlikte 10.000 CAPTCHA görüntüsünü kaydedecek şekilde değiştirebiliriz.
Birkaç dakikalık kodu hackledikten ve basit bir 'for' döngüsü ekledikten sonra , eğitim verileri içeren bir klasörüm vardı - her biri için doğru cevabı dosya adı olarak 10.000 PNG dosyası:
Bu size çalışma örnek kodunu vermeyeceğim tek kısımdır. Bunu eğitim için yapıyoruz ve gerçekten dışarı çıkıp gerçek WordPress sitelerine spam göndermenizi istemiyorum. Ancak, sonuçlarımı çoğaltabilmeniz için sonunda oluşturduğum 10.000 görüntüyü size vereceğim.
Şu ana kadar geçen süre: 5 dakika
Şimdi bizim eğitim verileri olduğuna göre olabilir bir sinir ağı eğitmek için doğrudan kullanın:
Yeterli eğitim verisiyle, bu yaklaşım işe yarayabilir - ancak sorunu çözmeyi çok daha basit hale getirebiliriz. Sorun ne kadar basitse, o kadar az eğitim verisi ve çözmek için daha az hesaplama gücüne ihtiyacımız olacak. Sonuçta sadece 15 dakikamız var!
Neyse ki CAPTCHA resimleri her zaman sadece dört harften oluşur. Her bir harfin ayrı bir görüntü olması için görüntüyü bir şekilde ayırabilirsek, sinir ağını her seferinde tek bir harfi tanıması için eğitmemiz gerekir:
10.000 eğitim görüntüsünü gözden geçirip bunları Photoshop'ta manuel olarak ayrı görüntülere ayıracak vaktim yok. Bu günler sürer ve sadece 10 dakikam kaldı. Ve resimleri eşit büyüklükte dört parçaya bölemeyiz çünkü CAPTCHA bunu önlemek için harfleri rastgele farklı yatay konumlara yerleştirir:
Neyse ki, bunu yine de otomatikleştirebiliriz. Görüntü işlemede, genellikle aynı renge sahip piksellerin "lekelerini" tespit etmemiz gerekir. Bu sürekli piksel lekelerinin etrafındaki sınırlara kontur adı verilir . OpenCV, bu sürekli bölgeleri algılamak için kullanabileceğimiz yerleşik bir findContours () işlevine sahiptir.
Bu yüzden ham bir CAPTCHA resmi ile başlayacağız:
Ve sonra görüntüyü saf siyah beyaza (buna t eşikleme denir ) dönüştüreceğiz, böylece sürekli bölgeleri bulmak kolay olacaktır:
Daha sonra, görüntünün aynı renkteki sürekli piksel lekeleri içeren ayrı bölümlerini tespit etmek için OpenCV'nin findContours () işlevini kullanacağız:
O zaman her bir bölgeyi ayrı bir görüntü dosyası olarak kaydetmek basit bir iştir. Ve her görüntünün soldan sağa dört harf içermesi gerektiğini bildiğimiz için, bu bilgiyi harfleri kaydederken etiketlemek için kullanabiliriz. Bunları bu sırayla kaydettiğimiz sürece, her bir resim harfini uygun harf adıyla kaydetmeliyiz.
Ama bekleyin - bir sorun görüyorum! Bazen CAPTCHA'larda aşağıdaki gibi çakışan harfler bulunur:
Bu, iki harfi bir bölge olarak bir araya getiren bölgeleri çıkaracağımız anlamına gelir:
Bu sorunu çözmezsek, kötü eğitim verileri oluşturacağız. Makineye yanlışlıkla bu birbirine sıkıştırılmış iki harfi tek bir harf olarak tanımayı öğretmemek için bunu düzeltmemiz gerekiyor.
Buradaki basit bir hile, eğer tek bir kontur alanı uzun olandan çok daha genişse, muhtemelen iki harfin birbirine sıkıştırılmış olduğu anlamına gelir. Bu durumda, birleşik harfi ortadan ikiye bölerek iki ayrı harf olarak ele alabiliriz:
Artık tek tek harfleri çıkarmanın bir yolunu bulduğumuza göre, bunu sahip olduğumuz tüm CAPTCHA görüntülerinde inceleyelim. Amaç, her harfin farklı varyasyonlarını toplamaktır. İşleri düzenli tutmak için her harfi kendi klasörüne kaydedebiliriz.
İşte tüm harfleri çıkardıktan sonra "W" klasörümün nasıl göründüğünün bir resmi:
Şu ana kadar geçen süre: 10 dakika
Yalnızca tek harf ve rakamlardan oluşan görüntüleri tanımamız gerektiğinden, çok karmaşık bir sinir ağı mimarisine ihtiyacımız yok. Harfleri tanımak, kedi ve köpek gibi karmaşık resimleri tanımaktan çok daha kolay bir sorundur.
İki evrişimli katman ve iki tam bağlantılı katmana sahip basit bir evrişimli sinir ağı mimarisi kullanacağız:
Bu sinir ağı mimarisini tanımlamak, Keras kullanarak yalnızca birkaç satır kod gerektirir:
Şimdi onu eğitebiliriz!
Eğitim veri setinin üzerinden 10 kez geçtikten sonra neredeyse% 100 doğruluğa ulaştık. Bu noktada, istediğimiz zaman bu CAPTCHA'yı otomatik olarak atlayabilmeliyiz! Yaptık!
Geçen süre: 15 dakika (vay!)
Artık eğitimli bir sinir ağımız olduğuna göre, onu gerçek bir CAPTCHA'yı kırmak için kullanmak oldukça basit:
Veya komut satırından:
Bunu kendiniz denemek istiyorsanız , kodu buradan alabilirsiniz . 10.000 örnek resmi ve bu makaledeki her adım için tüm kodu içerir. Nasıl çalıştırılacağına ilişkin talimatlar için birlikte verilen README.md dosyasına bakın.
Güncelleme 2 Mayıs 2019: OpenCV 4, kodda kullanılan işlevlerden birinin API'sini değiştirdi. OpenCV 4 kullanıyorsanız, örnek koddaki bir satırı değiştirmeniz gerekir:
# Change this line: contours = contours[0] if imutils.is_cv2() else contours[1] # To this: contours = contours[1] if imutils.is_cv3() else contours[0]
Bu makaleyi beğendiyseniz, Makine Öğrenimim Eğlencelidir'e kaydolmayı düşünün! haber bülteni:
Beni Twitter'da @ageitgey'de de takip edebilir , doğrudan bana e-posta gönderebilir veya linkedin'de bulabilirsiniz . Makine öğrenimi konusunda size veya ekibinize yardımcı olabilirsem sizden haber almak isterim.
Özet Endüstriyel güvenlik çok önemli bir konudur çünkü endüstriyel işlerde, örneğin inşaatta, el işi yapan çok sayıda insan vardır ve her işçinin kendi güvenlik ekipmanını kullanmak zorunda olduğu kontrol zordur. Günümüzde Bilgisayar görüşü gibi yeni ortaya çıkan teknolojiler birçok faaliyeti otomatikleştirmeye yardımcı oluyor, istenen fikir buna dayalı bir çözüm önermektir.
Yapay zeka alanındaki Random Forest ve CNNs kavramları hakkında giriş / özgeçmiş! Random Forest ve CNN'leri duydunuz mu? Nedir? bu ne için? nasıl kullanılır? Bu, bu kavramların kısa bir açıklamasıdır, sonuçta cehalet birkaç kişi için bir seçenektir. :) Random Forest, kullanıcı olmak için çok kolay ve esnek bir makine öğrenme algoritmasıdır (Machine Learning), çok iyi sonuçlar elde etmek gerekir, ancak bunun için hiperparametrelerinize özellikle dikkat etmeniz gerekir. Aşırı uyum ve diğer sorunlar.