{
"cells": [
{
"cell_type": "markdown",
"id": "dc9e798f",
"metadata": {},
"source": [
"[![image](https://raw.githubusercontent.com/visual-layer/visuallayer/main/imgs/vl_horizontal_logo.png)](https://www.visual-layer.com)"
]
},
{
"cell_type": "markdown",
"id": "a4b4c6a4",
"metadata": {},
"source": [
"# Optical Character Recognition\n",
"\n",
"This notebook shows how you can use fastdup to extract optical characters on your video/image dataset.\n",
"\n",
"We will be using fastdup with [PaddleOCR](https://github.com/PaddlePaddle/PaddleOCR) - A lightweight, multilingual optical character recognition package. "
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "eb7bae6e",
"metadata": {},
"outputs": [],
"source": [
"!pip install -Uqq fastdup paddleocr paddlepaddle gdown numpy"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "d32320e4",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"/usr/bin/dpkg\n"
]
},
{
"data": {
"text/plain": [
"'1.34'"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import fastdup\n",
"fastdup.__version__"
]
},
{
"cell_type": "markdown",
"id": "846eac12-19b1-42de-a91f-815701633f56",
"metadata": {},
"source": [
"If you're running this notebook in Google Colab, uncomment the following cell and run before proceeding to the next cell."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5a4b8dda-ff0a-4291-847a-4bcabf2eb7b7",
"metadata": {},
"outputs": [],
"source": [
"# !wget http://nz2.archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2.19_amd64.deb\n",
"# !sudo dpkg -i libssl1.1_1.1.1f-1ubuntu2.19_amd64.deb"
]
},
{
"cell_type": "markdown",
"id": "1a102231-89d7-4c6a-acca-5d9371c847e7",
"metadata": {},
"source": [
"## Download Video Dataset\n",
"We'll use a subset of the [TikTok Trending Videos](https://www.kaggle.com/datasets/erikvdven/tiktok-trending-december-2020) dataset from Kaggle."
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "1c5c3a34-ba3b-40d6-8858-078ffd504d50",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Downloading...\n",
"From (uriginal): https://drive.google.com/uc?id=1FsBQTZKsfApEn99g_BhkTbdz0SmQgkKv\n",
"From (redirected): https://drive.google.com/uc?id=1FsBQTZKsfApEn99g_BhkTbdz0SmQgkKv&confirm=t&uuid=2e6206bc-cbe1-4642-a0f9-f849a42c4b6e\n",
"To: /media/dnth/Active-Projects/fastdup/examples/tiktok-trending-subset.zip\n",
"100%|██████████████████████████████████████| 61.3M/61.3M [00:06<00:00, 9.67MB/s]\n"
]
}
],
"source": [
"!gdown https://drive.google.com/uc?id=1FsBQTZKsfApEn99g_BhkTbdz0SmQgkKv"
]
},
{
"cell_type": "markdown",
"id": "384a7f3a",
"metadata": {},
"source": [
"Now, unzip the dataset into our local directory. You'll find a folder name `tiktok-trending-subset` that has all the trending clips."
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "571fa771-d8a2-48da-bcae-690abc4656ab",
"metadata": {},
"outputs": [],
"source": [
"!unzip -q tiktok-trending-subset.zip"
]
},
{
"cell_type": "markdown",
"id": "f455b752",
"metadata": {},
"source": [
"## Extract frames\n",
"To run fastdup, we will need to extract the clips in the `tiktok-trending-subset` folder into frames and store them in another folder, let's name the folder `frames`. fastdup provides a convenience function for that."
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "86a21118",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"FastDup Software, (C) copyright 2022 Dr. Amir Alush and Dr. Danny Bickson.\n",
"2023-08-09 16:17:49 [INFO] Going to loop over dir tiktok-trending-subset\n",
"2023-08-09 16:17:49 [INFO] Found total 19 videos to run on, 19 train, 0 test, name list 19, counter 19 \n"
]
},
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fastdup.extract_video_frames('tiktok-trending-subset', 'frames')"
]
},