{
"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
}