-
Notifications
You must be signed in to change notification settings - Fork 0
jjustinm4/Number-plate-detector
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
 |  | |||
 |  | |||
 |  | |||
 |  | |||
Repository files navigation
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"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"
},
"colab": {
"name": "ai_powered_license_plate_detector.ipynb",
"provenance": [],
"collapsed_sections": []
},
"accelerator": "GPU"
},
"cells": [
{
"cell_type": "code",
"metadata": {
"id": "ycRjhI25UC-P",
"colab_type": "code",
"colab": {}
},
"source": [
"import matplotlib.pyplot as plt"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "MzopHrMvUC-Z",
"colab_type": "code",
"colab": {}
},
"source": [
"import numpy as np\n",
"import cv2\n",
"\n",
"# Match contours to license plate or character template\n",
"def find_contours(dimensions, img) :\n",
"\n",
" # Find all contours in the image\n",
" cntrs, _ = cv2.findContours(img.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)\n",
"\n",
" # Retrieve potential dimensions\n",
" lower_width = dimensions[0]\n",
" upper_width = dimensions[1]\n",
" lower_height = dimensions[2]\n",
" upper_height = dimensions[3]\n",
" \n",
" # Check largest 5 or 15 contours for license plate or character respectively\n",
" cntrs = sorted(cntrs, key=cv2.contourArea, reverse=True)[:15]\n",
" \n",
" ii = cv2.imread('contour.jpg')\n",
" \n",
" x_cntr_list = []\n",
" target_contours = []\n",
" img_res = []\n",
" for cntr in cntrs :\n",
" #detects contour in binary image and returns the coordinates of rectangle enclosing it\n",
" intX, intY, intWidth, intHeight = cv2.boundingRect(cntr)\n",
" \n",
" #checking the dimensions of the contour to filter out the characters by contour's size\n",
" if intWidth > lower_width and intWidth < upper_width and intHeight > lower_height and intHeight < upper_height :\n",
" x_cntr_list.append(intX) #stores the x coordinate of the character's contour, to used later for indexing the contours\n",
"\n",
" char_copy = np.zeros((44,24))\n",
" #extracting each character using the enclosing rectangle's coordinates.\n",
" char = img[intY:intY+intHeight, intX:intX+intWidth]\n",
" char = cv2.resize(char, (20, 40))\n",
" \n",
" cv2.rectangle(ii, (intX,intY), (intWidth+intX, intY+intHeight), (50,21,200), 2)\n",
" plt.imshow(ii, cmap='gray')\n",
"\n",
"# Make result formatted for classification: invert colors\n",
" char = cv2.subtract(255, char)\n",
"\n",
" # Resize the image to 24x44 with black border\n",
" char_copy[2:42, 2:22] = char\n",
" char_copy[0:2, :] = 0\n",
" char_copy[:, 0:2] = 0\n",
" char_copy[42:44, :] = 0\n",
" char_copy[:, 22:24] = 0\n",
"\n",
" img_res.append(char_copy) #List that stores the character's binary image (unsorted)\n",
" \n",
" #Return characters on ascending order with respect to the x-coordinate (most-left character first)\n",
" \n",
" plt.show()\n",
" #arbitrary function that stores sorted list of character indeces\n",
" indices = sorted(range(len(x_cntr_list)), key=lambda k: x_cntr_list[k])\n",
" img_res_copy = []\n",
" for idx in indices:\n",
" img_res_copy.append(img_res[idx])# stores character images according to their index\n",
" img_res = np.array(img_res_copy)\n",
"\n",
" return img_res"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "h23diSmEUC-e",
"colab_type": "code",
"colab": {}
},
"source": [
"# Find characters in the resulting images\n",
"def segment_characters(image) :\n",
"\n",
" # Preprocess cropped license plate image\n",
" img_lp = cv2.resize(image, (333, 75))\n",
" img_gray_lp = cv2.cvtColor(img_lp, cv2.COLOR_BGR2GRAY)\n",
" _, img_binary_lp = cv2.threshold(img_gray_lp, 200, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)\n",
" img_binary_lp = cv2.erode(img_binary_lp, (3,3))\n",
" img_binary_lp = cv2.dilate(img_binary_lp, (3,3))\n",
"\n",
" LP_WIDTH = img_binary_lp.shape[0]\n",
" LP_HEIGHT = img_binary_lp.shape[1]\n",
"\n",
" # Make borders white\n",
" img_binary_lp[0:3,:] = 255\n",
" img_binary_lp[:,0:3] = 255\n",
" img_binary_lp[72:75,:] = 255\n",
" img_binary_lp[:,330:333] = 255\n",
"\n",
" # Estimations of character contours sizes of cropped license plates\n",
" dimensions = [LP_WIDTH/6,\n",
" LP_WIDTH/2,\n",
" LP_HEIGHT/10,\n",
" 2*LP_HEIGHT/3]\n",
" plt.imshow(img_binary_lp, cmap='gray')\n",
" plt.show()\n",
" cv2.imwrite('contour.jpg',img_binary_lp)\n",
"\n",
" # Get contours within cropped license plate\n",
" char_list = find_contours(dimensions, img_binary_lp)\n",
"\n",
" return char_list"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "OGhFmSnYUC-j",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 237
},
"outputId": "fabb6134-d314-439b-fb85-3967f315fd1c"
},
"source": [
"img = cv2.imread('car_plate.png')\n",
"char = segment_characters(img)"
],
"execution_count": 39,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "rZoiyrDaUC-p",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 83
},
"outputId": "12c01433-ba9b-45fc-8663-ddf2f3a3cc22"
},
"source": [
"for i in range(10):\n",
" plt.subplot(1, 10, i+1)\n",
" plt.imshow(char[i], cmap='gray')\n",
" plt.axis('off')"
],
"execution_count": 40,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\nwTGaAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 432x288 with 10 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "QXhqHfXLUC-9",
"colab_type": "text"
},
"source": [
"### Model for characters"
]
},
{
"cell_type": "code",
"metadata": {
"id": "cnH_x_PXUC_A",
"colab_type": "code",
"colab": {}
},
"source": [
"import tensorflow as tf\n",
"tf.enable_eager_execution()"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "BhrsmfX9UC_p",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 51
},
"outputId": "0bd4c93b-dc04-4ca4-877b-9f084a03b550"
},
"source": [
"from tensorflow.keras.preprocessing.image import ImageDataGenerator\n",
"train_datagen = ImageDataGenerator(rescale=1./255, width_shift_range=0.1, height_shift_range=0.1)\n",
"train_generator = train_datagen.flow_from_directory(\n",
" 'data/train', # this is the target directory\n",
" target_size=(28,28), # all images will be resized to 28x28\n",
" batch_size=1,\n",
" class_mode='categorical')\n",
"\n",
"validation_generator = train_datagen.flow_from_directory(\n",
" 'data/val', # this is the target directory\n",
" target_size=(28,28), # all images will be resized to 28x28 batch_size=1,\n",
" class_mode='categorical')"
],
"execution_count": 42,
"outputs": [
{
"output_type": "stream",
"text": [
"Found 864 images belonging to 36 classes.\n",
"Found 216 images belonging to 36 classes.\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "jy9Ges8McSGl",
"colab_type": "code",
"colab": {}
},
"source": [
"from tensorflow.keras.models import Sequential\n",
"from tensorflow.keras.layers import Dense, Flatten, MaxPooling2D, Dropout, Conv2D\n",
"from tensorflow.keras import optimizers"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "8IjCdBYrp4EK",
"colab_type": "code",
"colab": {}
},
"source": [
"model = Sequential()\n",
"model.add(Conv2D(32, (24,24), input_shape=(28, 28, 3), activation='relu', padding='same'))\n",
"# model.add(Conv2D(32, (20,20), input_shape=(28, 28, 3), activation='relu', padding='same'))\n",
"# model.add(Conv2D(32, (20,20), input_shape=(28, 28, 3), activation='relu', padding='same'))\n",
"model.add(MaxPooling2D(pool_size=(2, 2)))\n",
"model.add(Dropout(0.4))\n",
"model.add(Flatten())\n",
"model.add(Dense(128, activation='relu'))\n",
"model.add(Dense(36, activation='softmax'))\n",
"\n",
"model.compile(loss='categorical_crossentropy', optimizer=optimizers.Adam(lr=0.00001), metrics=['accuracy'])"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "w5aaqsHABUwx",
"colab_type": "code",
"colab": {}
},
"source": [
"class stop_training_callback(tf.keras.callbacks.Callback):\n",
" def on_epoch_end(self, epoch, logs={}):\n",
" if(logs.get('val_acc') > 0.992):\n",
" self.model.stop_training = True"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "QqoZHrC6DBY3",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"outputId": "04893bee-16d5-44a3-db5f-221cf155ba82"
},
"source": [
"import datetime\n",
"!rm -rf logs\n",
"log_dir=\"logs/fit/\" + datetime.datetime.now().strftime(\"%Y%m%d-%H%M%S\")\n",
"tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1)"
],
"execution_count": 30,
"outputs": [
{
"output_type": "stream",
"text": [
"WARNING:tensorflow:Weight and gradient histograms not supported for eagerexecution, setting `histogram_freq` to `0`.\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "KPAtDd_Jp4BP",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000
},
"outputId": "fbdd1ad4-32fd-40b7-eb13-61ed1db14e47"
},
"source": [
"batch_size = 1\n",
"callbacks = [tensorboard_callback, stop_training_callback()]\n",
"model.fit_generator(\n",
" train_generator,\n",
" steps_per_epoch = train_generator.samples // batch_size,\n",
" validation_data = validation_generator, \n",
" validation_steps = validation_generator.samples // batch_size,\n",
" epochs = 80, callbacks=callbacks)"
],
"execution_count": 31,
"outputs": [
{
"output_type": "stream",
"text": [
"Epoch 1/80\n",
"862/864 [============================>.] - ETA: 0s - loss: 3.4263 - acc: 0.1160Epoch 1/80\n",
"864/864 [==============================] - 17s 20ms/step - loss: 3.4250 - acc: 0.1169 - val_loss: 3.0624 - val_acc: 0.4630\n",
"Epoch 2/80\n",
"863/864 [============================>.] - ETA: 0s - loss: 2.6822 - acc: 0.4299Epoch 1/80\n",
"864/864 [==============================] - 17s 19ms/step - loss: 2.6817 - acc: 0.4306 - val_loss: 2.1403 - val_acc: 0.7315\n",
"Epoch 3/80\n",
"861/864 [============================>.] - ETA: 0s - loss: 1.7860 - acc: 0.6469Epoch 1/80\n",
"864/864 [==============================] - 17s 20ms/step - loss: 1.7831 - acc: 0.6481 - val_loss: 1.4238 - val_acc: 0.7963\n",
"Epoch 4/80\n",
"863/864 [============================>.] - ETA: 0s - loss: 1.1762 - acc: 0.7659Epoch 1/80\n",
"864/864 [==============================] - 17s 20ms/step - loss: 1.1769 - acc: 0.7650 - val_loss: 0.9614 - val_acc: 0.8889\n",
"Epoch 5/80\n",
"863/864 [============================>.] - ETA: 0s - loss: 0.8258 - acc: 0.8169Epoch 1/80\n",
"864/864 [==============================] - 17s 20ms/step - loss: 0.8268 - acc: 0.8160 - val_loss: 0.6774 - val_acc: 0.9028\n",
"Epoch 6/80\n",
"862/864 [============================>.] - ETA: 0s - loss: 0.6108 - acc: 0.8689Epoch 1/80\n",
"864/864 [==============================] - 17s 20ms/step - loss: 0.6112 - acc: 0.8681 - val_loss: 0.5131 - val_acc: 0.9306\n",
"Epoch 7/80\n",
"861/864 [============================>.] - ETA: 0s - loss: 0.4527 - acc: 0.9071Epoch 1/80\n",
"864/864 [==============================] - 17s 19ms/step - loss: 0.4534 - acc: 0.9062 - val_loss: 0.4018 - val_acc: 0.9213\n",
"Epoch 8/80\n",
"862/864 [============================>.] - ETA: 0s - loss: 0.3744 - acc: 0.9188Epoch 1/80\n",
"864/864 [==============================] - 17s 20ms/step - loss: 0.3738 - acc: 0.9190 - val_loss: 0.3395 - val_acc: 0.9491\n",
"Epoch 9/80\n",
"861/864 [============================>.] - ETA: 0s - loss: 0.2837 - acc: 0.9326Epoch 1/80\n",
"864/864 [==============================] - 17s 20ms/step - loss: 0.2843 - acc: 0.9317 - val_loss: 0.2784 - val_acc: 0.9444\n",
"Epoch 10/80\n",
"860/864 [============================>.] - ETA: 0s - loss: 0.2346 - acc: 0.9465Epoch 1/80\n",
"864/864 [==============================] - 17s 20ms/step - loss: 0.2336 - acc: 0.9468 - val_loss: 0.2193 - val_acc: 0.9491\n",
"Epoch 11/80\n",
"861/864 [============================>.] - ETA: 0s - loss: 0.2087 - acc: 0.9524Epoch 1/80\n",
"864/864 [==============================] - 17s 19ms/step - loss: 0.2082 - acc: 0.9525 - val_loss: 0.1770 - val_acc: 0.9630\n",
"Epoch 12/80\n",
"861/864 [============================>.] - ETA: 0s - loss: 0.1656 - acc: 0.9617Epoch 1/80\n",
"864/864 [==============================] - 17s 19ms/step - loss: 0.1654 - acc: 0.9618 - val_loss: 0.1830 - val_acc: 0.9398\n",
"Epoch 13/80\n",
"860/864 [============================>.] - ETA: 0s - loss: 0.1402 - acc: 0.9674Epoch 1/80\n",
"864/864 [==============================] - 17s 19ms/step - loss: 0.1399 - acc: 0.9676 - val_loss: 0.1375 - val_acc: 0.9722\n",
"Epoch 14/80\n",
"861/864 [============================>.] - ETA: 0s - loss: 0.1319 - acc: 0.9710Epoch 1/80\n",
"864/864 [==============================] - 17s 19ms/step - loss: 0.1316 - acc: 0.9711 - val_loss: 0.1336 - val_acc: 0.9583\n",
"Epoch 15/80\n",
"862/864 [============================>.] - ETA: 0s - loss: 0.1190 - acc: 0.9652Epoch 1/80\n",
"864/864 [==============================] - 17s 20ms/step - loss: 0.1187 - acc: 0.9653 - val_loss: 0.1189 - val_acc: 0.9583\n",
"Epoch 16/80\n",
"861/864 [============================>.] - ETA: 0s - loss: 0.1079 - acc: 0.9698Epoch 1/80\n",
"864/864 [==============================] - 17s 19ms/step - loss: 0.1077 - acc: 0.9699 - val_loss: 0.1360 - val_acc: 0.9583\n",
"Epoch 17/80\n",
"861/864 [============================>.] - ETA: 0s - loss: 0.0966 - acc: 0.9814Epoch 1/80\n",
"864/864 [==============================] - 17s 20ms/step - loss: 0.0962 - acc: 0.9815 - val_loss: 0.0887 - val_acc: 0.9676\n",
"Epoch 18/80\n",
"860/864 [============================>.] - ETA: 0s - loss: 0.0869 - acc: 0.9756Epoch 1/80\n",
"864/864 [==============================] - 17s 19ms/step - loss: 0.0866 - acc: 0.9757 - val_loss: 0.0729 - val_acc: 0.9815\n",
"Epoch 19/80\n",
"863/864 [============================>.] - ETA: 0s - loss: 0.0834 - acc: 0.9757Epoch 1/80\n",
"864/864 [==============================] - 17s 20ms/step - loss: 0.0833 - acc: 0.9757 - val_loss: 0.0626 - val_acc: 0.9815\n",
"Epoch 20/80\n",
"861/864 [============================>.] - ETA: 0s - loss: 0.0712 - acc: 0.9837Epoch 1/80\n",
"864/864 [==============================] - 17s 20ms/step - loss: 0.0710 - acc: 0.9838 - val_loss: 0.0882 - val_acc: 0.9722\n",
"Epoch 21/80\n",
"863/864 [============================>.] - ETA: 0s - loss: 0.0557 - acc: 0.9861Epoch 1/80\n",
"864/864 [==============================] - 17s 20ms/step - loss: 0.0557 - acc: 0.9861 - val_loss: 0.0537 - val_acc: 0.9907\n",
"Epoch 22/80\n",
"861/864 [============================>.] - ETA: 0s - loss: 0.0604 - acc: 0.9849Epoch 1/80\n",
"864/864 [==============================] - 17s 19ms/step - loss: 0.0602 - acc: 0.9850 - val_loss: 0.0499 - val_acc: 0.9907\n",
"Epoch 23/80\n",
"863/864 [============================>.] - ETA: 0s - loss: 0.0619 - acc: 0.9826Epoch 1/80\n",
"864/864 [==============================] - 17s 19ms/step - loss: 0.0620 - acc: 0.9826 - val_loss: 0.0434 - val_acc: 0.9954\n"
],
"name": "stdout"
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<tensorflow.python.keras.callbacks.History at 0x7fb532d27f60>"
]
},
"metadata": {
"tags": []
},
"execution_count": 31
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "qFevjr5YcSDU",
"colab_type": "code",
"colab": {}
},
"source": [
"# !kill 8400\n",
"%load_ext tensorboard\n",
"%tensorboard --logdir logs/fit"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "3PICNwtZUDAD",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"outputId": "483eda61-5d3a-4600-ab47-e1cd1bb6058e"
},
"source": [
"def fix_dimension(img): \n",
" new_img = np.zeros((28,28,3))\n",
" for i in range(3):\n",
" new_img[:,:,i] = img\n",
" return new_img\n",
" \n",
"def show_results():\n",
" dic = {}\n",
" characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'\n",
" for i,c in enumerate(characters):\n",
" dic[i] = c\n",
"\n",
" output = []\n",
" for i,ch in enumerate(char): #iterating over the characters\n",
" img_ = cv2.resize(ch, (28,28))\n",
" img = fix_dimension(img_)\n",
" img = img.reshape(1,28,28,3) #preparing image for the model\n",
" y_ = model.predict_classes(img)[0] #predicting the class\n",
" character = dic[y_] #\n",
" output.append(character) #storing the result in a list\n",
" \n",
" plate_number = ''.join(output)\n",
" \n",
" return plate_number\n",
"\n",
"print(show_results())"
],
"execution_count": 49,
"outputs": [
{
"output_type": "stream",
"text": [
"DL8CAF5030\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "urZpH4YFUDAI",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 373
},
"outputId": "6688d92e-0c11-48c7-baa3-1c44b36873aa"
},
"source": [
"plt.figure(figsize=(10,6))\n",
"for i,ch in enumerate(char):\n",
" img = cv2.resize(ch, (28,28))\n",
" plt.subplot(3,4,i+1)\n",
" plt.imshow(img,cmap='gray')\n",
" plt.title(f'predicted: {show_results()[i]}')\n",
" plt.axis('off')\n",
"plt.show()"
],
"execution_count": 90,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\ngyTdIWl45l8EqzLHtjSz35jZp2a21MzuMLPWXl2XmtliM1tkZmNz+ChOkLRK0i8lnZHD+ysefQkN\nRR9CPtCPJFX/Hbs6SZKVSZLMkHSnpDPrWUfdkiTJ20vSPEnTJfWS1EXSq5KuyeRGStoq6XpJLSW1\nlrSPpM8lDZPUNPMNz8vkW0iaL+nfJDWXdKKkLan6FmbippKmSbpJUltV/3APyuTOlPRKqp03SXo8\n08b2kp6QdF0mN0rSUklDMnU9KCmRNCCTP1nSe9v5HP5X0q8l7Zz5nr+Zz8+5El70pUSSXpB0Vuyf\nRWN90YcSSbpX0orM6x1JJ8T+uTS2V6X3I0mdM8fu7H3tREnv5/VzLsAP7VyvfLSkOd6HvFlSKy//\ne1WPtvw6ZkoaIekQSYuUeRZKJvdaLT+04ZK+kNSshjYFPzRJJmm9pP7e14ZLmpuJ75Y03svt7v/Q\nsvgMekuqkrR3pvy0pFti/w/V2F70JTcY2aDqWbZVkv4e++fSmF70oUSS9pW0g6Rmme9/raQDY/9s\nGtOr0vuRqgdhSep7PELSvHx+zoVY31rgxfMl7eKVv0iSZJNX7iPpDDO7wPtai8x7EkmfJZnv3Kuv\nJr0kzU+SZGsW7dtRUhtJ75i5x+Sbqkehypz7nSzOWZvTJM1IkmRqpvyApBvN7JIkSbbUs65KV+l9\nSZIuTJLkrhzeh2oV3YeSJPm7V/yrmT0gaYyq/3WP7FVyP1qX+W8HSZu8eG096tiuQlzA2suLe6t6\nFPiVJHXsAkm/SpKkk/dqkyTJQ5IWS+ph3iebqa8mCyT1tpovHkqfc5mkjZK+4Z2zY5Ik7TL5xTV8\nD/VxuqR+Vn3F8RJJ/yGpq6pH06ifSu9LaDj60D+evyw2vSuyiu1HSZKszLx/qPfloZI+yLaObBRi\nMPJjM+tpZl0k/UzSw3Uce6ekc81smFVra2bHmFl7SVNUvRZ3oZk1N7MxkvarpZ43Vf1hjc/U0crM\nDszklkrqaWYtJClJkqrMeW8ys50kycx6mNmRmeP/KOlMMxtsZm0k/Tzbb9yqb7vsn2nn3pnXEFWv\nz52ebT1wKrYvIW8qug+Z2Ylm1s7MmpjZv6j67r7H61MHJFV4P5J0n6Qrzayzme0h6WxVX4+UN4UY\njDwo6RlJn0iaI+ma2g5MkuRtVX9Tt0laKWm2MlfoJkmyWdXTiWeq+uKrkyRNqqWebZK+LWmApE8l\n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\npEz6OVX/q3KJmS3LfO2yzLleN7M1kp6VNDBT11OSbs68b3bmv46ZnWJmdf0r9TuZ73utpAmSbs28\nkL1K70M/z3zf8yW9KOmGJEn+VsfxANBo5X2jPDObJ+msJEmezWvFqBj0IQCoLI36CawAAKDxYzAC\nAACiyvsyDQAAQH0wMwIAAKJiMAIAAKKq8wmsZsYaTkRJktj2jyp99KO4yqUfAShfzIwAAICoGIwA\nAICoCrVRXl6F24pILVu2dHGbNm3yfr7Nmze7eN26dXUcicasSZOvx+ItWrQIck2bNk0fvl1bt4b7\n623ZssXFVVVV9a4PACoFMyMAACAqBiMAACAqBiMAACCqRnHNyHHHHReUL774YhcfdNBBDa4//RTa\nqVOnuvi3v/1tkLv33nsbfD4UTq9evYLy4Ycf7uJ+/foFuT59+rh45MiRddaTjenTpwfl119/3cVL\nliwJcv41JJ999pmLn3nmmeC4hQsXujh9TQoAlAtmRgAAQFQMRgAAQFSNYplm7733Dsr5WJrxpW8d\n3nXXXV18xBFHBDmWaUrbo48+GpT322+/op17yJAhdZazcddddwXlW265xcXpZSAAKBfMjAAAgKgY\njAAAgKgYjAAAgKgKcs1Ily5dXDxixIggN27cOBfvtttuLq7r8dtt27bNY+u2r2PHji4eM2ZMkEvf\novmV999/Pyj/7ne/c/Fzzz0X5FavXt3QJlaEDh06uDh9W27fvn1rfE/nzp0L2aSCS39f/u3H8+bN\nC3JsVQCgXDAzAgAAomIwAgAAorL000eDpFmtSX9Z5Vvf+laQ+9GPfuTi008/vSHtkyRt2rQpKPtP\nrJw/f35OdfrT3z169AhyrVq1yqnO2vz6178OyldffbWL65pqT5LEak02InX1I1/65/Cv//qvLv63\nf/u3INe7d+8Gt8vfnXnNmjVBLt3nauPvGt2uXbsgl94JOBd/+MMfXHzHHXcEuWnTprm4rv+Py6Uf\nAShfzIwAAICoGIwAAICoGIwAAICocr61t3Xr1i7+zne+E+TycZ2I75577gnK1157rYv9XU3ro2fP\nni6+4oorgpx/zQsKy7/m4qijjgpyY8eOdXE+rhGZNWtWUJ44caKL77///iC3YsWKrOocPXq0i88+\n++wgl49tC8444wwXL1++PMjNnTvXxdwuDqAxY2YEAABExWAEAABEVbK79vpT6m+99VaQy3VpprY6\nPv/88wbXh9z4t78OGjQoyO25554Nrt+//fXGG28Mcg888ICLq6qqcqp/woQJLk7fXtu+fXsXDx06\nNKf6/dvM07ecp3ebBoDGipkRAAAQFYMRAAAQVc7LNOvXr3dx+gmjd955Z+4tyvDvHEg/HTPfbr/9\n9qC8YcMGF19//fUFPTcKy19+2bp1a625Uq0fACoBMyMAACAqBiMAACAqBiMAACCqnK8Z8W9jTD8Z\nMl0udfvss09QHjFiRKSWAABQeZgZAQAAUTEYAQAAUZXsE1iL6YADDgjKRx99dKSWAABQeZgZAQAA\nUTEYAQAAUTEYAQAAUVXsNSNHHXWUi/fff/+81//CCy+4+PXXXw9yX375Zd7PBwBAY8XMCAAAiIrB\nCAAAiKpkl2maN2/u4t122y3IjR071sUXX3xx0dpUHy+++KKL33777SC3ZcuWYjcHAICSxcwIAACI\nisEIAACIisEIAACIqmSvGbn88stdfNZZZwW53r17F7s5DeLvcAwAAELMjAAAgKgYjAAAgKgYjAAA\ngKgYjAAAgKgYjAAAgKhK9m6a8ePHu/hPf/pTkGsMT2D1mVnsJgAAULKYGQEAAFExGAEAAFExGAEA\nAFGV7DUj/s62H374YZC75JJLaozr46ijjnLxuHHjgtyRRx6ZU52+n//85y5u3bp1kLv66qtdvG7d\nugafC/F06tTJxV27dg1ybdq0KXZzAKBRYmYEAABExWAEAABEVbLLNIX21FNPuXjYsGFBLh/LNKgM\nhx56qItPOOGEIDdw4MBiNwcAGiVmRgAAQFQMRgAAQFQMRgAAQFQVe80IkA//8z//4+Ju3boFuZ12\n2snFgwYNKlqbAKCxYWYEAABExWAEAABElfMyjb8TbZcuXYJc586dc29RxvLly128Zs2aILdt27YG\n19+0aVMXN2mS/zFZVVVVjbEkJUmS9/MhDv8JuqtWrQpymzZtKnZzAKBRYmYEAABExWAEAABExWAE\nAABElfM1I23btnXxT3/60yCXLudi1qxZLp44cWKQ++tf/+riZcuWBbk5c+ZkVf95553n4vRjvPPh\nvvvuc/HkyZOD3MaNG/N+PsThX2/UrFmzWnO52rp1a42xxLVHAMoHMyMAACAqBiMAACCqkn0C6+67\n7+7iq666KsidffbZLn7kkUeC3Lhx47Kqv1+/fi7eZZddcmlinebPn+/izz77LMilb/VF4XTt2tXF\ne+65Z5B79913XTx79uwg5y+J+Lext2/fPjju+OOPd7HfLyVp6NCh9W7vl19+GZRvvPFGF999991B\nbvXq1fWuHwBKETMjAAAgKgYjAAAgqpJdpqnLDjvs4OIxY8YEuSFDhmRVh78M1K5du/w0rBb+ND9C\nW7ZscbG/tCVJn3zyiYv9ZbX66NWrl4svvvjiIHfooYe6+OGHHw5y/l1Zfv+48MILg+Py3Y8mTZoU\nlJ944gkXpz8fACgXzIwAAICoGIwAAICoGIwAAICorK6nOJpZVo947NixY1D+53/+ZxdfcMEFQW7Y\nsGEubtOmTVaNLDR/51VJevPNN12cvp3ygQceKEqbJClJkrK42CTbfuRffyFJP/zhD1180UUX5bdR\nJequu+4KyrfccouLp0+fnlOd5dKPAJQvZkYAAEBUDEYAAEBUebm1N/0kyD//+c8ufuGFF4Lcv/zL\nv7h45MiRLm7evHmt9e+7775BeY899nDx3Llzg9yUKVO22960xx9/vM4y4ijnjeC2bdvm4g8++MDF\nTz75ZHDcwoULi9YmAIiFmREAABAVgxEAABAVgxEAABBVXm7tLbRf/OIXQfmcc85xca679jYG5XJL\nZrb9qFmz8BKmnj17unj48OFBbvDgwTXWkb5d/JhjjnHxwIEDs2lGvcycOdPF/i3hkvT888+7+KWX\nXgpyGzdudLG/U2/6+it/9+BclUs/AlC+mBkBAABRMRgBAABRNYplmtatWwflVq1audif4pakDRs2\nFKVNxVAu0+sx+1HLli1dnF4Gygd/GcXfgViSqqqq8n6+XJRLPwJQvpgZAQAAUTEYAQAAUTEYAQAA\nUTWKa0YqVbms9dOP4iqXfgSgfDEzAgAAomIwAgAAoqpzmQYAAKDQmBkBAABRMRgBAABRMRgBAABR\nMRgBAABRMRgBAABRMRgBAABR/X9ZW/XgK1ciKAAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 720x432 with 10 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "uBboEZgAUDAT",
"colab_type": "code",
"colab": {}
},
"source": [
""
],
"execution_count": 0,
"outputs": []
}
]
}About
No description, website, or topics provided.
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published