1 puan yazan GN⁺ 2024-11-30 | 1 yorum | WhatsApp'ta paylaş
  • Tarayıcı içinde 4Chan CAPTCHA’larını otomatik çözmek için TensorFlow.js modeli geliştiren bir proje; hedeflenen en az %80 ve tercih edilen %90 üzeri doğruluk oranına ulaştı
  • CAPTCHA toplama süreci, istek API’sindeki ttl, cd, Cloudflare Turnstile ve kademeli artan bekleme süreleri nedeniyle basit toplu scraping ile yönetilemeyecek kadar zordu
  • Ticari insan tabanlı çözüm hizmetleri ve manuel etiketleme hatalara ve throttling’e takıldı; yaklaşık 2.500 gerçek arka plan ve karakter başına 50–150 görüntüyle yaklaşık 50.000 sentetik veri üretilerek eğitim ölçeği sağlandı
  • Model CNN+LSTM yapısı ve CTC kodlaması kullandı; Keras/TensorFlow ile eğitimden sonra Python 3.10, Keras 2 ve .h5 formatı üzerinden TensorFlow.js’ye dönüştürüldü
  • Gerçek tarayıcıda ilk yükleme yaklaşık 1 saniye sürdü, sonraki çalıştırmalar hissedilir biçimde anında işlendi ve yüzlerce gerçek CAPTCHA’da %90’ın üzerinde başarı oranı gösterdi

Hedef ve açık kod

  • Amaç, makine öğrenimi ve TensorFlow eğitimini de öğrenerek 4Chan CAPTCHA’sını tarayıcıda güvenilir biçimde çözen bir model oluşturmaktı
  • Eşik en az %80 doğruluk, mümkünse %90 üzeriydi ve sonuçta buna ulaşıldı
  • İlgili kod GitHub’daki 4chan-captcha-playground deposunda yayımlandı

4Chan CAPTCHA’sının çalışma biçimi

  • 4Chan, gönderi veya yanıt yazmadan önce CAPTCHA girişi istiyor
  • Normal CAPTCHA, içinde 5–6 alfasayısal karakter bulunan bir görüntüden oluşuyor ve kullanıcının tüm karakterleri doğru girmesi gerekiyor
  • Slider CAPTCHA ise rastgele karakter parçaları gibi görünen bir arka plan görüntüsüyle, şeffaf deliği olan bir ön plan görüntüsünü hizalayarak CAPTCHA metnini görünür kılma yöntemiyle çalışıyor

CAPTCHA toplamada karşılaşılan sınırlamalar

  • Yeni CAPTCHA istekleri incelendiğinde tarayıcının https://sys.4chan.org/captcha?framed=1&board={board} adresine istek gönderdiği görülüyor
  • framed=1 kaldırıldığında HTML içindeki postMessage() yerine ham JSON döndürülüyor
    • JSON içinde challenge, ttl, cd, img, img_width, img_height, bg, bg_width gibi alanlar bulunuyor
    • ttl, CAPTCHA’nın yaklaşık 2 dakika sonra süresinin dolacağını gösteren süre gibi görünüyor
    • cd, bir sonraki CAPTCHA isteğine kadar beklenmesi gereken cooldown değeri olarak yorumlanıyor
  • Ardışık istekler gönderildiğinde cd giderek büyüyor
    • İlk birkaç istekte 5 saniyede bir istek yapılabiliyor
    • Sonra 8 saniyeye çıkıyor ve devamında yaklaşık iki katına katlanarak artıyor
    • Sonunda 280 saniyede üst sınıra ulaşıyor
  • 280 saniyelik zamanlayıcıya ulaşıldıktan sonra CAPTCHA daha zor hale geliyor
    • Birden çok yatay çizgi ve elips biçimli bozucu unsur eklenmiş görüntüler ortaya çıkıyor
    • Veri kalitesi düşüyor ama yine de kullanılabilir durumda kalıyor
  • CAPTCHA isteğinden önce Cloudflare Turnstile geçişi gerekiyor
    • Çok sayıda proxy ve basit script kullanma yöntemi pratik değildi
    • Toplama script’i, tarayıcıdan Cloudflare çerezlerini kopyalayıp kullanıyor; süreleri dolduğunda bunlar elle değiştiriliyordu
  • Bu yöntemle yüzlerce CAPTCHA toplandı, ancak bu miktar eğitim için yeterli değildi ve doğru yanıt etiketleri de yoktu

