CaptchaCracker 보안문자 인식 모델 만들기

CaptchaCracker는 Captcha Image 인식을 위한 딥 러닝 모델 생성 기능과 적용 기능을 제공하는 오픈소스 파이썬 라이브러리입니다. 아래와 같은 Captcha Image의 숫자를 인식해 숫자 문자열을 출력하는 딥 러닝 모델을 만들거나 모델을 직접 사용해볼 수 있습니다.

GitHub Repository - CaptchaCracker


입력 이미지

https://github.com/WooilJeong/CaptchaCracker/raw/main/assets/example01.png

출력 문자열

023062


설치

pip install CaptchaCracker


의존성

pip install numpy==1.19.5 tensorflow==2.5.0


예제

모델 학습 및 저장하기

모델 학습 실행에 앞서 아래와 같이 파일명에 Captcha 이미지의 실제값이 표기된 학습 데이터 이미지 파일들이 준비되어 있어야 합니다.

https://github.com/WooilJeong/CaptchaCracker/raw/main/assets/example02.png

다음과 같이 파이썬 내장 모듈인 glob과 위에서 설치한 CaptchaCracker 라이브러리를 불러옵니다.

import glob
import CaptchaCracker as cc


샘플 데이터 다운로드 링크를 통해 다운받은 이미지 파일 경로를 다음과 같이 지정하여 학습 이미지 파일 경로 리스트를 만들어줍니다.

# 학습 이미지 데이터 경로
train_img_path_list = glob.glob("../data/train_numbers_only/*.png")


Captcha 이미지의 너비와 높이를 지정해줍니다.

# 학습 이미지 데이터 크기
img_width = 200
img_height = 50


CreateModel 메서드의 인자로 학습 이미지 리스트, 이미지 너비 그리고 이미지 높이를 입력하여 CM이라는 모델 생성 인스턴스를 만들어줍니다.

# 모델 생성 인스턴스
CM = cc.CreateModel(train_img_path_list, img_width, img_height)


CMtrain_model메서드의 인자로 epochs를 설정하여 모델 학습을 진행합니다.

# 모델 학습
model = CM.train_model(epochs=100)


모델 학습이 끝나면 modelsave_weights 메서드의 인자로 가중치를 저장할 파일의 경로를 입력합니다.

# 모델이 학습한 가중치 파일로 저장
model.save_weights("../model/weights.h5")


저장된 모델 불러와서 예측하기

모델 적용의 경우도 학습 시와 마찬가지로 CaptchaCracker 라이브러리를 불러옵니다.

import CaptchaCracker as cc


학습한 이미지 스펙과 동일한 타겟 이미지를 준비하고, 이미지 너비와 높이를 다음과 같이 지정합니다.

# 타겟 이미지 크기
img_width = 200
img_height = 50


Captcha 이미지의 라벨의 자릿수와 라벨 각 자리가 가질 수 있는 숫자의 종류를 다음과 같이 지정해줍니다. (*학습 하지 않는 라벨 구성요소는 예측할 수 없습니다. 예를 들어, 학습 이미지들의 라벨에 숫자 )

# 타겟 이미지 라벨 길이
max_length = 6
# 타겟 이미지 라벨 구성요소
characters = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}


가중치 파일 경로를 지정합니다.

# 모델 가중치 파일 경로
weights_path = "../model/weights.h5"


ApplyModel 메서드의 인자로 가중치 파일 경로, 이미지 너비, 이미지 높이, 라벨 길이 그리고 라벨 구성요소를 입력하여 AM 인스턴스를 만들어줍니다.

# 모델 적용 인스턴스
AM = cc.ApplyModel(weights_path, img_width, img_height, max_length, characters)


예측 작업을 수행하기 위해 타겟 이미지의 경로를 입력합니다. AMpredict 메서드를 호출하여 타겟 이미지의 라벨값을 예측합니다.

# 타겟 이미지 경로
target_img_path = "../data/target.png"

# 예측값
pred = AM.predict(target_img_path)


참고

댓글남기기