machine learning, image

hackthissite bypass the image captcha

qkqhxla1 2015. 9. 29. 16:09

드디어 이걸 풀었다!! 매우 감격스럽다.

거의 포기하려다가 한번만 해볼까... 했던게 성공했다.


중간의 긴 코드는 대부분 앞의 글과 같으므로 이해하려면 앞의 글들도 참고하면서 보는게 좋다.

1차 삽질 : http://qkqhxla1.tistory.com/257

2차 삽질 : http://qkqhxla1.tistory.com/344

OCR of Hand-written Data using SVM : http://qkqhxla1.tistory.com/440


문제 링크 : https://www.hackthissite.org/missions/prog/6/



풀이 방법.

이 문제는 두가지 방법이 있다. 그려지는 자바스크립트를 분석해서 선과 호를 분석해서 글자를 조합하여 만든후 그 글자의 위치에 따라서 판별해내는 방법과, ocr을 인식해서 푸는 방법이 있다.

난 ocr로 풀었는데, 방법을 하나하나 설명하겠다.




일반적인 트레이닝은 구글링으로 데이터가 엄청나게 많이 들어있는 압축 파일을 다운받아서 하지만,

내가 할 트레이닝은 이 문제에 특화된 트레이닝이므로 한글자 한글자 판별해서 트레이닝을 한다.

아래는 도화지를 하나 만드는 코딩이다.

# -*- encoding: cp949 -*-
import Image
Image.new('RGB', (180,320), (0,0,0)).save('hackthissite_train.png') #트레이닝을 위한 도화지를 하나 만든다.

코드를 실행시키면 검은색 바탕의 도화지가 하나 만들어진다. 한 글자당 크기는 20 * 20이다. 도화지의 크기는 180 * 320 인데, 이 이유는 0~80도까지의 9개반복의수, 0~9,A~F의 글자의 수는 16개이기 때문에 

9*20,16*20의 크기로 만든것이다.

도화지를 만들었으니 도화지에 트레이닝할 글자들을 적어넣는다.

도화지를 만든 후 위 코드를 실행시키고 바로 아래 사진이 있는 문제 화면을 키면 알아서 이미지 프로세싱을 시작한다. 코드 실행 2초정도 후에 다시 눌러보면 한글자씩 나타나는걸 알 수 있다. 트레이닝을 위한 글자판별을 사람이 하는것이므로 8이 나왔다면 8을, A가 나왔다면 A를 눌러주면 트레이닝이 전부 끝난 후 위에서 만든 도화지의 적당한 위치에 그림이 붙여진다. 인덱스 계산은 위의 코드를 참조하자.


트레닝이 끝나면 hackthissite_train.png가 거의 꽉 차게 되는데, 빈칸이 있다면 문제를 새로고침해서 다른 문제그림을 가져온 후 트레이닝하자. 그러면 글자가 꽉 차는걸 볼 수 있다.


완성되면 이거처럼 된다. 이제 이걸로 트레이닝후 판별하면 된다.

트레이닝과 코딩.


결과.

중간의 한글자인가 빼고 다 맞음을 확인할수 있었다. 정확도가 매우 높아졌다.


여러번 돌리다 보면 성공한다.




나중 참고용 위의 두개 코드를 합친 총 코드.