vickygupta1996
commited on
Commit
•
b59c9b4
1
Parent(s):
2f3c2e4
Upload folder using huggingface_hub
Browse files- SignatureDetection/Training/.DS_Store +0 -0
- SignatureDetection/Training/.ipynb_checkpoints/Converting_Tobacco800_Dataset_to_YOLOv5_Format-checkpoint.ipynb +1204 -0
- SignatureDetection/Training/.ipynb_checkpoints/CustomYOLOv5_using_Tobcco800_dataset-checkpoint.ipynb +274 -0
- SignatureDetection/Training/.ipynb_checkpoints/SignDetection-checkpoint.ipynb +246 -0
- SignatureDetection/Training/Converting_Tobacco800_Dataset_to_YOLOv5_Format.ipynb +1223 -0
- SignatureDetection/Training/CustomYOLOv5_using_Tobcco800_dataset.ipynb +292 -0
- SignatureDetection/Training/SignDetection.ipynb +275 -0
- SignatureDetection/Training/tobacco_data.yaml +5 -0
SignatureDetection/Training/.DS_Store
ADDED
Binary file (6.15 kB). View file
|
|
SignatureDetection/Training/.ipynb_checkpoints/Converting_Tobacco800_Dataset_to_YOLOv5_Format-checkpoint.ipynb
ADDED
@@ -0,0 +1,1204 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"cells": [
|
3 |
+
{
|
4 |
+
"cell_type": "markdown",
|
5 |
+
"metadata": {},
|
6 |
+
"source": [
|
7 |
+
"# Importing Libraries"
|
8 |
+
]
|
9 |
+
},
|
10 |
+
{
|
11 |
+
"cell_type": "code",
|
12 |
+
"execution_count": 1,
|
13 |
+
"metadata": {},
|
14 |
+
"outputs": [],
|
15 |
+
"source": [
|
16 |
+
"import os, sys, random, shutil\n",
|
17 |
+
"import xml.etree.ElementTree as ET\n",
|
18 |
+
"from glob import glob\n",
|
19 |
+
"import pandas as pd\n",
|
20 |
+
"from shutil import copyfile\n",
|
21 |
+
"import pandas as pd\n",
|
22 |
+
"from sklearn import preprocessing, model_selection\n",
|
23 |
+
"import matplotlib.pyplot as plt\n",
|
24 |
+
"%matplotlib inline\n",
|
25 |
+
"from matplotlib import patches\n",
|
26 |
+
"import numpy as np"
|
27 |
+
]
|
28 |
+
},
|
29 |
+
{
|
30 |
+
"cell_type": "code",
|
31 |
+
"execution_count": 18,
|
32 |
+
"metadata": {},
|
33 |
+
"outputs": [],
|
34 |
+
"source": [
|
35 |
+
"import cv2"
|
36 |
+
]
|
37 |
+
},
|
38 |
+
{
|
39 |
+
"cell_type": "markdown",
|
40 |
+
"metadata": {},
|
41 |
+
"source": [
|
42 |
+
"Refer [this blog](https://towardsai.net/p/computer-vision/yolo-v5-object-detection-on-a-custom-dataset) for more information. Its an excellent resource. \n",
|
43 |
+
"Tobacco 800 dataset could be downloaded from [here](http://tc11.cvc.uab.es/datasets/Tobacco800_1)"
|
44 |
+
]
|
45 |
+
},
|
46 |
+
{
|
47 |
+
"cell_type": "markdown",
|
48 |
+
"metadata": {},
|
49 |
+
"source": [
|
50 |
+
"# Extracting information from Tobacco-800 XML files"
|
51 |
+
]
|
52 |
+
},
|
53 |
+
{
|
54 |
+
"cell_type": "code",
|
55 |
+
"execution_count": 7,
|
56 |
+
"metadata": {},
|
57 |
+
"outputs": [
|
58 |
+
{
|
59 |
+
"name": "stdout",
|
60 |
+
"output_type": "stream",
|
61 |
+
"text": [
|
62 |
+
"\u001b[34mimages\u001b[m\u001b[m/ \u001b[34mlabels\u001b[m\u001b[m/\r\n"
|
63 |
+
]
|
64 |
+
}
|
65 |
+
],
|
66 |
+
"source": [
|
67 |
+
"ls TobaccoData"
|
68 |
+
]
|
69 |
+
},
|
70 |
+
{
|
71 |
+
"cell_type": "code",
|
72 |
+
"execution_count": 12,
|
73 |
+
"metadata": {},
|
74 |
+
"outputs": [],
|
75 |
+
"source": [
|
76 |
+
"df = []\n",
|
77 |
+
"cnt = 0\n",
|
78 |
+
"\n",
|
79 |
+
"# refer the xml files to understand its structure and revist this code block.\n",
|
80 |
+
"annotations = sorted(glob('TobaccoData_Raw/groundtruth/*.xml'))\n",
|
81 |
+
"for file in annotations:\n",
|
82 |
+
" myroot = ET.parse(file).getroot()\n",
|
83 |
+
" # image filename is changed aah97e00-page02_1.tif -> 0.tif, so the previous filename is collected here.\n",
|
84 |
+
" prev_filename = myroot[0].attrib['src']\n",
|
85 |
+
" filename = str(cnt) + '.tif' # new filename based on the count (0.tif, 1.tif etc)\n",
|
86 |
+
" page_height, page_width = myroot[0][0].attrib['height'], myroot[0][0].attrib['width']\n",
|
87 |
+
" \n",
|
88 |
+
" row = []\n",
|
89 |
+
" # An image might have multiple items (zones) (logos and signs), so iterate through each zones\n",
|
90 |
+
" for zone in myroot[0][0]:\n",
|
91 |
+
" category = zone.attrib['gedi_type'] # type of zone (DLLogo/ DLSignature)\n",
|
92 |
+
" id = zone.attrib['id']\n",
|
93 |
+
" x, y = zone.attrib['col'], zone.attrib['row'] # x, y coordinate\n",
|
94 |
+
" w, h = zone.attrib['width'], zone.attrib['height'] # width and height of bbox\n",
|
95 |
+
" \n",
|
96 |
+
" # Signature have Authors, represeting whose signature it is\n",
|
97 |
+
" if category == 'DLSignature':\n",
|
98 |
+
" AuthorID = zone.attrib['AuthorID']\n",
|
99 |
+
" Overlapped = zone.attrib['Overlapped']\n",
|
100 |
+
" else:\n",
|
101 |
+
" # Logos don't have authors.\n",
|
102 |
+
" AuthorID, Overlapped = ('NA', 'NA')\n",
|
103 |
+
" row = [prev_filename, filename, page_height, page_width, AuthorID, Overlapped, category, id, x, y, w, h]\n",
|
104 |
+
" df.append(row)\n",
|
105 |
+
" cnt += 1"
|
106 |
+
]
|
107 |
+
},
|
108 |
+
{
|
109 |
+
"cell_type": "markdown",
|
110 |
+
"metadata": {},
|
111 |
+
"source": [
|
112 |
+
"**Saving the information to Dataframe**"
|
113 |
+
]
|
114 |
+
},
|
115 |
+
{
|
116 |
+
"cell_type": "code",
|
117 |
+
"execution_count": 13,
|
118 |
+
"metadata": {},
|
119 |
+
"outputs": [],
|
120 |
+
"source": [
|
121 |
+
"data = pd.DataFrame(df, columns=['prev_filename', 'filename', 'page_height', 'page_width', 'AuthorID', 'Overlapped', 'category', 'id', 'x', 'y', 'width', 'height'])"
|
122 |
+
]
|
123 |
+
},
|
124 |
+
{
|
125 |
+
"cell_type": "code",
|
126 |
+
"execution_count": 14,
|
127 |
+
"metadata": {},
|
128 |
+
"outputs": [
|
129 |
+
{
|
130 |
+
"data": {
|
131 |
+
"text/html": [
|
132 |
+
"<div>\n",
|
133 |
+
"<style scoped>\n",
|
134 |
+
" .dataframe tbody tr th:only-of-type {\n",
|
135 |
+
" vertical-align: middle;\n",
|
136 |
+
" }\n",
|
137 |
+
"\n",
|
138 |
+
" .dataframe tbody tr th {\n",
|
139 |
+
" vertical-align: top;\n",
|
140 |
+
" }\n",
|
141 |
+
"\n",
|
142 |
+
" .dataframe thead th {\n",
|
143 |
+
" text-align: right;\n",
|
144 |
+
" }\n",
|
145 |
+
"</style>\n",
|
146 |
+
"<table border=\"1\" class=\"dataframe\">\n",
|
147 |
+
" <thead>\n",
|
148 |
+
" <tr style=\"text-align: right;\">\n",
|
149 |
+
" <th></th>\n",
|
150 |
+
" <th>prev_filename</th>\n",
|
151 |
+
" <th>filename</th>\n",
|
152 |
+
" <th>page_height</th>\n",
|
153 |
+
" <th>page_width</th>\n",
|
154 |
+
" <th>AuthorID</th>\n",
|
155 |
+
" <th>Overlapped</th>\n",
|
156 |
+
" <th>category</th>\n",
|
157 |
+
" <th>id</th>\n",
|
158 |
+
" <th>x</th>\n",
|
159 |
+
" <th>y</th>\n",
|
160 |
+
" <th>width</th>\n",
|
161 |
+
" <th>height</th>\n",
|
162 |
+
" </tr>\n",
|
163 |
+
" </thead>\n",
|
164 |
+
" <tbody>\n",
|
165 |
+
" <tr>\n",
|
166 |
+
" <th>0</th>\n",
|
167 |
+
" <td>aah97e00-page02_1.tif</td>\n",
|
168 |
+
" <td>0.tif</td>\n",
|
169 |
+
" <td>3296</td>\n",
|
170 |
+
" <td>2560</td>\n",
|
171 |
+
" <td>NA</td>\n",
|
172 |
+
" <td>NA</td>\n",
|
173 |
+
" <td>DLLogo</td>\n",
|
174 |
+
" <td>None</td>\n",
|
175 |
+
" <td>1074</td>\n",
|
176 |
+
" <td>18</td>\n",
|
177 |
+
" <td>374</td>\n",
|
178 |
+
" <td>219</td>\n",
|
179 |
+
" </tr>\n",
|
180 |
+
" <tr>\n",
|
181 |
+
" <th>1</th>\n",
|
182 |
+
" <td>aah97e00-page02_2.tif</td>\n",
|
183 |
+
" <td>1.tif</td>\n",
|
184 |
+
" <td>3296</td>\n",
|
185 |
+
" <td>2560</td>\n",
|
186 |
+
" <td>Boder, J.B.</td>\n",
|
187 |
+
" <td>Yes</td>\n",
|
188 |
+
" <td>DLSignature</td>\n",
|
189 |
+
" <td>None</td>\n",
|
190 |
+
" <td>1409</td>\n",
|
191 |
+
" <td>793</td>\n",
|
192 |
+
" <td>659</td>\n",
|
193 |
+
" <td>361</td>\n",
|
194 |
+
" </tr>\n",
|
195 |
+
" <tr>\n",
|
196 |
+
" <th>2</th>\n",
|
197 |
+
" <td>aam09c00.tif</td>\n",
|
198 |
+
" <td>2.tif</td>\n",
|
199 |
+
" <td>2292</td>\n",
|
200 |
+
" <td>1728</td>\n",
|
201 |
+
" <td>Koplow, M.G.</td>\n",
|
202 |
+
" <td>Yes</td>\n",
|
203 |
+
" <td>DLSignature</td>\n",
|
204 |
+
" <td>None</td>\n",
|
205 |
+
" <td>821</td>\n",
|
206 |
+
" <td>1422</td>\n",
|
207 |
+
" <td>757</td>\n",
|
208 |
+
" <td>183</td>\n",
|
209 |
+
" </tr>\n",
|
210 |
+
" <tr>\n",
|
211 |
+
" <th>3</th>\n",
|
212 |
+
" <td>aao54e00_2.tif</td>\n",
|
213 |
+
" <td>4.tif</td>\n",
|
214 |
+
" <td>3296</td>\n",
|
215 |
+
" <td>2560</td>\n",
|
216 |
+
" <td>Landry, J.T.</td>\n",
|
217 |
+
" <td>Yes</td>\n",
|
218 |
+
" <td>DLSignature</td>\n",
|
219 |
+
" <td>None</td>\n",
|
220 |
+
" <td>1514</td>\n",
|
221 |
+
" <td>708</td>\n",
|
222 |
+
" <td>627</td>\n",
|
223 |
+
" <td>206</td>\n",
|
224 |
+
" </tr>\n",
|
225 |
+
" <tr>\n",
|
226 |
+
" <th>4</th>\n",
|
227 |
+
" <td>abm69c00.tif</td>\n",
|
228 |
+
" <td>5.tif</td>\n",
|
229 |
+
" <td>2292</td>\n",
|
230 |
+
" <td>1728</td>\n",
|
231 |
+
" <td>Feldman, J.D.</td>\n",
|
232 |
+
" <td>Yes</td>\n",
|
233 |
+
" <td>DLSignature</td>\n",
|
234 |
+
" <td>None</td>\n",
|
235 |
+
" <td>667</td>\n",
|
236 |
+
" <td>1279</td>\n",
|
237 |
+
" <td>617</td>\n",
|
238 |
+
" <td>110</td>\n",
|
239 |
+
" </tr>\n",
|
240 |
+
" </tbody>\n",
|
241 |
+
"</table>\n",
|
242 |
+
"</div>"
|
243 |
+
],
|
244 |
+
"text/plain": [
|
245 |
+
" prev_filename filename page_height page_width AuthorID \\\n",
|
246 |
+
"0 aah97e00-page02_1.tif 0.tif 3296 2560 NA \n",
|
247 |
+
"1 aah97e00-page02_2.tif 1.tif 3296 2560 Boder, J.B. \n",
|
248 |
+
"2 aam09c00.tif 2.tif 2292 1728 Koplow, M.G. \n",
|
249 |
+
"3 aao54e00_2.tif 4.tif 3296 2560 Landry, J.T. \n",
|
250 |
+
"4 abm69c00.tif 5.tif 2292 1728 Feldman, J.D. \n",
|
251 |
+
"\n",
|
252 |
+
" Overlapped category id x y width height \n",
|
253 |
+
"0 NA DLLogo None 1074 18 374 219 \n",
|
254 |
+
"1 Yes DLSignature None 1409 793 659 361 \n",
|
255 |
+
"2 Yes DLSignature None 821 1422 757 183 \n",
|
256 |
+
"3 Yes DLSignature None 1514 708 627 206 \n",
|
257 |
+
"4 Yes DLSignature None 667 1279 617 110 "
|
258 |
+
]
|
259 |
+
},
|
260 |
+
"execution_count": 14,
|
261 |
+
"metadata": {},
|
262 |
+
"output_type": "execute_result"
|
263 |
+
}
|
264 |
+
],
|
265 |
+
"source": [
|
266 |
+
"data.head()"
|
267 |
+
]
|
268 |
+
},
|
269 |
+
{
|
270 |
+
"cell_type": "code",
|
271 |
+
"execution_count": 15,
|
272 |
+
"metadata": {},
|
273 |
+
"outputs": [
|
274 |
+
{
|
275 |
+
"data": {
|
276 |
+
"text/plain": [
|
277 |
+
"(page_height 3584\n",
|
278 |
+
" page_width 2720\n",
|
279 |
+
" dtype: object,\n",
|
280 |
+
" page_height 1575\n",
|
281 |
+
" page_width 1200\n",
|
282 |
+
" dtype: object)"
|
283 |
+
]
|
284 |
+
},
|
285 |
+
"execution_count": 15,
|
286 |
+
"metadata": {},
|
287 |
+
"output_type": "execute_result"
|
288 |
+
}
|
289 |
+
],
|
290 |
+
"source": [
|
291 |
+
"test = data[['page_height', 'page_width']]\n",
|
292 |
+
"test.max(), test.min()"
|
293 |
+
]
|
294 |
+
},
|
295 |
+
{
|
296 |
+
"cell_type": "markdown",
|
297 |
+
"metadata": {},
|
298 |
+
"source": [
|
299 |
+
"**Scaling the image to reduce training time** \n",
|
300 |
+
"To save on training time, resize the images to a maximum height and width of 640 and 480. While resizing the image, the bounding box cordinates also changes. This code computes how much each image is shrinken and updates the bounding box coordinates appropriately."
|
301 |
+
]
|
302 |
+
},
|
303 |
+
{
|
304 |
+
"cell_type": "code",
|
305 |
+
"execution_count": null,
|
306 |
+
"metadata": {},
|
307 |
+
"outputs": [],
|
308 |
+
"source": [
|
309 |
+
"BASE_DIR = 'TobaccoData_Raw/pages/'\n",
|
310 |
+
"SAVE_PATH = 'TobaccoData_Raw/scaled/'\n",
|
311 |
+
"# os.mkdir(SAVE_PATH)\n",
|
312 |
+
"\n",
|
313 |
+
"def scale_image(df):\n",
|
314 |
+
" df_new = []\n",
|
315 |
+
" filename = df.prev_filename\n",
|
316 |
+
" X, Y, W, H = map(int, df.x), map(int, df.y), map(int, df.width), map(int, df.height)\n",
|
317 |
+
" for file, x, y, w, h in zip(filename, X, Y, W, H):\n",
|
318 |
+
" image_path = BASE_DIR + file\n",
|
319 |
+
" img = cv2.imread(image_path, 1)\n",
|
320 |
+
" page_height, page_width = img.shape[:2]\n",
|
321 |
+
" max_height = 640\n",
|
322 |
+
" max_width = 480\n",
|
323 |
+
" \n",
|
324 |
+
" # computes the scaling factor\n",
|
325 |
+
" if max_height < page_height or max_width < page_width:\n",
|
326 |
+
" scaling_factor = max_height / float(page_height)\n",
|
327 |
+
" if max_width/float(page_width) < scaling_factor:\n",
|
328 |
+
" scaling_factor = max_width / float(page_width)\n",
|
329 |
+
" # scale the image with the scaling factor\n",
|
330 |
+
" img = cv2.resize(img, None, fx=scaling_factor, fy=scaling_factor, interpolation=cv2.INTER_AREA)\n",
|
331 |
+
" jpg_filename = file[:-4] + '.jpg'\n",
|
332 |
+
" new_file_path = SAVE_PATH + jpg_filename\n",
|
333 |
+
" cv2.imwrite(new_file_path, img) # write the scales image\n",
|
334 |
+
" \n",
|
335 |
+
" # save new page height and width\n",
|
336 |
+
" page_height, page_width = page_height*scaling_factor, page_width*scaling_factor\n",
|
337 |
+
" # compute new x, y, w, h coordinates after scaling\n",
|
338 |
+
" x, y, w, h= int(x*scaling_factor), int(y*scaling_factor), int(w*scaling_factor), int(h*scaling_factor)\n",
|
339 |
+
" row = [jpg_filename, x, y, w, h, page_height, page_width]\n",
|
340 |
+
" df_new.append(row)\n",
|
341 |
+
" return df_new\n",
|
342 |
+
"scaled_data = scale_image(data)"
|
343 |
+
]
|
344 |
+
},
|
345 |
+
{
|
346 |
+
"cell_type": "markdown",
|
347 |
+
"metadata": {},
|
348 |
+
"source": [
|
349 |
+
"**Adding the information regarding the scaling to the df**"
|
350 |
+
]
|
351 |
+
},
|
352 |
+
{
|
353 |
+
"cell_type": "code",
|
354 |
+
"execution_count": 140,
|
355 |
+
"metadata": {},
|
356 |
+
"outputs": [
|
357 |
+
{
|
358 |
+
"data": {
|
359 |
+
"text/html": [
|
360 |
+
"<div>\n",
|
361 |
+
"<style scoped>\n",
|
362 |
+
" .dataframe tbody tr th:only-of-type {\n",
|
363 |
+
" vertical-align: middle;\n",
|
364 |
+
" }\n",
|
365 |
+
"\n",
|
366 |
+
" .dataframe tbody tr th {\n",
|
367 |
+
" vertical-align: top;\n",
|
368 |
+
" }\n",
|
369 |
+
"\n",
|
370 |
+
" .dataframe thead th {\n",
|
371 |
+
" text-align: right;\n",
|
372 |
+
" }\n",
|
373 |
+
"</style>\n",
|
374 |
+
"<table border=\"1\" class=\"dataframe\">\n",
|
375 |
+
" <thead>\n",
|
376 |
+
" <tr style=\"text-align: right;\">\n",
|
377 |
+
" <th></th>\n",
|
378 |
+
" <th>prev_filename</th>\n",
|
379 |
+
" <th>filename</th>\n",
|
380 |
+
" <th>page_height</th>\n",
|
381 |
+
" <th>page_width</th>\n",
|
382 |
+
" <th>AuthorID</th>\n",
|
383 |
+
" <th>Overlapped</th>\n",
|
384 |
+
" <th>category</th>\n",
|
385 |
+
" <th>id</th>\n",
|
386 |
+
" <th>x</th>\n",
|
387 |
+
" <th>y</th>\n",
|
388 |
+
" <th>width</th>\n",
|
389 |
+
" <th>height</th>\n",
|
390 |
+
" <th>new_filename</th>\n",
|
391 |
+
" <th>x_scaled</th>\n",
|
392 |
+
" <th>y_scaled</th>\n",
|
393 |
+
" <th>w_scaled</th>\n",
|
394 |
+
" <th>h_scaled</th>\n",
|
395 |
+
" <th>page_height_scaled</th>\n",
|
396 |
+
" <th>page_width_scaled</th>\n",
|
397 |
+
" </tr>\n",
|
398 |
+
" </thead>\n",
|
399 |
+
" <tbody>\n",
|
400 |
+
" <tr>\n",
|
401 |
+
" <th>0</th>\n",
|
402 |
+
" <td>aah97e00-page02_1.tif</td>\n",
|
403 |
+
" <td>0.tif</td>\n",
|
404 |
+
" <td>3296</td>\n",
|
405 |
+
" <td>2560</td>\n",
|
406 |
+
" <td>NA</td>\n",
|
407 |
+
" <td>NA</td>\n",
|
408 |
+
" <td>DLLogo</td>\n",
|
409 |
+
" <td>None</td>\n",
|
410 |
+
" <td>1074</td>\n",
|
411 |
+
" <td>18</td>\n",
|
412 |
+
" <td>374</td>\n",
|
413 |
+
" <td>219</td>\n",
|
414 |
+
" <td>aah97e00-page02_1.jpg</td>\n",
|
415 |
+
" <td>201</td>\n",
|
416 |
+
" <td>3</td>\n",
|
417 |
+
" <td>70</td>\n",
|
418 |
+
" <td>41</td>\n",
|
419 |
+
" <td>618.000000</td>\n",
|
420 |
+
" <td>480.0</td>\n",
|
421 |
+
" </tr>\n",
|
422 |
+
" <tr>\n",
|
423 |
+
" <th>1</th>\n",
|
424 |
+
" <td>aah97e00-page02_2.tif</td>\n",
|
425 |
+
" <td>1.tif</td>\n",
|
426 |
+
" <td>3296</td>\n",
|
427 |
+
" <td>2560</td>\n",
|
428 |
+
" <td>Boder, J.B.</td>\n",
|
429 |
+
" <td>Yes</td>\n",
|
430 |
+
" <td>DLSignature</td>\n",
|
431 |
+
" <td>None</td>\n",
|
432 |
+
" <td>1409</td>\n",
|
433 |
+
" <td>793</td>\n",
|
434 |
+
" <td>659</td>\n",
|
435 |
+
" <td>361</td>\n",
|
436 |
+
" <td>aah97e00-page02_2.jpg</td>\n",
|
437 |
+
" <td>264</td>\n",
|
438 |
+
" <td>148</td>\n",
|
439 |
+
" <td>123</td>\n",
|
440 |
+
" <td>67</td>\n",
|
441 |
+
" <td>618.000000</td>\n",
|
442 |
+
" <td>480.0</td>\n",
|
443 |
+
" </tr>\n",
|
444 |
+
" <tr>\n",
|
445 |
+
" <th>2</th>\n",
|
446 |
+
" <td>aam09c00.tif</td>\n",
|
447 |
+
" <td>2.tif</td>\n",
|
448 |
+
" <td>2292</td>\n",
|
449 |
+
" <td>1728</td>\n",
|
450 |
+
" <td>Koplow, M.G.</td>\n",
|
451 |
+
" <td>Yes</td>\n",
|
452 |
+
" <td>DLSignature</td>\n",
|
453 |
+
" <td>None</td>\n",
|
454 |
+
" <td>821</td>\n",
|
455 |
+
" <td>1422</td>\n",
|
456 |
+
" <td>757</td>\n",
|
457 |
+
" <td>183</td>\n",
|
458 |
+
" <td>aam09c00.jpg</td>\n",
|
459 |
+
" <td>228</td>\n",
|
460 |
+
" <td>395</td>\n",
|
461 |
+
" <td>210</td>\n",
|
462 |
+
" <td>50</td>\n",
|
463 |
+
" <td>636.666667</td>\n",
|
464 |
+
" <td>480.0</td>\n",
|
465 |
+
" </tr>\n",
|
466 |
+
" <tr>\n",
|
467 |
+
" <th>3</th>\n",
|
468 |
+
" <td>aao54e00_2.tif</td>\n",
|
469 |
+
" <td>4.tif</td>\n",
|
470 |
+
" <td>3296</td>\n",
|
471 |
+
" <td>2560</td>\n",
|
472 |
+
" <td>Landry, J.T.</td>\n",
|
473 |
+
" <td>Yes</td>\n",
|
474 |
+
" <td>DLSignature</td>\n",
|
475 |
+
" <td>None</td>\n",
|
476 |
+
" <td>1514</td>\n",
|
477 |
+
" <td>708</td>\n",
|
478 |
+
" <td>627</td>\n",
|
479 |
+
" <td>206</td>\n",
|
480 |
+
" <td>aao54e00_2.jpg</td>\n",
|
481 |
+
" <td>283</td>\n",
|
482 |
+
" <td>132</td>\n",
|
483 |
+
" <td>117</td>\n",
|
484 |
+
" <td>38</td>\n",
|
485 |
+
" <td>618.000000</td>\n",
|
486 |
+
" <td>480.0</td>\n",
|
487 |
+
" </tr>\n",
|
488 |
+
" <tr>\n",
|
489 |
+
" <th>4</th>\n",
|
490 |
+
" <td>abm69c00.tif</td>\n",
|
491 |
+
" <td>5.tif</td>\n",
|
492 |
+
" <td>2292</td>\n",
|
493 |
+
" <td>1728</td>\n",
|
494 |
+
" <td>Feldman, J.D.</td>\n",
|
495 |
+
" <td>Yes</td>\n",
|
496 |
+
" <td>DLSignature</td>\n",
|
497 |
+
" <td>None</td>\n",
|
498 |
+
" <td>667</td>\n",
|
499 |
+
" <td>1279</td>\n",
|
500 |
+
" <td>617</td>\n",
|
501 |
+
" <td>110</td>\n",
|
502 |
+
" <td>abm69c00.jpg</td>\n",
|
503 |
+
" <td>185</td>\n",
|
504 |
+
" <td>355</td>\n",
|
505 |
+
" <td>171</td>\n",
|
506 |
+
" <td>30</td>\n",
|
507 |
+
" <td>636.666667</td>\n",
|
508 |
+
" <td>480.0</td>\n",
|
509 |
+
" </tr>\n",
|
510 |
+
" <tr>\n",
|
511 |
+
" <th>5</th>\n",
|
512 |
+
" <td>acr64d00.tif</td>\n",
|
513 |
+
" <td>6.tif</td>\n",
|
514 |
+
" <td>2292</td>\n",
|
515 |
+
" <td>1728</td>\n",
|
516 |
+
" <td>Boffa, J.R.</td>\n",
|
517 |
+
" <td>Yes</td>\n",
|
518 |
+
" <td>DLSignature</td>\n",
|
519 |
+
" <td>None</td>\n",
|
520 |
+
" <td>886</td>\n",
|
521 |
+
" <td>1801</td>\n",
|
522 |
+
" <td>463</td>\n",
|
523 |
+
" <td>181</td>\n",
|
524 |
+
" <td>acr64d00.jpg</td>\n",
|
525 |
+
" <td>246</td>\n",
|
526 |
+
" <td>500</td>\n",
|
527 |
+
" <td>128</td>\n",
|
528 |
+
" <td>50</td>\n",
|
529 |
+
" <td>636.666667</td>\n",
|
530 |
+
" <td>480.0</td>\n",
|
531 |
+
" </tr>\n",
|
532 |
+
" <tr>\n",
|
533 |
+
" <th>6</th>\n",
|
534 |
+
" <td>adh36e00-page2_1.tif</td>\n",
|
535 |
+
" <td>7.tif</td>\n",
|
536 |
+
" <td>3245</td>\n",
|
537 |
+
" <td>2560</td>\n",
|
538 |
+
" <td>NA</td>\n",
|
539 |
+
" <td>NA</td>\n",
|
540 |
+
" <td>DLLogo</td>\n",
|
541 |
+
" <td>None</td>\n",
|
542 |
+
" <td>1181</td>\n",
|
543 |
+
" <td>18</td>\n",
|
544 |
+
" <td>359</td>\n",
|
545 |
+
" <td>219</td>\n",
|
546 |
+
" <td>adh36e00-page2_1.jpg</td>\n",
|
547 |
+
" <td>221</td>\n",
|
548 |
+
" <td>3</td>\n",
|
549 |
+
" <td>67</td>\n",
|
550 |
+
" <td>41</td>\n",
|
551 |
+
" <td>608.437500</td>\n",
|
552 |
+
" <td>480.0</td>\n",
|
553 |
+
" </tr>\n",
|
554 |
+
" <tr>\n",
|
555 |
+
" <th>7</th>\n",
|
556 |
+
" <td>adh36e00-page2_2.tif</td>\n",
|
557 |
+
" <td>8.tif</td>\n",
|
558 |
+
" <td>3246</td>\n",
|
559 |
+
" <td>2560</td>\n",
|
560 |
+
" <td>Krivisky, B.M.</td>\n",
|
561 |
+
" <td>Yes</td>\n",
|
562 |
+
" <td>DLSignature</td>\n",
|
563 |
+
" <td>None</td>\n",
|
564 |
+
" <td>1232</td>\n",
|
565 |
+
" <td>2399</td>\n",
|
566 |
+
" <td>896</td>\n",
|
567 |
+
" <td>431</td>\n",
|
568 |
+
" <td>adh36e00-page2_2.jpg</td>\n",
|
569 |
+
" <td>231</td>\n",
|
570 |
+
" <td>449</td>\n",
|
571 |
+
" <td>168</td>\n",
|
572 |
+
" <td>80</td>\n",
|
573 |
+
" <td>608.625000</td>\n",
|
574 |
+
" <td>480.0</td>\n",
|
575 |
+
" </tr>\n",
|
576 |
+
" <tr>\n",
|
577 |
+
" <th>8</th>\n",
|
578 |
+
" <td>adh36e00_1.tif</td>\n",
|
579 |
+
" <td>9.tif</td>\n",
|
580 |
+
" <td>3245</td>\n",
|
581 |
+
" <td>2560</td>\n",
|
582 |
+
" <td>NA</td>\n",
|
583 |
+
" <td>NA</td>\n",
|
584 |
+
" <td>DLLogo</td>\n",
|
585 |
+
" <td>None</td>\n",
|
586 |
+
" <td>1187</td>\n",
|
587 |
+
" <td>18</td>\n",
|
588 |
+
" <td>347</td>\n",
|
589 |
+
" <td>219</td>\n",
|
590 |
+
" <td>adh36e00_1.jpg</td>\n",
|
591 |
+
" <td>222</td>\n",
|
592 |
+
" <td>3</td>\n",
|
593 |
+
" <td>65</td>\n",
|
594 |
+
" <td>41</td>\n",
|
595 |
+
" <td>608.437500</td>\n",
|
596 |
+
" <td>480.0</td>\n",
|
597 |
+
" </tr>\n",
|
598 |
+
" <tr>\n",
|
599 |
+
" <th>9</th>\n",
|
600 |
+
" <td>adh36e00_2.tif</td>\n",
|
601 |
+
" <td>10.tif</td>\n",
|
602 |
+
" <td>3246</td>\n",
|
603 |
+
" <td>2560</td>\n",
|
604 |
+
" <td>Krivisky, B.M.</td>\n",
|
605 |
+
" <td>Yes</td>\n",
|
606 |
+
" <td>DLSignature</td>\n",
|
607 |
+
" <td>None</td>\n",
|
608 |
+
" <td>1239</td>\n",
|
609 |
+
" <td>2403</td>\n",
|
610 |
+
" <td>889</td>\n",
|
611 |
+
" <td>434</td>\n",
|
612 |
+
" <td>adh36e00_2.jpg</td>\n",
|
613 |
+
" <td>232</td>\n",
|
614 |
+
" <td>450</td>\n",
|
615 |
+
" <td>166</td>\n",
|
616 |
+
" <td>81</td>\n",
|
617 |
+
" <td>608.625000</td>\n",
|
618 |
+
" <td>480.0</td>\n",
|
619 |
+
" </tr>\n",
|
620 |
+
" </tbody>\n",
|
621 |
+
"</table>\n",
|
622 |
+
"</div>"
|
623 |
+
],
|
624 |
+
"text/plain": [
|
625 |
+
" prev_filename filename page_height page_width AuthorID \\\n",
|
626 |
+
"0 aah97e00-page02_1.tif 0.tif 3296 2560 NA \n",
|
627 |
+
"1 aah97e00-page02_2.tif 1.tif 3296 2560 Boder, J.B. \n",
|
628 |
+
"2 aam09c00.tif 2.tif 2292 1728 Koplow, M.G. \n",
|
629 |
+
"3 aao54e00_2.tif 4.tif 3296 2560 Landry, J.T. \n",
|
630 |
+
"4 abm69c00.tif 5.tif 2292 1728 Feldman, J.D. \n",
|
631 |
+
"5 acr64d00.tif 6.tif 2292 1728 Boffa, J.R. \n",
|
632 |
+
"6 adh36e00-page2_1.tif 7.tif 3245 2560 NA \n",
|
633 |
+
"7 adh36e00-page2_2.tif 8.tif 3246 2560 Krivisky, B.M. \n",
|
634 |
+
"8 adh36e00_1.tif 9.tif 3245 2560 NA \n",
|
635 |
+
"9 adh36e00_2.tif 10.tif 3246 2560 Krivisky, B.M. \n",
|
636 |
+
"\n",
|
637 |
+
" Overlapped category id x y width height \\\n",
|
638 |
+
"0 NA DLLogo None 1074 18 374 219 \n",
|
639 |
+
"1 Yes DLSignature None 1409 793 659 361 \n",
|
640 |
+
"2 Yes DLSignature None 821 1422 757 183 \n",
|
641 |
+
"3 Yes DLSignature None 1514 708 627 206 \n",
|
642 |
+
"4 Yes DLSignature None 667 1279 617 110 \n",
|
643 |
+
"5 Yes DLSignature None 886 1801 463 181 \n",
|
644 |
+
"6 NA DLLogo None 1181 18 359 219 \n",
|
645 |
+
"7 Yes DLSignature None 1232 2399 896 431 \n",
|
646 |
+
"8 NA DLLogo None 1187 18 347 219 \n",
|
647 |
+
"9 Yes DLSignature None 1239 2403 889 434 \n",
|
648 |
+
"\n",
|
649 |
+
" new_filename x_scaled y_scaled w_scaled h_scaled \\\n",
|
650 |
+
"0 aah97e00-page02_1.jpg 201 3 70 41 \n",
|
651 |
+
"1 aah97e00-page02_2.jpg 264 148 123 67 \n",
|
652 |
+
"2 aam09c00.jpg 228 395 210 50 \n",
|
653 |
+
"3 aao54e00_2.jpg 283 132 117 38 \n",
|
654 |
+
"4 abm69c00.jpg 185 355 171 30 \n",
|
655 |
+
"5 acr64d00.jpg 246 500 128 50 \n",
|
656 |
+
"6 adh36e00-page2_1.jpg 221 3 67 41 \n",
|
657 |
+
"7 adh36e00-page2_2.jpg 231 449 168 80 \n",
|
658 |
+
"8 adh36e00_1.jpg 222 3 65 41 \n",
|
659 |
+
"9 adh36e00_2.jpg 232 450 166 81 \n",
|
660 |
+
"\n",
|
661 |
+
" page_height_scaled page_width_scaled \n",
|
662 |
+
"0 618.000000 480.0 \n",
|
663 |
+
"1 618.000000 480.0 \n",
|
664 |
+
"2 636.666667 480.0 \n",
|
665 |
+
"3 618.000000 480.0 \n",
|
666 |
+
"4 636.666667 480.0 \n",
|
667 |
+
"5 636.666667 480.0 \n",
|
668 |
+
"6 608.437500 480.0 \n",
|
669 |
+
"7 608.625000 480.0 \n",
|
670 |
+
"8 608.437500 480.0 \n",
|
671 |
+
"9 608.625000 480.0 "
|
672 |
+
]
|
673 |
+
},
|
674 |
+
"execution_count": 140,
|
675 |
+
"metadata": {},
|
676 |
+
"output_type": "execute_result"
|
677 |
+
}
|
678 |
+
],
|
679 |
+
"source": [
|
680 |
+
"scaled_data = list(zip(*scaled_data))\n",
|
681 |
+
"\n",
|
682 |
+
"data['new_filename'] = scaled_data[0]\n",
|
683 |
+
"data['x_scaled'] = scaled_data[1]\n",
|
684 |
+
"data['y_scaled'] = scaled_data[2]\n",
|
685 |
+
"data['w_scaled'] = scaled_data[3]\n",
|
686 |
+
"data['h_scaled'] = scaled_data[4]\n",
|
687 |
+
"data['page_height_scaled'] = scaled_data[5]\n",
|
688 |
+
"data['page_width_scaled'] = scaled_data[6]\n",
|
689 |
+
"data.head(10)"
|
690 |
+
]
|
691 |
+
},
|
692 |
+
{
|
693 |
+
"cell_type": "markdown",
|
694 |
+
"metadata": {},
|
695 |
+
"source": [
|
696 |
+
"**Testing the scaled image**"
|
697 |
+
]
|
698 |
+
},
|
699 |
+
{
|
700 |
+
"cell_type": "code",
|
701 |
+
"execution_count": 141,
|
702 |
+
"metadata": {},
|
703 |
+
"outputs": [
|
704 |
+
{
|
705 |
+
"data": {
|
706 |
+
"text/plain": [
|
707 |
+
"<matplotlib.image.AxesImage at 0x7f57a14e0310>"
|
708 |
+
]
|
709 |
+
},
|
710 |
+
"execution_count": 141,
|
711 |
+
"metadata": {},
|
712 |
+
"output_type": "execute_result"
|
713 |
+
},
|
714 |
+
{
|
715 |
+
"data": {
|
716 |
+
"image/png": "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\n",
|
717 |
+
"text/plain": [
|
718 |
+
"<Figure size 432x432 with 1 Axes>"
|
719 |
+
]
|
720 |
+
},
|
721 |
+
"metadata": {
|
722 |
+
"needs_background": "light"
|
723 |
+
},
|
724 |
+
"output_type": "display_data"
|
725 |
+
}
|
726 |
+
],
|
727 |
+
"source": [
|
728 |
+
"img = cv2.imread('tobacco_data_zhugy/scaled/agw39d00.jpg')\n",
|
729 |
+
"\n",
|
730 |
+
"img = cv2.rectangle(img, (90, 348), (90+120, 348+26), (255, 0, 0), 1)\n",
|
731 |
+
"plt.figure(figsize=(6, 6))\n",
|
732 |
+
"plt.imshow(img)"
|
733 |
+
]
|
734 |
+
},
|
735 |
+
{
|
736 |
+
"cell_type": "markdown",
|
737 |
+
"metadata": {},
|
738 |
+
"source": [
|
739 |
+
"**Saving to CSV file**"
|
740 |
+
]
|
741 |
+
},
|
742 |
+
{
|
743 |
+
"cell_type": "code",
|
744 |
+
"execution_count": 145,
|
745 |
+
"metadata": {},
|
746 |
+
"outputs": [
|
747 |
+
{
|
748 |
+
"data": {
|
749 |
+
"text/html": [
|
750 |
+
"<div>\n",
|
751 |
+
"<style scoped>\n",
|
752 |
+
" .dataframe tbody tr th:only-of-type {\n",
|
753 |
+
" vertical-align: middle;\n",
|
754 |
+
" }\n",
|
755 |
+
"\n",
|
756 |
+
" .dataframe tbody tr th {\n",
|
757 |
+
" vertical-align: top;\n",
|
758 |
+
" }\n",
|
759 |
+
"\n",
|
760 |
+
" .dataframe thead th {\n",
|
761 |
+
" text-align: right;\n",
|
762 |
+
" }\n",
|
763 |
+
"</style>\n",
|
764 |
+
"<table border=\"1\" class=\"dataframe\">\n",
|
765 |
+
" <thead>\n",
|
766 |
+
" <tr style=\"text-align: right;\">\n",
|
767 |
+
" <th></th>\n",
|
768 |
+
" <th>prev_filename</th>\n",
|
769 |
+
" <th>filename</th>\n",
|
770 |
+
" <th>page_height</th>\n",
|
771 |
+
" <th>page_width</th>\n",
|
772 |
+
" <th>AuthorID</th>\n",
|
773 |
+
" <th>Overlapped</th>\n",
|
774 |
+
" <th>category</th>\n",
|
775 |
+
" <th>id</th>\n",
|
776 |
+
" <th>x</th>\n",
|
777 |
+
" <th>y</th>\n",
|
778 |
+
" <th>width</th>\n",
|
779 |
+
" <th>height</th>\n",
|
780 |
+
" <th>new_filename</th>\n",
|
781 |
+
" <th>x_scaled</th>\n",
|
782 |
+
" <th>y_scaled</th>\n",
|
783 |
+
" <th>w_scaled</th>\n",
|
784 |
+
" <th>h_scaled</th>\n",
|
785 |
+
" <th>page_height_scaled</th>\n",
|
786 |
+
" <th>page_width_scaled</th>\n",
|
787 |
+
" </tr>\n",
|
788 |
+
" </thead>\n",
|
789 |
+
" <tbody>\n",
|
790 |
+
" <tr>\n",
|
791 |
+
" <th>0</th>\n",
|
792 |
+
" <td>aah97e00-page02_1.tif</td>\n",
|
793 |
+
" <td>0.tif</td>\n",
|
794 |
+
" <td>3296</td>\n",
|
795 |
+
" <td>2560</td>\n",
|
796 |
+
" <td>NA</td>\n",
|
797 |
+
" <td>NA</td>\n",
|
798 |
+
" <td>DLLogo</td>\n",
|
799 |
+
" <td>None</td>\n",
|
800 |
+
" <td>1074</td>\n",
|
801 |
+
" <td>18</td>\n",
|
802 |
+
" <td>374</td>\n",
|
803 |
+
" <td>219</td>\n",
|
804 |
+
" <td>aah97e00-page02_1.jpg</td>\n",
|
805 |
+
" <td>201</td>\n",
|
806 |
+
" <td>3</td>\n",
|
807 |
+
" <td>70</td>\n",
|
808 |
+
" <td>41</td>\n",
|
809 |
+
" <td>618.000000</td>\n",
|
810 |
+
" <td>480.0</td>\n",
|
811 |
+
" </tr>\n",
|
812 |
+
" <tr>\n",
|
813 |
+
" <th>1</th>\n",
|
814 |
+
" <td>aah97e00-page02_2.tif</td>\n",
|
815 |
+
" <td>1.tif</td>\n",
|
816 |
+
" <td>3296</td>\n",
|
817 |
+
" <td>2560</td>\n",
|
818 |
+
" <td>Boder, J.B.</td>\n",
|
819 |
+
" <td>Yes</td>\n",
|
820 |
+
" <td>DLSignature</td>\n",
|
821 |
+
" <td>None</td>\n",
|
822 |
+
" <td>1409</td>\n",
|
823 |
+
" <td>793</td>\n",
|
824 |
+
" <td>659</td>\n",
|
825 |
+
" <td>361</td>\n",
|
826 |
+
" <td>aah97e00-page02_2.jpg</td>\n",
|
827 |
+
" <td>264</td>\n",
|
828 |
+
" <td>148</td>\n",
|
829 |
+
" <td>123</td>\n",
|
830 |
+
" <td>67</td>\n",
|
831 |
+
" <td>618.000000</td>\n",
|
832 |
+
" <td>480.0</td>\n",
|
833 |
+
" </tr>\n",
|
834 |
+
" <tr>\n",
|
835 |
+
" <th>2</th>\n",
|
836 |
+
" <td>aam09c00.tif</td>\n",
|
837 |
+
" <td>2.tif</td>\n",
|
838 |
+
" <td>2292</td>\n",
|
839 |
+
" <td>1728</td>\n",
|
840 |
+
" <td>Koplow, M.G.</td>\n",
|
841 |
+
" <td>Yes</td>\n",
|
842 |
+
" <td>DLSignature</td>\n",
|
843 |
+
" <td>None</td>\n",
|
844 |
+
" <td>821</td>\n",
|
845 |
+
" <td>1422</td>\n",
|
846 |
+
" <td>757</td>\n",
|
847 |
+
" <td>183</td>\n",
|
848 |
+
" <td>aam09c00.jpg</td>\n",
|
849 |
+
" <td>228</td>\n",
|
850 |
+
" <td>395</td>\n",
|
851 |
+
" <td>210</td>\n",
|
852 |
+
" <td>50</td>\n",
|
853 |
+
" <td>636.666667</td>\n",
|
854 |
+
" <td>480.0</td>\n",
|
855 |
+
" </tr>\n",
|
856 |
+
" </tbody>\n",
|
857 |
+
"</table>\n",
|
858 |
+
"</div>"
|
859 |
+
],
|
860 |
+
"text/plain": [
|
861 |
+
" prev_filename filename page_height page_width AuthorID \\\n",
|
862 |
+
"0 aah97e00-page02_1.tif 0.tif 3296 2560 NA \n",
|
863 |
+
"1 aah97e00-page02_2.tif 1.tif 3296 2560 Boder, J.B. \n",
|
864 |
+
"2 aam09c00.tif 2.tif 2292 1728 Koplow, M.G. \n",
|
865 |
+
"\n",
|
866 |
+
" Overlapped category id x y width height \\\n",
|
867 |
+
"0 NA DLLogo None 1074 18 374 219 \n",
|
868 |
+
"1 Yes DLSignature None 1409 793 659 361 \n",
|
869 |
+
"2 Yes DLSignature None 821 1422 757 183 \n",
|
870 |
+
"\n",
|
871 |
+
" new_filename x_scaled y_scaled w_scaled h_scaled \\\n",
|
872 |
+
"0 aah97e00-page02_1.jpg 201 3 70 41 \n",
|
873 |
+
"1 aah97e00-page02_2.jpg 264 148 123 67 \n",
|
874 |
+
"2 aam09c00.jpg 228 395 210 50 \n",
|
875 |
+
"\n",
|
876 |
+
" page_height_scaled page_width_scaled \n",
|
877 |
+
"0 618.000000 480.0 \n",
|
878 |
+
"1 618.000000 480.0 \n",
|
879 |
+
"2 636.666667 480.0 "
|
880 |
+
]
|
881 |
+
},
|
882 |
+
"execution_count": 145,
|
883 |
+
"metadata": {},
|
884 |
+
"output_type": "execute_result"
|
885 |
+
}
|
886 |
+
],
|
887 |
+
"source": [
|
888 |
+
"data[['prev_filename', 'new_filename', 'filename', 'page_height', 'page_width', 'page_height_scaled', 'page_width_scaled', 'AuthorID', 'Overlapped', 'category', 'id', 'x', 'y', 'width', 'height', 'x_scaled', 'y_scaled', 'w_scaled', 'h_scaled']].to_csv('tobacco_data_zhugy/tobacco_cleaned.csv', index=False)\n",
|
889 |
+
"data.head(3)"
|
890 |
+
]
|
891 |
+
},
|
892 |
+
{
|
893 |
+
"cell_type": "markdown",
|
894 |
+
"metadata": {},
|
895 |
+
"source": [
|
896 |
+
"# Converting data to YOLOv5 format"
|
897 |
+
]
|
898 |
+
},
|
899 |
+
{
|
900 |
+
"cell_type": "code",
|
901 |
+
"execution_count": 150,
|
902 |
+
"metadata": {},
|
903 |
+
"outputs": [
|
904 |
+
{
|
905 |
+
"name": "stdout",
|
906 |
+
"output_type": "stream",
|
907 |
+
"text": [
|
908 |
+
"['DLLogo' 'DLSignature']\n"
|
909 |
+
]
|
910 |
+
},
|
911 |
+
{
|
912 |
+
"data": {
|
913 |
+
"text/html": [
|
914 |
+
"<div>\n",
|
915 |
+
"<style scoped>\n",
|
916 |
+
" .dataframe tbody tr th:only-of-type {\n",
|
917 |
+
" vertical-align: middle;\n",
|
918 |
+
" }\n",
|
919 |
+
"\n",
|
920 |
+
" .dataframe tbody tr th {\n",
|
921 |
+
" vertical-align: top;\n",
|
922 |
+
" }\n",
|
923 |
+
"\n",
|
924 |
+
" .dataframe thead th {\n",
|
925 |
+
" text-align: right;\n",
|
926 |
+
" }\n",
|
927 |
+
"</style>\n",
|
928 |
+
"<table border=\"1\" class=\"dataframe\">\n",
|
929 |
+
" <thead>\n",
|
930 |
+
" <tr style=\"text-align: right;\">\n",
|
931 |
+
" <th></th>\n",
|
932 |
+
" <th>prev_filename</th>\n",
|
933 |
+
" <th>new_filename</th>\n",
|
934 |
+
" <th>filename</th>\n",
|
935 |
+
" <th>page_height</th>\n",
|
936 |
+
" <th>page_width</th>\n",
|
937 |
+
" <th>page_height_scaled</th>\n",
|
938 |
+
" <th>page_width_scaled</th>\n",
|
939 |
+
" <th>AuthorID</th>\n",
|
940 |
+
" <th>Overlapped</th>\n",
|
941 |
+
" <th>category</th>\n",
|
942 |
+
" <th>...</th>\n",
|
943 |
+
" <th>y_scaled</th>\n",
|
944 |
+
" <th>w_scaled</th>\n",
|
945 |
+
" <th>h_scaled</th>\n",
|
946 |
+
" <th>labels</th>\n",
|
947 |
+
" <th>x_center</th>\n",
|
948 |
+
" <th>y_center</th>\n",
|
949 |
+
" <th>x_center_norm</th>\n",
|
950 |
+
" <th>width_norm</th>\n",
|
951 |
+
" <th>y_center_norm</th>\n",
|
952 |
+
" <th>height_norm</th>\n",
|
953 |
+
" </tr>\n",
|
954 |
+
" </thead>\n",
|
955 |
+
" <tbody>\n",
|
956 |
+
" <tr>\n",
|
957 |
+
" <th>0</th>\n",
|
958 |
+
" <td>aah97e00-page02_1.tif</td>\n",
|
959 |
+
" <td>aah97e00-page02_1.jpg</td>\n",
|
960 |
+
" <td>0.tif</td>\n",
|
961 |
+
" <td>3296</td>\n",
|
962 |
+
" <td>2560</td>\n",
|
963 |
+
" <td>618.0</td>\n",
|
964 |
+
" <td>480.0</td>\n",
|
965 |
+
" <td>NaN</td>\n",
|
966 |
+
" <td>NaN</td>\n",
|
967 |
+
" <td>DLLogo</td>\n",
|
968 |
+
" <td>...</td>\n",
|
969 |
+
" <td>3</td>\n",
|
970 |
+
" <td>70</td>\n",
|
971 |
+
" <td>41</td>\n",
|
972 |
+
" <td>0</td>\n",
|
973 |
+
" <td>236</td>\n",
|
974 |
+
" <td>23</td>\n",
|
975 |
+
" <td>0.491667</td>\n",
|
976 |
+
" <td>0.145833</td>\n",
|
977 |
+
" <td>0.037217</td>\n",
|
978 |
+
" <td>0.066343</td>\n",
|
979 |
+
" </tr>\n",
|
980 |
+
" </tbody>\n",
|
981 |
+
"</table>\n",
|
982 |
+
"<p>1 rows × 26 columns</p>\n",
|
983 |
+
"</div>"
|
984 |
+
],
|
985 |
+
"text/plain": [
|
986 |
+
" prev_filename new_filename filename page_height \\\n",
|
987 |
+
"0 aah97e00-page02_1.tif aah97e00-page02_1.jpg 0.tif 3296 \n",
|
988 |
+
"\n",
|
989 |
+
" page_width page_height_scaled page_width_scaled AuthorID Overlapped \\\n",
|
990 |
+
"0 2560 618.0 480.0 NaN NaN \n",
|
991 |
+
"\n",
|
992 |
+
" category ... y_scaled w_scaled h_scaled labels x_center y_center \\\n",
|
993 |
+
"0 DLLogo ... 3 70 41 0 236 23 \n",
|
994 |
+
"\n",
|
995 |
+
" x_center_norm width_norm y_center_norm height_norm \n",
|
996 |
+
"0 0.491667 0.145833 0.037217 0.066343 \n",
|
997 |
+
"\n",
|
998 |
+
"[1 rows x 26 columns]"
|
999 |
+
]
|
1000 |
+
},
|
1001 |
+
"execution_count": 150,
|
1002 |
+
"metadata": {},
|
1003 |
+
"output_type": "execute_result"
|
1004 |
+
}
|
1005 |
+
],
|
1006 |
+
"source": [
|
1007 |
+
"def x_center(df):\n",
|
1008 |
+
" return int(df.x_scaled + (df.w_scaled/2))\n",
|
1009 |
+
"def y_center(df):\n",
|
1010 |
+
" return int(df.y_scaled + (df.h_scaled/2))\n",
|
1011 |
+
"\n",
|
1012 |
+
"def w_norm(df, col):\n",
|
1013 |
+
" return df[col]/df['page_width_scaled']\n",
|
1014 |
+
"def h_norm(df, col):\n",
|
1015 |
+
" return df[col]/df['page_height_scaled']\n",
|
1016 |
+
"\n",
|
1017 |
+
"df = pd.read_csv('tobacco_data_zhugy/tobacco_cleaned.csv')\n",
|
1018 |
+
"\n",
|
1019 |
+
"le = preprocessing.LabelEncoder()\n",
|
1020 |
+
"le.fit(df['category'])\n",
|
1021 |
+
"print(le.classes_)\n",
|
1022 |
+
"labels = le.transform(df['category'])\n",
|
1023 |
+
"df['labels'] = labels\n",
|
1024 |
+
"\n",
|
1025 |
+
"\n",
|
1026 |
+
"df['x_center'] = df.apply(x_center, axis=1)\n",
|
1027 |
+
"df['y_center'] = df.apply(y_center, axis=1)\n",
|
1028 |
+
"\n",
|
1029 |
+
"df['x_center_norm'] = df.apply(w_norm, col='x_center',axis=1)\n",
|
1030 |
+
"df['width_norm'] = df.apply(w_norm, col='w_scaled', axis=1)\n",
|
1031 |
+
"\n",
|
1032 |
+
"df['y_center_norm'] = df.apply(h_norm, col='y_center',axis=1)\n",
|
1033 |
+
"df['height_norm'] = df.apply(h_norm, col='h_scaled',axis=1)\n",
|
1034 |
+
"\n",
|
1035 |
+
"df.head(1)"
|
1036 |
+
]
|
1037 |
+
},
|
1038 |
+
{
|
1039 |
+
"cell_type": "markdown",
|
1040 |
+
"metadata": {},
|
1041 |
+
"source": [
|
1042 |
+
"# Moving images to train and valid folders"
|
1043 |
+
]
|
1044 |
+
},
|
1045 |
+
{
|
1046 |
+
"cell_type": "code",
|
1047 |
+
"execution_count": 152,
|
1048 |
+
"metadata": {},
|
1049 |
+
"outputs": [
|
1050 |
+
{
|
1051 |
+
"name": "stdout",
|
1052 |
+
"output_type": "stream",
|
1053 |
+
"text": [
|
1054 |
+
"(1207, 26) (135, 26)\n"
|
1055 |
+
]
|
1056 |
+
}
|
1057 |
+
],
|
1058 |
+
"source": [
|
1059 |
+
"df_train, df_valid = model_selection.train_test_split(df, test_size=0.1, random_state=13, shuffle=True)\n",
|
1060 |
+
"print(df_train.shape, df_valid.shape)"
|
1061 |
+
]
|
1062 |
+
},
|
1063 |
+
{
|
1064 |
+
"cell_type": "markdown",
|
1065 |
+
"metadata": {},
|
1066 |
+
"source": [
|
1067 |
+
"**Creating relevant directories**"
|
1068 |
+
]
|
1069 |
+
},
|
1070 |
+
{
|
1071 |
+
"cell_type": "code",
|
1072 |
+
"execution_count": 156,
|
1073 |
+
"metadata": {},
|
1074 |
+
"outputs": [],
|
1075 |
+
"source": [
|
1076 |
+
"os.mkdir('tobacco_data_zhugy/tobacco_yolo_format/')\n",
|
1077 |
+
"os.mkdir('tobacco_data_zhugy/tobacco_yolo_format/images/')\n",
|
1078 |
+
"os.mkdir('tobacco_data_zhugy/tobacco_yolo_format/images/train/')\n",
|
1079 |
+
"os.mkdir('tobacco_data_zhugy/tobacco_yolo_format/images/valid/')\n",
|
1080 |
+
"\n",
|
1081 |
+
"os.mkdir('tobacco_data_zhugy/tobacco_yolo_format/labels/')\n",
|
1082 |
+
"os.mkdir('tobacco_data_zhugy/tobacco_yolo_format/labels/train/')\n",
|
1083 |
+
"os.mkdir('tobacco_data_zhugy/tobacco_yolo_format/labels/valid/')"
|
1084 |
+
]
|
1085 |
+
},
|
1086 |
+
{
|
1087 |
+
"cell_type": "markdown",
|
1088 |
+
"metadata": {},
|
1089 |
+
"source": [
|
1090 |
+
"**Segregating images and labels to train and valid**"
|
1091 |
+
]
|
1092 |
+
},
|
1093 |
+
{
|
1094 |
+
"cell_type": "code",
|
1095 |
+
"execution_count": 160,
|
1096 |
+
"metadata": {},
|
1097 |
+
"outputs": [
|
1098 |
+
{
|
1099 |
+
"name": "stdout",
|
1100 |
+
"output_type": "stream",
|
1101 |
+
"text": [
|
1102 |
+
"No. of Training images 807\n",
|
1103 |
+
"No. of Training labels 807\n",
|
1104 |
+
"No. of valid images 129\n",
|
1105 |
+
"No. of valid labels 129\n"
|
1106 |
+
]
|
1107 |
+
}
|
1108 |
+
],
|
1109 |
+
"source": [
|
1110 |
+
"def segregate_data(df, img_path, label_path, train_img_path, train_label_path):\n",
|
1111 |
+
" filenames = []\n",
|
1112 |
+
" for filename in df.filename:\n",
|
1113 |
+
" filenames.append(filename)\n",
|
1114 |
+
" filenames = set(filenames)\n",
|
1115 |
+
" \n",
|
1116 |
+
" for filename in filenames:\n",
|
1117 |
+
" yolo_list = []\n",
|
1118 |
+
"\n",
|
1119 |
+
" for _,row in df[df.filename == filename].iterrows():\n",
|
1120 |
+
" yolo_list.append([row.labels, row.x_center_norm, row.y_center_norm, row.width_norm, row.height_norm])\n",
|
1121 |
+
"\n",
|
1122 |
+
" yolo_list = np.array(yolo_list)\n",
|
1123 |
+
" txt_filename = os.path.join(train_label_path,str(row.new_filename.split('.')[0])+\".txt\")\n",
|
1124 |
+
" # Save the .img & .txt files to the corresponding train and validation folders\n",
|
1125 |
+
" np.savetxt(txt_filename, yolo_list, fmt=[\"%d\", \"%f\", \"%f\", \"%f\", \"%f\"])\n",
|
1126 |
+
" shutil.copyfile(os.path.join(img_path,row.new_filename), os.path.join(train_img_path,row.new_filename))\n",
|
1127 |
+
" \n",
|
1128 |
+
"# Apply function\n",
|
1129 |
+
"src_img_path = \"tobacco_data_zhugy/scaled/\"\n",
|
1130 |
+
"src_label_path = \"tobacco_data_zhugy/groundtruth/\"\n",
|
1131 |
+
"\n",
|
1132 |
+
"train_img_path = \"tobacco_data_zhugy/tobacco_yolo_format/images/train\"\n",
|
1133 |
+
"train_label_path = \"tobacco_data_zhugy/tobacco_yolo_format/labels/train\"\n",
|
1134 |
+
"\n",
|
1135 |
+
"valid_img_path = \"tobacco_data_zhugy/tobacco_yolo_format/images/valid\"\n",
|
1136 |
+
"valid_label_path = \"tobacco_data_zhugy/tobacco_yolo_format/labels/valid\"\n",
|
1137 |
+
"\n",
|
1138 |
+
"segregate_data(df_train, src_img_path, src_label_path, train_img_path, train_label_path)\n",
|
1139 |
+
"segregate_data(df_valid, src_img_path, src_label_path, valid_img_path, valid_label_path)\n",
|
1140 |
+
"\n",
|
1141 |
+
"print(\"No. of Training images\", len(os.listdir('tobacco_data_zhugy/tobacco_yolo_format/images/train')))\n",
|
1142 |
+
"print(\"No. of Training labels\", len(os.listdir('tobacco_data_zhugy/tobacco_yolo_format/labels/train')))\n",
|
1143 |
+
"\n",
|
1144 |
+
"print(\"No. of valid images\", len(os.listdir('tobacco_data_zhugy/tobacco_yolo_format/images/valid')))\n",
|
1145 |
+
"print(\"No. of valid labels\", len(os.listdir('tobacco_data_zhugy/tobacco_yolo_format/labels/valid')))"
|
1146 |
+
]
|
1147 |
+
},
|
1148 |
+
{
|
1149 |
+
"cell_type": "markdown",
|
1150 |
+
"metadata": {},
|
1151 |
+
"source": [
|
1152 |
+
"**Deleting ipython checkpoints**"
|
1153 |
+
]
|
1154 |
+
},
|
1155 |
+
{
|
1156 |
+
"cell_type": "code",
|
1157 |
+
"execution_count": 161,
|
1158 |
+
"metadata": {},
|
1159 |
+
"outputs": [],
|
1160 |
+
"source": [
|
1161 |
+
"try:\n",
|
1162 |
+
" shutil.rmtree('tobacco_data_zhugy/tobacco_yolo_format/images/train/.ipynb_checkpoints')\n",
|
1163 |
+
"except FileNotFoundError:\n",
|
1164 |
+
" pass\n",
|
1165 |
+
"\n",
|
1166 |
+
"try:\n",
|
1167 |
+
" shutil.rmtree('tobacco_data_zhugy/tobacco_yolo_format/images/valid/.ipynb_checkpoints')\n",
|
1168 |
+
"except FileNotFoundError:\n",
|
1169 |
+
" pass\n",
|
1170 |
+
"\n",
|
1171 |
+
"try:\n",
|
1172 |
+
" shutil.rmtree('tobacco_data_zhugy/tobacco_yolo_format/labels/train/.ipynb_checkpoints')\n",
|
1173 |
+
"except FileNotFoundError:\n",
|
1174 |
+
" pass\n",
|
1175 |
+
"\n",
|
1176 |
+
"try:\n",
|
1177 |
+
" shutil.rmtree('tobacco_data_zhugy/tobacco_yolo_format/labels/valid/.ipynb_checkpoints')\n",
|
1178 |
+
"except FileNotFoundError:\n",
|
1179 |
+
" pass\n"
|
1180 |
+
]
|
1181 |
+
}
|
1182 |
+
],
|
1183 |
+
"metadata": {
|
1184 |
+
"kernelspec": {
|
1185 |
+
"display_name": "Python 3",
|
1186 |
+
"language": "python",
|
1187 |
+
"name": "python3"
|
1188 |
+
},
|
1189 |
+
"language_info": {
|
1190 |
+
"codemirror_mode": {
|
1191 |
+
"name": "ipython",
|
1192 |
+
"version": 3
|
1193 |
+
},
|
1194 |
+
"file_extension": ".py",
|
1195 |
+
"mimetype": "text/x-python",
|
1196 |
+
"name": "python",
|
1197 |
+
"nbconvert_exporter": "python",
|
1198 |
+
"pygments_lexer": "ipython3",
|
1199 |
+
"version": "3.8.13"
|
1200 |
+
}
|
1201 |
+
},
|
1202 |
+
"nbformat": 4,
|
1203 |
+
"nbformat_minor": 4
|
1204 |
+
}
|
SignatureDetection/Training/.ipynb_checkpoints/CustomYOLOv5_using_Tobcco800_dataset-checkpoint.ipynb
ADDED
@@ -0,0 +1,274 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"cells": [
|
3 |
+
{
|
4 |
+
"cell_type": "markdown",
|
5 |
+
"metadata": {
|
6 |
+
"id": "Bo5_91rSgTg3"
|
7 |
+
},
|
8 |
+
"source": [
|
9 |
+
"**Importing Libraries**"
|
10 |
+
]
|
11 |
+
},
|
12 |
+
{
|
13 |
+
"cell_type": "code",
|
14 |
+
"execution_count": 1,
|
15 |
+
"metadata": {
|
16 |
+
"id": "1FOULt5NeSny"
|
17 |
+
},
|
18 |
+
"outputs": [],
|
19 |
+
"source": [
|
20 |
+
"import shutil\n",
|
21 |
+
"import os, sys, random\n",
|
22 |
+
"from glob import glob\n",
|
23 |
+
"import pandas as pd\n",
|
24 |
+
"from shutil import copyfile\n",
|
25 |
+
"import pandas as pd\n",
|
26 |
+
"from sklearn import preprocessing, model_selection\n",
|
27 |
+
"import matplotlib.pyplot as plt\n",
|
28 |
+
"from matplotlib import patches\n",
|
29 |
+
"import numpy as np\n",
|
30 |
+
"import os\n",
|
31 |
+
"%matplotlib inline"
|
32 |
+
]
|
33 |
+
},
|
34 |
+
{
|
35 |
+
"cell_type": "markdown",
|
36 |
+
"metadata": {
|
37 |
+
"id": "mDgSjs4FMS82"
|
38 |
+
},
|
39 |
+
"source": [
|
40 |
+
"Refer [this blog](https://towardsai.net/p/computer-vision/yolo-v5-object-detection-on-a-custom-dataset) for more information. Its an excellent resource. \n",
|
41 |
+
"\n",
|
42 |
+
"**Cloning Official Repo** \n"
|
43 |
+
]
|
44 |
+
},
|
45 |
+
{
|
46 |
+
"cell_type": "code",
|
47 |
+
"execution_count": null,
|
48 |
+
"metadata": {
|
49 |
+
"id": "3dyetdeOpUIR"
|
50 |
+
},
|
51 |
+
"outputs": [],
|
52 |
+
"source": [
|
53 |
+
"!git clone 'https://github.com/ultralytics/yolov5.git'\n",
|
54 |
+
"!sed -i 's/PyYAML>=5.3.1/PyYAML==5.4.1/g' ./yolov5/requirements.txt\n",
|
55 |
+
"!pip install -qr 'yolov5/requirements.txt'"
|
56 |
+
]
|
57 |
+
},
|
58 |
+
{
|
59 |
+
"cell_type": "code",
|
60 |
+
"execution_count": 6,
|
61 |
+
"metadata": {
|
62 |
+
"colab": {
|
63 |
+
"base_uri": "https://localhost:8080/"
|
64 |
+
},
|
65 |
+
"id": "rOTf_JHIMV9T",
|
66 |
+
"outputId": "514c1cfa-c1e0-4c87-a3a1-672eb744e2cd"
|
67 |
+
},
|
68 |
+
"outputs": [
|
69 |
+
{
|
70 |
+
"data": {
|
71 |
+
"text/plain": [
|
72 |
+
"'yolov5/tobacco_data.yaml'"
|
73 |
+
]
|
74 |
+
},
|
75 |
+
"execution_count": 6,
|
76 |
+
"metadata": {},
|
77 |
+
"output_type": "execute_result"
|
78 |
+
}
|
79 |
+
],
|
80 |
+
"source": [
|
81 |
+
"# Setting the model parameters\n",
|
82 |
+
"# copying the custom_dataset.yaml file to the project repo\n",
|
83 |
+
"# setting number of classes to two (since the tobacco 800 dataset contains 2 classes, Logo & Signature)\n",
|
84 |
+
"shutil.copyfile('Training/tobacco_data.yaml', 'yolov5/tobacco_data.yaml') "
|
85 |
+
]
|
86 |
+
},
|
87 |
+
{
|
88 |
+
"cell_type": "code",
|
89 |
+
"execution_count": 3,
|
90 |
+
"metadata": {},
|
91 |
+
"outputs": [
|
92 |
+
{
|
93 |
+
"name": "stdout",
|
94 |
+
"output_type": "stream",
|
95 |
+
"text": [
|
96 |
+
"/Users/vivekgupta/DS/Signature/1. Detection\n"
|
97 |
+
]
|
98 |
+
}
|
99 |
+
],
|
100 |
+
"source": [
|
101 |
+
"cd .."
|
102 |
+
]
|
103 |
+
},
|
104 |
+
{
|
105 |
+
"cell_type": "code",
|
106 |
+
"execution_count": 4,
|
107 |
+
"metadata": {
|
108 |
+
"colab": {
|
109 |
+
"base_uri": "https://localhost:8080/"
|
110 |
+
},
|
111 |
+
"id": "rOTf_JHIMV9T",
|
112 |
+
"outputId": "514c1cfa-c1e0-4c87-a3a1-672eb744e2cd"
|
113 |
+
},
|
114 |
+
"outputs": [
|
115 |
+
{
|
116 |
+
"name": "stdout",
|
117 |
+
"output_type": "stream",
|
118 |
+
"text": [
|
119 |
+
"train: tobacco_yolo_format/images/train\r\n",
|
120 |
+
"val: tobacco_yolo_format/images/valid\r\n",
|
121 |
+
"\r\n",
|
122 |
+
"nc: 2\r\n",
|
123 |
+
"names: ['DLLogo', 'DLSignature']\r\n"
|
124 |
+
]
|
125 |
+
}
|
126 |
+
],
|
127 |
+
"source": [
|
128 |
+
"!cat yolov5/tobacco_data.yaml"
|
129 |
+
]
|
130 |
+
},
|
131 |
+
{
|
132 |
+
"cell_type": "markdown",
|
133 |
+
"metadata": {
|
134 |
+
"id": "Lfn8HpbaO3tD"
|
135 |
+
},
|
136 |
+
"source": [
|
137 |
+
"**Setting some augmentations**"
|
138 |
+
]
|
139 |
+
},
|
140 |
+
{
|
141 |
+
"cell_type": "code",
|
142 |
+
"execution_count": 5,
|
143 |
+
"metadata": {
|
144 |
+
"id": "wvg-PdCOO26C"
|
145 |
+
},
|
146 |
+
"outputs": [],
|
147 |
+
"source": [
|
148 |
+
"# !sed -i 's/perspective: 0.0/perspective: 0.1/g' ./yolov5/data/hyp.finetune.yaml\n",
|
149 |
+
"# !sed -i 's/shear: 0.0/shear: 0.1/g' ./yolov5/data/hyp.finetune.yaml\n",
|
150 |
+
"# !sed -i 's/flipud: 0.0/flipud: 0.5/g' ./yolov5/data/hyp.finetune.yaml\n",
|
151 |
+
"# !sed -i 's/degrees: 0.0/degrees: 0.2/g' ./yolov5/data/hyp.finetune.yaml"
|
152 |
+
]
|
153 |
+
},
|
154 |
+
{
|
155 |
+
"cell_type": "markdown",
|
156 |
+
"metadata": {
|
157 |
+
"id": "xCtQwpQHPXnD"
|
158 |
+
},
|
159 |
+
"source": [
|
160 |
+
"**Training**"
|
161 |
+
]
|
162 |
+
},
|
163 |
+
{
|
164 |
+
"cell_type": "markdown",
|
165 |
+
"metadata": {
|
166 |
+
"id": "jgUydkkSp3gz"
|
167 |
+
},
|
168 |
+
"source": [
|
169 |
+
"--img 640 is the width of the images. \n",
|
170 |
+
"`Dataset.yaml` file should be present in the directory pointed by --data. \n",
|
171 |
+
"--cfg models/model.yaml is used to set the model we want to train on. I have used yolov5x.yaml, more information could be found [here.](https://github.com/ultralytics/yolov5#pretrained-checkpoints) \n",
|
172 |
+
" \n",
|
173 |
+
"\n",
|
174 |
+
"Many useful tips and information regarding training and testing could be foung [here](https://github.com/ultralytics/yolov5/wiki/Tips-for-Best-Training-Results). **This will helps to clear a good amount of doubts and errors. Also I recommend you to go through the issues section of the repo if you faces any errors or doubts. Legand has it that you will find the solution for your miseries there.**"
|
175 |
+
]
|
176 |
+
},
|
177 |
+
{
|
178 |
+
"cell_type": "code",
|
179 |
+
"execution_count": null,
|
180 |
+
"metadata": {
|
181 |
+
"id": "NKvLEPfHOSQw",
|
182 |
+
"scrolled": true
|
183 |
+
},
|
184 |
+
"outputs": [],
|
185 |
+
"source": [
|
186 |
+
"!python yolov5/train.py --img 640 --batch 16 --epochs 100 --weights \"yolov5s.pt\" \\\n",
|
187 |
+
"--data yolov5/tobacco_data.yaml --cfg yolov5/models/yolov5s.yaml --name Tobacco-run --device 'mps'"
|
188 |
+
]
|
189 |
+
},
|
190 |
+
{
|
191 |
+
"cell_type": "markdown",
|
192 |
+
"metadata": {
|
193 |
+
"id": "xB2bMpZyrWS3"
|
194 |
+
},
|
195 |
+
"source": [
|
196 |
+
"**Testing**"
|
197 |
+
]
|
198 |
+
},
|
199 |
+
{
|
200 |
+
"cell_type": "markdown",
|
201 |
+
"metadata": {
|
202 |
+
"id": "ly5RlSNsrZqr"
|
203 |
+
},
|
204 |
+
"source": [
|
205 |
+
"**To predict images in a folder** \n",
|
206 |
+
"--hide-labels is used to hide the labels in the detected images. \n",
|
207 |
+
"--hide-conf is used to hide the confidence scores in the detected images. --classes [0, 1, etc] used to detect only the classes mentioned here. For our use case we need only signature class, so use --classes 1.\n",
|
208 |
+
"--line-thickness integer used to set the thickness of bounging box. \n",
|
209 |
+
"--save-crop and --save-txt used to save the crops and labels. \n",
|
210 |
+
"--project could be used to specify the results path "
|
211 |
+
]
|
212 |
+
},
|
213 |
+
{
|
214 |
+
"cell_type": "code",
|
215 |
+
"execution_count": null,
|
216 |
+
"metadata": {
|
217 |
+
"id": "uBOJ9IPvPZ8h"
|
218 |
+
},
|
219 |
+
"outputs": [],
|
220 |
+
"source": [
|
221 |
+
"!python yolov5/detect.py --source TobaccoData_Raw/tobacco_yolo_format/images/valid/ --weights 'yolo_model/best.pt' \\\n",
|
222 |
+
" --hide-labels --hide-conf --classes 1 --line-thickness 2 --device 'mps'"
|
223 |
+
]
|
224 |
+
},
|
225 |
+
{
|
226 |
+
"cell_type": "markdown",
|
227 |
+
"metadata": {
|
228 |
+
"id": "n9PS6yTCs3td"
|
229 |
+
},
|
230 |
+
"source": [
|
231 |
+
"**To predict a single image**"
|
232 |
+
]
|
233 |
+
},
|
234 |
+
{
|
235 |
+
"cell_type": "code",
|
236 |
+
"execution_count": null,
|
237 |
+
"metadata": {
|
238 |
+
"id": "kdRwxu7oY53A"
|
239 |
+
},
|
240 |
+
"outputs": [],
|
241 |
+
"source": [
|
242 |
+
"!python yolov5/detect.py --source tobacco_yolo_format/images/valid/imagename --weights 'runs/train/Tobacco-run/weights/best.pt' \\\n",
|
243 |
+
" --hide-labels --hide-conf --classes 1 --line-thickness 2 "
|
244 |
+
]
|
245 |
+
}
|
246 |
+
],
|
247 |
+
"metadata": {
|
248 |
+
"accelerator": "GPU",
|
249 |
+
"colab": {
|
250 |
+
"collapsed_sections": [],
|
251 |
+
"name": "YOLOv5_Tobacco.ipynb",
|
252 |
+
"provenance": []
|
253 |
+
},
|
254 |
+
"kernelspec": {
|
255 |
+
"display_name": "Python 3",
|
256 |
+
"language": "python",
|
257 |
+
"name": "python3"
|
258 |
+
},
|
259 |
+
"language_info": {
|
260 |
+
"codemirror_mode": {
|
261 |
+
"name": "ipython",
|
262 |
+
"version": 3
|
263 |
+
},
|
264 |
+
"file_extension": ".py",
|
265 |
+
"mimetype": "text/x-python",
|
266 |
+
"name": "python",
|
267 |
+
"nbconvert_exporter": "python",
|
268 |
+
"pygments_lexer": "ipython3",
|
269 |
+
"version": "3.8.13"
|
270 |
+
}
|
271 |
+
},
|
272 |
+
"nbformat": 4,
|
273 |
+
"nbformat_minor": 4
|
274 |
+
}
|
SignatureDetection/Training/.ipynb_checkpoints/SignDetection-checkpoint.ipynb
ADDED
@@ -0,0 +1,246 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"cells": [
|
3 |
+
{
|
4 |
+
"cell_type": "code",
|
5 |
+
"execution_count": 1,
|
6 |
+
"id": "f808ce4c",
|
7 |
+
"metadata": {},
|
8 |
+
"outputs": [],
|
9 |
+
"source": [
|
10 |
+
"import shutil\n",
|
11 |
+
"import os, sys, random\n",
|
12 |
+
"from glob import glob\n",
|
13 |
+
"import numpy as np\n",
|
14 |
+
"import pandas as pd\n",
|
15 |
+
"from sklearn import preprocessing, model_selection\n",
|
16 |
+
"\n",
|
17 |
+
"%matplotlib inline"
|
18 |
+
]
|
19 |
+
},
|
20 |
+
{
|
21 |
+
"cell_type": "markdown",
|
22 |
+
"id": "1f53b523",
|
23 |
+
"metadata": {},
|
24 |
+
"source": [
|
25 |
+
"**To predict images in a folder** \n",
|
26 |
+
"--hide-labels is used to hide the labels in the detected images. \n",
|
27 |
+
"--hide-conf is used to hide the confidence scores in the detected images. --classes [0, 1, etc] used to detect only the classes mentioned here. For our use case we need only signature class, so use --classes 1.\n",
|
28 |
+
"--line-thickness integer used to set the thickness of bounging box. \n",
|
29 |
+
"--save-crop and --save-txt used to save the crops and labels. \n",
|
30 |
+
"--project could be used to specify the results path "
|
31 |
+
]
|
32 |
+
},
|
33 |
+
{
|
34 |
+
"cell_type": "code",
|
35 |
+
"execution_count": 2,
|
36 |
+
"id": "cbd540df",
|
37 |
+
"metadata": {},
|
38 |
+
"outputs": [
|
39 |
+
{
|
40 |
+
"name": "stdout",
|
41 |
+
"output_type": "stream",
|
42 |
+
"text": [
|
43 |
+
"/Users/vivekgupta/DS/Signature/1. Detection\n"
|
44 |
+
]
|
45 |
+
}
|
46 |
+
],
|
47 |
+
"source": [
|
48 |
+
"cd '/Users/vivekgupta/DS/Signature/1. Detection/'"
|
49 |
+
]
|
50 |
+
},
|
51 |
+
{
|
52 |
+
"cell_type": "code",
|
53 |
+
"execution_count": 4,
|
54 |
+
"id": "1d0b8972",
|
55 |
+
"metadata": {
|
56 |
+
"scrolled": true
|
57 |
+
},
|
58 |
+
"outputs": [
|
59 |
+
{
|
60 |
+
"name": "stdout",
|
61 |
+
"output_type": "stream",
|
62 |
+
"text": [
|
63 |
+
"\u001b[34m\u001b[1mdetect: \u001b[0mweights=['yolo_model/best.pt'], source=TobaccoData_Raw/tobacco_yolo_format/images/valid/, data=yolov5/data/coco128.yaml, imgsz=[640, 640], conf_thres=0.25, iou_thres=0.45, max_det=1000, device=, view_img=False, save_txt=False, save_conf=False, save_crop=True, nosave=False, classes=[1], agnostic_nms=False, augment=False, visualize=False, update=False, project=yolov5/runs/detect, name=exp, exist_ok=False, line_thickness=2, hide_labels=True, hide_conf=True, half=False, dnn=False, vid_stride=1\n",
|
64 |
+
"fatal: cannot change to '/Users/vivekgupta/DS/Signature/1.': No such file or directory\n",
|
65 |
+
"YOLOv5 🚀 2023-8-21 Python-3.8.13 torch-2.0.1 CPU\n",
|
66 |
+
"\n",
|
67 |
+
"Fusing layers... \n",
|
68 |
+
"YOLOv5x summary: 476 layers, 87205423 parameters, 0 gradients\n",
|
69 |
+
"image 1/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/aao54e00_2.jpg: 640x512 1 DLSignature, 680.1ms\n",
|
70 |
+
"image 2/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/abm69c00.jpg: 640x512 1 DLSignature, 729.1ms\n",
|
71 |
+
"image 3/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/aex05f00_1.jpg: 640x512 1 DLSignature, 735.7ms\n",
|
72 |
+
"image 4/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/agw39d00.jpg: 640x512 8 DLSignatures, 809.4ms\n",
|
73 |
+
"image 5/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/aik94f00-page02_2.jpg: 640x512 1 DLSignature, 807.0ms\n",
|
74 |
+
"image 6/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/aji32e00-page02_2.jpg: 640x512 1 DLSignature, 720.4ms\n",
|
75 |
+
"image 7/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/amw93e00.jpg: 640x512 1 DLSignature, 818.0ms\n",
|
76 |
+
"image 8/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/bad45f00.jpg: 640x512 2 DLSignatures, 946.9ms\n",
|
77 |
+
"image 9/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/bfk68c00-page03_3.jpg: 640x512 1 DLSignature, 676.0ms\n",
|
78 |
+
"image 10/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/bfx94e00.jpg: 640x544 1 DLSignature, 731.5ms\n",
|
79 |
+
"image 11/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/bhw64a00.jpg: 640x544 2 DLSignatures, 725.4ms\n",
|
80 |
+
"image 12/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/bji44a00.jpg: 640x512 2 DLSignatures, 697.9ms\n",
|
81 |
+
"image 13/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/bkz54f00_1.jpg: 640x512 1 DLSignature, 788.8ms\n",
|
82 |
+
"image 14/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/boa85f00.jpg: 640x512 1 DLSignature, 699.7ms\n",
|
83 |
+
"image 15/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/bug83d00.jpg: 640x512 1 DLSignature, 745.2ms\n",
|
84 |
+
"image 16/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/cgy54f00_1.jpg: 640x512 1 DLSignature, 875.6ms\n",
|
85 |
+
"image 17/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/chw80e00_1.jpg: 640x512 1 DLSignature, 727.7ms\n",
|
86 |
+
"image 18/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/cir10f00.jpg: 640x512 2 DLSignatures, 694.4ms\n",
|
87 |
+
"image 19/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/cjb54c00.jpg: 640x512 1 DLSignature, 767.6ms\n",
|
88 |
+
"image 20/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/cjy33f00-page02_2.jpg: 640x512 2 DLSignatures, 721.7ms\n",
|
89 |
+
"image 21/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/cnk41e00-page02_1.jpg: 640x512 (no detections), 729.2ms\n",
|
90 |
+
"image 22/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/cry54f00_1.jpg: 640x512 1 DLSignature, 725.2ms\n",
|
91 |
+
"image 23/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/cxk72e00-page03_1.jpg: 640x544 (no detections), 698.0ms\n",
|
92 |
+
"image 24/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/cxk72e00-page03_3.jpg: 640x544 2 DLSignatures, 757.7ms\n",
|
93 |
+
"image 25/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/dgi64c00.jpg: 640x512 2 DLSignatures, 934.5ms\n",
|
94 |
+
"image 26/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/dhr55d00-page02_2.jpg: 640x512 1 DLSignature, 686.6ms\n",
|
95 |
+
"image 27/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/dic45f00_1.jpg: 640x512 (no detections), 701.8ms\n",
|
96 |
+
"image 28/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/djh5aa00.jpg: 640x512 1 DLSignature, 774.7ms\n",
|
97 |
+
"image 29/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/djz54f00.jpg: 640x512 1 DLSignature, 746.3ms\n",
|
98 |
+
"image 30/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/dlu7aa00_1.jpg: 640x544 (no detections), 812.4ms\n",
|
99 |
+
"image 31/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/dqn43c00.jpg: 640x512 1 DLSignature, 783.9ms\n",
|
100 |
+
"image 32/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/drm00d00.jpg: 640x512 1 DLSignature, 764.6ms\n",
|
101 |
+
"image 33/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/dvr41a00.jpg: 640x512 1 DLSignature, 826.7ms\n",
|
102 |
+
"image 34/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/dwr29e00_2.jpg: 640x512 1 DLSignature, 681.0ms\n",
|
103 |
+
"image 35/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/dxj24f00.jpg: 640x512 2 DLSignatures, 685.8ms\n",
|
104 |
+
"image 36/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/eao90f00.jpg: 640x512 1 DLSignature, 806.9ms\n",
|
105 |
+
"image 37/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/ecn9aa00.jpg: 640x480 1 DLSignature, 698.9ms\n",
|
106 |
+
"image 38/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/ecv85f00.jpg: 640x512 2 DLSignatures, 704.5ms\n",
|
107 |
+
"image 39/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/efm53d00.jpg: 640x512 3 DLSignatures, 746.8ms\n",
|
108 |
+
"image 40/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/eys04c00-page04_4.jpg: 640x512 2 DLSignatures, 754.4ms\n",
|
109 |
+
"image 41/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/fhi41f00.jpg: 640x512 1 DLSignature, 889.0ms\n",
|
110 |
+
"image 42/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/fja22c00.jpg: 640x512 1 DLSignature, 725.6ms\n",
|
111 |
+
"image 43/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/fny38c00-page05_5.jpg: 640x512 5 DLSignatures, 670.7ms\n",
|
112 |
+
"image 44/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/fzh11c00-var.jpg: 640x512 2 DLSignatures, 699.8ms\n",
|
113 |
+
"image 45/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/gal01c00.jpg: 640x512 1 DLSignature, 766.4ms\n",
|
114 |
+
"image 46/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/gjl70a00-page2_2.jpg: 640x512 3 DLSignatures, 710.9ms\n",
|
115 |
+
"image 47/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/gpq38e00-page02_1.jpg: 640x512 1 DLSignature, 741.5ms\n",
|
116 |
+
"image 48/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/grm00d00.jpg: 640x512 1 DLSignature, 707.9ms\n",
|
117 |
+
"image 49/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/hbk41e00.jpg: 640x512 1 DLSignature, 781.6ms\n"
|
118 |
+
]
|
119 |
+
},
|
120 |
+
{
|
121 |
+
"name": "stdout",
|
122 |
+
"output_type": "stream",
|
123 |
+
"text": [
|
124 |
+
"image 50/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/hna35f00.jpg: 640x512 1 DLSignature, 892.3ms\n",
|
125 |
+
"image 51/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/hti31a00_1.jpg: 640x512 1 DLSignature, 676.8ms\n",
|
126 |
+
"image 52/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/hty24f00-page02_2.jpg: 640x512 3 DLSignatures, 681.4ms\n",
|
127 |
+
"image 53/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/hua33a00-init.jpg: 640x512 2 DLSignatures, 781.7ms\n",
|
128 |
+
"image 54/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/huz50e00_1.jpg: 640x512 1 DLSignature, 714.6ms\n",
|
129 |
+
"image 55/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/icr55d00.jpg: 640x512 7 DLSignatures, 762.7ms\n",
|
130 |
+
"image 56/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/idr55d00.jpg: 640x512 3 DLSignatures, 697.1ms\n",
|
131 |
+
"image 57/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/iln90f00.jpg: 640x512 1 DLSignature, 738.7ms\n",
|
132 |
+
"image 58/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/irx55e00.jpg: 640x544 1 DLSignature, 811.9ms\n",
|
133 |
+
"image 59/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/jci90c00.jpg: 640x512 1 DLSignature, 903.1ms\n",
|
134 |
+
"image 60/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/jgs60f00-page03_1.jpg: 640x512 (no detections), 742.1ms\n",
|
135 |
+
"image 61/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/juo75f00_1.jpg: 640x512 1 DLSignature, 745.4ms\n",
|
136 |
+
"image 62/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/kcv85f00_1.jpg: 640x512 2 DLSignatures, 786.5ms\n",
|
137 |
+
"image 63/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/kde44c00-page02_2.jpg: 640x512 1 DLSignature, 759.2ms\n",
|
138 |
+
"image 64/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/kfw39d00.jpg: 640x512 9 DLSignatures, 806.6ms\n",
|
139 |
+
"image 65/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/kgb30f00.jpg: 640x512 1 DLSignature, 801.9ms\n",
|
140 |
+
"image 66/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/kma35f00.jpg: 640x512 1 DLSignature, 782.1ms\n",
|
141 |
+
"image 67/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/kmw13f00.jpg: 640x512 1 DLSignature, 858.2ms\n",
|
142 |
+
"image 68/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/llq11e00-page02_2.jpg: 640x512 1 DLSignature, 698.0ms\n",
|
143 |
+
"image 69/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/lwd23f00-page02_2.jpg: 640x512 1 DLSignature, 712.0ms\n",
|
144 |
+
"image 70/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/men75f00.jpg: 640x512 1 DLSignature, 837.8ms\n",
|
145 |
+
"image 71/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/mma35f00.jpg: 640x512 2 DLSignatures, 809.5ms\n",
|
146 |
+
"image 72/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/ncn00d00.jpg: 640x512 1 DLSignature, 848.1ms\n",
|
147 |
+
"image 73/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/nff41e00.jpg: 640x512 1 DLSignature, 810.1ms\n",
|
148 |
+
"image 74/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/nir55d00-page02_1.jpg: 640x512 (no detections), 842.8ms\n",
|
149 |
+
"image 75/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/nlq86d00.jpg: 640x512 1 DLSignature, 888.7ms\n",
|
150 |
+
"image 76/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/nrg54f00-page02_1.jpg: 640x512 1 DLSignature, 700.3ms\n",
|
151 |
+
"image 77/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/nsr05f00_1.jpg: 640x512 1 DLSignature, 699.4ms\n",
|
152 |
+
"image 78/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/nul00a00.jpg: 640x544 1 DLSignature, 735.3ms\n",
|
153 |
+
"image 79/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/oen75f00.jpg: 640x512 3 DLSignatures, 740.4ms\n",
|
154 |
+
"image 80/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/oib30f00-first-var.jpg: 640x512 1 DLSignature, 797.0ms\n",
|
155 |
+
"image 81/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/pdg62d00-page02_2.jpg: 640x512 2 DLSignatures, 748.2ms\n",
|
156 |
+
"image 82/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/pfk90c00.jpg: 640x512 2 DLSignatures, 781.9ms\n",
|
157 |
+
"image 83/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/ppz95d00.jpg: 640x512 1 DLSignature, 938.2ms\n",
|
158 |
+
"image 84/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/pxp81f00.jpg: 640x512 1 DLSignature, 702.3ms\n",
|
159 |
+
"image 85/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/qei59c00.jpg: 640x512 1 DLSignature, 687.8ms\n",
|
160 |
+
"image 86/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/qma35f00.jpg: 640x512 1 DLSignature, 759.6ms\n",
|
161 |
+
"image 87/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/qnj41f00.jpg: 640x512 1 DLSignature, 705.4ms\n",
|
162 |
+
"image 88/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/rex05f00_1.jpg: 640x512 2 DLSignatures, 800.1ms\n",
|
163 |
+
"image 89/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/rgj46d00.jpg: 640x512 2 DLSignatures, 729.3ms\n",
|
164 |
+
"image 90/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/rsv90c00-first.jpg: 640x512 1 DLSignature, 722.1ms\n",
|
165 |
+
"image 91/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/rzk3aa00.jpg: 640x512 1 DLSignature, 834.5ms\n",
|
166 |
+
"image 92/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/sfp41a00-page5_1.jpg: 640x512 2 DLSignatures, 714.2ms\n",
|
167 |
+
"image 93/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/sia26d00.jpg: 640x512 1 DLSignature, 699.9ms\n",
|
168 |
+
"image 94/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/sik79d00.jpg: 640x512 2 DLSignatures, 714.5ms\n",
|
169 |
+
"image 95/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/sji44a00.jpg: 640x512 2 DLSignatures, 730.5ms\n",
|
170 |
+
"image 96/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/sla48c00.jpg: 640x512 2 DLSignatures, 713.2ms\n",
|
171 |
+
"image 97/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/sma35f00.jpg: 640x512 1 DLSignature, 762.3ms\n",
|
172 |
+
"image 98/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/ubd60f00.jpg: 640x512 1 DLSignature, 705.6ms\n",
|
173 |
+
"image 99/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/ufw98c00.jpg: 640x512 1 DLSignature, 752.3ms\n",
|
174 |
+
"image 100/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/uji44a00.jpg: 640x512 2 DLSignatures, 872.1ms\n",
|
175 |
+
"image 101/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/ukd41a00-ernest.jpg: 640x512 1 DLSignature, 676.8ms\n",
|
176 |
+
"image 102/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/uzm55d00-page02_1.jpg: 640x512 (no detections), 689.3ms\n",
|
177 |
+
"image 103/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/vdr55d00.jpg: 640x512 1 DLSignature, 747.2ms\n"
|
178 |
+
]
|
179 |
+
},
|
180 |
+
{
|
181 |
+
"name": "stdout",
|
182 |
+
"output_type": "stream",
|
183 |
+
"text": [
|
184 |
+
"image 104/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/vff43c00.jpg: 640x512 1 DLSignature, 736.8ms\n",
|
185 |
+
"image 105/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/vfs60f00.jpg: 640x512 1 DLSignature, 786.7ms\n",
|
186 |
+
"image 106/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/vss86d00.jpg: 640x512 1 DLSignature, 757.6ms\n",
|
187 |
+
"image 107/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/wab91d00-var.jpg: 640x512 1 DLSignature, 741.4ms\n",
|
188 |
+
"image 108/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/wat01f00.jpg: 640x512 1 DLSignature, 872.7ms\n",
|
189 |
+
"image 109/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/wbo3aa00.jpg: 640x512 1 DLSignature, 673.6ms\n",
|
190 |
+
"image 110/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/wbv90c00-page02_1.jpg: 640x512 (no detections), 665.9ms\n",
|
191 |
+
"image 111/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/wfg55f00.jpg: 640x512 1 DLSignature, 705.6ms\n",
|
192 |
+
"image 112/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/wjf44f00.jpg: 640x512 1 DLSignature, 788.4ms\n",
|
193 |
+
"image 113/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/wlp51a00.jpg: 640x512 1 DLSignature, 757.4ms\n",
|
194 |
+
"image 114/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/wzk36d00page02-first_2.jpg: 640x512 1 DLSignature, 730.1ms\n",
|
195 |
+
"image 115/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/xjw13f00.jpg: 640x512 2 DLSignatures, 719.0ms\n",
|
196 |
+
"image 116/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/xyr15f00.jpg: 640x512 1 DLSignature, 769.4ms\n",
|
197 |
+
"image 117/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/yhw13f00_1.jpg: 640x512 1 DLSignature, 873.7ms\n",
|
198 |
+
"image 118/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/yme01e00-page01_1.jpg: 640x544 1 DLSignature, 665.2ms\n",
|
199 |
+
"image 119/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/ymp51a00.jpg: 640x512 1 DLSignature, 683.1ms\n",
|
200 |
+
"image 120/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/yyo25f00.jpg: 640x512 1 DLSignature, 701.8ms\n",
|
201 |
+
"image 121/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/zkd43f00_3.jpg: 640x512 4 DLSignatures, 677.3ms\n",
|
202 |
+
"image 122/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/zny04f00_2.jpg: 640x512 1 DLSignature, 735.3ms\n",
|
203 |
+
"image 123/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/zpz83f00_1.jpg: 640x512 1 DLSignature, 720.1ms\n",
|
204 |
+
"image 124/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/zqr09c00.jpg: 640x512 1 DLSignature, 727.4ms\n",
|
205 |
+
"image 125/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/zrt45f00.jpg: 640x512 1 DLSignature, 848.2ms\n",
|
206 |
+
"Speed: 0.7ms pre-process, 755.2ms inference, 0.9ms NMS per image at shape (1, 3, 640, 640)\n",
|
207 |
+
"Results saved to \u001b[1myolov5/runs/detect/exp3\u001b[0m\n"
|
208 |
+
]
|
209 |
+
}
|
210 |
+
],
|
211 |
+
"source": [
|
212 |
+
"!python yolov5/detect.py --source TobaccoData_Raw/tobacco_yolo_format/images/valid/ --weights 'yolo_model/best.pt' \\\n",
|
213 |
+
" --hide-labels --hide-conf --classes 1 --line-thickness 2 --save-crop"
|
214 |
+
]
|
215 |
+
},
|
216 |
+
{
|
217 |
+
"cell_type": "code",
|
218 |
+
"execution_count": null,
|
219 |
+
"id": "b53e1c44",
|
220 |
+
"metadata": {},
|
221 |
+
"outputs": [],
|
222 |
+
"source": []
|
223 |
+
}
|
224 |
+
],
|
225 |
+
"metadata": {
|
226 |
+
"kernelspec": {
|
227 |
+
"display_name": "Python 3",
|
228 |
+
"language": "python",
|
229 |
+
"name": "python3"
|
230 |
+
},
|
231 |
+
"language_info": {
|
232 |
+
"codemirror_mode": {
|
233 |
+
"name": "ipython",
|
234 |
+
"version": 3
|
235 |
+
},
|
236 |
+
"file_extension": ".py",
|
237 |
+
"mimetype": "text/x-python",
|
238 |
+
"name": "python",
|
239 |
+
"nbconvert_exporter": "python",
|
240 |
+
"pygments_lexer": "ipython3",
|
241 |
+
"version": "3.8.13"
|
242 |
+
}
|
243 |
+
},
|
244 |
+
"nbformat": 4,
|
245 |
+
"nbformat_minor": 5
|
246 |
+
}
|
SignatureDetection/Training/Converting_Tobacco800_Dataset_to_YOLOv5_Format.ipynb
ADDED
@@ -0,0 +1,1223 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"cells": [
|
3 |
+
{
|
4 |
+
"cell_type": "markdown",
|
5 |
+
"metadata": {},
|
6 |
+
"source": [
|
7 |
+
"# Importing Libraries"
|
8 |
+
]
|
9 |
+
},
|
10 |
+
{
|
11 |
+
"cell_type": "code",
|
12 |
+
"execution_count": 1,
|
13 |
+
"metadata": {},
|
14 |
+
"outputs": [],
|
15 |
+
"source": [
|
16 |
+
"import os, sys, random, shutil\n",
|
17 |
+
"import xml.etree.ElementTree as ET\n",
|
18 |
+
"from glob import glob\n",
|
19 |
+
"import pandas as pd\n",
|
20 |
+
"from shutil import copyfile\n",
|
21 |
+
"import pandas as pd\n",
|
22 |
+
"from sklearn import preprocessing, model_selection\n",
|
23 |
+
"import matplotlib.pyplot as plt\n",
|
24 |
+
"%matplotlib inline\n",
|
25 |
+
"from matplotlib import patches\n",
|
26 |
+
"import numpy as np"
|
27 |
+
]
|
28 |
+
},
|
29 |
+
{
|
30 |
+
"cell_type": "code",
|
31 |
+
"execution_count": 18,
|
32 |
+
"metadata": {},
|
33 |
+
"outputs": [],
|
34 |
+
"source": [
|
35 |
+
"import cv2"
|
36 |
+
]
|
37 |
+
},
|
38 |
+
{
|
39 |
+
"cell_type": "markdown",
|
40 |
+
"metadata": {},
|
41 |
+
"source": [
|
42 |
+
"Refer [this blog](https://towardsai.net/p/computer-vision/yolo-v5-object-detection-on-a-custom-dataset) for more information. Its an excellent resource. \n",
|
43 |
+
"Tobacco 800 dataset could be downloaded from [here](http://tc11.cvc.uab.es/datasets/Tobacco800_1)"
|
44 |
+
]
|
45 |
+
},
|
46 |
+
{
|
47 |
+
"cell_type": "markdown",
|
48 |
+
"metadata": {},
|
49 |
+
"source": [
|
50 |
+
"# Extracting information from Tobacco-800 XML files"
|
51 |
+
]
|
52 |
+
},
|
53 |
+
{
|
54 |
+
"cell_type": "code",
|
55 |
+
"execution_count": 7,
|
56 |
+
"metadata": {},
|
57 |
+
"outputs": [
|
58 |
+
{
|
59 |
+
"name": "stdout",
|
60 |
+
"output_type": "stream",
|
61 |
+
"text": [
|
62 |
+
"\u001b[34mimages\u001b[m\u001b[m/ \u001b[34mlabels\u001b[m\u001b[m/\r\n"
|
63 |
+
]
|
64 |
+
}
|
65 |
+
],
|
66 |
+
"source": [
|
67 |
+
"ls TobaccoData"
|
68 |
+
]
|
69 |
+
},
|
70 |
+
{
|
71 |
+
"cell_type": "code",
|
72 |
+
"execution_count": 12,
|
73 |
+
"metadata": {},
|
74 |
+
"outputs": [],
|
75 |
+
"source": [
|
76 |
+
"df = []\n",
|
77 |
+
"cnt = 0\n",
|
78 |
+
"\n",
|
79 |
+
"# refer the xml files to understand its structure and revist this code block.\n",
|
80 |
+
"annotations = sorted(glob('TobaccoData_Raw/groundtruth/*.xml'))\n",
|
81 |
+
"for file in annotations:\n",
|
82 |
+
" myroot = ET.parse(file).getroot()\n",
|
83 |
+
" # image filename is changed aah97e00-page02_1.tif -> 0.tif, so the previous filename is collected here.\n",
|
84 |
+
" prev_filename = myroot[0].attrib['src']\n",
|
85 |
+
" filename = str(cnt) + '.tif' # new filename based on the count (0.tif, 1.tif etc)\n",
|
86 |
+
" page_height, page_width = myroot[0][0].attrib['height'], myroot[0][0].attrib['width']\n",
|
87 |
+
" \n",
|
88 |
+
" row = []\n",
|
89 |
+
" # An image might have multiple items (zones) (logos and signs), so iterate through each zones\n",
|
90 |
+
" for zone in myroot[0][0]:\n",
|
91 |
+
" category = zone.attrib['gedi_type'] # type of zone (DLLogo/ DLSignature)\n",
|
92 |
+
" id = zone.attrib['id']\n",
|
93 |
+
" x, y = zone.attrib['col'], zone.attrib['row'] # x, y coordinate\n",
|
94 |
+
" w, h = zone.attrib['width'], zone.attrib['height'] # width and height of bbox\n",
|
95 |
+
" \n",
|
96 |
+
" # Signature have Authors, represeting whose signature it is\n",
|
97 |
+
" if category == 'DLSignature':\n",
|
98 |
+
" AuthorID = zone.attrib['AuthorID']\n",
|
99 |
+
" Overlapped = zone.attrib['Overlapped']\n",
|
100 |
+
" else:\n",
|
101 |
+
" # Logos don't have authors.\n",
|
102 |
+
" AuthorID, Overlapped = ('NA', 'NA')\n",
|
103 |
+
" row = [prev_filename, filename, page_height, page_width, AuthorID, Overlapped, category, id, x, y, w, h]\n",
|
104 |
+
" df.append(row)\n",
|
105 |
+
" cnt += 1"
|
106 |
+
]
|
107 |
+
},
|
108 |
+
{
|
109 |
+
"cell_type": "markdown",
|
110 |
+
"metadata": {},
|
111 |
+
"source": [
|
112 |
+
"**Saving the information to Dataframe**"
|
113 |
+
]
|
114 |
+
},
|
115 |
+
{
|
116 |
+
"cell_type": "code",
|
117 |
+
"execution_count": 13,
|
118 |
+
"metadata": {},
|
119 |
+
"outputs": [],
|
120 |
+
"source": [
|
121 |
+
"data = pd.DataFrame(df, columns=['prev_filename', 'filename', 'page_height', 'page_width', 'AuthorID', 'Overlapped', 'category', 'id', 'x', 'y', 'width', 'height'])"
|
122 |
+
]
|
123 |
+
},
|
124 |
+
{
|
125 |
+
"cell_type": "code",
|
126 |
+
"execution_count": 14,
|
127 |
+
"metadata": {},
|
128 |
+
"outputs": [
|
129 |
+
{
|
130 |
+
"data": {
|
131 |
+
"text/html": [
|
132 |
+
"<div>\n",
|
133 |
+
"<style scoped>\n",
|
134 |
+
" .dataframe tbody tr th:only-of-type {\n",
|
135 |
+
" vertical-align: middle;\n",
|
136 |
+
" }\n",
|
137 |
+
"\n",
|
138 |
+
" .dataframe tbody tr th {\n",
|
139 |
+
" vertical-align: top;\n",
|
140 |
+
" }\n",
|
141 |
+
"\n",
|
142 |
+
" .dataframe thead th {\n",
|
143 |
+
" text-align: right;\n",
|
144 |
+
" }\n",
|
145 |
+
"</style>\n",
|
146 |
+
"<table border=\"1\" class=\"dataframe\">\n",
|
147 |
+
" <thead>\n",
|
148 |
+
" <tr style=\"text-align: right;\">\n",
|
149 |
+
" <th></th>\n",
|
150 |
+
" <th>prev_filename</th>\n",
|
151 |
+
" <th>filename</th>\n",
|
152 |
+
" <th>page_height</th>\n",
|
153 |
+
" <th>page_width</th>\n",
|
154 |
+
" <th>AuthorID</th>\n",
|
155 |
+
" <th>Overlapped</th>\n",
|
156 |
+
" <th>category</th>\n",
|
157 |
+
" <th>id</th>\n",
|
158 |
+
" <th>x</th>\n",
|
159 |
+
" <th>y</th>\n",
|
160 |
+
" <th>width</th>\n",
|
161 |
+
" <th>height</th>\n",
|
162 |
+
" </tr>\n",
|
163 |
+
" </thead>\n",
|
164 |
+
" <tbody>\n",
|
165 |
+
" <tr>\n",
|
166 |
+
" <th>0</th>\n",
|
167 |
+
" <td>aah97e00-page02_1.tif</td>\n",
|
168 |
+
" <td>0.tif</td>\n",
|
169 |
+
" <td>3296</td>\n",
|
170 |
+
" <td>2560</td>\n",
|
171 |
+
" <td>NA</td>\n",
|
172 |
+
" <td>NA</td>\n",
|
173 |
+
" <td>DLLogo</td>\n",
|
174 |
+
" <td>None</td>\n",
|
175 |
+
" <td>1074</td>\n",
|
176 |
+
" <td>18</td>\n",
|
177 |
+
" <td>374</td>\n",
|
178 |
+
" <td>219</td>\n",
|
179 |
+
" </tr>\n",
|
180 |
+
" <tr>\n",
|
181 |
+
" <th>1</th>\n",
|
182 |
+
" <td>aah97e00-page02_2.tif</td>\n",
|
183 |
+
" <td>1.tif</td>\n",
|
184 |
+
" <td>3296</td>\n",
|
185 |
+
" <td>2560</td>\n",
|
186 |
+
" <td>Boder, J.B.</td>\n",
|
187 |
+
" <td>Yes</td>\n",
|
188 |
+
" <td>DLSignature</td>\n",
|
189 |
+
" <td>None</td>\n",
|
190 |
+
" <td>1409</td>\n",
|
191 |
+
" <td>793</td>\n",
|
192 |
+
" <td>659</td>\n",
|
193 |
+
" <td>361</td>\n",
|
194 |
+
" </tr>\n",
|
195 |
+
" <tr>\n",
|
196 |
+
" <th>2</th>\n",
|
197 |
+
" <td>aam09c00.tif</td>\n",
|
198 |
+
" <td>2.tif</td>\n",
|
199 |
+
" <td>2292</td>\n",
|
200 |
+
" <td>1728</td>\n",
|
201 |
+
" <td>Koplow, M.G.</td>\n",
|
202 |
+
" <td>Yes</td>\n",
|
203 |
+
" <td>DLSignature</td>\n",
|
204 |
+
" <td>None</td>\n",
|
205 |
+
" <td>821</td>\n",
|
206 |
+
" <td>1422</td>\n",
|
207 |
+
" <td>757</td>\n",
|
208 |
+
" <td>183</td>\n",
|
209 |
+
" </tr>\n",
|
210 |
+
" <tr>\n",
|
211 |
+
" <th>3</th>\n",
|
212 |
+
" <td>aao54e00_2.tif</td>\n",
|
213 |
+
" <td>4.tif</td>\n",
|
214 |
+
" <td>3296</td>\n",
|
215 |
+
" <td>2560</td>\n",
|
216 |
+
" <td>Landry, J.T.</td>\n",
|
217 |
+
" <td>Yes</td>\n",
|
218 |
+
" <td>DLSignature</td>\n",
|
219 |
+
" <td>None</td>\n",
|
220 |
+
" <td>1514</td>\n",
|
221 |
+
" <td>708</td>\n",
|
222 |
+
" <td>627</td>\n",
|
223 |
+
" <td>206</td>\n",
|
224 |
+
" </tr>\n",
|
225 |
+
" <tr>\n",
|
226 |
+
" <th>4</th>\n",
|
227 |
+
" <td>abm69c00.tif</td>\n",
|
228 |
+
" <td>5.tif</td>\n",
|
229 |
+
" <td>2292</td>\n",
|
230 |
+
" <td>1728</td>\n",
|
231 |
+
" <td>Feldman, J.D.</td>\n",
|
232 |
+
" <td>Yes</td>\n",
|
233 |
+
" <td>DLSignature</td>\n",
|
234 |
+
" <td>None</td>\n",
|
235 |
+
" <td>667</td>\n",
|
236 |
+
" <td>1279</td>\n",
|
237 |
+
" <td>617</td>\n",
|
238 |
+
" <td>110</td>\n",
|
239 |
+
" </tr>\n",
|
240 |
+
" </tbody>\n",
|
241 |
+
"</table>\n",
|
242 |
+
"</div>"
|
243 |
+
],
|
244 |
+
"text/plain": [
|
245 |
+
" prev_filename filename page_height page_width AuthorID \\\n",
|
246 |
+
"0 aah97e00-page02_1.tif 0.tif 3296 2560 NA \n",
|
247 |
+
"1 aah97e00-page02_2.tif 1.tif 3296 2560 Boder, J.B. \n",
|
248 |
+
"2 aam09c00.tif 2.tif 2292 1728 Koplow, M.G. \n",
|
249 |
+
"3 aao54e00_2.tif 4.tif 3296 2560 Landry, J.T. \n",
|
250 |
+
"4 abm69c00.tif 5.tif 2292 1728 Feldman, J.D. \n",
|
251 |
+
"\n",
|
252 |
+
" Overlapped category id x y width height \n",
|
253 |
+
"0 NA DLLogo None 1074 18 374 219 \n",
|
254 |
+
"1 Yes DLSignature None 1409 793 659 361 \n",
|
255 |
+
"2 Yes DLSignature None 821 1422 757 183 \n",
|
256 |
+
"3 Yes DLSignature None 1514 708 627 206 \n",
|
257 |
+
"4 Yes DLSignature None 667 1279 617 110 "
|
258 |
+
]
|
259 |
+
},
|
260 |
+
"execution_count": 14,
|
261 |
+
"metadata": {},
|
262 |
+
"output_type": "execute_result"
|
263 |
+
}
|
264 |
+
],
|
265 |
+
"source": [
|
266 |
+
"data.head()"
|
267 |
+
]
|
268 |
+
},
|
269 |
+
{
|
270 |
+
"cell_type": "code",
|
271 |
+
"execution_count": 15,
|
272 |
+
"metadata": {},
|
273 |
+
"outputs": [
|
274 |
+
{
|
275 |
+
"data": {
|
276 |
+
"text/plain": [
|
277 |
+
"(page_height 3584\n",
|
278 |
+
" page_width 2720\n",
|
279 |
+
" dtype: object,\n",
|
280 |
+
" page_height 1575\n",
|
281 |
+
" page_width 1200\n",
|
282 |
+
" dtype: object)"
|
283 |
+
]
|
284 |
+
},
|
285 |
+
"execution_count": 15,
|
286 |
+
"metadata": {},
|
287 |
+
"output_type": "execute_result"
|
288 |
+
}
|
289 |
+
],
|
290 |
+
"source": [
|
291 |
+
"test = data[['page_height', 'page_width']]\n",
|
292 |
+
"test.max(), test.min()"
|
293 |
+
]
|
294 |
+
},
|
295 |
+
{
|
296 |
+
"cell_type": "markdown",
|
297 |
+
"metadata": {},
|
298 |
+
"source": [
|
299 |
+
"**Scaling the image to reduce training time** \n",
|
300 |
+
"To save on training time, resize the images to a maximum height and width of 640 and 480. While resizing the image, the bounding box cordinates also changes. This code computes how much each image is shrinken and updates the bounding box coordinates appropriately."
|
301 |
+
]
|
302 |
+
},
|
303 |
+
{
|
304 |
+
"cell_type": "code",
|
305 |
+
"execution_count": 21,
|
306 |
+
"metadata": {},
|
307 |
+
"outputs": [],
|
308 |
+
"source": [
|
309 |
+
"BASE_DIR = 'TobaccoData_Raw/pages/'\n",
|
310 |
+
"SAVE_PATH = 'TobaccoData_Raw/scaled/'\n",
|
311 |
+
"# os.mkdir(SAVE_PATH)\n",
|
312 |
+
"\n",
|
313 |
+
"def scale_image(df):\n",
|
314 |
+
" df_new = []\n",
|
315 |
+
" filename = df.prev_filename\n",
|
316 |
+
" X, Y, W, H = map(int, df.x), map(int, df.y), map(int, df.width), map(int, df.height)\n",
|
317 |
+
" for file, x, y, w, h in zip(filename, X, Y, W, H):\n",
|
318 |
+
" image_path = BASE_DIR + file\n",
|
319 |
+
" img = cv2.imread(image_path, 1)\n",
|
320 |
+
" page_height, page_width = img.shape[:2]\n",
|
321 |
+
" max_height = 640\n",
|
322 |
+
" max_width = 480\n",
|
323 |
+
" \n",
|
324 |
+
" # computes the scaling factor\n",
|
325 |
+
" if max_height < page_height or max_width < page_width:\n",
|
326 |
+
" scaling_factor = max_height / float(page_height)\n",
|
327 |
+
" if max_width/float(page_width) < scaling_factor:\n",
|
328 |
+
" scaling_factor = max_width / float(page_width)\n",
|
329 |
+
" # scale the image with the scaling factor\n",
|
330 |
+
" img = cv2.resize(img, None, fx=scaling_factor, fy=scaling_factor, interpolation=cv2.INTER_AREA)\n",
|
331 |
+
" jpg_filename = file[:-4] + '.jpg'\n",
|
332 |
+
" new_file_path = SAVE_PATH + jpg_filename\n",
|
333 |
+
" cv2.imwrite(new_file_path, img) # write the scales image\n",
|
334 |
+
" \n",
|
335 |
+
" # save new page height and width\n",
|
336 |
+
" page_height, page_width = page_height*scaling_factor, page_width*scaling_factor\n",
|
337 |
+
" # compute new x, y, w, h coordinates after scaling\n",
|
338 |
+
" x, y, w, h= int(x*scaling_factor), int(y*scaling_factor), int(w*scaling_factor), int(h*scaling_factor)\n",
|
339 |
+
" row = [jpg_filename, x, y, w, h, page_height, page_width]\n",
|
340 |
+
" df_new.append(row)\n",
|
341 |
+
" return df_new\n",
|
342 |
+
"scaled_data = scale_image(data)"
|
343 |
+
]
|
344 |
+
},
|
345 |
+
{
|
346 |
+
"cell_type": "markdown",
|
347 |
+
"metadata": {},
|
348 |
+
"source": [
|
349 |
+
"**Adding the information regarding the scaling to the df**"
|
350 |
+
]
|
351 |
+
},
|
352 |
+
{
|
353 |
+
"cell_type": "code",
|
354 |
+
"execution_count": 22,
|
355 |
+
"metadata": {
|
356 |
+
"scrolled": true
|
357 |
+
},
|
358 |
+
"outputs": [
|
359 |
+
{
|
360 |
+
"data": {
|
361 |
+
"text/html": [
|
362 |
+
"<div>\n",
|
363 |
+
"<style scoped>\n",
|
364 |
+
" .dataframe tbody tr th:only-of-type {\n",
|
365 |
+
" vertical-align: middle;\n",
|
366 |
+
" }\n",
|
367 |
+
"\n",
|
368 |
+
" .dataframe tbody tr th {\n",
|
369 |
+
" vertical-align: top;\n",
|
370 |
+
" }\n",
|
371 |
+
"\n",
|
372 |
+
" .dataframe thead th {\n",
|
373 |
+
" text-align: right;\n",
|
374 |
+
" }\n",
|
375 |
+
"</style>\n",
|
376 |
+
"<table border=\"1\" class=\"dataframe\">\n",
|
377 |
+
" <thead>\n",
|
378 |
+
" <tr style=\"text-align: right;\">\n",
|
379 |
+
" <th></th>\n",
|
380 |
+
" <th>prev_filename</th>\n",
|
381 |
+
" <th>filename</th>\n",
|
382 |
+
" <th>page_height</th>\n",
|
383 |
+
" <th>page_width</th>\n",
|
384 |
+
" <th>AuthorID</th>\n",
|
385 |
+
" <th>Overlapped</th>\n",
|
386 |
+
" <th>category</th>\n",
|
387 |
+
" <th>id</th>\n",
|
388 |
+
" <th>x</th>\n",
|
389 |
+
" <th>y</th>\n",
|
390 |
+
" <th>width</th>\n",
|
391 |
+
" <th>height</th>\n",
|
392 |
+
" <th>new_filename</th>\n",
|
393 |
+
" <th>x_scaled</th>\n",
|
394 |
+
" <th>y_scaled</th>\n",
|
395 |
+
" <th>w_scaled</th>\n",
|
396 |
+
" <th>h_scaled</th>\n",
|
397 |
+
" <th>page_height_scaled</th>\n",
|
398 |
+
" <th>page_width_scaled</th>\n",
|
399 |
+
" </tr>\n",
|
400 |
+
" </thead>\n",
|
401 |
+
" <tbody>\n",
|
402 |
+
" <tr>\n",
|
403 |
+
" <th>0</th>\n",
|
404 |
+
" <td>aah97e00-page02_1.tif</td>\n",
|
405 |
+
" <td>0.tif</td>\n",
|
406 |
+
" <td>3296</td>\n",
|
407 |
+
" <td>2560</td>\n",
|
408 |
+
" <td>NA</td>\n",
|
409 |
+
" <td>NA</td>\n",
|
410 |
+
" <td>DLLogo</td>\n",
|
411 |
+
" <td>None</td>\n",
|
412 |
+
" <td>1074</td>\n",
|
413 |
+
" <td>18</td>\n",
|
414 |
+
" <td>374</td>\n",
|
415 |
+
" <td>219</td>\n",
|
416 |
+
" <td>aah97e00-page02_1.jpg</td>\n",
|
417 |
+
" <td>201</td>\n",
|
418 |
+
" <td>3</td>\n",
|
419 |
+
" <td>70</td>\n",
|
420 |
+
" <td>41</td>\n",
|
421 |
+
" <td>618.000000</td>\n",
|
422 |
+
" <td>480.0</td>\n",
|
423 |
+
" </tr>\n",
|
424 |
+
" <tr>\n",
|
425 |
+
" <th>1</th>\n",
|
426 |
+
" <td>aah97e00-page02_2.tif</td>\n",
|
427 |
+
" <td>1.tif</td>\n",
|
428 |
+
" <td>3296</td>\n",
|
429 |
+
" <td>2560</td>\n",
|
430 |
+
" <td>Boder, J.B.</td>\n",
|
431 |
+
" <td>Yes</td>\n",
|
432 |
+
" <td>DLSignature</td>\n",
|
433 |
+
" <td>None</td>\n",
|
434 |
+
" <td>1409</td>\n",
|
435 |
+
" <td>793</td>\n",
|
436 |
+
" <td>659</td>\n",
|
437 |
+
" <td>361</td>\n",
|
438 |
+
" <td>aah97e00-page02_2.jpg</td>\n",
|
439 |
+
" <td>264</td>\n",
|
440 |
+
" <td>148</td>\n",
|
441 |
+
" <td>123</td>\n",
|
442 |
+
" <td>67</td>\n",
|
443 |
+
" <td>618.000000</td>\n",
|
444 |
+
" <td>480.0</td>\n",
|
445 |
+
" </tr>\n",
|
446 |
+
" <tr>\n",
|
447 |
+
" <th>2</th>\n",
|
448 |
+
" <td>aam09c00.tif</td>\n",
|
449 |
+
" <td>2.tif</td>\n",
|
450 |
+
" <td>2292</td>\n",
|
451 |
+
" <td>1728</td>\n",
|
452 |
+
" <td>Koplow, M.G.</td>\n",
|
453 |
+
" <td>Yes</td>\n",
|
454 |
+
" <td>DLSignature</td>\n",
|
455 |
+
" <td>None</td>\n",
|
456 |
+
" <td>821</td>\n",
|
457 |
+
" <td>1422</td>\n",
|
458 |
+
" <td>757</td>\n",
|
459 |
+
" <td>183</td>\n",
|
460 |
+
" <td>aam09c00.jpg</td>\n",
|
461 |
+
" <td>228</td>\n",
|
462 |
+
" <td>395</td>\n",
|
463 |
+
" <td>210</td>\n",
|
464 |
+
" <td>50</td>\n",
|
465 |
+
" <td>636.666667</td>\n",
|
466 |
+
" <td>480.0</td>\n",
|
467 |
+
" </tr>\n",
|
468 |
+
" <tr>\n",
|
469 |
+
" <th>3</th>\n",
|
470 |
+
" <td>aao54e00_2.tif</td>\n",
|
471 |
+
" <td>4.tif</td>\n",
|
472 |
+
" <td>3296</td>\n",
|
473 |
+
" <td>2560</td>\n",
|
474 |
+
" <td>Landry, J.T.</td>\n",
|
475 |
+
" <td>Yes</td>\n",
|
476 |
+
" <td>DLSignature</td>\n",
|
477 |
+
" <td>None</td>\n",
|
478 |
+
" <td>1514</td>\n",
|
479 |
+
" <td>708</td>\n",
|
480 |
+
" <td>627</td>\n",
|
481 |
+
" <td>206</td>\n",
|
482 |
+
" <td>aao54e00_2.jpg</td>\n",
|
483 |
+
" <td>283</td>\n",
|
484 |
+
" <td>132</td>\n",
|
485 |
+
" <td>117</td>\n",
|
486 |
+
" <td>38</td>\n",
|
487 |
+
" <td>618.000000</td>\n",
|
488 |
+
" <td>480.0</td>\n",
|
489 |
+
" </tr>\n",
|
490 |
+
" <tr>\n",
|
491 |
+
" <th>4</th>\n",
|
492 |
+
" <td>abm69c00.tif</td>\n",
|
493 |
+
" <td>5.tif</td>\n",
|
494 |
+
" <td>2292</td>\n",
|
495 |
+
" <td>1728</td>\n",
|
496 |
+
" <td>Feldman, J.D.</td>\n",
|
497 |
+
" <td>Yes</td>\n",
|
498 |
+
" <td>DLSignature</td>\n",
|
499 |
+
" <td>None</td>\n",
|
500 |
+
" <td>667</td>\n",
|
501 |
+
" <td>1279</td>\n",
|
502 |
+
" <td>617</td>\n",
|
503 |
+
" <td>110</td>\n",
|
504 |
+
" <td>abm69c00.jpg</td>\n",
|
505 |
+
" <td>185</td>\n",
|
506 |
+
" <td>355</td>\n",
|
507 |
+
" <td>171</td>\n",
|
508 |
+
" <td>30</td>\n",
|
509 |
+
" <td>636.666667</td>\n",
|
510 |
+
" <td>480.0</td>\n",
|
511 |
+
" </tr>\n",
|
512 |
+
" <tr>\n",
|
513 |
+
" <th>5</th>\n",
|
514 |
+
" <td>acr64d00.tif</td>\n",
|
515 |
+
" <td>6.tif</td>\n",
|
516 |
+
" <td>2292</td>\n",
|
517 |
+
" <td>1728</td>\n",
|
518 |
+
" <td>Boffa, J.R.</td>\n",
|
519 |
+
" <td>Yes</td>\n",
|
520 |
+
" <td>DLSignature</td>\n",
|
521 |
+
" <td>None</td>\n",
|
522 |
+
" <td>886</td>\n",
|
523 |
+
" <td>1801</td>\n",
|
524 |
+
" <td>463</td>\n",
|
525 |
+
" <td>181</td>\n",
|
526 |
+
" <td>acr64d00.jpg</td>\n",
|
527 |
+
" <td>246</td>\n",
|
528 |
+
" <td>500</td>\n",
|
529 |
+
" <td>128</td>\n",
|
530 |
+
" <td>50</td>\n",
|
531 |
+
" <td>636.666667</td>\n",
|
532 |
+
" <td>480.0</td>\n",
|
533 |
+
" </tr>\n",
|
534 |
+
" <tr>\n",
|
535 |
+
" <th>6</th>\n",
|
536 |
+
" <td>adh36e00-page2_1.tif</td>\n",
|
537 |
+
" <td>7.tif</td>\n",
|
538 |
+
" <td>3245</td>\n",
|
539 |
+
" <td>2560</td>\n",
|
540 |
+
" <td>NA</td>\n",
|
541 |
+
" <td>NA</td>\n",
|
542 |
+
" <td>DLLogo</td>\n",
|
543 |
+
" <td>None</td>\n",
|
544 |
+
" <td>1181</td>\n",
|
545 |
+
" <td>18</td>\n",
|
546 |
+
" <td>359</td>\n",
|
547 |
+
" <td>219</td>\n",
|
548 |
+
" <td>adh36e00-page2_1.jpg</td>\n",
|
549 |
+
" <td>221</td>\n",
|
550 |
+
" <td>3</td>\n",
|
551 |
+
" <td>67</td>\n",
|
552 |
+
" <td>41</td>\n",
|
553 |
+
" <td>608.437500</td>\n",
|
554 |
+
" <td>480.0</td>\n",
|
555 |
+
" </tr>\n",
|
556 |
+
" <tr>\n",
|
557 |
+
" <th>7</th>\n",
|
558 |
+
" <td>adh36e00-page2_2.tif</td>\n",
|
559 |
+
" <td>8.tif</td>\n",
|
560 |
+
" <td>3246</td>\n",
|
561 |
+
" <td>2560</td>\n",
|
562 |
+
" <td>Krivisky, B.M.</td>\n",
|
563 |
+
" <td>Yes</td>\n",
|
564 |
+
" <td>DLSignature</td>\n",
|
565 |
+
" <td>None</td>\n",
|
566 |
+
" <td>1232</td>\n",
|
567 |
+
" <td>2399</td>\n",
|
568 |
+
" <td>896</td>\n",
|
569 |
+
" <td>431</td>\n",
|
570 |
+
" <td>adh36e00-page2_2.jpg</td>\n",
|
571 |
+
" <td>231</td>\n",
|
572 |
+
" <td>449</td>\n",
|
573 |
+
" <td>168</td>\n",
|
574 |
+
" <td>80</td>\n",
|
575 |
+
" <td>608.625000</td>\n",
|
576 |
+
" <td>480.0</td>\n",
|
577 |
+
" </tr>\n",
|
578 |
+
" <tr>\n",
|
579 |
+
" <th>8</th>\n",
|
580 |
+
" <td>adh36e00_1.tif</td>\n",
|
581 |
+
" <td>9.tif</td>\n",
|
582 |
+
" <td>3245</td>\n",
|
583 |
+
" <td>2560</td>\n",
|
584 |
+
" <td>NA</td>\n",
|
585 |
+
" <td>NA</td>\n",
|
586 |
+
" <td>DLLogo</td>\n",
|
587 |
+
" <td>None</td>\n",
|
588 |
+
" <td>1187</td>\n",
|
589 |
+
" <td>18</td>\n",
|
590 |
+
" <td>347</td>\n",
|
591 |
+
" <td>219</td>\n",
|
592 |
+
" <td>adh36e00_1.jpg</td>\n",
|
593 |
+
" <td>222</td>\n",
|
594 |
+
" <td>3</td>\n",
|
595 |
+
" <td>65</td>\n",
|
596 |
+
" <td>41</td>\n",
|
597 |
+
" <td>608.437500</td>\n",
|
598 |
+
" <td>480.0</td>\n",
|
599 |
+
" </tr>\n",
|
600 |
+
" <tr>\n",
|
601 |
+
" <th>9</th>\n",
|
602 |
+
" <td>adh36e00_2.tif</td>\n",
|
603 |
+
" <td>10.tif</td>\n",
|
604 |
+
" <td>3246</td>\n",
|
605 |
+
" <td>2560</td>\n",
|
606 |
+
" <td>Krivisky, B.M.</td>\n",
|
607 |
+
" <td>Yes</td>\n",
|
608 |
+
" <td>DLSignature</td>\n",
|
609 |
+
" <td>None</td>\n",
|
610 |
+
" <td>1239</td>\n",
|
611 |
+
" <td>2403</td>\n",
|
612 |
+
" <td>889</td>\n",
|
613 |
+
" <td>434</td>\n",
|
614 |
+
" <td>adh36e00_2.jpg</td>\n",
|
615 |
+
" <td>232</td>\n",
|
616 |
+
" <td>450</td>\n",
|
617 |
+
" <td>166</td>\n",
|
618 |
+
" <td>81</td>\n",
|
619 |
+
" <td>608.625000</td>\n",
|
620 |
+
" <td>480.0</td>\n",
|
621 |
+
" </tr>\n",
|
622 |
+
" </tbody>\n",
|
623 |
+
"</table>\n",
|
624 |
+
"</div>"
|
625 |
+
],
|
626 |
+
"text/plain": [
|
627 |
+
" prev_filename filename page_height page_width AuthorID \\\n",
|
628 |
+
"0 aah97e00-page02_1.tif 0.tif 3296 2560 NA \n",
|
629 |
+
"1 aah97e00-page02_2.tif 1.tif 3296 2560 Boder, J.B. \n",
|
630 |
+
"2 aam09c00.tif 2.tif 2292 1728 Koplow, M.G. \n",
|
631 |
+
"3 aao54e00_2.tif 4.tif 3296 2560 Landry, J.T. \n",
|
632 |
+
"4 abm69c00.tif 5.tif 2292 1728 Feldman, J.D. \n",
|
633 |
+
"5 acr64d00.tif 6.tif 2292 1728 Boffa, J.R. \n",
|
634 |
+
"6 adh36e00-page2_1.tif 7.tif 3245 2560 NA \n",
|
635 |
+
"7 adh36e00-page2_2.tif 8.tif 3246 2560 Krivisky, B.M. \n",
|
636 |
+
"8 adh36e00_1.tif 9.tif 3245 2560 NA \n",
|
637 |
+
"9 adh36e00_2.tif 10.tif 3246 2560 Krivisky, B.M. \n",
|
638 |
+
"\n",
|
639 |
+
" Overlapped category id x y width height \\\n",
|
640 |
+
"0 NA DLLogo None 1074 18 374 219 \n",
|
641 |
+
"1 Yes DLSignature None 1409 793 659 361 \n",
|
642 |
+
"2 Yes DLSignature None 821 1422 757 183 \n",
|
643 |
+
"3 Yes DLSignature None 1514 708 627 206 \n",
|
644 |
+
"4 Yes DLSignature None 667 1279 617 110 \n",
|
645 |
+
"5 Yes DLSignature None 886 1801 463 181 \n",
|
646 |
+
"6 NA DLLogo None 1181 18 359 219 \n",
|
647 |
+
"7 Yes DLSignature None 1232 2399 896 431 \n",
|
648 |
+
"8 NA DLLogo None 1187 18 347 219 \n",
|
649 |
+
"9 Yes DLSignature None 1239 2403 889 434 \n",
|
650 |
+
"\n",
|
651 |
+
" new_filename x_scaled y_scaled w_scaled h_scaled \\\n",
|
652 |
+
"0 aah97e00-page02_1.jpg 201 3 70 41 \n",
|
653 |
+
"1 aah97e00-page02_2.jpg 264 148 123 67 \n",
|
654 |
+
"2 aam09c00.jpg 228 395 210 50 \n",
|
655 |
+
"3 aao54e00_2.jpg 283 132 117 38 \n",
|
656 |
+
"4 abm69c00.jpg 185 355 171 30 \n",
|
657 |
+
"5 acr64d00.jpg 246 500 128 50 \n",
|
658 |
+
"6 adh36e00-page2_1.jpg 221 3 67 41 \n",
|
659 |
+
"7 adh36e00-page2_2.jpg 231 449 168 80 \n",
|
660 |
+
"8 adh36e00_1.jpg 222 3 65 41 \n",
|
661 |
+
"9 adh36e00_2.jpg 232 450 166 81 \n",
|
662 |
+
"\n",
|
663 |
+
" page_height_scaled page_width_scaled \n",
|
664 |
+
"0 618.000000 480.0 \n",
|
665 |
+
"1 618.000000 480.0 \n",
|
666 |
+
"2 636.666667 480.0 \n",
|
667 |
+
"3 618.000000 480.0 \n",
|
668 |
+
"4 636.666667 480.0 \n",
|
669 |
+
"5 636.666667 480.0 \n",
|
670 |
+
"6 608.437500 480.0 \n",
|
671 |
+
"7 608.625000 480.0 \n",
|
672 |
+
"8 608.437500 480.0 \n",
|
673 |
+
"9 608.625000 480.0 "
|
674 |
+
]
|
675 |
+
},
|
676 |
+
"execution_count": 22,
|
677 |
+
"metadata": {},
|
678 |
+
"output_type": "execute_result"
|
679 |
+
}
|
680 |
+
],
|
681 |
+
"source": [
|
682 |
+
"scaled_data = list(zip(*scaled_data))\n",
|
683 |
+
"\n",
|
684 |
+
"data['new_filename'] = scaled_data[0]\n",
|
685 |
+
"data['x_scaled'] = scaled_data[1]\n",
|
686 |
+
"data['y_scaled'] = scaled_data[2]\n",
|
687 |
+
"data['w_scaled'] = scaled_data[3]\n",
|
688 |
+
"data['h_scaled'] = scaled_data[4]\n",
|
689 |
+
"data['page_height_scaled'] = scaled_data[5]\n",
|
690 |
+
"data['page_width_scaled'] = scaled_data[6]\n",
|
691 |
+
"data.head(10)"
|
692 |
+
]
|
693 |
+
},
|
694 |
+
{
|
695 |
+
"cell_type": "markdown",
|
696 |
+
"metadata": {},
|
697 |
+
"source": [
|
698 |
+
"**Testing the scaled image**"
|
699 |
+
]
|
700 |
+
},
|
701 |
+
{
|
702 |
+
"cell_type": "code",
|
703 |
+
"execution_count": 23,
|
704 |
+
"metadata": {},
|
705 |
+
"outputs": [
|
706 |
+
{
|
707 |
+
"data": {
|
708 |
+
"text/plain": [
|
709 |
+
"<matplotlib.image.AxesImage at 0x16c4dabe0>"
|
710 |
+
]
|
711 |
+
},
|
712 |
+
"execution_count": 23,
|
713 |
+
"metadata": {},
|
714 |
+
"output_type": "execute_result"
|
715 |
+
},
|
716 |
+
{
|
717 |
+
"data": {
|
718 |
+
"image/png": "iVBORw0KGgoAAAANSUhEUgAAASUAAAFpCAYAAADa/T5gAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAACMd0lEQVR4nOydd3hUVfr4P3dKkknvvZJA6CUU6VWlqWAF164rdnfdte5Pd1d3XdvqigqIIiqIoCLSRXoVQgkQSiAESCekt8n0ub8/krnfyTBpEGAC9/M8eTJz59xzzz1z7jvvec973lcQRREZGRkZV0FxtRsgIyMjY48slGRkZFwKWSjJyMi4FLJQkpGRcSlkoSQjI+NSyEJJRkbGpbgsQkkQhAmCIJwUBCFLEIRXL8c1ZGRkrk2E9vZTEgRBCWQCNwH5wD7gXlEUj7frhWRkZK5JLoemNAjIEkXxjCiKRmAJMOUyXEdGRuYa5HIIpSggz+59fsMxGRkZmRZRXa0LC4IwA5gBoNFo+sfFxXGpU0mr1Yooiq2qRxRFBEGQylssljZfz1ZHW7BdU6lUSu11rNOGQqFAqVRK5ziWMxqNCIKAQqGQ2mG7H9t7lUqFIAjSn0JR/ztksViwWq2NyjnWDaBUKqVrq9VqqYzFYmnUJsf2OeuXlvqrtXWYzWapf+y/79Z+H459ZLVapevZ96PjmFAoFFJZWz/azrFYLI2+h6babv/aVselYH/vtjbYt9exrP09Oh53fG27D/vxZ38PjmOvqTrt6wYoLy+nsrKyVBTFEGf3dDmEUgEQY/c+uuFYI0RR/AL4AmDAgAHivn372uXiR48eJScnh0mTJjX7pbdGcLU0wB2/oLZew9kguVTBbC9sW9P+5gbolaA1997W/mmL4GuOtgg5Z+WaandTwqGttHWstHW8XY6xYLFYePHFF5k5c2ZOU2Uux/RtH9BZEIQEQRDcgOnAystwHad4enri5+d3RR6sS71GawdmU+WaG1CtrfdSuZg6Lva6V3rzeGvb6UyTdUWcjaP2ek5aGsu2/rFardTW1jZbV7trSqIomgVBeBb4DVAC80VRPNbe12nqIe3UqROdOnW6qAHlqGZebDuaq9u+/qZ+XVvSwJr7rKnpQ2u0EGfXty/TUr+0pe0t1dOaMq2Z7rXmvEsp19prNzU9uhJc7D23dmy3tg0AZrOZ6urqZsteFpuSKIprgbVtOcdx4Dt2TmumJW35sh3nzRdbT1uu09r62+P+LuXctl6/ub5syzXa2i+XU+hdSv1Xqs72+E4dP7vUOlvS6FsjzFzWo9veOGu1WtFqtdTU1JCXlycZG2VkZFyfttrPXFYoAZw+fZoffvgBs9nMvn372LdvH35+fu2yaiEjI3NlcFwhbUmpcOmn29fXl8rKSgRBQK/XExERga+v79VuloyMzEVisViuvKG7PQkODuaxxx5DpVLRq1evq2IklJGRuTTs7UhWq1XygWsKlxZKgiBITn1RUVEX5eAoIyPjOnRoQzc0nosKgoBSqbzKLZKRkWkrjrsUPDw8mi3v8ppSc+9lZGQ6FgqFAm9v72bLuJxQkgWPjMy1i/2+yqZw6embjIxMx8de0bBYLC16dMtCSUZG5orRmhV0WSjJyMhcVhxX21paRZeFkoyMzBWlpVV0WSjJyMhcduwDBQYHBzdbVhZKMjIyVwSbPck+yqkzZKEkIyNzRbA5QLe0f1UWSjIyMpcd+1hoLUX5kIWSjIzMZact4XBloSQjI3PZsfkm6fV6CgouyCPSCFkoycjIXBFaG+tdFkoyMjJXjNbsbXW5DbkyMjLXFm3dZC9rSjIyMi6FLJRkZGRcCnn6dh3Q2kSUMjKugKwpXWfYhxiWkXFFZKF0HWEwGOSMMDIujzx9u45wc3OTBJIsmGRcFVlTuo6wF0TyFE7GVZE1pesQWUuScWVkoXQdIAshmY6EPH2TkZFxKWShJCMj41LIQklGRsalkIWSjIyMSyELJRkZGZdCFkoyMjIuhSyUZGRkXApZKMnIyLgUslCSkZFxKWShJCMj41LI20xkZGQuO7YN4LYsuc0ha0oyMjJXFDnFkoyMzFXFXgiJoojFYmm2vCyUZGRkrhiCIODh4dFsmRaFkiAI8wVBKBYE4ajdsUBBEDYIgnCq4X9Aw3FBEIRPBEHIEgQhXRCElEu+CxkZmQ6NfegcpVKJl5dXs+Vboyl9A0xwOPYqsEkUxc7Apob3ABOBzg1/M4A5rWm0jIzMtYvj9O2SbUqiKG4Hyh0OTwG+bXj9LTDV7vgCsZ49gL8gCBGtarmMjMx1weWyKYWJoniu4XURENbwOgrIsyuX33BMRkZGBkEQcHNza7bMJRu6xXpdrM1R6AVBmCEIwn5BEPaXlJQ41innJ5ORuUawtym1JjTzxQql87ZpWcP/4objBUCMXbnohmMXIIriF6IoDhBFcUBISIj98Qv+y8JJRub64WKF0krgoYbXDwEr7I4/2LAKNxiospvmtRqdTkdFRcVFNk1GRsbVEASh1QksWuMSsBjYDSQLgpAvCMJjwLvATYIgnAJubHgPsBY4A2QBXwJPt7359ULp8OHDWCwWrFbrxVQhIyPTQWlx75soivc28dE4J2VF4JlLbVRgYCBjxoy51GpkXAz7aXhrfzUvZupuq9vxek3VdaVSUF3M/V+PuJxHtzM1T/4Crz1aYyu8WFuis4USx7qutM2yqevLXIjLCSUbNuEkC6RrC8eFjLae15Y6bdpRc+fK48v1cFmhJHNt0hYh4KysMwFjK2c/bWvtVOlKaSyy9t96ZKEkc8Worq7m4MGDrRYEVquVqqoqRFGUtB6TycTatWspKioiIyOD+fPnU1paKp1jK6vX61mxYgV5eXlkZGTw7bffUlxczIoVK1i2bBknT57kl19+wWw2X67bdYo8bWsZOcibzGXB2cO3e/duPv30U/71r3+Rm5uLXq8nLCyM7du3Ex4eTkJCAmazmc6dO7N69WrGjh3LRx99xM0338xdd92FWq1GFEU2bNiAr68vO3fupLy8HHd3d+677z6gsda0fft2fH192bhxI9XV1ajVanx8fFi2bBkBAQH8/PPPjB8/HrVafcX65XrUkJqz7TlD1pRkLju2GDpbtmyhrq6Ow4cPs3PnTrZv387GjRvZsWMH586dY9++fWzZsoWdO3eydOlSzp49i6enJ127dpWiFarVaqKiorBarQwdOpSMjAzc3Nyora3FYDBI13NzcyMhIQGr1cqwYcPIzMxEo9GgUqkYMWIEycnJeHt7X1EhIdtJ62lJO5WFksxlxfbLWFtbS3BwMA8//DBubm4EBAQQHh6OyWRCrVbj4eGBRqMhJiaGkJAQRo0aRVRUFMnJyaSlpWEymRAEAZPJhFarJTc3F19fX0aOHMmYMWP44osv2LBhA1D/8FssFmprazl16hRBQUGMHj2a4cOHU1RUxE033UROTg4Gg4GzZ89eze65LrAXwmazmcrKyubLu8Icd8CAAeL+/fuvdjNk2hGbsdneP8hkMgGgUCikz3bv3s2RI0e48cYb6dSpk1TebDbj5uaG2WxGFEXc3d2lenU6HQqFApVKJdWzYcMG+vTpQ2RkZKNygKRlubu7YzAYcHNzw2QyYTAY8PDwQK1WX/fay+XEXsZUV1dz++23s2XLlgOiKA5wVl62KclcFpxtwnTcHS6KIiNGjGDEiBEXnK9SqZyeIwgCnp6eF5SfOHFiq8rZhJubm1uLu9VlLg8t7dKQhZLMZaMl7UPWTq4P7LVlhUJx+UOXyMjIyLSW9gqHKyMjI9Nu2KbmTX5+hdohI3NFaGoTrjxVdA0uZ5A3GRmXp6VY0DKuiSyUZK5ZbC4IspZ09WnXIG8yMh0N25RNXvLvmMhCSeaawzFqgEzHQhZKMtcUcoiQjo+8+iZzzSELoo6NrCnJyMi4FLJQkpGRcSnk6dsl4AoRFjoqV9OpUZ7euTaypnQZcMyU0ZpMGi1l33BWprnPWlNfW3BWV0vtae7abYmbfSmZR5wlFZB/TFwbWVO6BGpqavj+++8ZMGAAO3fuRKlU4unpiUajoV+/fhw7dgx3d3fMZjOBgYEcP36ccePGUVFRgUajoby8nLq6Os6ePYsgCHTu3BmdTodSqSQrK4sbbriBuro6OnXqRGxsLFVVVfz6668AREVFUVhYyIQJE/D39wdg3bp1lJSUEBcXR21tLQqFgrKyMjw8PBg2bBgREREA7Ny5E6PRSGxsLHv37iU+Pp6kpCQOHTpEQkICGzduxN/fn6lTp+Lh4YEgCPz+++/ExcWRmZmJp6cnp0+fBqBPnz706NEDQRAwGo2kpqaiVqsJDAykrq6O0NBQjh49ikajQaPR4ObmhsVioaSkhE6dOuHu7k5aWhrDhg0jODgYURTJy8vj5MmT9O/fnzNnzgD1+6UiIiI4evQoffr0oaysjKqqKmpqaujTpw/5+fmIoohKpcJoNKJSqbBarfj4+GA2mzGbzcTHx+Pt7X3lB4pMm5CF0iWgUqk4evQomzZtYvjw4ezYsYOpU6eyd+9efvnlFwICAujTpw8Gg4GioiL27NmDSqUiNzcXgGHDhjF79myioqLo1KmTFHN61KhRnD59mg0bNiCKIjNnzpQe+pKSErKzs1m7di133303y5Yt49FHHwWgtLSU7du3c9ttt/Hrr7+i0+nw9fUlNDSU3r17Ex4ejiAI6HQ6cnJy8Pf357vvvuPRRx+loKCApUuX8sYbb7Bu3TrGjBmDyWRCo9FQW1vL/PnzGTNmDBkZGeTl5eHm5oafnx+nTp3C39+f6OhoLBYL8+bNo7S0lPvvv5/8/HxGjBjBJ598wtChQ9m7dy9hYWEkJiZy6tQp3N3dcXd3R6lUEhcXR3BwMNXV1Xz00UdER0dz8uRJSkpKOHr0KEVFRfTp04ejR4+SnJxMdXU1t956K5s3b8bX15fZs2djNptRKBRUV1fj7u6OIAj079+fnJwcAJ566im6d+9+1caLTOuQp2+XgMViISAggAkTJlBeXk5AQAAGgwE/Pz9GjhyJm5sb1dXVWK1WabpSVlZGbm4uhYWFlJaW0qtXLwwGgxRJ0c/Pj7KyMvz8/Bg6dCh9+vSRYhqHhITQs2dPUlJSSExMRKPRNLLN3HjjjXh7e5OSkoJarcbT0xO1Wk14eDh1dXWNgq3V1dWxfPlywsLC0Gq17NmzBzc3N44fP46vry9jxozBx8cHgKysLLRaLQcOHMDb2xsfHx/8/f0JCgrC09NTio2tUqkICAiQoj96eHhw4MABvLy8SE5OJjQ0lPPnz+Pn50d4eDj+/v506tQJnU7H+fPnAaTIkDfddBMKhYKEhARiY2OJjIzEarUSHR2Nn58f/v7+9OrVi7CwMHr37s2YMWN4+OGH+ec//0n37t159tlnCQgIoEuXLqhUKmJjY9FoNFducMg0oi1Tb1lTugRUKhX9+vWTohlGRETg6elJQkICMTEx+Pj4oFQqUalUeHt7M27cOKqrqxk1ahQKhYK6ujo6d+5Mt27dqKurIy4ujsDAQHbv3k3//v2xWCwYDAaqqqooKSlBp9NRUlKC0Whk2LBhnDhxgvHjx1NcXIwgCOTn5xMREUF+fj69e/dGrVaTnZ1NbW0ter2e8+fPIwgCBoMBrVaLxWIhOTkZURTp1KkTI0aMIDc3lyFDhuDj40NpaSmiKFJWVsbUqVPR6/VUVFQwYsQI9Ho9lZWVdO7cmeDgYIxGI7W1tfj7+xMSEkJgYCB5eXmcP3+e3r17U1xcTKdOnbj55ptxd3fnzJkzdO/eHR8fH8rLy0lMTMRoNOLr60uvXr1YsmQJd9xxB9u3b6dnz56Eh4eTkpLCqlWrGDduHJmZmRw9ehSLxcKZM2coLy/HYrGgVCqpqqqisrKSiIgIcnNzJcFXW1t7lUfM9Ylj5AZbeOKmkGN0XwIGg4EtW7YgCAJarRaDwSAFrbff6mALeK9UKrFarSgUCum41WqVgufX1dVJsal1Oh2CIEhTElt8abVajVKpxGg0Su2w5UOzjzVt+151Oh3u7u4oFAqpPbbPbde3xcF2c3NDr9fj4eFBVVUVXl5eWCwWqV1qtRq9Xo8gCLi5uSGKInq9HqiPKGib7ikUCiwWC2q1Wrq+Xq/HZDLh4eGBwWBAqVRSV1eHv78//v7+VFRUYDab8fDwoKamBpVKJQksq9WKl5cXPj4+FBYW4uXlhUqlkmJ9WywWdDpdozYpFAo8PDyke1MqlfTq1Yu77roLlUolr8BdQexljMlk4qmnnmL+/PlyjO7LgZubG+PHj3f6mWPQ/KYeAlu5ps6x/9yxfEv1taVMa5fo7ctZrVYp3rJNGNsEo8ViQaFQSELYYrEgiqL02ibEjEajdNzDw6NRwgEbZrMZg8EgHffw8JC0ItvnVqtVEj42QWub9trsViqVqsVfaZnLi8lkori4uNkyslC6TLR2U6izAPvOjrX1us0JJ2dCrrXXsS+nUCgkDQxo9MDbXtv+20cbtD/WGjuPu7t7oxCqbRXU9oLeFWYG1xv2/W+xWKipqWm2vCyULgFXdvxr73KuxMVsupUjB1w97H8QBEGQbLBNIa++ycjIXDFkoSQjI3PVsddSbYs2zSFP3y4Rx+VOZ585rojZ01GmEx257TIdC1koXQJN7dFqzXmtMUhfarvkbB4yroaczeQK0pRAcqY9XSkBcTlWmmThJnMxyIkDrjCO/kWOn9nTXLmL2QV/OXHWJldqn8y1iTx9ayesVis1NTX4+vo2aVuyva6trcXHx6eRMHM25XL2viXsr23vYNiUTag113J0mLT5JjUnjNuDS6n7SpzrrP+gdYJb1jibRtaULpEFCxbw1FNP8e9//5uPP/6YvLw8jEYj+fn50lYQURQ5cOAAM2fOZO3atXz44YcUFRUB9eFPDAYDK1asIDU1laqqKoqKiigrK0Or1VJZWYnFYqGqqgqz2UxtbS11dXWN2qDX69FqtZhMJqn82bNnef/99yWP6S1btvDbb7/x7bffkpWVRU1NjbRFxIYoimRnZzN37lwWLFhAfn4+er2e1NRU5s6di06n47333qOwsBCo9861bca1cfz4cd577z0KCgpYsGABZrMZk8kkeV3bvKydYbFYJC9xm4f2sWPHmD9/vtPzysrK2Lp1KyaTiaKiIvR6PZ9//jmVlZWtdpZMS0tj/fr1F/SDs9eOiKLIoUOHWL58udTPoihSUVGBwWBg7dq16HQ6p3XLGmfTyJrSJTJ06FAyMjK48cYbWbp0KXPnziUhIYGDBw8yZcoUbrrpJoxGI2vWrOHee+9Fq9WybNky5syZw7hx4/j222+ZNGkSubm5+Pv7s2HDBlasWEFISAg1NTW4ublx4403smzZMoYNG8bu3buJi4vj//2//yftVft//+//4eHhQVBQEKdOnWL06NEcO3aM6upqSZuxWCx89NFHuLu7U1RURGZmJjNmzGDQoEHA//1yBwYGsm/fPtRqNfn5+ZhMJhISEli9ejW1tbUYDAbef/997rnnHpYuXUpYWBgvv/yytCH4888/x2AwsHXrVo4dO4ZOp+P1118nMjIST09PCgoKGDp0KHV1dVRWVpKQkMCaNWt4+umn+eabbwgODiY+Pp5du3Zxzz338P333yMIAvfffz9Wq5Uvv/wSb29viouLpb1vycnJPPnkk9x1110cPXqUt99+m+eee46YmBgKCwv59ttvEQSB0aNHc+jQIQIDAzlx4gRms5mgoCB27dolbU/JzMzk1ltvZcGCBQQHB9O1a1cOHDjAgw8+SEhICKIosn79ek6fPs3kyZP59NNPGTVqFFAvaKqqqnjllVcYP34827Zto6CggHHjxnH06FGioqLo16+frCW1gCyULpGIiAi0Wi0BAQEEBwcDkJmZiVqtlqZySqWS0NBQTp06BUBSUhIWi4UDBw5gMBjIzs4mMDCQ7OxsoqKiSEpK4sYbb2ThwoWo1WrS0tJQKpWUlJSQlJQk7QWzCZhz586hVCqJiIige/fuHDt2DJVKhYeHh9ROURS56aabqKiowNfXly5dutCnTx8WL17MoEGDSEpKAuq3dKjValQqFWfPnmXMmDGcO3eOuLg4CgsLCQwMJCgoiBMnTlBQUIBWq8VoNOLm5sb58+fx9PREqVSSmJjI7t27KSwspKioSArPctNNNyGKIunp6ej1eoxGI3l5eWRlZXHq1CmKi4s5duwYoaGh7Ny5Ez8/P+rq6qT9cdHR0bz77rv06NGDBx54gA0bNmCxWPD396d3795kZmaiVCo5efIksbGxGAwGqd/z8/MpLS2le/fuZGZmUltbS3R0NAkJCSxZsgS9Xo+bmxs33HCDdO/btm1jw4YNjB8/npCQELRaLatWrSIhIYGtW7cSHh7OwIEDpU2+tuBy3bp1Y+/evRQXFzNz5kzOnDnDwIED6dmzZ4t+Otc7slC6RNRqNQ8++CD+/v48/PDDQP2DXVxcTFxcHFC/x2v69OkcO3aMrl270rNnT2lXf79+/QgLC8PHxweTySQJk6SkJJ566iksFguenp4UFhZK8Zo8PDxQq9UAREZG8uSTT6JWq/H395c+t+2eV6vViKJIly5diIqKory8XArcZrFYCA0NleImQb1tbPr06ZIWUVNTw80338zevXtJTExEp9ORn5/P8OHDiY2Nxc/PDzc3NwRBoGfPnlLES29vb0aMGIFGo+GBBx4gJiaGyspK8vPzGTNmDGazGV9fX8LCwggPD6dv377ceeedREdH4+HhQXZ2NgMGDGDPnj0EBwdLdqwhQ4bw5z//mfj4eKxWK7169UKlUjF27Fjy8vIYPHgwgiAQFBQEgJ+fH8OHD8fNzY3w8HBycnLo1KkTYWFh1NbWEhoaKgWMs8V1Cg4OpmfPnvj4+DBgwAACAgIIDw8HwNPTk3HjxlFWVsaIESOoqamR7lkURTQaDT179iQtLY2uXbuiUqkIDAwkOjqavn37yhuCW4EcuuQScIW+62g0FaHgUqc0rYms0NRigk0LAyRDvn1gPvvPbe9tx2zlHBcYnN2jLWSNjetlGmff10ajkRkzZrBgwQI5dMnl4HoZVO2Jsz5rj35s7mFvS/QFx+gGLV3LWTn7iAgyjVEoFI0iPjgt01IlgiDECIKwRRCE44IgHBME4U8NxwMFQdggCMKphv8BDccFQRA+EQQhSxCEdEEQUtrlbmRkZDo8NreS5miNS4AZ+Ksoit2BwcAzgiB0B14FNomi2BnY1PAeYCLQueFvBjDn4povIyNzLSGKYotuIdCK6ZsoiueAcw2vawRByACigCnA6IZi3wJbgVcaji8Q6yeSewRB8BcEIaKhnmsK2aYk0xYc7VxtKX8tYLsfe/ucM9rkPCkIQjzQD0gFwuwETREQ1vA6CsizOy2/4ZhjXTMEQdgvCML+kpKStjSjQ+Bss25dXZ3kFNjSZl5nZWyJBByNtG3dtmLvwNfSw2FzerQ/1xb32tERsCnHQMeyjn+tbYsz2npOc210PN6SE2VLjpUtte1S772jYjKZmv281RY5QRC8gZ+BP4uiWO0g9UVBENrUq6IofgF8AfWrb20515VIT0/nhx9+oEuXLkyaNEny2bFYLJJzo1KpRKFQ8L///Y+XXnqJ48ePExYWRmBgIMeOHaNv376Sg6NGo6Gqqorg4GBplai8vJzs7GyMRiMZGRlMnz4dd3d3ampq8PPzk36BbNlHvL29MRqNeHp6IggCer0eLy8vKisrpeSSVqsVlUqF2WyW2mcwGPD09JQ80dVqNbNmzWL48OF0794dtVotOWHedttt9OjRA4DDhw+zbds2xo0bx9mzZ+natStHjhyhe/fu7Ny5E5VKJaVI8vDwYNSoUdL9btmyhfPnz5OcnExRURH9+/fn5MmTiKJIXFwcW7ZsYfr06WRlZZGens6ECRMICQmhrKyMhQsX8vTTT2MymZg9ezZTpkyhS5cuF0RGMBqNLFq0iDFjxkhuGgBr1qwhKSmJLl26AFBdXY0gCHh5eVFeXk5gYKBU1laXXq9n1apV3HrrrRf4ga1YsYL+/fs3Sq7ZFLW1tWRlZaFSqSgpKWHgwIF4e3s3Wjlsj1VJV8Dxflpyi2iVUBIEQU29QFokiuKyhsPnbdMyQRAiAFs08AIgxu706IZj1yRr165l+vTpFBUV8fXXX1NSUsL58+elFRh3d3d0Oh33338/lZWVWK1WfvzxR3r16kXXrl2ZO3cuf/rTn/j1118lB8jMzEwefPBBunXrhiAI7N+/n2+//ZZ77rmH1NRUqqurSUpKYtOmTdx7770MHDgQQRBYvHgxx44d47bbbmPNmjX069cPURQpKChg6tSp/Pbbb5w9exatVotSqUSv1+Pj40N0dDSRkZEcP36cESNG8OuvvxITE0NYWBjHjh0jKSmJJUuWEBMTg6enJwcPHmTMmDFAvSb1zTffMGrUKDIyMli+fDnDhw9n9+7dfPfdd5Kn9OTJk/H09GykdVmtVoxGI1u2bEGv1/PDDz/wpz/9CaPRyLlz50hMTOTgwYPceeedrFu3jvLycoYPH05ISAgqlYrt27dTW1vLY489RmVlJcXFxZw4cYK0tDRuueUWtm3bRnh4OCqVilWrVkn9BFBUVMT27dvp378/n3/+OV27diUtLY3i4mIefPBB/v3vf3PHHXeQlJTErl27GDduHBs3biQlJYWNGzdSVFTEpEmT+P3330lOTqa2tpavv/5a8t1atmwZjz/+eJNC5cyZM3zyyScEBARQVVXFqVOnmDBhAkePHiU6OppevXpdEwLJhr0meMlB3oT6nvkKyBBF8SO7j1YCDwHvNvxfYXf8WUEQlgA3AFXXoj3JRmhoKEeOHJFyqQUEBGA2mzEajRiNRik1km3LR3Z2NgkJCfj4+ODu7k7nzp3RarVkZ2dL6ae9vb2ldE0A/v7+JCcn4+npSZcuXSgtLcVsNhMSEiI5UQKEhYVJmWttwdlPnz5NSkoKeXl5uLu7Y7VasVgsREVFsXv3biIjIykqKqKkpISYmBgCAgKkB6WsrIzY2FjJEzomJoacnBzi4+OlPV2CUJ9uycvLi/T0dBQKBampqYSFhdGtWzfy8vIQBEFKLZ6Xl8fy5cu57bbbUKvVDB48mDVr1hAeHo63tzebNm1izJgx6PV6fv/9d9zc3FizZg1eXl7Snj1ASrKp0+k4ceIEarWaiooKli5dikKhoKioiPPnz3P48GE0Gg29evVqtA+tpKSEgIAAzp07x8KFCxk8eDDdu3cnJCQEX19fAgMD6d69O7/88gvbtm2juLgYjUaDyWSSNNFvvvmGgwcPMnr0aPLy8ujTpw+iKBIdHc22bduoqamhoqKC2NjYCwRM9+7dGTJkCN26dWPz5s0UFhYyZ84cDh8+zIABA+jatStubm6XbdxeTVpafWuNpjQMeAA4IgjCoYZjf6NeGP0oCMJjQA5wT8Nna4FJQBZQBzzS5lZ3IKZPn87BgwdJSkqSbANWqxW9Xt8o9Y+Pjw9du3YlNDSU8PBwacuILevryy+/jCiKBAcHc/bsWRITEyV1t0ePHlRVVREdHU10dDRGo5Ho6GhOnDhBXFycNOD79OlDRUUFvXr14rHHHiM8PJyhQ4eSnZ3NsGHD8PPzY8yYMZSVlUlZaG0e35GRkZw9e5bOnTujUqkwmUxERUWRm5tLcnIyXbp0ISAgAE9PT7KysujatavkEHjvvfeyZ88e4uLiGDlyJLm5uej1egYMGMDWrVulrSs2IeDl5SUZO0tKSkhOTkYQBJ577jnKy8tRKpUolUqpXefPnyc2NhZvb29iY2OBeqE0ZMgQyZM8KysLk8nEvffeS25uruR9XldXh6+vL6WlpY2mUwkJCZSXl1NXV8fNN99MUFAQvXv3ZvPmzZjNZpKTkzl69Kj0vfbq1Yu0tDT0ej0pKSm4ubnRpUsXaXtLYmIiGRkZeHp6SoLl+PHjLF26lHfeeafRj4eN4uJiVCoVMTExUp8HBATQr1+/Fo3BHYmW7KeOyB7dl4CjgdLZ6kp7eCo7eik3dcx2vabKOmtnU9dsbVkbNk9ox7Y1NSDtw584s53YPKUd+9HRs9rxtX14FXvPa9tn9tc6c+YM3t7eBAYGSvGjzWaztH/Nvm5bvTZhafPituWws/e/OX78OF27dpVy3Nk0HsfxYTQaG3mD27fdPmFpR8f+ezKbzTzzzDN8+eWXskf35cT+4Wlqi0NLOBM0trrtr+E4UB2FUVNta6oNzoRIa8+xx9kve1OC2fH+nF3PMQ6Usz5uqk9s5zoKbMdrdOrU6YJjNo3GmTG2Ke9tRwNuz549pTrthZgjjtMzURSv6b1xoihKGZeb49rREa8S9kLD/r/tdXPaAvzf/NrZ+Y7nOBN2zh7qtmhGTX3WWkHq7L/tfGf335TwdKzTWTvaIowd62iN1tGcC0Bz12hO6DrW4ahdt6RpO57nrA5Xx35cCoLgdCprjyyU2onmHiZH7D9z1DBa8o1pqv7WPhitre9irt1aAdeccGnNFNhRwFzMFMfxuk1pqJdyjdbQUp81Jxw7imCyb6dCoWgxK7IslNoBe02hqUHT0i+v/YPh+DA6Hnf2S9naX8+W2tGcPcgRZ4KsufOasgE1V7+zulp7rDkcBVB7POBNaWTNaU7XG6IoXhDx1BFZKF0iNoOlfagLR2yDvrq6GovF0uxUzFbe8TPH+uwFlqONpSmMRiNlZWXSefZtKy0txWKxNLq+7b/RaKS2thao98Z1lgve5hJhNpvR6XQXTDPs78NeeNXV1V1wXWfTwpamgG2Zbjkrczk0oeaE58W2vykNqqNgsViksdQUslC6RDZv3sxHH33EypUrOXfuHLm5ueTm5nLy5ElycnLIyckhLy+PkpISZs6ciVar5ddffyUtLY28vDyWLl1KeXk5BQUFlJSUUFtby9mzZ6WtHIIgYDKZKCwspK6ujoKCAqqqqigoKCA/Px+DwUBeXh45OTlUVVWRk5NDeXk5JSUlFBQUUFdXx7lz57BYLBw6dIj//e9/QP3gNhgMrF69muzsbN555x0yMzOleNf2xsitW7fyxRdfUFtby/bt23nnnXfQ6XSUlpZSV1cnhbY1m81s3ryZjz/+GJPJJAmPPXv2cP78ecxmMxUVFdIDVVNTw+OPP05+fj6iKEpCzWKxoNVqpTJms1k6bvsRsEcURUwmE1arlcLCQv7+979z+PBhli5dyhdffCGVgXqhKor1XvI1NTWIYr0ndkFBwQVC1PEaNmdNx+O2/nREq9VK92Gr+9ChQ3z99dcYjUbWrl3Lzp07nf7wHDlyhOXLl2MwGFi+fDmbN2/m8OHDfP/995w4cYKffvqJ8+fPt3aYugyt0ejl1bdLwGQysXXrVp588kny8vL4+uuvsVgsFBcXU1FRQVFREQkJCSiVSh566CH0ej2iKPL777/To0cPtFqt5HW8dOlSIiMj8fHx4cSJE9x///0MHDgQgB07dvDDDz8wduxY9uzZg7e3NzU1NWg0GoYPH87KlStJTk5GqVRSU1ODh4cHRqOR6upqQkNDKSwsZPTo0Rw4cIDq6mqgfnBUVVXx7bff8swzz+Dt7c1XX33FwIEDOXToEPHx8TzxxBNA/SrVrFmzqKur4+mnn2bdunXk5+fzv//9j6ioKESxPlh+//792bdvX6M+0mq1/Pvf/+aWW24hMDCQjIwMxo4dy/Dhw/Hw8ECj0fDOO+9w0003sWvXLrp3747BYKC4uJg77riDn376icrKSnQ6HR4eHowfP54dO3YwduxYJk6cCMDZs2f55JNPGDx4MCaTiZMnT+Lm5saiRYt47LHHWLJkCadOnWLs2LGsWrWKSZMmsWPHDs6fP8+MGTP46aefiIqKYsmSJfj5+RESEsLRo0e54YYbGDduHAqFgsrKSj788ENmzJhBbW0tVquVIUOGsHjxYtzd3QkKCsLT05OUlBTWrFlDYmIiZ8+e5ezZs/zlL3+R+kmj0bB3717Jk/yvf/2rU4FmMBj49ddf6du3L+vXr6e2tpY//elP/P7774SGhrJjxw4iIiIICwu74NzLZf9qD1qz4CBrSpeASqUiKiqK9evXk5mZiU6nQ6PREBgYKPm62Lyoy8vLKS8v5+zZswQFBUlbUTw9PamoqJD2pVVXV+Pl5dVoinLy5EnKysooLCzEw8MDhUJBZGSkpEH4+PgwdOhQTCYTbm5uxMbGUlFRQd++fcnPzwfq93UZDAasVqvk2ezm5kZ0dDR6vR61Wk10dDT79++XYm3bVgZtMcZLS0spLi6mpqaGvLw8ysrKpPC98fHx7NmzR1oit53r6elJUlISPXv25OTJk4SFhZGdnQ3UD9Dg4GCCgoJYtWoVlZWV1NXVkZmZyQ033MCpU6cIDg6WMr6Ul5ezcuVK9Hp9I+/sjIwMKioqqKurIzAwkDFjxhAfH09cXByJiYmsXLkSQRD47bff6Nq1K4JQv7/ttttuIy4uTvrh8Pf35/fff6eiokLScm3fwYEDBxAEga1bt3Lo0CGOHj1KXl4eO3bsoKysjLS0NPbv309mZibbtm1j7969aDQahgwZQkBAgHS//v7+uLm5UVlZSXh4OMuXL0en01FYWNhos3ZiYiIajYagoCASExMpLy8nIiICT09PBg0aREJCAgqFQtKsO8p0TqlU4uvr22wZWVO6BARB4MEHHyQrK4uEhARpcyvU+7vYAt4rlUrUajUDBgyQvJJra2sJDw8nODiYkJAQUlJSJE/n0tJSoqOjpetMmTKFlJQURFHkxx9/5E9/+hPz5s1j6NChTJw4kU6dOuHn58ejjz7KuXPn6NKlC8OHDycgIICbbrqJnJwcunbtypAhQ4D6vUeCIODr68uTTz6JUqkkPj5ecvTTarWEhoZKK4Ph4eFMnz6dpKQk3NzcuOuuu+jVqxdPP/00gYGBGI1G9Ho948aNo7y8HC8vL8lTXKFQcPvtt6PVarn//vs5c+aMlEFFoVAwYcIEiouLee655zhw4ABhYWH079+f/Px8xo0bx/bt2xkwYAD5+fkolUqCgoLIy8sjOTlZmvYMHjxY2tQrivV59crLyxk0aBBms5nHHnuMgoICunfvzq5du3B3d2fs2LHs2rWL2NhYaavNxIkTiYqKonfv3hiNRrp37y79qlssFp555hlOnz5NcHAwVVVV1NbWShudBw4cSEVFBUFBQQwfPpzOnTsTGhrKpk2bKCkpkTYCl5WVSUklevbsSWxsLLm5uTz//PP88ssveHp6Iooi+fn5VFZWUlhYSFBQEC+88AJ1dXX06tULtVot7fMTBIEff/yRDz/8sEP4OCmVSvz8/JotI3t0XwLO7A7OlrbtP2uurpbOMZvNVFdXExAQQGVlJRqN5oKd6i2t9Dj73NlnzgzTrbkPZ+Wbq7s15zRl5G6N+4DjufbJNJ3F4baVty9nO08QBCnBp80utXr1aqKjoxk5cqS0Cdt2riAIkoe47TpWq1VKGmGrKy8vT0opZavDYrE0ijihVqslTUqlUqHX6xGEeodNo9GIRqNp0TXjauG46vrmm2/y1ltvyR7dV4LmBkVLA6U159gyYwDSlKCtbbuYa7fVJ6il8m25XmveN9cux+P2fmH2rx2/O0etw1bWJjRsU09bBpumruHoKKhQKKRd8rZycXFxxMTENDpPqVRK/jzO4obb/xh1tJjg7RZPSeZCXO0XydXaI9N6OsLUqz0QRfGCrMGOyIZuGRmZK4YgCC2GZJGFkoyMzBWjNX5KslCSkZG5rNibFRQKRSN7mDNkoSQjI3NZcVx9s20ragpZKMnIyFwRbFM32dAtIyPjMrTG0C27BFynODM2yi4FMpcTmxNqS35KsqZ0neMKHv0y1w+iKLaYtlsWStchLcUmkpG5nLTkgS4LpesYW0A2edomc6Ww3z7TFLJN6TrEph3Z8qtdy7RHdElnIYNlLp52Sdstc+1xPT5Y7RX+tjXxxWX+j7aaCGShdB0jP1RtozVhW2Sc05Z+k21KMtcdFyNY7D2R5YWBy4sslGSuG7RarRQnva2YzWaqqqoAWcO83MhCScalsU/V1NSfxWKhsrKSkpKSCz6zUVpayquvvkpGRkar67WvQ61WSwH2ZC4vslCScVlsAsFsNrN9+3aOHTvWKBsL1EcxLCsr45VXXuGTTz7BbDZLSQts6PV6PvjgA/z8/OjRo0ej821JHWxTM5PJhE6nw2QyodfrOXr0qJS+SebKIAslGZdGFEUOHDjAZ599xnPPPceJEycaxUJXqVScOXOGXbt2oVKpOHz4sKQx2c5fvXo169evZ9q0aVJCAxulpaUsXLgQvV5PXV0d7777LmPGjGHOnDl89tln/PnPf+ajjz5i+fLl8rTtCiELJRmXpqamhpkzZ3Ls2DGMRiN+fn6N4mmfPn2aZ599Fp1OR48ePejWrRtBQUFAvUDau3cvmzdvZujQoXTp0uWC7MLBwcE88cQTaDQa3n33Xb766itGjRrF0aNHefvtt+nSpQsjR45k0KBBsoH7CiG7BMi4DI4PvdVq5aeffqJv37785S9/4ZtvviE0NFT6/Ny5c7zwwgt4eHgQFBTEsGHDUCqV0jaGgwcP8tZbb9GpUyfOnDnDBx98QExMDKGhoVLiy6qqKm688UbUajW///47r776KnFxcbz00kvodDruuOMOBg8e3Kr2Xg6uR+1MFkoyLsuxY8c4cuQIQ4YMITU1lZiYGJYvX86dd96Jr68v6enp+Pn5YTAY+POf/0xxcTEbN25k2rRppKamMm/ePCorK8nKyuKWW25h1qxZjB49muzsbLp168b//vc/lEolOp2O/Px8LBYL1dXVZGRkoFariYyMxMvLi59//pkBAwYQHx9/QRsdfZeaS7PlrLzMhchCScYlqa6u5sMPP2Ty5MmkpaWxY8cOPvjgA8xmM0VFRZSVldG5c2dee+01KXkmwJAhQ9izZw8zZ87k+eefR6/XU1tbS1BQEC+//DJRUVEAhIaGcuutt5Kfn09AQAC33XYbhw8fJi4uDoPBwNGjRxkzZgwLFy4kISGBgQMHUlJSAiBpYwaDATc3N8xmMxaLBZVKhUKhkHK0Wa1WlEqllN+tLcJIo9E0Srl0PSELJRmXpKKiguDgYGpra0lKSiIqKopTp04hiiKZmZkYjUbpoTeZTFKiSEEQKCkpISEhgd9//x2FQoG/vz9nz57FbDZTWFgoCQ13d3fMZjM1NTWcPXsWi8XC+fPnKSkpITY2lhMnTpCcnIy7uzu//vorVqsVg8GAl5cXoihKacKrq6upra0F6nfA+/r6YjAYMJvNCIKAwWBotJJoWyG0pXZXq9Xo9XoAjEYjAM8//3yjLMnXE7JQkrlsXEogubi4OP75z3+yaNEiAB577LFGAefLysqYNWsWUVFR3HfffXh5eUn1i6JIcXExX375JV26dGHy5MnSBuQvv/ySqVOnotfr0Wg0pKam4uvry5gxYy4IqeE41bKfll2sPcnZ/jv7vXQ2vyvHJJYdmbb2lSyUZC4LzlKaQ8uZem0Oi4IgkJaWhk6nIyEhQdKCbNg0lPDwcLZs2cJtt93WqJ6CggIKCgqorq5mz549GI1Gpk6dyp49e/jDH/7AnDlzUKlU9O/fn0WLFlFWVsa9997b6kzGF2MXaq0wu9YjN7TE9Tlplbni2C/FN4Wj4DKZTGi1WjZv3kxmZiabNm3CYrFc4G0tCAJ79+6VbD6iKOLu7k5SUhInT55ErVZTW1tLUVERoaGhVFRUEBoaSv/+/dFoNHTv3p2jR49e0Ib2/ruYeq9FbGnLm0LWlGRclkGDBnH69Gm6d+9ORUUFu3fvZvjw4bi7u6PVaklKSiIgIIBRo0axcOFCfH19CQ4ORhAEvL29USqVPPnkk2i1WiwWC9HR0ZjNZkpKShgzZgz79u2jb9++9OrVC71ej9VqvW6Ny1eSloK8Ca7gEDZgwABx//79V7sZMpeJ1sYxcjYWbVM5m4HYWSJDURQxmUyoVKpWa2SOy/iObbtWtZSrgeP3+vbbb/PGG28cEEVxgLPy8s+CzBWjrQ96TU0Ny5cv5/DhwyiVykYCyX4biS1tj0KhoK6uTlrJcixn/9+xXbIQunK0pAjJ0zeZy87Fxi86ePAgq1evZtiwYRQXF1NaWkqXLl3YunUr48aNY+vWrSgUCoYPH05GRgbdu3dn586dFBcXc//997Njxw66detGeno6RqORuLg4aXXrtttuQ61WywLpCmIz9LeUzUQWSjIuiSAIeHp6Eh4eTm5uLuvWrSMqKkpycLRYLBQXF5OYmMjBgwdZsWIFI0eORK1WEx8fz8mTJ/nmm28YM2YMarWauLg4EhMT+eCDDxgwYEAjZ0bZy/rK0FpTUYtCSRAED2A74N5Qfqkoiv8QBCEBWAIEAQeAB0RRNAqC4A4sAPoDZcA0URSzL+YmZK5vvLy8CA0NZcCAAfTv3x+TyUR4eDh79+5FpVLRtWtXvL296du3L1qtlkGDBmEwGNixYwfx8fHcdNNNBAUF4eXlhZ+fH8HBwcTHxzN16lSUSqUsjK4Q9q4QrdFMWzR0C/U1eImiWCsIghrYCfwJ+AuwTBTFJYIgfA4cFkVxjiAITwO9RVF8UhCE6cDtoihOa+4aAwYMEPft29foJlyR1kh6V217R6Cl/m2tEGnKwfH48eNUVlYydOjQC+qRv7crxz/+8Q/eeuutJg3dLWpKYv03W9vwVt3wJwJjgT80HP8W+CcwB5jS8BpgKfCZIAiC6ArLfDIuTWsdF1tbj6MzZvfu3aXjshByXVq1+iYIglIQhENAMbABOA1UiqJos1jlA1ENr6OAPICGz6uon+J1aJpbvZFxbey3h8jCyPVplVASRdEiimJfIBoYBHS91AsLgjBDEIT9giDsP3/+vOP1LrX6y4bVaqW6upqcnBwqKirkMKkdBFkYdRzatPomimKlIAhbgCGAvyAIqgZtKBooaChWAMQA+YIgqAA/6g3ejnV9AXwB0KdPH5eTQs4Eo16vZ/78+fz2229ERESQk5PD448/ztSpUy+bJ3BTAlp+yFrHpWyelWk/rFZrq8dsa1bfQgBTg0DSADcB7wFbgLuoX4F7CFjRcMrKhve7Gz7f3Fp7kis/aKIo8tNPP7Fs2TI++eQTEhISOHToEC+//DIDBgwgNjb2irQBXLufXBG5v64uTXnQN0VrNKUI4FtBEJTUT/d+FEVxtSAIx4ElgiD8GzgIfNVQ/itgoSAIWUA5ML3Nd+GC2ITSk08+Sbdu3RAEgd69exMVFcX+/fuviFCSHy6Za4GWxnFrVt/SgX5Ojp+h3r7keFwP3N36Jromjmq/0WjEaDTSp08f6TMPDw9CQkKorKy8rG2xX+IWRVHeNCrToXB8lloavx1ydDeVMPByYrFY0Gg00v4rQRBQKBRYrVYKCwtb3QZn7XZ2P46hOQDWr1/Pn/70pwvCd7RXX1zpPr0YmmpjU/3Z1HmiKGK1WqmsrHQaDuVi29XUtVrzdzF90NT9uhKO7QoODm62vLzNpJV4enpK8ZZtWCwWTCYT3t7erXbqa+5YU86Btgfo+++/Jzs7WwoDaytfXV1Neno6AwYMwMPD46I8lVvTDlfCsS+bcphsasEiIyOD7du3o1AomDFjBu7u7phMJkRRxM3NrU337ygcLrbvWjrX8V60Wu0FG5VdFVEUqa6uRhCEFoPYyUKpGRyNcz4+PtTV1UnHTCYT1dXVUp6xi8FeG7KF6CgoKCA8PFx6OARBICsri23bttGpUyfpPEEQKC4u5pVXXsHb25uBAwdeUhs6ki+PMwFUUVFBQUEBoaGhhISESOXg/x6KrVu3cuzYMXbt2sVzzz3HmDFjJIG0YMECxowZI/XxxbbLaDRisVjw8PC4oC/thacgCJhMJsrLyzEajURHR7c67IrZbGbBggWMHDmS7t27u/w+PovFwueff055ebmUvKEpOuT0zZ4rpbIKgkBQUBCZmZnSMZ1Ox/nz51vs5KawaUD2D9iOHTsYP348R48eRRAErFYr+/fv56233qKwsLBRe2pqanjttdfIy8vjlVdewd3d/ZL7w1WnANC0pimKIqdPn+aHH37g8OHDzJ07l6KiokZljhw5wkcffSSF1/3vf//L2LFjsVqt6HQ6fvvtN0pKSoiJibnottm+r8WLF5Oamuq0nP1O+dTUVFauXMm+ffuYP38+BoOhVdeyWq3s2LEDs9lM586dpeu7MkqlkqeffprXXnvt2o88qdPp8PT0vCLXGjRoELt27WLq1KlAvaZUW1vbaI7cFtvSxo0bycnJ4Y9//COCIFBZWcl///tfJk6cSJcuXbBarfz66688/fTTVFdXM2nSJKqrq4H6rBhfffUVe/bsYdGiRVLmi6aWXp39YttTVVXF999/z7Rp0wgMDJTKOG6mvNI404aOHz/OkCFDJIOpwWCgpqaGBx54AE9PT7Zs2YJOp2t0zk8//cTdd9/NqlWrcHNzw2AwkJGRgSiK1NTUsGLFCv75z39K6ZDsjbFNTantP7P9P3jwICdPnmTatGnSMVt8cdv7c+fO8csvv6DRaOjfvz+5ubmMGDECNzc3p/dsjyAIZGZmsmjRIt555x3pnOba6goIgoCPj4/0ujk6vFBqKbRme9K7d2+WLl2KVqvFy8tLehjCwsIa2RMKCwsJCAjA09MTvV4vrdTZfxllZWW8/vrrREdH89hjjyEIAuvXr+fkyZN8/PHHeHh4sHbtWv7617+Sn5/PlClTuPPOO/nggw8QRZGjR48yc+ZM3njjDXr37g00Vt2bG9iORnSTycQnn3zCBx98QGxsLJMnT25U1lWorq7mH//4B0lJSQwdOlQ6npmZSVJSkpTRZMSIEY2Eil6vx2w2c+DAAUaOHElsbCze3t64u7tTWVnJP/7xD1577TX69Onj9LqOAsjR/majpqaGuXPn8sADD0i2PavVyvr16zl16pQ0Hvbv30/37t2Jj4+ntraWQYMGERwcjEKhcGqXsn9fXFzMu+++y+OPPy79GDp+764mmNrqwNohhZJ9p1/JLyAqKgqTyURmZiZ9+/alvLxcmkatXr0aPz8/vL29+c9//sO8efOIjo7m2Wefpaamhm+++UbS6IxGI7Nnz+b48eM88cQTANTW1rJkyRJGjhxJbm4u7777Ljt37iQ2NhaDwcBLL71EcXExdXV11NTUMH/+fCkMh20wt6UvvvvuOxISEhg2bBj79+/ns88+w2AwON024woD3WQy8Z///AdRFHnkkUek40ajEY1GIwkkQEqVZGuzRqOhoKCAO++8k/79+0vldDodX375JWPHjmXAAKcb1hvR3INlMpmYM2cOffv2ZciQIdJxQRAYNmwY3bp1Y/ny5ZSUlPD3v/+d8PBwPDw8GglPZ8LF/r/BYOD9999n0KBBDBo0SDpmm7Zf7e+oOdrStg4plK4WPj4+dOvWjU2bNhEXF8fWrVs5d+4c99xzDydPniQlJYWCggJiY2Px9fVlxYoVrF69GovFwhNPPMHw4cMpLi5m/fr1HD58mJCQEAwGAx999BGnT59mw4YNBAcHk5WVRZ8+fXjzzTf573//y7Rp0xg4cCC7d++mrq6OXbt2sXbtWv7zn/8QEBAAtO1Lr6ysZP369dx9993U1dUxc+ZMSktLSUxMJCUlRSpXU1NDdXU1kZGR7d6XrcEmBIxGI3PmzKGiooI333xTWu20WCzk5OQQFRUlPdyOU86KigqWLFlCcnKyFGnS9jDPmjULLy8v7rrrriYFu73xvymhJIoiK1eupLS0lKeeekpaXbLVpVQq2bJlCxERETzxxBNNGsBtONN6rFYrv/zyC56enjz44IOoVCq2b99OVlYWjz766AXndmQ6vKH7SmI2m+nRowezZ8/moYceYt68edx444384Q9/kOJDT5s2jdOnT3PHHXfw2WefMXr0aH7++Wf69etHTk4OVVVVHD9+HK1Wi1qtZuvWraSnp7Nu3TqGDx/O4sWL+eGHH/jHP/7B999/j6+vL3/+85+lzKtWq5UFCxbg4+PD2LFjWbRoEb/88kujFTQbNodPR3x8fJg5cyb9+vUjLS2N1NRUBEFg4sSJhIaGYrVaOXHiBI8//jgvvvhio5jXVxqtVsuXX35JcXExb775prT8LYoi+fn5aLXaRlN4exuPVqvlxx9/pG/fvvj4+BAeHg7UC9tPPvkEURR55plnpOy2zh5om/bY1JRNFEXS09PZunUrzzzzDF5eXo3qKSkpYfbs2URGRnLnnXei0WikzysrK5kzZw7p6emS4LNarZSWljbKc2exWNi0aROrV6+mc+fOLFu2jLKyMn755Re6d+/uUlPs9kDWlBpo7outqqoiLS2NpUuXkp2djVqtZvLkyRw+fJioqCgefvhh+vXrR9euXQkODmbSpEkoFAo6d+6Mj48PHh4ejB49GpPJxNtvv02nTp2Ijo7m3LlzvPPOOwDccsstPPXUU9xwww1UVVXx2muvkZuby9dff01ERASiKKJSqaiqqmLNmjW8+uqrHDp0SLIpDRo0SDKWl5aWsnXrVlJTUwkODuauu+4iIiICtVqNm5sbdXV1LF68mLVr11JaWkpZWRmBgYFMmDCBffv2sXTpUjZs2EBmZiZ//etfOXbsmBQdISoqisTExAsMrM5ozfJ2U1gsFg4dOsTMmTOJiori5ZdfZuvWrXTp0gV/f3+MRiMZGRkMGjSI6upq/Pz8gHqNoqSkBD8/P9asWUPv3r3x9PRErVYTGBjIkSNHmDlzJp07d+bpp59m9+7dnDt3junTp3Pq1Cnp3srLy9m9ezfLli3j/vvvZ+zYseh0OlauXIlSqeTOO+8EICMjgzfffJO+ffuyaNEiRo8ezdChQ7FaraSnp7No0SImTJjAmDFjJG2uvLycH3/8kb1799KrVy86deok/RAsX76ckydPctttt3HHHXdgMplYs2YNn3/+OXq9nqKiIqKjo5kzZw55eXnExcW1uK+so2lPslCyw1FdLioqYsOGDaxYsQK1Ws1dd93FmDFj2Lx5M8uWLaOyspJJkyYRHBzMuHHjpHpGjBhxgU0A6o2Ue/fuZdasWcTFxfHYY4/x4osvMnbsWLy9vRk5ciSCILBz507S0tKYNWsWffv2lQaav78/0dHRnDlzhuXLl/PDDz+QkpLCiRMnuOeee1CpVNTU1ODp6Ul0dDRDhgxh9+7dvPrqq+j1elQqFV5eXuj1evLy8qRcaI888giHDx/mjTfewGKxcOONN/LRRx+xefNm1q1bx6pVq1CpVFLA9+7du3P77bczePBgIiIiGi3xXqptwyZUfvjhBw4cOIBWq+Wpp55Co9GQlpbGyJEjOXv2LEqlkuHDh7N+/Xq8vLy4+eabJaP9l19+SWBgID179sRgMPD7778zZswY5s6dy8KFC5kxYwa33norP/74I/n5+UyaNIlPP/2U0NBQIiMj2bdvHz///DMDBgwgNDSU2tpajh8/zsaNG0lNTeXFF1+krq6OjRs38r///Y877riDsWPHYjabycvLw2QysWPHDo4dO8b9999PWloaJ0+epFu3btI4WL9+PU8++SRdu3YlPT2dtWvXYrFYGD58ODqdjtraWs6ePcvXX39NbW0t8+bNIzc3l9raWnx9fRk/fjwrV67kl19+Yfr06QQEBFww3joqLpH3rU+fPuKhQ4euamfa+sFmp/j555+lX+Y77riDQYMGSc6MhYWF3HLLLVRUVPDpp5/i4+MjGYhtKy5qtVpS5c1mM1qtFm9vb8rKyggJCUGlUnHo0CFeffVVamtreeihh3j22WcpKSnBarVSVVVFbGxsI1uJ1Wpl2bJl7Ny5kxEjRjB69GiCg4M5f/48WVlZiKJIbGwsUVFRuLu7S7/41dXVVFVV4eXlhU6nw2q1cvr0abRaLYMHDyYsLAyDwUBFRQWBgYGEhoZK16urq8NkMuHp6YnRaCQ9PV2aSkRERHDjjTfyyiuvEB4e3sj20honTMexl5eXx2+//UZgYCD+/v5kZWWxbt06nnjiCXr06MGiRYsIDg4mNDSUPn364OnpyZ49e+jZs6fU10ajkfnz5/P1119z++23Ex0dLWlI7u7u5OTkMGzYMKqqqpg7dy5Tp07l1KlTjBw5kmHDhrF06VJJ4G3ZsoXU1FQmTZpESEgIsbGxfPPNN9x2222cPn2aVatWMX36dGbMmIFKpeLHH38kMjKSjIwMBEFg+vTpeHh4UFFRwcKFC3nwwQcJDQ1l8eLFLF68mPHjx0tjYtmyZdx1111kZGTg4eHB8OHDWb58Of379+e5556TltPt+81oNLJixQrS09MJCAigT58+JCcnExoa2sj47WpCau7cuTz55JNNhsOVhZIdNTU1fPHFFyxfvpxx48Yxbdo0kpKSpNUcewe5hx56iIyMDGbOnElVVRUqlUryDDabzSiVSqqrq6WtKJ6ennh4eGCxWKS/uro6MjMz+frrr/nrX/9KbGysJMSgXu0uLy8nKCgIhUIhGXfr6uqkawiCgJeXl7SPS6/Xo1arpcSM9kvMBoMBQRAaOVnaG1WdbZS0/9wmpDw9PVEoFERERPDxxx9TWVnJSy+9xJQpUy7oq7Zsm8jNzSUrK4tRo0YhiiLff/89Z86coa6urpFB39vbG5PJhLu7OzqdTrqm0WhEp9NRUVGBh4eHZKA/fvw48fHxFBUVUVRUhEajISYmhqysLCIiIqiursbd3Z3y8nLc3NyIjIyktLQUlUpFbm4uffv2JSQkBL1ez++//46Pjw9xcXGkpaUxefJklEolRqORkpISzpw5g6+vL3379qWoqAiLxYK7uzulpaVotVoiIiKoqqri9OnT9O7dm8DAQHQ6Hbt27aJXr17U1dVx+PBhZs+eLf1AqNXqZvvQYDBQVFRERkYGp0+fxsvLi3vvvbfRPk1XoiWhJE/fGrAtt+7evZuPPvqIvn37SoPdhu0hz8nJ4fjx40ycOJGePXvyww8/EBwczE033dRoAFRUVPDxxx8TFBSEwWDg5MmTvPLKKwQGBlJXV8fbb7/NDTfcQE1NDWazmdjYWKKjo/n6668ZOXIkfn5+zJ49m3/9619otVoCAwPJzs7Gzc2NxMTEC/YQfffdd+Tn5xMaGkpdXR0PPPAAvr6+lJeX4+fnx0cffcTYsWNJSEiQhJeXlxcKhULy2fHx8aG6uhqNRiPZaZpaqgYYMGAAc+bM4fXXX8fd3Z3Jkydf9K9zbGysFALG5sQ4fPhw9u7dy1NPPdVo2d9isfDdd9+h1Wq56667yMnJoXv37tKeQNsPhEKhwGQySW0/ceIEXbt2lYzj+/fvJy0tjYceekja2+ju7o7RaESr1fLFF1/wyCOPEBQUhMVi4dlnn5WuYb8H0SbUnRnE7X/M4MJd8qIo8pe//KVRWUd3gaawlY2Pjyc+Ph6LxUJRUVGHjogqC6UGzpw5w/r165k7d67kjOiIbfDNnz8fb29vXnrpJby9vYmKisJgMFwwUD09PdFqtRgMBvr27cu6detITk7mkUceQaPRYDKZ+Oabb5g2bRrp6eno9XpmzZrFp59+SnFxMf7+/litVr755htSU1OZPn063333HSNHjuTJJ58EkASTXq/nyJEjPPXUU5w9e5avvvqK0tJSUlJS+Pbbb3nppZfIz8/H19eX77//nsOHD6PT6aipqaFHjx7079+f+fPnM2XKFLZv305cXBxvv/12I4O2M2ETHBzMq6++SkJCAj/++CMTJky4YEm8KZpbFlcoFFRWVrJ//34CAgJQq9WSZmizHR05coTw8HDy8/N59913uffee8nJycFqtTJlyhS++eYbEhMTOXfuHHq9nvHjx/PRRx/x1FNPMXHiRARBICQkhPLyctRqNQsXLqS6uprbb7+dhQsX0rNnT6qrq/nkk0+YPHkye/bsYeDAgYwdO9Ylp0VQ76Nl8+7vqMguAQ24ublJTnjNDbj9+/fz888/89JLL0m+SOnp6URGRrJhwwYWLFgA/J+ntEqlws/Pj9DQUFJSUhg8eLBUf2RkJEqlEn9/f9RqNceOHSMoKIjp06dLaaiVSiUGg4EuXboQERGBj48Po0aNkgSYbYOwUqnE3d2ddevWkZubS6dOnaisrCQtLQ13d3eKiooQBIEDBw4QHBxMYmIigwYNws/PD61WS1paGqIoUlpaSlxcHDU1NdTU1LSq71QqFffccw8zZ85slOTxYrFpCxEREWzYsAG9Xk9WVhbLly+X6jabzcTHx1NYWIjRaCQyMpJOnTpx5swZjh8/zuHDh0lPT+f48eN4enrSt29funXrRlRUlOSBLwj14Wd0Oh1Llixh3bp1VFZWcvjwYQ4cOEBqaipFRUWUlpZy5MgRDh06RG5urksKo2sJWVNqICYmhu7du7Ny5UpeeOEFpwOvsLCQl19+mVtuuYWbb74ZgDFjxpCSkkJUVBQ5OTlER0c3UsH/9Kc/IQj1ue7d3NxISEgA6h+8Rx99lIceegi1Wi3t9HZzc8NqtUqqu9VqRaPRSAbyN998Ex8fHwwGA5WVlZKarlKpePbZZyktLSUyMlKyO6lUKmpra/Hz82PAgAGS7cu2VcbmOAhIK3dmsxlBEPD19QWa1njs7VK2+7NxKQ+u7dxRo0bxzTffoNFocHNzazR98/DwoFu3bvTv35++fftSVVWFr68vTzzxBMXFxXTu3BkPDw+8vb3x8vLCbDYTGBgobaGxXcOWUdfd3Z2//vWvVFVV0blzZ+6++278/PxQKBR4eXnh5eVFeHi4pEXLgunyIRu6GxBFkcOHD/Pcc8/x6aefNtoHJYoihYWFzJgxAz8/Pz755JMmA1VdqSVZi8WCXq9v9KBebhz9YVpzr23pC1cYi9D8d+iqK1odiZYM3fL0zY5evXrx8MMP88Ybb5Ceno7VasVsNrNjxw7J0Prhhx8SHBzcSEuw/7Otkl3uP5VK1WxwuctxTWfXcBQkLZ3THO3Rpva6d2e0dsOzzKUhT9/sUCgU3HfffVgsFl555RW6du1KTU0NGRkZ3HnnnTz66KPSipQ0cAsKoLT0qrVZBHB8QK7Er7htZSkxEcHbu+GyV1d7uJxa6rXglNhRkIWSHaJYHwr1scceY/z48ezZswelUskbb7xBTEyM9CvayMfn888hMRGuVkhSUWTvvn1kZWUxedIk/Pz9r9y1DxzAfOutuDV4sMPVE0z2oWzbG1EUycrKIiwsTLKzyVw+XEooXe2BbbuuIAjExsZKgsjxV9JeMIkeHnDnndCgLVzKdeHipgV9br+dzJ9+4sPMTB6bMIG4uDiaqsXZlMu+Dc52q9sfl46JIqYGJ80rqUU4tt1sNpOdnc25c+coKSnh9ttvb/fr7dy5k1mzZjFz5swWhVJL/deaz5yVuZ6QbUoNNGUzaekzoNH0SRRFKisrycjIoKysTDpm/3lraItwcnNz4w9/+AP33XcfS5cuZefOnRiNRnJycsjKympUn81AbV+/1Wrl1KlTFBcXt6pdoihisVjYtXOnZEO7Ejj2iclkYuXKlZw8eRIPD49GO/QdyxoMBg4fPtwo8YN9OavVKgXtKygokCIDnDp1infeeYcnnniC0NDQJtvl2Kct3UdT51zMWLnWcClN6WrT1odLFMVGAslqtbJ7927J4S8/P5/nn38e70vQohpdC5rU3AC6dOnCE088wbp163j77bfx9PTkoYcecqrJ2GtMx48f59dff+XBBx9slbYqivUxr2tqav7PtnSFbS5ms5lt27YRGhrKgAED+Pjjj5vVkvbs2cOZM2fo1auXtIBhMBjIysoiOzubrKwsTp48ydmzZ+nZsyfvvfceOp2Od999l6lTp0qbpVvDxfSFvde3yWRCqVQ2u73kWsYlhJKjS3xHNCparVY2btwoBazv06ePU83DUW1vbqXHVt7Zqo9jRAPba29vbwYNGsSKFSsuiLXjrB6tVsvy5cuZMWPGBRlAmsJsNrN161bu6d9fMqpfye9LFEVWr16N1WplzJgx5Ofno9FoiI+Pd6pplJWVMXv2bB588EHWrFnDmTNnKCsrw2Kx4OXlRXJyMj169CAtLY2XX36Z4cOHU1NTw3vvvUeXLl148MEHG6W0aqpNgiBIexKdYYsb3lQI5+rqahYtWsTOnTtJSUm5YGvN9YJLTN868j4dqB+Qu3bt4vz584SFhREeHs6RI0cYNWoU3t7ejQSJjbq6Os6ePSsdt/1ZrVYyMjJYsGCBNPWyCaaSkhI+++wzsrKypGOiWB/18NixY9KxtWvX8swzz3DnnXfy1VdfceTIkUZ71nbv3s3mzZuB+uwpXbp0cSqQmpqSnDx5Eo1GIwVNu5w4m+YUFhZy9OhRJkyYgMFgYN68eeh0OhYsWMDSpUsxGAxS2OKffvqJl19+mXPnznHw4EG0Wi0jRozgqaee4vXXX+e1115j8uTJ/P777zz88MOMGzeOtLQ07rvvPjw9PXn22WebDDdr3y6bQHrvvfekHyP7thcWFvKXv/yFTz75xOl9lpeX889//hOr1cr7779PbW1to+w11xMuoSk5m1p0JIqLi9m/fz8DBgzg1KlT0nYQ+3jQcOF9OabUsU3/cnNz6dOnjxQRURRFDh48yK+//kpRURF33323VJ8tM8a///1vAM6ePUtNTY3kvf3HP/6R77//ntraWgYPHiw9xDNmzKCqqorU1NQmPdht2AsEvV7Pzz//zAMPPIDi2DGn99VeNGVTyczMpE+fPvz444/s3r2bvn37SskCZs6cyYEDB1AqlYSEhFBbW0t2draU8cVZW9evX4+7uzsBAQH885//ZNu2bXTt2pUXX3yxTVNvlUrFAw88IGWDsd2D0Wjk448/xs/Pz2mOwPLyct544w2SkpJ47LHHOH/+PBUVFU3asK51XEIodWSDnslkYvXq1fTu3ZtNmzbRt29fQkND6devH3V1dWRnZ9OjRw/pl9YW18jT01MK+mUjMzOTQ4cOcdddd5GdnU23bt04ffo0O3fuJDc3l1GjRnHmzBlpsBoMBj744AOGDx8uRUpcvnw5sbGxLFmyhJKSEqB+J//BgweprKxErVYTEhJCSkoKv/32GwMGDMDX1xeLxUJJSQnBwcHS/jVH7UAURTZt2kSnTp2Ij49HaBBKV5Lc3Fx+/PFHhg8fTu/evXFzc+POO+/Ezc2NHTt2cPDgQd5++22GDRuGxWLhhRde4KWXXpIEkqPNLDs7m08++YRevXqxZs0avLy86NGjB//4xz8uiGHkrE8cP7Ot2Npz5MgRKTrBrbfe2uizmpoa3nrrLcLDw3n00UfZt28fa9as4b777rtu3Q9cYvrWkYVSbW0tSqWSbdu24eHhQY8ePUhJSUGr1TJz5kz+/e9/Sys+mZmZvPHGG1RVVV2gJdXW1rJ27VqGDh3Krl27CAoKYunSpbzwwgts3LiRBx98kEOHDjFhwgRpqvDtt99SXl4uOXjW1taSkpLCP//5T5KTk9Hr9cTFxdG1a1ceffRRDh06xOzZs3nyySfR6XQcO3aM0aNHU1NTw+eff87f//53MjIyyM/PlzK12E89y8rK2LRpExMnTmxVWI32RBRFcnNz2bp1KxqNhrvvvpuwsDCmTp0qBd/z8vJizJgxDB06FI1Gw9KlS/H19ZWigtpvEamrq2Pnzp387W9/o0uXLjzyyCOkpKRw5swZXn/9dcLCwjh79ixVVVWA85VYRwHnzBtcFEU2b95MaWkpDz/8MGFhYdJxo9HI//73Pynsyn/+8x+2bNnCk08+2arsKtcqLqEpOdKRDN22B2GERkNERAQajUYKFnfo0CFefvllKTjYG2+8wZAhQ8jMzOTUqVM8+OCDQP39pqamUlhYyJEjRwgNDWXVqlX8+OOPaLVavvvuOzZv3kxiYiL79+9n3LhxLF68WIq6OGHCBLy8vPjhhx949NFHOXbsGCtXrsRsNhMWFkZoaCj5+fkcP36cmJgYUlNT8fLyYsCAAXh6evLpp5+SlpZGly5d+Pbbbzl69CgPP/ww8fHx9OzZE29vb6xWK0uXLuWmm266pDTlF4Nt+urm5sZ9992Hv78/e/fuJTk5WUpblZmZyZdffskLL7yAl5cXmZmZ/Pbbb7z//vuNspjYMtPOmjWLQ4cO8dprrzFt2jTWrl3L+++/z4IFC4iIiCA/P59nn32WGTNmMGjQIEJCQsjNzeX777/npptuIjY2lj179tC7d288PDw4e/Yse/fu5ZFHHiEwMFBKv75u3TpOnDghhViBeu06KyuLLVu2sGXLFgYNGkRtbS1PPPEECQkJV1zguxouKZQ6EgaDgf3799N3xAiKioo4evQomzdvlvJ7VVZWsnDhQlatWkVgYCCdO3dm69at+Pj4cO7cOUpLS8nMzCQ1NRWDwUBdXR3V1dWcPXtWmuZt2bKFESNGkJyczPHjx3n77bfR6XT84x//4JdffgHg559/lsKvLly4kODgYIqLi+nUqRPr169n+fLlREVF8cYbb0jxvW2hT3JyctBoNHh7e/PQQw/x2WefYTab+f333wkKCiIpKYnjx49TXV0txRKC+i0uAu3n9OpMY7ZareTk5BATEyNF4OzcuTObN29m4MCB1NTUSDG1H3/8cbp06YLZbGb27NncfffdUtA4qF/9mjNnDvPnzyc5OZmvvvqKwYMHo9PpSE9PJzExkYULF6LRaCgtLWX06NHS92nLqjtmzBi++OILzGYzPXv2ZPfu3eh0Ovz9/dmzZw8xMTF4eHhw4MABTCYTo0eP5v777+fUqVMcPHiQo0ePYjKZ0Ov17Ny5kwULFtC3b98WV/cuN1fbcdkelxNKrtAprUWv11NcXMxRs5llGzYQFRVFQkICnTp1wsPDg7///e/069ePnj17kpiYSFZWFlVVVcTFxbF582b27NlD586dSU5OZuTIkdTW1uLh4YFer+f06dM8++yzHDx4kK1bt1JbWytFluzRowfDhw/n1KlTbN26VYqCmZOTQ05ODp07dyY6OppDhw7x/PPP06VLFyIjI0lKSmLv3r2IokhVVRXvvPMOw4cPp7S0lKioKLp27crZs2eZNm0aUG+AXbBgAZGRkWzbto0HHniAI0eOoNPpCAwMpLsoYv9ttedDZbVaKS8v59ChQ3h6ehIXFyfFNvr555+59957OXfuHAsXLmT79u387W9/Izw8nMLCQjIyMigqKmLgwIGcO3dOeuCKi4uxWCx8/PHHkoZTUlKCyWTioYceQqvVcuDAARISEkhKSsLNzU0KZ/z000/z0EMPMWrUKPz8/DCZTPTv319aXVOpVKSmppKWlkZoaChTpkwhOjoaNzc3jEYjCQkJJCQkSD5S//rXv3jggQdISkpCq9VecP9eXl5Nuha0N025jVwtXCJ0Sffu3cVjl3kl53JgMpmoefVVMidMQOnvj0qlQq/Xo1AoUKvVVFVVSbYDlUolhXi1hWrV6/XStMKWEcQ2yHU6HW5ubqjVaimQm9VqlewntrjftbW1mEwmfH19pfjgNjuXLVmBQqGQ4jLZEgeIokh2djapqanccssteHt74+bmhtlsRqFQYLFYqKqqkuKFq9VqzGYzvr6+qNVqYmJiGFxcjBAeDjfcIPXJpXx/9mPRaDSycOFCMjIyCAsLkzK1pKWl0a1bN9zc3NiyZQu9evUiKCgIjUaD1WrFarWyYsUKevfuTXR0NNXV1VIih6CgINzc3KiursZoNOLh4UFtba30Hfj5+UnxtAWhPpa5n58fZrOZwsJCKb6Sm5ubFDJXrVZTW1srJWqoq6vD29sbo9EofV+1tbUEBARI321qairZ2dlMnz4ds9ksBdOzCQSFQsETTzxBWFjYFXkeHIXS5Z4+dqgY3R1JIEH9ErBaFEn/y1/oN3gwfQcO/L8PGwzDK1asIDExsVF+e9u05+DBg1RUVGAVRUaMGoUgCFjMZup0Onx9fSkrLcXPzw+VWo3FYkHR4PGrUCjq44cLAqLViqBQgG1LS0PdElVV/+d1XllZ/18QQBSxBgSww9sbr717G8ckt/8ebMdEEZRKqKurf3iqquDIEXjgAaloe35/CoVCiiZ58uRJ7r//flatWkVycjJ33nmnJHgjIyPp37+/FP/KarXSq1cvwsPD+e2330hMTKS8vJy//vWveHh4SAJZr9cjiiJKpVLaKpOZmcm5c+dISkrib3/7G2+//TYHDhzg/PnzvP/++5Jwt92nLSa3sx92ZyuXglCfvCE1NZV//etfjBw5EovF4tRPrykHy8uNKzyDLiWUOhpms5nZKhWPzptXr83Y7Bc2T+uSElI3b+YsMGT0aGkHu+1rr1AqWbduHVFRUaxdvx6lSsWQIUM4mpHBvdOn88HPPzNxwgTKi4o4X1xMaUkJeXl5dOvenddffx23BgOuPc0OKVH8P4EjiigEgVHjx3P8+HHeX76cP/7xj4SEhNTXaXvQnO37a/gTb7wRLlNK7/Pnz5OYmIharWblypWsX7+es2fP8vzzz6NSqfDx8SE3N5fS0lLi4+Mlga9QKJg6dSpbt27l5MmTjBo1ihMnTvDOO+8wYcIE1qxZw7Bhw/j1118xmUz069eP9evXc0ODtpeQkEBMTAxRUVGo1Wq6dOlCVlZWo9x2l8KxY8fw9fVlxIgRlyWiwcXgzFWiPWnrbMxlhJIrSOi2olQq8YmPZ8nevfj5+dFFo0GlUpGSkgKAQa2mOjgYj+BgzgoCGenpTJw4URrgJfv2oe7ShSPnz1OhVCIAY7p1Q1daij4yEmVSEsrOnak5cwaPoCD8Y2Iwx8ZSo1RiiIxEbRfH6FL6r1t8PLUhIXyxfj0PP/ywFHi+qT120vuLvqJzbA+HTqfj119/ZcyYMWRnZ5Oeno4oitx+++3Stgvb9MrmMb9v3z6SkpKkVEyenp507tyZQ4cOER4ejsVi4ZdffqGsrIzq6mqCg4MZMGAA8fHxbN26lQcffFDaH2fbF1dTU4Mg1Kf/NhqNFwiRtvS5TaM6cOAAgwYNwt3d3aXGvCu1xWWEUkdEEATuu+8+Tp48SXx8PBUVFdImSkEQCAoK4m9/+5u0ihYUFNToyx81ahR9+vSR9kSZzWZpy0d4eDjPP/88VquV4cOHU1JSQmBgIAUFBXh4eDQa1Jc6oARBYODAgfj6+vLdd98xZcoUunbt2mif3JW0bZSXl1NSUsLhw4eZNWsWU6dOJSUlhfT0dEaMGFE/zbVYGDlypBSHfNWqVUybNg3/hnhSISEhREZGMn78eCoqKhAEgdDQUDIzM+nfvz9qtRqFQoGvry/9+/fHarUSFBQk2fo6d+7MuXPn8PHxISgoiKqqKkJCQi65L2666abrbj+bo7+bY+qyC8q7iqH7+PHjV7sZbaapsBPOBq3jZthmYxW14brtIZjsB0xJSQlLliyhX79+DB06tNFS9eUWTLZ26HQ6li5ditVqZejQoSQlJbXoTW0zOttw7OvWbn52rLep947lW3tvF3t+R8bx3hcvXsx9993n2hlyO7JQak7YtLWutg7y5qZWzsrb40wo2tDr9axatQq1Ws2NN94o7f+6UkKpLeVt0yxfX982231a6vOWPpeFUutwvPfVq1dz2223yYkDLhdtEQxNndtaLcTxWhejWTk75liPh4cHd911F126dOG3336jqKjoimwFaus9paWl8dhjj/G3v/2NBQsWSO4LjnU2VX9L/dnRN4q7Cm3tN1kotTNN/SI6+7N9Zl/GGY7lnb1va7ucPXCO9Xbr1o1JkyZx/vx5ye51JWiuv6D+Xk6cOMGzzz7LqlWr6NOnD3l5edJ+wpb6qLm6m7p2U/1/Kfd0PdGW+5WFUjtiMpkuCLfaHtjbfC5WY7F5JtvX1Ro0Gg29e/e+an4zzjCZTMyaNQs3Nzfuuusu4uLipLTpMh0fWSi1E6IosnDhQnbs2CG9t//M/s/+WEt11tTUOI3M6awu25/FYsFisTR6v3jxYk6cOHGBxiGKouRQ6Fino3bgeJ32EJZtRRRFDh06RF5eHj169CAkJIQuXbrg7u5+SeFjnd1bc38ybaMtfSYLpXaitraW3377TdoAar8MCk0HhG/K3mO1Wjl69Ch//vOfyc3NdXqOTWhlZ2dL9hSj0cjs2bPZunWrVGbbtm2UlZWRnJx8wbXKy8v58ssvG03PTCYTa9asoaCgoMX7bule2htBENi6dStubm506tSJgIAAzp07R0JCwkU5I9oLGrPZzO7duzl9+jRQ3w+2KaEsiC4exzFiNBqbLd9qoSQIglIQhIOCIKxueJ8gCEKqIAhZgiD8IAiCW8Nx94b3WQ2fx1/UnXQwcnNzCQoKuiBEbF1dHYcPH2b+/PkcOXIEvV5PSUkJer1eiizpSEVFBYsXL2b58uWkpKRIWyJsf6WlpWzevJmvvvqKr7/+Gp1OJ22B2LhxI3V1dfTt2xeoj0S5du1a7rvvvkYPre0h/OSTT9izZ08jDWrr1q289dZbF8R8aoorqT3odDpOnjwJQEBAAElJSWzcuJFhw4Zdsp1m27ZtzJo1i/Xr12OxWJg7dy4rV650WlYWUheHIAgtbjRui/Pkn4AMwBYO7z3gf6IoLhEE4XPgMWBOw/8KURSTBEGY3lBuWlsb31GwPdzff/89jz76qOQYZ5v+zJs3D6PRSGhoKF988QXBwcGcPn2agIAAYmJieOGFFy5wJisoKODYsWNUVlbSuXNnAgMDEQSB8+fPs3jxYgoLCxkxYgTjxo0jOjpamrb8+uuvHD9+nCeffBJfX1/q6ur46quvmDZtmhSD277d69evZ/Xq1cybN09aTq+pqWHu3Lk8/vjjxMfHN3nfer2eiooKIiIigEv3Km8tJ06coLCwUErM4OPjI2lNtvu6mHYcP36cQ4cOMWLECOLj48nOzmbu3Ll88cUXwP9pvr/++itKpZLx48e3631dT7S04bdVmpIgCNHAZGBew3sBGAssbSjyLTC14fWUhvc0fD5OuIaXGgRB4MiRI1gsFnr06MGqVas4fPgwUD+l0+v1vPDCCwwZMoT09HRMJhMVFRXExMSwYcOGCzKeWCwWKX5Pt27dqK2txc/Pj7y8PD7//HNSUlJ46623uPXWW4mPj5cE0qFDh/j000+59dZb8fX1RRRFtm7dSkREhLTtxZ7Tp0/zt7/9jT/84Q/06tULQaiPPDB79mwSExO57777mhw8FouFlStXUlFRIfXBlaKwsJD8/HwiIiKkQGk333wz58+fv2iBVFpayi+//MLtt9/OmTNn6N27N5s3b8ZisZCYmCiVq6ioYOHChcTFxbXnLV03tFa7bO307WPgZcBmcQ0CKkVRtDmG5ANRDa+jgLyGRpiBqobyLTa4IxoSa2pqWLBgAY888ghVVVW8+eabFBUVIQgCOTk5BAQEIAgC27dv54UXXuD+++/nk08+YfLkycyYMYPAwMBGBue8vDwyMjKoqamRIisqlUoWLVrElClTGDlyJB4NKcJtD2BhYSHvvvsuN910E97e3hQVFZGRkcH3338vZfwwmUxSm/V6PZ9++inDhg3j8ccfl7y216xZw7Fjx3jllVekiI5Qb6fau3cvpaWliKLI77//jk6nc2qjutxUVVXh6enJtm3byMrK4pZbbmH+/Pn8+9//JiMjA6PRyPz58ykoKECn05GWloZOp7tgfFmtVk6fPk1RURHffvstQ4YMkUIEa7VaVq9eTd++fRvFyd64cSN+fn5UVVVx6NChCxYInC0YyFy466ClH44WhZIgCLcAxaIoHrj05jWqd4YgCPsFQdhfUVHRYb/E48ePk5CQQGJiIgsWLMDd3Z2+ffsiiiLbt28nJSUFQRC49dZbueWWW4iLiyM7O5vKykpuvfVWadpky9A6b948xo4dC9RP4/r160deXh6+vr5SeA74PyFeU1PDhx9+yIQJEyguLmbp0qWsWrWKd999V4rC+N///pe5c+dy/vx5jh49yksvvYS3tzf/+c9/8PHxkYzq33//PS+++CJHjx4lNzeXwsJCdu/ezWuvvcabb76JxWIhLS2NnTt3MmXKFFQq1RX3u4mJiSEpKQmdTscXX3yBQqHA3d2dsWPHsmvXLinKpi242r59+6iurr6g36BeyEyfPh29Xs+IESOkxA+vv/46aWlpDB48uD60jNVKWVkZs2bNoqKigtTU1Eaxjmx2QvtryDSmLeOjNTalYcBtgiBMAjyotynNBPwFQVA1aEPRgG2ppgCIAfIFQVABfkCZY6WiKH4BfAHQtWtXseFYh3Mq27VrF6NHj+b06dOsWrWKxx9/nLCwMPLy8igvL5emRqGhoRQUFLB06VLCwsIYO3bsBYbn9evXo9Fo8Pf3RxDqkwN06tSJEydOkJycLNk1bEJAp9Mxd+5cBg0axNSpU/nggw949tlnpUyvzz//PHPmzGHYsGH8+OOPFBUVoVKpKC4u5pVXXmH+/PkkJSVx/vx5VqxYwf/7f/+PqKgo3nvvPXr27Ikg1AfjLy4u5vHHHyctLY1t27bxwgsvSBtfrzQDBgyQArUtXbqUHTt2YLFYCAwM5MiRI5SUlPDGG2+QlpbG0KFD+eMf//h/cawcxlePHj04duwYjz32GFVVVZw+fZo333yTf/3rXxQXF7N48WJycnK49dZbWbduHZWVlYwfP57777+f7777jokTJ1JWVsbixYspLi7myy+/bJdsyNc7LQolURRfA14DEARhNPCiKIr3CYLwE3AXsAR4CFjRcMrKhve7Gz7fLLbw02EbNB1NIOl0OgoLC1GpVCxZsoQ+ffowatQoamtrWbx4MePHj0etVmO1WtmxYwfvvfceAwYMIDExsZFAMhqNfPPNN6SmpvLaa6/x+eefo1arueOOO6RpV3BwcKNf4KqqKubNm0dQUBC33347bm5uJCcnc/78eZYuXcojjzyCIAiUlpZSXFzMLbfcwk033cSyZcvo3bs31dXVHDlyhMjISKKjo+nSpQsA8+bN46677mLSpEmUlJTw3HPPERwczMmTJ4mMjOSVV165agIJ6seIn58fH374IT4+Ptx6663MmDGDU6dOceuttzJ//nzmzJmDVqvl7rvvZtSoUeTn5xMWFiZlDLaNM09PTzw9PVm8eDFarZbu3btz9OhRjh07xsCGgH0lJSW8+OKLhIaG0qdPHyZPnszs2bPZuXMngYGBLF68WIpdbnMw7Wjj2NW4lNAlrwBLBEH4N3AQ+Krh+FfAQkEQsoByYHprKuuIX2RBQQFHjx7l3XffZdq0aezYsYP09HS2bt1K9+7diYiIoLi4GK1Wy2+//caDDz7I0KFDCQ4ORqFQUFpaitlsZsmSJaxevRo/Pz/ef/999Ho97733HufPn+fbb79lypQplJSUEBMTg8FgoKioiHnz5jFy5EgmTJiAxWJBq9UiiiKLFy/mlltuITIyErPZTPfu3XF3d2f48OGYzWYpjvfZs2d58cUXiYuLQ6fTcfDgQU6fPi2lLrJNJ1UqFV27duX2228nIiICq9VKXV0dKpXK6QbYS/0e7QWvvQe6jTVr1hAcHEzfvn2lyI/Lly9Ho9GgVqvx9PQkLy+PVatWMX/+fLZs2cLJkyeZOnUqqampTJo0SUoWmZCQwB//+Ec2bdrEBx98wKhRo1i2bBkjR47Ez8+PDRs2cMMNNxAUFISvry8FBQV8+umnHDx4kIiICPLy8njnnXfYtWsXkydPllZibX1gE4CiKEpttfWR/X3Zl7dhy713PeIyUQKOOSQ27AhfSGFhIQsWLECtVqNWqyW/nurqagICAtDpdGg0GkwmE0qlEo1GIwWJV6lUiGJ9bO78/HwCAgLQarWUlZXh7u5OaGioFH/b39+f48ePs3//fnx8fOjXrx+enp6EhoYiivXxaSoqKjCZTBiNRnx9ffHx8aGurk6KD24LhlZZWUl5ebl0rqenJ0ajEaVSiUqlksrbHiibj1RERAQGg4GysjKsVivdu3fn3nvvvcCd4VK+N0eBtGTJEs6dOyf1YV1dHSdOnCAiIoK4uDipvFarlaaZAQEBkmCqq6sjLS2N6OhosrOzCQkJYdiwYSgUCul7sHmIm0wmYmNjKSgoICoqiuDgYGpra0lISGDbtm14enoSGxtLdXW1JCyjo6Ol+7clE7BFxSwvL8fT0xODwUBtbS3+/v5YLBaMRiMBAQGUlZVJ9jyb971NKxYEgYceekhaJLlWsH1fLUUJcIkgb64gGC+GwMBAKRvu8ePHueuuu1CpVBcspduM3qdOnWLChAlER0c3SgJQU1PDqlWrcHd3JyUlhejoaNLT0zl9+jRTp05l1qxZvPHGG5hMJry9vQkJCZGmCrYYz7bY3fYxvG1JAERRbOSwZrFYJJuV2hb/W6FAoVBgNpulbS02dwP71TubdqRUKi9rtg2VSsXkyZPZvXs3Pj4+9OzZE4vFwrlz51i+fDmTJk1Cp9NRVlZGr169UCqVUoA2UayPwb17926mTp1KXFwcCoUCTUNk0JqaGtasWcPkyZPRaDQIgiD1oa3/7LMET5s2TepHq9XaaCXTpgXZpuk2e5+tHlt/2pwGHSMZOGpNtmPXs23KJYRSR0WlUpGVlYVSqeSHH35g06ZNqNVqXn/9dSmkrI1z585RXV3NDz/8wEsvvYSbm1sj+0ZqaioWi4Xy8nLOnTtHZGQkO3bsQKfTkZuby6xZs3jkkUdYvXo1FRUVvPTSS6jVakk4OFskcNwLZhv89loaNHZmc3aORqNxuiHXcftAe/6qC4JAamoqBw8exNvbm6qqKgoLC5k0aRK5ubmYzWY2btxIYGAgOp2OI0eOMGTIEIYNGwbApk2b2LlzJ6NHj2b37t2Ioshtt93Gzp07SUpK4siRIxiNRkaPHk16ejpDhw7lzJkzFBQU8Ic//OGCRQj7RQZnU6/27oeO+kPdHriEUHKWzaEjoFQqCQoKYu7cuYwYMQKtVktNTQ1nz55l3759TJ48udHgVqlUmEwm0tPT8fT0pGvXrkD9wPbw8MBisbBz505uvPFGDh06JOVp8/Lywt3dnfT0dHJycigsLMRkMjWqu7UPgr2vSEsPUEufOwv5canYX7OwsJBBgwahVCrZtGkTnp6eFBYWotFoUCgUxMbGSiFLCgsLWbduHYMHD0apVBISEkJQUBAlJSWo1WqioqLYtWsXSqWS9evXU1dXx4EDB6iurmbfvn2S/1VlZSVTpkxx2reO/50Jjtb0a2u4lqZtbcUlhNKVSrp3OZg2bRoTJ04E6je36vV6QkJCKC8vb1QuPj4eNzc3Bg0aJG10tQ1elUrF6NGjgfq+0Ov1PPPMM5IPVHV1NYWFhYwcOZKwsDAsFgtqtbrR4G/NIHYs09I5V/vBGD58OF9//TUJCQn07t2buro6AgIC0Gg0ZGRk4ObmhlKpxNfXl8TERPR6PWazGaVSidFoRBRFevbsiVarZf/+/YwdO5a9e/cyfvx49u3bh4eHBz4+PphMJjp37kxJSQk1NTVSyqWWaKrM1e63jo5LGLqTk5PFEydOtPkhu9rYO+I5rrg0Vb6lzy72/I7QXy3hOB204Ww1y3bcsZx9Hzm+dizXFFfSGfR6orWGbpcIXeL4YHc0nNkVHGnuIXAUxk2Vbc11Ojr2Y6E5zc6+v5oTQo71OfvR60g/hNcDLjF968gPV1O/xE2Va66O1pS9mHIdCUcB09q+tD/WWpuOLJhcE5fQlBzpiAPD8ZfYdsxZORnnNKXJXEw9zupsrlxrjstcGVxCU7KnIw2IizWGtpeD4bXK5RgDsgDqOLikpiTTPHJoDJlrGZfTlDo6zrxzWxIgjitKzdVpCzNSU1PDkCFDGu2Ab+r8i6EpHxwZmcuNLJTaEWcezlqtlnPnzqFSqYiNjW1W6DgTLPZ11tbW8tNPP5GWlkZCQgJDhgxpsi55iijTUZGFUjtj23eVkZFBamoqxcXFBAYG0qdPH2JiYoD/Exhms/mCDa1NUV1dzYcffkjXrl3p2bMn48aNa9JFoD21pfbyUJaRaS2yUGpnTpw4wY8//khsbCzjx4+XNoPaHmq9Xk9+fj5paWkcPXqUP/7xj1JapqbQ6XR8++239O/fn27durF69WopqL9tk6iz1b9LQRZEMlcL2dDdzuzfvx+LxcK4ceNISEhoFBfHYrGwfft2KUjYyJEj+frrr6VQqk0JgV9//ZXw8HBuueUWtm/fzqBBg1CpVFgsFrKzs5k5cybLli2TYkS3B/ZtsaWEkpG5EshCqZXYVrya+wOYPn0648ePZ86cOVJWExsKhYLAwEB8fX156623pBRJhYWFTV5Lq9WyY8cObr75ZsrKysjMzKRbt25kZWXx7rvv8te//pXExESysrIa7bezhTSxxenJy8uTwnrodDpKSkoaBbq3Wq1otdpGm6Nt5/78888XpCO3v2fHPpCRsaetY0Oevl0EjlMb+/dqtVoKJLZx40Yp2L8oihQXF7NkyRJefPFF/Pz8sFqtnDt3joCAAClioePmZJ1Oh9FopKioiJ07d3LmzBk+/fRTKisrOXPmDDNnziQyMpK9e/dKG1EzMjLYuHEjDz30EGazmXnz5nHixAlmzZqF1Wrl008/JT09nc8//xyNRkN1dTWbNm3i2LFjvPTSS1ImE51Ox7p16wgKCmqU3cSxL2Rk2kJLY0YWSheBINQH8aqpqcHHxweoN1pbLBaKi4tJS0vj0KFDjBo1CkEQOHnyJAUFBYiiSFhYGP7+/hQXF7N+/Xr8/f0JDw/n22+/Zdy4cRckgAwMDGT69Ols3LiR3377jUceeYSBAwcye/ZsXn/9dSIjI/n555+Jj4/nwIEDHDt2jPLyck6ePElUVBSnTp0iJyeHe++9F41Gwy+//MLPP//M888/T1ZWFnv27CE7O5uamhopj1xlZSX79+9n06ZNdO/enenTp19SiBMZGXtaWtyRhdJFYjAY+PDDD/H396empobi4mJCQ0MJCwujb9++PPnkk/j7+1NXV0dlZSV6vZ5+/fqxYcMG3njjDdzd3Rk6dCi33XYbOp0Od3d3QkJCGkUqtPkgDR48mC5dupCZmcnNN9/M8uXLqaysJC8vj3nz5vH7779zyy23EBoayh133MG7776LSqUiJCSEiRMn8uOPP7Jt2zYOHTrE7t27CQsL48iRI5SWlmK1WklMTGTv3r3s3LmT0tJSLBYLycnJPProo8TGxqJQKC6Yvtm3T943JtMWbDHSm8IlQpd07txZzMzMlN674uB27CdRFMnJyWHWrFkUFxfj4eFBREQEarWampoaKRytm5sbVqtVmv7U1tZSWlqKRqPB29tbsv14eXlJMZxtYWwTEhKoqanhxIkTZGRkAHDzzTeTm5uLTqfDYrGg1+sJCwsjOjpaij1dUlJCZGQkPj4+KBQKjEYj586dkxJb6nQ6vL29USgUHD58mNraWinInK+vLzExMWg0Gtzd3aXwr7bXolgfEzw5OZk77rij0XTTFb83mauP47OzZ88ehg4dKsfovlSc7eSPj4/niSeeYN26dQwdOpSUlBREUaSurk4SNtu2bcNoNDJlyhQpMJstULxSqWTv3r3odDqGDx8uxdi2Wq1kZmZy9OhRysrK6Nu3L9XV1fzxj39kzJgxTtNp26aUzqIW2Oq1RxRFjEajdNzNzQ2LxSL5Ttk0I5ufki0Gta0++xjdsjCSaQ7H8eEYctkRlxBKjsHUO5KNIi0tjby8PHQ6HVD/BXh5eQGQmZnJkSNHEEWR5ORkevfuDTT+UkpLSzly5AgZGRlSRo6MjAz8/PwoKytj5MiR9O/fn0WLFhEcHIy7u3uTHt9txZa4wJ6Lje0kI9NeuIRQ6sj4+vri7e3NqVOniI2NxWQykZCQ0MgT2sPDA6PRyP79++ndu7cU/zk7OxuTyYTVamXr1q1UV1fj7e1N165dpdU4k8nE+vXrcXd35/z58+3qtd1UBANnAfLhwiBqsmCSuRy4hFDqCNO3poiNjcVgMDBgwACysrKoqKigU6dOQH2ywz59+uDh4UFsbCyzZ88mOTlZEkparZZjx45RWVnJkCFDGDp0KFVVVRiNRjw8PNBqtdKWlRdffJHevXtfsiBwNr1rqkxrj7syzsIV27+XcT1cwtAdHx8vnj17ttGxjjBonGkS0HTbbbnAbOh0Oj777DNuuukmevfu3SiLqq38J598wpAhQxg8eHCjutoSGrep9rTmu29OiHWk78hRs+sIbb9W2b9/PwMHDnRtQ3dHpa1hbB0N1GlpaXTq1ElysLTVYXuAjhw5gtVqpX///i0KvIt5yNpyTkd9iG1TYLPZLOW566j3cr3gEttMXEFbu9KIosi5c+dISUlxKtwMBgPLly/nrrvuQq1Wyw/SRWJb5bQtEMj96Pq4hFC63rAJ4bq6Onx9fS+YWlitVtauXUvPnj2JiYmR7SCXSGvsaDKug8sIpevhgbNfahcEATc3N0pKSi6497Nnz3LixAkmTJjgNDHi9dBX7YV9SBe53zoGLiOUwHlGkGsJx8iUKSkpHDt2THJKFEWR8vJyli1bxj333IO3tzcgP1jtgdyHHQfZ0H2VEASBxMREMjMzWbVqFSkpKZSVlfH7779z8803k5iYeLWbKCNzVXApTel6QhRFFAoF48ePx9fXl61bt1JZWcmdd97ZaDVORuZ6Q9aUrhL28ZfGjBlzlVsjI+M6yELpCiLbMmRkWkaevsnIyLgUslCSkZFxKWShJCMj41LIQklGRsalkIWSjIyMSyELJRkZGZfCZVwC7LdgyEvnMjLXL7KmJCMj41LIQklGRsalcAmh5Lh7XkZG5vqlVUJJEIRsQRCOCIJwSBCE/Q3HAgVB2CAIwqmG/wENxwVBED4RBCFLEIR0QRBSWqrfPsVSc2l9ZGRkOh6iKDb6a4m2aEpjRFHsaxfs+1VgkyiKnYFNDe8BJgKdG/5mAHNaqri98pjJyMi4PipV8+trlzJ9mwJ82/D6W2Cq3fEFYj17AH9BECJaW6kchEtG5trEpnAEBQU1W661QkkE1guCcEAQhBkNx8JEUTzX8LoICGt4HQXk2Z2b33CsEYIgzBAEYb8gCPt1Op2sIcnIXKPYh4EGpHTvTdFaP6XhoigWCIIQCmwQBOGE/YeiKIqCILRJqoii+AXwBUBkZKToOIWTtSUZmWuDtiocrdKURFEsaPhfDPwCDALO26ZlDf+LG4oXADF2p0c3HJORkXFxHI3RrTVOtyctCiVBELwEQfCxvQZuBo4CK4GHGoo9BKxoeL0SeLBhFW4wUGU3zWvuOnJgdxkZF6E9BZHjc91S3a2ZvoUBvzRUqAK+F0VxnSAI+4AfBUF4DMgB7mkovxaYBGQBdcAjF3EfMjIyV5mrlW+wRaEkiuIZ4IJI9qIolgHjnBwXgWfapXUyMjLXHS7h0S0jI+M62PIQ2nA5m5KMjMz1hUJRLxaulm1XFkoyMjIXcDUXm1wmnpKMjIzrcTWEkyyUZGRkJFzBHUeevsnIyLgUslCSkZFxKWShJCMj41K4jE1JThwgIyMDsqYkIyPjYricUJK1JBmZ6xuXmb7JyFwpZFOBa+MSQslsNmOxWFAqlVdtZ7LM9YXVakWhUMjj7SJpaT+cs7j7tuCNLfW1S03f5JC4MpcbURQpKytj5syZGI3Gq92cDodj0LeKigry8vI4cuRIs/1pMBj45ptvSE9Pb/EaLiOU5BC4MlcKf39/OnfuTF1d3dVuSofnm2++YcWKFUybNo0jR440WU6lUjFu3DgSEhLaJcjbFUMWTDJXAqVSycSJE+WxdomIoohSqWTPnj3ceeed+Pn5NVlWoVAQExODIAjU1tY2W69LCCWFQoFCoZAHicwVw95+KXPx/OEPf6BHjx4MGDAAX1/fJsu1JbejSwglq9UqDxCZK4J9Bmb5R/DS+f7779m+fTvR0dG8+eabzWpLNjqUoVtOHCBzJXBMUiGPt4tDEAROnz5N7969KS0tpaqqqsly7Z04QEZGRgZorGkC/PnPf2bnzp2MGTOGqKgLcs5eFC6lKcnIyLg29gJJp9OxatUqzGYzqampWCyWdrmGrCnJyHRQ2ssOe7HTV4VCQWlpKVqtFpWq/USJLJRkZK4BbO40tbW1ZGdnU1FRgU6nw8/Pj9DQUKKionBzc2tU9lJdcNzd3XnuuefQ6/VotVqUSmW73IsslGRkOjgmk4m0tDQWLVrErl27KCoqQqvVYjQa8fT0xMfHh7i4OO6++25uu+02YmJigEtbfbRpaV999RUmk4mVK1fy008/ER8ff8n3IwslGZkOTGFhIf/9739ZtGgRJSUlQGNjtMFgoKKigpycHHbt2sWcOXN44YUXuPfee/H09Gzz9ew1LFEUMZvNnDlzhj59+mCxWNrFAVpwBf+g0NBQsbCwsF3npTIy1yL2z+vRo0d5/vnn2b59+wUJJJvD3d2dxx57jLfeeovAwMALPm9JqNi3oaCggIyMDPr06UNAQID0DDdVhyiKFBYWEh0dfUAUxQHOysirbzIyHQR7YZCZmcljjz3G1q1b2ySQoF57+uKLL/jLX/5CdXV1m9tga0ddXR1r1qwBYNOmTRe08WKRhZKMTAdCFEUqKyt59dVX2b9//0XXY7FY+OGHH/jss88wmUwXJUyMRiN79+5l1apVZGdnX3RbHJHnSzIyHQSblrJo0SJ+/fXXS9JKRFHEYDDw6aefMn78ePr3799qe5CtjJ+fH59++ikqlapd96/KmpKMTAdBEATKysr44osvMBgMl1wXQHFxMV999RUGg6HNAkUQBDQaDWq1GqVS2WpbVIfa+yYjI9M8u3bt4tSpU5dcj300yBUrVlBUVHTRdTi+dlbO9tca+5cslGRkOghms5lNmza1e8TMsrIy0tLS2nyezS3AXsA1h9FoZNOmTZhMpmbLyUJJRqaDoNfrOX36dJtX21rCbDZz8ODBizr39OnTPPPMMxw4cKDFsm5ubowYMaJF1x/Z0C0j00EwGo2UlJRcsFP/UhFFkfz8fMxmc4sCw/7aer2e77//nuXLl2OxWOjVqxfu7u7Nnu/h4dGiTUkWSjIyHQib13R7IoriRe3wVygUDBo0iISEBKZMmdKiQGptPCV5+iYj00Fwd3cnIiKi3esVBAFfX18UipbFgb1AsVgsnDp1ij59+nD8+HHMZnOT9bclmJ6sKcnIdBA0Gg2dO3fmt99+a1e7klKpJCEhoVVCyZ7a2lq2bdvGkSNHEASB7t27Nxunu7XImpKMTAdBoVAwbNgwKQRJe+Hh4cHIkSNbVdbepuTn58ff//53+vTpQ2BgIBqN5trbZuKY6E5GRqYxI0aMaJfwIPYMGjSIzp07t6qsvde3IAgYDAYmTZrEzTff3G7xzl1i+maxWKS03TIyMk0TEhLCgw8+yD/+8Y9G/j6tNSI74unpyRNPPNHmaZdtD96bb76Jh4cHnp6eDB48uF0ifbiEUGqtp6eMzPWOQqHg0UcfZd26dezYsaNRbKPWYq/pTJ06lYkTJ7a5HYIgEBAQwOzZsyUjuYeHR5vrcYZLTd9syFM4GRnnCIJAcHAwH330EV27dr2o6ZLt+brhhht466238Pb2vqi2qFQqVCoV//znP0lPT2+359YlhZKMjEzTKBQK+vXrx8KFC7nhhhsu6vyRI0fy9ddfk5CQAFxcaFyr1cry5cv5/PPP+fDDD6mrq3Narq224lYJJUEQ/AVBWCoIwglBEDIEQRgiCEKgIAgbBEE41fA/oKGsIAjCJ4IgZAmCkC4IQkprGyMnB5SRaRr750OhUJCSksLixYt59NFHCQgIaPY8GyEhITz//PMsXLiQzp07X3Jizri4ON58800+/fTTFjWu1kYJaFU4XEEQvgV2iKI4TxAEN8AT+BtQLoriu4IgvAoEiKL4iiAIk4DngEnADcBMURSbFeeBgYFiQUEBGo2mxbbIyMjUY3t2jUYjqampLF68mK1bt1JSUkJtbS1GoxG1Wi1lNBk3bhz33Xcf/fr1Q6VSSfaotgii1mo8jnXab9otLi4mIiKiyXC4LQolQRD8gENAJ9GusCAIJ4HRoiieEwQhAtgqimKyIAhzG14vdizX1DVkoSQj03Ycn12r1UpZWRlnzpzh/Pnz1NbWotFoiI2NJSkpCR8fH6cOkhcjlOyv7bjy5yjoHNtZV1eHt7d3k0KpNatvCUAJ8LUgCH2AA8CfgDA7QVMEhDW8jgLy7M7PbzjWpFCSkZG5OOz9hhQKBSEhIYSEhLT53Iu5puP5ra2rpSwqrbEpqYAUYI4oiv0ALfCqQyNFoE2md0EQZgiCsF8QhP2XGkVPRuZ65VLsrxdzrr0W5Oz89rAJt0Yo5QP5oiimNrxfSr2QOt8wbaPhf3HD5wVAjN350Q3HGiGK4heiKA4QRXFAS7uLZWRkLsSZkfpi/trzuq0t3xwtCiVRFIuAPEEQkhsOjQOOAyuBhxqOPQSsaHi9EniwYRVuMFDVnD1JRkZGxp7WenQ/ByxqWHk7AzxCvUD7URCEx4Ac4J6GsmupX3nLAuoayraK1i4ZyrQNR6Nke2QxvZ6Rx2nbaZPHuSt4T9tW32xu6vKX3b409R3L/dw65P67dKxWa6P+UigUrp0h19/fH7VafbWbcc3T1JKtTNuR+6/1tFUzdwmhZMsb1dqsCDIXhy3kqdy/MleDDpViyRayRP71ubzYh4aRBVPrcbZ3S+6/tmGxWMjJyWHDhg1Nhs214RKhS5zh+KW3t8C6mEHVlOt8c2VcidY6ujm7r5aSDV4ubEHtFQpFo6SGVxLbr3tbw8UCUpwwm03FPkC/fZprQRCwWq1YrdZrUuBZrVb8/f2JjIyktLS02bIuIZQsFgtZWVnSl6/T6aiurkar1bYoVS8F21zXaDTy/9s7m9C4qiiO//7MOGmCYLF1UagYiwHJQiuIWHQhBSEFcdWFxWXAjYsKgjQIgks3VhdSFBQ3oiK6yqZo2nXrR6tGQ7QF10XTqkwmzrzhuLh3ntN0JnW0ybt3OD+48O7HDOfPzDvvfrx7T71eZ2Njg0ajQbfbpd1ul6GR19bWhn5H7486budBtdvt8gYpiqLcstBqtcobqNvtltewPc6pKAqazSYTExMURUG326UoiuRv3N4q5/r6OpOTk+U+tGazWTqfqakparVaGfK61WrR6XTodDrJ6xuVTqdDo9G4YcJ7EEmsvkn6E1it2o5bzF5g60dCfoybpnHTA/lousfMBu6HSaKnBKwOWx7MFUlfuaa0GTc9MB6akpjodhzH6eFOyXGcpEjFKb1TtQHbgGtKn3HTA2OgKYmJbsdxnB6p9JQcx3GABJySpDlJqzHQwImbfyINJL0n6Yqk5b6yWx5MYaeQdLeks5J+lPSDpOOxPGdNuySdl/Rt1PRqLL9X0rlo+8fx9AskTcT8pVg/XamAIUiqSbogaTHms9azmUqdkqQa8BZwBJgFjkmardKmEXgfmNtUdgJYMrMZYIl/Tug8AszE9BxwaodsHIUCeNHMZoFHgefjb5Gzpr+Aw2b2IHAQmItnfL0GnDSz+4CrwHxsPw9cjeUnY7sUOQ6s9OVz13M9/a/u73QCDgGn+/ILwEKVNo1o/zSw3JdfBfbF632E968A3gaODWqXaiIc2vfkuGgiROD5hhBh51egHsvL/yBwGjgUr+uxnaq2fZOO/YSHw2FgEVDOegalqodvw4IM5MqowRSSJHbzHwLOkbmmONS5SDiu+XPgMnDNzHr7l/rtLjXF+t+BPTtq8M15A3gJ6O1r2kPeem6gaqc0tlh4PGW3tCnpduBT4AUz+6O/LkdNZtY1s4OEHsYjwP3VWvTfkfQUcMXMvq7alu2kaqf0r4IMZMT/CqZQNZJuIzikD8zss1ictaYeZnYNOEsY3uyW1Nti1W93qSnW3wH8trOWbsljwNOSfgE+Igzh3iRfPQOp2il9CczE1YMG8Awh8ECuZBtMQWHr9rvAipm93leVs6a7JO2O15OEObIVgnM6Gptt1tTTehQ4E3uHSWBmC2a238ymCffKGTN7lkz1DKXqSS1CkIGfCGP9l6u2ZwS7PyQE2OwQxvHzhPH6EvAz8AVwZ2wrwirjZeB74OGq7R+g53HC0Ow7QkTki/G3yVnTA8CFqGkZeCWWHwDOE4JbfAJMxPJdMX8p1h+oWsMW2p4AFsdFT3/yN7odx0mKqodvjuM41+FOyXGcpHCn5DhOUrhTchwnKdwpOY6TFO6UHMdJCndKjuMkhTslx3GS4m8pcJalp+tsUQAAAABJRU5ErkJggg==\n",
|
719 |
+
"text/plain": [
|
720 |
+
"<Figure size 432x432 with 1 Axes>"
|
721 |
+
]
|
722 |
+
},
|
723 |
+
"metadata": {
|
724 |
+
"needs_background": "light"
|
725 |
+
},
|
726 |
+
"output_type": "display_data"
|
727 |
+
}
|
728 |
+
],
|
729 |
+
"source": [
|
730 |
+
"img = cv2.imread('TobaccoData_Raw/scaled/agw39d00.jpg')\n",
|
731 |
+
"\n",
|
732 |
+
"img = cv2.rectangle(img, (90, 348), (90+120, 348+26), (255, 0, 0), 1)\n",
|
733 |
+
"plt.figure(figsize=(6, 6))\n",
|
734 |
+
"plt.imshow(img)"
|
735 |
+
]
|
736 |
+
},
|
737 |
+
{
|
738 |
+
"cell_type": "markdown",
|
739 |
+
"metadata": {},
|
740 |
+
"source": [
|
741 |
+
"**Saving to CSV file**"
|
742 |
+
]
|
743 |
+
},
|
744 |
+
{
|
745 |
+
"cell_type": "code",
|
746 |
+
"execution_count": 24,
|
747 |
+
"metadata": {},
|
748 |
+
"outputs": [
|
749 |
+
{
|
750 |
+
"data": {
|
751 |
+
"text/html": [
|
752 |
+
"<div>\n",
|
753 |
+
"<style scoped>\n",
|
754 |
+
" .dataframe tbody tr th:only-of-type {\n",
|
755 |
+
" vertical-align: middle;\n",
|
756 |
+
" }\n",
|
757 |
+
"\n",
|
758 |
+
" .dataframe tbody tr th {\n",
|
759 |
+
" vertical-align: top;\n",
|
760 |
+
" }\n",
|
761 |
+
"\n",
|
762 |
+
" .dataframe thead th {\n",
|
763 |
+
" text-align: right;\n",
|
764 |
+
" }\n",
|
765 |
+
"</style>\n",
|
766 |
+
"<table border=\"1\" class=\"dataframe\">\n",
|
767 |
+
" <thead>\n",
|
768 |
+
" <tr style=\"text-align: right;\">\n",
|
769 |
+
" <th></th>\n",
|
770 |
+
" <th>prev_filename</th>\n",
|
771 |
+
" <th>filename</th>\n",
|
772 |
+
" <th>page_height</th>\n",
|
773 |
+
" <th>page_width</th>\n",
|
774 |
+
" <th>AuthorID</th>\n",
|
775 |
+
" <th>Overlapped</th>\n",
|
776 |
+
" <th>category</th>\n",
|
777 |
+
" <th>id</th>\n",
|
778 |
+
" <th>x</th>\n",
|
779 |
+
" <th>y</th>\n",
|
780 |
+
" <th>width</th>\n",
|
781 |
+
" <th>height</th>\n",
|
782 |
+
" <th>new_filename</th>\n",
|
783 |
+
" <th>x_scaled</th>\n",
|
784 |
+
" <th>y_scaled</th>\n",
|
785 |
+
" <th>w_scaled</th>\n",
|
786 |
+
" <th>h_scaled</th>\n",
|
787 |
+
" <th>page_height_scaled</th>\n",
|
788 |
+
" <th>page_width_scaled</th>\n",
|
789 |
+
" </tr>\n",
|
790 |
+
" </thead>\n",
|
791 |
+
" <tbody>\n",
|
792 |
+
" <tr>\n",
|
793 |
+
" <th>0</th>\n",
|
794 |
+
" <td>aah97e00-page02_1.tif</td>\n",
|
795 |
+
" <td>0.tif</td>\n",
|
796 |
+
" <td>3296</td>\n",
|
797 |
+
" <td>2560</td>\n",
|
798 |
+
" <td>NA</td>\n",
|
799 |
+
" <td>NA</td>\n",
|
800 |
+
" <td>DLLogo</td>\n",
|
801 |
+
" <td>None</td>\n",
|
802 |
+
" <td>1074</td>\n",
|
803 |
+
" <td>18</td>\n",
|
804 |
+
" <td>374</td>\n",
|
805 |
+
" <td>219</td>\n",
|
806 |
+
" <td>aah97e00-page02_1.jpg</td>\n",
|
807 |
+
" <td>201</td>\n",
|
808 |
+
" <td>3</td>\n",
|
809 |
+
" <td>70</td>\n",
|
810 |
+
" <td>41</td>\n",
|
811 |
+
" <td>618.000000</td>\n",
|
812 |
+
" <td>480.0</td>\n",
|
813 |
+
" </tr>\n",
|
814 |
+
" <tr>\n",
|
815 |
+
" <th>1</th>\n",
|
816 |
+
" <td>aah97e00-page02_2.tif</td>\n",
|
817 |
+
" <td>1.tif</td>\n",
|
818 |
+
" <td>3296</td>\n",
|
819 |
+
" <td>2560</td>\n",
|
820 |
+
" <td>Boder, J.B.</td>\n",
|
821 |
+
" <td>Yes</td>\n",
|
822 |
+
" <td>DLSignature</td>\n",
|
823 |
+
" <td>None</td>\n",
|
824 |
+
" <td>1409</td>\n",
|
825 |
+
" <td>793</td>\n",
|
826 |
+
" <td>659</td>\n",
|
827 |
+
" <td>361</td>\n",
|
828 |
+
" <td>aah97e00-page02_2.jpg</td>\n",
|
829 |
+
" <td>264</td>\n",
|
830 |
+
" <td>148</td>\n",
|
831 |
+
" <td>123</td>\n",
|
832 |
+
" <td>67</td>\n",
|
833 |
+
" <td>618.000000</td>\n",
|
834 |
+
" <td>480.0</td>\n",
|
835 |
+
" </tr>\n",
|
836 |
+
" <tr>\n",
|
837 |
+
" <th>2</th>\n",
|
838 |
+
" <td>aam09c00.tif</td>\n",
|
839 |
+
" <td>2.tif</td>\n",
|
840 |
+
" <td>2292</td>\n",
|
841 |
+
" <td>1728</td>\n",
|
842 |
+
" <td>Koplow, M.G.</td>\n",
|
843 |
+
" <td>Yes</td>\n",
|
844 |
+
" <td>DLSignature</td>\n",
|
845 |
+
" <td>None</td>\n",
|
846 |
+
" <td>821</td>\n",
|
847 |
+
" <td>1422</td>\n",
|
848 |
+
" <td>757</td>\n",
|
849 |
+
" <td>183</td>\n",
|
850 |
+
" <td>aam09c00.jpg</td>\n",
|
851 |
+
" <td>228</td>\n",
|
852 |
+
" <td>395</td>\n",
|
853 |
+
" <td>210</td>\n",
|
854 |
+
" <td>50</td>\n",
|
855 |
+
" <td>636.666667</td>\n",
|
856 |
+
" <td>480.0</td>\n",
|
857 |
+
" </tr>\n",
|
858 |
+
" </tbody>\n",
|
859 |
+
"</table>\n",
|
860 |
+
"</div>"
|
861 |
+
],
|
862 |
+
"text/plain": [
|
863 |
+
" prev_filename filename page_height page_width AuthorID \\\n",
|
864 |
+
"0 aah97e00-page02_1.tif 0.tif 3296 2560 NA \n",
|
865 |
+
"1 aah97e00-page02_2.tif 1.tif 3296 2560 Boder, J.B. \n",
|
866 |
+
"2 aam09c00.tif 2.tif 2292 1728 Koplow, M.G. \n",
|
867 |
+
"\n",
|
868 |
+
" Overlapped category id x y width height \\\n",
|
869 |
+
"0 NA DLLogo None 1074 18 374 219 \n",
|
870 |
+
"1 Yes DLSignature None 1409 793 659 361 \n",
|
871 |
+
"2 Yes DLSignature None 821 1422 757 183 \n",
|
872 |
+
"\n",
|
873 |
+
" new_filename x_scaled y_scaled w_scaled h_scaled \\\n",
|
874 |
+
"0 aah97e00-page02_1.jpg 201 3 70 41 \n",
|
875 |
+
"1 aah97e00-page02_2.jpg 264 148 123 67 \n",
|
876 |
+
"2 aam09c00.jpg 228 395 210 50 \n",
|
877 |
+
"\n",
|
878 |
+
" page_height_scaled page_width_scaled \n",
|
879 |
+
"0 618.000000 480.0 \n",
|
880 |
+
"1 618.000000 480.0 \n",
|
881 |
+
"2 636.666667 480.0 "
|
882 |
+
]
|
883 |
+
},
|
884 |
+
"execution_count": 24,
|
885 |
+
"metadata": {},
|
886 |
+
"output_type": "execute_result"
|
887 |
+
}
|
888 |
+
],
|
889 |
+
"source": [
|
890 |
+
"data[['prev_filename', 'new_filename', 'filename', 'page_height', 'page_width', \n",
|
891 |
+
" 'page_height_scaled', 'page_width_scaled', 'AuthorID', 'Overlapped', 'category', \n",
|
892 |
+
" 'id', 'x', 'y', 'width', 'height', 'x_scaled', 'y_scaled', 'w_scaled', 'h_scaled']\n",
|
893 |
+
" ].to_csv('TobaccoData_Raw/tobacco_cleaned.csv', index=False)\n",
|
894 |
+
"data.head(3)"
|
895 |
+
]
|
896 |
+
},
|
897 |
+
{
|
898 |
+
"cell_type": "markdown",
|
899 |
+
"metadata": {},
|
900 |
+
"source": [
|
901 |
+
"# Converting data to YOLOv5 format"
|
902 |
+
]
|
903 |
+
},
|
904 |
+
{
|
905 |
+
"cell_type": "code",
|
906 |
+
"execution_count": 25,
|
907 |
+
"metadata": {},
|
908 |
+
"outputs": [
|
909 |
+
{
|
910 |
+
"name": "stdout",
|
911 |
+
"output_type": "stream",
|
912 |
+
"text": [
|
913 |
+
"['DLLogo' 'DLSignature']\n"
|
914 |
+
]
|
915 |
+
},
|
916 |
+
{
|
917 |
+
"data": {
|
918 |
+
"text/html": [
|
919 |
+
"<div>\n",
|
920 |
+
"<style scoped>\n",
|
921 |
+
" .dataframe tbody tr th:only-of-type {\n",
|
922 |
+
" vertical-align: middle;\n",
|
923 |
+
" }\n",
|
924 |
+
"\n",
|
925 |
+
" .dataframe tbody tr th {\n",
|
926 |
+
" vertical-align: top;\n",
|
927 |
+
" }\n",
|
928 |
+
"\n",
|
929 |
+
" .dataframe thead th {\n",
|
930 |
+
" text-align: right;\n",
|
931 |
+
" }\n",
|
932 |
+
"</style>\n",
|
933 |
+
"<table border=\"1\" class=\"dataframe\">\n",
|
934 |
+
" <thead>\n",
|
935 |
+
" <tr style=\"text-align: right;\">\n",
|
936 |
+
" <th></th>\n",
|
937 |
+
" <th>prev_filename</th>\n",
|
938 |
+
" <th>new_filename</th>\n",
|
939 |
+
" <th>filename</th>\n",
|
940 |
+
" <th>page_height</th>\n",
|
941 |
+
" <th>page_width</th>\n",
|
942 |
+
" <th>page_height_scaled</th>\n",
|
943 |
+
" <th>page_width_scaled</th>\n",
|
944 |
+
" <th>AuthorID</th>\n",
|
945 |
+
" <th>Overlapped</th>\n",
|
946 |
+
" <th>category</th>\n",
|
947 |
+
" <th>...</th>\n",
|
948 |
+
" <th>y_scaled</th>\n",
|
949 |
+
" <th>w_scaled</th>\n",
|
950 |
+
" <th>h_scaled</th>\n",
|
951 |
+
" <th>labels</th>\n",
|
952 |
+
" <th>x_center</th>\n",
|
953 |
+
" <th>y_center</th>\n",
|
954 |
+
" <th>x_center_norm</th>\n",
|
955 |
+
" <th>width_norm</th>\n",
|
956 |
+
" <th>y_center_norm</th>\n",
|
957 |
+
" <th>height_norm</th>\n",
|
958 |
+
" </tr>\n",
|
959 |
+
" </thead>\n",
|
960 |
+
" <tbody>\n",
|
961 |
+
" <tr>\n",
|
962 |
+
" <th>0</th>\n",
|
963 |
+
" <td>aah97e00-page02_1.tif</td>\n",
|
964 |
+
" <td>aah97e00-page02_1.jpg</td>\n",
|
965 |
+
" <td>0.tif</td>\n",
|
966 |
+
" <td>3296</td>\n",
|
967 |
+
" <td>2560</td>\n",
|
968 |
+
" <td>618.0</td>\n",
|
969 |
+
" <td>480.0</td>\n",
|
970 |
+
" <td>NaN</td>\n",
|
971 |
+
" <td>NaN</td>\n",
|
972 |
+
" <td>DLLogo</td>\n",
|
973 |
+
" <td>...</td>\n",
|
974 |
+
" <td>3</td>\n",
|
975 |
+
" <td>70</td>\n",
|
976 |
+
" <td>41</td>\n",
|
977 |
+
" <td>0</td>\n",
|
978 |
+
" <td>236</td>\n",
|
979 |
+
" <td>23</td>\n",
|
980 |
+
" <td>0.491667</td>\n",
|
981 |
+
" <td>0.145833</td>\n",
|
982 |
+
" <td>0.037217</td>\n",
|
983 |
+
" <td>0.066343</td>\n",
|
984 |
+
" </tr>\n",
|
985 |
+
" </tbody>\n",
|
986 |
+
"</table>\n",
|
987 |
+
"<p>1 rows × 26 columns</p>\n",
|
988 |
+
"</div>"
|
989 |
+
],
|
990 |
+
"text/plain": [
|
991 |
+
" prev_filename new_filename filename page_height \\\n",
|
992 |
+
"0 aah97e00-page02_1.tif aah97e00-page02_1.jpg 0.tif 3296 \n",
|
993 |
+
"\n",
|
994 |
+
" page_width page_height_scaled page_width_scaled AuthorID Overlapped \\\n",
|
995 |
+
"0 2560 618.0 480.0 NaN NaN \n",
|
996 |
+
"\n",
|
997 |
+
" category ... y_scaled w_scaled h_scaled labels x_center y_center \\\n",
|
998 |
+
"0 DLLogo ... 3 70 41 0 236 23 \n",
|
999 |
+
"\n",
|
1000 |
+
" x_center_norm width_norm y_center_norm height_norm \n",
|
1001 |
+
"0 0.491667 0.145833 0.037217 0.066343 \n",
|
1002 |
+
"\n",
|
1003 |
+
"[1 rows x 26 columns]"
|
1004 |
+
]
|
1005 |
+
},
|
1006 |
+
"execution_count": 25,
|
1007 |
+
"metadata": {},
|
1008 |
+
"output_type": "execute_result"
|
1009 |
+
}
|
1010 |
+
],
|
1011 |
+
"source": [
|
1012 |
+
"def x_center(df):\n",
|
1013 |
+
" return int(df.x_scaled + (df.w_scaled/2))\n",
|
1014 |
+
"def y_center(df):\n",
|
1015 |
+
" return int(df.y_scaled + (df.h_scaled/2))\n",
|
1016 |
+
"\n",
|
1017 |
+
"def w_norm(df, col):\n",
|
1018 |
+
" return df[col]/df['page_width_scaled']\n",
|
1019 |
+
"def h_norm(df, col):\n",
|
1020 |
+
" return df[col]/df['page_height_scaled']\n",
|
1021 |
+
"\n",
|
1022 |
+
"df = pd.read_csv('TobaccoData_Raw/tobacco_cleaned.csv')\n",
|
1023 |
+
"\n",
|
1024 |
+
"le = preprocessing.LabelEncoder()\n",
|
1025 |
+
"le.fit(df['category'])\n",
|
1026 |
+
"print(le.classes_)\n",
|
1027 |
+
"labels = le.transform(df['category'])\n",
|
1028 |
+
"df['labels'] = labels\n",
|
1029 |
+
"\n",
|
1030 |
+
"\n",
|
1031 |
+
"df['x_center'] = df.apply(x_center, axis=1)\n",
|
1032 |
+
"df['y_center'] = df.apply(y_center, axis=1)\n",
|
1033 |
+
"\n",
|
1034 |
+
"df['x_center_norm'] = df.apply(w_norm, col='x_center',axis=1)\n",
|
1035 |
+
"df['width_norm'] = df.apply(w_norm, col='w_scaled', axis=1)\n",
|
1036 |
+
"\n",
|
1037 |
+
"df['y_center_norm'] = df.apply(h_norm, col='y_center',axis=1)\n",
|
1038 |
+
"df['height_norm'] = df.apply(h_norm, col='h_scaled',axis=1)\n",
|
1039 |
+
"\n",
|
1040 |
+
"df.head(1)"
|
1041 |
+
]
|
1042 |
+
},
|
1043 |
+
{
|
1044 |
+
"cell_type": "markdown",
|
1045 |
+
"metadata": {},
|
1046 |
+
"source": [
|
1047 |
+
"# Moving images to train and valid folders"
|
1048 |
+
]
|
1049 |
+
},
|
1050 |
+
{
|
1051 |
+
"cell_type": "code",
|
1052 |
+
"execution_count": 26,
|
1053 |
+
"metadata": {},
|
1054 |
+
"outputs": [
|
1055 |
+
{
|
1056 |
+
"name": "stdout",
|
1057 |
+
"output_type": "stream",
|
1058 |
+
"text": [
|
1059 |
+
"(1217, 26) (136, 26)\n"
|
1060 |
+
]
|
1061 |
+
}
|
1062 |
+
],
|
1063 |
+
"source": [
|
1064 |
+
"df_train, df_valid = model_selection.train_test_split(df, test_size=0.1, random_state=13, shuffle=True)\n",
|
1065 |
+
"print(df_train.shape, df_valid.shape)"
|
1066 |
+
]
|
1067 |
+
},
|
1068 |
+
{
|
1069 |
+
"cell_type": "markdown",
|
1070 |
+
"metadata": {},
|
1071 |
+
"source": [
|
1072 |
+
"**Creating relevant directories**"
|
1073 |
+
]
|
1074 |
+
},
|
1075 |
+
{
|
1076 |
+
"cell_type": "code",
|
1077 |
+
"execution_count": 27,
|
1078 |
+
"metadata": {},
|
1079 |
+
"outputs": [],
|
1080 |
+
"source": [
|
1081 |
+
"os.mkdir('TobaccoData_Raw/tobacco_yolo_format/')\n",
|
1082 |
+
"os.mkdir('TobaccoData_Raw/tobacco_yolo_format/images/')\n",
|
1083 |
+
"os.mkdir('TobaccoData_Raw/tobacco_yolo_format/images/train/')\n",
|
1084 |
+
"os.mkdir('TobaccoData_Raw/tobacco_yolo_format/images/valid/')\n",
|
1085 |
+
"\n",
|
1086 |
+
"os.mkdir('TobaccoData_Raw/tobacco_yolo_format/labels/')\n",
|
1087 |
+
"os.mkdir('TobaccoData_Raw/tobacco_yolo_format/labels/train/')\n",
|
1088 |
+
"os.mkdir('TobaccoData_Raw/tobacco_yolo_format/labels/valid/')"
|
1089 |
+
]
|
1090 |
+
},
|
1091 |
+
{
|
1092 |
+
"cell_type": "markdown",
|
1093 |
+
"metadata": {},
|
1094 |
+
"source": [
|
1095 |
+
"**Segregating images and labels to train and valid**"
|
1096 |
+
]
|
1097 |
+
},
|
1098 |
+
{
|
1099 |
+
"cell_type": "code",
|
1100 |
+
"execution_count": 28,
|
1101 |
+
"metadata": {},
|
1102 |
+
"outputs": [],
|
1103 |
+
"source": [
|
1104 |
+
"def segregate_data(df, img_path, label_path, train_img_path, train_label_path):\n",
|
1105 |
+
" filenames = []\n",
|
1106 |
+
" for filename in df.filename:\n",
|
1107 |
+
" filenames.append(filename)\n",
|
1108 |
+
" filenames = set(filenames)\n",
|
1109 |
+
" \n",
|
1110 |
+
" for filename in filenames:\n",
|
1111 |
+
" yolo_list = []\n",
|
1112 |
+
"\n",
|
1113 |
+
" for _,row in df[df.filename == filename].iterrows():\n",
|
1114 |
+
" yolo_list.append([row.labels, row.x_center_norm, row.y_center_norm, row.width_norm, row.height_norm])\n",
|
1115 |
+
"\n",
|
1116 |
+
" yolo_list = np.array(yolo_list)\n",
|
1117 |
+
" txt_filename = os.path.join(train_label_path,str(row.new_filename.split('.')[0])+\".txt\")\n",
|
1118 |
+
" # Save the .img & .txt files to the corresponding train and validation folders\n",
|
1119 |
+
" np.savetxt(txt_filename, yolo_list, fmt=[\"%d\", \"%f\", \"%f\", \"%f\", \"%f\"])\n",
|
1120 |
+
" shutil.copyfile(os.path.join(img_path,row.new_filename), os.path.join(train_img_path,row.new_filename))"
|
1121 |
+
]
|
1122 |
+
},
|
1123 |
+
{
|
1124 |
+
"cell_type": "code",
|
1125 |
+
"execution_count": 29,
|
1126 |
+
"metadata": {},
|
1127 |
+
"outputs": [
|
1128 |
+
{
|
1129 |
+
"name": "stdout",
|
1130 |
+
"output_type": "stream",
|
1131 |
+
"text": [
|
1132 |
+
"No. of Training images 816\n",
|
1133 |
+
"No. of Training labels 816\n",
|
1134 |
+
"No. of valid images 125\n",
|
1135 |
+
"No. of valid labels 125\n"
|
1136 |
+
]
|
1137 |
+
}
|
1138 |
+
],
|
1139 |
+
"source": [
|
1140 |
+
"# Apply function\n",
|
1141 |
+
"src_img_path = \"TobaccoData_Raw/scaled/\"\n",
|
1142 |
+
"src_label_path = \"TobaccoData_Raw/groundtruth/\"\n",
|
1143 |
+
"\n",
|
1144 |
+
"train_img_path = \"TobaccoData_Raw/tobacco_yolo_format/images/train\"\n",
|
1145 |
+
"train_label_path = \"TobaccoData_Raw/tobacco_yolo_format/labels/train\"\n",
|
1146 |
+
"\n",
|
1147 |
+
"valid_img_path = \"TobaccoData_Raw/tobacco_yolo_format/images/valid\"\n",
|
1148 |
+
"valid_label_path = \"TobaccoData_Raw/tobacco_yolo_format/labels/valid\"\n",
|
1149 |
+
"\n",
|
1150 |
+
"segregate_data(df_train, src_img_path, src_label_path, train_img_path, train_label_path)\n",
|
1151 |
+
"segregate_data(df_valid, src_img_path, src_label_path, valid_img_path, valid_label_path)\n",
|
1152 |
+
"\n",
|
1153 |
+
"print(\"No. of Training images\", len(os.listdir('TobaccoData_Raw/tobacco_yolo_format/images/train')))\n",
|
1154 |
+
"print(\"No. of Training labels\", len(os.listdir('TobaccoData_Raw/tobacco_yolo_format/labels/train')))\n",
|
1155 |
+
"\n",
|
1156 |
+
"print(\"No. of valid images\", len(os.listdir('TobaccoData_Raw/tobacco_yolo_format/images/valid')))\n",
|
1157 |
+
"print(\"No. of valid labels\", len(os.listdir('TobaccoData_Raw/tobacco_yolo_format/labels/valid')))"
|
1158 |
+
]
|
1159 |
+
},
|
1160 |
+
{
|
1161 |
+
"cell_type": "markdown",
|
1162 |
+
"metadata": {},
|
1163 |
+
"source": [
|
1164 |
+
"**Deleting ipython checkpoints**"
|
1165 |
+
]
|
1166 |
+
},
|
1167 |
+
{
|
1168 |
+
"cell_type": "code",
|
1169 |
+
"execution_count": 30,
|
1170 |
+
"metadata": {},
|
1171 |
+
"outputs": [],
|
1172 |
+
"source": [
|
1173 |
+
"try:\n",
|
1174 |
+
" shutil.rmtree('TobaccoData_Raw/tobacco_yolo_format/images/train/.ipynb_checkpoints')\n",
|
1175 |
+
"except FileNotFoundError:\n",
|
1176 |
+
" pass\n",
|
1177 |
+
"\n",
|
1178 |
+
"try:\n",
|
1179 |
+
" shutil.rmtree('TobaccoData_Raw/tobacco_yolo_format/images/valid/.ipynb_checkpoints')\n",
|
1180 |
+
"except FileNotFoundError:\n",
|
1181 |
+
" pass\n",
|
1182 |
+
"\n",
|
1183 |
+
"try:\n",
|
1184 |
+
" shutil.rmtree('tobacco_data_zhugy/tobacco_yolo_format/labels/train/.ipynb_checkpoints')\n",
|
1185 |
+
"except FileNotFoundError:\n",
|
1186 |
+
" pass\n",
|
1187 |
+
"\n",
|
1188 |
+
"try:\n",
|
1189 |
+
" shutil.rmtree('tobacco_data_zhugy/tobacco_yolo_format/labels/valid/.ipynb_checkpoints')\n",
|
1190 |
+
"except FileNotFoundError:\n",
|
1191 |
+
" pass\n"
|
1192 |
+
]
|
1193 |
+
},
|
1194 |
+
{
|
1195 |
+
"cell_type": "code",
|
1196 |
+
"execution_count": null,
|
1197 |
+
"metadata": {},
|
1198 |
+
"outputs": [],
|
1199 |
+
"source": []
|
1200 |
+
}
|
1201 |
+
],
|
1202 |
+
"metadata": {
|
1203 |
+
"kernelspec": {
|
1204 |
+
"display_name": "Python 3",
|
1205 |
+
"language": "python",
|
1206 |
+
"name": "python3"
|
1207 |
+
},
|
1208 |
+
"language_info": {
|
1209 |
+
"codemirror_mode": {
|
1210 |
+
"name": "ipython",
|
1211 |
+
"version": 3
|
1212 |
+
},
|
1213 |
+
"file_extension": ".py",
|
1214 |
+
"mimetype": "text/x-python",
|
1215 |
+
"name": "python",
|
1216 |
+
"nbconvert_exporter": "python",
|
1217 |
+
"pygments_lexer": "ipython3",
|
1218 |
+
"version": "3.8.13"
|
1219 |
+
}
|
1220 |
+
},
|
1221 |
+
"nbformat": 4,
|
1222 |
+
"nbformat_minor": 4
|
1223 |
+
}
|
SignatureDetection/Training/CustomYOLOv5_using_Tobcco800_dataset.ipynb
ADDED
@@ -0,0 +1,292 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"cells": [
|
3 |
+
{
|
4 |
+
"cell_type": "markdown",
|
5 |
+
"metadata": {
|
6 |
+
"id": "Bo5_91rSgTg3"
|
7 |
+
},
|
8 |
+
"source": [
|
9 |
+
"**Importing Libraries**"
|
10 |
+
]
|
11 |
+
},
|
12 |
+
{
|
13 |
+
"cell_type": "code",
|
14 |
+
"execution_count": 1,
|
15 |
+
"metadata": {
|
16 |
+
"id": "1FOULt5NeSny"
|
17 |
+
},
|
18 |
+
"outputs": [],
|
19 |
+
"source": [
|
20 |
+
"import shutil\n",
|
21 |
+
"import os, sys, random\n",
|
22 |
+
"from glob import glob\n",
|
23 |
+
"import pandas as pd\n",
|
24 |
+
"from shutil import copyfile\n",
|
25 |
+
"import pandas as pd\n",
|
26 |
+
"from sklearn import preprocessing, model_selection\n",
|
27 |
+
"import matplotlib.pyplot as plt\n",
|
28 |
+
"from matplotlib import patches\n",
|
29 |
+
"import numpy as np\n",
|
30 |
+
"import os\n",
|
31 |
+
"%matplotlib inline"
|
32 |
+
]
|
33 |
+
},
|
34 |
+
{
|
35 |
+
"cell_type": "markdown",
|
36 |
+
"metadata": {
|
37 |
+
"id": "mDgSjs4FMS82"
|
38 |
+
},
|
39 |
+
"source": [
|
40 |
+
"Refer [this blog](https://towardsai.net/p/computer-vision/yolo-v5-object-detection-on-a-custom-dataset) for more information. Its an excellent resource. \n",
|
41 |
+
"\n",
|
42 |
+
"**Cloning Official Repo** \n"
|
43 |
+
]
|
44 |
+
},
|
45 |
+
{
|
46 |
+
"cell_type": "code",
|
47 |
+
"execution_count": null,
|
48 |
+
"metadata": {
|
49 |
+
"id": "3dyetdeOpUIR"
|
50 |
+
},
|
51 |
+
"outputs": [],
|
52 |
+
"source": [
|
53 |
+
"!git clone 'https://github.com/ultralytics/yolov5.git'\n",
|
54 |
+
"!sed -i 's/PyYAML>=5.3.1/PyYAML==5.4.1/g' ./yolov5/requirements.txt\n",
|
55 |
+
"!pip install -qr 'yolov5/requirements.txt'"
|
56 |
+
]
|
57 |
+
},
|
58 |
+
{
|
59 |
+
"cell_type": "code",
|
60 |
+
"execution_count": 6,
|
61 |
+
"metadata": {
|
62 |
+
"colab": {
|
63 |
+
"base_uri": "https://localhost:8080/"
|
64 |
+
},
|
65 |
+
"id": "rOTf_JHIMV9T",
|
66 |
+
"outputId": "514c1cfa-c1e0-4c87-a3a1-672eb744e2cd"
|
67 |
+
},
|
68 |
+
"outputs": [
|
69 |
+
{
|
70 |
+
"data": {
|
71 |
+
"text/plain": [
|
72 |
+
"'yolov5/tobacco_data.yaml'"
|
73 |
+
]
|
74 |
+
},
|
75 |
+
"execution_count": 6,
|
76 |
+
"metadata": {},
|
77 |
+
"output_type": "execute_result"
|
78 |
+
}
|
79 |
+
],
|
80 |
+
"source": [
|
81 |
+
"# Setting the model parameters\n",
|
82 |
+
"# copying the custom_dataset.yaml file to the project repo\n",
|
83 |
+
"# setting number of classes to two (since the tobacco 800 dataset contains 2 classes, Logo & Signature)\n",
|
84 |
+
"shutil.copyfile('Training/tobacco_data.yaml', 'yolov5/tobacco_data.yaml') "
|
85 |
+
]
|
86 |
+
},
|
87 |
+
{
|
88 |
+
"cell_type": "code",
|
89 |
+
"execution_count": 3,
|
90 |
+
"metadata": {},
|
91 |
+
"outputs": [
|
92 |
+
{
|
93 |
+
"name": "stdout",
|
94 |
+
"output_type": "stream",
|
95 |
+
"text": [
|
96 |
+
"/Users/vivekgupta/DS/Signature/1. Detection\n"
|
97 |
+
]
|
98 |
+
}
|
99 |
+
],
|
100 |
+
"source": [
|
101 |
+
"cd .."
|
102 |
+
]
|
103 |
+
},
|
104 |
+
{
|
105 |
+
"cell_type": "code",
|
106 |
+
"execution_count": 4,
|
107 |
+
"metadata": {
|
108 |
+
"colab": {
|
109 |
+
"base_uri": "https://localhost:8080/"
|
110 |
+
},
|
111 |
+
"id": "rOTf_JHIMV9T",
|
112 |
+
"outputId": "514c1cfa-c1e0-4c87-a3a1-672eb744e2cd"
|
113 |
+
},
|
114 |
+
"outputs": [
|
115 |
+
{
|
116 |
+
"name": "stdout",
|
117 |
+
"output_type": "stream",
|
118 |
+
"text": [
|
119 |
+
"train: tobacco_yolo_format/images/train\r\n",
|
120 |
+
"val: tobacco_yolo_format/images/valid\r\n",
|
121 |
+
"\r\n",
|
122 |
+
"nc: 2\r\n",
|
123 |
+
"names: ['DLLogo', 'DLSignature']\r\n"
|
124 |
+
]
|
125 |
+
}
|
126 |
+
],
|
127 |
+
"source": [
|
128 |
+
"!cat yolov5/tobacco_data.yaml"
|
129 |
+
]
|
130 |
+
},
|
131 |
+
{
|
132 |
+
"cell_type": "markdown",
|
133 |
+
"metadata": {
|
134 |
+
"id": "Lfn8HpbaO3tD"
|
135 |
+
},
|
136 |
+
"source": [
|
137 |
+
"**Setting some augmentations**"
|
138 |
+
]
|
139 |
+
},
|
140 |
+
{
|
141 |
+
"cell_type": "code",
|
142 |
+
"execution_count": 5,
|
143 |
+
"metadata": {
|
144 |
+
"id": "wvg-PdCOO26C"
|
145 |
+
},
|
146 |
+
"outputs": [],
|
147 |
+
"source": [
|
148 |
+
"# !sed -i 's/perspective: 0.0/perspective: 0.1/g' ./yolov5/data/hyp.finetune.yaml\n",
|
149 |
+
"# !sed -i 's/shear: 0.0/shear: 0.1/g' ./yolov5/data/hyp.finetune.yaml\n",
|
150 |
+
"# !sed -i 's/flipud: 0.0/flipud: 0.5/g' ./yolov5/data/hyp.finetune.yaml\n",
|
151 |
+
"# !sed -i 's/degrees: 0.0/degrees: 0.2/g' ./yolov5/data/hyp.finetune.yaml"
|
152 |
+
]
|
153 |
+
},
|
154 |
+
{
|
155 |
+
"cell_type": "markdown",
|
156 |
+
"metadata": {
|
157 |
+
"id": "xCtQwpQHPXnD"
|
158 |
+
},
|
159 |
+
"source": [
|
160 |
+
"**Training**"
|
161 |
+
]
|
162 |
+
},
|
163 |
+
{
|
164 |
+
"cell_type": "markdown",
|
165 |
+
"metadata": {
|
166 |
+
"id": "jgUydkkSp3gz"
|
167 |
+
},
|
168 |
+
"source": [
|
169 |
+
"--img 640 is the width of the images. \n",
|
170 |
+
"`Dataset.yaml` file should be present in the directory pointed by --data. \n",
|
171 |
+
"--cfg models/model.yaml is used to set the model we want to train on. I have used yolov5x.yaml, more information could be found [here.](https://github.com/ultralytics/yolov5#pretrained-checkpoints) \n",
|
172 |
+
" \n",
|
173 |
+
"\n",
|
174 |
+
"Many useful tips and information regarding training and testing could be foung [here](https://github.com/ultralytics/yolov5/wiki/Tips-for-Best-Training-Results). **This will helps to clear a good amount of doubts and errors. Also I recommend you to go through the issues section of the repo if you faces any errors or doubts. Legand has it that you will find the solution for your miseries there.**"
|
175 |
+
]
|
176 |
+
},
|
177 |
+
{
|
178 |
+
"cell_type": "code",
|
179 |
+
"execution_count": 7,
|
180 |
+
"metadata": {
|
181 |
+
"id": "NKvLEPfHOSQw",
|
182 |
+
"scrolled": true
|
183 |
+
},
|
184 |
+
"outputs": [
|
185 |
+
{
|
186 |
+
"name": "stdout",
|
187 |
+
"output_type": "stream",
|
188 |
+
"text": [
|
189 |
+
"\u001b[34m\u001b[1mtrain: \u001b[0mweights=yolov5s.pt, cfg=yolov5/models/yolov5s.yaml, data=yolov5/tobacco_data.yaml, hyp=yolov5/data/hyps/hyp.scratch-low.yaml, epochs=100, batch_size=16, imgsz=640, rect=False, resume=False, nosave=False, noval=False, noautoanchor=False, noplots=False, evolve=None, bucket=, cache=None, image_weights=False, device=mp, multi_scale=False, single_cls=False, optimizer=SGD, sync_bn=False, workers=8, project=yolov5/runs/train, name=Tobacco-run, exist_ok=False, quad=False, cos_lr=False, label_smoothing=0.0, patience=100, freeze=[0], save_period=-1, seed=0, local_rank=-1, entity=None, upload_dataset=False, bbox_interval=-1, artifact_alias=latest\n",
|
190 |
+
"\u001b[34m\u001b[1mgithub: \u001b[0mup to date with https://github.com/ultralytics/yolov5 ✅\n",
|
191 |
+
"fatal: cannot change to '/Users/vivekgupta/DS/Signature/1.': No such file or directory\n",
|
192 |
+
"Traceback (most recent call last):\n",
|
193 |
+
" File \"yolov5/train.py\", line 647, in <module>\n",
|
194 |
+
" main(opt)\n",
|
195 |
+
" File \"yolov5/train.py\", line 522, in main\n",
|
196 |
+
" device = select_device(opt.device, batch_size=opt.batch_size)\n",
|
197 |
+
" File \"/Users/vivekgupta/DS/Signature/1. Detection/yolov5/utils/torch_utils.py\", line 118, in select_device\n",
|
198 |
+
" assert torch.cuda.is_available() and torch.cuda.device_count() >= len(device.replace(',', '')), \\\n",
|
199 |
+
"AssertionError: Invalid CUDA '--device mp' requested, use '--device cpu' or pass valid CUDA device(s)\n"
|
200 |
+
]
|
201 |
+
}
|
202 |
+
],
|
203 |
+
"source": [
|
204 |
+
"!python yolov5/train.py --img 640 --batch 16 --epochs 100 --weights \"yolov5s.pt\" \\\n",
|
205 |
+
"--data yolov5/tobacco_data.yaml --cfg yolov5/models/yolov5s.yaml --name Tobacco-run --device 'mp'"
|
206 |
+
]
|
207 |
+
},
|
208 |
+
{
|
209 |
+
"cell_type": "markdown",
|
210 |
+
"metadata": {
|
211 |
+
"id": "xB2bMpZyrWS3"
|
212 |
+
},
|
213 |
+
"source": [
|
214 |
+
"**Testing**"
|
215 |
+
]
|
216 |
+
},
|
217 |
+
{
|
218 |
+
"cell_type": "markdown",
|
219 |
+
"metadata": {
|
220 |
+
"id": "ly5RlSNsrZqr"
|
221 |
+
},
|
222 |
+
"source": [
|
223 |
+
"**To predict images in a folder** \n",
|
224 |
+
"--hide-labels is used to hide the labels in the detected images. \n",
|
225 |
+
"--hide-conf is used to hide the confidence scores in the detected images. --classes [0, 1, etc] used to detect only the classes mentioned here. For our use case we need only signature class, so use --classes 1.\n",
|
226 |
+
"--line-thickness integer used to set the thickness of bounging box. \n",
|
227 |
+
"--save-crop and --save-txt used to save the crops and labels. \n",
|
228 |
+
"--project could be used to specify the results path "
|
229 |
+
]
|
230 |
+
},
|
231 |
+
{
|
232 |
+
"cell_type": "code",
|
233 |
+
"execution_count": null,
|
234 |
+
"metadata": {
|
235 |
+
"id": "uBOJ9IPvPZ8h"
|
236 |
+
},
|
237 |
+
"outputs": [],
|
238 |
+
"source": [
|
239 |
+
"!python yolov5/detect.py --source TobaccoData_Raw/tobacco_yolo_format/images/valid/ --weights 'yolo_model/best.pt' \\\n",
|
240 |
+
" --hide-labels --hide-conf --classes 1 --line-thickness 2 --device 'mps'"
|
241 |
+
]
|
242 |
+
},
|
243 |
+
{
|
244 |
+
"cell_type": "markdown",
|
245 |
+
"metadata": {
|
246 |
+
"id": "n9PS6yTCs3td"
|
247 |
+
},
|
248 |
+
"source": [
|
249 |
+
"**To predict a single image**"
|
250 |
+
]
|
251 |
+
},
|
252 |
+
{
|
253 |
+
"cell_type": "code",
|
254 |
+
"execution_count": null,
|
255 |
+
"metadata": {
|
256 |
+
"id": "kdRwxu7oY53A"
|
257 |
+
},
|
258 |
+
"outputs": [],
|
259 |
+
"source": [
|
260 |
+
"!python yolov5/detect.py --source tobacco_yolo_format/images/valid/imagename --weights 'runs/train/Tobacco-run/weights/best.pt' \\\n",
|
261 |
+
" --hide-labels --hide-conf --classes 1 --line-thickness 2 "
|
262 |
+
]
|
263 |
+
}
|
264 |
+
],
|
265 |
+
"metadata": {
|
266 |
+
"accelerator": "GPU",
|
267 |
+
"colab": {
|
268 |
+
"collapsed_sections": [],
|
269 |
+
"name": "YOLOv5_Tobacco.ipynb",
|
270 |
+
"provenance": []
|
271 |
+
},
|
272 |
+
"kernelspec": {
|
273 |
+
"display_name": "Python 3",
|
274 |
+
"language": "python",
|
275 |
+
"name": "python3"
|
276 |
+
},
|
277 |
+
"language_info": {
|
278 |
+
"codemirror_mode": {
|
279 |
+
"name": "ipython",
|
280 |
+
"version": 3
|
281 |
+
},
|
282 |
+
"file_extension": ".py",
|
283 |
+
"mimetype": "text/x-python",
|
284 |
+
"name": "python",
|
285 |
+
"nbconvert_exporter": "python",
|
286 |
+
"pygments_lexer": "ipython3",
|
287 |
+
"version": "3.8.13"
|
288 |
+
}
|
289 |
+
},
|
290 |
+
"nbformat": 4,
|
291 |
+
"nbformat_minor": 4
|
292 |
+
}
|
SignatureDetection/Training/SignDetection.ipynb
ADDED
@@ -0,0 +1,275 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"cells": [
|
3 |
+
{
|
4 |
+
"cell_type": "code",
|
5 |
+
"execution_count": 1,
|
6 |
+
"id": "f808ce4c",
|
7 |
+
"metadata": {},
|
8 |
+
"outputs": [],
|
9 |
+
"source": [
|
10 |
+
"import shutil\n",
|
11 |
+
"import os, sys, random\n",
|
12 |
+
"from glob import glob\n",
|
13 |
+
"import numpy as np\n",
|
14 |
+
"import pandas as pd\n",
|
15 |
+
"from sklearn import preprocessing, model_selection\n",
|
16 |
+
"\n",
|
17 |
+
"%matplotlib inline"
|
18 |
+
]
|
19 |
+
},
|
20 |
+
{
|
21 |
+
"cell_type": "markdown",
|
22 |
+
"id": "1f53b523",
|
23 |
+
"metadata": {},
|
24 |
+
"source": [
|
25 |
+
"**To predict images in a folder** \n",
|
26 |
+
"--hide-labels is used to hide the labels in the detected images. \n",
|
27 |
+
"--hide-conf is used to hide the confidence scores in the detected images. --classes [0, 1, etc] used to detect only the classes mentioned here. For our use case we need only signature class, so use --classes 1.\n",
|
28 |
+
"--line-thickness integer used to set the thickness of bounging box. \n",
|
29 |
+
"--save-crop and --save-txt used to save the crops and labels. \n",
|
30 |
+
"--project could be used to specify the results path "
|
31 |
+
]
|
32 |
+
},
|
33 |
+
{
|
34 |
+
"cell_type": "code",
|
35 |
+
"execution_count": 2,
|
36 |
+
"id": "cbd540df",
|
37 |
+
"metadata": {},
|
38 |
+
"outputs": [
|
39 |
+
{
|
40 |
+
"name": "stdout",
|
41 |
+
"output_type": "stream",
|
42 |
+
"text": [
|
43 |
+
"/Users/vivekgupta/DS/Signature/1. Detection\n"
|
44 |
+
]
|
45 |
+
}
|
46 |
+
],
|
47 |
+
"source": [
|
48 |
+
"cd '/Users/vivekgupta/DS/Signature/1. Detection/'"
|
49 |
+
]
|
50 |
+
},
|
51 |
+
{
|
52 |
+
"cell_type": "code",
|
53 |
+
"execution_count": 4,
|
54 |
+
"id": "1d0b8972",
|
55 |
+
"metadata": {
|
56 |
+
"scrolled": true
|
57 |
+
},
|
58 |
+
"outputs": [
|
59 |
+
{
|
60 |
+
"name": "stdout",
|
61 |
+
"output_type": "stream",
|
62 |
+
"text": [
|
63 |
+
"\u001b[34m\u001b[1mdetect: \u001b[0mweights=['yolo_model/best.pt'], source=TobaccoData_Raw/tobacco_yolo_format/images/valid/, data=yolov5/data/coco128.yaml, imgsz=[640, 640], conf_thres=0.25, iou_thres=0.45, max_det=1000, device=, view_img=False, save_txt=False, save_conf=False, save_crop=True, nosave=False, classes=[1], agnostic_nms=False, augment=False, visualize=False, update=False, project=yolov5/runs/detect, name=exp, exist_ok=False, line_thickness=2, hide_labels=True, hide_conf=True, half=False, dnn=False, vid_stride=1\n",
|
64 |
+
"fatal: cannot change to '/Users/vivekgupta/DS/Signature/1.': No such file or directory\n",
|
65 |
+
"YOLOv5 🚀 2023-8-21 Python-3.8.13 torch-2.0.1 CPU\n",
|
66 |
+
"\n",
|
67 |
+
"Fusing layers... \n",
|
68 |
+
"YOLOv5x summary: 476 layers, 87205423 parameters, 0 gradients\n",
|
69 |
+
"image 1/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/aao54e00_2.jpg: 640x512 1 DLSignature, 680.1ms\n",
|
70 |
+
"image 2/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/abm69c00.jpg: 640x512 1 DLSignature, 729.1ms\n",
|
71 |
+
"image 3/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/aex05f00_1.jpg: 640x512 1 DLSignature, 735.7ms\n",
|
72 |
+
"image 4/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/agw39d00.jpg: 640x512 8 DLSignatures, 809.4ms\n",
|
73 |
+
"image 5/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/aik94f00-page02_2.jpg: 640x512 1 DLSignature, 807.0ms\n",
|
74 |
+
"image 6/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/aji32e00-page02_2.jpg: 640x512 1 DLSignature, 720.4ms\n",
|
75 |
+
"image 7/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/amw93e00.jpg: 640x512 1 DLSignature, 818.0ms\n",
|
76 |
+
"image 8/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/bad45f00.jpg: 640x512 2 DLSignatures, 946.9ms\n",
|
77 |
+
"image 9/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/bfk68c00-page03_3.jpg: 640x512 1 DLSignature, 676.0ms\n",
|
78 |
+
"image 10/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/bfx94e00.jpg: 640x544 1 DLSignature, 731.5ms\n",
|
79 |
+
"image 11/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/bhw64a00.jpg: 640x544 2 DLSignatures, 725.4ms\n",
|
80 |
+
"image 12/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/bji44a00.jpg: 640x512 2 DLSignatures, 697.9ms\n",
|
81 |
+
"image 13/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/bkz54f00_1.jpg: 640x512 1 DLSignature, 788.8ms\n",
|
82 |
+
"image 14/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/boa85f00.jpg: 640x512 1 DLSignature, 699.7ms\n",
|
83 |
+
"image 15/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/bug83d00.jpg: 640x512 1 DLSignature, 745.2ms\n",
|
84 |
+
"image 16/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/cgy54f00_1.jpg: 640x512 1 DLSignature, 875.6ms\n",
|
85 |
+
"image 17/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/chw80e00_1.jpg: 640x512 1 DLSignature, 727.7ms\n",
|
86 |
+
"image 18/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/cir10f00.jpg: 640x512 2 DLSignatures, 694.4ms\n",
|
87 |
+
"image 19/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/cjb54c00.jpg: 640x512 1 DLSignature, 767.6ms\n",
|
88 |
+
"image 20/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/cjy33f00-page02_2.jpg: 640x512 2 DLSignatures, 721.7ms\n",
|
89 |
+
"image 21/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/cnk41e00-page02_1.jpg: 640x512 (no detections), 729.2ms\n",
|
90 |
+
"image 22/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/cry54f00_1.jpg: 640x512 1 DLSignature, 725.2ms\n",
|
91 |
+
"image 23/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/cxk72e00-page03_1.jpg: 640x544 (no detections), 698.0ms\n",
|
92 |
+
"image 24/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/cxk72e00-page03_3.jpg: 640x544 2 DLSignatures, 757.7ms\n",
|
93 |
+
"image 25/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/dgi64c00.jpg: 640x512 2 DLSignatures, 934.5ms\n",
|
94 |
+
"image 26/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/dhr55d00-page02_2.jpg: 640x512 1 DLSignature, 686.6ms\n",
|
95 |
+
"image 27/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/dic45f00_1.jpg: 640x512 (no detections), 701.8ms\n",
|
96 |
+
"image 28/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/djh5aa00.jpg: 640x512 1 DLSignature, 774.7ms\n",
|
97 |
+
"image 29/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/djz54f00.jpg: 640x512 1 DLSignature, 746.3ms\n",
|
98 |
+
"image 30/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/dlu7aa00_1.jpg: 640x544 (no detections), 812.4ms\n",
|
99 |
+
"image 31/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/dqn43c00.jpg: 640x512 1 DLSignature, 783.9ms\n",
|
100 |
+
"image 32/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/drm00d00.jpg: 640x512 1 DLSignature, 764.6ms\n",
|
101 |
+
"image 33/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/dvr41a00.jpg: 640x512 1 DLSignature, 826.7ms\n",
|
102 |
+
"image 34/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/dwr29e00_2.jpg: 640x512 1 DLSignature, 681.0ms\n",
|
103 |
+
"image 35/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/dxj24f00.jpg: 640x512 2 DLSignatures, 685.8ms\n",
|
104 |
+
"image 36/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/eao90f00.jpg: 640x512 1 DLSignature, 806.9ms\n",
|
105 |
+
"image 37/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/ecn9aa00.jpg: 640x480 1 DLSignature, 698.9ms\n",
|
106 |
+
"image 38/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/ecv85f00.jpg: 640x512 2 DLSignatures, 704.5ms\n",
|
107 |
+
"image 39/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/efm53d00.jpg: 640x512 3 DLSignatures, 746.8ms\n",
|
108 |
+
"image 40/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/eys04c00-page04_4.jpg: 640x512 2 DLSignatures, 754.4ms\n",
|
109 |
+
"image 41/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/fhi41f00.jpg: 640x512 1 DLSignature, 889.0ms\n",
|
110 |
+
"image 42/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/fja22c00.jpg: 640x512 1 DLSignature, 725.6ms\n",
|
111 |
+
"image 43/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/fny38c00-page05_5.jpg: 640x512 5 DLSignatures, 670.7ms\n",
|
112 |
+
"image 44/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/fzh11c00-var.jpg: 640x512 2 DLSignatures, 699.8ms\n",
|
113 |
+
"image 45/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/gal01c00.jpg: 640x512 1 DLSignature, 766.4ms\n",
|
114 |
+
"image 46/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/gjl70a00-page2_2.jpg: 640x512 3 DLSignatures, 710.9ms\n",
|
115 |
+
"image 47/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/gpq38e00-page02_1.jpg: 640x512 1 DLSignature, 741.5ms\n",
|
116 |
+
"image 48/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/grm00d00.jpg: 640x512 1 DLSignature, 707.9ms\n",
|
117 |
+
"image 49/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/hbk41e00.jpg: 640x512 1 DLSignature, 781.6ms\n"
|
118 |
+
]
|
119 |
+
},
|
120 |
+
{
|
121 |
+
"name": "stdout",
|
122 |
+
"output_type": "stream",
|
123 |
+
"text": [
|
124 |
+
"image 50/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/hna35f00.jpg: 640x512 1 DLSignature, 892.3ms\n",
|
125 |
+
"image 51/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/hti31a00_1.jpg: 640x512 1 DLSignature, 676.8ms\n",
|
126 |
+
"image 52/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/hty24f00-page02_2.jpg: 640x512 3 DLSignatures, 681.4ms\n",
|
127 |
+
"image 53/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/hua33a00-init.jpg: 640x512 2 DLSignatures, 781.7ms\n",
|
128 |
+
"image 54/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/huz50e00_1.jpg: 640x512 1 DLSignature, 714.6ms\n",
|
129 |
+
"image 55/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/icr55d00.jpg: 640x512 7 DLSignatures, 762.7ms\n",
|
130 |
+
"image 56/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/idr55d00.jpg: 640x512 3 DLSignatures, 697.1ms\n",
|
131 |
+
"image 57/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/iln90f00.jpg: 640x512 1 DLSignature, 738.7ms\n",
|
132 |
+
"image 58/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/irx55e00.jpg: 640x544 1 DLSignature, 811.9ms\n",
|
133 |
+
"image 59/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/jci90c00.jpg: 640x512 1 DLSignature, 903.1ms\n",
|
134 |
+
"image 60/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/jgs60f00-page03_1.jpg: 640x512 (no detections), 742.1ms\n",
|
135 |
+
"image 61/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/juo75f00_1.jpg: 640x512 1 DLSignature, 745.4ms\n",
|
136 |
+
"image 62/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/kcv85f00_1.jpg: 640x512 2 DLSignatures, 786.5ms\n",
|
137 |
+
"image 63/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/kde44c00-page02_2.jpg: 640x512 1 DLSignature, 759.2ms\n",
|
138 |
+
"image 64/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/kfw39d00.jpg: 640x512 9 DLSignatures, 806.6ms\n",
|
139 |
+
"image 65/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/kgb30f00.jpg: 640x512 1 DLSignature, 801.9ms\n",
|
140 |
+
"image 66/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/kma35f00.jpg: 640x512 1 DLSignature, 782.1ms\n",
|
141 |
+
"image 67/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/kmw13f00.jpg: 640x512 1 DLSignature, 858.2ms\n",
|
142 |
+
"image 68/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/llq11e00-page02_2.jpg: 640x512 1 DLSignature, 698.0ms\n",
|
143 |
+
"image 69/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/lwd23f00-page02_2.jpg: 640x512 1 DLSignature, 712.0ms\n",
|
144 |
+
"image 70/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/men75f00.jpg: 640x512 1 DLSignature, 837.8ms\n",
|
145 |
+
"image 71/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/mma35f00.jpg: 640x512 2 DLSignatures, 809.5ms\n",
|
146 |
+
"image 72/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/ncn00d00.jpg: 640x512 1 DLSignature, 848.1ms\n",
|
147 |
+
"image 73/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/nff41e00.jpg: 640x512 1 DLSignature, 810.1ms\n",
|
148 |
+
"image 74/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/nir55d00-page02_1.jpg: 640x512 (no detections), 842.8ms\n",
|
149 |
+
"image 75/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/nlq86d00.jpg: 640x512 1 DLSignature, 888.7ms\n",
|
150 |
+
"image 76/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/nrg54f00-page02_1.jpg: 640x512 1 DLSignature, 700.3ms\n",
|
151 |
+
"image 77/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/nsr05f00_1.jpg: 640x512 1 DLSignature, 699.4ms\n",
|
152 |
+
"image 78/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/nul00a00.jpg: 640x544 1 DLSignature, 735.3ms\n",
|
153 |
+
"image 79/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/oen75f00.jpg: 640x512 3 DLSignatures, 740.4ms\n",
|
154 |
+
"image 80/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/oib30f00-first-var.jpg: 640x512 1 DLSignature, 797.0ms\n",
|
155 |
+
"image 81/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/pdg62d00-page02_2.jpg: 640x512 2 DLSignatures, 748.2ms\n",
|
156 |
+
"image 82/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/pfk90c00.jpg: 640x512 2 DLSignatures, 781.9ms\n",
|
157 |
+
"image 83/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/ppz95d00.jpg: 640x512 1 DLSignature, 938.2ms\n",
|
158 |
+
"image 84/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/pxp81f00.jpg: 640x512 1 DLSignature, 702.3ms\n",
|
159 |
+
"image 85/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/qei59c00.jpg: 640x512 1 DLSignature, 687.8ms\n",
|
160 |
+
"image 86/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/qma35f00.jpg: 640x512 1 DLSignature, 759.6ms\n",
|
161 |
+
"image 87/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/qnj41f00.jpg: 640x512 1 DLSignature, 705.4ms\n",
|
162 |
+
"image 88/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/rex05f00_1.jpg: 640x512 2 DLSignatures, 800.1ms\n",
|
163 |
+
"image 89/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/rgj46d00.jpg: 640x512 2 DLSignatures, 729.3ms\n",
|
164 |
+
"image 90/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/rsv90c00-first.jpg: 640x512 1 DLSignature, 722.1ms\n",
|
165 |
+
"image 91/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/rzk3aa00.jpg: 640x512 1 DLSignature, 834.5ms\n",
|
166 |
+
"image 92/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/sfp41a00-page5_1.jpg: 640x512 2 DLSignatures, 714.2ms\n",
|
167 |
+
"image 93/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/sia26d00.jpg: 640x512 1 DLSignature, 699.9ms\n",
|
168 |
+
"image 94/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/sik79d00.jpg: 640x512 2 DLSignatures, 714.5ms\n",
|
169 |
+
"image 95/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/sji44a00.jpg: 640x512 2 DLSignatures, 730.5ms\n",
|
170 |
+
"image 96/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/sla48c00.jpg: 640x512 2 DLSignatures, 713.2ms\n",
|
171 |
+
"image 97/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/sma35f00.jpg: 640x512 1 DLSignature, 762.3ms\n",
|
172 |
+
"image 98/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/ubd60f00.jpg: 640x512 1 DLSignature, 705.6ms\n",
|
173 |
+
"image 99/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/ufw98c00.jpg: 640x512 1 DLSignature, 752.3ms\n",
|
174 |
+
"image 100/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/uji44a00.jpg: 640x512 2 DLSignatures, 872.1ms\n",
|
175 |
+
"image 101/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/ukd41a00-ernest.jpg: 640x512 1 DLSignature, 676.8ms\n",
|
176 |
+
"image 102/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/uzm55d00-page02_1.jpg: 640x512 (no detections), 689.3ms\n",
|
177 |
+
"image 103/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/vdr55d00.jpg: 640x512 1 DLSignature, 747.2ms\n"
|
178 |
+
]
|
179 |
+
},
|
180 |
+
{
|
181 |
+
"name": "stdout",
|
182 |
+
"output_type": "stream",
|
183 |
+
"text": [
|
184 |
+
"image 104/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/vff43c00.jpg: 640x512 1 DLSignature, 736.8ms\n",
|
185 |
+
"image 105/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/vfs60f00.jpg: 640x512 1 DLSignature, 786.7ms\n",
|
186 |
+
"image 106/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/vss86d00.jpg: 640x512 1 DLSignature, 757.6ms\n",
|
187 |
+
"image 107/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/wab91d00-var.jpg: 640x512 1 DLSignature, 741.4ms\n",
|
188 |
+
"image 108/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/wat01f00.jpg: 640x512 1 DLSignature, 872.7ms\n",
|
189 |
+
"image 109/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/wbo3aa00.jpg: 640x512 1 DLSignature, 673.6ms\n",
|
190 |
+
"image 110/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/wbv90c00-page02_1.jpg: 640x512 (no detections), 665.9ms\n",
|
191 |
+
"image 111/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/wfg55f00.jpg: 640x512 1 DLSignature, 705.6ms\n",
|
192 |
+
"image 112/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/wjf44f00.jpg: 640x512 1 DLSignature, 788.4ms\n",
|
193 |
+
"image 113/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/wlp51a00.jpg: 640x512 1 DLSignature, 757.4ms\n",
|
194 |
+
"image 114/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/wzk36d00page02-first_2.jpg: 640x512 1 DLSignature, 730.1ms\n",
|
195 |
+
"image 115/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/xjw13f00.jpg: 640x512 2 DLSignatures, 719.0ms\n",
|
196 |
+
"image 116/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/xyr15f00.jpg: 640x512 1 DLSignature, 769.4ms\n",
|
197 |
+
"image 117/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/yhw13f00_1.jpg: 640x512 1 DLSignature, 873.7ms\n",
|
198 |
+
"image 118/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/yme01e00-page01_1.jpg: 640x544 1 DLSignature, 665.2ms\n",
|
199 |
+
"image 119/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/ymp51a00.jpg: 640x512 1 DLSignature, 683.1ms\n",
|
200 |
+
"image 120/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/yyo25f00.jpg: 640x512 1 DLSignature, 701.8ms\n",
|
201 |
+
"image 121/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/zkd43f00_3.jpg: 640x512 4 DLSignatures, 677.3ms\n",
|
202 |
+
"image 122/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/zny04f00_2.jpg: 640x512 1 DLSignature, 735.3ms\n",
|
203 |
+
"image 123/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/zpz83f00_1.jpg: 640x512 1 DLSignature, 720.1ms\n",
|
204 |
+
"image 124/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/zqr09c00.jpg: 640x512 1 DLSignature, 727.4ms\n",
|
205 |
+
"image 125/125 /Users/vivekgupta/DS/Signature/1. Detection/TobaccoData_Raw/tobacco_yolo_format/images/valid/zrt45f00.jpg: 640x512 1 DLSignature, 848.2ms\n",
|
206 |
+
"Speed: 0.7ms pre-process, 755.2ms inference, 0.9ms NMS per image at shape (1, 3, 640, 640)\n",
|
207 |
+
"Results saved to \u001b[1myolov5/runs/detect/exp3\u001b[0m\n"
|
208 |
+
]
|
209 |
+
}
|
210 |
+
],
|
211 |
+
"source": [
|
212 |
+
"!python yolov5/detect.py --source TobaccoData_Raw/tobacco_yolo_format/images/valid/ --weights 'yolo_model/best.pt' \\\n",
|
213 |
+
" --hide-labels --hide-conf --classes 1 --line-thickness 2 --save-crop"
|
214 |
+
]
|
215 |
+
},
|
216 |
+
{
|
217 |
+
"cell_type": "code",
|
218 |
+
"execution_count": 5,
|
219 |
+
"id": "0b64099a",
|
220 |
+
"metadata": {
|
221 |
+
"scrolled": true
|
222 |
+
},
|
223 |
+
"outputs": [
|
224 |
+
{
|
225 |
+
"name": "stdout",
|
226 |
+
"output_type": "stream",
|
227 |
+
"text": [
|
228 |
+
"\u001b[34m\u001b[1mdetect: \u001b[0mweights=['yolo_model/best.pt'], source=check.jpg, data=yolov5/data/coco128.yaml, imgsz=[640, 640], conf_thres=0.25, iou_thres=0.45, max_det=1000, device=, view_img=False, save_txt=False, save_conf=False, save_crop=True, nosave=False, classes=[1], agnostic_nms=False, augment=False, visualize=False, update=False, project=yolov5/runs/detect, name=exp, exist_ok=False, line_thickness=2, hide_labels=True, hide_conf=True, half=False, dnn=False, vid_stride=1\n",
|
229 |
+
"fatal: cannot change to '/Users/vivekgupta/DS/Signature/1.': No such file or directory\n",
|
230 |
+
"YOLOv5 🚀 2023-8-21 Python-3.8.13 torch-2.1.0.dev20230821 CPU\n",
|
231 |
+
"\n",
|
232 |
+
"Fusing layers... \n",
|
233 |
+
"YOLOv5x summary: 476 layers, 87205423 parameters, 0 gradients\n",
|
234 |
+
"image 1/1 /Users/vivekgupta/DS/Signature/1. Detection/check.jpg: 384x640 4 DLSignatures, 360.6ms\n",
|
235 |
+
"Speed: 0.9ms pre-process, 360.6ms inference, 5.7ms NMS per image at shape (1, 3, 640, 640)\n",
|
236 |
+
"Results saved to \u001b[1myolov5/runs/detect/exp4\u001b[0m\n"
|
237 |
+
]
|
238 |
+
}
|
239 |
+
],
|
240 |
+
"source": [
|
241 |
+
"!python yolov5/detect.py --source check.jpg --weights 'yolo_model/best.pt' \\\n",
|
242 |
+
" --hide-labels --hide-conf --classes 1 --line-thickness 2 --save-crop"
|
243 |
+
]
|
244 |
+
},
|
245 |
+
{
|
246 |
+
"cell_type": "code",
|
247 |
+
"execution_count": null,
|
248 |
+
"id": "b53e1c44",
|
249 |
+
"metadata": {},
|
250 |
+
"outputs": [],
|
251 |
+
"source": []
|
252 |
+
}
|
253 |
+
],
|
254 |
+
"metadata": {
|
255 |
+
"kernelspec": {
|
256 |
+
"display_name": "Python 3",
|
257 |
+
"language": "python",
|
258 |
+
"name": "python3"
|
259 |
+
},
|
260 |
+
"language_info": {
|
261 |
+
"codemirror_mode": {
|
262 |
+
"name": "ipython",
|
263 |
+
"version": 3
|
264 |
+
},
|
265 |
+
"file_extension": ".py",
|
266 |
+
"mimetype": "text/x-python",
|
267 |
+
"name": "python",
|
268 |
+
"nbconvert_exporter": "python",
|
269 |
+
"pygments_lexer": "ipython3",
|
270 |
+
"version": "3.8.13"
|
271 |
+
}
|
272 |
+
},
|
273 |
+
"nbformat": 4,
|
274 |
+
"nbformat_minor": 5
|
275 |
+
}
|
SignatureDetection/Training/tobacco_data.yaml
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
train: TobaccoData_Raw/tobacco_yolo_format/images/train
|
2 |
+
val: TobaccoData_Raw/tobacco_yolo_format/images/valid
|
3 |
+
|
4 |
+
nc: 2
|
5 |
+
names: ['DLLogo', 'DLSignature']
|