ファむル共有キャプチャのハッキング

はじめに





この蚘事では、 ifolder.ruを䜿甚しおキャプチャをハッキングするプロセスに぀いお簡単に説明したす。 プロセスでのPython蚀語ずサヌドパヌティラむブラリの䜿甚。 Open Computer Vision ©Intelラむブラリの䞀郚ずしおハフ倉換アルゎリズムを䜿甚するず、画像ノむズを取り陀くこずができ、䜿いやすく高速なFANNラむブラリFast Artificial Neural Networkにより、画像認識問題に人工ニュヌラルネットワヌクを䜿甚できるようになりたす。



私の動機は、たずPython蚀語を詊すこずでした。 ご存じのように、蚀語を孊ぶ最良の方法は、その蚀語に適甚された問題を解決するこずです。 したがっお、画像凊理プロセスの説明ず䞊行しお、䜿甚するラむブラリず甚途に぀いお説明したす。



問題の抂芁





次の皮類のキャプチャがありたす。



ifolder.ruは、ファむルのホスティングサヌビスであり、ダりンロヌドおよびアップロヌド時に、あなたがロボットではないこずを確認したいものです。 以䞋に説明するハフ倉換アルゎリズムをこの問題に適甚したいずずっず思っおいたため、リ゜ヌスが䜿甚されたした。



このキャプチャを認識するこずの難しさは䜕ですか それらのいく぀かがありたす、私たちは問題を解決する耇雑さぞの圱響の順にそれらを説明したす



1. キャラクタヌの亀差の存圚。 そのような堎合の良い䟋



そのようなケヌスの割合は比范的小さいため、「認識の察象ではない」ずマヌクされた結婚で蚘録したす。



2. 線の存圚。 各画像には、異なる長さの4本の線さらに、長さは認識可胜なオブゞェクトの線圢芁玠に盞圓する堎合がありたす、倪さ、傟斜角がありたす。 私たちは、それらを取り陀く必芁があるノむズの䞻な芁玠ず考えおいたす。



3. 画像内の文字の配眮の倧きなバリ゚ヌション。 シンボルは、異なるレベルで、異なる距離に配眮されたす。



4. 文字を回転させたす。 シンボルは1぀の軞に沿っお傟斜がありたすが、最倧30床たでです倀は経隓的に取埗されたす。



5. 文字の浮動サむズず倪さ。



より詳现な調査がそれほど単玔ではない、非垞に単玔なキャプチャに芋えたす。 :)しかし、すべおがそれほど悪くはありたせん。 始めたしょう。



ステヌゞ1.トレヌニングサンプルの䜜成ず前凊理





たず、サむトから数癟のキャプチャサンプル500などをダりンロヌドしたす。これでアルゎリズムを蚈算し、ニュヌラルネットワヌクの䞻芁なトレヌニングサンプルを䜜成できたす。

urllibラむブラリず簡単なスクリプトを䜿甚しお、n番目の数の必芁なサンプルをサむトからダりンロヌドしたす。 次に、それらをgifから8ビットのビットマップに倉換したす。匕き続きこの圢匏で䜜業したす。 重芁なポむントは、画像の反転です。 ぀たり 黒い背景に癜いオブゞェクト。 埌で、これがなぜなのかが明らかになるでしょう。



䞊蚘のすべおを実行するスクリプト

urllib2 から urlopenを むンポヌト

urllib import urlretrieve から

PIL むンポヌト Image、ImageOps、ImageEnhanceから

茞入 OS

むンポヌトシステム

再 むンポヌト

茞入 時間



def main  url、n  

URLセッションURLを取埗

data = urlopen  url  。 読む  

match = re 。 怜玢  r "/ random / images / \ session = [a-z0-9] + \ quot ;, data 

䞀臎する堎合 

imgurl = " ifolder.ru" +マッチ。 グルヌプ  

その他 

リタヌン -1



gen imgs

範囲内の i  n  

urlretrieve  imgurl、 '/ test /' + str  i  + '.gif' 

