diff --git a/crop/SimData.ipynb b/crop/SimData.ipynb index 25d8be86fc3e1ed7a98de283fb136c3019f73424..c475a8013d724c6a2cd2fb9558d8e144741063a1 100644 --- a/crop/SimData.ipynb +++ b/crop/SimData.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 35, + "execution_count": 57, "metadata": {}, "outputs": [], "source": [ @@ -12,16 +12,21 @@ "import pandas as pd\n", "import numpy as np\n", "from torchvision.utils import save_image\n", - "import torchvision.transforms.functional as fn" + "import torchvision.transforms.functional as fn\n", + "import torchvision.transforms as transforms\n", + "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 58, "metadata": {}, "outputs": [], "source": [ - "# TODO: overlap?\n", + "# generates new dataset by pasting beetles and non-beetles in the same picture. \n", + "#returns array of new images and coordinates\n", + "#TODO: make sure that the beetles and non-beetles don't overlap with each other\n", + "\n", "def generate_data(bg: list[Image], beetle_set: list[Image], num_beetles_arr: list[int]):\n", " set_size = len(beetle_set)\n", " set_bg_size = len(bg)\n", @@ -39,14 +44,18 @@ " beetle_width, beetle_height = beetle_img.size\n", "\n", " # get random x,y coords to paste beetle\n", - " x = randint(0, width - beetle_width)\n", - " y = randint(0, height - beetle_height)\n", + " x = np.random.randint(0, width - beetle_width)\n", + " y = np.random.randint(0, height - beetle_height)\n", "\n", " # get random beetle rotation\n", - " angle = randint(0, 359)\n", + " angle = np.random.randint(0, 360)\n", " beetle_img = beetle_img.rotate(angle, resample=Image.BICUBIC)\n", "\n", " bg_temp.paste(beetle_img, box=(x,y), mask=beetle_img)\n", + " \n", + " #centers x and y for YOLOv5 PyTorch label\n", + " x += beetle_width/2\n", + " y += beetle_height/2\n", " beetle_coords.append((beetle_id, x, y, beetle_width, beetle_height, angle))\n", " sim_arr.append(bg_temp)\n", " coords_arr.append(beetle_coords)\n", @@ -56,10 +65,11 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 59, "metadata": {}, "outputs": [], "source": [ + "#???\n", "def find_coeffs(source_coords, target_coords):\n", " matrix = []\n", " for s, t in zip(source_coords, target_coords):\n", @@ -73,11 +83,11 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 60, "metadata": {}, "outputs": [], "source": [ - "bg = Image.open(\"bg.png\")\n", + "bg = Image.open(\"imgs/bg.png\")\n", "beetles = []\n", "for file in glob.glob(r\"/raid/projects/akhot2/group-01-phys371-sp2023/crop/beetles/*\"):\n", " b0 = Image.open(file)\n", @@ -91,58 +101,1298 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 61, "metadata": {}, "outputs": [], "source": [ - "beetle_counts = np.random.randint(0, 6, size=1)\n", + "beetle_counts = np.random.randint(0, 6, size=1250)\n", "sim_img_arr, coords_arr = generate_data([bg_flat], beetles, beetle_counts)" ] }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 62, "metadata": {}, "outputs": [], "source": [ + "#exports images and coordinates in YOLOv5 PyTorch format\n", "def export(img_arr, coords_arr):\n", - " transform = transforms.Compose([transforms.ToTensor()])\n", " s = \"\"\n", " image_set = \"train\"\n", " change = len(img_arr)*0.8\n", " for i in range(len(img_arr)):\n", " s = \"\"\n", + " img = img_arr[i]\n", " for coord in coords_arr[i]:\n", " c, x, y, w, h, a = coord\n", - " img = img_arr[i]\n", - " \n", " s += f\"{0} {x/img.size[0]} {y/img.size[1]} {w/img.size[0]} {h/img.size[1]}\\n\"\n", + " print(i)\n", " if i > change:\n", " image_set = \"test\"\n", " with open(\"data/\" +image_set+ f\"/labels/sim{i}.txt\", \"w\") as f:\n", " f.write(s)\n", - " save_image(img, \"data/\" +image_set+ f\"/images/sim{i}.png\")" + " img.save(\"data/\" +image_set+ f\"/images/sim{i}.png\")" ] }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 63, "metadata": {}, "outputs": [ { - "ename": "TypeError", - "evalue": "tensor or list of tensors expected, got <class 'PIL.Image.Image'>", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "Input \u001b[0;32mIn [51]\u001b[0m, in \u001b[0;36m<cell line: 1>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mexport\u001b[49m\u001b[43m(\u001b[49m\u001b[43msim_img_arr\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcoords_arr\u001b[49m\u001b[43m)\u001b[49m\n", - "Input \u001b[0;32mIn [50]\u001b[0m, in \u001b[0;36mexport\u001b[0;34m(img_arr, coords_arr)\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mopen\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdata/\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m+\u001b[39mimage_set\u001b[38;5;241m+\u001b[39m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m/labels/sim\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mi\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m.txt\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mw\u001b[39m\u001b[38;5;124m\"\u001b[39m) \u001b[38;5;28;01mas\u001b[39;00m f:\n\u001b[1;32m 14\u001b[0m f\u001b[38;5;241m.\u001b[39mwrite(s)\n\u001b[0;32m---> 15\u001b[0m \u001b[43msave_image\u001b[49m\u001b[43m(\u001b[49m\u001b[43mimg\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mdata/\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[43mimage_set\u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;124;43mf\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m/images/sim\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43mi\u001b[49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m.png\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m/raid/projects/akhot2/conda/envs/akhot2/lib/python3.9/site-packages/torch/autograd/grad_mode.py:27\u001b[0m, in \u001b[0;36m_DecoratorContextManager.__call__.<locals>.decorate_context\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 24\u001b[0m \u001b[38;5;129m@functools\u001b[39m\u001b[38;5;241m.\u001b[39mwraps(func)\n\u001b[1;32m 25\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mdecorate_context\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 26\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mclone():\n\u001b[0;32m---> 27\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m/raid/projects/akhot2/conda/envs/akhot2/lib/python3.9/site-packages/torchvision/utils.py:152\u001b[0m, in \u001b[0;36msave_image\u001b[0;34m(tensor, fp, format, **kwargs)\u001b[0m\n\u001b[1;32m 150\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m torch\u001b[38;5;241m.\u001b[39mjit\u001b[38;5;241m.\u001b[39mis_scripting() \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m torch\u001b[38;5;241m.\u001b[39mjit\u001b[38;5;241m.\u001b[39mis_tracing():\n\u001b[1;32m 151\u001b[0m _log_api_usage_once(save_image)\n\u001b[0;32m--> 152\u001b[0m grid \u001b[38;5;241m=\u001b[39m \u001b[43mmake_grid\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtensor\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 153\u001b[0m \u001b[38;5;66;03m# Add 0.5 after unnormalizing to [0, 255] to round to nearest integer\u001b[39;00m\n\u001b[1;32m 154\u001b[0m ndarr \u001b[38;5;241m=\u001b[39m grid\u001b[38;5;241m.\u001b[39mmul(\u001b[38;5;241m255\u001b[39m)\u001b[38;5;241m.\u001b[39madd_(\u001b[38;5;241m0.5\u001b[39m)\u001b[38;5;241m.\u001b[39mclamp_(\u001b[38;5;241m0\u001b[39m, \u001b[38;5;241m255\u001b[39m)\u001b[38;5;241m.\u001b[39mpermute(\u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m2\u001b[39m, \u001b[38;5;241m0\u001b[39m)\u001b[38;5;241m.\u001b[39mto(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcpu\u001b[39m\u001b[38;5;124m\"\u001b[39m, torch\u001b[38;5;241m.\u001b[39muint8)\u001b[38;5;241m.\u001b[39mnumpy()\n", - "File \u001b[0;32m/raid/projects/akhot2/conda/envs/akhot2/lib/python3.9/site-packages/torch/autograd/grad_mode.py:27\u001b[0m, in \u001b[0;36m_DecoratorContextManager.__call__.<locals>.decorate_context\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 24\u001b[0m \u001b[38;5;129m@functools\u001b[39m\u001b[38;5;241m.\u001b[39mwraps(func)\n\u001b[1;32m 25\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mdecorate_context\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 26\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mclone():\n\u001b[0;32m---> 27\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m/raid/projects/akhot2/conda/envs/akhot2/lib/python3.9/site-packages/torchvision/utils.py:60\u001b[0m, in \u001b[0;36mmake_grid\u001b[0;34m(tensor, nrow, padding, normalize, value_range, scale_each, pad_value, **kwargs)\u001b[0m\n\u001b[1;32m 58\u001b[0m _log_api_usage_once(make_grid)\n\u001b[1;32m 59\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (torch\u001b[38;5;241m.\u001b[39mis_tensor(tensor) \u001b[38;5;129;01mor\u001b[39;00m (\u001b[38;5;28misinstance\u001b[39m(tensor, \u001b[38;5;28mlist\u001b[39m) \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mall\u001b[39m(torch\u001b[38;5;241m.\u001b[39mis_tensor(t) \u001b[38;5;28;01mfor\u001b[39;00m t \u001b[38;5;129;01min\u001b[39;00m tensor))):\n\u001b[0;32m---> 60\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtensor or list of tensors expected, got \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mtype\u001b[39m(tensor)\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 62\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrange\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01min\u001b[39;00m kwargs\u001b[38;5;241m.\u001b[39mkeys():\n\u001b[1;32m 63\u001b[0m warnings\u001b[38;5;241m.\u001b[39mwarn(\n\u001b[1;32m 64\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mThe parameter \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrange\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m is deprecated since 0.12 and will be removed in 0.14. \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 65\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPlease use \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mvalue_range\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m instead.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 66\u001b[0m )\n", - "\u001b[0;31mTypeError\u001b[0m: tensor or list of tensors expected, got <class 'PIL.Image.Image'>" + "name": "stdout", + "output_type": "stream", + "text": [ + "0\n", + "1\n", + "2\n", + "3\n", + "4\n", + "5\n", + "6\n", + "7\n", + "8\n", + "9\n", + "10\n", + "11\n", + "12\n", + "13\n", + "14\n", + "15\n", + "16\n", + "17\n", + "18\n", + "19\n", + "20\n", + "21\n", + "22\n", + "23\n", + "24\n", + "25\n", + "26\n", + "27\n", + "28\n", + "29\n", + "30\n", + "31\n", + "32\n", + "33\n", + "34\n", + "35\n", + "36\n", + "37\n", + "38\n", + "39\n", + "40\n", + "41\n", + "42\n", + "43\n", + "44\n", + "45\n", + "46\n", + "47\n", + "48\n", + "49\n", + "50\n", + "51\n", + "52\n", + "53\n", + "54\n", + "55\n", + "56\n", + "57\n", + "58\n", + "59\n", + "60\n", + "61\n", + "62\n", + "63\n", + "64\n", + "65\n", + "66\n", + "67\n", + "68\n", + "69\n", + "70\n", + "71\n", + "72\n", + "73\n", + "74\n", + "75\n", + "76\n", + "77\n", + "78\n", + "79\n", + "80\n", + "81\n", + "82\n", + "83\n", + "84\n", + "85\n", + "86\n", + "87\n", + "88\n", + "89\n", + "90\n", + "91\n", + "92\n", + "93\n", + "94\n", + "95\n", + "96\n", + "97\n", + "98\n", + "99\n", + "100\n", + "101\n", + "102\n", + "103\n", + "104\n", + "105\n", + "106\n", + "107\n", + "108\n", + "109\n", + "110\n", + "111\n", + "112\n", + "113\n", + "114\n", + "115\n", + "116\n", + "117\n", + "118\n", + "119\n", + "120\n", + "121\n", + "122\n", + "123\n", + "124\n", + "125\n", + "126\n", + "127\n", + "128\n", + "129\n", + "130\n", + "131\n", + "132\n", + "133\n", + "134\n", + "135\n", + "136\n", + "137\n", + "138\n", + "139\n", + "140\n", + "141\n", + "142\n", + "143\n", + "144\n", + "145\n", + "146\n", + "147\n", + "148\n", + "149\n", + "150\n", + "151\n", + "152\n", + "153\n", + "154\n", + "155\n", + "156\n", + "157\n", + "158\n", + "159\n", + "160\n", + "161\n", + "162\n", + "163\n", + "164\n", + "165\n", + "166\n", + "167\n", + "168\n", + "169\n", + "170\n", + "171\n", + "172\n", + "173\n", + "174\n", + "175\n", + "176\n", + "177\n", + "178\n", + "179\n", + "180\n", + "181\n", + "182\n", + "183\n", + "184\n", + "185\n", + "186\n", + "187\n", + "188\n", + "189\n", + "190\n", + "191\n", + "192\n", + "193\n", + "194\n", + "195\n", + "196\n", + "197\n", + "198\n", + "199\n", + "200\n", + "201\n", + "202\n", + "203\n", + "204\n", + "205\n", + "206\n", + "207\n", + "208\n", + "209\n", + "210\n", + "211\n", + "212\n", + "213\n", + "214\n", + "215\n", + "216\n", + "217\n", + "218\n", + "219\n", + "220\n", + "221\n", + "222\n", + "223\n", + "224\n", + "225\n", + "226\n", + "227\n", + "228\n", + "229\n", + "230\n", + "231\n", + "232\n", + "233\n", + "234\n", + "235\n", + "236\n", + "237\n", + "238\n", + "239\n", + "240\n", + "241\n", + "242\n", + "243\n", + "244\n", + "245\n", + "246\n", + "247\n", + "248\n", + "249\n", + "250\n", + "251\n", + "252\n", + "253\n", + "254\n", + "255\n", + "256\n", + "257\n", + "258\n", + "259\n", + "260\n", + "261\n", + "262\n", + "263\n", + "264\n", + "265\n", + "266\n", + "267\n", + "268\n", + "269\n", + "270\n", + "271\n", + "272\n", + "273\n", + "274\n", + "275\n", + "276\n", + "277\n", + "278\n", + "279\n", + "280\n", + "281\n", + "282\n", + "283\n", + "284\n", + "285\n", + "286\n", + "287\n", + "288\n", + "289\n", + "290\n", + "291\n", + "292\n", + "293\n", + "294\n", + "295\n", + "296\n", + "297\n", + "298\n", + "299\n", + "300\n", + "301\n", + "302\n", + "303\n", + "304\n", + "305\n", + "306\n", + "307\n", + "308\n", + "309\n", + "310\n", + "311\n", + "312\n", + "313\n", + "314\n", + "315\n", + "316\n", + "317\n", + "318\n", + "319\n", + "320\n", + "321\n", + "322\n", + "323\n", + "324\n", + "325\n", + "326\n", + "327\n", + "328\n", + "329\n", + "330\n", + "331\n", + "332\n", + "333\n", + "334\n", + "335\n", + "336\n", + "337\n", + "338\n", + "339\n", + "340\n", + "341\n", + "342\n", + "343\n", + "344\n", + "345\n", + "346\n", + "347\n", + "348\n", + "349\n", + "350\n", + "351\n", + "352\n", + "353\n", + "354\n", + "355\n", + "356\n", + "357\n", + "358\n", + "359\n", + "360\n", + "361\n", + "362\n", + "363\n", + "364\n", + "365\n", + "366\n", + "367\n", + "368\n", + "369\n", + "370\n", + "371\n", + "372\n", + "373\n", + "374\n", + "375\n", + "376\n", + "377\n", + "378\n", + "379\n", + "380\n", + "381\n", + "382\n", + "383\n", + "384\n", + "385\n", + "386\n", + "387\n", + "388\n", + "389\n", + "390\n", + "391\n", + "392\n", + "393\n", + "394\n", + "395\n", + "396\n", + "397\n", + "398\n", + "399\n", + "400\n", + "401\n", + "402\n", + "403\n", + "404\n", + "405\n", + "406\n", + "407\n", + "408\n", + "409\n", + "410\n", + "411\n", + "412\n", + "413\n", + "414\n", + "415\n", + "416\n", + "417\n", + "418\n", + "419\n", + "420\n", + "421\n", + "422\n", + "423\n", + "424\n", + "425\n", + "426\n", + "427\n", + "428\n", + "429\n", + "430\n", + "431\n", + "432\n", + "433\n", + "434\n", + "435\n", + "436\n", + "437\n", + "438\n", + "439\n", + "440\n", + "441\n", + "442\n", + "443\n", + "444\n", + "445\n", + "446\n", + "447\n", + "448\n", + "449\n", + "450\n", + "451\n", + "452\n", + "453\n", + "454\n", + "455\n", + "456\n", + "457\n", + "458\n", + "459\n", + "460\n", + "461\n", + "462\n", + "463\n", + "464\n", + "465\n", + "466\n", + "467\n", + "468\n", + "469\n", + "470\n", + "471\n", + "472\n", + "473\n", + "474\n", + "475\n", + "476\n", + "477\n", + "478\n", + "479\n", + "480\n", + "481\n", + "482\n", + "483\n", + "484\n", + "485\n", + "486\n", + "487\n", + "488\n", + "489\n", + "490\n", + "491\n", + "492\n", + "493\n", + "494\n", + "495\n", + "496\n", + "497\n", + "498\n", + "499\n", + "500\n", + "501\n", + "502\n", + "503\n", + "504\n", + "505\n", + "506\n", + "507\n", + "508\n", + "509\n", + "510\n", + "511\n", + "512\n", + "513\n", + "514\n", + "515\n", + "516\n", + "517\n", + "518\n", + "519\n", + "520\n", + "521\n", + "522\n", + "523\n", + "524\n", + "525\n", + "526\n", + "527\n", + "528\n", + "529\n", + "530\n", + "531\n", + "532\n", + "533\n", + "534\n", + "535\n", + "536\n", + "537\n", + "538\n", + "539\n", + "540\n", + "541\n", + "542\n", + "543\n", + "544\n", + "545\n", + "546\n", + "547\n", + "548\n", + "549\n", + "550\n", + "551\n", + "552\n", + "553\n", + "554\n", + "555\n", + "556\n", + "557\n", + "558\n", + "559\n", + "560\n", + "561\n", + "562\n", + "563\n", + "564\n", + "565\n", + "566\n", + "567\n", + "568\n", + "569\n", + "570\n", + "571\n", + "572\n", + "573\n", + "574\n", + "575\n", + "576\n", + "577\n", + "578\n", + "579\n", + "580\n", + "581\n", + "582\n", + "583\n", + "584\n", + "585\n", + "586\n", + "587\n", + "588\n", + "589\n", + "590\n", + "591\n", + "592\n", + "593\n", + "594\n", + "595\n", + "596\n", + "597\n", + "598\n", + "599\n", + "600\n", + "601\n", + "602\n", + "603\n", + "604\n", + "605\n", + "606\n", + "607\n", + "608\n", + "609\n", + "610\n", + "611\n", + "612\n", + "613\n", + "614\n", + "615\n", + "616\n", + "617\n", + "618\n", + "619\n", + "620\n", + "621\n", + "622\n", + "623\n", + "624\n", + "625\n", + "626\n", + "627\n", + "628\n", + "629\n", + "630\n", + "631\n", + "632\n", + "633\n", + "634\n", + "635\n", + "636\n", + "637\n", + "638\n", + "639\n", + "640\n", + "641\n", + "642\n", + "643\n", + "644\n", + "645\n", + "646\n", + "647\n", + "648\n", + "649\n", + "650\n", + "651\n", + "652\n", + "653\n", + "654\n", + "655\n", + "656\n", + "657\n", + "658\n", + "659\n", + "660\n", + "661\n", + "662\n", + "663\n", + "664\n", + "665\n", + "666\n", + "667\n", + "668\n", + "669\n", + "670\n", + "671\n", + "672\n", + "673\n", + "674\n", + "675\n", + "676\n", + "677\n", + "678\n", + "679\n", + "680\n", + "681\n", + "682\n", + "683\n", + "684\n", + "685\n", + "686\n", + "687\n", + "688\n", + "689\n", + "690\n", + "691\n", + "692\n", + "693\n", + "694\n", + "695\n", + "696\n", + "697\n", + "698\n", + "699\n", + "700\n", + "701\n", + "702\n", + "703\n", + "704\n", + "705\n", + "706\n", + "707\n", + "708\n", + "709\n", + "710\n", + "711\n", + "712\n", + "713\n", + "714\n", + "715\n", + "716\n", + "717\n", + "718\n", + "719\n", + "720\n", + "721\n", + "722\n", + "723\n", + "724\n", + "725\n", + "726\n", + "727\n", + "728\n", + "729\n", + "730\n", + "731\n", + "732\n", + "733\n", + "734\n", + "735\n", + "736\n", + "737\n", + "738\n", + "739\n", + "740\n", + "741\n", + "742\n", + "743\n", + "744\n", + "745\n", + "746\n", + "747\n", + "748\n", + "749\n", + "750\n", + "751\n", + "752\n", + "753\n", + "754\n", + "755\n", + "756\n", + "757\n", + "758\n", + "759\n", + "760\n", + "761\n", + "762\n", + "763\n", + "764\n", + "765\n", + "766\n", + "767\n", + "768\n", + "769\n", + "770\n", + "771\n", + "772\n", + "773\n", + "774\n", + "775\n", + "776\n", + "777\n", + "778\n", + "779\n", + "780\n", + "781\n", + "782\n", + "783\n", + "784\n", + "785\n", + "786\n", + "787\n", + "788\n", + "789\n", + "790\n", + "791\n", + "792\n", + "793\n", + "794\n", + "795\n", + "796\n", + "797\n", + "798\n", + "799\n", + "800\n", + "801\n", + "802\n", + "803\n", + "804\n", + "805\n", + "806\n", + "807\n", + "808\n", + "809\n", + "810\n", + "811\n", + "812\n", + "813\n", + "814\n", + "815\n", + "816\n", + "817\n", + "818\n", + "819\n", + "820\n", + "821\n", + "822\n", + "823\n", + "824\n", + "825\n", + "826\n", + "827\n", + "828\n", + "829\n", + "830\n", + "831\n", + "832\n", + "833\n", + "834\n", + "835\n", + "836\n", + "837\n", + "838\n", + "839\n", + "840\n", + "841\n", + "842\n", + "843\n", + "844\n", + "845\n", + "846\n", + "847\n", + "848\n", + "849\n", + "850\n", + "851\n", + "852\n", + "853\n", + "854\n", + "855\n", + "856\n", + "857\n", + "858\n", + "859\n", + "860\n", + "861\n", + "862\n", + "863\n", + "864\n", + "865\n", + "866\n", + "867\n", + "868\n", + "869\n", + "870\n", + "871\n", + "872\n", + "873\n", + "874\n", + "875\n", + "876\n", + "877\n", + "878\n", + "879\n", + "880\n", + "881\n", + "882\n", + "883\n", + "884\n", + "885\n", + "886\n", + "887\n", + "888\n", + "889\n", + "890\n", + "891\n", + "892\n", + "893\n", + "894\n", + "895\n", + "896\n", + "897\n", + "898\n", + "899\n", + "900\n", + "901\n", + "902\n", + "903\n", + "904\n", + "905\n", + "906\n", + "907\n", + "908\n", + "909\n", + "910\n", + "911\n", + "912\n", + "913\n", + "914\n", + "915\n", + "916\n", + "917\n", + "918\n", + "919\n", + "920\n", + "921\n", + "922\n", + "923\n", + "924\n", + "925\n", + "926\n", + "927\n", + "928\n", + "929\n", + "930\n", + "931\n", + "932\n", + "933\n", + "934\n", + "935\n", + "936\n", + "937\n", + "938\n", + "939\n", + "940\n", + "941\n", + "942\n", + "943\n", + "944\n", + "945\n", + "946\n", + "947\n", + "948\n", + "949\n", + "950\n", + "951\n", + "952\n", + "953\n", + "954\n", + "955\n", + "956\n", + "957\n", + "958\n", + "959\n", + "960\n", + "961\n", + "962\n", + "963\n", + "964\n", + "965\n", + "966\n", + "967\n", + "968\n", + "969\n", + "970\n", + "971\n", + "972\n", + "973\n", + "974\n", + "975\n", + "976\n", + "977\n", + "978\n", + "979\n", + "980\n", + "981\n", + "982\n", + "983\n", + "984\n", + "985\n", + "986\n", + "987\n", + "988\n", + "989\n", + "990\n", + "991\n", + "992\n", + "993\n", + "994\n", + "995\n", + "996\n", + "997\n", + "998\n", + "999\n", + "1000\n", + "1001\n", + "1002\n", + "1003\n", + "1004\n", + "1005\n", + "1006\n", + "1007\n", + "1008\n", + "1009\n", + "1010\n", + "1011\n", + "1012\n", + "1013\n", + "1014\n", + "1015\n", + "1016\n", + "1017\n", + "1018\n", + "1019\n", + "1020\n", + "1021\n", + "1022\n", + "1023\n", + "1024\n", + "1025\n", + "1026\n", + "1027\n", + "1028\n", + "1029\n", + "1030\n", + "1031\n", + "1032\n", + "1033\n", + "1034\n", + "1035\n", + "1036\n", + "1037\n", + "1038\n", + "1039\n", + "1040\n", + "1041\n", + "1042\n", + "1043\n", + "1044\n", + "1045\n", + "1046\n", + "1047\n", + "1048\n", + "1049\n", + "1050\n", + "1051\n", + "1052\n", + "1053\n", + "1054\n", + "1055\n", + "1056\n", + "1057\n", + "1058\n", + "1059\n", + "1060\n", + "1061\n", + "1062\n", + "1063\n", + "1064\n", + "1065\n", + "1066\n", + "1067\n", + "1068\n", + "1069\n", + "1070\n", + "1071\n", + "1072\n", + "1073\n", + "1074\n", + "1075\n", + "1076\n", + "1077\n", + "1078\n", + "1079\n", + "1080\n", + "1081\n", + "1082\n", + "1083\n", + "1084\n", + "1085\n", + "1086\n", + "1087\n", + "1088\n", + "1089\n", + "1090\n", + "1091\n", + "1092\n", + "1093\n", + "1094\n", + "1095\n", + "1096\n", + "1097\n", + "1098\n", + "1099\n", + "1100\n", + "1101\n", + "1102\n", + "1103\n", + "1104\n", + "1105\n", + "1106\n", + "1107\n", + "1108\n", + "1109\n", + "1110\n", + "1111\n", + "1112\n", + "1113\n", + "1114\n", + "1115\n", + "1116\n", + "1117\n", + "1118\n", + "1119\n", + "1120\n", + "1121\n", + "1122\n", + "1123\n", + "1124\n", + "1125\n", + "1126\n", + "1127\n", + "1128\n", + "1129\n", + "1130\n", + "1131\n", + "1132\n", + "1133\n", + "1134\n", + "1135\n", + "1136\n", + "1137\n", + "1138\n", + "1139\n", + "1140\n", + "1141\n", + "1142\n", + "1143\n", + "1144\n", + "1145\n", + "1146\n", + "1147\n", + "1148\n", + "1149\n", + "1150\n", + "1151\n", + "1152\n", + "1153\n", + "1154\n", + "1155\n", + "1156\n", + "1157\n", + "1158\n", + "1159\n", + "1160\n", + "1161\n", + "1162\n", + "1163\n", + "1164\n", + "1165\n", + "1166\n", + "1167\n", + "1168\n", + "1169\n", + "1170\n", + "1171\n", + "1172\n", + "1173\n", + "1174\n", + "1175\n", + "1176\n", + "1177\n", + "1178\n", + "1179\n", + "1180\n", + "1181\n", + "1182\n", + "1183\n", + "1184\n", + "1185\n", + "1186\n", + "1187\n", + "1188\n", + "1189\n", + "1190\n", + "1191\n", + "1192\n", + "1193\n", + "1194\n", + "1195\n", + "1196\n", + "1197\n", + "1198\n", + "1199\n", + "1200\n", + "1201\n", + "1202\n", + "1203\n", + "1204\n", + "1205\n", + "1206\n", + "1207\n", + "1208\n", + "1209\n", + "1210\n", + "1211\n", + "1212\n", + "1213\n", + "1214\n", + "1215\n", + "1216\n", + "1217\n", + "1218\n", + "1219\n", + "1220\n", + "1221\n", + "1222\n", + "1223\n", + "1224\n", + "1225\n", + "1226\n", + "1227\n", + "1228\n", + "1229\n", + "1230\n", + "1231\n", + "1232\n", + "1233\n", + "1234\n", + "1235\n", + "1236\n", + "1237\n", + "1238\n", + "1239\n", + "1240\n", + "1241\n", + "1242\n", + "1243\n", + "1244\n", + "1245\n", + "1246\n", + "1247\n", + "1248\n", + "1249\n" ] } ], @@ -164,30 +1414,82 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 49, "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "RGBA\n", + "(2, 4)\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, { "data": { + "image/png": "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\n", "text/plain": [ - "100" + "<Figure size 432x288 with 1 Axes>" ] }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" } ], "source": [ - "len(beetle_counts)" + "from torchvision.utils import draw_bounding_boxes\n", + "import torch\n", + "import torchvision\n", + "transform = transforms.Compose([transforms.ToTensor()])\n", + "for i in range(len(sim_img_arr)):\n", + " print(sim_img_arr[i].mode)\n", + " \n", + " tensor = transform(sim_img_arr[i].convert(\"RGB\")).type(torch.uint8)\n", + " coords_list = np.zeros((len(coords_arr[i]), 4))\n", + " j=0\n", + " for k in coords_arr[i]:\n", + " c, x, y, w, h, a = k\n", + " coords_list[j, 0] = x\n", + " coords_list[j, 1] = y\n", + " coords_list[j, 2] = int(x+w)\n", + " coords_list[j, 3] = int(y+h)\n", + " j+=1\n", + " print(coords_list.shape)\n", + " draw_bounding_boxes(tensor, torch.Tensor(coords_list))\n", + " plt.imshow(tensor.permute(1,2,0)[:,:,0:3])\n", + " plt.show()\n", + " break\n", + " \n" ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], - "source": [] + "source": [ + "First:\n", + " - created 1000 images on a clean background variable 1 to 5 of the same beetle, model detected well on test set of 100 images (val/exp or exp2 or exp3) (proof of concept)\n", + " - created 1000 images on a clean background variable 0 to 5 beetles of 6 different types of beetles, performing\n", + " \n", + "TODO:\n", + " - created 1000 images on a clean background variable 0 to 5 beetles of 6 different images and 0 to 5 non-beetles of _ different images, performing\n", + " - created 1000 images on a clean background variable 0 to 10 beetles of 15 different images and 0 to 10 non-beetles of _ different images\n", + " - created 1000 images on a clean background variable 0 to 10 beetles of 15 different images and 0 to 10 non-beetles of _ different images on a dirty background\n", + " - perform auto cropping on arduino and include " + ] } ], "metadata": {