
{
"cell_type": "markdown",
"id": "fdd6e307",
"metadata": {},
"source": [
"## Run fastdup\n",
"With the extracted frames, we can run fastdup to analyze them. \n",
"\n",
"To use the optical character recognition feature, specify `bounding_box='ocr'` in the `run` method.\n",
"\n",
"For demonstration, we'll specify `num_images=1000` in the `run` method which limits the run to only 1000 images. Feel free to specify a different value or omitting this parameter altogether to run on the entire dataset."
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "3a303d5d",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Warning: fastdup create() without work_dir argument, output is stored in a folder named work_dir in your current working path.\n",
"FastDup Software, (C) copyright 2022 Dr. Amir Alush and Dr. Danny Bickson.\n",
"2023-08-09 16:17:52 [INFO] Going to loop over dir frames\n",
"2023-08-09 16:17:52 [INFO] Found total 54 images to run on, 54 train, 0 test, name list 54, counter 54 \n",
"FastDup Software, (C) copyright 2022 Dr. Amir Alush and Dr. Danny Bickson.\n",
"2023-08-09 16:18:45 [INFO] Going to loop over dir /tmp/crops_input.csv\n",
"2023-08-09 16:18:45 [INFO] Found total 259 images to run on, 259 train, 0 test, name list 259, counter 259 \n",
"2023-08-09 16:18:46 [INFO] Found total 259 images to run onstimated: 0 Minutes\n",
"Finished histogram 0.280\n",
"Finished bucket sort 0.294\n",
"2023-08-09 16:18:46 [INFO] 31) Finished write_index() NN model\n",
"2023-08-09 16:18:46 [INFO] Stored nn model index file work_dir/nnf.index\n",
"2023-08-09 16:18:46 [INFO] Total time took 1043 ms\n",
"2023-08-09 16:18:46 [INFO] Found a total of 83 fully identical images (d>0.990), which are 16.02 %\n",
"2023-08-09 16:18:46 [INFO] Found a total of 57 nearly identical images(d>0.980), which are 11.00 %\n",
"2023-08-09 16:18:46 [INFO] Found a total of 394 above threshold images (d>0.900), which are 76.06 %\n",
"2023-08-09 16:18:46 [INFO] Found a total of 25 outlier images (d<0.050), which are 4.83 %\n",
"2023-08-09 16:18:46 [INFO] Min distance found 0.448 max distance 0.999\n",
"2023-08-09 16:18:46 [INFO] Running connected components for ccthreshold 0.960000 \n",
".0\n",
" ########################################################################################\n",
"\n",
"Dataset Analysis Summary: \n",
"\n",
" Dataset contains 259 objects\n",
" Valid objects are 88.00% (259) of the data, invalid are 0.00% (0) of the data\n",
" Similarity: 48.25% (142) belong to 11 similarity clusters (components).\n",
" 39.75% (117) images do not belong to any similarity cluster.\n",
" Largest cluster has 58 (19.71%) images.\n",
" For a detailed analysis, use `.connected_components()`\n",
"(similarity threshold used is 0.9, connected component threshold used is 0.96).\n",
"\n",
" Outliers: 5.10% (15) of images are possible outliers, and fall in the bottom 5.00% of similarity values.\n",
" For a detailed list of outliers, use `.outliers()`.\n",
"\n",
"########################################################################################\n",
"Would you like to see awesome visualizations for some of the most popular academic datasets?\n",
"Click here to see and learn more: https://app.visual-layer.com/vl-datasets?utm_source=fastdup\n",
"########################################################################################\n"
]
},
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fd = fastdup.create(input_dir='./frames')\n",
"fd.run(bounding_box='ocr')"
]
},
{
"cell_type": "markdown",
"id": "8085604b-0c84-4b88-a21e-e48b97fea8f0",
"metadata": {},
"source": [
"## Extracted OCR Information"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "08d4d08a-8e48-4e6b-90c5-3fe177fba359",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" index \n",
" img_w \n",
" img_h \n",
" unique \n",
" blur \n",
" mean \n",
" min \n",
" max \n",
" stdv \n",
" file_size \n",
" contrast \n",
" filename \n",
" crop_filename \n",
" x1 \n",
" y1 \n",
" x2 \n",
" y2 \n",
" x3 \n",
" y3 \n",
" x4 \n",
" y4 \n",
" confidence \n",
" label \n",
" is_valid \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 0 \n",
" 24 \n",
" 14 \n",
" 183 \n",
" 345.0356 \n",
" 178.0270 \n",
" 51.0 \n",
" 255.0 \n",
" 57.0515 \n",
" 916 \n",
" 0.6667 \n",
" frames/tmp/tiktok-trending-subset6875373441432816898.mp4/output_000002.jpg \n",
" work_dir/crops/framestmptiktok-trending-subset6875373441432816898.mp4output_000002.jpg_436_953_456_953_456_965_436_965.jpg \n",
" 436 \n",
" 953 \n",
" 456 \n",
" 953 \n",
" 456 \n",
" 965 \n",
" 436 \n",
" 965 \n",
" 0.662398 \n",
" 1 \n",
" True \n",
" \n",
" \n",
" 1 \n",
" 1 \n",
" 112 \n",
" 36 \n",
" 195 \n",
" 688.3301 \n",
" 180.5150 \n",
" 41.0 \n",
" 255.0 \n",
" 47.7177 \n",
" 2614 \n",
" 0.7230 \n",
" frames/tmp/tiktok-trending-subset6875373441432816898.mp4/output_000002.jpg \n",
" work_dir/crops/framestmptiktok-trending-subset6875373441432816898.mp4output_000002.jpg_466_945_560_945_560_975_466_975.jpg \n",
" 466 \n",
" 945 \n",
" 560 \n",
" 945 \n",
" 560 \n",
" 975 \n",
" 466 \n",
" 975 \n",
" 0.785349 \n",
" TikTok \n",
" True \n",
" \n",
" \n",
" 2 \n",
" 2 \n",
" 108 \n",
" 28 \n",
" 186 \n",
" 739.3006 \n",
" 164.1137 \n",
" 70.0 \n",
" 255.0 \n",
" 40.6979 \n",
" 2074 \n",
" 0.5692 \n",
" frames/tmp/tiktok-trending-subset6875373441432816898.mp4/output_000002.jpg \n",
" work_dir/crops/framestmptiktok-trending-subset6875373441432816898.mp4output_000002.jpg_472_983_562_986_562_1008_471_1006.jpg \n",
" 472 \n",
" 983 \n",
" 562 \n",
" 986 \n",
" 562 \n",
" 1008 \n",
" 471 \n",
" 1006 \n",
" 0.989322 \n",
" @caitlinjs \n",
" True \n",
" \n",
" \n",
" 3 \n",
" 3 \n",
" 106 \n",
" 35 \n",
" 159 \n",
" 208.8422 \n",
" 222.4114 \n",
" 48.0 \n",
" 255.0 \n",
" 22.7722 \n",
" 2404 \n",
" 0.6832 \n",
" frames/tmp/tiktok-trending-subset6875323773755657474.mp4/output_000001.jpg \n",
" work_dir/crops/framestmptiktok-trending-subset6875323773755657474.mp4output_000001.jpg_61_26_149_26_149_55_61_55.jpg \n",
" 61 \n",
" 26 \n",
" 149 \n",
" 26 \n",
" 149 \n",
" 55 \n",
" 61 \n",
" 55 \n",
" 0.829294 \n",
" TikTOK \n",
" True \n",
" \n",
" \n",
" 4 \n",
" 4 \n",
" 159 \n",
" 25 \n",
" 95 \n",
" 360.8476 \n",
" 215.8326 \n",
" 0.0 \n",
" 255.0 \n",
" 29.6220 \n",
" 1811 \n",
" 1.0000 \n",
" frames/tmp/tiktok-trending-subset6875323773755657474.mp4/output_000001.jpg \n",
" work_dir/crops/framestmptiktok-trending-subset6875323773755657474.mp4output_000001.jpg_12_66_146_66_146_87_12_87.jpg \n",
" 12 \n",
" 66 \n",
" 146 \n",
" 66 \n",
" 146 \n",
" 87 \n",
" 12 \n",
" 87 \n",
" 0.990695 \n",
" @marc.koolen \n",
" True \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" index img_w img_h unique blur mean min max stdv file_size contrast filename crop_filename x1 y1 x2 y2 x3 y3 x4 y4 confidence label is_valid\n",
"0 0 24 14 183 345.0356 178.0270 51.0 255.0 57.0515 916 0.6667 frames/tmp/tiktok-trending-subset6875373441432816898.mp4/output_000002.jpg work_dir/crops/framestmptiktok-trending-subset6875373441432816898.mp4output_000002.jpg_436_953_456_953_456_965_436_965.jpg 436 953 456 953 456 965 436 965 0.662398 1 True\n",
"1 1 112 36 195 688.3301 180.5150 41.0 255.0 47.7177 2614 0.7230 frames/tmp/tiktok-trending-subset6875373441432816898.mp4/output_000002.jpg work_dir/crops/framestmptiktok-trending-subset6875373441432816898.mp4output_000002.jpg_466_945_560_945_560_975_466_975.jpg 466 945 560 945 560 975 466 975 0.785349 TikTok True\n",
"2 2 108 28 186 739.3006 164.1137 70.0 255.0 40.6979 2074 0.5692 frames/tmp/tiktok-trending-subset6875373441432816898.mp4/output_000002.jpg work_dir/crops/framestmptiktok-trending-subset6875373441432816898.mp4output_000002.jpg_472_983_562_986_562_1008_471_1006.jpg 472 983 562 986 562 1008 471 1006 0.989322 @caitlinjs True\n",
"3 3 106 35 159 208.8422 222.4114 48.0 255.0 22.7722 2404 0.6832 frames/tmp/tiktok-trending-subset6875323773755657474.mp4/output_000001.jpg work_dir/crops/framestmptiktok-trending-subset6875323773755657474.mp4output_000001.jpg_61_26_149_26_149_55_61_55.jpg 61 26 149 26 149 55 61 55 0.829294 TikTOK True\n",
"4 4 159 25 95 360.8476 215.8326 0.0 255.0 29.6220 1811 1.0000 frames/tmp/tiktok-trending-subset6875323773755657474.mp4/output_000001.jpg work_dir/crops/framestmptiktok-trending-subset6875323773755657474.mp4output_000001.jpg_12_66_146_66_146_87_12_87.jpg 12 66 146 66 146 87 12 87 0.990695 @marc.koolen True"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"stats = fd.img_stats()\n",
"stats.head()"
]
},
{
"cell_type": "markdown",
"id": "601423b7-8a84-45ab-9c8f-4f333c17e15a",
"metadata": {},
"source": [
"That's a lot of information. Let's slice the table to only include the columns we need."
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "0c368be9-3e62-4ea6-8895-c018642c6a9a",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" filename \n",
" crop_filename \n",
" label \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" frames/tmp/tiktok-trending-subset6875373441432816898.mp4/output_000002.jpg \n",
" work_dir/crops/framestmptiktok-trending-subset6875373441432816898.mp4output_000002.jpg_436_953_456_953_456_965_436_965.jpg \n",
" 1 \n",
" \n",
" \n",
" 1 \n",
" frames/tmp/tiktok-trending-subset6875373441432816898.mp4/output_000002.jpg \n",
" work_dir/crops/framestmptiktok-trending-subset6875373441432816898.mp4output_000002.jpg_466_945_560_945_560_975_466_975.jpg \n",
" TikTok \n",
" \n",
" \n",
" 2 \n",
" frames/tmp/tiktok-trending-subset6875373441432816898.mp4/output_000002.jpg \n",
" work_dir/crops/framestmptiktok-trending-subset6875373441432816898.mp4output_000002.jpg_472_983_562_986_562_1008_471_1006.jpg \n",
" @caitlinjs \n",
" \n",
" \n",
" 3 \n",
" frames/tmp/tiktok-trending-subset6875323773755657474.mp4/output_000001.jpg \n",
" work_dir/crops/framestmptiktok-trending-subset6875323773755657474.mp4output_000001.jpg_61_26_149_26_149_55_61_55.jpg \n",
" TikTOK \n",
" \n",
" \n",
" 4 \n",
" frames/tmp/tiktok-trending-subset6875323773755657474.mp4/output_000001.jpg \n",
" work_dir/crops/framestmptiktok-trending-subset6875323773755657474.mp4output_000001.jpg_12_66_146_66_146_87_12_87.jpg \n",
" @marc.koolen \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" 254 \n",
" frames/tmp/tiktok-trending-subset6875872124968439046.mp4/output_000006.jpg \n",
" work_dir/crops/framestmptiktok-trending-subset6875872124968439046.mp4output_000006.jpg_78_604_308_604_308_622_78_622.jpg \n",
" haveadecentamountof \n",
" \n",
" \n",
" 255 \n",
" frames/tmp/tiktok-trending-subset6875872124968439046.mp4/output_000006.jpg \n",
" work_dir/crops/framestmptiktok-trending-subset6875872124968439046.mp4output_000006.jpg_78_628_317_628_317_650_78_650.jpg \n",
" bruisingandpainwithmy \n",
" \n",
" \n",
" 256 \n",
" frames/tmp/tiktok-trending-subset6875872124968439046.mp4/output_000006.jpg \n",
" work_dir/crops/framestmptiktok-trending-subset6875872124968439046.mp4output_000006.jpg_77_654_168_654_168_672_77_672.jpg \n",
" newlever \n",
" \n",
" \n",
" 257 \n",
" frames/tmp/tiktok-trending-subset6875872124968439046.mp4/output_000006.jpg \n",
" work_dir/crops/framestmptiktok-trending-subset6875872124968439046.mp4output_000006.jpg_433_946_561_946_561_976_433_976.jpg \n",
" JTikTok \n",
" \n",
" \n",
" 258 \n",
" frames/tmp/tiktok-trending-subset6875872124968439046.mp4/output_000006.jpg \n",
" work_dir/crops/framestmptiktok-trending-subset6875872124968439046.mp4output_000006.jpg_376_984_564_986_564_1008_376_1007.jpg \n",
" @timmytimmadome \n",
" \n",
" \n",
"
\n",
"
259 rows × 3 columns
\n",
"
"
],
"text/plain": [
" filename crop_filename label\n",
"0 frames/tmp/tiktok-trending-subset6875373441432816898.mp4/output_000002.jpg work_dir/crops/framestmptiktok-trending-subset6875373441432816898.mp4output_000002.jpg_436_953_456_953_456_965_436_965.jpg 1\n",
"1 frames/tmp/tiktok-trending-subset6875373441432816898.mp4/output_000002.jpg work_dir/crops/framestmptiktok-trending-subset6875373441432816898.mp4output_000002.jpg_466_945_560_945_560_975_466_975.jpg TikTok\n",
"2 frames/tmp/tiktok-trending-subset6875373441432816898.mp4/output_000002.jpg work_dir/crops/framestmptiktok-trending-subset6875373441432816898.mp4output_000002.jpg_472_983_562_986_562_1008_471_1006.jpg @caitlinjs\n",
"3 frames/tmp/tiktok-trending-subset6875323773755657474.mp4/output_000001.jpg work_dir/crops/framestmptiktok-trending-subset6875323773755657474.mp4output_000001.jpg_61_26_149_26_149_55_61_55.jpg TikTOK\n",
"4 frames/tmp/tiktok-trending-subset6875323773755657474.mp4/output_000001.jpg work_dir/crops/framestmptiktok-trending-subset6875323773755657474.mp4output_000001.jpg_12_66_146_66_146_87_12_87.jpg @marc.koolen\n",
".. ... ... ...\n",
"254 frames/tmp/tiktok-trending-subset6875872124968439046.mp4/output_000006.jpg work_dir/crops/framestmptiktok-trending-subset6875872124968439046.mp4output_000006.jpg_78_604_308_604_308_622_78_622.jpg haveadecentamountof\n",
"255 frames/tmp/tiktok-trending-subset6875872124968439046.mp4/output_000006.jpg work_dir/crops/framestmptiktok-trending-subset6875872124968439046.mp4output_000006.jpg_78_628_317_628_317_650_78_650.jpg bruisingandpainwithmy\n",
"256 frames/tmp/tiktok-trending-subset6875872124968439046.mp4/output_000006.jpg work_dir/crops/framestmptiktok-trending-subset6875872124968439046.mp4output_000006.jpg_77_654_168_654_168_672_77_672.jpg newlever\n",
"257 frames/tmp/tiktok-trending-subset6875872124968439046.mp4/output_000006.jpg work_dir/crops/framestmptiktok-trending-subset6875872124968439046.mp4output_000006.jpg_433_946_561_946_561_976_433_976.jpg JTikTok\n",
"258 frames/tmp/tiktok-trending-subset6875872124968439046.mp4/output_000006.jpg work_dir/crops/framestmptiktok-trending-subset6875872124968439046.mp4output_000006.jpg_376_984_564_986_564_1008_376_1007.jpg @timmytimmadome\n",
"\n",
"[259 rows x 3 columns]"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = stats[[\"filename\", \"crop_filename\", \"label\"]]\n",
"df"
]
},
{
"cell_type": "markdown",
"id": "b663aac6-7a0b-468e-ab87-835158abd589",
"metadata": {},
"source": [
"Let's use a handy package [itables](https://github.com/mwouts/itables) to visualize the images in table interactively."
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "bd5e597d-435a-428f-b504-974592449473",
"metadata": {},
"outputs": [],
"source": [
"!pip install -Uqq itables"
]
},
{
"cell_type": "markdown",
"id": "0b78ae02-b86a-4914-8f84-1a3086350344",
"metadata": {},
"source": [
"Now, we run the function below to convert the path into HTML tags so we can preview the images here."
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "943352ea-7c0e-4c12-b5e0-2fe34d719ac5",
"metadata": {},
"outputs": [
{
"data": {
"application/javascript": [
"/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */\n",
"!function(e,t){\"use strict\";\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error(\"jQuery requires a window with a document\");return t(e)}:t(e)}(\"undefined\"!=typeof window?window:this,function(C,e){\"use strict\";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return\"function\"==typeof e&&\"number\"!=typeof e.nodeType&&\"function\"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement(\"script\");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?n[o.call(e)]||\"object\":typeof e}var f=\"3.6.0\",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&\"length\"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&(\"array\"===n||0===t||\"number\"==typeof t&&0+~]|\"+M+\")\"+M+\"*\"),U=new RegExp(M+\"|>\"),X=new RegExp(F),V=new RegExp(\"^\"+I+\"$\"),G={ID:new RegExp(\"^#(\"+I+\")\"),CLASS:new RegExp(\"^\\\\.(\"+I+\")\"),TAG:new RegExp(\"^(\"+I+\"|[*])\"),ATTR:new RegExp(\"^\"+W),PSEUDO:new RegExp(\"^\"+F),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+M+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+M+\"*(?:([+-]|)\"+M+\"*(\\\\d+)|))\"+M+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+R+\")$\",\"i\"),needsContext:new RegExp(\"^\"+M+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+M+\"*((?:-\\\\d)?\\\\d*)\"+M+\"*\\\\)|)(?=[^-]|$)\",\"i\")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\\d$/i,K=/^[^{]+\\{\\s*\\[native \\w/,Z=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,ee=/[+~]/,te=new RegExp(\"\\\\\\\\[\\\\da-fA-F]{1,6}\"+M+\"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\",\"g\"),ne=function(e,t){var n=\"0x\"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,ie=function(e,t){return t?\"\\0\"===e?\"\\ufffd\":e.slice(0,-1)+\"\\\\\"+e.charCodeAt(e.length-1).toString(16)+\" \":\"\\\\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&\"fieldset\"===e.nodeName.toLowerCase()},{dir:\"parentNode\",next:\"legend\"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],\"string\"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+\" \"]&&(!v||!v.test(t))&&(1!==p||\"object\"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute(\"id\"))?s=s.replace(re,ie):e.setAttribute(\"id\",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?\"#\"+s:\":scope\")+\" \"+xe(l[o]);c=l.join(\",\")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute(\"id\")}}}return g(t.replace($,\"$1\"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+\" \")>b.cacheLength&&delete e[r.shift()],e[t+\" \"]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement(\"fieldset\");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split(\"|\"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return\"input\"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return(\"input\"===t||\"button\"===t)&&e.type===n}}function ge(t){return function(e){return\"form\"in e?e.parentNode&&!1===e.disabled?\"label\"in e?\"label\"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:\"label\"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&\"undefined\"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||\"HTML\")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener(\"unload\",oe,!1):n.attachEvent&&n.attachEvent(\"onunload\",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement(\"div\")),\"undefined\"!=typeof e.querySelectorAll&&!e.querySelectorAll(\":scope fieldset div\").length}),d.attributes=ce(function(e){return e.className=\"i\",!e.getAttribute(\"className\")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment(\"\")),!e.getElementsByTagName(\"*\").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute(\"id\")===t}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t=\"undefined\"!=typeof e.getAttributeNode&&e.getAttributeNode(\"id\");return t&&t.value===n}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return\"undefined\"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if(\"*\"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if(\"undefined\"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML=\" \",e.querySelectorAll(\"[msallowcapture^='']\").length&&v.push(\"[*^$]=\"+M+\"*(?:''|\\\"\\\")\"),e.querySelectorAll(\"[selected]\").length||v.push(\"\\\\[\"+M+\"*(?:value|\"+R+\")\"),e.querySelectorAll(\"[id~=\"+S+\"-]\").length||v.push(\"~=\"),(t=C.createElement(\"input\")).setAttribute(\"name\",\"\"),e.appendChild(t),e.querySelectorAll(\"[name='']\").length||v.push(\"\\\\[\"+M+\"*name\"+M+\"*=\"+M+\"*(?:''|\\\"\\\")\"),e.querySelectorAll(\":checked\").length||v.push(\":checked\"),e.querySelectorAll(\"a#\"+S+\"+*\").length||v.push(\".#.+[+~]\"),e.querySelectorAll(\"\\\\\\f\"),v.push(\"[\\\\r\\\\n\\\\f]\")}),ce(function(e){e.innerHTML=\" \";var t=C.createElement(\"input\");t.setAttribute(\"type\",\"hidden\"),e.appendChild(t).setAttribute(\"name\",\"D\"),e.querySelectorAll(\"[name=d]\").length&&v.push(\"name\"+M+\"*[*^$|!~]?=\"),2!==e.querySelectorAll(\":enabled\").length&&v.push(\":enabled\",\":disabled\"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(\":disabled\").length&&v.push(\":enabled\",\":disabled\"),e.querySelectorAll(\"*,:x\"),v.push(\",.*:\")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,\"*\"),c.call(e,\"[s!='']:x\"),s.push(\"!=\",F)}),v=v.length&&new RegExp(v.join(\"|\")),s=s.length&&new RegExp(s.join(\"|\")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+\" \"]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0\":{dir:\"parentNode\",first:!0},\" \":{dir:\"parentNode\"},\"+\":{dir:\"previousSibling\",first:!0},\"~\":{dir:\"previousSibling\"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||\"\").replace(te,ne),\"~=\"===e[2]&&(e[3]=\" \"+e[3]+\" \"),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),\"nth\"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*(\"even\"===e[3]||\"odd\"===e[3])),e[5]=+(e[7]+e[8]||\"odd\"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||\"\":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(\")\",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return\"*\"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+\" \"];return t||(t=new RegExp(\"(^|\"+M+\")\"+e+\"(\"+M+\"|$)\"))&&m(e,function(e){return t.test(\"string\"==typeof e.className&&e.className||\"undefined\"!=typeof e.getAttribute&&e.getAttribute(\"class\")||\"\")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?\"!=\"===r:!r||(t+=\"\",\"=\"===r?t===i:\"!=\"===r?t!==i:\"^=\"===r?i&&0===t.indexOf(i):\"*=\"===r?i&&-1\",\"#\"===e.firstChild.getAttribute(\"href\")})||fe(\"type|href|height|width\",function(e,t,n){if(!n)return e.getAttribute(t,\"type\"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML=\" \",e.firstChild.setAttribute(\"value\",\"\"),\"\"===e.firstChild.getAttribute(\"value\")})||fe(\"value\",function(e,t,n){if(!n&&\"input\"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute(\"disabled\")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[\":\"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):\"string\"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,\"string\"==typeof e){if(!(r=\"<\"===e[0]&&\">\"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\\x20\\t\\r\\n\\f]*)/i,he=/^$|^module$|\\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement(\"div\")),(fe=E.createElement(\"input\")).setAttribute(\"type\",\"radio\"),fe.setAttribute(\"checked\",\"checked\"),fe.setAttribute(\"name\",\"t\"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML=\"\",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML=\" \",y.option=!!ce.lastChild;var ge={thead:[1,\"\"],col:[2,\"\"],tr:[2,\"\"],td:[3,\"\"],_default:[0,\"\",\"\"]};function ve(e,t){var n;return n=\"undefined\"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||\"*\"):\"undefined\"!=typeof e.querySelectorAll?e.querySelectorAll(t||\"*\"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n\",\"\"]);var me=/<|?\\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\\s*$/g;function je(e,t){return A(e,\"table\")&&A(11!==t.nodeType?t:t.firstChild,\"tr\")&&S(e).children(\"tbody\")[0]||e}function De(e){return e.type=(null!==e.getAttribute(\"type\"))+\"/\"+e.type,e}function qe(e){return\"true/\"===(e.type||\"\").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute(\"type\"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,\"handle events\"),s)for(n=0,r=s[i].length;n\").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on(\"load error\",i=function(e){r.remove(),i=null,e&&t(\"error\"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\\?(?=&|$)|\\?\\?/;S.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){var e=zt.pop()||S.expando+\"_\"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter(\"json jsonp\",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?\"url\":\"string\"==typeof e.data&&0===(e.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&Ut.test(e.data)&&\"data\");if(a||\"jsonp\"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,\"$1\"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?\"&\":\"?\")+e.jsonp+\"=\"+r),e.converters[\"script json\"]=function(){return o||S.error(r+\" was not called\"),o[0]},e.dataTypes[0]=\"json\",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),\"script\"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument(\"\").body).innerHTML=\"\",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return\"string\"!=typeof e?[]:(\"boolean\"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument(\"\")).createElement(\"base\")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(\" \");return-1\").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,\"position\"),c=S(e),f={};\"static\"===l&&(e.style.position=\"relative\"),s=c.offset(),o=S.css(e,\"top\"),u=S.css(e,\"left\"),(\"absolute\"===l||\"fixed\"===l)&&-1<(o+u).indexOf(\"auto\")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),\"using\"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if(\"fixed\"===S.css(r,\"position\"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&\"static\"===S.css(e,\"position\"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,\"borderTopWidth\",!0),i.left+=S.css(e,\"borderLeftWidth\",!0))}return{top:t.top-i.top-S.css(r,\"marginTop\",!0),left:t.left-i.left-S.css(r,\"marginLeft\",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&\"static\"===S.css(e,\"position\"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:\"pageXOffset\",scrollTop:\"pageYOffset\"},function(t,i){var o=\"pageYOffset\"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each([\"top\",\"left\"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+\"px\":t})}),S.each({Height:\"height\",Width:\"width\"},function(a,s){S.each({padding:\"inner\"+a,content:s,\"\":\"outer\"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||\"boolean\"!=typeof e),i=r||(!0===e||!0===t?\"margin\":\"border\");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf(\"outer\")?e[\"inner\"+a]:e.document.documentElement[\"client\"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body[\"scroll\"+a],r[\"scroll\"+a],e.body[\"offset\"+a],r[\"offset\"+a],r[\"client\"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each([\"ajaxStart\",\"ajaxStop\",\"ajaxComplete\",\"ajaxError\",\"ajaxSuccess\",\"ajaxSend\"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,\"**\"):this.off(t,e||\"**\",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each(\"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu\".split(\" \"),function(e,n){S.fn[n]=function(e,t){return 0"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"\n",
"\n"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
""
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import base64\n",
"from itables import init_notebook_mode, show\n",
"init_notebook_mode(all_interactive=True)\n",
"\n",
"# Convert the image file paths into HTML tag for preview\n",
"def to_img_tag(path):\n",
" if isinstance(path, str):\n",
" with open(path, 'rb') as f:\n",
" image_data = f.read()\n",
" base64_image = base64.b64encode(image_data).decode('utf-8')\n",
" return ' '\n",
" else:\n",
" return path\n",
"\n",
"df[\"filename_preview\"] = df[\"filename\"].apply(to_img_tag)\n",
"df[\"crop_filename_preview\"] = df[\"crop_filename\"].apply(to_img_tag)\n",
"\n",
"df = df.loc[:,[\"filename\",\"filename_preview\", \"crop_filename\", \"crop_filename_preview\", \"label\"],]"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "838e8246-6f03-4c20-8e5f-ff36b21a3e11",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" filename \n",
" filename_preview \n",
" crop_filename \n",
" crop_filename_preview \n",
" label \n",
" \n",
" Loading... (need help ?)
\n",
"