diff --git a/Karussell/Supervisely/Bbox from Pose.ipynb b/Karussell/Supervisely/Bbox from Pose.ipynb new file mode 100644 index 0000000..312c500 --- /dev/null +++ b/Karussell/Supervisely/Bbox from Pose.ipynb @@ -0,0 +1,217 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "07bdc0da", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import json\n", + "import numpy as np\n", + "from tqdm.notebook import tqdm\n", + "path_dataset = r'D:\\karusel'\n", + "from SuperviselyKeypointsGUI.SuperviselyKeypointsGUI import *\n", + "\n", + "\n", + "keypoints_3d_path = r'SuperviselyKeypointsGUI\\karussel_24kps.csv'\n", + "keypoints_3d = pd.read_csv(keypoints_3d_path, index_col=0).astype(float)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ca890aa0", + "metadata": {}, + "outputs": [], + "source": [ + "def find_image(id):\n", + " for row in coco['images']:\n", + " if row['id'] == id:\n", + " return row" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b8135031", + "metadata": {}, + "outputs": [], + "source": [ + "def ltrb_from_cloud(cloud_2d, imgSize, expansion=0.1):\n", + " height, width = imgSize\n", + " ltrb = np.round((cloud_2d[:, 0].min(), cloud_2d[:, 1].min(),\n", + " cloud_2d[:, 0].max(), cloud_2d[:, 1].max())).astype(int)\n", + " \n", + " if expansion > 0:\n", + " dx = np.round((ltrb[2]-ltrb[0])*expansion/2)\n", + " dy = np.round((ltrb[3]-ltrb[1])*expansion/2)\n", + " ltrb += np.array([-dx, -2*dy, dx, dy], dtype=int)\n", + " \n", + " ltrb[[0,2]] = np.clip(ltrb[[0,2]], 0, width)\n", + " ltrb[[1,3]] = np.clip(ltrb[[1,3]], 0, height)\n", + " \n", + " return ltrb\n", + "\n", + "def ltrb2ltwh(ltrb):\n", + " return np.array([ltrb[0], ltrb[1], ltrb[2]-ltrb[0], ltrb[3]-ltrb[1]], dtype=int)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "79762c08", + "metadata": {}, + "outputs": [], + "source": [ + "with open(os.path.join(path_dataset, 'karusel_COCO.json'), 'r') as file:\n", + " coco = json.load(file)" + ] + }, + { + "cell_type": "markdown", + "id": "a1cfe0e2", + "metadata": {}, + "source": [ + "### Bboxes from pose" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f9440b54", + "metadata": {}, + "outputs": [], + "source": [ + "for obj in tqdm(coco['annotations']):\n", + " keypoints_2d = np.array(obj['keypoints']).reshape((-1, 3))[:, :2]\n", + " id, width, height, file_name = find_image(obj['image_id']).values()\n", + " \n", + " bbox_ltrb = ltrb_from_cloud(keypoints_2d, (height, width), 0.4)\n", + " bbox_ltwh = ltrb2ltwh(bbox_ltrb).tolist()\n", + " obj['bbox'] = bbox_ltwh\n", + " obj['area'] = bbox_ltwh[2]*bbox_ltwh[3]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dfcb675b", + "metadata": {}, + "outputs": [], + "source": [ + "# with open(os.path.join(path_dataset, 'karusel_COCO.json'), 'w') as file:\n", + "# json.dump(coco, file)" + ] + }, + { + "cell_type": "markdown", + "id": "e8ff698d", + "metadata": {}, + "source": [ + "### Split COCO json to train/val" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3aec7a2b", + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "import copy\n", + "\n", + "def split_coco_json(coco, test_size=0.2, random_state=0):\n", + " \n", + " train_idx, test_idx = train_test_split([i['id'] for i in coco['images']],\n", + " test_size=test_size, random_state=random_state)\n", + "\n", + "\n", + " train = copy.deepcopy(coco)\n", + " test = copy.deepcopy(coco)\n", + "\n", + " test['images'] = [x for x in coco['images'] if x['id'] in test_idx]\n", + " train['images'] = [x for x in coco['images'] if x['id'] in train_idx]\n", + "\n", + " test['annotations'] = [x for x in coco['annotations'] if x['image_id'] in test_idx]\n", + " train['annotations'] = [x for x in coco['annotations'] if x['image_id'] in train_idx]\n", + " return train, test" + ] + }, + { + "cell_type": "markdown", + "id": "1cdd1a3c", + "metadata": {}, + "source": [ + "### Create new splited dataset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aafd54fb", + "metadata": {}, + "outputs": [], + "source": [ + "train, test = split_coco_json(coco, 0.1, random_state=777)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f6af98fc", + "metadata": {}, + "outputs": [], + "source": [ + "test_path_images = [os.path.join(path_dataset, 'images', 'img', x['file_name']) for x in test['images']]\n", + "train_path_images = [os.path.join(path_dataset, 'images', 'img', x['file_name']) for x in train['images']]\n", + "\n", + "import shutil\n", + "path_new_dataset = r'C:\\Users\\Kir\\Jupiter\\Nurburg\\OpenPifPaf\\Training\\Karusel_dataset'\n", + "\n", + "path_train_img = os.path.join(path_new_dataset, 'images', 'train')\n", + "path_test_img = os.path.join(path_new_dataset, 'images', 'val')\n", + "path_ann = os.path.join(path_new_dataset, 'annotations')\n", + "\n", + "os.makedirs(path_train_img, exist_ok=True)\n", + "os.makedirs(path_test_img, exist_ok=True)\n", + "os.makedirs(path_ann, exist_ok=True)\n", + "\n", + "with open(os.path.join(path_ann, 'train.json'), 'w') as file:\n", + " json.dump(train, file)\n", + " \n", + "with open(os.path.join(path_ann, 'val.json'), 'w') as file:\n", + " json.dump(test, file)\n", + "\n", + "for path in train_path_images:\n", + " shutil.copy(path, path_train_img)\n", + "\n", + "for path in test_path_images:\n", + " shutil.copy(path, path_test_img)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Karussell/SuperviselyKeypointsGUI/Icon.ico b/Karussell/Supervisely/SuperviselyKeypointsGUI/Icon.ico similarity index 100% rename from Karussell/SuperviselyKeypointsGUI/Icon.ico rename to Karussell/Supervisely/SuperviselyKeypointsGUI/Icon.ico diff --git a/Karussell/SuperviselyKeypointsGUI/SuperviselyAPI_requirements.txt b/Karussell/Supervisely/SuperviselyKeypointsGUI/SuperviselyAPI_requirements.txt similarity index 100% rename from Karussell/SuperviselyKeypointsGUI/SuperviselyAPI_requirements.txt rename to Karussell/Supervisely/SuperviselyKeypointsGUI/SuperviselyAPI_requirements.txt diff --git a/Karussell/SuperviselyKeypointsGUI/SuperviselyAPI_start.ipynb b/Karussell/Supervisely/SuperviselyKeypointsGUI/SuperviselyAPI_start.ipynb similarity index 100% rename from Karussell/SuperviselyKeypointsGUI/SuperviselyAPI_start.ipynb rename to Karussell/Supervisely/SuperviselyKeypointsGUI/SuperviselyAPI_start.ipynb diff --git a/Karussell/SuperviselyKeypointsGUI/SuperviselyKeypointsGUI.py b/Karussell/Supervisely/SuperviselyKeypointsGUI/SuperviselyKeypointsGUI.py similarity index 100% rename from Karussell/SuperviselyKeypointsGUI/SuperviselyKeypointsGUI.py rename to Karussell/Supervisely/SuperviselyKeypointsGUI/SuperviselyKeypointsGUI.py diff --git a/Karussell/SuperviselyKeypointsGUI/karussel_24kps.csv b/Karussell/Supervisely/SuperviselyKeypointsGUI/karussel_24kps.csv similarity index 100% rename from Karussell/SuperviselyKeypointsGUI/karussel_24kps.csv rename to Karussell/Supervisely/SuperviselyKeypointsGUI/karussel_24kps.csv diff --git a/Karussell/SuperviselyKeypointsGUI/start.bat b/Karussell/Supervisely/SuperviselyKeypointsGUI/start.bat similarity index 100% rename from Karussell/SuperviselyKeypointsGUI/start.bat rename to Karussell/Supervisely/SuperviselyKeypointsGUI/start.bat diff --git a/Karussell/Supervisely/ToCOCO.ipynb b/Karussell/Supervisely/ToCOCO.ipynb new file mode 100644 index 0000000..378f8cf --- /dev/null +++ b/Karussell/Supervisely/ToCOCO.ipynb @@ -0,0 +1,197 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "283f6e9c", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import numpy as np\n", + "import pandas as pd\n", + "import glob\n", + "import json\n", + "from tqdm.notebook import tqdm\n", + "\n", + "path_dataset = r'D:\\karusel'\n", + "with open(os.path.join(path_dataset, 'meta.json'), 'r') as j:\n", + " meta = json.load(j)\n", + "\n", + "imgs = glob.glob(path_dataset + '\\\\images\\\\img\\\\*', recursive=True)\n", + "anns = glob.glob(path_dataset + '\\\\images\\\\ann\\\\*', recursive=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7af948d4", + "metadata": {}, + "outputs": [], + "source": [ + "def label2hash(meta_json, last):\n", + " for clss in meta_json['classes']:\n", + " if clss['title'] == last['classTitle']:\n", + " meta_nodes = clss['geometry_config']['nodes']\n", + " label2hash = {}\n", + " for name in meta_nodes:\n", + " label2hash[meta_nodes[name]['label']] = name\n", + " return label2hash" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7ea0771e", + "metadata": {}, + "outputs": [], + "source": [ + "def annotations(meta_json, obj):\n", + " nodes = obj['nodes']\n", + " keypoints_2d = pd.DataFrame(columns=['x', 'y'])\n", + "\n", + " for i in range(1, len(nodes)+1):\n", + " keypoints_2d.loc[i] = nodes[label2hash(meta_json, obj)[str(i)]]['loc']\n", + "\n", + " keypoints_2d['v'] = 2\n", + " keypoints_2d = keypoints_2d.astype(float).round().astype(int)\n", + " return keypoints_2d[:24]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "26b6abf4", + "metadata": {}, + "outputs": [], + "source": [ + "def ann_json(keypoints, img_id, obj):\n", + " \n", + " annotation = {\n", + " \"id\": obj['id'],\n", + " \"segmentation\": [],\n", + " \"num_keypoints\": len(keypoints),\n", + " \"area\": 0,\n", + " \"iscrowd\": 0,\n", + " \"image_id\": img_id,\n", + " \"bbox\": [],\n", + " \"category_id\": 1,\n", + " \"keypoints\": keypoints.values.flatten().tolist()}\n", + "\n", + " return annotation\n", + "\n", + "def img_json(ann, name, id):\n", + " height, width = ann['size'].values()\n", + " image = {\n", + " \"id\": id,\n", + " \"width\": width,\n", + " \"height\": height,\n", + " \"file_name\": name,\n", + " }\n", + " return image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "155be42d", + "metadata": {}, + "outputs": [], + "source": [ + "def ann_img_list(anns, imgs, meta):\n", + " annotations_list = []\n", + " image_list = []\n", + " for i in tqdm(range(len(anns))):\n", + "\n", + " with open(anns[i], 'r') as j:\n", + " ann = json.load(j)\n", + " \n", + " image_name = os.path.basename(anns[i])[:-5]\n", + " image = img_json(ann, image_name, i)\n", + " image_list.append(image)\n", + "\n", + " for obj in ann['objects']:\n", + " keypoints = annotations(meta, obj)\n", + " annotations_list.append(ann_json(keypoints, i, obj))\n", + " return image_list, annotations_list" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6593f677", + "metadata": {}, + "outputs": [], + "source": [ + "def COCO(image_list, annotations_list):\n", + " coco = {\n", + "\n", + " \"info\": {\n", + " \"description\": \"karusel Dataset\", \"version\": \"1.0\"\n", + " },\n", + "\n", + " \"categories\": [\n", + " {\n", + " \"supercategory\": \"NurburgRing\",\n", + " \"id\": 1,\n", + " \"name\": \"karusel\",\n", + " \"keypoints\": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,\n", + " 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24],\n", + " \"skeleton\": [\n", + " [1, 2],[2, 3],[3, 4],[4, 5],[5, 6],[6, 7],[7, 8],[8, 9],[9, 10],[10, 11],\n", + " [11, 12],[12, 13],[13, 14],[14, 15],[15, 16],[16, 17],[17, 18],[18, 19],[19, 20],\n", + " [20, 21],[21, 22],[22, 23],[23, 24],[24, 1],[24, 3],[1, 5]\n", + " ]\n", + " }\n", + " ]\n", + " }\n", + "\n", + " coco['images'] = image_list\n", + " coco['annotations'] = annotations_list\n", + " return coco" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "38880d13", + "metadata": {}, + "outputs": [], + "source": [ + "coco_json = COCO(*ann_img_list(anns, imgs, meta))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "314565c2", + "metadata": {}, + "outputs": [], + "source": [ + "with open(os.path.join(path_dataset, 'karusel_COCO.json'), 'w') as file:\n", + " json.dump(coco_json, file)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Karussell/Supervisely/karusel_create_3d.ipynb b/Karussell/Supervisely/karusel_create_3d.ipynb new file mode 100644 index 0000000..41a7ff9 --- /dev/null +++ b/Karussell/Supervisely/karusel_create_3d.ipynb @@ -0,0 +1,102 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "9b13894c", + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "import pandas as pd\n", + "import numpy as np\n", + "import cv2 as cv\n", + "import plotly.express as px\n", + "import plotly.graph_objects as go\n", + "\n", + "def roration(x):\n", + " x = np.deg2rad(x)\n", + " return np.array([[np.cos(x), -np.sin(x)],\n", + " [np.sin(x), np.cos(x)]])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3fc452a2", + "metadata": {}, + "outputs": [], + "source": [ + "with open(r'karusel.png.json', 'r') as file:\n", + " img_json = json.load(file)\n", + " \n", + "img = cv.imread(r'karusel.png')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cfc4d7b9", + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.DataFrame([img_json['objects'][i]['points']['exterior'][0]\\\n", + " for i in range(len(img_json['objects']))], columns=['x','y'], index=range(1,25))\n", + "center = (1165, 874)\n", + "df -= center\n", + "df[['x', 'y']] = df.values[:, :2]@roration(90) # поворот x и y в плоскости земли\n", + "df['z'] = 0\n", + "\n", + "df = df.loc[[1, 7, 6, 20, 2, 3, 4, 17, 18, 5, 22, 19, 8,\n", + " 16, 9, 10, 11, 21, 15, 12, 14, 13, 24, 23]] # упорядочивание индексов\n", + "\n", + "df.index = list(range(1, 25))\n", + "df = df.astype(float)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "07361259", + "metadata": {}, + "outputs": [], + "source": [ + "img = cv.circle(img, center, 5, (0,0,0), -1)\n", + "fig = px.imshow(img)\n", + "fig.add_trace(go.Scatter(x=df.x+center[0], y=df.y+center[1], text=df.index,\n", + " marker=dict(color='red', size=5), mode='markers'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4f18693d", + "metadata": {}, + "outputs": [], + "source": [ + "df[['x', 'y']] = df.values[:, :2]@roration(44)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}