İnsan tabanlı etiketlemenin sınırları

  • Slider CAPTCHA hizalama, trainer/captcha_aligner.py içindeki sezgisel script ile %100 başarı oranı gösterdi
  • CAPTCHA’ları ticari bir CAPTCHA çözüm hizmetine gönderip gerçek insanların yanıt girmesini sağlayan trainer/labeler.py yazıldı
  • İlk gönderilen onlarca CAPTCHA’nın çoğunda en az bir karakter yanlış çözüldü
  • Hizmetin “100% Recognition” özelliği kullanılarak, yalnızca birden fazla çalışanın yanıtı eşleştiğinde sonuç alınacak şekilde ayarlandı
    • Ayarlar n = 2, x = 2, y = 3 idi
    • Önce 2 kişiye gönderiliyor; ikisi eşleşmezse, iki kişinin yanıtı eşleşene kadar en fazla 3 kişiye daha gönderiliyordu
  • Bu ayarla CAPTCHA’ların yaklaşık %80’i çözüldü; bunların yaklaşık %90’ı doğruydu ama yaklaşık %10’unda hata vardı
    • Birden fazla çalışanın aynı hatayı yaptığı durumlar vardı
  • Kendi başına veya tanıdıkların yardımıyla CAPTCHA çözerek görüntü ve yanıtı kaydeden bir kullanıcı script’i de kullanıldı
    • Eğitim setine eklemek için yüzlerce görüntü daha elde edildi
    • Tekrarlı istek throttling’i ve CAPTCHA zorluğunun artması nedeniyle bu yaklaşımdan vazgeçildi

Sentetik veri üretimi

  • 4Chan ve ilgili CAPTCHA kodu açık kaynak olmadığı için aynı kodu yerelde çalıştırmak mümkün değildi
  • Bunun yerine gerçek CAPTCHA yapısına yaklaşan sentetik CAPTCHA’lar üretildi
  • CAPTCHA, arka plan ve karakterler olmak üzere iki bölüme ayrılarak ele alındı
    • Arka plan, gerçek görüntülerde büyük contour bulunup karakter alanı çıkarılarak elde edildi
    • Karakterler çıkarıldıktan sonra geriye yalnızca gürültülü arka plan kaldı
  • Tekil karakterler manuel etiketlemeyle elde edildi
    • Karakterleri etiketlemek için VoTT kullanıldı
    • Basit bir script ile karakterler çıkarıldı ve son işleme tabi tutuldu
    • Karakter başına 50–150 izole görüntü elde edildi
  • 4Chan CAPTCHA’sında yalnızca 0, 2, 4, A, D, G, H, J, K, M, N, P, R, S, T, W, X, Y bulunuyor
    • Bunun belirsizliği önlemeye yönelik bir seçim olması muhtemel
  • Çıkarılan karakterler ve arka planlar birleştirildi; gözlemlenen karakter yerleşim desenlerine uygun sentetik görüntüler üretildi
  • Girdi karakterleri zaten etiketli olduğu için sentetik CAPTCHA’ların doğru yanıtları da otomatik üretilebildi

Model yapısı ve ön işleme

  • Eğitim verisi, önceden hizalanmış slider CAPTCHA’ları, normal CAPTCHA’lar ve sentetik CAPTCHA’lar karıştırılarak kullanıldı
  • Eğitim script’i tüm görüntüleri 300x80 piksele ayarlıyor ve saf siyah-beyaza dönüştürüyordu
  • Model, CAPTCHA çözümüyle ilgili çeşitli yazılardan yararlanılarak oluşturulan bir LSTM CNN yapısıydı
    • 3 convolution/max-pooling katmanı kullanıldı
    • 2 LSTM katmanı kullanıldı
      1. convolution katmanı da denendi ancak performansı iyileştirmedi
  • Çıktı uzunluğu 5 veya 6 karakter olarak değişken olduğu için CTC kodlaması kullanıldı
  • Uygulamada Keras ve TensorFlow kullanıldı