時間 。 寝る  1 

print str  i  + 'of' + str  n  + 'downloaded'



それらを倉換する

範囲内の i  n  

img =むメヌゞ。 open  '/ test /' + str  i  + '.gif'  。 倉換  'L' 

img = ImageOps。 反転  img 

img = ImageEnhance。 コントラスト  img  。 匷化  1.9 

img。 保存  '/ test /' + str  i  + '.bmp' 

os.unlink '/ test /' + stri+ '.gif'





__name__ == "__main__"の堎合 

url = sys argv [ -1 ]

URLでない 堎合 。 例   。 startswith  "http"  

「usagepython dumpimages.py http://ifolder.com/?num」を 印刷したす

sys 終了  -1 

メむン url、 500 




ステヌゞ2。オブゞェクトのノむズ陀去、ロヌカラむズおよび分離。





最も興味深く、時間のかかるステヌゞ。 レビュヌで瀺したcaptchaの䟋は、この蚘事のサンプルずしお取り䞊げ、さらにそれらず連携しおいきたす。 したがっお、最初の段階の埌、次のものがありたす。





画像を操䜜するために、 PILラむブラリを䜿甚したした。 チョッパヌずしお䜿いやすいが、非垞に機胜的で非垞に䟿利なラむブラリ。



矊に戻りたしょう。 この堎合、ノむズずは線を意味したす。

問題の解決策ずしお、いく぀かのオプションがありたす。

1.遺䌝的アルゎリズム。

2.ハフ倉換。 これは䞀皮の自動ベクトル化ず考えるこずができたす。



Yandex captchaをハッキングする同様のタスクを解決するプロセスを含め、GAはHabréで数回取り䞊げられたした。 盎線を怜出するための遺䌝的アルゎリズムの修正を曞くこずは難しくありたせん。



ただし、2番目のアルゎリズムを遞択したした。 GAず比范しお、ハフ倉換は、数孊的に厳密で決定論的なアルゎリズムであり、ランダムな芁因の圱響はありたせん。 この堎合、リ゜ヌスをあたり消費せず、同時に理解しお䜿甚するのに十分簡単です。

簡単に蚀うず、アルゎリズムの意味は、平面䞊の任意の線を2぀の倉数-傟斜角ず原点からの距離Ξ、rで定矩できるずいうこずです。 これらの倉数は蚘号ず芋なすこずができ、独自の2次元空間を圢成したす。 盎線は点の集合であり、それぞれに独自の蚘号のペアシヌタ、rがあるため、これらの蚘号の空間には、元の平面画像䞊の線の点に察応する蚘号の有限近傍内に点のクラスタヌ亀差点の最倧倀たたはピヌクがありたす。 しかし、すべおは芋かけよりも簡単です。 :)

りィキペディアで詳现を読んで、 ここでアルゎリズムの芖芚化を芋るこずができたす 。 すぐに、私が意味するこずが明らかになりたす。



実装を自分で曞くのは圓然怠け者です。 さらに、 OpenCVラむブラリにあり、C / C ++でよく䜜業したす。 Pythonには、簡単に組み立おおむンストヌルできるバむンダヌがありたす。



䞀般に、OpenCVはかなり䜎レベルのラむブラリであり、Pythonでの䜜業はあたり䟿利ではないため、著者はPILオブゞェクト圢匏に倉換するためのアダプタヌを提䟛しおいたす。 これは非垞に簡単に行われたす



src = cvLoadImage  'image.bmp' 、 1  OpenCV オブゞェクト

pil_image =アダプタ。 Ipl2PIL  src  PIL オブゞェクト




行を削陀する手順は次のずおりです。

def RemoveLines  img  

dst = cvCreateImage  cvGetSize  img  、IPL_DEPTH_8U、 1 

cvCopy  img、dst 

storage = cvCreateMemStorage  0 

lines = cvHoughLines2  img、storage、CV_HOUGH_PROBABILISTIC、 1 、CV_PI / 180、35、35、3 

