CAPTCHA(Completely Automated Public Turing test to tell Computers and Humans Apart / CAPTured CHAracter)
는 사용자가 컴퓨터인지 사람인지 판별하기 위한 튜링테스트이다.
CAPTCHA는 기계는 인식할 수 없으나 사람은 쉽게 인식할 수 있는 텍스트 혹은 이미지를 통해 사람과 기계를 구별하는 프로그램으로, 텍스트 및 이미지를 왜곡시켜 기계 혹은 사람은 판별할 수 있으나 인공지능은 판별할 수 없도록 프로그램을 만든다.
캡챠를 우회하는 방법에는 OCR을 통한 텍스트 인식, 캡차의 음성을 문자로 변환시켜주는 Speech-to-Text API 를 활용하는 방법이 있을 수 있다.
기계를 판별하기 위한 튜링테스트이지만 인공지능 기술이 발달함에 따라 캡챠로 봇과 사람을 구별하기 또한 어려워지고 있다고 한다.
일례로 구글의 리캡챠를 메릴랜드 대학의 연구원이 구글의 스피치 투 텍스트 API를 이용하여 85%의 정확도로 뚫었다고 한다. 캡챠 같은 보안 기술도 나날이 발전하겠지만 인공지능 기술도 함께 급속도로 발전하고 있어 추후에는 캡챠로 인간과 봇을 구분하기가 더 어려워질 수 있을 것 같다.
내가 우회가 필요했던 캡챠는 전자 상거래 플랫폼 일종인 qoo10에서 사용중인 캡챠였다.
큐익스프레스 캡챠
기본적으로 인식율이 좋은 Naver의 Clova-OCR , Google의 Tesseract를 이용하여 텍스트 인식을 진행했을 때 거의 인식하지 못하였다.
<캡챠이미지 예시>
해당 캡챠 데이터에 대해 따로 모델을 구현하고 학습을 시킨다면 좋았겠지만, 자동화 및 운영이 우선인 현재 RPA 팀 상황에서 해당 사이트만을 로그인하기 위해 따로 ML 모델을 구현하고 운영하는 것은 무리가 있었다.
이미지 전처리는 나동빈 님의 유튜브를 참고하여 작성하였다.
utils.py 일부
import cv2
import numpy as np
#openCV 에서는 BGR 순으로 채널 지정
BLUE = 0
GREEN = 1
RED = 2
# 특정한 색상의 모든 단어가 포함된 이미지를 추출합니다.
def get_chars(image, color):
other_1 = (color + 1) % 3
other_2 = (color + 2) % 3
c = image[:, :, other_1] == 255
image[c] = [0, 0, 0]
c = image[:, :, other_2] == 255
image[c] = [0, 0, 0]
c = image[:, :, color] < 170
image[c] = [0, 0, 0]
c = image[:, :, color] != 0
image[c] = [255, 255, 255]
return image
def leave_red(image, color):
other_1 = (color + 1) % 3 #BLUE
other_2 = (color + 2) % 3 #GREEN
c = image[:, :, other_1] > 175 #BLUE
image[c] = [0, 0, 0] #black
c = image[:, :, other_2] > 175 #GREEN
image[c] = [0, 0, 0]
#c = image[:, :, color] < 170
#image[c] = [0, 0, 0]
c = image[:, :, color] != 0
image[c] = [255, 255, 255] #white
return image
preprocessing_red.py
import cv2
import utils
import os
os.chdir('C:\\BrityDefault\\qoo10_captcha_data\\png\\red_img') #red_img 경로 지정
cur_path = os.getcwd()
for i in range(1,16):
image = cv2.imread(str(i) + '.png', cv2.IMREAD_COLOR)
#cv2.imshow('Origin Image', image)
#cv2.waitKey(0)
#cv2.destroyAllWindows()
red = utils.leave_red(image.copy(),utils.RED)
#cv2.imshow('Image Gray', red)
#cv2.waitKey(0)
#cv2.destroyAllWindows()
converted_path = 'C:\\BrityDefault\\qoo10_captcha_data\\png\\red_img\\converted'
#배경이미지
background = cv2.imread(converted_path + '\\background.png')
#이미지 합치기
h, w, c = red.shape
background[50:50 + h, 150:150+w] = red #red 이미지를 background에 넣기
cv2.imshow('img' , background)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite(converted_path + '\\' + str(i) + '_converted.png', background)
print(str(i) + '_converted.png is successfully saved !')
아래 경로의 깃허브 저장소에 테스트 코드 및 데이터가 있으니 추후에 필요하면 함께 확인하자.
captcha solve 레포지토리
[참고]