tf.image.resize() argüman sırası sorunu

  • Bazı eski hizalanmış slider CAPTCHA’ları 300x80 çözünürlüğe veya en-boy oranına uymuyordu
  • Eğitim script’inin farklı girdileri işlemesi için tf.image.resize() kullanıldı
  • Başta boyut argümanının (width, height) tuple’ı olduğu varsayıldı, ancak gerçekte tf.image.resize() (height, width) sırasını istiyor
  • Bu hata yüzünden görüntüler 80x300 gibi dikey olarak uzamış, okunamaz bir biçime dönüştü
    • 32 epoch’tan fazla eğitimden sonra bile görülen görüntülerde performans neredeyse hiç çıkmadı
    • Yeni CAPTCHA’larda rastgeleye yakın tahminler üretti
  • İşlenmiş girdi görüntüleri görselleştirilerek sorun doğrulandı ve düzeltmeden sonra eğitim performansı büyük ölçüde iyileşti

Eğitim ölçeği ve sonuçlar

  • Nihai veri seti yaklaşık 500 manuel çözülmüş görüntü ve yaklaşık 50.000 sentetik görüntüden oluştu
  • Sentetik görüntüler, yaklaşık 2.500 arka plan görüntüsü ve karakter başına 50–150 görüntüden rastgele örnekleme yapılarak üretildi
  • Veri seti rastgele karıştırıldıktan sonra 90/10 oranında eğitim ve değerlendirme setlerine ayrıldı
  • NVIDIA RTX A4000 Laptop GPU’da epoch başına eğitim süresi yaklaşık 45 saniyeydi
  • İlk epoch sonunda loss 19 seviyesindeydi ve tahminler neredeyse hiç doğru değildi
    1. epoch sonunda loss 0,55’e düştü ve 5 rastgele test tahmininin 5’i de doğru çıktı
  • 8–16 epoch, süre ile nihai performans arasında iyi bir dengeydi
      1. epoch civarında loss kararlı hale geldi
    • 16 epoch’u geçince iyileşme payı belirgin biçimde azaldı
  • Python’da çıkarımı test etmek için trainer/infer.py kullanıldı ve görülmemiş görüntülerde de sonuçlar umut vericiydi

TensorFlow.js dönüşümü ve tarayıcıda çalıştırma

  • Kullanıcı script’i TensorFlow.js ve TypeScript ile yazıldı
  • Python kodundaki CAPTCHA hizalama algoritması ve görüntü ön işleme kodu yeniden uygulandı
  • İlgili kod, deponun user-scripts/ dizininde bulunuyor
  • Python TensorFlow/Keras model formatı, TensorFlow.js’nin beklediği formatla uyumlu değil
  • Resmi dönüşüm script’inin kullanılması gerekiyordu, ancak iki sorun vardı
    • Resmi TensorFlow-to-TFJS dönüştürücü Python 3.12 üzerinde çalışmadı ve hata mesajı da net değildi
    • PyEnv ile Python 3.10 kullanıldığında dönüşüm başarılı oldu
  • Dönüşüm script’i Keras 3 modelini TensorFlow.js formatına dönüştürebiliyordu, ancak TensorFlow.js dönüştürülmüş modeli pratikte okuyamadı
    • İlgili sorun forum post üzerinden doğrulandı
  • Çözüm Keras 2 kullanmaktı
    • tf_keras legacy paketi kuruldu
    • Eğitim için TF_USE_LEGACY_KERAS=1 ortam değişkeni ayarlandı
    • Legacy .h5 model formatına dışa aktarıldı ve dönüşüm script’ine girdi formatı belirtildi
    • Kod değişikliği yalnızca tek satırlık basit bir düzeltme gerektirdi

