{ "cells": [ { "cell_type": "code", "execution_count": 2, "id": "3fe8177c", "metadata": {}, "outputs": [], "source": [ "import fiftyone as fo\n", "from PIL import Image\n", "from detection import detect" ] }, { "cell_type": "code", "execution_count": 3, "id": "32f0f8ec", "metadata": {}, "outputs": [], "source": [ "name = \"dataset-small\"\n", "dataset_dir = \"/home/zenon/Documents/master-thesis/evaluation/dataset-small\"" ] }, { "cell_type": "code", "execution_count": 4, "id": "6343aa55", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 100% |█████████████████| 401/401 [633.3ms elapsed, 0s remaining, 633.2 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\n", "predictions_view = dataset.view()" ] }, { "cell_type": "code", "execution_count": 5, "id": "29827e3f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 100% |█████████████████| 401/401 [5.4m elapsed, 0s remaining, 1.4 samples/s] \n" ] } ], "source": [ "# Do detections with model and save bounding boxes\n", "with fo.ProgressBar() as pb:\n", " for sample in pb(predictions_view):\n", " image = Image.open(sample.filepath)\n", " w, h = image.size\n", " pred = detect(sample.filepath, 'yolo.onnx', '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[\"yolo_resnet\"] = fo.Detections(detections=detections)\n", " sample.save()" ] }, { "cell_type": "code", "execution_count": 6, "id": "8ad67806", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Evaluating detections...\n", " 100% |█████████████████| 401/401 [1.2s elapsed, 0s remaining, 339.9 samples/s] \n", "Performing IoU sweep...\n", " 100% |█████████████████| 401/401 [1.4s elapsed, 0s remaining, 288.5 samples/s] \n" ] } ], "source": [ "results = predictions_view.evaluate_detections(\n", " \"yolo_resnet\",\n", " gt_field=\"ground_truth\",\n", " eval_key=\"eval\",\n", " compute_mAP=True,\n", ")" ] }, { "cell_type": "code", "execution_count": 18, "id": "b180420b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " Healthy 0.80 0.81 0.81 430\n", " Stressed 0.77 0.72 0.75 315\n", "\n", " micro avg 0.79 0.77 0.78 745\n", " macro avg 0.79 0.77 0.78 745\n", "weighted avg 0.79 0.77 0.78 745\n", "\n", "0.6336217415940075\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": "8e819dea581e48d69877fb551a949e49", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FigureWidget({\n", " 'data': [{'mode': 'markers',\n", " 'opacity': 0.1,\n", " 'type': 'scatter',\n", " 'uid': '918e4315-b093-4d2b-8af4-789b5a5d5152',\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': 'c2b76e66-be9d-4ca2-9060-d350e1d5e030',\n", " 'z': array([[ 86, 68, 0],\n", " [ 0, 228, 87],\n", " [348, 0, 82]]),\n", " 'zmax': 348,\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': 'faa2cc05-e7dd-41df-8b22-533e4ae70f67',\n", " 'z': array([[ 86, 68, 0],\n", " [ 0, 228, 87],\n", " [348, 0, 82]]),\n", " 'zmax': 348,\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": "34fe31e66ebc452aba7202b9d206dee8", "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. ,\n", " 98. , 98. , 97. , 97. , 97. , 97. , 97. , 96. , 96. , 95. , 94.2, 94. ,\n", " 93.2, 93. , 92.9, 91.9, 91.2, 91. , 91. , 90.8, 89.8, 88.8, 88. , 87.9,\n", " 87. , 86.9, 86. , 85.9, 85.8, 85. , 84.8, 84.6, 83.1, 81.9, 81.8, 81.1,\n", " 80.1, 79.9, 79.7, 78.9, 78.6, 77.9, 77.7, 76.8, 76. , 75.6, 74.6, 74.2,\n", " 73.3, 71.9, 70.7, 69.5, 68.3, 67.1, 66.2, 65.1, 64. , 62.9, 61.2, 60.6,\n", " 59.7, 58.9, 52.6, 51.1, 49.4, 47.2, 46.4, 40.7, 30.5, 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.674)',\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.593)',\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 = predictions_view\n", "session.open_tab()" ] }, { "cell_type": "code", "execution_count": 20, "id": "535003f4", "metadata": {}, "outputs": [], "source": [ "session.plots.attach(matrix)" ] }, { "cell_type": "code", "execution_count": null, "id": "d3ba32f0", "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 }