{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Benchmarking numpy / scikit-image / scipy vs clesperanto" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pyclesperanto_prototype as cle\n", "\n", "cle.select_device('RTX')" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import time\n", "import matplotlib.pyplot as plt\n", "\n", "num_iterations = 10\n", "\n", "# measure execution time of a given method\n", "def benchmark(function, kwargs):\n", " times = []\n", " for i in range(0, num_iterations):\n", " start_time = time.time()\n", " function(**kwargs)\n", " delta_time = time.time() - start_time\n", " times = times + [delta_time]\n", " # print(delta_time)\n", "\n", " # return median of measurements to ignore warmup-effects\n", " return np.median(times)\n", "\n", "\n", "\n", "def benchmark_size(method_np, method_cle, method_cle_alloc):\n", " times_ref = []\n", " times_cle = []\n", " times_cle_alloc = []\n", " sizes = []\n", " for size in [1, 2, 4, 8, 16, 32, 64]:\n", "\n", " input1 = np.zeros((1024, 1024, size))\n", " cl_input1 = cle.push(input1)\n", " cl_input2 = cle.create(cl_input1.shape)\n", "\n", " time_ref = benchmark(method_np, {\"image\":input1})\n", " time_cle = benchmark(method_cle, {\"image\":cl_input1, \"output\":cl_input2})\n", " time_cle_alloc = benchmark(method_cle_alloc, {\"image\":cl_input1})\n", "\n", " times_ref = times_ref + [time_ref]\n", " times_cle = times_cle + [time_cle]\n", " times_cle_alloc = times_cle_alloc + [time_cle_alloc]\n", " sizes = sizes + [size]\n", "\n", " plt.plot(sizes, times_ref, 'r--', sizes, times_cle, 'g--', sizes, times_cle_alloc, 'b--');\n", " plt.ylabel('Time / ms')\n", " plt.xlabel('Image size / MB')\n", " plt.legend((\"ref\", \"cle\", \"cle+alloc\"));\n", " plt.show()\n", "\n", "\n", " print(\"\\nSizes (MB) \" + str(sizes))\n", " print(\"Times ref (s) \" + str(np.round(times_ref, 4)))\n", " print(\"Times cle (s) \" + str(np.round(times_cle, 4)))\n", " print(\"Times cle+alloc (s) \" + str(np.round(times_cle_alloc, 4)))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Thresholding" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYgAAAEGCAYAAAB/+QKOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAAAwi0lEQVR4nO3dd3hUZfbA8e8BQlVQCbpKgEQFlC4GFQFFUQQLroqCFSw/VBYVxYZd1F3ZdUFQLKwI1gVEWbG7KogIosEFEalSJFjoTWqS8/vj3JiQhDBAJndmcj7PMw8z972ZOTdM5szbRVVxzjnnCioXdgDOOedikycI55xzRfIE4ZxzrkieIJxzzhXJE4RzzrkiVQg7gJKSnJysqampYYfhnHNxZcaMGatVtVZRZQmTIFJTU8nIyAg7DOeciysismx3Zd7E5JxzrkieIJxzzhXJE4RzzrkiJUwfRFF27txJZmYm27ZtCzuUuFa5cmVSUlJISkoKOxTnXClK6ASRmZnJgQceSGpqKiISdjhxSVVZs2YNmZmZpKWlhR2Oc64UJXQT07Zt26hZs6Ynh/0gItSsWdNrYc6VQQmdIABPDiXAf4fOlU0JnyCccy5hqcK8eVF7ek8QMWLo0KEce+yxXH755WGH4pyLB5mZcPbZkJ5u96MgoTupY42qoqqUK1c4Lz/zzDN88sknpKSkhBCZcy6ujBkD118PO3fCwIFwxBFReRmvQUTZ0qVLadiwIVdddRVNmjThkUceoVWrVjRr1owHH3wQgBtuuIHFixfTuXNnBg8eHHLEzrmYl50NTZvCrFnQpw8U8aWzJJStGkT79oWPXXIJ9O4NW7ZYda2gnj3ttno1dO26a9mkSRG97MKFC3nppZfYuHEj48aN4+uvv0ZV6dKlC5MnT+a5557jww8/ZOLEiSQnJ+/lRTnnEp4qjB4Nv/8O110Hl14K3btHLTHk8hpEKahXrx4nnXQSH3/8MR9//DHHHXccLVu2ZN68eSxcuDDs8JxzsWzlSvtyetll8PrrlixEop4coKzVIIr7xl+1avHlyckR1xgKqlatGmB9EP379+f666/fp+dxzpUx48bBjTfCxo3w+OPQr58lh1LiNYhSdNZZZ/Hiiy+yefNmAFasWMHKlStDjso5F5PmzIGLL4Z69eDbb+Guu6BC6X6nL1s1iJB17NiRuXPn0rp1awAOOOAAXn31VQ499NCQI3POxYx58+CYY6BxY/jwQzj9dAhpHTRR1VBeuKSlp6drwQ2D5s6dy7HHHhtSRInFf5fORdm6ddC3L7z6KkyfbvMbSoGIzFDVIl/MaxDOORe2Dz6w0Um//Qb33gvNmoUdEeB9EM45F64+fWyI/cEHW81hwACoWDHsqABPEM45F660NOuAnjEDjj8+7Gh24U1MzjlXmjZvhjvvhDPOgAsvtKGrMcprEM45V1o+/9z6F557Dn74Iexo9sgThHPORduWLXDLLbbcT7lyMHky3Hdf2FHtkSeIEDz00EM88cQTYYfhnCstH3wAQ4fCTTfZAntt24YdUUS8D8I556Jh61bIyIB27ayvYdasmBm+GimvQZSCl19+mWbNmtG8eXOuvPLKXcp+/PFHOnXqxPHHH0+7du2YF8XdoZxzpWT6dGjZEjp1glWrbP2kOEsOUMZqEO1HtS907JLGl9C7VW+27NzC2a8VXu67Z4ue9GzRk9VbVtN17K7LfU/qOWmPrzlnzhweffRRpk6dSnJyMmvXrmXo0KF/lPfq1YvnnnuO+vXrM336dHr37s1nn32219fmnIsB27fDww/nbeIzfjzUqhV2VPusTCWIMHz22WdcfPHFf+zzcMghh/xRtnnzZqZOncrFF1/8x7Ht27eXeozOuRKwbRuceCJ89x1ccw0MGgQ1aoQd1X4pUwmiuG/8VZOqFlueXDU5ohrD3sjJyeGggw5i5syZJfq8zrlSlLs/Q+XKcNFF8Ne/wjnnhB1VifA+iCg7/fTTeeONN1izZg0Aa9eu/aOsevXqpKWl8cYbbwC2X8SsWbNCidM5tw+++w5atYJp0+zxAw8kTHIATxBR17hxY+69915OPfVUmjdvzm233bZL+WuvvcaIESNo3rw5jRs35u233w4pUudcxLKy4LHHbMXV5cth06awI4qKMtXEFJYePXrQo0ePIsvS0tL48MMPSzki59w+mzsXevSAb76Bbt3g6adtx8kEFNUahIh0EpH5IrJIRO4uorySiIwJyqeLSGqB8roisllEbo9mnM45F7F33oHFi2HsWBg9OmGTA0QxQYhIeWAY0BloBFwqIo0KnHYtsE5VjwYGAwMLlA8CPohWjM45F5EFCyB3+Hm/flaLyDf6MFFFswZxArBIVRer6g5gNHB+gXPOB14K7o8DOojYjtwi8mdgCTAnijE659zu5eTAk09C8+bQuzdkZ0P58nE9t2FvRDNB1AaW53ucGRwr8hxVzQI2ADVF5ADgLuDh4l5ARHqJSIaIZKxatarEAnfOOX780RbXu/VWW5p74kRLDmVIrHZSPwQMVtXNQYWiSKo6HBgOtid16YTmnEt4ixZZrSEpCUaNgquusrkOZUw0E8QKoE6+xynBsaLOyRSRCkANYA1wItBVRP4OHATkiMg2VX06ivE658q6bdtswttRR9ly3FdeCSkpYUcVmmg2MX0D1BeRNBGpCHQHJhQ4ZwKQO/6zK/CZmnaqmqqqqcCTwF8TKTlEe7nvAw44AIClS5fSpEmTqL2OcwlDFV54AVJTYeFCqy3071+mkwNEMUEEfQp9gI+AucBYVZ0jIgNEpEtw2gisz2ERcBtQaCisg/bt27N06dKww3AuMWVmQufO8H//B40aQaVKYUcUM6I6D0JV31fVBqp6lKo+Fhx7QFUnBPe3qerFqnq0qp6gqouLeI6HVDWud9eJxnLfmzdvpkOHDrRs2ZKmTZvucQb2tm3buPrqq2natCnHHXccEydOBCA7O5vbb7+dJk2a0KxZM5566ql9u0jn4tFLL0GTJvDFFzbh7ZNPoG7dsKOKGbHaSR0V7dsXPnbJJTZ6bcsWOLvwat/07Gm31auh666rfTNp0p5fM1rLfVeuXJnx48dTvXp1Vq9ezUknnUSXLl3YXaf+sGHDEBFmz57NvHnz6NixIwsWLGDkyJEsXbqUmTNnUqFChV3WinIu4c2YAU2bwsiRcPTRYUcTc8pUggjDvi73PXLkSIYMGQLAokWLOPvss6lYsSJpaWmMHz8eVeWee+5h8uTJlCtXjhUrVvDbb7/xpz/9qcg4pkyZwk033QTAMcccQ7169ViwYAGffPIJN9xwAxUqVCgUn3MJR9VmP6emQuvW8I9/QIUKZW74aqTKVIIo7ht/1arFlycnR1Zj2BvFLfd99dVXc/XVVwPWBzFq1ChSU1P/KH/ttddYtWoVM2bMICkpidTUVLZt21ayATqXSFautOaCN9+EK66wBOH9DcXy1VyjLFrLfW/YsIFDDz2UpKQkJk6cyLJly4o9v127drz22msALFiwgJ9++omGDRty5pln8vzzz5OVlVUoPucSxrhx0LixraM0cKDNbXB75AkiyqK13Pfll19ORkYGTZs25eWXX+aYY44p9vzevXuTk5ND06ZN6datG6NGjaJSpUpcd9111K1b949O9Ndff32fr9W5mPT227ZuUmoq/O9/cOed3qQUIVFNjAnI6enpmpGRscuxuXPncuyxx4YUUWLx36WLOytXwqGH2vpJI0faaJMKZapVPSIiMkNV04sq8xqEcy6xrFtnS2M0aQKrVllt4brrPDnsA08QzrnE8cEHlhhefx1uvBFq1Ag7oriW8ClVVXc7N8BFJlGaIV0C27nTEsKIEZYgJkyA448PO6q4l9A1iMqVK7NmzRr/gNsPqsqaNWuoXLly2KE4t3sVKsDGjbZ+UkaGJ4cSktA1iJSUFDIzM/G9IvZP5cqVSSnji5a5GLRpE9xzD9x8M9SvbxPgyiX0d95Sl9AJIikpibS0tLDDcM6VtEmT4OqrYdkym99Qv74nhyjw36hzLn78/rvVGE47zUYnTZ4MN9wQdlQJyxOEcy5+PPEEPPUU3HQTzJoFbduGHVFCS+gmJudcAti6FVassNVWb7/dag+nnBJ2VGWC1yCcc7Fr+nRo2RLOOQeysqBaNU8OpcgThHMu9mzfbiOUTj7Z+h2eftpnQofAf+POudjy889w1lnw/fdwzTUwaJDPiA6J1yCcc7HlsMOgYUN47z2bGe3JITSeIJxz4fvuO+jY0VZgLV/e9m8oag9gV6o8QTjnwpOVBY89BunpliQWLw47IpeP90E458Lxww/Qo4etndS9u3VE16wZdlQuH08QzrlwDBgAS5fC2LG245uLOZ4gnHOlZ/58G6561FE2I1rVdn1zMcn7IJxz0ZeTA4MHQ4sWcMstdqxWLU8OMc5rEM656PrxR1t59Ysv4Nxz4fnnw47IRcgThHMuer74Ajp1gqQkGDXK9or2HR7jhjcxOedKXk6O/duyJVx2mc2K7tHDk0Oc8QThnCs5qvCvf8EJJ8CWLba43r/+Bb4jYVzyBOGcKxmZmdC5M/TqZctjbNoUdkRuP3mCcM7tH1XrX2jSxPochg2D//7X1lRycc07qZ1z+ycnB4YPh2bNYORIm+PgEoInCOfc3lOFMWOgQwebzzBhAhxyCJTzRolE4v+bzrm9s3IlXHQRXHopDBlix5KTPTkkoKj+j4pIJxGZLyKLROTuIsoriciYoHy6iKQGx08QkZnBbZaIXBDNOJ1zEXrjDWjcGN5/H/7+d3j44bAjclEUtQQhIuWBYUBnoBFwqYg0KnDatcA6VT0aGAwMDI5/D6SragugE/C8iHhzmHNhGjIELrkE0tLg22/hjjts7waXsKL5oXsCsEhVFwOIyGjgfOCHfOecDzwU3B8HPC0ioqpb8p1TGdAoxumcK86WLVC1qjUp7dgBt97q+0OXEdFsYqoNLM/3ODM4VuQ5qpoFbABqAojIiSIyB5gN3BCU70JEeolIhohkrFq1KgqX4FwZtm6dLY1x5pmQnW0L691xhyeHMiRme5VUdbqqNgZaAf1FpHIR5wxX1XRVTa9Vq1bpB+lconrvPZvX8O9/W4LIXTrDlSnRTBArgDr5HqcEx4o8J+hjqAGsyX+Cqs4FNgNNohapc85s2gTXXGOrrh58MEyfDg89ZIvtuTInmgniG6C+iKSJSEWgOzChwDkTgB7B/a7AZ6qqwc9UABCResAxwNIoxuqcAxuqOnUq9O8PM2bYYnuuzIpaY6KqZolIH+AjoDzwoqrOEZEBQIaqTgBGAK+IyCJgLZZEANoCd4vITiAH6K2qq6MVq3Nl2qZNNmS1f39bXG/mTKhcqEXXlUGimhgDhNLT0zUjIyPsMJyLLxMnWpPSsmXwn/9Aly5hR+RKmYjMUNX0osr22MQkItVEpFxwv4GIdBERb5B0Lp79/jvcfDOcfrqNSvriC08OrpBI+iAmA5VFpDbwMXAlMCqaQTnnoqxXL3jqKUsSs2ZBmzZhR+RiUCQJInfi2oXAM6p6MdA4umE550rc1q02twHgwQeteWnIEJsE51wRIkoQItIauBx4Lzjm8+udiyfTp9uIpF697HGDBtC+faghudgXSYLoC/QHxgejkI4EJkY1Kudcydi+3UYnnXyy9TvkJgjnIrDHYa6q+jnweb7Hi4GboxmUc64EzJsHXbvCnDlw3XXwxBO2FahzEdpjghCRdOAeIDX/+araLHphOef22yGH2Ail99+3vaKd20uRTJR7DbgDWzTPF2RxLpbNmmV7Qj/7rC2u97//gUjYUbk4FUkfxCpVnaCqS1R1We4t6pE55yK3cyc8+ii0agVvvw2LF9txTw5uP0RSg3hQRF4APgW25x5U1beiFpVzLnJz5kCPHrZ2UvfuNr8hOTnsqFwCiCRBXI0tlpdEXhOTAp4gnAtbTo4lhV9/hbFj4eKLw47IJZBIEkQrVW0Y9Uicc5FbsABSUmyS2+uvw2GHWZ+DcyUokj6IqUXsJe2cC0N2NgweDM2bw8MP27GmTT05uKiIpAZxEjBTRJZgfRACqA9zda6ULVoEV18NU6bYhj59+4YdkUtwkSSITlGPwjlXvLfegiuvtJ3dRo2yvaJ9hJKLskhmUvuQVufC1qQJdOxoI5RSUsKOxpUR0dxy1Dm3r1ThX/+yzXxUbXG98eM9ObhS5QnCuViTmWlLY/TqZTu9bd0adkSujNptghCRj0TkVhE5pjQDcq7MUrX+hSZNbIe3YcPgv//1/RpcaIqrQfQA1gEPici3IvKsiJwvItVKKTbnypb16+GOO2wI6+zZ0Ls3lPNKvgvPbt99qvqrqo5S1e5AOvAycDzwsYh8IiJ3llaQziUsVXjvPZvfcPDB8OWXttPbkUeGHZlzkfVBqGqOqk5T1QdUtQ3QHVgR3dCcS3C//QYXXWRzGl591Y41aOC1BhczIpkHUYiqrsaWAXfO7Ys33oAbb4TNm+Ef/4Arrgg7IucK8a8qzpW2u+6CSy6xZqRvv4Xbb4fyvs27iz37VINwzu2D7GxLBF262Nafd95pO745F6P2WIMQkcNEZISIfBA8biQi10Y/NOcSxNq11oTUr589btMG7rnHk4OLeZE0MY0CPgKOCB4vAPpGKR7nEst779m8hjFjbJSSatgRORexSBJEsqqOJdgsSFWzgOyoRuVcvFu/3pbJOPdcqFkTpk+HBx/0BfZcXIkkQfwuIjWxXeQQkZOADVGNyrl4t2aN7fDWvz9kZEDLlmFH5Nxei6QR9DZgAnCUiHwJ1AK6RjUq5+LR7NmWFB55BI46CpYsgVq1wo7KuX22xxqEqn4LnAqcDFwPNFbV76IdmHNxY9Mm64A+7jh49llbbA88Obi4t8cahIiUB84GUoPzO4oIqjooyrE5F9tUrfO5Xz/45Re47jr429+sz8G5BBBJE9M7wDZgNkFHtXMOqznccovt0fDWW3DiiWFH5FyJiiRBpPj+084Ffv8dnn8ebr4ZqleHyZPh6KN9JrRLSJGMYvpARDruy5OLSCcRmS8ii0Tk7iLKK4nImKB8uoikBsfPFJEZIjI7+Pf0fXl950qMqtUSjj3WmpQ+/dSON2zoycElrEgSxFfAeBHZKiIbRWSTiGzc0w8FfRfDgM5AI+BSEWlU4LRrgXWqejQwGBgYHF8NnKeqTbF9KV6J7HKci4KFC+Hss23l1YMPts18zjor7Kici7pIEsQgoDVQVVWrq+qBqlo9gp87AVikqotVdQcwGji/wDnnAy8F98cBHUREVPV/qvpzcHwOUEVEKkXwms6VLFW49FLbp2HwYJgxA9q2DTsq50pFJH0Qy4HvVfd6jYDawc/mygQK9uL9cY6qZonIBqAmVoPIdRHwrapuL/gCItIL6AVQt27dvQzPuWK8/76tmVSjBowcaSOTjjhizz/nXAKJpAaxGJgkIv1F5LbcW7QDAxCRxliz0/VFlavqcFVNV9X0Wj7m3JWEpUvhz3+Gc86Bp56yY02benJwZVIkNYglwa1icIvUCqBOvscpFN6FLvecTBGpANQA1gCISAowHrhKVX/ci9d1bu9t3w5PPAGPPWY7ug0cCH37hh2Vc6HaY4JQ1Yf38bm/AeqLSBqWCLoDlxU4ZwLWCT0NW77jM1VVETkIeA+4W1W/3MfXdy5yN98Mw4dD164waBDUqbPnn3Euwe02QYjI06raR0TeIVioLz9V7VLcEwd9Cn2wpcLLAy+q6hwRGQBkqOoEYATwiogsAtZiSQSgD3A08ICIPBAc66iqK/fy+pzbvdwlMVJS4I474MILfXSSc/nI7vqeRWSjqlYXkVOLKlfVz6Ma2V5KT0/XjIyMsMNw8WDnTnjySXj4Yejc2faHdq6MEpEZqppeVFlxTUw/QuwlAuf2y6RJ8Je/wA8/2Naff/972BE5F7OKSxC1ihut5Iv1ubgzahRcfTWkpsI779hmPs653SouQZQHDgB8CywXv7Ky4LffoHZtOP9826uhXz+oUiXsyJyLecUliF9UdUCpReJcSZs6FXr3tm0+MzJsmYz77gs7KufiRnET5bzm4OLTqlW2H3SbNrB2Ldx/v81tcM7tleJqEB1KLQrnSsrMmXD66bZXw113WXKoVi3sqJyLS7tNEKq6tjQDcW6/bNoEBx4IjRrZfIZ+/WxpbufcPvN6t4tva9bADTdYYti4ESpWhBde8OTgXAnwBOHiU04OjBhhG/a88AJcfLH3MzhXwiJZrM+52LJ+vW3gM22a7c0wbBg0811xnStpniBc/MjOtu09a9SAI4+E66+Hq66yYazOuRLndXIX+1ThlVegQQP46SdLCK++Cj16eHJwLoo8QbjY9v330L691RSSk2HLlrAjcq7M8AThYpMq3HkntGhhSWL4cOtzOOaYsCNzrszwBOFik4gNW73mGpg/H/7v/3yUknOlzP/iXOyYNw86doTp0+3xM89YzSE5Ody4nCujPEG48P3+O/Tvb0NVv/4ali+3415jcC5U/hfowvXOOzYL+vHH4bLLrDmpa9ewo3LO4fMgXNi+/97mNUyeDO3ahR2Ncy4fr0G40rV1Kzz4ILz1lj2+/XaYMcOTg3MxyBOEKz3vvQdNmsCAATBlih1LSrKbcy7meIJw0bdsGfz5z7YHdMWK8OmnMMi3NHcu1nmCcNE3bRr897/WET1rlm3o45yLed5J7aLjk08gMxN69oRu3Wy5jD/9KeyonHN7wWsQrmRlZlpCOPNMePJJW4FVxJODc3HIE4QrGTt3whNP2FpJEyZYR/RXX9ny3M65uORNTK5kzJoFd9xhHdFDh0JaWtgROef2k9cg3L779Vd4+WW7n54OM2fazGhPDs4lBK9BuL2XlWUL6d1/vzUtnXUWHHYYNG8edmTOJbT162HJErstXmzdfXXqRO/1PEG4vTNtGvTubbWFjh3h6actOTjn9tu2bbB0aV4SaN/eliqbMgXOO88SRH7163uCcLFi7Vo44ww45BAYNw4uvNC3/HRuL2Rn20C/3ATQuDGccILdb9sWfv551/OHDrUEUbeurWWZlmbbsael2e2gg6IbrycIV7ydO+Hdd20m9CGH2AilE0+EAw4IOzLnYo4qrF5tzT9LlsDhh8Opp9oSZE2b2qICWVl5599+uyWIQw+1Cnn+D/+0tLzR4XXrwrBhpX89niBc0VTh7bfhrrtgwQJbHuP006FDh7Ajcy5Umzfn1QAqVbIuOIA2bWww3++/553bvbsliCpV4JRTrDU298P/yCPzmoeqVYORI0v/WvYkqglCRDoBQ4DywAuq+niB8krAy8DxwBqgm6ouFZGawDigFTBKVftEM05XwFdf2ZDVKVPg2GOt1nDaaWFH5Vyp2LEDfvrJEsDWrdClix2/9FJbIGD16rxz27TJSxDHHw+tWu1aA8g/oO/FF0vvGkpK1BKEiJQHhgFnApnANyIyQVV/yHfatcA6VT1aRLoDA4FuwDbgfqBJcHOlZccOuOgiayx9/nnbE7qCVzRd4sjJsRHaS5bAypVwwQV2/K67YPRo6yPIybFjderkJYj69aF69V0//I88Mu95hw4t3esoDdH8yz8BWKSqiwFEZDRwPpA/QZwPPBTcHwc8LSKiqr8DU0Tk6CjG53KtXm2jke65x1ZbfecdaNDA+xlc3Fq3Lq8Z6IILbPfaoUPh2Wft2Pbtdl6FClZLqFDBmn9OOaVwR3CuAQPCuZYwRTNB1AaW53ucCZy4u3NUNUtENgA1gdVEQER6Ab0A6tatu7/xlj1bt8KQIfC3v1nD6imnWD9Dy5ZhR+ZcsXKHgy5ebHtNHXggvPGGvZUXL4YNG/LOzcyE2rXt23/jxjbZP38tIHfr89tuC+VSYlpctx2o6nBgOEB6erqGHE78yMmBV16B++6zv57zzoOBA62/wbkYkH84aOPGUKuW7Urbv78d++WXvHOnTYOTToLKlW3Uz8kn75oAatWy83r2tJuLXDQTxAog/xSOlOBYUedkikgFoAbWWe2ibcgQG4P36qs2zMK5UqQKq1bZh33t2pCSAnPnwk032bGffsobDjp2LFx8sY0YqlgROnXaNQE0bWrnnXee3VzJiWaC+AaoLyJpWCLoDlxW4JwJQA9gGtAV+ExVvSYQDbNmWSPq8OFQsyZ88IF9tSrny3G56MgdDnrAAfZBvnq1jXnI7RvIHQ76z39a806VKrBpk40E6tYtLwEcd5ydd+KJMHFieNdTFkUtQQR9Cn2Aj7Bhri+q6hwRGQBkqOoEYATwiogsAtZiSQQAEVkKVAcqisifgY4FRkC5SGRmWlPSyy/btMvZs23+vi+P4fZT7nBQVRvhk50Nl1+eN0ksdzho374weLAliqVLrQO4Q4e8zuDcBJCaCtOnh3QxrkiSKF/Y09PTNSMjI+wwYkdOjiWGwYPtL/jmm60B9+CDw47MxYnc4aCbNkHDhnasb19bhmvxYlixws658EJ4800rb93aOozzNwEdd5wNinOxSURmqGp6UWVx3UntiqBq6yOVKwfz59uchsceg3r1wo7MxaB166wvIPcD/PHH4fPPrQawdKkNBz3hhLxv9gsXWt9A+/aF+wDAOoxd4vAEkShU7Wvc/ffDf/5jX/nGjPFJbmXc1q3Wyli/vj0eOdKmueT2A2zYYGMVcheJmz/fJo81aWIdvmlpuw5ue++90r8GFx7/9EgEX35pq3599ZWNCcwdBO7JIeHlDgdNSbHdXd9912YD5yaAX36xCuW2bTYCaO5cmDfPPvjbtCk8GzgW1wNy4fFPkHimamsAjx5tXwNfeMEGevs+0AkjdzhojRo2zHPqVPsQz00AucNBlyyxTt4FC2wJrbS0vOGgRx5pzwPw97/bzblIeIKIR+vX24gkEWs7GDDAxglWqxZ2ZG4fbNpkOb1qVft2n7scRO5ooC1bbJJYu3awfLmtnZiWZn0DucNBa9Sw57rtNp8R7EqOj2KKJ1u2wKBBNuv57bdtWQwX83bssG01qlWzUUFPPrnrtpFr1sBrr1llcMoU6Ny58HpAF1xgC8fljkFwrqT4KKZ4l50No0bBAw9Yb+Kf/xzdfQbdLnbssGacqlXtA3raNPvWn//WrJmN7NmyBW680Y6tWWNJIDPT1gi66y57rkGDbFBZWpoNMktLgxYt7LXatIGNG3efBDw5uNLkCSLWqcKZZ9oU0pNOspFJbduGHVVMy8mxWbz5P8ArVbIPcYCXXsob3597a94cbrnFytu0sTycW7Zjh80AHjHCytu1y1sOOlefPpYgype35qADD7RWwNzhoKecYufVqWMji3bXTeQJwMUSTxCx6rvvbERS+fJw7bX2tbRr14T8BFG1UTZVqtjjhQt3/YDO/YDv0cPKBw60yVr5y486ylbzBFuMdtasXV+jffu8ZRoefRQWLbKpIgccYB/mFSvmnduwoTXvHHhg3i13gVsR+PBDq03kllWvbv+Cxblkye6vVcTHELj44Qki1ixbZjOgX33Vhqv07GnrF8SYHTsKN7O0bm0fgF9+CRkZu5bt2GGDrMCmaowbl1e2ebMtD7VypZXfcYd1seRXr15egpg5E2bMyPuArl3bRvDkuvlmmwCW/wP+iCPyyr/6ylb+rFq16Hy7p52/zjxzb35TzsUvTxCxYuNG+2o7dKh9at19d95WVyHIybFlmyZOhEmT4Mcf7X5yMjz4YNGbp2zebB2xb75pK3yAfTPP/Zadk2Pf2g891CZi5f8AP+SQvOe5/35b1bOob+gA//538bFfc03x5TVrRvQrcK7M81FMseL00+2T+Kqr4JFHSr0TWtU+wMuXt2/v115rnaxgzTdNm9oOpIceaksxTJmy6wf8gQfaJSQl2Ty9rKzCTTfOudjjo5hi1fr11mhdpYqtlyRiHdGlQNXa4SdOzLs99ZStu3/kkbbMwmmn2a1grjr11OK3kMgdk++ci2+eIMLy3nvQq5cNfv/HP6wBP8q2bbO291WrrNM1M9OOH364Lb+c207ftKkvueCc8wRR+tautTWTX3nFGuK7dYvaS61YYTWDzz6zf9u2tZdNTrbJWC1bWg2hQYOEHBzlnNtPniBK06RJcOmltpPK/ffDvfdaE1MJ2bQprzP3nHPg/fft/sEHW5NQ7ugbEdtYzjnniuMJojQddpiN13z//bxttPbDmjXWYZxbS/jlF2s+Kl8eunSxZqPTTrMJYj723jm3tzxBRNu4cVZzePppW1h/2rR9bs/ZsMHG7icl2TDSfv2ss7lqVZvde9VVNt+gShW4/vqSvQznXNnjCSJaVq6Ev/zFEkTLlnntP3uRHDZtsuGkuaOMvv3Wagqnnmr9CQMGWA2hVSsfTuqcK3meIEqaqq2X1KePfcI/9phNDU5K2uOPbt1qi73VrGkrbRx/vM0nSEqy0a/33Zc35LRVK7s551y0eIIoaevXW83h6KNtzYbGjYs9XdVqCc88A2+9ZXnln/+01qi777bawsknWzOSc86VJk8QJUHVOp47dbIhQ198YWNH97Dl54svWl/C99/b5LJeveDCC60sKckmVDvnXFjKhR1A3Pv5Zzj/fDj3XGtaAmjUaLfJYeHCvPtTplgieOEFm7Pw1FO21LRzzsUCr0HsjzFj4IYbYPt22wVmN5PeduyA8eOtGWnyZPj6a+s/GDbMZjb7JDXnXCzyGsS+evJJ6N7dagvffQe33lpossGGDbYJXL16dury5bZh/FFHWXmVKp4cnHOxy2sQ++rEE+G666wakG+MaU6OTVirXdtamYYNs07m3r3hrLNsuWvnnIsHniD2xubNMGGCLbDXuvUuC+ytW2dbWT77rCWBH36wvRGWLLH9DJxzLt7499kiqFq3Atg8hA0bYMviX9nRrgN65VWwYMEf5/7wg1Ukate2VqaaNW2Jpdw9iz05OOfilSeIAmbNgo4dbcdPsNnLBx0E1Y76E5VmTqdcThblj23wx/7Hs2fbDmdXXGHnTp1q933tI+dcvPMmpsAvv9hM5ZEjbSrDvffa8TorvuKfVd5lZ7lKZF11DTsPrU1Wlk1kA5u3cNZZlkSccy6ReILAOpLvusuGo956qyWKgw+2ssM3zOO2em/aRLi02oV+NinJk4NzLjF5ggCq6WY6tYWBd6+zIahby8PP62yZjJ49bYxq5cphh+mcc6XKEwTQY8uz9PzoTvgo38FKlaxToVEjTw7OuTLJEwQg554DRxwO2dk2bCk729qYjjkm7NCccy40UU0QItIJGAKUB15Q1ccLlFcCXgaOB9YA3VR1aVDWH7gWyAZuVtX83+9LVqNGdnPOOfeHqA1zFZHywDCgM9AIuFRECn4KXwusU9WjgcHAwOBnGwHdgcZAJ+CZ4Pmcc86VkmjWIE4AFqnqYgARGQ2cD/yQ75zzgYeC++OAp0VEguOjVXU7sEREFgXPNy1awbYf1b7QsUsaX0LvVr3ZsnMLZ792dqHyni160rNFT1ZvWU3XsV0Lld+YfiPdmnRj+YblXDn+ykLl/Vr347yG5zF/9Xyuf7fwHqH3nXIfZxx5BjN/nUnfD/sWKv9rh79ycp2Tmbp8Kvd8ek+h8ic7PUmLP7Xgk8Wf8OjkRwuVP3/u8zRMbsg789/hn9P+Waj8lQteoU6NOoz5fgzPZjxbqHzcJeNIrprMqJmjGDVzVKHy9y9/n6pJVXnmm2cYO2dsofJJPScB8MTUJ3h3wbu7lFVJqsIHl38AwCOfP8KnSz7dpbxm1Zq8ecmbAPT/pD/TMnd9a6RUT+HVC20yS98P+zLz15m7lDeo2YDh5w0HoNc7vViwZsEu5S3+1IInOz0JwBVvXUHmxsxdyluntOZvZ/wNgIvGXsSaLWt2Ke+Q1oH7T70fgM6vdWbrzq27lJ/b4FxuP/l2wN97/t7b//de7vWUtGhOlKsNLM/3ODM4VuQ5qpoFbABqRviziEgvEckQkYxVq1aVYOjOOedEVaPzxCJdgU6qel3w+ErgRFXtk++c74NzMoPHPwInYrWKr1T11eD4COADVR23u9dLT0/XjIyMqFyLc84lKhGZoarpRZVFswaxAqiT73FKcKzIc0SkAlAD66yO5Gedc85FUTQTxDdAfRFJE5GKWKfzhALnTAB6BPe7Ap+pVWkmAN1FpJKIpAH1ga+jGKtzzrkCotZJrapZItIHm35WHnhRVeeIyAAgQ1UnACOAV4JO6LVYEiE4byzWoZ0F/EVVs6MVq3POucKi1gdR2rwPwjnn9l5YfRDOOefimCcI55xzRfIE4ZxzrkieIJxzzhUpYTqpRWQVsCzC05OB1VEMJ9o8/vDF+zV4/OGLlWuop6q1iipImASxN0QkY3e99vHA4w9fvF+Dxx++eLgGb2JyzjlXJE8QzjnnilRWE8TwsAPYTx5/+OL9Gjz+8MX8NZTJPgjnnHN7VlZrEM455/bAE4RzzrkilakEISKdRGS+iCwSkbvDjicSIvKiiKwMNlfKPXaIiPxXRBYG/x4cZozFEZE6IjJRRH4QkTkicktwPC6uQUQqi8jXIjIriP/h4HiaiEwP3ktjgiXtY5aIlBeR/4nIu8HjeIt/qYjMFpGZIpIRHIuL9xCAiBwkIuNEZJ6IzBWR1vEQf5lJECJSHhgGdAYaAZeKSKNwo4rIKKBTgWN3A5+qan3g0+BxrMoC+qlqI+Ak4C/B7z1ermE7cLqqNgdaAJ1E5CRgIDBYVY8G1gHXhhdiRG4B5uZ7HG/xA5ymqi3yzR2Il/cQwBDgQ1U9BmiO/V/EfvyqWiZuQGvgo3yP+wP9w44rwthTge/zPZ4PHB7cPxyYH3aMe3EtbwNnxuM1AFWBb7FtcVcDFYLju7y3Yu2G7cj4KXA68C4g8RR/EONSILnAsbh4D2E7ZS4hGBQUT/GXmRoEUBtYnu9xZnAsHh2mqr8E938FDgszmEiJSCpwHDCdOLqGoHlmJrAS+C/wI7BeVbOCU2L9vfQkcCeQEzyuSXzFD6DAxyIyQ0R6Bcfi5T2UBqwCRgbNfC+ISDXiIP6ylCASktrXj5gfqywiBwBvAn1VdWP+sli/BlXNVtUW2DfxE4Bjwo0ociJyLrBSVWeEHct+aquqLbEm4r+IyCn5C2P8PVQBaAk8q6rHAb9ToDkpVuMvSwliBVAn3+OU4Fg8+k1EDgcI/l0ZcjzFEpEkLDm8pqpvBYfj6hoAVHU9MBFrkjlIRHK37I3l91IboIuILAVGY81MQ4if+AFQ1RXBvyuB8Viijpf3UCaQqarTg8fjsIQR8/GXpQTxDVA/GL1REdv/ekLIMe2rCUCP4H4PrF0/JomIYHuPz1XVQfmK4uIaRKSWiBwU3K+C9Z/MxRJF1+C0mI1fVfuraoqqpmLv+c9U9XLiJH4AEakmIgfm3gc6At8TJ+8hVf0VWC4iDYNDHYAfiIf4w+4EKc0bcDawAGtDvjfseCKM+d/AL8BO7JvItVgb8qfAQuAT4JCw4ywm/rZY1fk7YGZwOztergFoBvwviP974IHg+JHA18Ai4A2gUtixRnAt7YF34y3+INZZwW1O7t9uvLyHglhbABnB++g/wMHxEL8vteGcc65IZamJyTnn3F7wBOGcc65IniCcc84VyROEc865InmCcM45VyRPEC5hiMjmsGPYHRG5QUSuKqHnmiEilQocmyQiPwXzTnKP/Sf3dyIiqSKyNVgNdZaITM03Lt+5InmCcK4UqOpzqvry/j6PiKQBK1R1exHF67GZ0wST+w4vUP6j2mqozYGXgHv2Nx6X2DxBuIQjIu1F5HMReVtEFovI4yJyebCvw2wROSo477xgT4T/icgnInJYcLxWsD7/nGBhtWUikhyUXRE8z0wReT5YRr7g6z8utv/FdyLyRHDsIRG5XUSOCH4295YtIvWC13xTRL4Jbm12c3mdgA93UzYamy0NcCHw1m7OA6iOLfPt3G55gnCJqjlwA3AscCXQQFVPAF4AbgrOmQKcpLaA2mhsxVOAB7ElKRpj6+bUBRCRY4FuQBu1xfuygcvzv6iI1AQuABqrajPg0fzlqvpz8C2+BfAv4E1VXYatjzRYVVsBFwVxFqW4BPEpcEqQtLoDYwqUHxUkpR+B24BBBZ/Aufwq7PkU5+LSNxospRx8IH4cHJ8NnBbcTwHGBAulVcTW7AdbHuQCAFX9UERyv2l3AI4Hvgma+qtQeIG1DcA2YITY7m3vFhVcUEP4v+C1AM4AGuXrQqguIgeo6uZ8P1MRSFHVxbu55mws6XUHqqjq0nzPB0ETU/Bc3YDhFN6Myrk/eIJwiSp/G31Ovsc55L3vnwIGqeoEEWkPPLSH5xTgJVXtv7sTVDVLRE7AkklXoA+2gmrek1hCGgF0yZcAymG1mW3FvH47LAEUZzS22ulDezhvAjByD+e4Ms6bmFxZVoO8Za575Dv+JXAJgIh0xBZWA2vC6SoihwZlh4hIvfxPGOx7UUNV3wduxZq68pcnYYvj3aWqC/IVfUxe0xci0qKIeDsBH+zhmr4A/oYt8licttiilc7tltcgXFn2EPBG0IT0GbbzF8DDwL9F5EpgGrbb1yZVXS0i92E7m5XDVtj9C7As33MeCLwtIpWxGsdtBV7zZCAdeFhEHg6OnQ3cDAwTke+wv8vJWB9Kfu2BB4q7ILXVN5/YTfFRYjvjCbADuK6453LOV3N1roBgjkF20FzUGtsJrEXIMaUA/1LVzmHG4coWTxDOFSAi9YGxWBPsDqC3qn4TblTOlT5PEM4554rkndTOOeeK5AnCOedckTxBOOecK5InCOecc0XyBOGcc65I/w9A3yYfuDcGtwAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "Sizes (MB) [1, 2, 4, 8, 16, 32, 64]\n", "Times ref (s) [0.001 0.001 0.003 0.006 0.011 0.0219 0.0464]\n", "Times cle (s) [0. 0. 0. 0. 0. 0. 0.]\n", "Times cle+alloc (s) [0.0013 0.0019 0.0019 0.0038 0.0061 0.007 0.0117]\n" ] } ], "source": [ "# RED: thresholding of a numpy array\n", "def threshold_ref(image):\n", " thresholded = image > 100\n", " return thresholded\n", "\n", "# GREEN: thresholding of a pre-existing opencl array (no push, pull or alloc)\n", "def threshold_cle(image, output):\n", " cle.greater_constant(image, output, 100)\n", "\n", "# BLUE: allocate result memory + thresholding \n", "def threshold_cle_alloc(image):\n", " thresholded = cle.create(image.shape)\n", " cle.greater_constant(image, thresholded, 100)\n", "\n", "benchmark_size(threshold_ref, threshold_cle, threshold_cle_alloc)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Gaussian blur radius 2" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "scrolled": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "Sizes (MB) [1, 2, 4, 8, 16, 32, 64]\n", "Times ref (s) [0.0613 0.0773 0.1302 0.2473 0.5017 1.0191 2.0668]\n", "Times cle (s) [0.0048 0.0053 0.0064 0.0097 0.0176 0.0313 0.0498]\n", "Times cle+alloc (s) [0.0035 0.0055 0.0083 0.0125 0.0223 0.035 0.0601]\n" ] } ], "source": [ "from skimage.filters import gaussian\n", "\n", "radius = 2\n", "\n", "def gaussian_blur_filter_ref(image):\n", " filtered = gaussian(image, sigma=radius)\n", " return filtered\n", "\n", "def gaussian_blur_filter_cle(image, output):\n", " cle.gaussian_blur(image, output, radius, radius, radius)\n", "\n", "def gaussian_blur_filter_cle_alloc(image):\n", " filtered = cle.create(image.shape)\n", " cle.gaussian_blur(image, filtered, radius, radius, radius)\n", "\n", "benchmark_size(gaussian_blur_filter_ref, gaussian_blur_filter_cle, gaussian_blur_filter_cle_alloc)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Gaussian blur radius 10" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXgAAAEGCAYAAABvtY4XAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAAAugUlEQVR4nO3dd3hUZfbA8e+ZyYTQUQKIQCgWeo+AHVERWQu7KuoiiqKIbbEr6g9xd93VtXdFsbBiBbFgQ/oiCgZEehENGiw0AQMEMjPn98d7iaEkBJLJnZmcz/PMMzP3ndx7JpmcvHnve88rqooxxpjkE/A7AGOMMbFhCd4YY5KUJXhjjElSluCNMSZJWYI3xpgkleJ3AIWlp6drkyZN/A7DGGMSxpw5c9apap29tcVVgm/SpAlZWVl+h2GMMQlDRFYV1WZDNMYYk6QswRtjTJKyBG+MMUkqrsbg9yY/P5+cnBzy8vL8DiVhpaWl0bBhQ0KhkN+hGGPKUdwn+JycHKpXr06TJk0QEb/DSTiqyvr168nJyaFp06Z+h2OMKUdxP0STl5dH7dq1LbkfIBGhdu3a9h+QMRVQ3Cd4wJJ7Kdn3z5iKKSESvDHGJK0lS2K265gleBFpLiLzCt02i8j1sTqe3x5//HFatmxJv379/A7FGJMIcnPhuuugdWt4772YHCJmJ1lVdRnQAUBEgsBqYFysjlceVBVVJRDY8+/i008/zcSJE2nYsKEPkRljEs6AAfDOOy7Jn3xyTA5RXkM0JwMrVbXIS2rjVXZ2Ns2bN+fiiy+mTZs2/OMf/+Coo46iXbt23H333QAMHjyY7777jtNPP51HHnnE54iNMXFr40b47Tf3+J574H//g8ceg2rVYnK48pomeQHw+t4aRGQQMAggIyNj33vq3n3PbX37wtVXw9at0Lv3nu0DBrjbunVw7rm7tk2dus9DrlixgldeeYXNmzczZswYZs+ejapy1llnMX36dJ599lk++eQTpkyZQnp6+r7fgzGm4nnvPbjqKjj1VHjlFTc0E2Mx78GLSCpwFvD23tpVdYSqZqpqZp06ey2I5rvGjRvTrVs3JkyYwIQJE+jYsSOdOnVi6dKlrFixwu/wjDHxbO1auPBC6NMH6taFIUPK7dDl0YM/HZirqr+Wyd6K63FXqVJ8e3p6iXrsu6tatSrgxuCHDh3KlVdeud/7MMZUQNOmuVGDzZvhH/+A226DcryivDzG4C+kiOGZRHPaaafx4osvkpubC8Dq1atZs2aNz1EZY+LWEUdA584wdy7cdVe5JneIcQ9eRKoCpwJJ0eXt2bMnS5Ys4eijjwagWrVqvPrqq9StW9fnyIwxcUEVRo6E8ePdDJlDD4VPPvEtnJgmeFXdAtSO5TFirUmTJixcuLDg+ZAhQxiylzG07OzscozKGBN3vv8eBg2CiRPdZJBNm+Cgg3wNya5kNcaY0ohG4fHHoU0bmDULnn0WJk3yPblDAlSTNMaYuLZ1KzzyCJx4Ijz3HDRq5HdEBawHb4wx+yschqefhrw8d5HSzJnw4YdxldzBErwxxuyfb76Brl3hmmtg7Fi3rX59iMOqrZbgjTGmJLZvh2HDIDMTVq+GMWMgzosL2hi8McaUxOWXw6uvwsUXuzH3gw/2O6J9sh78ARg+fDgPPvig32EYY2Jt61ZXIAzg9tvho49cHZkESO5gCd4YY/Zu6lRo186V8wVXHOz0030NaX9Zgi+BUaNG0a5dO9q3b0///v13aVu5ciW9evWic+fOHH/88SxdutSnKI0xZWLzZlf18aST3POBA/2NpxQSbgy++8vd99jWt3Vfrj7qarbmb6X36D3LBQ/oMIABHQawbus6zn1r13LBUwdMLfZ4ixYt4p///CczZ84kPT2dDRs28Pjjjxe0Dxo0iGeffZYjjjiCWbNmcfXVVzN58uQDem/GGJ/Nnu2Kg61eDTfdBH//uytimKASLsGXt8mTJ3PeeecV1Hk/uNDYW25uLjNnzuS8884r2LZ9+/Zyj9EYU0YaNYKMDHj7bTcVMsElXIIvrsddJVSl2Pb0Kun77LHvj2g0Sq1atZg3b16Z7dMYU87GjoW33oLXX3fz2WfM8DuiMmNj8PvQo0cP3n77bdavXw/Ahg0bCtpq1KhB06ZNefttt5aJqvLNN9/4EqcxZj/98osbjjn3XPj2W/B+x5OJJfh9aN26NXfeeScnnngi7du358Ybb9ylffTo0YwcOZL27dvTunVr3ovR6ujGmDKiCqNGQatWrqzvffe5ImFxuqJcaYiq+h1DgczMTM3Kytpl25IlS2jZsqVPESUP+z4a49m61U15PPRQePFFaN7c74hKRUTmqGrm3tqsB2+MSX7RKPz3v6442M6lPadPT/jkvi+W4I0xyW3lSjj5ZFdiYNQot61xYwgG/Y2rHFiCN8Ykp0gEHn4Y2raFr7+GF16AK67wO6pylXDTJI0xpkSuucYtwHHmmfDMM9Cggd8RlbtYL7pdC3gBaAMocJmqfhHLYxpjKrD8fNi2DWrUgGuvdassXXBBXNZqLw+xHqJ5DPhEVVsA7YElMT6eMaaimjsXjjrK1ZEBt0bqhRdW2OQOMUzwIlITOAEYCaCqO1R1Y6yOV55iXS64WrVqAGRnZ9OmTZuYHceYpJCXB0OHQpcusGYN9O3rd0RxI5Y9+KbAWuAlEflaRF4Qkaq7v0hEBolIlohkrV27Nobh+Kd79+5kZ2f7HYYxyWfBAujQwV2sdMklsHgxnH2231HFjVgm+BSgE/CMqnYEtgC37/4iVR2hqpmqmlknTq8ki0W54NzcXE4++WQ6depE27Zt93kFbF5eHpdeeilt27alY8eOTJkyBYBIJMLNN99MmzZtaNeuHU888cSBvUljElF6upvXPmECjBwJtWr5HVFcieVJ1hwgR1Vnec/HsJcEv7+6d99zW9++cPXV7gK13ntWC2bAAHdbt86VnShs6tTijxercsFpaWmMGzeOGjVqsG7dOrp168ZZZ52FFDFe+NRTTyEiLFiwgKVLl9KzZ0+WL1/OSy+9RHZ2NvPmzSMlJWWXWjnGJKWJE9189pdfdsXB5syp0OPsxYlZglfVX0TkRxFprqrLgJOBxbE6XqwcaLngl156icceewyAb7/9lt69e5OamkrTpk0ZN24cqsodd9zB9OnTCQQCrF69ml9//ZVDDjlkr3HMmDGD67yVZVq0aEHjxo1Zvnw5EydOZPDgwaSkpOwRnzFJZeNGuPlm11M/8kj4+Wc39dGSe5FiPQ/+OmC0iKQC3wGXlnaHxfW4d16BXJT09H332PdHceWCL730Ui691L3d7t278/LLL9OkSZOC9tGjR7N27VrmzJlDKBSiSZMm5OXllV1wxiSTDz6AwYNdBcjbboO774bKlf2OKu7FdJqkqs7zxtfbqWofVf0tlseLhViVC960aRN169YlFAoxZcoUVq1aVezrjz/+eEaPHg3A8uXL+eGHH2jevDmnnnoqzz33HOFweI/4jEkK27fDkCFQu7ar+njffZbcS8hKFexDrMoF9+vXj6ysLNq2bcuoUaNo0aJFsa+/+uqriUajtG3blvPPP5+XX36ZSpUqcfnll5ORkVFwEvi111474PdqTNxQhXffdRctVarkTqJmZUHmXosmmiJYueAKwr6PJmH89JO7WOn99+HRR13v3RTJygUbY+KfqqvP3qqV67E/8ICrJ2MOmCV4Y0x8uOUWGDgQ2reH+fPdjJkUq4dYGgnx3VPVIueHm32Lp2E4Y3YRjbpx9qpV4dJL4bDD4MorIWB9z7IQ99/FtLQ01q9fb0nqAKkq69evJy0tze9QjNnV8uWu2uPOGu2tW7uxd0vuZSbue/ANGzYkJyeHZK1TUx7S0tJo2LCh32EY44TDbiGOYcPcxSuXX+7G3+2/9DIX9wk+FArRtGlTv8MwxpSFFStcCd85c+Avf4GnnoIirt42pRf3Cd4Yk0SqVYMtW+Dtt/csDGXKnA12GWNia/ZsN84ejbriYIsWWXIvJ5bgjTGxsXWrm+p49NHw8cfwww9uu51ELTf2nTbGlL1p06BdO3joIXcSddEiKFRsz5QPG4M3xpSt/Hx3wZIqTJ4MJ53kd0QVliV4Y0zZmDQJjjnGVXr84APIyHAXMBnf2BCNMaZ0Nmxw66GecgrsXDKyZUtL7nHAevDGmAM3dqwrCLZuHdx5p1V+jDPWgzfGHJjhw910x0MPdbXa//lPV7vdxA3rwRtjSk4V8vLcOHvfvpCa6qpAhkJ+R2b2IqYJXkSygd+BCBAuqii9MSYB/Pijq/RYsya8/rqr296qld9RmWKUxxDNSarawZK7MQkqGoXnnnPVHqdNg27dXE/exD0bojHGFO2HH2DAAJgyBXr0gOefh2bN/I7KlFCse/AKTBCROSIyKMbHMsaUtdRUyM6GESNg4kRL7gkm1j3441R1tYjUBT4TkaWqOr3wC7zEPwggIyMjxuEYY/Zp8WJ45hl47DFXynfZMjuJmqBi2oNX1dXe/RpgHNBlL68ZoaqZqppZp06dWIZjjClOfr6b6tixozuJumKF227JPWHFLMGLSFURqb7zMdATWBir4xljSuHrr6FLF/i//4M+fVwvvnlzv6MypRTLIZp6wDhvsewU4DVV/SSGxzPGHIhIxK2ytGkTjBvnErxJCjFL8Kr6HdA+Vvs3xpTSrFmupG/lym6FpYYN4aCD/I7KlCErVWBMRbNli6sZc/TR8OCDblvbtpbck5DNgzemIpk0yS2f9/33rkjY9df7HZGJIevBG1NRPPSQK+mbkuKuSH3ySahe3e+oTAxZD96YZJef76Y69u4Na9a4KpCVK/sdlSkH1oM3JlmtWwf9+kH//u55y5Zw//2W3CsQS/DGJBtVeOstV+nx7behRQtXMMxUODZEY0wy+fVXGDwY3n0XMjPdSdW2bf2OyvjEevDGJJuvvoL//Ae++MKSewVnPXhjEl12Njz1lBtfr1cPvv0W0tL8jsrEAevBG5OoolGX2Nu0gWefhUWL3HZL7sZjCd6YRLR8OXTvDtdeC8ceCwsX2nCM2YMN0RiTaFThnHMgJwdefNGtuOSK+hmzi30meK/U7zZVjYrIkUAL4GNVzY95dMaYPyxc6FZUqlIFRo1yi3HUr+93VCaOlWSIZjqQJiINgAlAf+DlWAZljClkxw539WmnTvCvf7ltHTtacjf7VJIhGlHVrSIyEHhaVf8jIvNiHJcxBtyUx8suc733v/7VioOZ/VKSHryIyNFAP+BDb1swdiEZYwB47jno1g1++w3efx9Gj4b0dL+jMgmkJAn+emAoME5VF4lIM2BKTKMypiKLRNz9CSfAoEFu+uOZZ/obk0lIoqp+x1AgMzNTs7Ky/A7DGH/8/jsMHeqKhL3xht/RmAQhInNUNXNvbfvswYtIpoi8IyJzRWT+zlvZh2lMBTZhgrtg6emn3eyYnb14Y0qhJCdZRwO3AAuA/S5JJyJBIAtYrapn7O/XG5PUNm6EG26Al1+G5s1hxgw45hi/ozJJoiQJfq2qvl+KYwwBlgA1SrEPY5LT9u3w8cduaGbYMCszYMpUSRL83SLyAjAJ2L5zo6q+s68vFJGGwJ+Ae4EbDzRIY5LKmjWuhsywYa442IoVtnSeiYmSJPhLcVevhvhjiEaBfSZ44FHgVqDIT6+IDAIGAWRkZJRgl8YkKFV47TUYMsSdUP3Tn6BLF0vuJmZKkuCPUtXm+7tjETkDWKOqc0Ske1GvU9URwAhws2j29zjGJIScHLcQx4cfQteuroZMq1Z+R2WSXEnmwc8UkQP5JB4LnCUi2cAbQA8RefUA9mNMYlOFPn1g8mR4+GH4/HNL7qZclKQH3w2YJyLf48bgBVBVbVfcF6nqUNwFUng9+JtV9aJSRWtMIvnuOzflsUoVV6/9oIPgsMP8jspUICVJ8L1iHoUxySQSgSeegDvvhOuug/vuc+ujGlPO9pngVXVVaQ+iqlOBqaXdjzFxb8kSGDjQrYfauzdcc43fEZkKzFZ0MqasjB4NHTrAsmXw3//C+PHQqJHfUZkKzBK8MaW1s55T585upaXFi+Gii2yVJeO7IhO8iHwqIjeISIvyDMiYhLF9O9x1F/Tr5563aOHmuder529cxniK68FfAvwGDPcKjT0jImd7S/gZU7F9+aVbVeneeyEUgnxbwdLEnyITvKr+oqovq+oFQCYwCugMTBCRiSJya3kFaUzc2LLFFQc75hjIzYWPPoJXXnFJ3pg4U6IxeFWNquoXqjpMVY8FLgBWxzY0Y+LQli3w6qvuqtSFC+H00/2OyJgilWQe/B5UdR2ujLAxyW/TJnjmGbjlFqhb182SOfhgv6MyZp9sFo0xxfnwQ2jd2l209Pnnbpsld5MgLMEbszfr1kH//nDGGVCrlrtw6YQT/I7KmP1SkiX76onISBH52HveSkQGxj40Y3x09tluXdRhw2DOHFfW15gEU5Ix+JeBl4A7vefLgTeBkTGKyRh/LF0KDRtCtWrwyCNQtaobnjEmQZVkiCZdVd/CW+xDVcOArQhskkdenuupt2sH//qX29aliyV3k/BK0oPfIiK1cas4ISLdgE0xjcqY8jJpElx1lVs2r18/t9qSMUmiJAn+RuB94DAR+RyoA5wb06iMKQ8PPAC33gqHHw6ffQannOJ3RMaUqZKUC54rIicCzXGLfSxTVbsu2ySmaNRdrFS9Opx5plsb9Y47IC3N78iMKXP7TPAiEgR6A0281/cUEVT14RjHZkzZWrwYrrzSFQMbM8YVB/v73/2OypiYKclJ1g+AAUBtoHqhmzGJYds2V/WxQweX5Hv3/qPErzFJrCRj8A33tf6qMXHrm29cjfaVK+Hii+HBB6FOHb+jMqZclKQH/7GI9Ix5JMaUpZ099AYNXP2YSZNc1UdL7qYCKUkP/ktgnIgEgHzciVZV1RrFfZGIpAHTgUreccao6t2ljNeY4kWjMHIkjB3r6sikp8PMmX5HZYwvStKDfxg4GqiiqjVUtfq+krtnO9BDVdsDHYBe3hx6Y2Jj4UJXL2bQIDfu/ttvfkdkjK9KkuB/BBaq7t9ZKXVyvach72ZntkzZy8tzUx07dnTlBl56CaZOdb13YyqwkgzRfAdM9YqNbd+5sSTTJL0plnOAw4GnVHXWXl4zCBgEkJGRUcKwjdnN2LFuoesHHrDEboynJD3474FJQCr7OU1SVSOq2gFoCHQRkTZ7ec0IVc1U1cw6dgLMlNQvv8B117ll89LSICvL9dwtuRtToCRXst5T2oOo6kYRmQL0AhaWdn+mAotGYcQIuP12N85+5pnQs6e7MtUYs4siE7yIPKmq14rIB+xl7FxVzypuxyJSB8j3kntl4FTg/tIGbCqwBQvclahffAEnneSW0Wve3O+ojIlbxfXgLwauBR48wH3XB17xxuEDwFuqOv4A92UM3Hijq/o4apQbbxfxOyJj4lpxCX4lgKpOO5Adq+p8oOOBfK0xBT7+2NVpb9AAXnjBLcZRu7bfURmTEIpL8HVE5MaiGq3YmImpn3+G66+Ht95yNdoffRQaN/Y7KmMSSnEJPghUw125akz5iEbhuefcSdTt2+Ef/4BbbvE7KmMSUnEJ/mdVtVqqpnzde69bPu+UU9xJ1MMP9zsiYxJWcQneeu6mfGzZAuvWuSGYq66Cww6DCy+0k6jGlFJxFzqdXG5RmIrrww/d4tbnn+8qQKanw1//asndmDJQZIJX1Q3lGYipYH76Cc47D844A6pUcSUGLKkbU6ZKUovGmLI1e7YbY8/Pd2PuN98Mqal+R2VM0rEEb8rPtm1QubKb137++XDbbXYS1ZgYKkmxMWNKJzcXbroJ2rRxJ1TT0uD55y25GxNjluBNbH3wAbRqBQ8/7IZlIhG/IzKmwrAhGhMbubluketx49wsmRkz4Nhj/Y7KmArFevAmNqpWdSst/fvfMHeuJXdjfGAJ3pSduXPh5JNh9Wo35fHDD13JAZshY4wvLMGb0svNdaV8jzoKFi+G7793221euzG+sgRvSuf9991J1EcfdYtxLFkCxx3nd1TGGOwkqymtd96Bgw5yZX27dfM7GmNMIZbgzf4Jh+HJJ6F7d+jQAZ54ws1rD4X8jswYsxsbojEll5UFXbvCDTfAa6+5bdWrW3I3Jk5Zgjf7tnmzW1Wpa1dXJOytt+B+Wz/dmHgXswQvIo1EZIqILBaRRSIyJFbHMjH2zDNuKGbwYFi61FWBtBkyxsS9WI7Bh4GbVHWuiFQH5ojIZ6q6OIbHNGXlhx9cb71bN9d779HDTYM0xiSMmPXgVfVnVZ3rPf4dWAI0iNXxTBkJh+Ghh9zUx8suc2ukpqVZcjcmAZXLGLyINAE6ArP20jZIRLJEJGvt2rXlEY4pyuzZLpHffLObJfPxxxCw0zTGJKqY//aKSDVgLHC9qm7evV1VR6hqpqpm1qlTJ9bhmKLMmuWGY9asgTFjXBXIxo39jsoYUwoxTfAiEsIl99Gq+k4sj2UOgOofZQW6dIFHHnFXop5zjp1ENSYJxHIWjQAjgSWq+nCsjmMOUHY2nHkmtG/vTqaKuJOpNWr4HZkxpozEsgd/LNAf6CEi87xb7xgez5REfj48+KCr0T51KtxzD9St63dUxpgYiNk0SVWdAdj/+fFk61ZXl33ePDjrLDe3PSPD76iMMTFiUyQqgvx8d1+lCpx2mltl6b33LLkbk+QswSczVVdWoFkz12sHuO8+6NPHz6iMMeXEEnyy+v576N0bzj/fjbHbfHZjKhz7rU9Gjzzyx0LXjz7q5ri3a+d3VMaYcmb14JPRpk3Qqxc8/jg0bOh3NMYYn1iCTwa//eYWtz7zTDjjDBg2zIZkjDE2RJPQVN3CGy1awMiRbsFrsORujAGsB5+4vv0WrroKJk50ZQY+/dQtoWeMMR7r6iWqGTNc9cennoKZMy25G2P2YD34RDJ9uqsbc8EFcMklbhqklRkwxhTBevCJYP16GDgQTjwR/v1vtwiHiCV3Y0yxLMHHM1UYNcqdRH3lFbjtNvjiCzuJaowpERuiiWdz5rihmG7d4Lnn7GIlY8x+sa5gvNm+HSZMcI8zM2HSJPj8c0vuxpj9Zgk+nkyZ4hJ5796wapXb1qOHDckYYw6IZY54sHatG4rp0QPCYfjoI1sP1RhTajYG77dt29yyeWvXwh13wF13QeXKfkdljEkCluD9kpPjCoFVruxqtHfu7CpAGmNMGbEhmvK2bZvrpTdrBuPHu20XX2zJ3RhT5mKW4EXkRRFZIyILY3WMhPPZZ9C2Ldx7r7satUsXvyMyxiSxWPbgXwZ6xXD/ieW666BnTzcjZtIkdwGTXYlqjImhmCV4VZ0ObIjV/hNCNAqRiHvcpQvcfTfMn+9myxhjTIz5PgYvIoNEJEtEstauXet3OGVnwQI4/nh45hn3vH9/GD4c0tJ8DcsYU3H4nuBVdYSqZqpqZp06dfwOp/S2bnWrK3XqBMuWQe3afkdkjKmgbJpkWZo6FS69FLKz3f1//gPp6X5HZYypoCzBlyVVN6996lRX2tcYY3wUy2mSrwNfAM1FJEdEBsbqWL4Jh+GRR9zJU4CTTnJj75bcjTFxIGY9eFW9MFb7jgtffgmDB8M338CZZ7oZM4EABIN+R2aMMUAcnGRNOBs2wJVXwjHHwLp1MGYMvPeeVXw0xsQdy0r7a+1aePVVuP56WLIEzjnHLZ9njDFxxk6ylsTixa6nPmwYNG/uarXb7BhjTJyzHnxxtm6FoUNdOd9HH4WffnLbLbkbYxKAJfiijB8PrVq5Ur79+rmLlg491O+ojDGmxGyIZm82b4YBA6BePZg2DU44we+IjDFmv1kPfqf8fHjxRVccrEYNmDwZvv7akrsxJmFZggeYMcPVjhk40K2HCm7x69RUf+MyxphSqNgJft06l9SPP94Ny7z3nrtoyRhjkkDFHoM/+2yYPRtuvdVNgaxa1e+IjDGmzFS8BD97NrRsCdWruzoyVavaeqjGmKRUcYZo1q6Fyy+Hrl3hoYfcti5dLLkbY5JW8vfgIxEYMQLuvBN+/x1uvhluusnvqIwxJuaSP8Fffz08+aQr5fvkk+7iJWOMqQCSM8GvW+d67vXqwTXXwHHHQd++VhTMGFOhJNcYfDQKI0e6gmB/+5vb1qIFnH++JXdjTIWTPAl+wQI3n/3yy92J0//7P78jMsYYXyXHEM3bb8OFF0KtWvDSS3DJJdZjNyYJRaPuluJlrt9/d1VGIhG3gmYk4i5Ar1vXtX/7LeTl/dEWDis1ayktmru+7cefbWXLtgj54SjhcJQd4ShNG6fQ49iaADz47E9s36HkR6KEw0o4rHRuX4nzeh9C3vYIQ+7Odtu9fYfDSs8eaQw8L4O1v+XR/9pVRCLesSMQCcMFfUNcd1EzlmVvou9lvxKNwOsj69Dm8IPK/PuVHAn+pJPg6qvd2qi1a/sdjTHFUnX3Ii7xbNlCQRLYmajq1IFKlWDTJlelOj8cZUd+xLuP0ql9KtWrBVnx/TbmLdpGfn6U/EjU3YeVv/ZJp2b1ENO+Wsf/ZuUSDiv5XgIKh5XhNzSmetUQr43/kYnTt3jbIRxRIhF448kWhFIC3Pf8MiZNCRckyEgEJKDMeKcNAFfdvYD/TUshEoVoBKIRIa1KhAWT3fTjP13+NXNn1iAaFaKRANGoULP2Vr6b3RKAjr2+YfnX9dBoAI0EiEYD1G60jp8WHAlAg3bL+HlJE9AgGnHpqk7z5axZ6toPbbmK3NWNd/n+1ms/j1/mdQCgZZefCP9WuAqs0KDrl+R8ebSL7+zt6LZdE+vhPf7HiknHA3DLNXUgGtqlvd1Z01yCz89nxP2H7frDlQg5v09j4HkZbPg9l0/H1oNABCQCgTAEItQ+bDHXXdSM9bmbmL/Abft54wbakGAJXkR6AY8BQeAFVb0vJgdKT4fHH4/JrisaVSWiEVSVUNB9sLfmb2VHOLxLkgkGgjRKPxiAxat+5fetO1wvKKLk50epWa0SXVo2AGD85yvZlLuDcMRLMBGlYd2q/OnYpgA89voCtmyNuPaISzStDq/GRae7X+Ih92exY4fukmS6darGVee1ZEd+hAtvnEMkIkQi6t3DaT2qcGP/1qzbuI0+gxYRjYiXhIRoBM47J5XbL2vDih82cvYlq7x28dqFK65Q7riiDTO/+YVz+m0iGg14bQE0Ktw0NJc7r2jL2Enfc3G/SmhU0EiQaDSARgPc89BPDL28DU+8sZjrBzRBI0E0GgANggZ4cNRCburfhmHPzOXff+u0x89hxLhFXNGnNTc9+jkjhx+LG039Y0R1zJTlnNP9SIY+OZuxD++5yHvrr3/khA6NuPf5hXz2fPc92gddvJ7mVWvz5Gsr+eL13dujbHson1BKJd78OId5H3UulKQikJJX8MoZC1exaFGzXdpTq+UWtOfkZrM+/2AkEEVSokgwSqjyVsAl+FC9lYSa/EAgoASCUQKBKOmHRgD3sz/82PmEMuYRCCjBFCUYUJo1CRW0n9hvFr+u+x8pKRAMQDAFWh1WHegAwAW3zuD3LTsIpkBKUAgGocMRdQviu/GJyeRHwqQEhZQUIZQSoH3TBgXtj47/lGBASAkKoVCAUIrQ4tBGAFSvkspHi6YRSgkQSglQKZRCSjBI/WrNXewND2JJzgqCEiQYCBbc16x0DABdWzVg44+5BANBqoSq7PEzKgsxS/AiEgSeAk4FcoCvROR9VV0cq2MWJxKNsj0/zI78CHk7wmzPj5BeswpV01LZsHkby35Y73pA4Qg7whHy86Mc3aYBdWpVZdmPa5kxP4dwWNkRjhCORMkPR7notNYcWrsG0+d/z0efryI/HC34Vy4/rNxzRTcOrV2D0Z/N593Jq10PKqJEwko4LLz2r+7UqVWVf//3C979dAORsPdvnJekvnrzFKqmpTL4vsl8MnEHkXCgIAEB/DzzFABOv+4TZk6pRjQqaDRANBIglLaDTQtcL6TdXz5h8ZcNIeqSjEaDpNXayNZvMwFocMxUfprfCqJBd9MgaYesYtsq10s7pNUKfv+2/S7fz6pNF5L7nUvwnY/ZRN5PR+7SflCruWxY5H5R/nxWKuENu/Z06h/1JT/Ndgn+hivqo1t2XUSl2YkzChL843e1gXDaLu1zek/nqvNaEo5EeefJLrv+sCXC5rzp3Ni/NZu35vH5+0f8kZy8+0MOW8jttGHj1i0sWVAZCUQgEHX3EmXlmnVAG7aFt7Jh23okGEECiqS6JLQj4P74Vaqyg0oZywqSkwSVQEA5uJ7rNTZqCI1P/oRgUAvWZA+mKEce7nq4XTpVoutlb7ntXoJKSYH2LboB0KfXQWwIv+WSUwqEUlyy6dDcVTkd3L8uGUe+6yUnl6RSUoRWzVzS//vNDejzl89cEgoJoWCAUChA4/pu/6882ozVw78iNeSSVGooSEogSLUqLgFPfLUDW/I3F0pSKQQDNQu+1XPfOg1FSQmkEJA9T+l988af99hW2OxX/lJs+7Rnziu2ffz9fYtt/+/txbc/OPCcYtuHnH5GkW3BQIDTW+35x/WP9iAt0lsU214zrWaR7WUhlj34LsC3qvodgIi8AZwNlHmCf2vSMi46vzLRiPs3TiMpaDTIzfct5oEhx/Cf/87htos7A7tWhxw+4ivuvuIoHhg1n/uu67rHfh9/8xuu69ueR0Yt47m7jtujPWPCMi44tQZPj/6RN//TfY/2C05Z5RL8uA18/Mzpe7T/evNa6tSqyoSJEWaP/pPbGAhDIIwEomzbHqZqWiorlqax+qu2rhdUkEgiBfsJ7KiJbEsntLMXlKpUrryjoP2Ihgfxe+MIgUDY6ykpBx0cLWg/6fg0lqR/TzAAgSAEgkr9+oXex0V5rPpxpktC3q1xo2BB+zU3bWTt+pleLwmCQeGwjMoF7fc8uIbcrT+55OP1og5vVKug/fk3fiIcziElxbWlhgI0PqRRQfvHM1cRDAihkNeTSglQ7yCXgNJSU1j+S05BLyoUDBIMBKgccj/PpvVrseX3bQSkEgEJFNwEl4CPatEAXbfHj6bAyZ2bsX1lsyLbzzi6ORtmNy+yvc9xrejzYdHXXvQ5tjV9ji36auozurbijK5Ff/0pHVpySoeWRbZ3O/IIuh15RJHtR9TN4Ii6GUW2165Sm9oUPey58788E59Edw4IlvWORc4Feqnq5d7z/kBXVb12t9cNAgYBZGRkdF61atV+H2vq1z8wYMgPpISUUAqEQkpKCtxydT0u7NmcaV//yN2PfUdK0PWO3E25YcBhnNixEZ/Pz+H5MdkF/6alBNy/YoPOO5yWTWqTteRXPpz2c0ESSQkJoWCQc05pRP30qiz9fiPzlm4q+DctNeR6Qke1rUXVyims3bCD9RsiVEoNFrQHg1CzJgQC3rimuMfGGLM/RGSOqmbutc3vBF9YZmamZmVlxSQeY4xJRsUl+Fj2GVcDjQo9b+htM8YYUw5imeC/Ao4QkaYikgpcALwfw+MZY4wpJGYnWVU1LCLXAp/ipkm+qKqLYnU8Y4wxu4rpPHhV/Qj4KJbHMMYYs3c2b8MYY5KUJXhjjElSluCNMSZJWYI3xpgkFbMLnQ6EiKwFSnIpazpQzAXmcS/R44fEfw8Wv/8S/T3ES/yNVbXO3hriKsGXlIhkFXXlViJI9Pgh8d+Dxe+/RH8PiRC/DdEYY0ySsgRvjDFJKlET/Ai/AyilRI8fEv89WPz+S/T3EPfxJ+QYvDHGmH1L1B68McaYfbAEb4wxSSqhEryI9BKRZSLyrYjc7nc8JSEiL4rIGhFZWGjbwSLymYis8O7Lfjn1MiIijURkiogsFpFFIjLE254Q70FE0kRktoh848V/j7e9qYjM8j5Lb3olreOWiARF5GsRGe89T7T4s0VkgYjME5Esb1tCfIYARKSWiIwRkaUiskREjk6E+BMmwRdaxPt0oBVwoYgUvVhl/HgZ6LXbttuBSap6BDDJex6vwsBNqtoK6AZc433fE+U9bAd6qGp7oAPQS0S6AfcDj6jq4cBvwED/QiyRIcCSQs8TLX6Ak1S1Q6G544nyGQJ4DPhEVVsA7XE/i/iPX1UT4gYcDXxa6PlQYKjfcZUw9ibAwkLPlwH1vcf1gWV+x7gf7+U94NREfA9AFWAu0BV3BWKKt32Xz1a83XCroU0CegDjAUmk+L0Ys4H03bYlxGcIqAl8jzcpJZHiT5gePNAA+LHQ8xxvWyKqp6o/e49/Aer5GUxJiUgToCMwiwR6D97wxjxgDfAZsBLYqKph7yXx/ll6FLgViHrPa5NY8QMoMEFE5ojIIG9bonyGmgJrgZe8YbIXRKQqCRB/IiX4pKTuz3/cz1UVkWrAWOB6Vd1cuC3e34OqRlS1A64n3AVo4W9EJSciZwBrVHWO37GU0nGq2gk3xHqNiJxQuDHOP0MpQCfgGVXtCGxht+GYeI0/kRJ8Mi3i/auI1Afw7tf4HE+xRCSES+6jVfUdb3NCvQcAVd0ITMENadQSkZ0rmsXzZ+lY4CwRyQbewA3TPEbixA+Aqq727tcA43B/aBPlM5QD5KjqLO/5GFzCj/v4EynBJ9Mi3u8Dl3iPL8GNa8clERFgJLBEVR8u1JQQ70FE6ohILe9xZdz5gyW4RH+u97K4jV9Vh6pqQ1VtgvvMT1bVfiRI/AAiUlVEqu98DPQEFpIgnyFV/QX4UUSae5tOBhaTCPH7fRJgP0929AaW48ZQ7/Q7nhLG/DrwM5CP6wkMxI2hTgJWABOBg/2Os5j4j8P96zkfmOfdeifKewDaAV978S8EhnnbmwGzgW+Bt4FKfsdagvfSHRifaPF7sX7j3Rbt/N1NlM+QF2sHIMv7HL0LHJQI8VupAmOMSVKJNERjjDFmP1iCN8aYJGUJ3hhjkpQleGOMSVKW4I0xJklZgjdxRURy/Y6hKCIyWEQuLqN9zRGRSrttmyoiP3jXHuzc9u7O74mINBGRbV5Fxm9EZGahudnG7MESvDElpKrPquqo0u5HRJoCq1V1+16aN+KuXsW7QKv+bu0r1VVkbA+8AtxR2nhM8rIEb+KSiHQXkWki8p6IfCci94lIP6+2+wIROcx73ZleXfSvRWSiiNTzttfxanQv8opDrRKRdK/tIm8/80TkOa8U9e7Hv09cDfz5IvKgt224iNwsIod6X7vzFhGRxt4xx4rIV97t2CLeXi/gkyLa3sBdsQrwF+CdIl4HUANXKtiYvbIEb+JZe2Aw0BLoDxypql2AF4DrvNfMALqpKwL1Bq7qIsDduMv6W+Nqh2QAiEhL4HzgWHUFyCJAv8IHFZHawJ+B1qraDvhn4XZV/cnrRXcAngfGquoqXI2YR1T1KOAcL869KS7BTwJO8P7oXAC8uVv7Yd4flZXAjcDDu+/AmJ1S9v0SY3zzlXrlWL2ENsHbvgA4yXvcEHjTK/aUiqvbDa7Ewp8BVPUTEdnZ0z0Z6Ax85Q11V2bPIlGbgDxgpLgVlMbvLTivh36FdyyAU4BWhYbQa4hINVXNLfQ1qUBDVf2uiPccwf3RugCorKrZhfYH3hCNt6/zgRHsuaCMMYAleBPfCo9RRws9j/LHZ/cJ4GFVfV9EugPD97FPAV5R1aFFvUBVwyLSBffH4FzgWlwVxz924v6gjATOKpTAA7j/JvKKOf7xuARenDdwFReH7+N17wMv7eM1pgKzIRqT6GryR6ncSwpt/xzoCyAiPXHFocANgZwrInW9toNFpHHhHXq172uq6kfADbihosLtIVyBr9tUdXmhpgn8MXSEiHTYS7y9gI/38Z7+B/wbV6iuOMfhCu8Zs1fWgzeJbjjwtjcEMxm3+g7APcDrItIf+AK34s7vqrpORO7CrS4UwFX5vAZYVWif1YH3RCQN1+O/cbdjHgNkAveIt4g3rsLm34CnRGQ+7ndrOu4cQmHdgWHFvSF1FQAfLKL5MHGrUwmwA7i8uH2Zis2qSZqk5M0xj3jDLUfjVuPp4HNMDYHnVfV0P+MwFYcleJOUROQI4C3cMOQO4GpV/crfqIwpX5bgjTEmSdlJVmOMSVKW4I0xJklZgjfGmCRlCd4YY5KUJXhjjElS/w84cOZ6yinx4gAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "Sizes (MB) [1, 2, 4, 8, 16, 32, 64]\n", "Times ref (s) [0.1386 0.2451 0.4528 0.8782 1.7417 3.4711 7.0918]\n", "Times cle (s) [0.004 0.0083 0.013 0.0229 0.0427 0.0666 0.1341]\n", "Times cle+alloc (s) [0.0045 0.0077 0.0131 0.0203 0.039 0.0718 0.1421]\n" ] } ], "source": [ "radius = 10\n", "benchmark_size(gaussian_blur_filter_ref, gaussian_blur_filter_cle, gaussian_blur_filter_cle_alloc)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Binary erosion" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "Sizes (MB) [1, 2, 4, 8, 16, 32, 64]\n", "Times ref (s) [0.007 0.0135 0.0259 0.0494 0.1007 0.1915 0.377 ]\n", "Times cle (s) [0. 0. 0. 0. 0. 0. 0.]\n", "Times cle+alloc (s) [0.0012 0.0021 0.0022 0.0028 0.0047 0.0082 0.0136]\n" ] } ], "source": [ "\n", "from skimage.morphology import binary_erosion\n", "\n", "\n", "def binary_erosion_ref(image):\n", " filtered = binary_erosion(image)\n", " return filtered\n", "\n", "def binary_erosion_cle(image, output):\n", " cle.erode_box(image, output)\n", "\n", "def binary_erosion_cle_alloc(image):\n", " filtered = cle.create(image.shape)\n", " cle.erode_box(image, filtered)\n", "\n", "benchmark_size(binary_erosion_ref, binary_erosion_cle, binary_erosion_cle_alloc)\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Mean filter radius=2" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "Sizes (MB) [1, 2, 4, 8, 16, 32, 64]\n", "Times ref (s) [0.0249 0.0419 0.0713 0.1376 0.292 0.6007 1.2639]\n", "Times cle (s) [0.0033 0.004 0.0051 0.0071 0.0113 0.0198 0.0351]\n", "Times cle+alloc (s) [0.0025 0.0034 0.0067 0.0094 0.0232 0.0236 0.0418]\n" ] } ], "source": [ "\n", "import scipy.ndimage.filters as spf\n", "\n", "\n", "radius = 2\n", "def mean_filter_ref(image):\n", " # todo: not sure if size is a radius or a diameter. Check documentation\n", " # https://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.uniform_filter.html#scipy.ndimage.uniform_filter\n", " filtered = spf.uniform_filter(image, size=radius)\n", " return filtered\n", "\n", "def mean_filter_cle(image, output):\n", " cle.mean_box(image, output, radius, radius, radius)\n", "\n", "def mean_filter_cle_alloc(image):\n", " filtered = cle.create(image.shape)\n", " cle.mean_box(image, filtered, radius, radius, radius)\n", "\n", "benchmark_size(mean_filter_ref, mean_filter_cle, mean_filter_cle_alloc)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.8.3" } }, "nbformat": 4, "nbformat_minor": 2 }