{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "3fe8177c", "metadata": {}, "outputs": [], "source": [ "import fiftyone as fo\n", "from PIL import Image\n", "from detection import detect" ] }, { "cell_type": "code", "execution_count": 2, "id": "32f0f8ec", "metadata": {}, "outputs": [], "source": [ "name = \"dataset\"\n", "dataset_dir = \"dataset\"" ] }, { "cell_type": "code", "execution_count": 3, "id": "6343aa55", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 100% |█████████████████| 640/640 [716.7ms elapsed, 0s remaining, 894.6 samples/s] \n" ] } ], "source": [ "# The splits to load\n", "splits = [\"val\"]\n", "\n", "# Load the dataset, using tags to mark the samples in each split\n", "dataset = fo.Dataset(name)\n", "for split in splits:\n", " dataset.add_dir(\n", " dataset_dir=dataset_dir,\n", " dataset_type=fo.types.YOLOv5Dataset,\n", " split=split,\n", " tags=split,\n", " )\n", "\n", "classes = dataset.default_classes" ] }, { "cell_type": "code", "execution_count": 4, "id": "29827e3f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 100% |█████████████████| 640/640 [8.8m elapsed, 0s remaining, 1.5 samples/s] \n" ] } ], "source": [ "# Do detections with model and save bounding boxes\n", "with fo.ProgressBar() as pb:\n", " for sample in pb(dataset.view()):\n", " image = Image.open(sample.filepath)\n", " w, h = image.size\n", " pred = detect(sample.filepath, '../weights/yolo.onnx', '../weights/resnet.onnx')\n", "\n", " detections = []\n", " for _, row in pred.iterrows():\n", " xmin, xmax = int(row['xmin']), int(row['xmax'])\n", " ymin, ymax = int(row['ymin']), int(row['ymax'])\n", " rel_box = [\n", " xmin / w, ymin / h, (xmax - xmin) / w, (ymax - ymin) / h\n", " ]\n", " detections.append(\n", " fo.Detection(label=classes[int(row['cls'])],\n", " bounding_box=rel_box,\n", " confidence=int(row['cls_conf'])))\n", "\n", " sample[\"predictions\"] = fo.Detections(detections=detections)\n", " sample.save()" ] }, { "cell_type": "code", "execution_count": 5, "id": "06e1b4c0", "metadata": {}, "outputs": [], "source": [ "dataset.persistent = True" ] }, { "cell_type": "code", "execution_count": 6, "id": "8ad67806", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Evaluating detections...\n", " 100% |█████████████████| 640/640 [2.0s elapsed, 0s remaining, 319.5 samples/s] \n", "Performing IoU sweep...\n", " 100% |█████████████████| 640/640 [2.1s elapsed, 0s remaining, 297.3 samples/s] \n" ] } ], "source": [ "results = dataset.view().evaluate_detections(\n", " \"predictions\",\n", " gt_field=\"ground_truth\",\n", " eval_key=\"eval\",\n", " compute_mAP=True,\n", ")" ] }, { "cell_type": "code", "execution_count": 7, "id": "b180420b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " Healthy 0.82 0.74 0.78 662\n", " Stressed 0.71 0.78 0.74 488\n", "\n", " micro avg 0.77 0.76 0.76 1150\n", " macro avg 0.77 0.76 0.76 1150\n", "weighted avg 0.77 0.76 0.77 1150\n", "\n", "0.6225828327927432\n" ] }, { "data": { "text/plain": [] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "0e0a5d23d3f148419bd62ecf4a07dce9", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FigureWidget({\n", " 'data': [{'mode': 'markers',\n", " 'opacity': 0.1,\n", " 'type': 'scatter',\n", " 'uid': 'c432eebe-8bf5-4b15-834c-abdc3af7c18b',\n", " 'x': array([0, 1, 2, 0, 1, 2, 0, 1, 2]),\n", " 'y': array([0, 0, 0, 1, 1, 1, 2, 2, 2])},\n", " {'colorscale': [[0.0, 'rgb(255,245,235)'], [0.125,\n", " 'rgb(254,230,206)'], [0.25, 'rgb(253,208,162)'],\n", " [0.375, 'rgb(253,174,107)'], [0.5, 'rgb(253,141,60)'],\n", " [0.625, 'rgb(241,105,19)'], [0.75, 'rgb(217,72,1)'],\n", " [0.875, 'rgb(166,54,3)'], [1.0, 'rgb(127,39,4)']],\n", " 'hoverinfo': 'skip',\n", " 'showscale': False,\n", " 'type': 'heatmap',\n", " 'uid': '01498ed3-dbe3-4c9e-baf9-49d814522d20',\n", " 'z': array([[105, 158, 0],\n", " [ 0, 382, 106],\n", " [493, 0, 169]]),\n", " 'zmax': 493,\n", " 'zmin': 0},\n", " {'colorbar': {'len': 1, 'lenmode': 'fraction'},\n", " 'colorscale': [[0.0, 'rgb(255,245,235)'], [0.125,\n", " 'rgb(254,230,206)'], [0.25, 'rgb(253,208,162)'],\n", " [0.375, 'rgb(253,174,107)'], [0.5, 'rgb(253,141,60)'],\n", " [0.625, 'rgb(241,105,19)'], [0.75, 'rgb(217,72,1)'],\n", " [0.875, 'rgb(166,54,3)'], [1.0, 'rgb(127,39,4)']],\n", " 'hovertemplate': 'count: %{z}
truth: %{y}
predicted: %{x}',\n", " 'opacity': 0.25,\n", " 'type': 'heatmap',\n", " 'uid': '10618ef9-35c5-451a-b915-32b70d7bfb5e',\n", " 'z': array([[105, 158, 0],\n", " [ 0, 382, 106],\n", " [493, 0, 169]]),\n", " 'zmax': 493,\n", " 'zmin': 0}],\n", " 'layout': {'clickmode': 'event',\n", " 'margin': {'b': 0, 'l': 0, 'r': 0, 't': 30},\n", " 'template': '...',\n", " 'title': {},\n", " 'xaxis': {'constrain': 'domain',\n", " 'range': [-0.5, 2.5],\n", " 'tickmode': 'array',\n", " 'ticktext': [Healthy, Stressed, (none)],\n", " 'tickvals': array([0, 1, 2])},\n", " 'yaxis': {'constrain': 'domain',\n", " 'range': [-0.5, 2.5],\n", " 'scaleanchor': 'x',\n", " 'scaleratio': 1,\n", " 'tickmode': 'array',\n", " 'ticktext': array(['(none)', 'Stressed', 'Healthy'], dtype=object),\n", " 'tickvals': array([0, 1, 2])}}\n", "})" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "915261c4504943ec9b07813fbe75b8c9", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FigureWidget({\n", " 'data': [{'customdata': array([99. , 99. , 99. , 99. , 99. , 99. , 99. , 99. , 99. , 99. , 99. , 98.8,\n", " 98. , 98. , 97.7, 97. , 97. , 97. , 96.9, 96.4, 96. , 95.7, 94.8, 94.3,\n", " 93.8, 92.8, 92.2, 91.5, 90.9, 90.7, 89.3, 88.3, 87.8, 87.1, 86.8, 86.3,\n", " 85.8, 85.1, 84.6, 84.1, 83.2, 82. , 81.7, 80.8, 79.7, 79.4, 78.6, 77.8,\n", " 77.4, 76.3, 75.5, 74.6, 73.6, 72.3, 71. , 69.9, 68.6, 67.5, 66.4, 65.4,\n", " 64.3, 63.2, 62.2, 61. , 60.2, 59.1, 58.1, 56.9, 50.4, 49. , 47.3, 46.4,\n", " 40.8, 25.3, 10. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n", " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n", " 0. , 0. , 0. , 0. , 0. ]),\n", " 'hovertemplate': ('class: %{text}
recal' ... 'customdata:.3f}'),\n", " 'line': {'color': '#3366CC'},\n", " 'mode': 'lines',\n", " 'name': 'Healthy (AP = 0.631)',\n", " 'text': array(['Healthy', 'Healthy', 'Healthy', 'Healthy', 'Healthy', 'Healthy',\n", " 'Healthy', 'Healthy', 'Healthy', 'Healthy', 'Healthy', 'Healthy',\n", " 'Healthy', 'Healthy', 'Healthy', 'Healthy', 'Healthy', 'Healthy',\n", " 'Healthy', 'Healthy', 'Healthy', 'Healthy', 'Healthy', 'Healthy',\n", " 'Healthy', 'Healthy', 'Healthy', 'Healthy', 'Healthy', 'Healthy',\n", " 'Healthy', 'Healthy', 'Healthy', 'Healthy', 'Healthy', 'Healthy',\n", " 'Healthy', 'Healthy', 'Healthy', 'Healthy', 'Healthy', 'Healthy',\n", " 'Healthy', 'Healthy', 'Healthy', 'Healthy', 'Healthy', 'Healthy',\n", " 'Healthy', 'Healthy', 'Healthy', 'Healthy', 'Healthy', 'Healthy',\n", " 'Healthy', 'Healthy', 'Healthy', 'Healthy', 'Healthy', 'Healthy',\n", " 'Healthy', 'Healthy', 'Healthy', 'Healthy', 'Healthy', 'Healthy',\n", " 'Healthy', 'Healthy', 'Healthy', 'Healthy', 'Healthy', 'Healthy',\n", " 'Healthy', 'Healthy', 'Healthy', 'Healthy', 'Healthy', 'Healthy',\n", " 'Healthy', 'Healthy', 'Healthy', 'Healthy', 'Healthy', 'Healthy',\n", " 'Healthy', 'Healthy', 'Healthy', 'Healthy', 'Healthy', 'Healthy',\n", " 'Healthy', 'Healthy', 'Healthy', 'Healthy', 'Healthy', 'Healthy',\n", " 'Healthy', 'Healthy', 'Healthy', 'Healthy', 'Healthy'], dtype='class: %{text}
recal' ... 'customdata:.3f}'),\n", " 'line': {'color': '#DC3912'},\n", " 'mode': 'lines',\n", " 'name': 'Stressed (AP = 0.614)',\n", " 'text': array(['Stressed', 'Stressed', 'Stressed', 'Stressed', 'Stressed', 'Stressed',\n", " 'Stressed', 'Stressed', 'Stressed', 'Stressed', 'Stressed', 'Stressed',\n", " 'Stressed', 'Stressed', 'Stressed', 'Stressed', 'Stressed', 'Stressed',\n", " 'Stressed', 'Stressed', 'Stressed', 'Stressed', 'Stressed', 'Stressed',\n", " 'Stressed', 'Stressed', 'Stressed', 'Stressed', 'Stressed', 'Stressed',\n", " 'Stressed', 'Stressed', 'Stressed', 'Stressed', 'Stressed', 'Stressed',\n", " 'Stressed', 'Stressed', 'Stressed', 'Stressed', 'Stressed', 'Stressed',\n", " 'Stressed', 'Stressed', 'Stressed', 'Stressed', 'Stressed', 'Stressed',\n", " 'Stressed', 'Stressed', 'Stressed', 'Stressed', 'Stressed', 'Stressed',\n", " 'Stressed', 'Stressed', 'Stressed', 'Stressed', 'Stressed', 'Stressed',\n", " 'Stressed', 'Stressed', 'Stressed', 'Stressed', 'Stressed', 'Stressed',\n", " 'Stressed', 'Stressed', 'Stressed', 'Stressed', 'Stressed', 'Stressed',\n", " 'Stressed', 'Stressed', 'Stressed', 'Stressed', 'Stressed', 'Stressed',\n", " 'Stressed', 'Stressed', 'Stressed', 'Stressed', 'Stressed', 'Stressed',\n", " 'Stressed', 'Stressed', 'Stressed', 'Stressed', 'Stressed', 'Stressed',\n", " 'Stressed', 'Stressed', 'Stressed', 'Stressed', 'Stressed', 'Stressed',\n", " 'Stressed', 'Stressed', 'Stressed', 'Stressed', 'Stressed'], dtype='" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "session = fo.launch_app(dataset, auto=False)\n", "session.view = dataset.view()\n", "session.plots.attach(matrix)\n", "session.open_tab()" ] }, { "cell_type": "code", "execution_count": 9, "id": "6eed9a86", "metadata": {}, "outputs": [], "source": [ "def export_dataset(dataset, export_dir):\n", " label_field = \"ground_truth\"\n", "\n", " # The splits to export\n", " splits = [\"val\"]\n", "\n", " classes = [\"Healthy\", \"Stressed\"]\n", "\n", " # Export the splits\n", " for split in splits:\n", " split_view = dataset.match_tags(split)\n", " split_view.export(\n", " export_dir=export_dir,\n", " dataset_type=fo.types.YOLOv5Dataset,\n", " label_field=label_field,\n", " split=split,\n", " classes=classes,\n", " )" ] }, { "cell_type": "code", "execution_count": null, "id": "19c5b271", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "ebdde519", "metadata": {}, "outputs": [], "source": [] } ], "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.7.15" } }, "nbformat": 4, "nbformat_minor": 5 }