- 자동 입력 방지 문자(CAPTCHA) 이미지를 인식할 수 있는 딥러닝 모델 제작
- 개발 인원 : 1명
- 프로젝트 기간 : 2021.08
- 개발 당시 Google Colaboratory로 개발하였으나 현재 Jupyter Notebook으로 구동 가능하도록 수정
Google ColaboratoryJupyter Notebook- python 3.7.7
matplotlib 3.5.2
numpy 1.22.4
opencv-python 4.5.5.64
sklearn 0.0
tensorflow 2.9.1
- 데이터 수집
- 데이터 라벨링
- 데이터 가공
- 모델
- 테스트
- 결론
데이터 수집
selenium 라이브러리를 통해서 0.1초마다 새로고침하여 captcha 이미지를 다운로드하는 이미지 다운봇 제작
데이터 라벨링
파이썬 기본 GUI 라이브러리인 tkinter를 이용하여
폴더 내부의 사진을 하나씩 띄워주고 입력창에 보안 코드를 작성 후 엔터를 치면
해당 사진의 파일 이름을 입력한 보안코드로 바꿔주는 프로그램 작성 후 사용
[2, 3, 4, 5, 6, 7, 8, a, b, c, d, e, f, g, h, k, m, n, p, r, w, x, y] 중 4개의 글자로 구성된
총 6150개의 라벨링 된 데이터를 얻을 수 있었다.
데이테 가공
다음과 같이 샘플에서 적절한 frame 너비와 위치를 계산한다
- frame_size: 28px x 40px
- start_padding : 5px
- overlapped : 8px
그 후 opencv를 이용하여 grayscale로 로드 후 각 이미지를 frame에 맞게 자른다.
나뉘어진 data를 opencv를 후처리한다.
모델
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
flatten (Flatten) (None, 1120) 0
dense (Dense) (None, 128) 143488
dense_1 (Dense) (None, 128) 16512
dense_2 (Dense) (None, 128) 16512
dense_3 (Dense) (None, 23) 2967
=================================================================
Total params: 179,479
Trainable params: 179,479
Non-trainable params: 0
_________________________________________________________________
후처리된 각 글자별 테스트 셋을 이용해 위 모델을 학습시킨다.
테스트
unlabeled test set에 대해서 test를 진행해보았다.
w | p |
---|---|
cycr | 472h |
---|---|
결론
- 간단한 모델임에도 불구하고 생각보다 높은 정확도를 보여 놀라움.
- 그러나 이미지를 고정크기로 잘라 인식하므로 m과 같이 긴 글자의 경우 n으로 예측하는 빈도가 높음.
참고
Building a Captcha OCR in TF2.0 in Kaggle
20211_AI