{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Computational Vision (Psy 5036): Python" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So far in this course we've tried to emphasize concepts usually with simple examples. We'll now go over tools that can be applied to state-of-the-art problems in computational vision. Mathematica is excellent for learning concepts, and for many high-end applications. However, it is not so good for specialized work in the field where most others are using different tools. Matlab and increasingly Python have large user communities who are building tools that we can build on. That's the goal. But first an introduction to Python as an environment for scientific programming.\n", "\n", "Scientific programming with Python relies on several key add-on packages (see Installation cell below). Matlab-like functionality is provided by the NumPy, and other packages. Mathematica-like notebook functionality is provided by Jupyter, an open-source web application. IPython is an interactive environment, that includes notebook functionality, and provides a kernel for Jupyter. Jupyter supports other languges (R, Julia,..), and is now replacing IPython for notebooks.\n", "\n", "The purpose of this notebook is to provide a very brief introduction to scientific Python with a guide to resources for learning more." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "###### Rationale for scientific python and IPython/Jupyter notebooks" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "See this 2014 [article in Nature](http://www.nature.com/news/interactive-notebooks-sharing-the-code-1.16261). For an introduction to [IPython](http://ipython.org/notebook.html).\n", "\n", "For scientific python using notebooks, see [in-depth series](https://github.com/jrjohansson/scientific-python-lectures).\n", "\n", "For a comparision of Python/NumPy with Matlab, see [here](https://docs.scipy.org/doc/numpy-dev/user/numpy-for-matlab-users.html)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Starting IPython in the middle" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In order to run this notebook on your computer, you will need to have Python and various packages installed. See the Installation cell below.\n", "\n", "Find the directory where you've downloaded this notebook, and then from a terminal command line go the directory (or parent directory) and type: jupyter notebook. ('ipython notebook' should also work).\n", "\n", "This command will bring up a browser window from where you should see this notebook listed in your browser window. You can load it from there." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "###### Installation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The hardest, or at least the most frustrating, aspect of Python can be installation. There are a number of package managers. I recommend [Anaconda](https://store.continuum.io/cshop/anaconda/). We'll be using Python 2.7.\n", "\n", "In addition to Python and [Juypter](http://jupyter.org/), you will need [numpy](http://www.numpy.org/), [matplotlib](http://matplotlib.org/) and the [scipy library](http://www.scipy.org/scipylib/index.html). All of these are part of the [scipy stack](scipy.org) for general purpose scientific programming. \n", "\n", "For image processing, we'll use [scikit-image](http://scikit-image.org/).\n", "This, like the machine learning module [scikit-learn](http://scikit-learn.org/stable/index.html), is built on the scipy stack.\n", "\n", "There is also increasing support for \"Open Source Computer Vision [OpenCV](http://opencv.org)\" on [python](http://docs.opencv.org/master/d6/d00/tutorial_py_root.html#gsc.tab=0).\n", "\n", "For Bayesian computations using MCMC sampling see [pymc](http://pymc-devs.github.io/pymc/)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Style" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's first cover some style used in notebooks. Right off the bat, you can create various kinds of cells: Raw NBConvert, various headings, or a Markdown cell. Try double-clicking on some of the cells in this notebook. Code cells are for code.\n", "\n", "This cell is Markdown. You can type in LaTeX commands and have them formatted. E.g. try putting the next line between double dollar signs:\n", "\n", "p(y_i|x)= \\frac{e^{y_i(w.x+b)}}{{1+e^{(w.x+b)}}}\n", "\n", "\n", "After getting acquainted with the menu items and buttons of the IPython notebook interface, take a look at these notes on: [IPython's Rich Display System](http://github.com/odewahn/ipynb-examples/blob/master/Part%205%20-%20Rich%20Display%20System.ipynb). Try copying in cell content in this notebook to try out displaying different kinds of content.\n", "\n", "You have access to unix shell commands too. Try ls, !ls, and some of the magics: %ls, %lsmagic." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Making and plotting lists" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To get started, let's look at some simple python coding examples. We need to load numpy to handle vectors and matrices. To make lists in Mathematica we typically used Table[], e.g. \n", "\n", " Table[Sin[x], {x, 0, 1, .1}];\n", "\n", "\n", "In python, we'll use \"list comprehensions\". Create a code cell and try these:\n", "\n", " [sin(x) for x in arange(0,1,.1)]\n", "\n", " [sin(x) for x in linspace(0,1,10)]\n", "\n", "But wait! Python needs to know where these functions came from. arange(), linspace(), and sin() are all numpy functions. We imported numpy functions with the shorthand \"np\", so you will need to write:\n", "\n", " np.sin(x), and np. arange(0,1,.1). \n", "\n", "For more on creating and manipulating numerical lists in NumPy see [scipy page](http://scipy-lectures.github.io/intro/numpy/index.html)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Store the values in sl:" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [], "source": [ "sl=[np.sin(x) for x in np.arange(0,10,.1)]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's plot the values in sl. To do this, we'll need to import matplotlib, and in particular the pyplot module, or plt for short. If you want a more matlab like plotting environment, you can use pylab:\n", "\n", " from pylab import *\n", "\n", "For more information on plotting, see [scipy notes](https://scipy-lectures.github.io/intro/matplotlib/matplotlib.html#ipython-and-the-pylab-mode), and Lecture 4 in the [scientific python notebook series](http://nbviewer.ipython.org/github/jrjohansson/scientific-python-lectures/blob/master/Lecture-4-Matplotlib.ipynb). " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "How to get information about a function? In Mathematica you can type ?Sin. In an IPythoncode cell try typing:?sin. Now try ?np.sin." ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "With the magic function the next cell, your plot should appear inside the notebook. Otherwise, without the magic function, the plot appears in a separate window." ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\nDYG3UcsAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(sl)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We made 2D lists in Mathematica using the Table[] function like this:\n", "\n", " Table[Sin[x] Cos[y], {x, 0, 1, .1}, {y, 0, 1, .1}];\n", "\n", "Now try using the list comprehension syntax for python:\n", "\n", " [[sin(x)*cos(y) for x in arange(0,1,.1)] for y in arange(0,1,.1)] or\n", "\n", " [[sin(x)*cos(y) for x in linspace(0,1,10)] for y in linspace(0,1,10)]\n", "\n", "Again remember to specify the numpy class using np. " ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [], "source": [ "#If you remove the semicolon and it is the last line, the next line will print out the values\n", "[[np.sin(x)*np.cos(y) for x in np.arange(0,1,.1)] for y in np.arange(0,1,.1)];" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "collapsed": true }, "outputs": [], "source": [ "#but it won't if you assign a variable name to the array\n", "\n", "sl2=[[np.sin(x)*np.cos(y) for x in np.arange(0,1,.1)] for y in np.arange(0,1,.1)]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "###### Getting parts of vectors and arrays" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Accessing array values or slicing](http://scipy-lectures.github.io/intro/numpy/numpy.html#indexing-and-slicing)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 0 1 2 3 4 5]\n", " [ 6 7 8 9 10 11]\n", " [12 13 14 15 16 17]\n", " [18 19 20 21 22 23]\n", " [24 25 26 27 28 29]] \n", "\n", "(#rows, #columns)= (5, 6) # elements: 30\n" ] } ], "source": [ "#make a matrix with 5 rows and 6 columns\n", "sl3=np.array([[x+y*6 for x in np.arange(0,6,1)] for y in np.arange(0,5,1)])\n", "#what happens if you don't use np.array() in the above line?\n", "\n", "print np.array(sl3),'\\n\\n(#rows, #columns)=',np.shape(sl3),\"# elements:\",np.size(sl3)" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0, 1, 2, 3, 4, 5])" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#note that unlike Mathematica and Matlab (but like C), indexing starts with 0\n", "#first row\n", "sl3[0]" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 0, 6, 12, 18, 24])" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#first column\n", "sl3[:,0]" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": true }, "outputs": [], "source": [ "#Try accessing the element in the 3rd row, 4th column. It isn't sl3[3,4]|\n", "\n", "#Get the first 2 elements of sl. It isn't sl[0:1]." ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[15, 16, 17],\n", " [21, 22, 23]])" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Now get the submatrix 3rd and 4th row, 4th through 6th columns\n", "sl3[2:4,3:6]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "###### Defining functions" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def f(x,y):\n", " return([[np.sin(3*x)*np.cos(4*y) for x in np.arange(0,1,.01)] for y in np.arange(0,1,.01)])" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#Visualize f(x,y) using imshow()\n", "\n", "import matplotlib.cm as cm\n", "\n", "n = 10\n", "x = np.linspace(-3,3,4*n)\n", "y = np.linspace(-3,3,3*n)\n", "X, Y = np.meshgrid(x,y)\n", "plt.imshow(f(X,Y),cmap = cm.Greys_r,origin='lower',interpolation='nearest');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "###### IPython Examples" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For a directory of [IPython notebook examples](https://github.com/ipython/ipython/wiki/A-gallery-of-interesting-IPython-Notebooks). E.g. here's a demo of [receptive field models]( http://nbviewer.ipython.org/github/jonasnick/ReceptiveFields/blob/master/receptiveFields.ipynb)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "###### Python image processing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Look over the examples at the scikit-image site:\n", "http://scikit-image.org/docs/dev/auto_examples/\n", "\n", "In particular, take a look at the [normalized cut method](http://scikit-image.org/docs/dev/auto_examples/plot_ncut.html) for producing segmentations, and related methods, sometimes referred to as [\"super-pixels\"](http://scikit-image.org/docs/dev/auto_examples/plot_segmentations.html#example-plot-segmentations-py).\n", "\n", "Contrast these methods with the edge-detection methods you have learned about." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here are some [demonstrations](http://gandalf.psych.umn.edu/users/kersten/kersten-lab/courses/Psy5036W2015/Lectures/17_PythonForVision/Demos/index.html) designed by Weichao Qiu for the chapter by Yuille and Kersten, relevant to this course, some of which are duplicated in individual links on the class web page." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "###### Python computer vision demonstrations using OpenCV" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "In the next lecture we cover motion perception and optic flow. We will see there an example of using OpenCV to track feature points." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "###### Python neural network resources" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For python code, look at [neurolab](https://pythonhosted.org/neurolab/index.html). This has several topics that should look familiar. \n", "\n", "For python code to simulate spiking neurons, see http://briansimulator.org. " ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": true }, "outputs": [], "source": [ "?np.arange" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.13" } }, "nbformat": 4, "nbformat_minor": 1 }