{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# RANSAC example\n", "\n", "In this example, we compare the performance of a normal algebraic one step (AOS) Pivot Calibration [Yaniv2010], with a RANSAC version of the same algorithm.\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Jupyter notebook sets the cwd to the folder containing the notebook.\n", "# So, you want to add the root of the project to the sys path, so modules load correctly.\n", "import sys\n", "sys.path.append(\"../../\")" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# All imports.\n", "from glob import glob\n", "import copy\n", "import random\n", "import cv2\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "# Note that the scikit-surgery libraries provide pivot and RANSAC. \n", "import sksurgerycalibration.algorithms.pivot as p # AOS Pivot algorithm and a RANSAC version.\n", "import sksurgerycore.transforms.matrix as m # For creating 4x4 matrices." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1151, 4, 4)\n" ] } ], "source": [ "# Load test data\n", "file_names = glob('PivotCalibrationData/*')\n", "arrays = [np.loadtxt(f) for f in file_names]\n", "matrices = np.concatenate(arrays)\n", "number_of_matrices = int(matrices.size/16)\n", "tracking_matrices = matrices.reshape(number_of_matrices, 4, 4)\n", "print(tracking_matrices.shape)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Offset is:[[-14.47617201]\n", " [395.14282161]\n", " [ -7.55790421]]\n", "Pivot is:[[ -805.28473588]\n", " [ -85.44779266]\n", " [-2112.0664371 ]]\n", "RMS error about centroid is:1.8384664420100074\n" ] } ], "source": [ "# Do a normal pivot calibration using all data.\n", "offset_1, pivot_1, residual_1 = p.pivot_calibration(tracking_matrices)\n", "print(\"Offset is:\" + str(offset_1))\n", "print(\"Pivot is:\" + str(pivot_1))\n", "print(\"RMS error about centroid is:\" + str(residual_1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So, if we add noisy data, we should be able to see the difference between a normal pivot calibration (least squares), and the RANSAC version. We have about 1000 matrices, so lets add noise up to 100 of them." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "# Parameters to play with\n", "number_of_matrices_to_add_noise_to = 100\n", "rotation_offset_in_degrees = 5\n", "translation_offset_in_millimetres = 5\n", "number_iterations = 10\n", "error_in_millimetres = 4\n", "minimum_percentage = 0.25" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "RANSAC Pivot, from 1151 matrices, used 1010 matrices, with error threshold = 4 and consensus threshold = 0.25\n", "RANSAC Pivot, from 1151 matrices, used 924 matrices, with error threshold = 4 and consensus threshold = 0.25\n", "RANSAC Pivot, from 1151 matrices, used 925 matrices, with error threshold = 4 and consensus threshold = 0.25\n", "RANSAC Pivot, from 1151 matrices, used 966 matrices, with error threshold = 4 and consensus threshold = 0.25\n", "RANSAC Pivot, from 1151 matrices, used 952 matrices, with error threshold = 4 and consensus threshold = 0.25\n", "RANSAC Pivot, from 1151 matrices, used 899 matrices, with error threshold = 4 and consensus threshold = 0.25\n", "RANSAC Pivot, from 1151 matrices, used 897 matrices, with error threshold = 4 and consensus threshold = 0.25\n", "RANSAC Pivot, from 1151 matrices, used 920 matrices, with error threshold = 4 and consensus threshold = 0.25\n", "RANSAC Pivot, from 1151 matrices, used 911 matrices, with error threshold = 4 and consensus threshold = 0.25\n", "RANSAC Pivot, from 1151 matrices, used 948 matrices, with error threshold = 4 and consensus threshold = 0.25\n" ] } ], "source": [ "# Create an array representing how many to add noise to.\n", "rms_error_ls = []\n", "rms_error_RANSAC = []\n", "x_values = []\n", "indices = range(tracking_matrices.shape[0])\n", "for counter in range(0, number_of_matrices_to_add_noise_to, 10):\n", " matrices_copy = copy.deepcopy(tracking_matrices)\n", " random_indices = random.sample(indices, counter)\n", " for random_index in random_indices:\n", " random_rotation = m.construct_rotm_from_euler((np.random.rand() * rotation_offset_in_degrees*2)-rotation_offset_in_degrees,\n", " (np.random.rand() * rotation_offset_in_degrees*2)-rotation_offset_in_degrees,\n", " (np.random.rand() * rotation_offset_in_degrees*2)-rotation_offset_in_degrees,\n", " \"zyx\", is_in_radians=False)\n", " random_translation = np.zeros((3,1))\n", " random_translation[0][0] = (np.random.rand() * translation_offset_in_millimetres*2)-translation_offset_in_millimetres\n", " random_translation[1][0] = (np.random.rand() * translation_offset_in_millimetres*2)-translation_offset_in_millimetres\n", " random_translation[2][0] = (np.random.rand() * translation_offset_in_millimetres*2)-translation_offset_in_millimetres\n", " random_transform = m.construct_rigid_transformation(random_rotation, random_translation)\n", " matrices_copy[random_index] = matrices_copy[random_index] @ random_transform\n", " offset_2, pivot_2, residual_2 = p.pivot_calibration(matrices_copy)\n", " offset_3, pivot_3, residual_3 = p.pivot_calibration_with_ransac(matrices_copy, number_iterations, error_in_millimetres, minimum_percentage)\n", " x_values.append(counter)\n", " rms_error_ls.append(residual_2)\n", " rms_error_RANSAC.append(residual_3)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD4CAYAAAD8Zh1EAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAlvklEQVR4nO3deXhV1bnH8e+bAUKYhwgyCQq9raKiRh+sQ62odR6qUqTgWNC2XkCxg/ZWr+29tVRxQLSWVqtSSxEcoLboVdSKrWIDIqCoIKgEmSFggECG9/6xDiEJgSRwkn2G3+d5znP2dE7eHI+/LNbeey1zd0REJPllRF2AiIjEhwJdRCRFKNBFRFKEAl1EJEUo0EVEUkRWVD+4U6dO3qtXr6h+vIhIUpo7d+56d8+rbV9kgd6rVy8KCgqi+vEiIknJzD7b2z51uYiIpAgFuohIilCgi4ikiMj60GtTWlpKYWEhJSUlUZeSFHJycujevTvZ2dlRlyIiCSChAr2wsJDWrVvTq1cvzCzqchKau7NhwwYKCwvp3bt31OWISAJIqC6XkpISOnbsqDCvBzOjY8eO+teMiFRKqEAHFOYNoM9KRKpKqC4XEZFGU1YGGzZAefnuR1lZw9b35zW1rZ98Mpx1Vtx/RQV6Da1ataK4uLjato8++ojrr7+eoqIiduzYwSmnnMLEiRMjqlBEGmzGDPjP/4TPP4+6kuAnP1GgR2XkyJHcdNNNXHTRRQAsXLgw4opEpF4+/xxGjoTp06FfP3jgAWjWDLKyIDNz96Pq+r72xWM9IwMaqbtUgV4Pq1atonv37pXrRx55ZITViEidSkth/Hi44w6oqICxY+GmmyDFL/FN3EAfPRrmz4/ve/bvD/ff3+CX3XTTTZx++ul8/etf56yzzuKaa66hXbt28a1NROLj7bfh+uthwQI4/3x48EFIk4EAE+4ql0R0zTXXsHjxYi6//HJef/11BgwYwI4dO6IuS0Sq2rQJbrgBvv512LgRnn029J2nSZhDIrfQ96Ml3Zi6du3Ktddey7XXXku/fv1YtGgRxx13XNRliYg7/PnPcPPNsH59+Nf9nXdC69ZRV9bk1EKvhxdffJHS0lIAVq9ezYYNG+jWrVvEVYkIH38MZ54JQ4eGlnhBAdx7b1qGOSRyCz0i27Ztq3YC9Oabb6awsJBRo0aRk5MDwN13302XLl2iKlFESkrg17+Gu+6CFi3g4YdhxIhwFUkaq3egm1kmUACsdPfza+y7GrgbWBnbNMHd/xCvIptSRUVFrdvvvffeJq5ERGr1yivwgx/AkiVwxRWhRa4GFtCwFvooYDHQZi/7p7j7jQdekohILdasgTFj4KmnoE8f+L//C90tUqlefehm1h04D0jKVreIJLGKCvjd7+CrX4WpU+H222HhQoV5Lep7UvR+4MdA7f0RwaVmtsDMpplZj9oOMLMRZlZgZgXr1q1rYKkiknbeew9OOilcjnjMMWH9zjshdj5Lqqsz0M3sfGCtu8/dx2F/BXq5+1HAy8ATtR3k7hPdPd/d8/Pyap20WkQEiovhllvguOPgk09g0iSYNSu00mWv6tNCPwm40Mw+Bf4CnG5mf6p6gLtvcPddd9r8AdAF2iKyf6ZPh8MPh3Hj4Npr4cMPw2WJGi66TnUGurvf6u7d3b0XMBh41d2HVj3GzA6usnoh4eSpiEj9ffYZXHQRXHwxtGsH//wnTJwIHTpEXVnS2O8bi8zsF2Z2YWx1pJm9b2bvASOBq+NRXBQyMzPp378//fr144ILLqCoqKja/v79+zN48OBq266++mq6detWORzA+vXr6RW73biiooKRI0fSr18/jjzySI4//niWL19e+dr169eTnZ3NI488Uu09V69ezeDBgznssMM47rjjOPfcc/n444/j/wuLRK20FO65J7TKX3kFfvMbmDs33MIvDdKgQHf313ddg+7ut7v7jNjyre5+hLsf7e7fdPcPG6PYptCiRQvmz5/PokWL6NChAw899FDlvsWLF1NeXs7s2bPZunVrtddlZmby2GOP7fF+U6ZM4YsvvmDBggUsXLiQ5557rtrAXlOnTmXAgAFMnjy5cpu7c8kll3DaaafxySefMHfuXO666y7WrFkT/19YJEpvvQX5+fCjH8HAgfDBB2E5xUdFbCy69X8fTjzxRFauXFm5PnnyZIYNG8ZZZ53F9OnTqx07evRo7rvvPsrKyqptX7VqFQcffDAZGeGj7t69O+3bt6/2nuPGjWPlypUUFhYC8Nprr5Gdnc0NN9xQedzRRx/NKaecEvffUSQSmzaFERF3DaT13HOh7/yQQ6KuLKkl7K3/o18czfzV8+P6nv279Of+s++v17Hl5eXMmjWL6667rnLblClTePnll/nwww958MEHGTJkSOW+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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(x_values, rms_error_ls, 'r', label='LS') \n", "plt.plot(x_values, rms_error_RANSAC, 'g', label='RANSAC') \n", "plt.legend(loc='upper left')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "mphy0026", "language": "python", "name": "mphy0026" }, "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.10.16" } }, "nbformat": 4, "nbformat_minor": 4 }