Commit ·
2f3c2e4
1
Parent(s): e95c0b6
Delete SignatureDetection
Browse files- SignatureDetection/.DS_Store +0 -0
- SignatureDetection/.ipynb_checkpoints/Converting_Tobacco800_Dataset_to_YOLOv5_Format-checkpoint.ipynb +0 -1204
- SignatureDetection/.ipynb_checkpoints/CustomYOLOv5_using_Tobcco800_dataset-checkpoint.ipynb +0 -274
- SignatureDetection/.ipynb_checkpoints/SignDetection-checkpoint.ipynb +0 -246
- SignatureDetection/Converting_Tobacco800_Dataset_to_YOLOv5_Format.ipynb +0 -1223
- SignatureDetection/CustomYOLOv5_using_Tobcco800_dataset.ipynb +0 -292
- SignatureDetection/SignDetection.ipynb +0 -275
- SignatureDetection/tobacco_data.yaml +0 -5
SignatureDetection/.DS_Store
DELETED
|
Binary file (6.15 kB)
|
|
|
SignatureDetection/.ipynb_checkpoints/Converting_Tobacco800_Dataset_to_YOLOv5_Format-checkpoint.ipynb
DELETED
|
@@ -1,1204 +0,0 @@
|
|
| 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/.ipynb_checkpoints/CustomYOLOv5_using_Tobcco800_dataset-checkpoint.ipynb
DELETED
|
@@ -1,274 +0,0 @@
|
|
| 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/.ipynb_checkpoints/SignDetection-checkpoint.ipynb
DELETED
|
@@ -1,246 +0,0 @@
|
|
| 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/Converting_Tobacco800_Dataset_to_YOLOv5_Format.ipynb
DELETED
|
@@ -1,1223 +0,0 @@
|
|
| 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": "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\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/CustomYOLOv5_using_Tobcco800_dataset.ipynb
DELETED
|
@@ -1,292 +0,0 @@
|
|
| 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/SignDetection.ipynb
DELETED
|
@@ -1,275 +0,0 @@
|
|
| 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/tobacco_data.yaml
DELETED
|
@@ -1,5 +0,0 @@
|
|
| 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']
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|