diff --git a/README.md b/README.md index 5015326..b91a3d5 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,53 @@ -# CAPTCHA(자동 입력 방지 문자) 인식 +# Captcha Image Recognition +Python Jupyter Keras +OpenCV +NumPy +scikit-learn -> Description + +## Description * 자동 입력 방지 문자(CAPTCHA) 이미지를 인식할 수 있는 딥러닝 모델 제작 * 개발 인원 : 1명 -* 프로젝트 기간 : +* 프로젝트 기간 : 2021.08 +* 개발 당시 Google Colaboratory하였으나 현재 Jupyter Notebook으로 구동 가능하도록 수정 + +## IDE & Language + +- ~~Google Colaboratory~~ Jupyter Notebook +- python 3.7.7 -> 프로젝트 순서 + +## Library + +``` +matplotlib 3.5.2 +numpy 1.22.4 +opencv-python 4.5.5.64 +sklearn 0.0 +tensorflow 2.9.1 +``` + +## Project Process 1. 데이터 수집 2. 데이터 라벨링 3. 데이터 가공 -4. 모델 정의 -5. 학습 -6. 테스트 -7. 결론 - -> 사용 언어 및 라이브러리 +4. 모델 +5. 테스트 +6. 결론 + +## Project Detail +
-- python 3.7.7 -- selenium -- python-opencv -- tkinter -- - -## 1. 데이터 수집 +>데이터 수집 ![labeled 2021-08-11 오후 1_29_57](https://user-images.githubusercontent.com/74360958/128970367-8d9f1db1-a13b-4a3d-a572-da619e688df5.png) -selenium 라이브러리를 통해서 수강신청 홈페이지에 17분마다 자동 로그인 후 -0.1초마다 새로고침하여 캡챠 이미지를 다운로드하는 이미지 다운봇 제작 +selenium 라이브러리를 통해서 0.1초마다 새로고침하여 captcha 이미지를 다운로드하는 이미지 다운봇 제작 +
-## 2. 데이터 라벨링 +>데이터 라벨링 ![캡처](https://user-images.githubusercontent.com/74360958/128970424-7b6c2f69-1ede-4fbd-8480-30d99c0c0cbe.PNG) @@ -40,9 +56,10 @@ selenium 라이브러리를 통해서 수강신청 홈페이지에 17분마다 해당 사진의 파일 이름을 입력한 보안코드로 바꿔주는 프로그램 작성 후 사용 [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개의 라벨링 된 데이터를 얻을 수 있었다. +총 6150개의 라벨링 된 데이터를 얻을 수 있었다. +
-## 3. 데이터 가공 +>데이테 가공 ![frame2](https://user-images.githubusercontent.com/74360958/148836497-6961a5c0-bff8-40fa-9d35-a8e95aaa8b1f.png) @@ -50,88 +67,73 @@ selenium 라이브러리를 통해서 수강신청 홈페이지에 17분마다 - frame_size: 28px x 40px - start_padding : 5px -- between_padding : 8px +- overlapped : 8px 그 후 opencv를 이용하여 grayscale로 로드 후 각 이미지를 frame에 맞게 자른다. - -![2_0](https://user-images.githubusercontent.com/74360958/148837068-4d96407a-6e93-4037-8e29-15bbc0c8ee64.png) -![5_29](https://user-images.githubusercontent.com/74360958/148837098-b7dbf392-223d-4003-ab3a-b8eeeefd0159.png) -![k_134](https://user-images.githubusercontent.com/74360958/148837125-a40fb673-e427-47bc-b383-b6bf705a18c2.png) +
화면 캡처 2022-01-11 060119 나뉘어진 data를 구글 드라이브에 업로드 후 colab에서 불러와 opencv의 adaptiveThreshold 함수를 이용해 후처리한다. -![p_6153](https://user-images.githubusercontent.com/74360958/148838045-fc1fcfa3-6e59-46e9-a5d3-40b9e9178437.png) -후처리 전 +
-![148837559-dd89375b-f4fa-4bde-b676-a69c0339ff21](https://user-images.githubusercontent.com/74360958/148838379-854941d3-3378-4c95-aee4-8a10eab51b6e.png) -후처리 후 +>모델 -## 4. 모델 정의 - -```python -import tensorflow as tf - -# act = "linear" -# act = "sigmoid" -# act = "tanh" -act = "relu" - -# 3개의 층 128개의 노드 -model1 = tf.keras.models.Sequential([ - # 28x28 입력층 - tf.keras.layers.Flatten(input_shape=(40, 28)), - tf.keras.layers.Dense(128, activation=act), - tf.keras.layers.Dense(128, activation=act), - tf.keras.layers.Dense(128, activation=act), - tf.keras.layers.Dense(23, activation="softmax") -]) - -opt = tf.keras.optimizers.Adam(learning_rate=0.005) -# opt = tf.keras.optimizers.RMSprop(learning_rate=0.01, momentum=0.1) - -model1.compile(loss='categorical_crossentropy', optimizer = opt, metrics=['accuracy']) ``` - -## 5. 학습 - -```python -model1.fit(d_train, l_train_1hot, epochs = 50) +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 +_________________________________________________________________ ``` +
-## 6. 테스트 + +>테스트 이후 unlabeled test set에 대해서 test를 진행해보았다. #### - 글자 1개에 대한 테스트 -image - -b를 정상적으로 b로 출력하고 있다.(왼쪽 하단) - +|w|p| +|---|---| +|![image](https://user-images.githubusercontent.com/74360958/172026579-c4ad99c3-ead3-46aa-8bba-a54919e16d97.png)|![image](https://user-images.githubusercontent.com/74360958/172026906-4efa65d3-6a75-4539-bd4c-0ba56dfc3fae.png)| +|![image](https://user-images.githubusercontent.com/74360958/172026894-4c581ff9-0f46-4b5e-a61b-dee78e8e18d7.png)|![image](https://user-images.githubusercontent.com/74360958/172026909-cbf8388c-1933-410d-bc43-82a6d4a9003d.png)| +
#### - 전체 글자에 대한 테스트 -![download](https://user-images.githubusercontent.com/74360958/148839662-c5e14c7b-813f-4ec1-9261-0addcd8cd18e.png) - -ma5c라 적힌 이미지를 gray scale로 불러온 모습 - -![download](https://user-images.githubusercontent.com/74360958/148839707-855ed582-a941-4a99-b642-cf3dd716dae0.png) - -opencv의 adaptiveThreshold 함수를 이용해 후처리 한 모습 +|cycr|472h| +|---|---| +|![cycr](https://user-images.githubusercontent.com/74360958/172026954-3e8711fd-cbc7-432e-a373-46cb9d64b0d5.png)|![427h](https://user-images.githubusercontent.com/74360958/172027071-3e73390b-0d14-417d-997e-2884d54094a0.png)| +|![image](https://user-images.githubusercontent.com/74360958/172026722-2d2fee1d-db8f-4224-9344-3a10b94b26fa.png)|![image](https://user-images.githubusercontent.com/74360958/172027076-a796bf3f-d99e-4c59-abb8-4cb092c63714.png)| +|![image](https://user-images.githubusercontent.com/74360958/172026734-2c58474d-5a7d-44cb-8b87-145212987992.png)|![image](https://user-images.githubusercontent.com/74360958/172027092-97f0cbc2-087d-4c67-b364-0a8e56fc88c9.png)| -image +
-결과값으로 ma5c로 예측하는 모습이 보인다.(왼쪽 하단) +> 결론 +못 쓸 정도는 아니지만 고정 크기로 자르다보니 m과 n와 같이 가로로 긴 글자 중 잘릴 경우 정확도가 떨어지는 부분이 아쉬움. -## 7. 결론 +
-unlabelded data에 대해서 돌려본 정확도는 대략 70~80% 정도로 나왔다. -고정된 프레임으로 자르다보니 m과 n와 같이 가로로 긴 글자 중 잘릴 경우 비슷하게 나오는 글자에서 틀리는 경우가 많았다. > 참고