티스토리 뷰

반응형

🚀 OpenCV를 활용한 이미지 기반 자동화 및 CAPTCHA 우회 방법

웹 크롤링과 자동화에서 이미지 기반 CAPTCHA는 일반적인 문자 크롤링보다 해결이 어려운 문제입니다.
하지만 **OpenCV와 딥러닝(OCR, AI)**을 활용하면 CAPTCHA를 효과적으로 인식하고 우회할 수 있습니다.


1. OpenCV와 OCR을 활용한 CAPTCHA 분석 개요

🔹 CAPTCHA 자동 입력 과정

1️⃣ Selenium을 활용하여 CAPTCHA 이미지 다운로드
2️⃣ OpenCV로 이미지 전처리 (흑백 변환, 노이즈 제거, 경계 검출)
3️⃣ Tesseract-OCR로 문자 인식
4️⃣ Selenium을 통해 자동 입력 및 제출

📌 사용 기술
✅ Selenium → 웹페이지에서 CAPTCHA 이미지 다운로드
✅ OpenCV → 이미지 전처리 (이진화, 필터링, 경계 검출)
✅ Tesseract-OCR → 문자 인식
✅ AI (딥러닝) → 복잡한 CAPTCHA 인식률 개선


2. 프로젝트 1: OpenCV를 활용한 기본 CAPTCHA 문자 인식

🔹 필요 라이브러리 설치

pip install opencv-python pillow pytesseract selenium numpy

🔹 Tesseract-OCR 설치


🔹 STEP 1: CAPTCHA 이미지 다운로드

먼저, Selenium을 이용해 웹사이트의 CAPTCHA 이미지를 다운로드합니다.

import time
from selenium import webdriver
from selenium.webdriver.common.by import By

# 1️⃣ Chrome WebDriver 실행
driver = webdriver.Chrome()
driver.get("https://example.com/captcha")  # CAPTCHA가 있는 사이트

time.sleep(2)  # 페이지 로딩 대기

# 2️⃣ CAPTCHA 이미지 다운로드
captcha_element = driver.find_element(By.ID, "captcha-img")  # CAPTCHA 이미지 선택
captcha_element.screenshot("captcha.png")  # 캡차 이미지 저장

print("CAPTCHA 이미지 다운로드 완료!")
driver.quit()

🔹 STEP 2: OpenCV를 활용한 CAPTCHA 이미지 전처리

이미지를 흑백 변환, 노이즈 제거, 경계 검출을 수행하여 OCR 인식률을 향상시킵니다.

import cv2
import numpy as np
from PIL import Image
import pytesseract

# 1️⃣ 이미지 로드
image = cv2.imread("captcha.png", cv2.IMREAD_GRAYSCALE)  # 흑백 변환

# 2️⃣ 노이즈 제거 (GaussianBlur 적용)
image = cv2.GaussianBlur(image, (5, 5), 0)

# 3️⃣ 이진화 (Thresholding)
_, image = cv2.threshold(image, 128, 255, cv2.THRESH_BINARY_INV)

# 4️⃣ OCR을 이용한 문자 인식
pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
captcha_text = pytesseract.image_to_string(image, config='--psm 6')

print("인식된 CAPTCHA:", captcha_text.strip())

# 5️⃣ 결과 이미지 저장
cv2.imwrite("processed_captcha.png", image)

🔹 STEP 3: Selenium으로 자동 입력 및 제출

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://example.com/captcha")

# CAPTCHA 입력 필드 찾기
captcha_input = driver.find_element(By.ID, "captcha-input")
captcha_input.send_keys(captcha_text.strip())  # OCR 인식 결과 입력

# 제출 버튼 클릭
submit_button = driver.find_element(By.ID, "submit-btn")
submit_button.click()

print("CAPTCHA 자동 입력 완료!")
driver.quit()

3. 프로젝트 2: OpenCV + 딥러닝을 활용한 복잡한 CAPTCHA 분석

Tesseract-OCR은 간단한 문자 기반 CAPTCHA는 해결할 수 있지만, 복잡한 왜곡된 문자, 기울어진 문자, 복합색상의 CAPTCHA는 해결이 어렵습니다.
이 경우, 딥러닝을 활용하여 CAPTCHA 인식률을 향상시킬 수 있습니다.


🔹 STEP 1: 딥러닝을 활용한 CAPTCHA 인식 모델

💡 **CNN (Convolutional Neural Network)**을 활용하여 문자 이미지를 분석하는 딥러닝 모델을 학습할 수 있습니다.

import tensorflow as tf
from tensorflow import keras
from keras.preprocessing.image import ImageDataGenerator
import numpy as np
import cv2

# 1️⃣ CAPTCHA 이미지 데이터셋 로드 (MNIST 예제)
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()

# 2️⃣ 데이터 정규화
x_train = x_train / 255.0
x_test = x_test / 255.0

# 3️⃣ CNN 모델 생성
model = keras.Sequential([
    keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(28,28,1)),
    keras.layers.MaxPooling2D((2,2)),
    keras.layers.Flatten(),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
])

# 4️⃣ 모델 컴파일 및 학습
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(x_train, y_train, epochs=5, validation_data=(x_test, y_test))

# 5️⃣ 모델 저장
model.save("captcha_model.h5")
print("딥러닝 모델 학습 완료 및 저장!")

🟢 Tip:

  • 위 코드는 CAPTCHA 숫자 이미지를 분석하기 위해 MNIST 데이터셋을 학습한 CNN 모델 예제입니다.
  • 실제 CAPTCHA 데이터셋을 구축하여 모델을 학습시키면 인식률을 더욱 향상시킬 수 있습니다.

🔹 STEP 2: CAPTCHA 자동 예측

import cv2
import numpy as np
from tensorflow import keras

# 1️⃣ 딥러닝 모델 불러오기
model = keras.models.load_model("captcha_model.h5")

# 2️⃣ 새로운 CAPTCHA 이미지 로드 및 전처리
image = cv2.imread("captcha.png", cv2.IMREAD_GRAYSCALE)
image = cv2.resize(image, (28, 28))
image = image / 255.0
image = np.expand_dims(image, axis=0)

# 3️⃣ 모델을 활용한 예측
prediction = np.argmax(model.predict(image))

print("예측된 CAPTCHA:", prediction)

🟢 Tip:

  • 모델을 학습할 때 다양한 형태의 CAPTCHA 데이터셋을 사용하면 정확도를 높일 수 있음
  • 데이터셋을 직접 구축할 수도 있고, Kaggle의 CAPTCHA 데이터셋을 활용할 수도 있음

4. 정리 및 결론

해결 방법 적용 기술

단순 문자 CAPTCHA Tesseract-OCR로 문자 인식
복잡한 CAPTCHA (노이즈 있음) OpenCV로 전처리 후 OCR 적용
왜곡된 CAPTCHA OpenCV + 딥러닝(CNN) 활용
Google reCAPTCHA 2Captcha API 활용

🔹 OpenCV와 딥러닝을 결합하면 복잡한 CAPTCHA도 높은 정확도로 자동 입력 가능
🔹 Tesseract-OCR만으로 해결이 어려운 경우, 딥러닝 모델을 직접 학습하여 적용 가능


 

반응형