Gerçek 4Chan CAPTCHA performansı

  • Model gerçek 4Chan CAPTCHA’larında da iyi çalıştı
  • İlk model yüklemesi yaklaşık 1 saniye sürdü
  • Sonraki çalıştırmalar hissedilir biçimde anında işlendi
  • Tarayıcıda yüzlerce gerçek CAPTCHA çözme deneyimine göre başarı oranı %90’ın üzerindeydi
  • Karakterin kendisini yanlış tahmin etme nadirdi; yanlış olduğunda genellikle bir karakteri tamamen atlıyordu
  • Gerçek veri eğitimini daha da artırarak veya sentetik veri üreticisinin CAPTCHA yerleşimini ayarlayarak iyileştirme alanı var
  • Bu modelin doğruluğu, ticari insan tabanlı CAPTCHA çözüm hizmetinden çok daha yüksekti

4 karakterli CAPTCHA ve kapanış

  • Proje tamamlandıktan sonra yazı hazırlanıp düzenlenirken 4Chan zaman zaman 4 karakterli CAPTCHA sunmaya başladı
  • Model yalnızca 5 ve 6 karakterli CAPTCHA’larla eğitilmiş olsa da 4 karakterli CAPTCHA’larda da aynı düzeyde performans gösterdi
  • Proje sürecinde makine öğrenimi ve bilgisayarlı görü hakkında çok şey öğrenildi ve başlangıç hedefi olan tarayıcı tabanlı CAPTCHA çözme modeli tamamlandı

