딥 러닝을 사용하여 실제 CAPTCHA 이미지를 크랙하는 방법

Python 및 딥 러닝 도구를 사용하여 보안 문자를 물리 치는 단계별 지침

이 기사의 목적은 딥 러닝 세계의 몇 가지 개념을 소개하고 제가 만난 실제 웹 사이트에서 CAPTCHA를 공격하는 계획을 함께 구축하는 것입니다.

이 기사는 다음 구성 요소로 구성됩니다.

  1. 소개, 제가이 아이디어를 어떻게 얻었는지에 대해 조금 이야기합니다.
  2. 시작하는 방법으로 데이터 준비를 포함한 약간의 예비 작업을 수행하여 CAPTCHAS의 특성과 보유한 속성을 보여줍니다.
  3. Image Processing , 일부 Python 도구를 사용하여 추가 해석에 필요한 모든 정보를 단일 CAPTCHA에서 추출하는 방법을 살펴 봅니다.
  4. 데이터 세트 생성 및 준비, 이 섹션에서는 관찰 한 보안 문자와 유사한 샘플을 생성하려고합니다.
  5. 신경망 구축 , 우리는이 데이터를 훈련시키기 위해 심층 신경망을 함께 구축 할 것입니다.
  6. 데모 , 우리가 한 모든 것이 GitHub 링크 및 리소스뿐만 아니라 어떻게 연결되는지 볼 수 있습니다.

여러 번 SMS 광고와 메일 링 배포 목록에서 자신을 제거 할 수있는 웹 사이트 링크, 내 전화 번호를 입력하고 보안 문자 필드를 작성해야하는 구독 취소 페이지를받습니다.

그리고 메일 링리스트 서비스를 제공하는 동일한 웹 사이트를 여러 번 보았습니다. 그리고 CAPTCHA 필드를 사용하는 것이 얼마나 안전하지 않은지 알아 차릴 때마다 머신 러닝과 딥 러닝의 두 과정을 마친 후 컴퓨터가 CAPTCHA 이미지를 깨도록해야한다고 생각했습니다.

브라우저에 표시된 웹 사이트의 스크린 샷

나는 웹 사이트의 URL을 노출하지 않을 것입니다. 그래서 사람들은 그것들에 대해 그것을 사용하지 않고 그들의 CAPTCHA를 악용하지 않을 것입니다.

하지만이 웹 사이트에서 추출한 많은 CAPTCHA 예제에 대한 링크를 게시하여 직접 훈련하고 테스트 할 수 있습니다.

어떻게 시작합니까?

전제 조건

따라서이 기사가 계속해서 읽을 때 취하는 가정은 다음과 같습니다.

  1. Python
    다양한 라이브러리는 Python이 AI에 가장 많이 사용되는 프로그래밍 언어 인 주된 이유 중 하나입니다. 매우 안정적이고 유연하며 개발자에게 다양한 도구를 제공합니다.
  2. OpenCV Pillow
    이 두 라이브러리는 데이터 세트를 만들고 문제를 더 명확한 것으로 나누는 목표를 달성하는 데 필요한 이미지 프로세스를 만드는 데 도움이됩니다.
  3. PyTorch
    이것은 신경망 기반 딥 러닝 모델을 개발하고 훈련하는 데 사용되는 오픈 소스 머신 러닝 라이브러리입니다.

같은 웹 사이트에서 몇 가지 예를 살펴보면 모든 종류의 반복적 인 행동을 발견 할 수 있습니다.

Captcha의 특성을 보여주는 여러 예

그들 중 일부를 언급합시다 :

  • 글꼴 모음은 모든 이미지에서 비슷하지만 일부 숫자는 굵게 표시 될 수 있습니다.
  • 글꼴 크기는 거의 균일하지만 더 크거나 작을 수 있습니다.
  • 숫자는 다른 회전을 가질 수 있습니다.
  • 번호의 위치는 변경 될 수 있습니다.
  • 다양한 패턴과 색상의 배경 소음이 있습니다.

이미지 처리

단일 이미지에서 숫자 추출

단일 캡차 이미지

이 섹션에서는 각 책을 개별적으로 하나의 그림에서 추출하려고합니다.
사실, 우리는 각각 하나의 숫자를 포함하는 하위 이미지를 원하고, 우리가 풀어야 할 새로운 하위 문제는 각 하위 이미지에 어떤 숫자가 나타나는지 알아내는 것입니다.

이를 위해 앞서 언급 한 OpenCV 디렉토리를 사용합니다 .

OpenCV ( 오픈 소스 컴퓨터 비전 )는 주로 실시간 컴퓨터 비전을 목표로 하는 프로그래밍 기능 라이브러리입니다 . 원래 Intel에서 개발했습니다 .

OpenCV는 정의 된 지원 계층 목록에 따라 TensorFlow , Torch , PyTorch (ONNX 모델로 변환 한 후) 및 Caffe 와 같은 딥 러닝 프레임 워크의 일부 모델 을 지원합니다.

이 라이브러리를 사용하면 이미지에서 육즙이 많은 것을 추출하는 데 도움이되는 다양한 도구를 실행할 수 있습니다.

가장 먼저하고 싶은 것은 이미지에서 색상 차원을 제거하는 것입니다. 숫자 이름을 식별하고 싶기 때문에 우리에게는 중요하지 않습니다. 이것은 나중에 배경 노이즈를 처리해야 할 때도 도움이 될 것입니다. 이미지에서.

이를 위해 다음 코드를 사용할 수 있습니다.

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

그러나라는 이미지 처리 도구를 사용할 수 있습니다 findContours(). 이미지 처리에서 우리는 종종 동일한 픽셀 청크를 찾아야
합니다 .- 이 함수 의 문서 에서 :

윤곽선은 동일한 색상 또는 강도를 가진 모든 연속 점 (경계를 따라)을 연결하는 곡선으로 간단히 설명 할 수 있습니다. 윤곽선은 모양 분석과 물체 감지 및 인식에 유용한 도구입니다.

문서에서 이미지를 순수한 흑백 (이 과정을 타작 이라고도 함 ) 으로 바꿔야한다는 것을 찾을 수 있으므로 다음 이미지를 얻을 수 있습니다.

“OpenCV에서 윤곽선을 찾는 것은 검정색 배경에서 흰색 물체를 찾는 것과 같습니다. 따라서 발견 할 물체는 흰색이고 배경은 검정색이어야합니다.”

그러나 이미지에 노이즈 가 있기 때문에 전체 윤곽선 그룹에서 특정 크기의 이미지를 선택합니다. 그렇지 않으면 노이즈도 포함 된 전체 하위 이미지 목록이 표시됩니다.

문제는 어떤 크기 임계 값을 사용해야합니까? 모든 윤곽선의 길이와 너비를 살펴보면 대부분의 윤곽선은 길이 1 개와 너비 1 개, 즉 1 픽셀이됩니다.

그러나 몇 개의 노이즈가 함께 연결된 상황을 만들 수는 있지만 숫자는 이미지에서 매우 우세해야하며 상당히 커야합니다. 많은 CAPTCHA에서 관찰되는 평균 글꼴 크기는 약 25이므로 거의 크기의 1/3을 임계 값으로, 특정 윤곽선이 9x9 너비와 높이를 초과하는 경우에만 숫자로 간주합니다.

이 윤곽선을 사각형으로 만들 수도 있으므로 다음과 같은 결과를 얻을 수 있습니다.

우리가 찾은 이미지의 윤곽

이제 이러한 청크는 나중에 구축 할 신경망에 제공 할 수있는 독립적 인 이미지입니다. 그러나이 신경망은 고정 된 크기의 이미지를 수신하기 때문에 기본적으로 수집 한 모든 하위 이미지에 대해 균일 한 크기를 설정해야합니다.

몇 가지 예를 몇 가지 관찰 한 후 각 하위 이미지의 평균 크기는 15x27이지만 각 방향으로 +3의 신뢰 거리를 가져야합니다. 즉, 모든 이미지를 18x30으로 설정하므로 이미지가 너무 작 으면 너비와 높이가 늘어납니다.

그리고 이미지가 우리가 설정 한 크기보다 더 크더라도 간단히 잘라내어 신경망이 그러한 상황에서 충분히 견고하다는 것을 확인할 수 있습니다.

데이터 세트 생성 및 준비

이제 우리의 문제는 그림이 주어지면 거기에 숫자가 무엇인지 말하고 싶을 것입니다. 이것은 머신 러닝과 딥 러닝 세계에서 흔히 볼 수있는 문제이며 우리가 실행할 수있는 다양한 아키텍처와 데이터 세트가 있습니다.

알려진 것 중 하나는 MNIST 숫자 데이터 세트입니다.

MNIST에는 70,000 개의 손글씨 숫자 이미지가 포함되어 있습니다. 교육용 60,000 개, 테스트 용 10,000 개. 이미지는 회색조, 28x28 픽셀이며 중앙에 위치하여 전처리를 줄이고 더 빨리 시작할 수 있습니다.

