master-thesis/classification/evaluation/eval-train-yolo.ipynb

740 lines
90 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "markdown",
"id": "d32cb908",
"metadata": {},
"source": [
"# Table of contents\n",
"1. [Introduction](#introduction)\n",
"2. [Load train metrics](#loadmetrics)\n",
"3. [Plot metrics](#plotmetrics)"
]
},
{
"cell_type": "markdown",
"id": "0249e74b",
"metadata": {},
"source": [
"## Introduction <a name=\"introduction\"></a>\n",
"\n",
"In this notebook we load the training metrics which have been saved during training on the cluster and generate nice plots for visualization."
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "c0727442",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/zenon/.local/share/miniconda3/lib/python3.7/site-packages/requests/__init__.py:104: RequestsDependencyWarning: urllib3 (1.26.13) or chardet (5.1.0)/charset_normalizer (2.0.4) doesn't match a supported version!\n",
" RequestsDependencyWarning)\n"
]
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"import pandas as pd\n",
"import numpy as np\n",
"import seaborn as sns\n",
"from helpers import set_size"
]
},
{
"cell_type": "markdown",
"id": "9afb12e4",
"metadata": {},
"source": [
"## Load train metrics <a name=\"loadmetrics\"></a>\n",
"\n",
"The metrics have been saved to YOLO's `runs` directory in a file called `results.txt`. The file does not contain headers, unfortunately, so we have to set them manually here."
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "38305602",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>epoch</th>\n",
" <th>mem</th>\n",
" <th>train/box_loss</th>\n",
" <th>train/obj_loss</th>\n",
" <th>train/cls_loss</th>\n",
" <th>total</th>\n",
" <th>target</th>\n",
" <th>img_size</th>\n",
" <th>precision</th>\n",
" <th>recall</th>\n",
" <th>mAP_0.5</th>\n",
" <th>mAP_0.5:0.95</th>\n",
" <th>val/box_loss</th>\n",
" <th>val/obj_loss</th>\n",
" <th>val/cls_loss</th>\n",
" <th>f1</th>\n",
" <th>fitness</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0/69</td>\n",
" <td>7.28G</td>\n",
" <td>0.02551</td>\n",
" <td>0.011000</td>\n",
" <td>0</td>\n",
" <td>0.03651</td>\n",
" <td>12</td>\n",
" <td>640</td>\n",
" <td>0.7350</td>\n",
" <td>0.5716</td>\n",
" <td>0.6676</td>\n",
" <td>0.5290</td>\n",
" <td>0.02950</td>\n",
" <td>0.005770</td>\n",
" <td>0</td>\n",
" <td>0.643083</td>\n",
" <td>0.54286</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1/69</td>\n",
" <td>7.27G</td>\n",
" <td>0.02155</td>\n",
" <td>0.010970</td>\n",
" <td>0</td>\n",
" <td>0.03252</td>\n",
" <td>6</td>\n",
" <td>640</td>\n",
" <td>0.7681</td>\n",
" <td>0.6184</td>\n",
" <td>0.7172</td>\n",
" <td>0.5787</td>\n",
" <td>0.02820</td>\n",
" <td>0.005597</td>\n",
" <td>0</td>\n",
" <td>0.685168</td>\n",
" <td>0.59255</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2/69</td>\n",
" <td>7.27G</td>\n",
" <td>0.02127</td>\n",
" <td>0.010850</td>\n",
" <td>0</td>\n",
" <td>0.03212</td>\n",
" <td>22</td>\n",
" <td>640</td>\n",
" <td>0.7820</td>\n",
" <td>0.5965</td>\n",
" <td>0.7014</td>\n",
" <td>0.5684</td>\n",
" <td>0.02819</td>\n",
" <td>0.005582</td>\n",
" <td>0</td>\n",
" <td>0.676769</td>\n",
" <td>0.58170</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>3/69</td>\n",
" <td>7.27G</td>\n",
" <td>0.02089</td>\n",
" <td>0.010820</td>\n",
" <td>0</td>\n",
" <td>0.03170</td>\n",
" <td>9</td>\n",
" <td>640</td>\n",
" <td>0.7795</td>\n",
" <td>0.6028</td>\n",
" <td>0.7099</td>\n",
" <td>0.5858</td>\n",
" <td>0.02629</td>\n",
" <td>0.005540</td>\n",
" <td>0</td>\n",
" <td>0.679856</td>\n",
" <td>0.59821</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>4/69</td>\n",
" <td>7.28G</td>\n",
" <td>0.02061</td>\n",
" <td>0.010730</td>\n",
" <td>0</td>\n",
" <td>0.03135</td>\n",
" <td>33</td>\n",
" <td>640</td>\n",
" <td>0.7653</td>\n",
" <td>0.6153</td>\n",
" <td>0.7170</td>\n",
" <td>0.5929</td>\n",
" <td>0.02638</td>\n",
" <td>0.005602</td>\n",
" <td>0</td>\n",
" <td>0.682151</td>\n",
" <td>0.60531</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>65</th>\n",
" <td>65/69</td>\n",
" <td>7.25G</td>\n",
" <td>0.01648</td>\n",
" <td>0.008796</td>\n",
" <td>0</td>\n",
" <td>0.02527</td>\n",
" <td>14</td>\n",
" <td>640</td>\n",
" <td>0.7416</td>\n",
" <td>0.6157</td>\n",
" <td>0.6932</td>\n",
" <td>0.5738</td>\n",
" <td>0.02396</td>\n",
" <td>0.006050</td>\n",
" <td>0</td>\n",
" <td>0.672811</td>\n",
" <td>0.58574</td>\n",
" </tr>\n",
" <tr>\n",
" <th>66</th>\n",
" <td>66/69</td>\n",
" <td>7.25G</td>\n",
" <td>0.01645</td>\n",
" <td>0.008787</td>\n",
" <td>0</td>\n",
" <td>0.02524</td>\n",
" <td>8</td>\n",
" <td>640</td>\n",
" <td>0.7360</td>\n",
" <td>0.6175</td>\n",
" <td>0.6915</td>\n",
" <td>0.5715</td>\n",
" <td>0.02398</td>\n",
" <td>0.006076</td>\n",
" <td>0</td>\n",
" <td>0.671563</td>\n",
" <td>0.58350</td>\n",
" </tr>\n",
" <tr>\n",
" <th>67</th>\n",
" <td>67/69</td>\n",
" <td>7.25G</td>\n",
" <td>0.01629</td>\n",
" <td>0.008693</td>\n",
" <td>0</td>\n",
" <td>0.02499</td>\n",
" <td>3</td>\n",
" <td>640</td>\n",
" <td>0.7511</td>\n",
" <td>0.6058</td>\n",
" <td>0.6895</td>\n",
" <td>0.5694</td>\n",
" <td>0.02401</td>\n",
" <td>0.006101</td>\n",
" <td>0</td>\n",
" <td>0.670670</td>\n",
" <td>0.58141</td>\n",
" </tr>\n",
" <tr>\n",
" <th>68</th>\n",
" <td>68/69</td>\n",
" <td>7.25G</td>\n",
" <td>0.01627</td>\n",
" <td>0.008705</td>\n",
" <td>0</td>\n",
" <td>0.02498</td>\n",
" <td>27</td>\n",
" <td>640</td>\n",
" <td>0.7536</td>\n",
" <td>0.6024</td>\n",
" <td>0.6883</td>\n",
" <td>0.5680</td>\n",
" <td>0.02404</td>\n",
" <td>0.006127</td>\n",
" <td>0</td>\n",
" <td>0.669570</td>\n",
" <td>0.58003</td>\n",
" </tr>\n",
" <tr>\n",
" <th>69</th>\n",
" <td>69/69</td>\n",
" <td>7.25G</td>\n",
" <td>0.01622</td>\n",
" <td>0.008689</td>\n",
" <td>0</td>\n",
" <td>0.02491</td>\n",
" <td>28</td>\n",
" <td>640</td>\n",
" <td>0.6964</td>\n",
" <td>0.6407</td>\n",
" <td>0.6871</td>\n",
" <td>0.5661</td>\n",
" <td>0.02406</td>\n",
" <td>0.006154</td>\n",
" <td>0</td>\n",
" <td>0.667390</td>\n",
" <td>0.57820</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>70 rows × 17 columns</p>\n",
"</div>"
],
"text/plain": [
" epoch mem train/box_loss train/obj_loss train/cls_loss total \\\n",
"0 0/69 7.28G 0.02551 0.011000 0 0.03651 \n",
"1 1/69 7.27G 0.02155 0.010970 0 0.03252 \n",
"2 2/69 7.27G 0.02127 0.010850 0 0.03212 \n",
"3 3/69 7.27G 0.02089 0.010820 0 0.03170 \n",
"4 4/69 7.28G 0.02061 0.010730 0 0.03135 \n",
".. ... ... ... ... ... ... \n",
"65 65/69 7.25G 0.01648 0.008796 0 0.02527 \n",
"66 66/69 7.25G 0.01645 0.008787 0 0.02524 \n",
"67 67/69 7.25G 0.01629 0.008693 0 0.02499 \n",
"68 68/69 7.25G 0.01627 0.008705 0 0.02498 \n",
"69 69/69 7.25G 0.01622 0.008689 0 0.02491 \n",
"\n",
" target img_size precision recall mAP_0.5 mAP_0.5:0.95 val/box_loss \\\n",
"0 12 640 0.7350 0.5716 0.6676 0.5290 0.02950 \n",
"1 6 640 0.7681 0.6184 0.7172 0.5787 0.02820 \n",
"2 22 640 0.7820 0.5965 0.7014 0.5684 0.02819 \n",
"3 9 640 0.7795 0.6028 0.7099 0.5858 0.02629 \n",
"4 33 640 0.7653 0.6153 0.7170 0.5929 0.02638 \n",
".. ... ... ... ... ... ... ... \n",
"65 14 640 0.7416 0.6157 0.6932 0.5738 0.02396 \n",
"66 8 640 0.7360 0.6175 0.6915 0.5715 0.02398 \n",
"67 3 640 0.7511 0.6058 0.6895 0.5694 0.02401 \n",
"68 27 640 0.7536 0.6024 0.6883 0.5680 0.02404 \n",
"69 28 640 0.6964 0.6407 0.6871 0.5661 0.02406 \n",
"\n",
" val/obj_loss val/cls_loss f1 fitness \n",
"0 0.005770 0 0.643083 0.54286 \n",
"1 0.005597 0 0.685168 0.59255 \n",
"2 0.005582 0 0.676769 0.58170 \n",
"3 0.005540 0 0.679856 0.59821 \n",
"4 0.005602 0 0.682151 0.60531 \n",
".. ... ... ... ... \n",
"65 0.006050 0 0.672811 0.58574 \n",
"66 0.006076 0 0.671563 0.58350 \n",
"67 0.006101 0 0.670670 0.58141 \n",
"68 0.006127 0 0.669570 0.58003 \n",
"69 0.006154 0 0.667390 0.57820 \n",
"\n",
"[70 rows x 17 columns]"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#df = pd.read_csv('../../classification/yolo-second-run/runs/train/yolov7-custom7/results.txt',\n",
"df = pd.read_csv('results-final.txt',\n",
" delimiter=',',\n",
" names=['epoch', 'mem', 'train/box_loss', 'train/obj_loss', 'train/cls_loss', 'total', 'target', 'img_size', 'precision', 'recall', 'mAP_0.5', 'mAP_0.5:0.95', 'val/box_loss', 'val/obj_loss', 'val/cls_loss'])\n",
"df['f1'] = 2 * np.divide(df['precision'] * df['recall'],\n",
" df['precision'] + df['recall'])\n",
"df['fitness'] = 0.1 * df['mAP_0.5'] + 0.9 * df['mAP_0.5:0.95']\n",
"df"
]
},
{
"cell_type": "markdown",
"id": "78ad0ffe",
"metadata": {},
"source": [
"To be able to plot multiple lines in one plot, seaborn expects a _merged_ dataframe."
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "f2a956f0",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/zenon/.local/share/miniconda3/lib/python3.7/site-packages/ipykernel_launcher.py:2: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" \n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>epoch</th>\n",
" <th>metric</th>\n",
" <th>value</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>precision</td>\n",
" <td>0.7350</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>precision</td>\n",
" <td>0.7681</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2</td>\n",
" <td>precision</td>\n",
" <td>0.7820</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>3</td>\n",
" <td>precision</td>\n",
" <td>0.7795</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>4</td>\n",
" <td>precision</td>\n",
" <td>0.7653</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>135</th>\n",
" <td>65</td>\n",
" <td>recall</td>\n",
" <td>0.6157</td>\n",
" </tr>\n",
" <tr>\n",
" <th>136</th>\n",
" <td>66</td>\n",
" <td>recall</td>\n",
" <td>0.6175</td>\n",
" </tr>\n",
" <tr>\n",
" <th>137</th>\n",
" <td>67</td>\n",
" <td>recall</td>\n",
" <td>0.6058</td>\n",
" </tr>\n",
" <tr>\n",
" <th>138</th>\n",
" <td>68</td>\n",
" <td>recall</td>\n",
" <td>0.6024</td>\n",
" </tr>\n",
" <tr>\n",
" <th>139</th>\n",
" <td>69</td>\n",
" <td>recall</td>\n",
" <td>0.6407</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>140 rows × 3 columns</p>\n",
"</div>"
],
"text/plain": [
" epoch metric value\n",
"0 0 precision 0.7350\n",
"1 1 precision 0.7681\n",
"2 2 precision 0.7820\n",
"3 3 precision 0.7795\n",
"4 4 precision 0.7653\n",
".. ... ... ...\n",
"135 65 recall 0.6157\n",
"136 66 recall 0.6175\n",
"137 67 recall 0.6058\n",
"138 68 recall 0.6024\n",
"139 69 recall 0.6407\n",
"\n",
"[140 rows x 3 columns]"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = df.loc[:,~df.columns.isin(['mem', 'train/cls_loss', 'total', 'target', 'img_size', 'val/cls_loss'])]\n",
"df['epoch'] = df.index\n",
"df_aranged = df[['epoch', 'precision', 'recall']]\n",
"df_aranged = df_aranged.melt(id_vars=['epoch'], var_name='metric', value_name='value') # df is your dataframe\n",
"df_aranged"
]
},
{
"cell_type": "markdown",
"id": "b4626b54",
"metadata": {},
"source": [
"## Plot metrics <a name=\"plotmetrics\"></a>\n",
"\n",
"First, set the style of the plots to match with all other plots."
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "e04f6713",
"metadata": {},
"outputs": [],
"source": [
"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": "85f2437a",
"metadata": {},
"source": [
"Second, specify the save directory for the plots."
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "65aca46f",
"metadata": {},
"outputs": [],
"source": [
"fig_save_dir = '../../thesis/graphics/'"
]
},
{
"cell_type": "markdown",
"id": "53b6e6c2",
"metadata": {},
"source": [
"Third, point seaborn to the dataframe and specify how to discriminate the two metrics (precision and recall). In this case, the different metrics are stored under the dataframe column `metrics` and thus we specify it for `style`."
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "4a69582e",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 578.387x357.463 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots(1, 1, figsize=set_size(width, subplots=(1,1)))\n",
"sns.lineplot(x='epoch', y='value', style='metric', dashes=[\"\", (2,1)], data=df_aranged,\n",
" color='black', linewidth=1)\n",
"ax.set_ylim([0, 1])\n",
"#ax.set_xticks(np.arange(0, 70, 50))\n",
"ax.set_ylabel('')\n",
"ax.axvline(27, 0, 1, lw=1, color='grey')\n",
"fig.tight_layout()\n",
"fig.savefig(fig_save_dir + 'precision_recall_final.pdf', format='pdf', bbox_inches='tight')"
]
},
{
"cell_type": "markdown",
"id": "cea90e65",
"metadata": {},
"source": [
"Plot the box and object loss during training. YOLO usually reports a third loss (`cls_loss`) which is in this case always zero because we only have one class (_Plant_)."
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "bc5a84dd",
"metadata": {},
"outputs": [
{
"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, ax = plt.subplots(1, 2, figsize=set_size(width, subplots=(1,2)))\n",
"sns.lineplot(x=df.index, y='val/box_loss', data=df, ax=ax[0], color='black', linewidth=1)\n",
"sns.lineplot(x=df.index, y='val/obj_loss', data=df, ax=ax[1], color='black', linewidth=1)\n",
"ax[0].set_ylim([0.02, 0.03])\n",
"#ax[0].set_xticks(np.arange(0, 350, 50))\n",
"ax[0].set_xlabel('epoch')\n",
"ax[0].set_ylabel('box loss')\n",
"ax[0].axvline(27, 0, 1, lw=1, color='grey')\n",
"\n",
"ax[1].set_ylim([0.005, 0.007])\n",
"#ax[1].set_xticks(np.arange(0, 350, 50))\n",
"ax[1].set_xlabel('epoch')\n",
"ax[1].set_ylabel('object loss')\n",
"ax[1].axvline(27, 0, 1, lw=1, color='grey')\n",
"\n",
"fig.tight_layout()\n",
"fig.savefig(fig_save_dir + 'val_box_obj_loss_final.pdf', format='pdf', bbox_inches='tight')"
]
},
{
"cell_type": "markdown",
"id": "ccfd9180",
"metadata": {},
"source": [
"Plot the fitness of the model per epoch. The best weights are selected based on fitness, which is why the vertical gray line marks the best fitness at epoch 133. Fitness is calculated as the weighted average of `mAP@0.5` and `mAP@0.5:0.95` with the weighting 0.1 and 0.9, respectively."
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "fe9b6f1c",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.61718\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 578.387x357.463 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots(1, 1, figsize=set_size(width, subplots=(1,1)))\n",
"ax = sns.lineplot(x=df.index, y='fitness', data=df, color='black', linewidth=1)\n",
"ax.axvline(27, 0, 1, lw=1, color='grey')\n",
"ax.set_xlabel('epoch')\n",
"print(df['fitness'].max())\n",
"fig.savefig(fig_save_dir + 'model_fitness_final.pdf', format='pdf', bbox_inches='tight')"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "4580a3cb",
"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
}