ラむンむンラむンの堎合

cvLine  dst、ラむン[ 0 ] 、ラむン[ 1 ] 、bgcolor、 2、0 

戻り倀




画像はモノクロ、぀たり癜いピクセルにする必芁がありたす。 そのため、最初の段階で画像を反転し、認識䞭に画像を反転したす。

重芁な点は、 cvHoughLines2関数を呌び出すこずです 。 CV_HOUGH_PROBABILISTICパラメヌタヌに泚意を払う必芁がありたす。これは、アルゎリズムのより「スマヌトな」倉曎の䜿甚を意味したす。 最埌の3぀のパラメヌタヌも非垞に重芁です。それらは次を反映しおいたす。特城空間セル内のポむントの数。 最小行長; 最倧ギャップギャップ、぀たり 行ごずの欠萜ピクセルの数。 詳现に぀いおは、ラむブラリのドキュメントをご芧ください。

これらのパラメヌタを正しく遞択するこずは非垞に重芁です。そうしないず、画像から文字の䞀郚である線を削陀したり、その逆にノむズを倚く残したりしたす。 遞択したパラメヌタは最適であるず考えおいたすが、理想からはほど遠いです。 たずえば、最倧ギャップを2倍にしたしょう。 これはこの効果に぀ながりたす





行ずずもに、倚くの有甚な情報を削陀したした。 同時に、正しく遞択されたパラメヌタヌにより、蚱容可胜な結果を​​埗るこずができたす。







線がシンボルず亀差するこずが倚いため、有甚な情報も必然的に削陀するこずにすでに気付いおいたす。 これは臎呜的ではありたせん。郚分的には埌で埩元できるため、最終的にはすべおがニュヌラルネットワヌクのトレヌニングの皋床に䟝存したす。



次のタスクは、キャラクタヌのロヌカラむズず分離です。 ここで、レビュヌのパラグラフ1および3で説明されおいる問題が発生したす。 シンボルの浮動䜍眮ず回転により、䞀般的な座暙ず䜍眮に䟝存するこずはできたせん。 倚くの堎合、シンボルは「タッチ」され、茪郭怜出シリヌズのアルゎリズムを䜿甚できなくなりたす。

垂盎に分割する必芁があるこずは明らかです。 考え盎すこずなく、画像の各列の癜いピクセルの数を蚈算し、りィンドりに衚瀺したす。







グラフを䜜成するために、 matplotlibラむブラリヌを䜿甚したした。 このラむブラリは、その柔軟性ず組み蟌みの機胜に際立っおおり、他の蚀語では芋られたせん。 PyQt4は 、フロント゚ンドGUIずしお䜿甚されたした。



グラフィックを画像ず盞関させるず、3぀の極小倀の存圚を確認できたす。 圌らによるず、画像を「切り取る」こずになりたす。 この堎合、最小倀を芋぀けるための最適なアルゎリズムは、もしあれば、芋぀けるのが困難です。 したがっお、ロヌカルミニマムを怜玢するための簡単なアルゎリズムを実装したした。パラメヌタは経隓的に取埗されたもので、最適ずはほど遠いものです。 これは重芁なポむントであり、より思慮深いアルゎリズムは認識の品質を倧幅に改善できたす。

゜ヌスFindDividingColsずDivideDigitsで画像を文字に分割する手順を芋぀けるこずができたす。



次に、文字をトリミングしたす 背景領域がたくさん残っおいたす。 倱われた有甚な情報を回埩しようずした埌。 䟵食ず膚匵䟵食ず膚匵や閉鎖閉鎖などの圢態孊的アルゎリズムを䜿甚するこずをお勧めしたす。 これらはOpenCVラむブラリにありたす。Pythonでの䜿甚䟋は、ラむブラリリポゞトリ-OpenCV \ samples \ python \ morphology.pyにありたす。 個々のキャラクタヌの受信画像はすべお、18x24の単䞀サむズに瞮小されたす。



文字分離結果





ステヌゞ3.認識





次の段階は、ニュヌラルネットワヌクの䜜成ずそのトレヌニングです。 500個の画像それぞれ4文字のうち、トレヌニングに䜿甚される蚱容可胜な品質ずコンテンツのサンプルが1000個未満でした。 0.5の確率で1文字の認識レベルにネットワヌクをトレヌニングするず、党䜓の効率は0.5 ^ 4 = 0.0625たたは6になりたす。 目暙は達成可胜な以䞊のものです。 結果のサンプルは圌女にずっお十分でした。 あなたが数日間「䞭囜人」ずしお働きたいずいう願望を持っおいるなら、それはより良い結果を達成する可胜性がありたす、䞻なこずは私が持っおいない忍耐です。 :)

ニュヌラルネットワヌクを䜜成しお䜿甚するには、 FANNラむブラリを䜿甚するず䟿利です。 ファむルなしでpythonのWrapperを組み立おたくなかったので、SWIGが受け取ったコヌドを線集する必芁がありたした。 コンパむルされたラむブラリ、Python 2.6のむンストヌラヌ、およびいく぀かの䜿甚䟋をレむアりトするこずにしたした。 こちらからダりンロヌドできたす。 小さなむンストヌル手順を曞きたした。INSTALLを参照しおください。



入力では、18 * 24 = 432ピクセルの配列を䞎えたすより正確には、ピクセルが有意であれば1を、背景であれば0を枡したす、出力では10個の数字の配列を取埗したす。 したがっお、ニュヌラルネットワヌクの入力局は432個のニュヌロンで構成され、出力は10です。ニュヌロンの数== 432/3の別の隠れ局が䜜成されたす。



ネットワヌクを䜜成およびトレヌニングするためのコヌド

pyfann import libfann から



num_input = 432

num_output = 10

num_layers = 3

num_neurons_hidden = 144

desired_error = 0.00006

max_epochs = 50000

epochs_between_reports = 1000



ann = libfann。 neuro_net  



アン。 create_standard  num_layers、num_input、num_neurons_hidden、num_output 

アン。 set_activation_function_hidden  libfann。SIGMOID_SYMMETRIC_STEPWISE 

アン。 set_activation_function_output  libfann。SIGMOID_SYMMETRIC_STEPWISE 



アン。 train_on_file  'samples.txt' 、max_epochs、epochs_between_reports、desired_error 



アン。 保存  'fann.data' 

アン。 砎壊  




䜿甚法

def MagicRegognition  img、ann  

ann = libfann。 neuro_net  

アン。 create_from_file  'fann.data' 



サンプル= [ ]

imgのi サむズ [ 1 ] 

imgのj サむズ [ 0 ] 

colordist  img。getpixel   j、i   、bgcolor  < 10の堎合 

サンプル[ j + i * img。 サむズ [ 0 ] ] = 0

その他 

サンプル[ j + i * img。 サむズ [ 0 ] ] = 1



res =アン。 実行 サンプル



返品 むンデックス  max  res  




おわりに





Pythonは玠晎らしい蚀語であり、非垞に簡朔で矎しいです。倚くのサヌドパヌティラむブラリが私のすべおの日々のニヌズをカバヌしおいたす。 䞻に堅固なコミュニティずドキュメントの量による、䜎い゚ントリヌしきい倀。 投手、今私はあなたず䞀緒です;



䜿甚された远加のラむブラリ

ナンピヌ

シピヌ



゜ヌス  ミラヌ1 、 ミラヌ2 



構文を匷調するために、 highlight.hohli.comリ゜ヌスが䜿甚されたした。



UPD 1.゜ヌスを3぀のリ゜ヌスにリロヌドしたした。 2.芁求で、dumpimages.pyは、ifolderペヌゞのcaptchaにリンクするために、正芏衚珟の最埌の3文字をファむルから削陀したした。 そしお、「子䟛」がふける:)






All Articles