master-thesis/classification/evaluation/eval-test-model.ipynb

452 lines
43 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"id": "945c9b80",
"metadata": {},
"source": [
"# Table of contents\n",
"1. [Introduction](#introduction)\n",
"2. [Aggregate Model Evaluation](#modelevaluation)\n",
" 1. [Loading the dataset](#modeload)\n",
" 2. [Perform detections](#modeldetect)\n",
" 3. [Evaluate detections](#modeldetectionseval)\n",
" 4. [Calculate results and plot them](#modelshowresults)\n",
" 5. [View dataset in fiftyone](#modelfiftyonesession)"
]
},
{
"cell_type": "markdown",
"id": "01339680",
"metadata": {},
"source": [
"## Introduction <a name=\"introduction\"></a>\n",
"\n",
"This notebook loads the test dataset in YOLOv5 format from disk and evaluates the model's performance."
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "ff25695e",
"metadata": {},
"outputs": [],
"source": [
"import fiftyone as fo\n",
"from PIL import Image\n",
"from detection import detect\n",
"from detection import detect_yolo_only"
]
},
{
"cell_type": "markdown",
"id": "86a5e832",
"metadata": {},
"source": [
"## Aggregate Model Evaluation <a name=\"modelevaluation\"></a>\n",
"\n",
"First, load the dataset from the directory containing the images and the labels in YOLOv5 format.\n",
"\n",
"### Loading the dataset <a name=\"modeload\"></a>"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "bea1038e",
"metadata": {},
"outputs": [],
"source": [
"name = \"dataset\"\n",
"dataset_dir = \"dataset\"\n",
"\n",
"# 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",
"dataset.persistent = True\n",
"classes = dataset.default_classes"
]
},
{
"cell_type": "markdown",
"id": "361eeecd",
"metadata": {},
"source": [
"If the dataset already exists because it had been saved under the same name before, load the dataset from fiftyone's folder."
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "2d479be8",
"metadata": {},
"outputs": [],
"source": [
"dataset = fo.load_dataset('dataset')\n",
"classes = dataset.default_classes"
]
},
{
"cell_type": "markdown",
"id": "4485dce3",
"metadata": {},
"source": [
"### Perform detections <a name=\"modeldetect\"></a>\n",
"\n",
"Now we can call the aggregate model to do detections on the images contained in the dataset. The actual detection happens at line 6 where `detect()` is called. This function currently does inference using the GPU via `onnxruntime-gpu`. All detections are saved to the `predictions` keyword of each sample. A sample is one image with potentially multiple detections.\n",
"\n",
"> **_NOTE:_** If the dataset already existed beforehand (you used `load_dataset()`), the detections are likely already saved in the dataset and you can skip the next step."
]
},
{
"cell_type": "code",
"execution_count": 32,
"id": "63f675ab",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" 100% |█████████████████| 640/640 [5.8m elapsed, 0s remaining, 2.2 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": "markdown",
"id": "10d94167",
"metadata": {},
"source": [
"### Evaluate detections against ground truth <a name=\"modeldetectionseval\"></a>\n",
"\n",
"Having saved the predictions, we can now evaluate them by cross-checking with the ground truth labels. If we specify an `eval_key`, true positives, false positives and false negatives will be saved under that key."
]
},
{
"cell_type": "code",
"execution_count": 33,
"id": "68cfdad2",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Evaluating detections...\n",
" 100% |█████████████████| 640/640 [2.0s elapsed, 0s remaining, 314.2 samples/s] \n",
"Performing IoU sweep...\n",
" 100% |█████████████████| 640/640 [2.2s elapsed, 0s remaining, 285.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": "markdown",
"id": "94b9751f",
"metadata": {},
"source": [
"### Calculate results and plot them <a name=\"modelshowresults\"></a>\n",
"\n",
"Now we have the performance of the model saved in the `results` variable and can extract various metrics from that. Here we print a simple report of all classes and their precision and recall values as well as the mAP with the metric employed by [COCO](https://cocodataset.org/#detection-eval). Next, a confusion matrix is plotted for each class (in our case only one). Finally, we can show the precision vs. recall curve for a specified threshold value."
]
},
{
"cell_type": "code",
"execution_count": 34,
"id": "86b90e80",
"metadata": {},
"outputs": [],
"source": [
"from helpers import set_size\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"import pandas as pd"
]
},
{
"cell_type": "code",
"execution_count": 35,
"id": "e34a18f4",
"metadata": {},
"outputs": [],
"source": [
"# Style the plots\n",
"width = 418\n",
"sns.set_theme(style='whitegrid',\n",
" rc={'text.usetex': True, 'font.family': 'serif', 'axes.labelsize': 10,\n",
" 'font.size': 10, 'legend.fontsize': 8,\n",
" 'xtick.labelsize': 8, 'ytick.labelsize': 8})"
]
},
{
"cell_type": "markdown",
"id": "8ee61fce",
"metadata": {},
"source": [
"The code for the LaTeX table of the classification report can be printed by first converting the results to a pandas DataFrame and then calling the `to_latex()` method of the DataFrame. This code can then be inserted into the LaTeX document."
]
},
{
"cell_type": "code",
"execution_count": 36,
"id": "900e9014",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\\begin{tabular}{lrrrr}\n",
"\\toprule\n",
"{} & precision & recall & f1-score & support \\\\\n",
"\\midrule\n",
"Healthy & 0.824 & 0.745 & 0.783 & 662.0 \\\\\n",
"Stressed & 0.707 & 0.783 & 0.743 & 488.0 \\\\\n",
"micro avg & 0.769 & 0.761 & 0.765 & 1150.0 \\\\\n",
"macro avg & 0.766 & 0.764 & 0.763 & 1150.0 \\\\\n",
"weighted avg & 0.775 & 0.761 & 0.766 & 1150.0 \\\\\n",
"\\bottomrule\n",
"\\end{tabular}\n",
"\n"
]
}
],
"source": [
"results_df = pd.DataFrame(results.report()).transpose().round(3)\n",
"\n",
"# Export DataFrame to LaTeX tabular environment\n",
"print(results_df.to_latex())"
]
},
{
"cell_type": "code",
"execution_count": 37,
"id": "24df35b4",
"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.6225848121901868\n"
]
}
],
"source": [
"# Print a classification report for all classes\n",
"results.print_report()\n",
"\n",
"print(results.mAP())"
]
},
{
"cell_type": "code",
"execution_count": 40,
"id": "da05e2ba",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Ignoring unsupported argument `thresholds` for the 'matplotlib' backend\n",
"Ignoring unsupported argument `thresholds` for the 'matplotlib' backend\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 578.387x178.731 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig_save_dir = '../../thesis/graphics/'\n",
"\n",
"fig, ax = plt.subplots(1, 2, figsize=set_size(width, subplots=(1,2)))\n",
"results.plot_pr_curves(classes=classes, iou_thresh=0.5, backend='matplotlib', ax=ax[0], color='black', linewidth=1)\n",
"results.plot_pr_curves(classes=classes, iou_thresh=0.95, backend='matplotlib', ax=ax[1], color='black', linewidth=1)\n",
"# Set the labels for the legends manually\n",
"ax[0].get_lines()[0].set_linestyle('dashed')\n",
"ax[1].get_lines()[0].set_linestyle('dashed')\n",
"ax[0].legend(['AP: 0.66, Healthy', 'AP: 0.65, Stressed'], frameon=False)\n",
"ax[1].legend(['AP: 0.56, Healthy', 'AP: 0.53, Stressed'], frameon=False)\n",
"fig.tight_layout()\n",
"fig.savefig(fig_save_dir + 'APmodel.pdf', format='pdf', bbox_inches='tight')"
]
},
{
"cell_type": "markdown",
"id": "dc5941e4",
"metadata": {},
"source": [
"The confusion matrix for the aggregate model seems to not show the cases where the object detection was successful but the class was wrong. For example, in the matrix below all classifications were correct or the detection failed. Under column _Stressed_ and row _Healthy_ not a single item is recorded. It seems that this evaluation metric does not have as much relevance when compared to the AP curves above or the mAP values."
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "f1586bd5",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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wuGwVT2NRCJWFaz397127VqFQqEBr0mlUv3+Ph599FHrdWKxWNb/5gC9qFw4oLy8XFLPm0XvJ9W6ujolk8mMqsTxnxZ6mabZb94zW/JQXl6uRCKhurq6fpUOOK/391teXq7ly5dr+/btOU2FlJeXy+/3KxaLKZlMyjAMGYahNWvWaOXKlYrFYlq8eLE2btwoSVnHsl1rGIb1tylJPp9vGH5q2KWzszPreLam8eOTgVAolJE8Hn9Ntr+PXnxQQS5ILmwWj8e1a9cu7d27N+NW1FQqpc2bN1sNfMFg0Co/S1JFRYU6OztlGIbVnxGPxxWLxRSPx603nerqatXV1Vn/Meh73jRNGYahrVu3WremLliwQLFYbNB3qWD4xePxftWB49/QsyWSvbIlqdu2bdO6deu0fft2BYNBxePxrGPZrg2HwxkNpQO9eWF0G+iDRt+pjL5/A9muyfb30SuVSlG1wEl5uru7u50OAsMnFosplUpRuRiFepPOQCCgVCqltrY2rVy50koEexPG8vJyhcNhxWIx3XTTTVqzZo01XVJbW2tNlYRCIW3dutVq8ovH41q+fLlqamr6jWW7try8XLW1tdYbR11dnXw+nx544IGR/leDHKxdu1bLly+3fl+xWEyrV6+27j5avXq1fD6f7r77bvn9fut32/vhpbq6+oTX9H6I6fv3IfX0YvT9OwWyIblwqb5zrX3n7QG4QywW0969e0f8/9+rVq0i4cRJMS3iUr2NWSywBbjT8euijATDMLRy5coRfU2MTVQuAGCMMk1T27ZtG5HqRW9P10gt2oWxjeQCAADYimkRAABgK5ILAABgK5ILAABgK5ILAABgK5ILAABgK5ILAABgK5ILAABgK5ILAABgK5ILAABgq/8PY0SVokXiwVIAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 578.387x357.463 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"fig, ax = plt.subplots(1, 1, figsize=set_size(width, subplots=(1,1)))\n",
"# Manually set confusion matrix values obtained from results.plot_confusion_matrix()\n",
"matrix = np.array([[493, 0, 169], [0, 382, 106], [105, 158, 0]])\n",
"labels = ['Healthy', 'Stressed', '(none)']\n",
"sns.heatmap(matrix, annot=True, xticklabels=labels, yticklabels=labels, fmt=\".0f\", cmap=sns.cubehelix_palette(as_cmap=True, start=.3, hue=1, light=.9))\n",
"fig.tight_layout()\n",
"fig.savefig(fig_save_dir + 'CMmodel.pdf', format='pdf', bbox_inches='tight')"
]
},
{
"cell_type": "markdown",
"id": "3871c398",
"metadata": {},
"source": [
"### View dataset in fiftyone <a name=\"modelfiftyonesession\"></a>\n",
"\n",
"We can launch a fiftyone session in a new tab to explore the dataset and the results."
]
},
{
"cell_type": "code",
"execution_count": 101,
"id": "bfb39b5d",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Session launched. Run `session.show()` to open the App in a cell output.\n"
]
},
{
"data": {
"application/javascript": [
"window.open('http://localhost:5151/');"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"session = fo.launch_app(dataset, auto=False)\n",
"session.view = dataset.view()\n",
"session.open_tab()"
]
},
{
"cell_type": "code",
"execution_count": 104,
"id": "e1d00573",
"metadata": {},
"outputs": [],
"source": [
"session.close()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "53a67321",
"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
}