machine learning, image

이미지 관련 2차삽질 (hack this site : Bypass the image captcha)

qkqhxla1 2015. 5. 10. 22:34

해결 : http://qkqhxla1.tistory.com/442



위에 링크한 자료를 찾아보고, ocr방법론도 이것저것 거의 다 찾아본것 같다. 

그러나 opencv의 ocr은 내가 opencv를 따로 공부한 적이 없기도 하지만 너무 쓰기가 복잡했고, 원래 쓰던 pytesser은 넣을수 있는 옵션이 너무 적었으며,(사실 넣을수 있는 옵션이 없는것같다.) python-tesseract 라는걸 찾았는데 이건 opencv처럼 어렵지도 않고, 내가 원하는 옵션도 있었지만(내가 원하는 문자만 인식하도록 하는 옵션 등.) 아는 사람만 알아서 잘 찾아서 쓰라는듯이 공식 홈페이지의 설명이 별로 없다. (예제 코드만 잔뜩 있다.)


이 문제가 어려운 이유가, 일단 글자나 숫자가 너무 작고, 회전을 하면 글자가 우그러진다. 그래서 pytesser같은것들이 인식률이 매우 낮아진다. 보정을 해봐도 해봐도 우그러지는게 별 진전이 없어서 혹시 어떠한 이미지를 손실없이 통째로 돌리는게 있지 않을까(마치 직접 보고있는 사진을 손으로 잡고 돌리듯이) 찾아봤지만 그런건 없다고한다.


이 한문제를 풀기 위해 몇일동안 삽질했는데...... 결국 답의 근사치만 내고 끝났다.

(인식률을 계산해보니 95%) 나중에 완벽하게 풀면 추가 예정..


눌러보면 253개의 캡챠가 나오는데 안에서부터 시계방향으로 읽어서 보내면 된다. 신기한건 자바스크립트로 글자를 그린다. 그래서 내가 직접 캡쳐해서 이미지 파일로 만들어줘야 한다.(심지어 실행시마다 캡챠의 위치도 변함.) 내가 한건 파이썬의 스크린샷찍는 모듈로 적절한 부분을 스크린샷으로 찍은후, 

픽셀값을 계산해서 캡챠의 중심부를 찾아내서 알아서 조정한다.(십자선은 조정용으로 그려놓은것.)

그다음에 10도씩 반시계방향으로 이미지를 돌리면서 위의 빨간색 네모부분의 값을 인식해서 일일히 가져온 후, 가져온 문자열을 보정한다. 특히 숫자 4같은경우는 매우 더럽게도 잘 인식이 되지 않고, *4, 4$, *&등으로 계속 바뀌어서 인식되서 매우 보정하기가 어려웠다. 보정은 그냥 replace함수로 노가다하듯이 하나하나 다 썼다.


보정 후 내부부터 나오도록 순서를 연결해서 보냈다. 위의 예는 449B8AC1~ ... ~4167이 답이다.

어쨋든 억지로 성능을 끌어올려서



요렇게 대부분 잘 나왔지만..... 하나하나 비교해보면 몇개씩 문자 또는 숫자가 틀린다. (ex) 40도의 마지막 6이 아니라 캡챠를 보면 8이다. 잘못 인식됨.) 대략 갯수를 세보니 253개중 15~25개정도는 틀린 것으로 나타났으며, 이정도의 정확도면 브루트포싱처럼 우연히 다 맞을때까지 계속 보내서 될 문제가 아니라는걸 깨달았다. 그래서 일단 2차 삽질은 여기서 포기한다..


해결 : http://qkqhxla1.tistory.com/442