{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Generate a balanced session from a lapseless session\n", "**Use case:** Given a session with a high number of motion images, but an insufficient number of lapse images (i.e. only daily lapse images)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The autoreload extension is already loaded. To reload it, use:\n", " %reload_ext autoreload\n", "Found 32 sessions\n", "Session 'Fox_03' at folder: /home/AMMOD_data/camera_traps/BayerWald/Vielkadaver-Projekt/VIELAAS_Spring_Session03-VIELAAS_Fox_03\n", "Loaded scans.\n" ] } ], "source": [ "%load_ext autoreload\n", "%autoreload 2\n", "\n", "import shutil\n", "import os\n", "from tqdm import tqdm\n", "from py.Dataset import Dataset\n", "from py.Session import Session, MotionImage, LapseImage\n", "from py.Labels import LABELS\n", "\n", "DIR = '/home/AMMOD_data/camera_traps/BayerWald/Vielkadaver-Projekt/'\n", "TARGET_DIR = \"./GeneratedSessions_NoBackup/\"\n", "\n", "ds = Dataset(DIR)\n", "target_session = ds.create_session(\"fox_03\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will pick capture sets where every image is labeled as normal, until we have selected at least pick_for_lapse images." ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Picking at least 1200 of 3702 images\n", "[2067, 2068, 2069, 2070, 2066, 2059, 2060, 2058, 2056, 2057, 2053, 2054, 2055, 2051, 2052, 2046, 2050, 2047, 2049, 2048, 2063, 2064, 2062, 2065, 2061, 542, 544, 543, 545, 541, 532, 531, 533, 534, 535, 540, 536, 537, 539, 538, 529, 527, 528, 526, 530, 5359, 5356, 5357, 5358, 5360, 5348, 5349, 5346, 5350, 5347, 5353, 5354, 5355, 5352, 5351, 5333, 5335, 5332, 5331, 5334, 5365, 5362, 5361, 5364, 5363, 5329, 5326, 5327, 5328, 5330, 5342, 5345, 5344, 5341, 5343, 5339, 5338, 5340, 5336, 5337, 4826, 4829, 4828, 4827, 4830, 4809, 4807, 4810, 4808, 4806, 4817, 4816, 4820, 4819, 4818, 4832, 4835, 4833, 4834, 4831, 4825, 4822, 4824, 4821, 4823, 4811, 4813, 4815, 4814, 4812, 227, 230, 226, 228, 229, 253, 251, 254, 252, 255, 221, 223, 225, 222, 224, 211, 215, 212, 214, 213, 205, 202, 203, 201, 204, 260, 256, 257, 259, 258, 236, 240, 238, 239, 237, 248, 247, 250, 249, 246, 208, 207, 210, 206, 209, 233, 235, 231, 234, 232, 220, 217, 216, 218, 219, 244, 245, 243, 242, 241, 393, 392, 395, 394, 391, 385, 384, 383, 382, 381, 386, 387, 388, 390, 389, 415, 413, 414, 412, 411, 417, 419, 420, 416, 418, 372, 371, 373, 375, 374, 379, 377, 380, 376, 378, 404, 401, 403, 402, 405, 357, 359, 360, 358, 356, 422, 424, 421, 425, 423, 370, 368, 369, 367, 366, 406, 410, 409, 407, 408, 399, 396, 398, 397, 400, 363, 365, 362, 364, 361, 5147, 5150, 5149, 5148, 5146, 5137, 5140, 5136, 5138, 5139, 5169, 5167, 5166, 5170, 5168, 5143, 5141, 5142, 5144, 5145, 5179, 5177, 5180, 5176, 5178, 5161, 5165, 5164, 5162, 5163, 5153, 5155, 5152, 5154, 5151, 5159, 5158, 5157, 5160, 5156, 5173, 5172, 5175, 5174, 5171, 5131, 5135, 5134, 5133, 5132, 4989, 4987, 4988, 4986, 4990, 4980, 4976, 4978, 4979, 4977, 5009, 5008, 5010, 5007, 5006, 5022, 5021, 5024, 5025, 5023, 4983, 4985, 4981, 4984, 4982, 4973, 4974, 4971, 4972, 4975, 4993, 4991, 4994, 4995, 4992, 5014, 5012, 5011, 5015, 5013, 5002, 5005, 5004, 5001, 5003, 5018, 5017, 5016, 5019, 5020, 4996, 4998, 4997, 5000, 4999, 1378, 1379, 1376, 1380, 1377, 1368, 1366, 1367, 1370, 1369, 1382, 1384, 1381, 1385, 1383, 1365, 1364, 1362, 1363, 1361, 1374, 1373, 1375, 1372, 1371, 1386, 1388, 1387, 1390, 1389, 1241, 1245, 1242, 1243, 1244, 1259, 1256, 1260, 1258, 1257, 1254, 1252, 1255, 1253, 1251, 1230, 1227, 1226, 1228, 1229, 1263, 1262, 1264, 1261, 1265, 1249, 1246, 1250, 1247, 1248, 1233, 1235, 1231, 1234, 1232, 1239, 1236, 1240, 1237, 1238, 1270, 1269, 1268, 1266, 1267, 1221, 1222, 1224, 1223, 1225, 1485, 1482, 1481, 1484, 1483, 5098, 5099, 5097, 5100, 5096, 5069, 5066, 5070, 5068, 5067, 5101, 5104, 5102, 5103, 5105, 5129, 5128, 5127, 5130, 5126, 5079, 5076, 5077, 5080, 5078, 5122, 5123, 5124, 5125, 5121, 5084, 5081, 5082, 5083, 5085, 5091, 5095, 5094, 5093, 5092, 5063, 5064, 5062, 5065, 5061, 5116, 5120, 5118, 5119, 5117, 5087, 5089, 5088, 5090, 5086, 5107, 5110, 5108, 5109, 5106, 5073, 5075, 5071, 5072, 5074, 5112, 5114, 5113, 5111, 5115, 4398, 4399, 4396, 4397, 4400, 4405, 4404, 4403, 4401, 4402, 4406, 4407, 4408, 4410, 4409, 643, 644, 641, 642, 645, 650, 648, 647, 649, 646, 661, 662, 663, 664, 665, 639, 636, 637, 638, 640, 653, 655, 651, 654, 652, 674, 675, 671, 673, 672, 660, 658, 659, 656, 657, 669, 667, 666, 668, 670, 131, 135, 132, 134, 133, 137, 139, 140, 136, 138, 143, 145, 142, 141, 144, 148, 149, 150, 146, 147, 123, 122, 124, 125, 121, 126, 127, 130, 128, 129, 151, 154, 153, 152, 155, 157, 160, 158, 156, 159, 4438, 4439, 4437, 4440, 4436, 4448, 4449, 4447, 4446, 4450, 4432, 4435, 4433, 4434, 4431, 4443, 4441, 4444, 4442, 4445, 1123, 1125, 1122, 1121, 1124, 1128, 1130, 1126, 1127, 1129, 1118, 1116, 1117, 1119, 1120, 1138, 1139, 1140, 1136, 1137, 1134, 1132, 1133, 1131, 1135, 1111, 1113, 1115, 1114, 1112, 1110, 1107, 1108, 1106, 1109, 849, 850, 846, 848, 847, 859, 857, 856, 860, 858, 843, 842, 844, 841, 845, 838, 839, 837, 840, 836, 855, 852, 853, 851, 854, 5060, 5057, 5056, 5058, 5059, 5045, 5043, 5044, 5041, 5042, 5052, 5055, 5051, 5053, 5054, 5038, 5040, 5036, 5039, 5037, 5050, 5047, 5046, 5048, 5049, 1447, 1450, 1448, 1446, 1449, 1438, 1440, 1439, 1436, 1437, 1443, 1442, 1444, 1441, 1445, 4902, 4904, 4905, 4901, 4903, 4912, 4913, 4911, 4915, 4914, 4900, 4896, 4897, 4898, 4899, 4908, 4910, 4906, 4909, 4907, 4230, 4226, 4228, 4227, 4229, 4225, 4223, 4221, 4224, 4222, 4232, 4235, 4233, 4231, 4234, 4729, 4728, 4726, 4727, 4730, 4745, 4742, 4741, 4743, 4744, 4735, 4731, 4733, 4732, 4734, 4722, 4725, 4721, 4723, 4724, 4739, 4737, 4738, 4740, 4736, 4119, 4117, 4120, 4116, 4118, 4128, 4126, 4129, 4130, 4127, 4110, 4109, 4106, 4108, 4107, 4134, 4135, 4131, 4133, 4132, 4121, 4122, 4124, 4123, 4125, 4113, 4114, 4111, 4112, 4115, 2225, 2224, 2223, 2222, 2221, 2226, 2230, 2229, 2227, 2228, 4651, 4654, 4653, 4652, 4655, 1509, 1510, 1507, 1506, 1508, 1504, 1503, 1501, 1502, 1505, 1522, 1521, 1523, 1525, 1524, 1514, 1515, 1513, 1511, 1512, 1520, 1517, 1519, 1518, 1516, 1497, 1496, 1500, 1498, 1499, 346, 348, 349, 350, 347, 351, 355, 353, 354, 352, 344, 345, 342, 343, 341, 930, 928, 926, 929, 927, 925, 922, 924, 923, 921, 880, 879, 877, 876, 878, 886, 889, 888, 890, 887, 891, 892, 894, 895, 893, 881, 885, 884, 882, 883, 114, 115, 113, 112, 111, 101, 102, 104, 103, 105, 110, 107, 109, 108, 106, 117, 119, 120, 116, 118, 916, 920, 919, 917, 918, 902, 904, 901, 903, 905, 900, 896, 897, 898, 899, 914, 915, 911, 913, 912, 906, 910, 908, 907, 909, 1894, 1895, 1892, 1891, 1893, 1896, 1899, 1897, 1898, 1900, 1909, 1907, 1906, 1910, 1908, 1914, 1912, 1913, 1915, 1911, 1889, 1888, 1890, 1886, 1887, 1903, 1904, 1905, 1902, 1901, 4194, 4193, 4195, 4192, 4191, 4197, 4199, 4198, 4200, 4196, 4208, 4210, 4209, 4207, 4206, 4187, 4188, 4189, 4186, 4190, 4203, 4201, 4204, 4202, 4205, 4185, 4182, 4184, 4181, 4183, 4140, 4137, 4138, 4136, 4139, 4145, 4144, 4142, 4141, 4143, 2082, 2085, 2084, 2083, 2081, 2091, 2094, 2092, 2093, 2095, 2080, 2077, 2076, 2078, 2079, 2088, 2087, 2086, 2089, 2090, 1637, 1639, 1636, 1638, 1640, 1658, 1660, 1657, 1659, 1656, 1653, 1652, 1654, 1655, 1651, 1632, 1631, 1634, 1633, 1635, 1661, 1662, 1665, 1664, 1663, 1625, 1621, 1624, 1623, 1622, 1667, 1666, 1668, 1670, 1669, 1629, 1626, 1628, 1630, 1627, 1642, 1645, 1644, 1641, 1643, 1650, 1646, 1647, 1648, 1649, 1869, 1870, 1868, 1866, 1867, 1882, 1881, 1884, 1883, 1885, 1859, 1860, 1858, 1857, 1856, 1872, 1874, 1875, 1871, 1873, 1865, 1862, 1863, 1861, 1864, 1877, 1879, 1880, 1876, 1878, 1680, 1679, 1676, 1677, 1678, 1681, 1684, 1685, 1683, 1682, 1672, 1671, 1675, 1673, 1674, 682, 685, 683, 681, 684, 677, 679, 678, 680, 676, 4697, 4698, 4700, 4699, 4696, 1455, 1453, 1452, 1454, 1451, 864, 862, 863, 865, 861, 4797, 4800, 4796, 4799, 4798, 4777, 4776, 4778, 4780, 4779, 4801, 4805, 4802, 4804, 4803, 4786, 4787, 4789, 4790, 4788, 4791, 4793, 4792, 4794, 4795, 4771, 4774, 4772, 4775, 4773, 4782, 4781, 4785, 4783, 4784, 5200, 5198, 5196, 5197, 5199, 5205, 5204, 5201, 5203, 5202, 5193, 5191, 5192, 5194, 5195, 5210, 5207, 5209, 5206, 5208]\n" ] } ], "source": [ "pick_for_lapse = 1200\n", "\n", "normal_list = LABELS[target_session.name][\"normal\"]\n", "print(f\"Picking at least {pick_for_lapse} of {len(normal_list)} images\")\n", "assert pick_for_lapse < len(normal_list)\n", "\n", "lapse_img_nrs = []\n", "while len(lapse_img_nrs) < pick_for_lapse:\n", " img_set = target_session.get_random_motion_image_set()\n", " set_nrs = []\n", " for img in img_set:\n", " img_nr = int(img.filename[-9:-4])\n", " if img_nr not in normal_list:\n", " # at least one image in set is anomalous, discard whole set\n", " set_nrs = []\n", " break\n", " elif img_nr not in lapse_img_nrs:\n", " set_nrs.append(img_nr)\n", " # whole set contains empty images, so add the whole set\n", " lapse_img_nrs.extend(set_nrs)\n", "print(lapse_img_nrs)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1210" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(lapse_img_nrs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will now copy the Motion images to either Lapse or Motion, depending on whether they are in lapse_img_nrs." ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 5495/5495 [03:08<00:00, 29.08it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Copied 1210 files to Lapse, 4285 to Motion\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "# copy motion images to Motion and Lapse folders\n", "motion_folder = os.path.join(TARGET_DIR, os.path.basename(target_session.folder), \"Motion\")\n", "lapse_folder = os.path.join(TARGET_DIR, os.path.basename(target_session.folder), \"Lapse\")\n", "os.makedirs(motion_folder, exist_ok=True)\n", "os.makedirs(lapse_folder, exist_ok=True)\n", "lapse = 0\n", "motion = 0\n", "for motion_img in tqdm(list(target_session.generate_motion_images())):\n", " img_nr = int(motion_img.filename[-9:-4])\n", " if img_nr in lapse_img_nrs:\n", " shutil.copy(motion_img.get_full_path(), lapse_folder)\n", " lapse += 1\n", " else:\n", " shutil.copy(motion_img.get_full_path(), motion_folder)\n", " motion += 1\n", "print(f\"Copied {lapse} files to Lapse, {motion} to Motion\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The full folder is copied without changes." ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'./GeneratedSessions_NoBackup/VIELAAS_Spring_Session03-VIELAAS_Fox_03/Full'" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# copy full folder as-is\n", "full_folder = os.path.join(TARGET_DIR, os.path.basename(target_session.folder), \"Full\")\n", "shutil.copytree(target_session.get_full_folder(), full_folder)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Copyright © 2023 Felix Kleinsteuber and Computer Vision Group, Friedrich Schiller University Jena" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3.10.4 ('pytorch-gpu')", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.4" }, "orig_nbformat": 4, "vscode": { "interpreter": { "hash": "17cd5c528a3345b75540c61f907eece919c031d57a2ca1e5653325af249173c9" } } }, "nbformat": 4, "nbformat_minor": 2 }