{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Making trackpy fast(er)\n", "\n", "This notebook explains specific features built into `trackpy` to boost performance, and it also provides some general suggestions on how to make particle tracking run faster.\n", "\n", "First, set up matplotlib..." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib\n", "from matplotlib.pyplot import imshow" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## General advice\n", "\n", "### Subnetworks\n", "\n", "As we'll see in the examples below, the need to resolve \"subnetworks\" — in which multiple neighboring particles in one frame could correspond to multiple particles in the next — can drastically slow down tracking. There is a seprate tutorial on dealing with (excessive) subnetworks. In the text below, we'll look at some methods for finding out just how much a of a problem subnetworks are in your application, so that you can weigh the various remedies against a potential loss of accuracy.\n", "\n", "### Feature-finding: The best advice\n", "\n", "Judicious use of the `minmass` and/or `threshold` parameters during feature-finding, as described in the \"walkthrough\" tutorial notebook, can considerably speed up feature-finding, linking, and analysis of tracks. The best way to speed up a computation is usually to avoid doing it at all.\n", "\n", "### Feature-finding: The details\n", "\n", "The `locate()` and `batch()` functions for feature-finding can use either of two engines for their work, as specified by the optional `engine` parameter:\n", "\n", "- The `numba` engine is reasonably fast. It is the default when numba is installed.\n", "- The `python` engine is currently slightly more accurate, but considerably slower.\n", "\n", "In addition, both engines do some extra work that you might not always need:\n", "\n", "- They iteratively try to refine the position of the feature centroid, for the best possible subpixel accuracy. This can be turned off with the parameter `max_iterations=0`.\n", "- They compute extra data about the feature, such as its eccentricity. This can be turned off with `characterize=False`.\n", "\n", "**Note:** Before sacrificing accuracy for performance, it's best to know objectively how much performance you are gaining. Read on to the Advanced Topics section for information about how to time feature-finding." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Using numba for acceleration\n", "\n", "Two key algorithms in `trackpy` can be sped up by the [`numba`](http://numba.pydata.org) array-based just-in-time compiler for Python:\n", "\n", "- Iteratively refining the centroids of features, for better subpixel resolution.\n", "- Resolving subnetworks, as part of the linking process.\n", "\n", "The source code actually contains distinct Python and numba versions of each — and not one numba version but several, each optimized for a different use, and for 2D and 3D images. The default setting is to use the appropriate numba version when possible, but to fall back on the general-purpose Python version if numba is unavailable. You can also control these choices manually, using the `engine` argument to `locate()`, and the `link_strategy` argument when linking.\n", "\n", "If you don't have `numba`, we recommend using the Anaconda or Canopy scientific Python distributions, which include `numba` and many other useful packages. Note that it can be difficult to install outside of these distributions.\n", "\n", "### Theoretical performance diagnostics: `performance_report()`\n", "\n", "`trackpy` provides an easy way to check whether your system is configured for the best performance. Currently, it reports only whether `numba` is working." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Yes, but could it be faster?\n", "FAST: numba is available and enabled (fast subnets and feature-finding).\n" ] } ], "source": [ "import trackpy.diag\n", "trackpy.diag.performance_report()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Advanced topics" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Empirical performance diagnostics: Timing and profiling\n", "\n", "What follows is a crash course in how to evaluate the performance of tracking. The general suggestions given above are good starting points, but they are just that — general suggestions. For your *specific* application, you need *specific* data about how long the computation takes, and how the computer is spending its time. This information may help you make your own adjustments to your tracking method, or it may help you when asking the `trackpy` developers for assistance (chances are we'll be happy to help!).\n", "\n", "You will use these techniques with your own data, but let's use the data from the \"walkthrough\" tutorial.\n", "\n", "### Setup" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "import trackpy as tp\n", "import pims" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "frames_raw = pims.open('../sample_data/bulk_water/*.png')\n", "\n", "# Convert each image from color to greyscale\n", "@pims.pipeline\n", "def as_grey(img):\n", " return img[:,:,1] # Green channel\n", "\n", "\n", "frames = as_grey(frames_raw) # PIMS pipelines work on entire movies" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The speed at which we can read images from disk is not something we can hope to improve much, so let's get that out of the way before we do our tests. Also, we don't need to use all the frames for this example (though you're welcome to)." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# This gets the image data out of the pims ImageSequence object, and into a good old list in memory.\n", "frames_preload = list(frames[:50])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Just so we don't forget what these images look like:" ] }, { "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" } ], "source": [ "imshow(frames_preload[0], cmap=matplotlib.cm.gray);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Before we identify features, we need to give `trackpy` a chance to \"warm up\" and compile certain functions, if it hasn't done so already. So we'll find features in just 2 frames: " ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Frame 2: 494 features\n" ] } ], "source": [ "f2 = tp.batch(frames_preload[:3], 11, minmass=100, invert=True)\n", "_ = tp.batch(frames_preload[:3], 11, minmass=100, invert=True, characterize=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Timing\n", "\n", "Let's find out — precisely — how long it takes to find features in a single frame. You'll notice that the following cell begins with the line `%%timeit`. This is an example of a *cell magic*, which gives IPython special instructions about how to run the rest of the cell." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Frame 0: 535 features\n", "38.9 ms ± 4.83 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" ] } ], "source": [ "%%timeit\n", "f1 = tp.batch(frames_preload[:1], 11, minmass=0.03, invert=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`%%timeit` runs the same code multiple times and returns a somewhat accurate measurement of execution time. We can use it to see how much faster we can find features in this image when we turn off centroid refinement and feature characterization:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Frame 0: 538 features\n", "25.9 ms ± 2.92 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" ] } ], "source": [ "%%timeit\n", "f1 = tp.batch(frames_preload[:1], 11, minmass=0.03, invert=True, \n", " max_iterations=1, characterize=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "One thing to note is that the ratio of features to pixels is rather low in this image. If you were finding features in a dense packing of particles, the timing difference could be much more significant." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Profiling\n", "\n", "Next, we'll try to get a sense of what's taking so long. The `%%prun` cell magic instructs IPython to run the rest of the cell's code using a *profiler*." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Frame 49: 608 features\n", " " ] } ], "source": [ "%prun f = tp.batch(frames_preload, 11, minmass=0.03, invert=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When execution is complete, a pager will pop up in the lower portion of the notebook window. This is the profiler output. We reproduce a portion of it here. Your results will depend on your data and the computer you are using." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```\n", " 449300 function calls (443235 primitive calls) in 1.726 seconds\n", "\n", " Ordered by: internal time\n", "\n", " ncalls tottime percall cumtime percall filename:lineno(function)\n", " 50 0.268 0.005 0.268 0.005 {built-in method scipy.ndimage._nd_image.binary_erosion}\n", " 100 0.233 0.002 0.233 0.002 {built-in method scipy.ndimage._nd_image.correlate1d}\n", " 100 0.229 0.002 0.229 0.002 {built-in method scipy.ndimage._nd_image.min_or_max_filter1d}\n", " 100 0.117 0.001 0.117 0.001 {built-in method scipy.ndimage._nd_image.uniform_filter1d}\n", " 200 0.115 0.001 0.115 0.001 {method 'nonzero' of 'numpy.ndarray' objects}\n", " 200 0.066 0.000 0.066 0.000 {built-in method numpy.where}\n", " 1852 0.041 0.000 0.041 0.000 {method 'reduce' of 'numpy.ufunc' objects}\n", " 50 0.035 0.001 0.036 0.001 preprocessing.py:145(invert_image)\n", " 50 0.029 0.001 0.029 0.001 center_of_mass.py:362(_numba_refine_2D_c)\n", " 50 0.028 0.001 0.028 0.001 {method 'partition' of 'numpy.ndarray' objects}\n", " 50 0.026 0.001 0.182 0.004 find.py:66(percentile_threshold)\n", " 50 0.025 0.000 0.438 0.009 preprocessing.py:86(bandpass)\n", "5646/5396 0.024 0.000 0.028 0.000 {built-in method numpy.array}\n", " 884 0.020 0.000 0.020 0.000 {method 'acquire' of '_thread.lock' objects}\n", " 64626 0.018 0.000 0.032 0.000 {built-in method builtins.isinstance}\n", " 50 0.017 0.000 0.481 0.010 find.py:75(grey_dilation)\n", " 50 0.017 0.000 0.306 0.006 uncertainty.py:12(measure_noise)\n", " 50 0.015 0.000 0.015 0.000 {method 'query_pairs' of 'scipy.spatial.ckdtree.cKDTree' objects}\n", " 28360 0.009 0.000 0.012 0.000 generic.py:7(_check)\n", " 50 0.009 0.000 0.044 0.001 find.py:19(where_close)\n", " 400 0.008 0.000 0.008 0.000 socket.py:342(send)\n", " 350 0.008 0.000 0.008 0.000 {method 'astype' of 'numpy.ndarray' objects}\n", " 100 0.008 0.000 0.031 0.000 preprocessing.py:180(convert_to_int)\n", " 50 0.008 0.000 0.008 0.000 {method 'clip' of 'numpy.ndarray' objects}\n", " 500/400 0.008 0.000 0.049 0.000 base.py:277(__new__)\n", " 45270 0.008 0.000 0.009 0.000 {built-in method builtins.getattr}\n", " 50 0.007 0.000 1.639 0.033 feature.py:208(locate)\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is a record of how the computer spent its time while finding features. The various numbers are explained in the [documentation for the Python `profiler` module](http://docs.python.org/2/library/profile.html#instant-user-s-manual). You shouldn't try to understand every line, but you can get some idea of which functions are called for each frame (multiples of 50), and which are called for each particle. Note that `{functions in braces}` are written in C, not Python, are not part of `trackpy`, and tend to be less user-serviceable. (They are typically `scipy` or `numpy` functions.)\n", "\n", "Now let's look at the linking step. Once again, we'll prime `trackpy`, to avoid distorting our results with one-time setup code:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Frame 2: 494 trajectories present.\n" ] } ], "source": [ "# Use a large search_range, to be sure that numba subnet code is compiled and used.\n", "t1 = tp.link(f2, 5, memory=3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To make sure that the subnet linker gets a workout, let's use a large `search_range`:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Frame 49: 608 trajectories present.\n", " " ] } ], "source": [ "%%prun\n", "t = tp.link(f, 15, memory=3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```\n", " 1046100 function calls (1035220 primitive calls) in 1.267 seconds\n", "\n", " Ordered by: internal time\n", "\n", " ncalls tottime percall cumtime percall filename:lineno(function)\n", " 2171 0.115 0.000 0.195 0.000 subnetlinker.py:177(numba_link)\n", " 29643 0.088 0.000 0.105 0.000 utils.py:109(__init__)\n", " 49 0.082 0.002 0.288 0.006 subnet.py:358(compute)\n", " 49 0.077 0.002 0.077 0.002 subnet.py:348(reset)\n", "31459/31458 0.067 0.000 0.068 0.000 {built-in method numpy.array}\n", "14757/5012 0.063 0.000 0.069 0.000 subnetlinker.py:50(do_recur)\n", " 52733 0.049 0.000 0.059 0.000 subnet.py:238(assign_subnet)\n", " 35275 0.046 0.000 0.046 0.000 linking.py:310(_sort_key_spl_dpl)\n", " 49 0.042 0.001 0.047 0.001 {method 'query' of 'scipy.spatial.ckdtree.cKDTree' objects}\n", " 49 0.040 0.001 0.431 0.009 linking.py:519(assign_links)\n", " 16315 0.038 0.000 0.352 0.000 subnetlinker.py:430(subnet_linker_numba)\n", " 50 0.029 0.001 0.134 0.003 utils.py:29()\n", " 49 0.028 0.001 0.116 0.002 linking.py:537(apply_links)\n", " 49 0.026 0.001 0.072 0.001 {built-in method builtins.sorted}\n", " 37548 0.023 0.000 0.034 0.000 {method 'sort' of 'list' objects}\n", " 2171 0.023 0.000 0.023 0.000 subnetlinker.py:241(_numba_subnet_norecur)\n", " 834 0.020 0.000 0.020 0.000 {method 'acquire' of '_thread.lock' objects}\n", " 98 0.017 0.000 0.092 0.001 subnet.py:122(rebuild)\n", " 5012 0.017 0.000 0.099 0.000 subnetlinker.py:28(__init__)\n", " 49 0.017 0.000 1.067 0.022 linking.py:511(next_level)\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note the time spent on `numba_link` at the beginning of the report, and a little farther down, the large `cumtime` for `subnet.py:358(compute)` (which includes the `numba_link` time). These are parts of the subnet resolution code referred to above. \n", "\n", "In this example, the `cumtime` for subnets is a large enough fraction of the total linking time that you may want to look at ways to reduce it. The tutorials on Prediction, Advanced Linking, and Adaptive Linking offer some methods for reducing `search_range` while still obtaining good or better results." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Neighbor-finding strategy: KDTree\n", "\n", "An important operation in tracking (i.e. linking) is finding all the particles that are close to a certain point in space. `trackpy` has two ways of doing this:\n", "\n", "- A KDTree, which only handles more standard cases (e.g. Euclidean geometries) and is written in C. (This is the default.)\n", "- A BTree (\"ball tree\") based on the scikit-learn package. It is very extensible but tends to be slower. The `dist_func` argument to `link()` measures distances in your custom coordinate space.\n", "\n", "The method is set by the `neighbor_strategy` argument to the various linking functions, which again defaults to KDTree. The KDTree is a standard part of `scipy`; if you can run `trackpy` at all, it is enabled." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "--------\n", "\n", "Well, I hope you've enjoyed this brief tour of `trackpy` performance. Just remember that if you come up with new ways to improve performance, the `trackpy` community will be interested!" ] } ], "metadata": { "kernelspec": { "display_name": "trackpy-examples", "language": "python", "name": "trackpy-examples" }, "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.4" } }, "nbformat": 4, "nbformat_minor": 1 }