4Chan CAPTCHA को डिकोड करना
(nullpt.rs)- ब्राउज़र के अंदर 4Chan CAPTCHA को अपने-आप हल करने के लिए TensorFlow.js मॉडल बनाने वाला प्रोजेक्ट, जिसने न्यूनतम 80% और पसंदीदा 90%+ accuracy का लक्ष्य हासिल किया
- CAPTCHA इकट्ठा करना request API के
ttl,cd, Cloudflare Turnstile, और बढ़ते wait time की वजह से साधारण बड़े पैमाने की scraping से आसान नहीं था - commercial human-based solving और manual labeling दोनों error और throttling से अटक गए, इसलिए लगभग 2,500 वास्तविक backgrounds और हर character की 50~150 images से लगभग 50,000 synthetic data images बनाकर training scale तैयार किया गया
- मॉडल ने CNN+LSTM structure और CTC encoding का इस्तेमाल किया, और Keras/TensorFlow training के बाद Python 3.10, Keras 2, और
.h5format के रास्ते TensorFlow.js में convert किया गया - वास्तविक ब्राउज़र में पहली loading लगभग 1 second लेती थी, उसके बाद execution लगभग तुरंत महसूस हुआ, और सैकड़ों वास्तविक CAPTCHA पर 90% से अधिक success rate दिखा
लक्ष्य और सार्वजनिक कोड
- लक्ष्य machine learning और TensorFlow सीखते हुए 4Chan CAPTCHA को ब्राउज़र में भरोसेमंद तरीके से हल करने वाला मॉडल बनाना था
- मानक था कम-से-कम 80% accuracy, और संभव हो तो 90% से अधिक, जो अंततः हासिल किया गया
- संबंधित कोड GitHub के 4chan-captcha-playground में सार्वजनिक है
4Chan CAPTCHA कैसे काम करता है
- 4Chan पोस्ट या reply लिखने से पहले CAPTCHA input मांगता है
- सामान्य CAPTCHA एक image होती है जिसमें 5~6 alphanumeric characters होते हैं, और user को सभी characters सही-सही भरने होते हैं
- slider CAPTCHA में random character fragments जैसी दिखने वाली background image और transparent hole वाली foreground image को मिलाकर CAPTCHA text दिखाना होता है
CAPTCHA इकट्ठा करते समय मिली सीमाएँ
- नया CAPTCHA request observe करने पर browser
https://sys.4chan.org/captcha?framed=1&board={board}पर request भेजता है framed=1हटाने पर HTML के अंदरpostMessage()की जगह raw JSON लौटता है- JSON में
challenge,ttl,cd,img,img_width,img_height,bg,bg_widthआदि शामिल होते हैं ttlलगभग 2 मिनट बाद CAPTCHA expire होने का समय लगता हैcdको अगले CAPTCHA request तक इंतज़ार करने वाले cooldown value के रूप में समझा गया
- JSON में
- लगातार request भेजने पर
cdधीरे-धीरे बढ़ता जाता है- शुरू की कुछ requests में हर 5 second पर request संभव थी
- बाद में यह 8 second हो गया, और फिर लगभग दोगुना बढ़ता गया
- आखिर में यह 280 second पर cap हो गया
- 280 second timer तक पहुँचने के बाद CAPTCHA और कठिन हो गया
- कई horizontal lines और elliptical obstruction elements वाली images दिखने लगीं
- data quality कम थी, लेकिन फिर भी इस्तेमाल लायक थी
- CAPTCHA request से पहले Cloudflare Turnstile पार करना ज़रूरी था
- बहुत सारे proxies और simple scripts वाला तरीका व्यावहारिक नहीं था
- collection script browser से Cloudflare cookies कॉपी करके इस्तेमाल करती थी, और expire होने पर उन्हें manually बदलना पड़ता था
- इस तरीके से सैकड़ों CAPTCHA इकट्ठा हुए, लेकिन training के लिए पर्याप्त मात्रा नहीं थी और सही answer labels भी नहीं थे
मानव-आधारित labeling की सीमाएँ
- slider CAPTCHA alignment
trainer/captcha_aligner.pyकी heuristic script से 100% success rate के साथ हो गया - commercial CAPTCHA solving service पर CAPTCHA भेजकर असली इंसानों से answer भरवाने के लिए
trainer/labeler.pyलिखा गया - शुरू में भेजे गए कुछ दर्जन CAPTCHA में ज्यादातर में कम-से-कम एक character गलत solve हुआ
- service के “100% Recognition” feature का उपयोग करके result तभी लेने की setting की गई जब कई workers का answer मेल खाए
- setting values थीं
n = 2,x = 2,y = 3 - पहले 2 लोगों को भेजा जाता, और अगर दोनों का answer match न करे तो अधिकतम 3 और लोगों को भेजा जाता, जब तक 2 answers match न कर जाएँ
- setting values थीं
- इस setting से लगभग 80% CAPTCHA solve हुए, और उनमें लगभग 90% सही थे, लेकिन करीब 10% में error था
- कुछ cases में कई workers ने वही गलती दोहराई
- खुद या परिचितों की मदद से CAPTCHA solve करके image और answer save करने वाली user script भी इस्तेमाल की गई
- इससे कुछ सौ images और मिलीं, जिन्हें training set में जोड़ा गया
- repeated request throttling और CAPTCHA difficulty बढ़ने की वजह से यह approach छोड़नी पड़ी
synthetic data बनाना
- 4Chan और उसका CAPTCHA code open source नहीं था, इसलिए वही code locally चलाना संभव नहीं था
- इसके बजाय वास्तविक CAPTCHA structure के करीब synthetic CAPTCHA बनाए गए
- CAPTCHA को background और character, इन दो हिस्सों में बाँटकर संभाला गया
- background वास्तविक images में बड़े contour ढूँढकर character area हटाने से प्राप्त किया गया
- characters हटाने के बाद सिर्फ noisy background बचता था
- individual characters manual labeling से हासिल किए गए
- VoTT से characters को tag किया गया
- simple script से characters extract और post-process किए गए
- हर character के 50~150 isolated images हासिल हुए
- 4Chan CAPTCHA में सिर्फ
0, 2, 4, A, D, G, H, J, K, M, N, P, R, S, T, W, X, Yशामिल होते हैं- संभव है कि यह ambiguity से बचने के लिए चुना गया हो
- extracted characters और backgrounds को मिलाकर, देखे गए character placement patterns के अनुसार synthetic images बनाई गईं
- क्योंकि input characters पहले से labeled थे, synthetic CAPTCHA के answers भी अपने-आप बन गए
मॉडल structure और preprocessing
- training data में pre-aligned slider CAPTCHA, सामान्य CAPTCHA, और synthetic CAPTCHA को मिलाकर इस्तेमाल किया गया
- training script सभी images को 300x80 pixels में normalize करती थी और pure black-and-white में convert करती थी
- मॉडल LSTM CNN structure का था, जिसे CAPTCHA solving से जुड़ी कई posts को देखकर बनाया गया
- 3 convolution/max-pooling layers इस्तेमाल की गईं
- 2 LSTM layers इस्तेमाल की गईं
- 4th convolution layer भी आज़माई गई, लेकिन performance बेहतर नहीं हुई
- output length 5 या 6 characters की variable थी, इसलिए CTC encoding इस्तेमाल की गई
- implementation के लिए Keras और TensorFlow का उपयोग हुआ
tf.image.resize() argument order की समस्या
- कुछ पुराने aligned slider CAPTCHA 300x80 resolution या aspect ratio में फिट नहीं हो रहे थे
- training script को अलग-अलग inputs handle कराने के लिए
tf.image.resize()इस्तेमाल किया गया - शुरुआत में size argument को
(width, height)tuple माना गया, लेकिन वास्तव मेंtf.image.resize()(height, width)order मांगता है - इस गलती से images 80x300 जैसी vertically stretched और unreadable बन गईं
- 32 epoch से अधिक training के बाद भी खुद की images पर performance लगभग नहीं आई
- नए CAPTCHA पर prediction लगभग random थी
- processed input images को visualize करते समय समस्या पकड़ी गई, और fix करने के बाद training performance काफी बेहतर हो गई
training scale और परिणाम
- अंतिम dataset लगभग 500 manual solved images और लगभग 50,000 synthetic images से बना
- synthetic images लगभग 2,500 background images और हर character की 50~150 images से random sampling करके बनाई गईं
- dataset को random shuffle करने के बाद 90/10 ratio में training set और evaluation set में बाँटा गया
- NVIDIA RTX A4000 Laptop GPU पर प्रति epoch training time लगभग 45 seconds था
- पहले epoch के अंत में loss लगभग 19 था, और predictions लगभग सब गलत थीं
- 4th epoch के अंत तक loss 0.55 तक गिर गया, और random test predictions में 5 में 5 सही थे
- 8~16 epoch समय और अंतिम performance के बीच अच्छा balance था
- लगभग 8वें epoch पर loss stable हो गया
- 16 epoch के बाद improvement काफी कम हो गई
trainer/infer.pyसे Python में inference test किया गया, और अनदेखी images पर भी result आशाजनक थे
TensorFlow.js conversion और ब्राउज़र में execution
- user script TensorFlow.js और TypeScript में लिखी गई
- Python code के CAPTCHA alignment algorithm और image preprocessing code को फिर से implement किया गया
- संबंधित code repository के
user-scripts/directory में है - Python TensorFlow/Keras model format, TensorFlow.js द्वारा अपेक्षित format के साथ compatible नहीं था
- आधिकारिक conversion script इस्तेमाल करनी पड़ी, लेकिन दो समस्याएँ आईं
- आधिकारिक TensorFlow-to-TFJS converter Python 3.12 पर काम नहीं करता था, और error message भी स्पष्ट नहीं था
- PyEnv से Python 3.10 इस्तेमाल करने पर conversion सफल हुआ
- conversion script Keras 3 models को TensorFlow.js format में बदल सकती थी, लेकिन TensorFlow.js उन converted models को वास्तव में पढ़ नहीं पा रहा था
- संबंधित समस्या की पुष्टि forum post से हुई
- समाधान Keras 2 का उपयोग था
tf_keraslegacy package install किया गयाTF_USE_LEGACY_KERAS=1environment variable सेट करके training की गई- legacy
.h5model format में export किया गया और conversion script में input format बताया गया - code change सिर्फ एक line के simple modification से हो गया
वास्तविक 4Chan CAPTCHA पर performance
- मॉडल वास्तविक 4Chan CAPTCHA पर भी अच्छा काम करता था
- पहली model loading में लगभग 1 second लगता था
- उसके बाद execution लगभग तुरंत महसूस होता था
- browser में सैकड़ों वास्तविक CAPTCHA solve करने के अनुभव के आधार पर success rate 90% से अधिक थी
- character को गलत पढ़ना कम होता था, और असफल होने पर आमतौर पर एक character पूरी तरह छूट जाता था
- अधिक वास्तविक data पर training बढ़ाने या synthetic data generator के CAPTCHA layout को adjust करने से और सुधार की गुंजाइश है
- commercial human-based CAPTCHA solving services की तुलना में इस मॉडल की accuracy बहुत अधिक थी
4-character CAPTCHA और समापन
- प्रोजेक्ट पूरा होने के बाद, लेख लिखने और edit करने के दौरान 4Chan ने कभी-कभी 4-character CAPTCHA देना शुरू किया
- मॉडल को सिर्फ 5-character और 6-character CAPTCHA पर train किया गया था, लेकिन 4-character CAPTCHA पर भी उसी स्तर की performance दिखी
- प्रोजेक्ट के दौरान machine learning और computer vision के बारे में बहुत कुछ सीखा गया, और शुरुआत का लक्ष्य, यानी browser-based CAPTCHA solving model, पूरा कर लिया गया
1 टिप्पणियां
Hacker News की टिप्पणियां
Keras और TensorFlow.js integration वाला गड़बड़ हिस्सा बिल्कुल typical TensorFlow जैसा लगता है
TensorFlow इस्तेमाल करने पर हमेशा ऐसा लगा कि यह कोई integrated और smooth product कम, और एक ही छत के नीचे बस loosely related tools का ढेर ज़्यादा है
सच कहें तो Google की open source libraries या tools सबके बारे में ऐसा कहा जा सकता है
“2019 में Keras को TensorFlow में merge करने का फैसला क्यों किया गया?” इसका जवाब था, “यह मेरा फैसला नहीं था। यह 2018 में TF leaders द्वारा लिया गया फैसला था, और उस समय मैं L5 individual contributor था; वह L8-level decision था”
मेरी site[0] पर comment form spam रोकने के लिए मुझे CAPTCHA चाहिए था, तो मैंने पहले देखा हुआ एक मजेदार तरीका reuse करके देखा
यह बिल्कुल perfect भी नहीं है और मुश्किल भी नहीं, लेकिन इसे बनाने की प्रक्रिया मुझे सच में बहुत पसंद आई
[0] https://www.hybridlogic.co.uk/contact
https://vivirenremoto.github.io/doomcaptcha/
लोग distorted text-based CAPTCHA से क्यों दूर चले गए, इसकी वजह है
अब हम लगभग उस point पर हैं जहां computers इसे इंसानों से बेहतर solve करते हैं
https://www.usenix.org/system/files/conference/woot14/woot14... इस विषय पर paper है, और मुझे यह काफी interesting लगा
फिर भी आश्चर्यजनक रूप से कई text-based CAPTCHA को ImageMagick से grayscale conversion, dilation और erosion processing करके फिर Tesseract को देने वाली कुछ lines की shell script से solve किया जा सकता है
लेकिन https://2captcha.net जैसी sites भी हैं, इसलिए आखिर में CAPTCHA किसी minimum छोटे effort की मांग करने वाले mechanism जैसा ही है
इस लेख के solution में भी काफी समय, skill और मेहनत लगी, और result भी अच्छी तरह generalize नहीं होता, इसलिए दूसरे type के CAPTCHA के लिए शुरुआत से फिर करना पड़ेगा
ज्यादातर spammers इसे reproduce नहीं कर पाएंगे, और जो लोग reproduce कर सकते हैं वे शायद legal तरीके से पैसे कमाएंगे या ज्यादा profitable targets को निशाना बनाएंगे
ऐसे CAPTCHA successful spam की cost को expected revenue से ऊपर ले जाने में अब भी अच्छे से काम करते हैं
क्या ऐसा forum बनाया जा सकता है जहां हर member को operator के साथ 15-minute video interview करना पड़े? पता है कि “scalable नहीं है”, लेकिन एक मजेदार prank जैसे mechanism के तौर पर संभव लगता है
यह solution नहीं है, बल्कि धीरे-धीरे पुराना होता जा रहा एक छोटा किला जैसा है
link के मुताबिक reCAPTCHA v3 में 10–15 seconds लगते हैं और 1000 CAPTCHA पर $1.3 खर्च होता है
किसी बड़ी website को बड़े scale पर scrape करने जैसे कई कामों में, जहां CAPTCHA bypass करना होता है, यह cost सच में काफी बड़ी और मुश्किल हो जाती है
mCaptcha.org भी उनमें से एक है और दूसरे implementations भी हैं
पारंपरिक CAPTCHA अगर थोड़ा भी effective हो, तो accessibility के लिहाज से nightmare बनना आसान है
अगर इस तरह के topics में interest है, तो 2014 में मैंने जो Silk Road CAPTCHA analysis लिखा था, वह भी है: https://github.com/mieko/sr-captcha
4chan की response ठीक लगती है
वैसे भी neural networks से इसे आसानी से solve किया जा सकता है, इसलिए वे humans के लिए काम को आसान करने की तरफ जा रहे हैं
अब बहुत मुश्किल CAPTCHA design करने पर भी machines के लिए solve करना मुश्किल होने की संभावना कम है, और humans को ही ज्यादा irritate करने की संभावना ज्यादा है
https://4chan.org/pass
यह पहले से CAPTCHA के बिना post करने के option के रूप में दिया जा रहा है
अगर CAPTCHA पूरी तरह बेअसर है, तो conclusion यही निकलता है कि CAPTCHA और free posting हटाकर, post करना चाहने वाले हर व्यक्ति को 4chan Pass खरीदना चाहिए
हाल ही में उन्होंने 15-minute posting delay introduce किया है, जो सच में गुस्सा दिलाता है
मुझे Cookie AutoDelete में 4chan को allowlist में डालना पड़ा
मुझे लगता है कि CAPTCHA होने का दिखावा करने के बजाय असल में यूज़र की timing और behavior का विश्लेषण करना बेहतर नहीं होगा?
सच कहूँ तो लगता है कि ऐसा पहले से ही हो रहा होगा
अगर पूरी तरह meta लेवल पर जाएँ, तो AI को यह तय करने के लिए train किया जा सकता है कि सामने वाला actor इंसान है या नहीं
यानी एक तरह से reverse Turing test ईजाद करने जैसा, जिसमें अगर AI उसे सामान्य इंसान के response से अलग नहीं कर पाता, तो उसे इंसान माना जाए
फर्क यह है कि इसे marketing वाले इंसानी responses से अलग नहीं करना है
अब सिर्फ यह सोचकर ही थोड़ा मन खराब हो रहा है, लेटना पड़ेगा
CAPTCHA दिखाने से पहले ही वे TLS fingerprint, IP, HTTP/2, request, JavaScript environment, fonts और image rendering capability, और browser खुद को identify करते हैं
इन जानकारियों से वे trust score निकालते हैं और तय करते हैं कि शुरुआत में CAPTCHA दिखाना भी है या नहीं
उसके बाद ही CAPTCHA input का analysis मायने रखता है, लेकिन उस point तक bots के 90% पहले ही पकड़े जा चुके होते हैं
browser बिना किसी awareness के server को जितनी जानकारी बता सकता है, वह इतनी बेतुकी रूप से ज्यादा है कि हममें से हर एक का digital fingerprint असली fingerprint से भी ज्यादा unique होने की संभावना है
4chan CAPTCHA तोड़ने का original-टाइप case अब भी मुझे Yannick Kilcher द्वारा “Raiders of the Lost Kek” dataset पर GPT-J को fine-tune करना ही लगता है
बड़े language model के video में दिखे uses में यह शायद सबसे cool example हो सकता है: https://youtu.be/efPrtcLdcdM?si=errY0PrEhnX9ylDw
record-worthy है
“official TensorFlow-to-TFJS model converter Python 3.12 पर काम नहीं करता, और documentation भी ठीक से नहीं है”, “TensorFlow.js Keras 3 को support नहीं करता” जैसी चीजों की वजह से कुछ साल पहले हल्के-फुल्के machine learning की कोशिश करते-करते लगभग छोड़ ही दिया था
latest tutorials के पहले से outdated होने के cases बहुत ज्यादा थे, random traps बहुत थे, और “getting started” guides का पहले से expert मानकर चलना चौंकाने की हद तक आम था
किसी पुराने Bayesian statistics textbook से basics सीखें, फिर PyTorch जैसे major framework पर जाएँ
शुरुआत में CNN, RNN, Transformer architecture और training pipeline के हर हिस्से को खुद लिखकर देखना अच्छा है
data loader तक शामिल करें, लेकिन CUDA matrix kernels छोड़ सकते हैं
LangChain जैसे दूसरों के wrapper के ऊपर बने wrapper से दूर रहना बेहतर है
documentation सिर्फ outdated ही नहीं, कई बार basics के बारे में साफ गलत भी होती है
Hugging Face शानदार है, अगर आपको fundamentals आते हों और standard wrapper टूटने पर उसे ठीक कर सकें
यह कुछ घंटे लगाकर septic tank का ढक्कन खोलना सीखने जैसा है
CAPTCHA-solving service के link पर जाएँ तो यह काम करने वाले लोगों के profiles पढ़ सकते हैं
इसे खतरनाक factory में काम करने से ज्यादा ethical बताकर promote किया जा रहा है