1 yorum

 
GN⁺ 2024-11-30
Hacker News yorumları
  • Keras ile TensorFlow.js entegrasyonunun dağınık olması tipik TensorFlow gibi
    TensorFlow kullandığımda hep bütünleşik ve pürüzsüz bir üründen ziyade, kabaca ilişkili görünen araçların tek bir çatı altında toplanmış hali gibi hissettirdi
    Aslında Google'ın açık kaynak kütüphaneleri ya da araçlarının hepsi için böyle denebilir

    • Bununla ilgili olarak, 15 gün önce François Chollet'nin Google'dan ayrılacağını yazdığı gönderide de benzer bir bağlam vardı: https://news.ycombinator.com/item?id=42130881
      “2019'da Keras'ı neden TensorFlow'a dahil etmeye karar verdiniz?” sorusunun cevabı şuydu: “Bu benim kararım değildi. 2018'de TF liderlerinin aldığı bir karardı; o sırada ben L5 seviyesinde bireysel katkı sağlayan biriydim, bu ise L8 seviyesinde bir karardı”
    • Conway Yasası akla geliyor
  • Kendi sitemde[0] yorum formu spam'ini engellemek için CAPTCHA gerekiyordu; daha önce gördüğüm eğlenceli bir yöntemi yeniden kullandım
    Kesinlikle kusursuz da değil, zor da değil ama yapım sürecini gerçekten sevdim
    [0] https://www.hybridlogic.co.uk/contact

  • İnsanların bozulmuş metin tabanlı CAPTCHAlardan uzaklaşmasının bir nedeni var
    Artık bilgisayarların insanlardan daha iyi çözdüğü noktaya neredeyse geldik
    https://www.usenix.org/system/files/conference/woot14/woot14... bu konuda bir makale ve bence oldukça ilginç
    Yine de şaşırtıcı derecede çok sayıda metin tabanlı CAPTCHA, ImageMagick ile gri tonlamaya çevirme, genişletme ve aşındırma işlemleri uygulayıp ardından Tesseract'a veren birkaç satırlık shell script ile çözülebiliyor
    Ama https://2captcha.net gibi siteler de var; sonuçta CAPTCHA daha çok asgari düzeyde küçük bir zahmet gerektiren bir mekanizma

    • Teknik olarak kırılabiliyor olması işe yaramaz olduğu anlamına gelmez
      Bu yazıdaki çözüm için de ciddi zaman, beceri ve emek harcanmış; ortaya çıkan sonuç da pek genelleştirilebilir değil, farklı türde bir CAPTCHA için baştan yapmak gerekir
      Spam gönderenlerin çoğu bunu yeniden üretemez; üretebilenler de muhtemelen yasal yollardan para kazanır ya da daha kârlı hedeflerin peşine düşer
      Bu tür CAPTCHA'lar, başarılı spam'in maliyetini beklenen getirinin üzerine çıkarmakta hâlâ iyi iş görüyor
    • Sırada ne geleceğini merak ediyorum
      Her üyenin moderatörle 15 dakikalık görüntülü mülakat yapmak zorunda olduğu bir forum kurulabilir mi? “Ölçeklenebilir değil” olduğunu biliyorum ama komik bir şaka düzeneği olarak mümkün görünüyor
    • CAPTCHA'nın, sistemi kötüye kullanan aktörler için zorluğu artıran bir savunma hattından ibaret olduğunu düşünüyorum
      Bir çözüm değil; yavaş yavaş eskiyen küçük bir kale gibi
    • Küçük demek zor
      Bağlantıya göre reCAPTCHA v3 10-15 saniye sürüyor ve 1000 CAPTCHA başına 1,3 dolar maliyet çıkarıyor
      Büyük bir web sitesini büyük ölçekte kazımak gibi CAPTCHA'yı aşmak isteyeceğiniz birçok işte bu maliyet gerçekten ciddi ve karşılanması zor hale geliyor
    • Bu kadarı için iş kanıtı CAPTCHA muhtemelen en iyi seçenek olabilir
      mCaptcha.org bunlardan biri, başka uygulamalar da var
      Geleneksel CAPTCHA'lar azıcık bile etkili olduğunda erişilebilirlik açısından kâbusa dönüşmeye yatkın
  • Bu tür konular ilginizi çekiyorsa, 2014'te derlediğim Silk Road CAPTCHA analizi de var: https://github.com/mieko/sr-captcha

  • 4chan'in tepkisi uygun görünüyor
    Nasılsa sinir ağlarıyla kolayca çözülebiliyor; bu yüzden insanlara verilen işi basitleştirme yönüne gidiyor
    Artık çok zor CAPTCHA tasarlasanız bile makinelerin çözmesini zorlaştırma ihtimali düşük, insanları daha fazla sinirlendirme ihtimali yüksek

    • O zaman ücretsiz kullanıcıların yazı yazmasını tamamen engelleyip, yazmak isteyen herkese yıllık 20 dolarlık 4chan Pass aldırabilirler
      https://4chan.org/pass
      Zaten CAPTCHA'sız yazmak için bir seçenek olarak sunuluyor
      CAPTCHA tamamen etkisizse, CAPTCHA'yı ve ücretsiz yazı yazmayı kaldırıp yazmak isteyen herkesin 4chan Pass alması gerektiği sonucu çıkar
    • En az 5 yıldır, belki de 10 yıldır o noktada sıkışıp kaldık gibi geliyor
    • Sırada sadece Worldcoin retina taraması kullanılsın
    • 4chan insanların sinirlenip sinirlenmediğini pek umursamıyor
      Yakın zamanda 15 dakikalık yazı yazma gecikmesi getirdiler ve gerçekten sinir bozucu
      Cookie AutoDelete'te 4chan'i izin verilenler listesine almam gerekti
  • CAPTCHA varmış gibi yapmaktansa aslında kullanıcının zamanlamasını ve davranışlarını analiz etmek daha iyi olmaz mı diye düşünüyorum
    Açıkçası bunun zaten yapılıyor olabileceğini de sanıyorum
    Tamamen meta düzeye çıkarsak, karşı taraftaki aktörün insan olup olmadığını değerlendirmesi için yapay zekayı eğitmek de mümkün
    Yani ters Turing testi icat etmiş oluyoruz; yapay zeka, normal bir insanın yanıtından ayırt edemiyorsa onu insan kabul eden bir yöntem
    Farkı, pazarlama amaçlı insan yanıtlarından ayırt etmekle ilgili olmaması
    Sırf bu düşünce bile midemi bulandırdı, gidip uzanmam lazım

    • Büyük CAPTCHA sağlayıcıları zaten büyük ölçüde bunu yapıyor
      CAPTCHA göstermeden önce TLS parmak izi, IP, HTTP/2, istekler, JavaScript ortamı, yazı tipleri ve görsel işleme yeteneği, tarayıcının kendisi gibi şeyleri önce tanımlıyorlar
      Bu bilgilerle bir güven puanı hesaplayıp daha en başta CAPTCHA gösterip göstermeyeceklerine karar veriyorlar
      Ancak ondan sonra CAPTCHA girişini analiz etmenin anlamı oluyor; ama o noktaya gelindiğinde botların %90’ı zaten yakalanmış oluyor
      Bir tarayıcının hiçbir farkındalık olmadan sunucuya bildirebildiği bilgi miktarı akıl almaz düzeyde; bu yüzden her birimizin dijital parmak izinin gerçek parmak izinden bile daha benzersiz olma ihtimali yüksek
    • reCAPTCHA’nın yaptığı şey de bu
  • 4chan CAPTCHA’sını aşmanın öncü örneklerinden birinin hâlâ Yannick Kilcher’ın “Raiders of the Lost Kek” veri kümesiyle GPT-J’ye ince ayar yapması olduğunu düşünüyorum
    Videoya çekilmiş büyük dil modeli kullanımlarının en havalı örneklerinden biri olabilir: https://youtu.be/efPrtcLdcdM?si=errY0PrEhnX9ylDw

    • 4chan hakkındaki sorumluluk reddi ve uyarılar neredeyse 1 dakika sürüyor
      Kayıtlara geçecek cinsten
  • “Resmî TensorFlow-to-TFJS model dönüştürücüsü Python 3.12’de çalışmıyor ve doğru düzgün belgelenmemiş”, “TensorFlow.js Keras 3’ü desteklemiyor” gibi şeyler yüzünden birkaç yıl önce hafifçe makine öğrenmesi denemeye çalışırken neredeyse vazgeçmiştim
    Güncel eğitimlerin çok sık biçimde daha şimdiden eskimiş olması, rastgele tuzakların çokluğu ve “başlarken” kılavuzlarının insanı şoke edecek ölçüde zaten uzman varsayması can sıkıcıydı

    • Birkaç yıldır makine öğrenmesiyle uğraşan biri olarak, güncel modanın peşinden gitmekten kaçınmanızı öneririm
      Temelleri eski bir Bayesçi istatistik ders kitabından öğrenip sonra PyTorch gibi ana akım bir framework’e geçmek daha iyi
      Başta CNN, RNN, Transformer mimarilerini ve eğitim pipeline’ının tüm parçalarını kendiniz yazmanız iyi olur
      Veri yükleyici dahil; CUDA matris kernel’ları hariç tutulabilir
      LangChain gibi başkalarının wrapper’ını tekrar saran wrapper’lardan uzak durmak iyi olur
      Belgeler sadece eski olmakla kalmıyor, bazen temeller hakkında düpedüz yanlış da olabiliyor
      Temelleri biliyorsanız ve standart wrapper bozulduğunda düzeltebiliyorsanız Hugging Face harikadır
  • Bu, birkaç saat harcayıp foseptik kapağı açmayı öğrenmeye benziyor

    • Garip biçimde, 4chan’ın büyük bölümü Musk öncesi Twitter’dan bile daha az beyin çürütücü hissettiriyor
    • Foseptik sistemlerini incelerken öğrenilebilecek şeyleri hafife almamak gerek
  • CAPTCHA çözme hizmetlerinin bağlantılarını takip ederseniz, bu işi yapan insanların profillerini okuyabilirsiniz
    Tehlikeli bir fabrikada çalışmaktan daha etik bir iş gibi tanıtılıyor