그러나 특정 문제 (각도 변경, 노이즈 추가, 크기 조정 등)에 맞게 일부 변환을 사용하여이 데이터 세트를 사용하려고 시도한 후에는 그다지 좋은 결과를 얻지 못했습니다. 이것은 비교적 간단하기 때문입니다. 문제-데이터 세트를 직접 구축하는 것은 나쁘지 않습니다.

나는 Word로 가서 CAPTCHA의 글꼴과 유사한 글꼴을 찾기 시작했고 상대적으로 가까운 두 가지 글꼴을 찾았습니다.

각 글꼴에 대해 2 가지 크기를 사용합니다. 따라서 각 글꼴 (4) 2 배 2 배 모든 숫자 2 배 (10)에 대해 총 80 개의 다른 숫자 이미지를 얻습니다.

지금까지의 데이터 세트

전체 생성기 코드 인 Pillow 라이브러리를 사용하여 쉽게 수행 할 수 있습니다.

PyTorch로 데이터 세트 정의

Custom Data Set 에 대한 PyTorch의 문서에 따르면 :

torch.utils.data.Dataset데이터 세트를 나타내는 추상 클래스입니다. 커스텀 데이터 세트는 Dataset다음 메소드를 상속 하고 재정의 해야 합니다.

  • __len__len(dataset)데이터 세트의 크기 를 반환합니다.
  • __getitem__i 번째 샘플 dataset[i]을 얻는 데 사용할 수있는 인덱싱 지원i

데이터 증대

다음으로 할 일은 Train Set의 크기를 크게 확장하기 위해 Deep Learning 도구를 사용하는 것이므로 처음에는 전체 80 자리 목록의 500 배를 복사합니다. 이런 식으로 우리는 80 x 500 = 40,000 개의 샘플을 갖게 됩니다.

이제 Data Augmentation 부분 이 나옵니다. 다음에 할 일은 우리가 만든 40,000 개의 샘플을 무작위로 활성화하는 것입니다 torchvision.transforms.

회전
우리는 일부 CAPTCHA의 관찰에서 일부 숫자 이미지가 회전하기를 원합니다. 회전 각도는 -30 ~ 30 도인 것처럼 보입니다.

transforms.RandomRotation(degrees=(30, -30), fill=(255,))

transforms.ToTensor()

노이즈가 너무 많은 숫자 7

그러나이 코드는 결과에서 볼 수 있듯이 많은 노이즈를 유발합니다.

따라서 베르누이 분포를 사용하여 노이즈를 무작위로 추출하는보다 정교한 방법을 사용할 것 입니다 torch.distributions.bernoulli.Bernoulli.

원본 이미지 크기의 행렬을 만들고 행렬에 1을 가질 확률이 0.2 (p = 0.2)이고 그렇지 않으면 0입니다.

그러나 CAPTCHA의 원본 이미지에서는 노이즈가 다른 색상에 있었기 때문에 그레이 스케일 차원으로 전환 한 후 다른 색상이 다른 회색 음영을 받았기 때문에 0과 1로만 구성된 행렬로 합산하는 것은 올바르지 않습니다.

그래서 우리는 Bernoulli 분포에서 얻은 행렬에 (0,1) 범위의 난수 행렬을 곱하고 같은 수의 0을 가진 새 행렬을 얻습니다 (확률 0.8 ( q) 우리는 0)의 기회를 얻습니다. 그리고 우리가 이전에 가졌던 것은 (0,1) 범위로 퍼질 것입니다.

참고 : Bernoulli 행렬이 샘플의 모양과 일치하도록 약간의 모양 변경 및 압축 해제가 있습니다.

왼쪽에는 torch.rand 행렬이 있고 오른쪽에는 torch.rand 행렬을 곱한 Bernoulli 행렬이 있습니다.

따라서 최종 결과는 다음과 같습니다.

노이즈가 적은 숫자

이제 우리 torch.utils.data.DataLoader는이 새로운 NumbersDataSet클래스를 제공 할 수 있으며 신경망을 만들고 구축하기 시작했습니다.

신경망 구축 및 훈련

이 기사에서이 주제에 대해 너무 자세하게 설명하지는 않겠지 만이 기사의 끝에 참고 자료를 남길 것입니다.

이 문제는 MNIST 문제와 거의 동일하기 때문에 매우 좋은 결과를 제공하는 동일한 아키텍처를 사용합니다.

딥 컨볼 루션 네트워크 아키텍처

이 네트워크를 구축하기 위해 다시 한 번 PyTorch를 사용할 것입니다.

그리고 5 개의 에포크 후에 수렴과 결과를 볼 수 있습니다.

재미있는 부분!

이제 우리가 함께 만든 모든 것을 첨부하고 어떻게 작동하는지 볼 때입니다.

주석이있는 전체 코드 :

결과는 다음과 같습니다.

혼자서 시도

다음은 내 다른 GitHub 링크에 대한 링크입니다.

[1]. https:///@ageitgey/how-to-break-a-captcha-system-in-15-minutes-with-machine-learning-dbebb035a710 이 전체 기사는 Captcha Solvers에 대한 그의 엄청난 작업 없이는 존재할 수 없습니다.

[2]. https://vision.in.tum.de/_media/spezial/bib/stark-gcpr15.pdf Google의 reCaptcha와 유사한 딥 러닝 프로세스를 수행하는 훌륭한 논문입니다.

[삼]. https://towardsdatascience.com/mnist-handwritten-digits-classification-using-a-convolutional-neural-network-cnn-af5fafbc35e9 Deep Learning 및 Deep Convolution Networks에 대한 추가 설명.

Linkedin 또는 Github 에서도 저를 찾을 수 있습니다 . 작성하고 싶은 의견과 의견을 듣고 싶습니다.

Suggested posts

양자 컴퓨팅 Pt를위한 프로그래밍. 1 : NumPy

이제 양자 컴퓨팅이면의 물리학을 배우기 시작 했으므로 "이봐, 실제로 양자 컴퓨터를 사용하려면 실제로 양자 장치를 손으로 만들어야합니까?"라고 궁금해 할 것입니다. 답은 양자 컴퓨터를 컴퓨터라고 부르는 이유가 있습니다. 프로그래밍이 가능합니다! 이 시리즈에서는 수학 개념을 시뮬레이션하고 양자 컴퓨터에서 실행하는 소프트웨어를 구축하는 방법을 배우게됩니다. 깨끗하고 현대적이며 라이브러리가 풍부한 언어이기 때문에 Python을 사용하여 코드를 작성할 것입니다.

IBM Watson Studio의 AutoAI 노트북으로 마술사 코드 깨기

IBM Watson Studio의 AutoAI 노트북으로 마술사 코드 깨기

가장 유명한 행동 강령 중 하나입니다. "마술사는 절대 비밀을 밝히지 않습니다." 그러나 청중이 너무나 놀라워 서 '방금 일어난 일'이라는 느낌에 놀라서 비밀을 밝히지 않는 것이 거의 잔인한 순간이 있습니다.

Related posts

Spotify의 마법 성분 : 기계 학습

Spotify의 마법 성분 : 기계 학습

면책 조항 :이 기사는 Spotify와 관련이 없으며 Spotify 및 현재 관련이 없을 수있는 과거 구조에 대한 확인되지 않은 정보로 구성 될 수 있습니다. 음악은 표현의 한 형태, 예술의 형태, 전체적인 문화 활동입니다.

2021 년 2 월에 읽을 4 가지 딥 러닝 논문

2021 년 2 월에 읽을 4 가지 딥 러닝 논문

신경 과학에서 자동 분화, 신경망 이론 및 신경 과정의 과소 적합에 이르기까지 현재 추구되고있는 다양한 딥 러닝 연구 흐름에 대한 더 나은 개요를 얻고 싶으십니까? 합리적으로 통과하기에는 열려있는 arXiv 탭이 너무 많습니까? 전체 동영상을 볼 시간이 너무 적습니까? 논문의 핵심 아이디어와 개념에 대한 간략한 요약 만 있다면. 그런 다음 '머신-러닝-콜라주'시리즈를 소개하게되어 기쁩니다.

내부의 관심 네트워크 그래프

수학에서 NumPy까지 단계별 가이드

내부의 관심 네트워크 그래프

그래프 신경망 (GNN)은 그래프 데이터에서 학습 할 수있는 표준 도구 상자로 등장했습니다. GNN은 콘텐츠 추천 또는 신약 발견과 같은 다양한 분야에서 영향이 큰 문제를 개선 할 수 있습니다.

분할에 대한 고정 2 부 : Python으로 이미지 분할을 수행하는 방법

분할에 대한 고정 2 부 : Python으로 이미지 분할을 수행하는 방법

안녕하세요! 이미지 분할에 대한이 짧은 시리즈의 첫 번째 부분을 읽지 않았다면 여기에서 읽으십시오. 이전 이야기에서 임계 값 및 색상 분할에 대해 논의 했으므로 2 부에서는 색도 분할과 이미지 차이에 중점을 둘 것입니다.