상세 컨텐츠

본문 제목

[파이썬] 머신런닝을 이용한 자동방지 문자 캡챠 뚫어보기

코딩

by 땡감 2022. 1. 24. 14:28

본문

반응형

새로운 프로그램을 만들다가 자동예약을 방지하는 일명 캡챠(Captcha)를 뚫어야 하는 상황이 발생했다.

검색을 해보니 캡챠를 뚫기 위해서 흔히 OCR이나 머신런닝을 사용하고 있었고 나는 머신런닝을 사용해 뚫어보기로 했다.

머신런닝이다 보니 학습할 데이터 샘플이 필요했는데 참조한 블로그의 Sample 데이터들은 내가 뚫고자 하는 사이트와 형식이 조금 달라 인식이 제대로 되지 않았다.

따라서 해당 사이트의 Sample 데이터가 필요했는데 이 역시 파이썬을 통해 Sample 데이터를 추출했다.

약 100여개의 Sample 데이터를 수집하고 머신런닝이 학습할 수 있도록 Sample 데이터 파일명을 하나하나 변경하는 수작업을 했다. 

그 후 머신런닝 반복합습을 통해 결과 파일을 얻고, 그 결과파일을 이용해 실제 사이트의 자동방지 문자를 인식하도록 했다.

결과는 아주 만족스러웠는데 나 조차도 너무나 신기해 이 내용을 공유하고자 포스팅한다.

 

먼저 간략하게 진행 과정을 나열하면 아래와 같다.

  • 자동방지를 뚫기 위한 사이트의 Sample Data 수집 (100여개 정도면 충분한듯)
  • 수집한 Sample Data를 학습할 수 있도록 파일명 변경
  • 머신런닝을 통한 Sample 데이터 반복학습
  • 학습 결과 파일을 통해 실제 사이트 자동방지 문자 인식

 

테스트를 위한 준비물은 아래와 같다.

  • CaptchaCracker 모듈 설치 (pip install CaptchaCracker)
  • numpy, tensorflow 모듈 설치 (pip install numpy==1.19.5 tensorflow==2.5.0)
  • 3.9 이하의 Python (3.9.7를 추천)
  • 학습할 Sample 데이터 (뚫고자 하는 Site별로 상이함)

 

코드를 살펴보자.

import glob
import CaptchaCracker as cc

#이미지 학습
def learn_img():
    img_path_list = glob.glob('C:/Users/root/PycharmProjects/pythonProject/Captcha/sample/*.png')    #학습 데이터 이미지 경로 (파일명이 숫자와 같아야함)
    img_width = 130 #이미지 넓이
    img_height = 35 #이미지 높이
    CM = cc.CreateModel(img_path_list, img_width, img_height)   #학습모델 생성
    model = CM.train_model(epochs=100)  #반복 학습 시작
    model.save_weights('C:/Users/root/PycharmProjects/pythonProject/Captcha/weights.h5')    #학습 결과 가중치 저장


#가중치로 결과 도출
def result_img():
    target_img_path = 'C:/Users/root/PycharmProjects/pythonProject/Captcha/target/target.png'    #타켓 이미지 경로
    img_width = 130 #타켓 이미지 넓이
    img_height = 35 #타켓 이미지 높이
    img_length = 6  #타켓 이미지가 포함한 문자 수
    img_char = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}   #타켓 이미지안에 포함된 문자들
    weights_path = 'C:/Users/root/PycharmProjects/pythonProject/Captcha/weights.h5' #학습 결과 가중치 경로
    AM = cc.ApplyModel(weights_path, img_width, img_height, img_length, img_char)   #결과 가중치를 가지는 모델 생성
    pred = AM.predict(target_img_path)  #결과 도출
    return pred

#learn_img() #최초 가중치 생성을 위한 학습시 주석해제

사실 코드라고 하기도 민망할 정도로 CaptchaCracker 모듈에서 대부분 과정을 처리한다.

우리는 그져 Sample 데이터들의 경로와 사이즈, 그리고 반복학습할 횟수 등만 지정을 해주면 된다.

학습 결과로 얻은 가중치를 이용해 실제 사이트의 캡챠 뚫는 부분도 간단하다.

머신런닝으로 인식해야할 대상이 되는 이미지의 경로와 사이즈, 그리고 포함할 수 있는 문자만 나열해주면 된다.

가장 많은 시간을 할애해야할 부분은 아마 Sample 데이터들의 파일이름을 변경하는 작업일 것이다.

몇 종류의 Sample 데이터로 학습을 시켜 결과를 도출해보니 Sample 데이터의 배경색에 따라서도 인식률의 차이가 존재하는 것 같다.

따라서 자신이 뚫고자 하는 사이트별로 재학습을 시켜야 가장 높은 인식률을 보인다.

 

그럼 실제 어떻게 작동하는지 영상으로 살펴보자.  

윈도우상에서 화면영상 캡쳐는 포커스가 잡힌 하나의 창만 캡쳐가 되어서 2번으로 나누어 촬영했다.

따라서 화면의 보이는 문자가 각각 상이하나 실제로는 작 인식한다.

 

내가 실사이트에서 얻은 Sample 이미지와 1000번의 반복학습을 통해 얻은 가중치 파일도 같이 첨부해본다.

sample.zip
0.34MB
weights.h5
1.62MB

 

PS. 텐서플로우는 파이선 3.10 버젼은 지원하지 않는다.

따라서 나 역시 3.9.7 버젼에서 설치하고 테스트를 했다.

참조 및 출처 : https://wooiljeong.github.io/python/captcha-cracker/

반응형

관련글 더보기

댓글 영역