Skip to content

Instantly share code, notes, and snippets.

@bazsapeter
Created February 3, 2020 21:46
Show Gist options
  • Save bazsapeter/d324227fc119e198a8910b89c6024c30 to your computer and use it in GitHub Desktop.
Save bazsapeter/d324227fc119e198a8910b89c6024c30 to your computer and use it in GitHub Desktop.
Created on Cognitive Class Labs
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"https://cognitiveclass.ai/\">\n",
" <img src=\"https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/CV0101/Logo/SNLogo.png\" width=\"200\" align=\"center\">\n",
"</a>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<h1>Lab - Detecting text in images with OpenCV and Tesseract OCR</h1>\n",
"\n",
"<b>Welcome!</b> In this lab you will learn about about Automatic number-plate recognition. We will use the Tesseract OCR An Optical Character Recognition Engine (OCR Engine) to automatically recognize text in vehicle registration plates. Pretty cool, right? \n",
"\n",
"After completing this lab you will:\n",
"<h5> 1. Learn to download, read and display images using Python, OpenCV and Matplotlib </h5>\n",
"<h5> 2. Learn to use Tesseract OCR for detetcing text in images</h5>\n",
"<h5> 3. Learn about image processing techniques </h5>\n",
"<h5> 4. Compress images using a technique called K Means Clustering</h5>\n",
"<h5> 5. Compress images by up to 90% ! </h5>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<div class=\"alert alert-block alert-info\" style=\"margin-top: 20px\">\n",
" <br>\n",
" <br>\n",
" <h2>Table of Contents</h2>\n",
" <ul>\n",
" <li><a href=\"#ref0\">Tesseract</a></li>\n",
" <li><a href=\"#ref1\">Perform OCR using the Tesseract Engine on license plates</a></li>\n",
" <li><a href=\"#ref2\">Image Processing Techniques</a></li>\n",
" <li><a href=\"#ref4\">Exercises</a></li>\n",
" </ul>\n",
" <br>\n",
" <p>Estimated Time Needed: <strong>1 hr</strong></p>\n",
" </div>\n",
"<hr>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a id=\"ref0\"></a>\n",
"<h2 align=\"center\">Tesseract<a href=\"http://opensource.google.com/projects/tesseract\"> Homepage</a></h2>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- Tesseract is an Optical Character Recognition (OCR) Engine open-sourced and supported by Google\n",
"- Has ability to recognize more than 100 languages out of the box"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### We will use Tesseract for recognizing images of License Plates. These images were clicked under different lighting conditions and have a variety of variations in them. Pretty cool, right?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To view the license plates, you could click on the `license_plates` folder which is listed in the files directory in the left-sidebar of the JupyterLab environment. If this side menu is hidden, you can go to `View`>`View Left-Sidebar`. Once you click on the folder, you could click on each file name to view the image of the license plate"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Install the Pytesseract package for using the Tesseract Engine with Python"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting pytesseract\n",
" Downloading https://files.pythonhosted.org/packages/df/4e/42c54b4344cbcb392d949ffb0b1c1e95f03ceaa6a354c8d3aafcd470592e/pytesseract-0.3.2.tar.gz\n",
"Collecting wget\n",
" Downloading https://files.pythonhosted.org/packages/47/6a/62e288da7bcda82b935ff0c6cfe542970f04e29c756b0e147251b2fb251f/wget-3.2.zip\n",
"Requirement already satisfied, skipping upgrade: Pillow in /home/jupyterlab/conda/envs/python/lib/python3.6/site-packages (from pytesseract) (6.2.1)\n",
"Building wheels for collected packages: pytesseract, wget\n",
" Building wheel for pytesseract (setup.py) ... \u001b[?25ldone\n",
"\u001b[?25h Stored in directory: /home/jupyterlab/.cache/pip/wheels/c2/60/55/ec507bce8e8ccb516954accf661ee60c8b34198fafdfb81872\n",
" Building wheel for wget (setup.py) ... \u001b[?25ldone\n",
"\u001b[?25h Stored in directory: /home/jupyterlab/.cache/pip/wheels/40/15/30/7d8f7cea2902b4db79e3fea550d7d7b85ecb27ef992b618f3f\n",
"Successfully built pytesseract wget\n",
"Installing collected packages: pytesseract, wget\n",
"Successfully installed pytesseract-0.3.2 wget-3.2\n"
]
}
],
"source": [
"!pip install --upgrade pytesseract wget"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"# Loading the required python modules\n",
"import pytesseract\n",
"import matplotlib.pyplot as plt\n",
"import cv2\n",
"import glob\n",
"import os"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a id=\"ref1\"></a>\n",
"<h2 align=\"center\">Perform OCR using the Tesseract Engine on license plates</h2>"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"import wget, zipfile, os\n",
"\n",
"filename='license-plates'\n",
"\n",
"if not os.path.isfile(filename):\n",
" filename = wget.download('https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/CV0101/Dataset/license-plates.zip')\n",
" with zipfile.ZipFile(\"license-plates.zip\",\"r\") as zip_ref:\n",
" zip_ref.extractall()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"path_for_license_plates = os.getcwd() + \"/license-plates/**/*.jpg\"\n",
"list_license_plates = []\n",
"predicted_license_plates = []\n",
"\n",
"for path_to_license_plate in glob.glob(path_for_license_plates, recursive=True):\n",
" \n",
" license_plate_file = path_to_license_plate.split(\"/\")[-1]\n",
" license_plate, _ = os.path.splitext(license_plate_file)\n",
" '''\n",
" Here we append the actual license plate to a list\n",
" '''\n",
" list_license_plates.append(license_plate)\n",
" \n",
" '''\n",
" Read each license plate image file using openCV\n",
" '''\n",
" img = cv2.imread(path_to_license_plate)\n",
" \n",
" '''\n",
" We then pass each license plate image file to the Tesseract OCR engine using \n",
" the Python library wrapper for it. We get back a predicted_result for the license plate.\n",
" We append the predicted_result in a list and compare it with the original the license plate\n",
" '''\n",
" predicted_result = pytesseract.image_to_string(img, lang='eng',\n",
" config='--oem 3 --psm 6 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')\n",
" \n",
" filter_predicted_result = \"\".join(predicted_result.split()).replace(\":\", \"\").replace(\"-\", \"\")\n",
" predicted_license_plates.append(filter_predicted_result)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Actual License Plate \t Predicted License Plate \t Accuracy\n",
"-------------------- \t ----------------------- \t --------\n",
" OYJ9557 \t\t\t OYJ9557 \t\t 100%\n",
" PJG0783 \t\t\t PJG0783 \t\t 100%\n",
" OUP9563 \t\t\t OUP9563 \t\t 100%\n",
" OLC4728 \t\t\t OLC4728 \t\t 100%\n",
" ODJ1599 \t\t\t ODJ1599 \t\t 100%\n",
" GWT2180 \t\t\t GWT2120 \t\t 86.0%\n",
" OKV8004 \t\t\t QKV8004 \t\t 86.0%\n",
" PJB2414 \t\t\t PJB2414 \t\t 100%\n",
" OLA1208 \t\t\t OLA1208 \t\t 100%\n",
" AYO9034 \t\t\t AYO9034 \t\t 100%\n",
" JSQ1413 \t\t\t JSQ|413 \t\t 86.0%\n",
" OKS0078 \t\t\t OKS0078 \t\t 100%\n",
" NTK5785 \t\t\t NTK5785 \t\t 100%\n",
" PJD2685 \t\t\t PJD2685 \t\t 100%\n",
" NZW2197 \t\t\t NZW2197 \t\t 100%\n",
" PJB7392 \t\t\t PJB7392 \t\t 100%\n",
" NYY1710 \t\t\t NYY1710 \t\t 100%\n",
" OCX4764 \t\t\t OCX4764 \t\t 100%\n"
]
}
],
"source": [
"print(\"Actual License Plate\", \"\\t\", \"Predicted License Plate\", \"\\t\", \"Accuracy\")\n",
"print(\"--------------------\", \"\\t\", \"-----------------------\", \"\\t\", \"--------\")\n",
"\n",
"def calculate_predicted_accuracy(actual_list, predicted_list):\n",
" for actual_plate, predict_plate in zip(actual_list, predicted_list):\n",
" accuracy = \"0%\"\n",
" num_matches = 0\n",
" if actual_plate == predict_plate:\n",
" accuracy = \"100%\"\n",
" else:\n",
" if len(actual_plate) == len(predict_plate):\n",
" for a, p in zip(actual_plate, predict_plate):\n",
" if a == p:\n",
" num_matches += 1\n",
" accuracy = str(round((num_matches/len(actual_plate)), 2) * 100)\n",
" accuracy += \"%\"\n",
" print(\" \", actual_plate, \"\\t\\t\\t\", predict_plate, \"\\t\\t \", accuracy)\n",
"\n",
" \n",
"calculate_predicted_accuracy(list_license_plates, predicted_license_plates)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<h3>Woah! We see that the Tesseract OCR engine mostly predicts all of the license plates correctly with 100% accuracy! </h3>\n",
"\n",
"\n",
"<h3>For the license plates the Tesseract OCR Engine predicted incorrectly (i.e. GWT2180, OKV8004, JSQ1413), we will apply image processing techniques on those license plate files and pass them to the Tesseract OCR again. Applying the image processing techniques would increase the accuracy of the Tesseract Engine for the license plates of GWT2180, OKV8004, JSQ1413</h3>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a id=\"ref2\"></a>\n",
"<h2 align=\"center\"> Image Processing Techniques </h2>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Image resizing is a technique in which we scale the image either horizontally, or vertically or both. \n",
"Further documentation on image resizing: [here](https://www.tutorialkart.com/opencv/python/opencv-python-resize-image/)\n",
"\n",
"For our use case, we will read the license plate file of ```GWT2180``` using ```cv2.imread``` and then resize the image file by a factor of 2x in both the horizontal and vertical directions using ```cv2.resize```"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'GWT2180 license plate')"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Read the license plate file and display it\n",
"test_license_plate = cv2.imread(os.getcwd() + \"/license-plates/GWT2180.jpg\")\n",
"plt.imshow(test_license_plate)\n",
"plt.axis('off')\n",
"plt.title('GWT2180 license plate')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 1. Image resizing"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"resize_test_license_plate = cv2.resize(test_license_plate, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 2. Converting to Grayscale"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next, we convert our resized image file to gray scale. We learnt about this technique in the image processing lab"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"grayscale_resize_test_license_plate = cv2.cvtColor(resize_test_license_plate, cv2.COLOR_BGR2GRAY)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 3. Denoising the Image"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Gaussian Blur is a technique for denoising images. Full OpenCV documentation on Gaussian Blur: [here](https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_filtering/py_filtering.html#gaussian-filtering)\n",
"\n",
"We apply a gaussian blur to the greyscale image"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"gaussian_blur_license_plate = cv2.GaussianBlur(grayscale_resize_test_license_plate, (5, 5), 0)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Pass the transformed license plate file to the Tesseract OCR engine and see the predicted result\n"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"GWT2180\n"
]
}
],
"source": [
"new_predicted_result_GWT2180 = pytesseract.image_to_string(gaussian_blur_license_plate, lang='eng',\n",
"config='--oem 3 -l eng --psm 6 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')\n",
"filter_new_predicted_result_GWT2180 = \"\".join(new_predicted_result_GWT2180.split()).replace(\":\", \"\").replace(\"-\", \"\")\n",
"print(filter_new_predicted_result_GWT2180)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" #### Voila We see that the Tesseract OCR correctly recognises all characters in the GWT2180 license plate after we passed in the transformed license plate"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a id=\"ref4\"></a>\n",
"<h2 align=\"center\"> Exercises </h2>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Exercise 1:"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'JSQ1413 license plate')"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# 1.1 Read in the license plate file of JSQ1413\n",
"# Write your code below:\n",
"\n",
"test_license_plate_exc = cv2.imread(os.getcwd() + \"/license-plates/JSQ1413.jpg\")\n",
"plt.imshow(test_license_plate_exc)\n",
"plt.axis('off')\n",
"plt.title('JSQ1413 license plate')"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"# 1.2 Apply the image processing techniques to the license plate of JSQ1413 described above \n",
"# Write your code below:\n",
"resize_test_license_plate_exc = cv2.resize(test_license_plate_exc, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)\n",
"\n",
"grayscale_resize_test_license_plate_exc = cv2.cvtColor(resize_test_license_plate_exc, cv2.COLOR_BGR2GRAY)\n",
"\n",
"gaussian_blur_license_plate_exc = cv2.GaussianBlur(grayscale_resize_test_license_plate_exc, (5, 5), 0)\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"JSQ1413\n"
]
}
],
"source": [
"# 1.3 Pass the modified license plate file to the Tesseract Engine. Report your findings \n",
"# Write your code below:\n",
"\n",
"new_predicted_result_JSQ1413 = pytesseract.image_to_string(gaussian_blur_license_plate_exc, lang='eng',\n",
"config='--oem 3 -l eng --psm 6 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')\n",
"filter_new_predicted_result_JSQ1413 = \"\".join(new_predicted_result_JSQ1413.split()).replace(\":\", \"\").replace(\"-\", \"\")\n",
"print(filter_new_predicted_result_JSQ1413)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Double-click <font color=\"red\"><b><u>here</b></u></font> for the solution.\n",
"\n",
"<!---\n",
"\n",
"# 1.1 Read the license plate file and display it\n",
"\n",
"test_license_plate_JSQ1413 = cv2.imread(os.getcwd() + \"/license-plates/JSQ1413.jpg\")\n",
"plt.imshow(test_license_plate_OKV8004)\n",
"plt.axis('off')\n",
"plt.title('OKV8004 license plate')\n",
"\n",
"# 1.2 Apply the image processing techniques to the license plate of JSQ1413 described above\n",
"\n",
"resize_test_license_plate_JSQ1413 = cv2.resize(test_license_plate_JSQ1413, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)\n",
"grayscale_resize_test_license_plate_JSQ1413 = cv2.cvtColor(resize_test_license_plate_JSQ1413, cv2.COLOR_BGR2GRAY)\n",
"gaussian_blur_license_plate_JSQ1413 = cv2.GaussianBlur(grayscale_resize_test_license_plate_JSQ1413, (5, 5), 0)\n",
"\n",
"# 1.3 Pass the modified license plate file to the Tesseract Engine. Report your findings\n",
"\n",
"new_predicted_result_JSQ1413 = pytesseract.image_to_string(gaussian_blur_license_plate_JSQ1413, lang='eng',\n",
"config='--oem 3 -l eng --psm 6 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')\n",
"filter_new_predicted_result_JSQ1413 = \"\".join(new_predicted_result_JSQ1413.split()).replace(\":\", \"\").replace(\"-\", \"\")\n",
"print(filter_new_predicted_result_JSQ1413)\n",
"--->"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<h1>Thank you for completing this lab!</h1>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<div class=\"alert alert-block alert-info\" style=\"margin-top: 20px\">\n",
"<h2>Get IBM Watson Studio free of charge!</h2>\n",
" <p><a href=\"https://cocl.us/NotebooksPython101bottom\"><img src=\"https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/CV0101/Logo/BottomAd.png\" width=\"750\" align=\"center\"></a></p>\n",
"</div>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<h3>About the Author:</h3>\n",
"This lab was written by <a href=\"https://www.linkedin.com/in/sacchitchadha/\" target=\"_blank\" >Sacchit Chadha</a> and revised by Nayef Abou Tayoun\n",
"<p><a href=\"https://www.linkedin.com/in/sacchitchadha/\" target=\"_blank\">Sacchit Chadha</a> is a Software Engineer at IBM, and is currently pursuing a Bachelors Degree in Computer Science from the University of Waterloo. His work at IBM focused on Computer Vision, Cloud Computing and Blockchain.</p>\n",
"<p>Nayef Abou Tayoun is a Cognitive Data Scientist at IBM, and is currently pursuing a Master's degree in Artificial Intelligence.</p>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<hr>\n",
"<p>Copyright &copy; 2019 IBM Developer Skills Network. This notebook and its source code are released under the terms of the <a href=\"https://cognitiveclass.ai/mit-license/\">MIT License</a>.</p>"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python",
"language": "python",
"name": "conda-env-python-py"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.7"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment