Skip to content

Instantly share code, notes, and snippets.

@anupam-io
Last active April 11, 2021 23:12
Show Gist options
  • Save anupam-io/51b0693b8015ecdc139f1c2b3ceb82ea to your computer and use it in GitHub Desktop.
Save anupam-io/51b0693b8015ecdc139f1c2b3ceb82ea to your computer and use it in GitHub Desktop.
Solving-captchas-with-tensorflow-on-chars74K.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "Captcha-using-tensorflow-on-chars74K.ipynb",
"provenance": [],
"collapsed_sections": [],
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/akcgjc007/51b0693b8015ecdc139f1c2b3ceb82ea/copy-of-tensorflow-on-chars74k.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "code",
"metadata": {
"id": "eBaKsoPeoykt"
},
"source": [
"# Developer docs\n",
"# https://www.tensorflow.org/tutorials/keras/classification\n",
"# https://www.tensorflow.org/api_docs/python/tf/keras/Model\n",
"\n",
"# Importing modules\n",
"from os import listdir, system\n",
"import pandas as pd\n",
"import numpy as np\n",
"import sys\n",
"import time\n",
"\n",
"import cv2 as cv2\n",
"import imutils\n",
"import imageio\n",
"import pickle\n",
"\n",
"from matplotlib.pyplot import imshow\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib.patches as patches\n",
"\n",
"import tensorflow as tf\n",
"from skimage.io import imread\n",
"#from skimage.filters import threshold_otsu\n",
"from skimage import measure\n",
"from skimage.measure import regionprops\n",
"from skimage.transform import resize\n",
"from scipy import ndimage\n",
"\n",
"# Downloading dataset from: http://www.ee.surrey.ac.uk/CVSSP/demos/chars74k/\n",
"# You can comment this after running once.\n",
"# !wget http://www.ee.surrey.ac.uk/CVSSP/demos/chars74k/EnglishImg.tgz\n",
"# !tar -xvzf ./EnglishImg.tgz\n",
"# !git clone https://github.com/captcha-breakers/ubiquitous-pancake.git"
],
"execution_count": 2,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "9IIDQCtPpAxe",
"outputId": "b4e51a26-7c79-43d9-f497-7c018c14171b"
},
"source": [
"# Setting up folders\n",
"base_dir = \"./English/Img/GoodImg/Bmp/\"\n",
"folders = listdir(base_dir)\n",
"folders.sort()\n",
"folders = folders[10:36]\n",
"print(folders)\n",
"\n",
"# Setting image_size\n",
"image_size = (20, 20)"
],
"execution_count": 3,
"outputs": [
{
"output_type": "stream",
"text": [
"['Sample011', 'Sample012', 'Sample013', 'Sample014', 'Sample015', 'Sample016', 'Sample017', 'Sample018', 'Sample019', 'Sample020', 'Sample021', 'Sample022', 'Sample023', 'Sample024', 'Sample025', 'Sample026', 'Sample027', 'Sample028', 'Sample029', 'Sample030', 'Sample031', 'Sample032', 'Sample033', 'Sample034', 'Sample035', 'Sample036']\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "dnjsqbFbpFOQ",
"outputId": "2b963fb0-ddc0-40e4-d458-e612624080eb"
},
"source": [
"# Collecting images from folders\n",
"data = []\n",
"total_images = 0\n",
"for i in folders:\n",
" all_images = listdir(base_dir+i)[:100]\n",
" total_images+=len(all_images)\n",
" currentlabel = int(i[6:])-11\n",
"\n",
" for name in all_images:\n",
" image = cv2.imread(base_dir+i+\"/\"+name)\n",
" image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)\n",
" image = cv2.resize(image, image_size)\n",
"\n",
" # Filtering\n",
" image = cv2.GaussianBlur(image,(5,5),0)\n",
" image = cv2.Laplacian(image,cv2.CV_64F)\n",
" image = cv2.GaussianBlur(image,(5,5),0)\n",
" kernel = np.ones((3, 3), np.uint8)\n",
" image = cv2.filter2D(image,-1,kernel)\n",
" # image = cv2.medianBlur(image,5)\n",
" # image = cv2.dilate(image,kernel,iterations = 1)\n",
" # image = cv2.erode(image,kernel,iterations = 1)\n",
" # image = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)\n",
" # image = cv2.filter2D(image,-1,kernel)\n",
" # image = cv2.blur(image,(5,5))\n",
"\n",
" data.append((image/255, currentlabel))\n",
"print(\"Total images: \", total_images)"
],
"execution_count": 4,
"outputs": [
{
"output_type": "stream",
"text": [
"Total images: 2328\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 282
},
"id": "UpjV_ma4613F",
"outputId": "911b37cb-eabc-4ec4-b895-2e4470aea1a7"
},
"source": [
"# Visualizing images\n",
"imshow(data[6][0])"
],
"execution_count": 5,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x7f6215049b10>"
]
},
"metadata": {
"tags": []
},
"execution_count": 5
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "kBEvr3VRpKLz"
},
"source": [
"# Shuffling data & making train/test\n",
"np.random.shuffle(data)\n",
"n = len(data)\n",
"p = int(80*n/100)\n",
"\n",
"train_images = []\n",
"train_labels = []\n",
"test_images = []\n",
"test_labels = []\n",
"for i in range(n):\n",
" if i<p:\n",
" train_images.append(data[i][0])\n",
" train_labels.append(data[i][1])\n",
" else:\n",
" test_images.append(data[i][0])\n",
" test_labels.append(data[i][1])"
],
"execution_count": 6,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "3Yws9xKLpNHf",
"outputId": "b2846e52-671f-4af1-c81a-2403996f574d"
},
"source": [
"# Making the model and training it\n",
"model = tf.keras.Sequential([\n",
" tf.keras.layers.Flatten(input_shape=image_size),\n",
" tf.keras.layers.Dense(200, activation='relu'),\n",
" tf.keras.layers.Dense(200, activation='relu'),\n",
" tf.keras.layers.Dense(200, activation='relu'),\n",
" tf.keras.layers.Dense(26)\n",
"])\n",
"model.compile(\n",
" optimizer='adam',\n",
" loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n",
" metrics=['accuracy']\n",
")\n",
"model.fit(np.array(train_images), np.array(train_labels), epochs=20)"
],
"execution_count": 7,
"outputs": [
{
"output_type": "stream",
"text": [
"Epoch 1/20\n",
"59/59 [==============================] - 1s 3ms/step - loss: 3.1256 - accuracy: 0.1235\n",
"Epoch 2/20\n",
"59/59 [==============================] - 0s 3ms/step - loss: 2.0002 - accuracy: 0.4795\n",
"Epoch 3/20\n",
"59/59 [==============================] - 0s 3ms/step - loss: 1.2406 - accuracy: 0.6494\n",
"Epoch 4/20\n",
"59/59 [==============================] - 0s 3ms/step - loss: 0.8385 - accuracy: 0.7750\n",
"Epoch 5/20\n",
"59/59 [==============================] - 0s 3ms/step - loss: 0.6229 - accuracy: 0.8259\n",
"Epoch 6/20\n",
"59/59 [==============================] - 0s 3ms/step - loss: 0.4215 - accuracy: 0.8935\n",
"Epoch 7/20\n",
"59/59 [==============================] - 0s 3ms/step - loss: 0.3036 - accuracy: 0.9361\n",
"Epoch 8/20\n",
"59/59 [==============================] - 0s 3ms/step - loss: 0.2272 - accuracy: 0.9525\n",
"Epoch 9/20\n",
"59/59 [==============================] - 0s 3ms/step - loss: 0.1925 - accuracy: 0.9536\n",
"Epoch 10/20\n",
"59/59 [==============================] - 0s 3ms/step - loss: 0.1262 - accuracy: 0.9800\n",
"Epoch 11/20\n",
"59/59 [==============================] - 0s 3ms/step - loss: 0.1386 - accuracy: 0.9705\n",
"Epoch 12/20\n",
"59/59 [==============================] - 0s 3ms/step - loss: 0.0885 - accuracy: 0.9887\n",
"Epoch 13/20\n",
"59/59 [==============================] - 0s 3ms/step - loss: 0.0778 - accuracy: 0.9855\n",
"Epoch 14/20\n",
"59/59 [==============================] - 0s 3ms/step - loss: 0.0480 - accuracy: 0.9951\n",
"Epoch 15/20\n",
"59/59 [==============================] - 0s 3ms/step - loss: 0.0407 - accuracy: 0.9968\n",
"Epoch 16/20\n",
"59/59 [==============================] - 0s 3ms/step - loss: 0.0486 - accuracy: 0.9920\n",
"Epoch 17/20\n",
"59/59 [==============================] - 0s 3ms/step - loss: 0.0544 - accuracy: 0.9946\n",
"Epoch 18/20\n",
"59/59 [==============================] - 0s 3ms/step - loss: 0.0235 - accuracy: 0.9982\n",
"Epoch 19/20\n",
"59/59 [==============================] - 0s 3ms/step - loss: 0.0159 - accuracy: 0.9980\n",
"Epoch 20/20\n",
"59/59 [==============================] - 0s 3ms/step - loss: 0.0122 - accuracy: 0.9987\n"
],
"name": "stdout"
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<tensorflow.python.keras.callbacks.History at 0x7f6210b20910>"
]
},
"metadata": {
"tags": []
},
"execution_count": 7
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "db79yJnOzy7g",
"outputId": "598492f9-a611-4338-d5e8-33599d0e108b"
},
"source": [
"system(\"mkdir -p models\")\n",
"# model.save('./models/my_model_84.h5')\n",
"\n",
"# Predicting on test images\n",
"probability_model = tf.keras.Sequential([model, tf.keras.layers.Softmax()])\n",
"predictions = probability_model.predict(np.array(test_images))\n",
"\n",
"p=0\n",
"for i in range(len(test_images)):\n",
" if np.argmax(predictions[i]) == test_labels[i]:\n",
" p+=1\n",
"\n",
"print(\"Test accuracy: \", 100*p/len(test_images))"
],
"execution_count": 8,
"outputs": [
{
"output_type": "stream",
"text": [
"Test accuracy: 75.53648068669528\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "DcEypgpaawjr",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "457c04b4-7a61-4861-cd01-1f62691c302f"
},
"source": [
"fil_dir = \"./ubiquitous-pancake/captchas/\"\n",
"ct = 0\n",
"p = 0\n",
"n = 0\n",
"for fil in listdir(fil_dir)[:100]:\n",
" image = cv2.imread(fil_dir + fil)\n",
"\n",
" gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) \n",
" _, thresh = cv2.threshold(gray, 120, 255, cv2.THRESH_BINARY)\n",
"\n",
" cnts, new = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)\n",
" cnts=sorted(cnts, key = cv2.contourArea, reverse = True)[:30] \n",
" new_image = cv2.drawContours(image,cnts,-1,(0,255,0),1)\n",
"\n",
" mea_image = []\n",
" mea_image.append(thresh[:, :])\n",
" captcha = np.invert(mea_image[0])\n",
" labelled_captcha = measure.label(captcha)\n",
"\n",
" character_dimensions = (0.20*captcha.shape[0], 0.8*captcha.shape[0], 0.03*captcha.shape[1], 0.25*captcha.shape[1])\n",
" min_height, max_height, min_width, max_width = character_dimensions\n",
"\n",
" characters = []\n",
" charactersx = []\n",
" counter=0\n",
" column_list = []\n",
" row_list = []\n",
" i = 0\n",
" for regions in regionprops(labelled_captcha):\n",
" y0, x0, y1, x1 = regions.bbox\n",
" region_height = y1 - y0\n",
" region_width = x1 - x0\n",
"\n",
" if region_height > min_height and region_height < max_height and region_width > min_width and region_width < max_width:\n",
" roi = captcha[y0:y1, x0:x1]\n",
" resized_char = cv2.copyMakeBorder(roi, 5, 5, 5, 5, cv2.BORDER_CONSTANT)\n",
" resized_char = resize(roi, (20, 20))\n",
" column_list.append(x0)\n",
" characters.append(resized_char)\n",
" counter = 0\n",
"\n",
" classification_result = []\n",
" for each_character in characters:\n",
" x_p,y_p = 2,2\n",
" each_character = cv2.copyMakeBorder(each_character, x_p, x_p, y_p, y_p, cv2.BORDER_CONSTANT)\n",
" each_character = cv2.GaussianBlur(each_character,(5,5),0)\n",
" each_character = cv2.Laplacian(each_character,cv2.CV_64F)\n",
" each_character = cv2.GaussianBlur(each_character,(5,5),0)\n",
" \n",
" each_character = cv2.resize(each_character,(20,20))\n",
"\n",
" kernel = np.ones((3, 3), np.uint8)\n",
" each_character = cv2.filter2D(each_character,-1,kernel)\n",
" cv2.waitKey(1000)\n",
" each_character = each_character.reshape(1, -1);\n",
" result, = probability_model.predict([each_character])\n",
" label = ord(fil[counter]) - 65\n",
" if(label == np.argmax(result)):\n",
" p += 1\n",
" else:\n",
" n+=1\n",
" classification_result.append(result)\n",
" counter += 1\n",
" \n",
" ct += 1\n",
" print(\"Current file: \", ct)\n",
"print(\"Postive predictions: \", p)\n",
"print(\"Negetive predictions: \", n)\n",
"print(\"Accuracy: \", p*100/(p+n))"
],
"execution_count": 11,
"outputs": [
{
"output_type": "stream",
"text": [
"Current file: 1\n",
"Current file: 2\n",
"Current file: 3\n",
"Current file: 4\n",
"Current file: 5\n",
"Current file: 6\n",
"Current file: 7\n",
"Current file: 8\n",
"Current file: 9\n",
"Current file: 10\n",
"Current file: 11\n",
"Current file: 12\n",
"Current file: 13\n",
"Current file: 14\n",
"Current file: 15\n",
"Current file: 16\n",
"Current file: 17\n",
"Current file: 18\n",
"Current file: 19\n",
"Current file: 20\n",
"Current file: 21\n",
"Current file: 22\n",
"Current file: 23\n",
"Current file: 24\n",
"Current file: 25\n",
"Current file: 26\n",
"Current file: 27\n",
"Current file: 28\n",
"Current file: 29\n",
"Current file: 30\n",
"Current file: 31\n",
"Current file: 32\n",
"Current file: 33\n",
"Current file: 34\n",
"Current file: 35\n",
"Current file: 36\n",
"Current file: 37\n",
"Current file: 38\n",
"Current file: 39\n",
"Current file: 40\n",
"Current file: 41\n",
"Current file: 42\n",
"Current file: 43\n",
"Current file: 44\n",
"Current file: 45\n",
"Current file: 46\n",
"Current file: 47\n",
"Current file: 48\n",
"Current file: 49\n",
"Current file: 50\n",
"Current file: 51\n",
"Current file: 52\n",
"Current file: 53\n",
"Current file: 54\n",
"Current file: 55\n",
"Current file: 56\n",
"Current file: 57\n",
"Current file: 58\n",
"Current file: 59\n",
"Current file: 60\n",
"Current file: 61\n",
"Current file: 62\n",
"Current file: 63\n",
"Current file: 64\n",
"Current file: 65\n",
"Current file: 66\n",
"Current file: 67\n",
"Current file: 68\n",
"Current file: 69\n",
"Current file: 70\n",
"Current file: 71\n",
"Current file: 72\n",
"Current file: 73\n",
"Current file: 74\n",
"Current file: 75\n",
"Current file: 76\n",
"Current file: 77\n",
"Current file: 78\n",
"Current file: 79\n",
"Current file: 80\n",
"Current file: 81\n",
"Current file: 82\n",
"Current file: 83\n",
"Current file: 84\n",
"Current file: 85\n",
"Current file: 86\n",
"Current file: 87\n",
"Current file: 88\n",
"Current file: 89\n",
"Current file: 90\n",
"Current file: 91\n",
"Current file: 92\n",
"Current file: 93\n",
"Current file: 94\n",
"Current file: 95\n",
"Current file: 96\n",
"Current file: 97\n",
"Current file: 98\n",
"Current file: 99\n",
"Current file: 100\n",
"Postive predictions: 479\n",
"Negetive predictions: 84\n",
"Accuracy: 85.07992895204264\n"
],
"name": "stdout"
}
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment