vickygupta1996 commited on
Commit
b59c9b4
1 Parent(s): 2f3c2e4

Upload folder using huggingface_hub

Browse files
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']