### Features

Digital Visual Effects
*Yung-Yu Chuang*

*with slides by Trevor Darrell* *Cordelia Schmid, David Lowe, *
*Darya Frolova, Denis Simakov, Robert Collins and Jiwon Kim*

**Outline**

• Features

• Harris corner detector

• SIFT

• Extensions

• Applications

**Features**

**Features**

• Also known as interesting points, salient points or keypoints. Points that you can easily point out their correspondences in multiple images using only local information.

**?**

**Desired properties for features**

• Distinctive: a single feature can be correctly matched with high probability.

• Invariant: invariant to scale, rotation, affine, illumination and noise for robust matching

across a substantial range of affine distortion, viewpoint change and so on. That is, it is

repeatable.

**Applications**

• Object or scene recognition

• Structure from motion

• Stereo

• Motion tracking

• …

**Components**

**• Feature detection locates where they are**

**• Feature description describes what they are**

**• Feature matching decides whether two are the **
same one

**Harris corner detector**

**Moravec corner detector (1980)**

• We should easily recognize the point by looking through a small window

*• Shifting a window in any direction should give a *
*large change in intensity*

**Moravec corner detector**

flat

**Moravec corner detector**

flat

**Moravec corner detector**

flat edge

**Moravec corner detector**

flat edge corner

isolated point

###

### ^{} ^{} ^{}

###

*y*
*x*

*y* *x* *I* *v*

*y* *u* *x*

*I* *y* *x* *w* *v*

*u* *E*

,

### )

2### , ( )

### , (

### ) , ( )

### , (

**Moravec corner detector**

*Change of intensity for the shift [u,v]:*

window function

Four shifts: (u,v) = (1,0), (1,1), (0,1), (-1, 1)
*Look for local maxima in min{E}*

intensity shifted

intensity

**Problems of Moravec detector**

• Noisy response due to a binary window function

• Only a set of shifts at every 45 degree is considered

• Only minimum of E is taken into account

Harris corner detector (1988) solves these problems.

**Harris corner detector**

Noisy response due to a binary window function

Use a Gaussian function

**Harris corner detector**

Only a set of shifts at every 45 degree is considered

Consider all small shifts by Taylor’s expansion

**Harris corner detector**

Only a set of shifts at every 45 degree is considered

Consider all small shifts by Taylor’s expansion

###

###

###

*y*
*x*

*y*
*x*

*y*
*x*

*y*
*y*

*x*

*x*

*y*
*x*
*I*
*y*
*x*
*I*
*y*
*x*
*w*
*C*

*y*
*x*
*I*
*y*
*x*
*w*
*B*

*y*
*x*
*I*
*y*
*x*
*w*
*A*

*Bv*
*Cuv*

*Au*
*v*

*u*
*E*

, ,

2 ,

2

2 2

) , ( ) , ( ) , (

) , ( ) , (

) , ( ) , (

2 )

, (

###

### ^{} ^{} ^{}

###

*y*
*x*

*y* *x* *I* *v*

*y* *u* *x*

*I* *y* *x* *w* *v*

*u* *E*

,

### )

2### , ( )

### , (

### ) , ( )

### , (

###

### ^{} ^{}

###

*y*
*x*

*y*

*x*

*u* *I* *v* *O* *u* *v*

*I* *y* *x* *w*

,

2 2 2

### , ) (

### )

### ,

### (

**Harris corner detector**

*Equivalently, for small shifts [u,v] we have a bilinear *
approximation:

**, where M is a 22 matrix computed from image derivatives:**

### _{}

###

###

###

###

*v* *v* *u*

*u* *v*

*u*

*E* ( , ) **M**

### _{} ^{}

###

###

###

###

###

*y*

*x* *x* *y* *y*

*y*
*x*
*x*

*I* *I*

*I*

*I* *I* *y* *I*

*x* *w*

, 2

2

### )

### ,

### (

**M**

**Harris corner detector (matrix form)**

**Mu** **u**

**x** **u** **u** **x**

**x** **u**

**x** **u**

**x** **u**

**x**

**u**

_{0}

_{0}*T*

*T*
*T*

*T*

*T*

*I* *I*

*I*

*I* *I* *I*

*I* *I*

*E*

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

### | ) (

### ) (

### | ) (

2

2 0 0

2

**Harris corner detector**

*Only minimum of E is taken into account*

A new corner measurement by investigating the shape of the error function

represents a quadratic function; Thus, we
*can analyze E’s shape by looking at the property *
**of M**

**Mu**

**u**

^{T}**Harris corner detector**

High-level idea: what shape of the error function will we prefer for features?

0 2 4 6 8 10 12

0 5

10 0 20 40 60 80 100

0 2 4 6 8 10 12

0 5

10 0 20 40 60 80 100

0 2 4 6 8 10 12

0 5

10 0 20 40 60 80 100

flat edge corner

**Quadratic forms**

• Quadratic form (homogeneous polynomial of
*degree two) of n variables x**i*

• Examples

=

**Symmetric matrices**

• Quadratic forms can be represented by a real
**symmetric matrix A where**

**Eigenvalues of symmetric matrices**

*Brad Osgood*

**Eigenvectors of symmetric matrices**

**Eigenvectors of symmetric matrices**

###

###

**z** **z**

**y** **Λ** **y**

**Λ**

**Λy** **y**

**x** **Q** **Λ**

**x** **Q**

**x** **Q** **Λ** **Q** **x**

**Ax** **x**

**T**

**T**
**T**

**T** **T**
**T**

**T**
**T**

**T**

**2****1**
**2****1**

###

###

###

###

###

1
1*q*

2
2*q*

### 1 **x**

^{T}**x**

### 1

**z**

**z**

^{T}**Harris corner detector**

Intensity change in shifting window: eigenvalue analysis

_{1}^{, }_{2 }– eigenvalues of **M**

**direction of the **
**slowest change**
**direction of the **

**fastest change**

(_{max})^{-1/2}

(_{min})^{-1/2}
*Ellipse E(u,v) = const*

### _{}

###

###

###

###

*v* *v* *u*

*u* *v*

*u*

*E* ( , ) , **M**

**Visualize quadratic functions**

*T*

1 0

0 1

1 0

0 1

1 0

0 1

1 0

0
**A** 1

**Visualize quadratic functions**

*T*

1 0

0 1

1 0

0 4

1 0

0 1

1 0

0
**A** 4

**Visualize quadratic functions**

*T*

50 . 0 87

. 0

87 . 0 50

. 0 4

0

0 1

50 . 0 87

. 0

87 . 0 50

. 0 75

. 1 30

. 1

30
.
1
25
.
**A** 3

**Visualize quadratic functions**

*T*

50 . 0 87

. 0

87 . 0 50

. 0 10

0

0 1

50 . 0 87

. 0

87 . 0 50

. 0 25

. 3 90

. 3

90 . 3 75

.
**A** 7

**Harris corner detector**

_{1}

_{2}

Corner

_{1}^{ and }_{2} are large,

_{1 }~ _{2};

*E* increases in all
directions

_{1} and _{2} are small;

*E* is almost constant
in all directions

edge

_{1}^{ >> }_{2}
edge

_{2}^{ >> }_{1}

flat Classification of

image points

using eigenvalues
**of M:**

**Harris corner detector**

Measure of corner response:

*(k – empirical constant, k = 0.04-0.06)*

2

4 )

( _{00} _{11} ^{2} _{10} _{01}

11

00 *a* *a* *a* *a* *a*

*a*

### ^{trace}

^{2}

### det **M k** **M**

**M k**

*R*

2 1

2 1

### trace det

###

###

###

###

###

###

### **M**

**M**

Only for reference, you do not need

them to compute R

**Harris corner detector**

**Another view**

**Another view**

**Another view**

**Summary of Harris detector**

1. Compute x and y derivatives of image

2. Compute products of derivatives at every pixel

3. Compute the sums of the products of derivatives at each pixel

*I* *G*

*I*

_{x}###

_{}

^{x}### *I*

_{y}### *G*

_{}

^{y}### *I*

*x*

*x*

*I*

*x*

*I*

*I*

2 ### *I*

*y*2

### *I*

*y*

### *I*

*y*

*I*

*xy*

### *I*

*x*

### *I*

*y*

2

2 ' *x*

*x*

*G* *I*

*S*

_{}

### *S*

_{y}^{2}

### *G*

_{}

_{'}

### *I*

_{y}^{2}

*S*

_{xy}### *G*

_{}

_{'}

### *I*

_{xy}**Summary of Harris detector**

4. Define the matrix at each pixel

5. Compute the response of the detector at each pixel

6. Threshold on value of R; compute nonmax suppression.

###

###

###

###

###

###

### ) , ( )

### , (

### ) , ( )

### , ) (

### , (

2 2

*y* *x* *S*

*y* *x* *S*

*y* *x* *S*

*y* *x* *y* *S*

*x* *M*

*xy* *y*
*x* *xy*

### ^{trace}

^{2}

### det *M* *k* *M*

*R*

**Harris corner detector (input)**

**Corner response R**

**Threshold on R**

**Local maximum of R**

**Harris corner detector**

**Corner detection demo**

http://www.cim.mcgill.ca/~dparks/CornerDetector/mainApplet.htm

**Harris detector: summary**

*• Average intensity change in direction [u,v] can be *
expressed as a bilinear form:

*• Describe a point in terms of eigenvalues of M:*

*measure of corner response*

*• A good (corner) point should have a large intensity *
*change in all directions, i.e. R should be large *

positive

### _{}

###

###

###

###

*v* *v* *u*

*u* *v*

*u*

*E* ( , ) , **M**

###

_{1}

_{2}

###

^{2}

2

1

###

###

### *k*

*R*

**Now we know where features are**

• But, how to match them?

• What is the descriptor for a feature? The

simplest solution is the intensities of its spatial neighbors. This might not be robust to

brightness change or small shift/rotation.

### ( )

**1** **2** **3**

**4** **5** **6**

**7** **8** **9**

**1** **2** **3** **4** **5** **6** **7** **8** **9**

**Harris detector: some properties**

*• Partial invariance to affine intensity change*

Only derivatives are used =>

*invariance to intensity shift I I + b*

* Intensity scale: I a I*

*R*

*x *(image coordinate)
threshold

*R*

*x *(image coordinate)

**Harris Detector: Some Properties**

• Rotation invariance

Ellipse rotates but its shape (i.e. eigenvalues) remains the same

*Corner response **R* is invariant to image rotation

**Harris Detector is rotation invariant**

Repeatability rate:

# correspondences

# possible correspondences

**Harris Detector: Some Properties**

*• But: not invariant to image scale!*

All points will be classified as edges

**Corner !**

**Harris detector: some properties**

• Quality of Harris detector for different scale changes

Repeatability rate:

# correspondences

# possible correspondences

**Scale invariant detection**

• Consider regions (e.g. circles) of different sizes around a point

• Regions of corresponding sizes will look the same in both images

**Scale invariant detection**

• The problem: how do we choose corresponding circles independently in each image?

• Aperture problem

**SIFT **

**(Scale Invariant Feature **

**Transform)**

**SIFT**

• SIFT is an carefully designed procedure with empirically determined parameters for the invariant and distinctive features.

**SIFT stages:**

• Scale-space extrema detection

• Keypoint localization

• Orientation assignment

• Keypoint descriptor

## ( )

local descriptor

**detector**

**descriptor**

**A 500x500 image gives about 2000 features**

**1. Detection of scale-space extrema**

• For scale invariance, search for stable features across all possible scales using a continuous

function of scale, scale space.

• SIFT uses DoG filter for scale space because it is efficient and as stable as scale-normalized

Laplacian of Gaussian.

**DoG filtering**

Convolution with a variable-scale Gaussian

Difference-of-Gaussian (DoG) filter

Convolution with the DoG filter

**Scale space**

doubles for the next octave

K=2^{(1/s)}

Dividing into octave is for efficiency only.

**Detection of scale-space extrema**

**Keypoint localization**

X is selected if it is larger or smaller than all 26 neighbors

**Decide scale sampling frequency**

• It is impossible to sample the whole space, tradeoff efficiency with completeness.

• Decide the best sampling frequency by

experimenting on 32 real image subject to synthetic transformations. (rotation, scaling, affine stretch, brightness and contrast change, adding noise…)

**Decide scale sampling frequency**

**Decide scale sampling frequency**

s=3 is the best, for larger s, too many unstable features for detector,

repeatability for descriptor,

distinctiveness

**Pre-smoothing**

=1.6, plus a double expansion

**Scale invariance**

**2. Accurate keypoint localization**

• Reject points with low contrast (flat) and poorly localized along an edge (edge)

• Fit a 3D quadratic function for sub-pixel maxima

1

6

5

-1 0 +1

**2. Accurate keypoint localization**

• Reject points with low contrast (flat) and poorly localized along an edge (edge)

• Fit a 3D quadratic function for sub-pixel maxima

1

6

5

-1 0 +1

2

2 ) 0 ( ) ''

0 ( ' )

0 ( )

( *f* *x*

*x*
*f*

*f*
*x*

*f*

3
ˆ 1
*x*

2

2 6 2 3

2 2 6

6 )

(*x* *x* *x* *x* *x*

*f*
0

6 2 ) (

' *x* *x*
*f*

3 61 3

3 1 3 2 1 6 ˆ)

(

2

*x*

*f*
3

61

3 1

**2. Accurate keypoint localization**

• Taylor series of several variables

• Two variables

^{2} ^{2} 2 ^{2} ^{2} ^{2}

2 ) 1

0 , 0 ( )

,

( *y*

*y*
*y*
*xy* *f*

*y*
*x*
*x* *f*

*x*
*x*
*y* *f*

*y*
*x* *f*

*x*
*f* *f*

*y*
*x*
*f*

###

_{}

*y*
*x*

*y*
*y*

*f*
*y*

*x*
*f*

*y*
*x*

*f*
*x*

*x*
*f*
*y*

*y* *x*
*x*
*y*

*f*
*x*

*f* *f*
*y*

*f* *x* _{2} _{2}

2 2

2 1 0

0

###

^{x}**x** **x**
**x** **x**

**0**

**x** _{2}

2

2 1

*f* *f*

*f*

*f* ^{T}

*T*

**Accurate keypoint localization**

**• Taylor expansion in a matrix form, x is a vector, **
*f maps x to a scalar *

*x**n*

*f*
*x*

*f*
*x*

*f*

^{1}

1

2 2

2 2

1 2

2 2 2

2 2

1 2

2 1

2

2 1

2 2

1 2

*n*
*n*

*n*

*n*
*n*

*x*
*f*
*x*

*x*
*f*
*x*

*x*
*f*

*x*
*x*

*f*
*x*

*f*
*x*

*x*
*f*

*x*
*x*

*f*
*x*

*x*
*f*
*x*

*f*

Hessian matrix (often symmetric) gradient

**2D illustration**

**2D example**

**-17 -1** **-1**

**7** **7** **7**

**7** **-9**

**-9**

**Derivation of matrix form**

**x** **g** **x** )

^{T}### (

*h*

###

###

**x**

*h*

**Derivation of matrix form**

**x** **g** **x** )

^{T}### (

*h*

###

###

###

###

###

###

###

###

###

###

*n*
*n*

*x* *x* *g*

*g*

1 1

###

###

^{n}*i*

*i*
*i*

*x* *g*

1

**x** **g**

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

*n*
*n*

*g* *g*

*x* *h* *x*

*h*

*h*

1 1

**Derivation of matrix form**

**Ax** **x**

**x** )

^{T}### (

*h*

###

###

**x**

*h*

**Derivation of matrix form**

**Ax** **x**

**x** )

^{T}### (

*h*

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

*n*
*nn*

*n*

*n*
*n*

*x* *x*

*a* *a*

*a* *a*

*x*

*x*

###

###

###

###

###

###

1

1

1 11

1

###

###

^{n}*i*

*n*

*j*

*j*
*i*
*ij*

*x* *x* *a*

1 1

**Ax** **x**

**x** **A**

**T**

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

*n*

*i*

*n*

*j*

*j*
*nj*
*i*

*in*
*n*

*i*

*n*

*j*

*j*
*j*
*i*

*i*

*n*

*x* *a* *x*

*a*

*x* *a* *x*

*a*

*x* *h* *x*

*h* *h*

1 1

1 1

1 1

1

###

###

**x** **A** **A**

^{T}### )

### (

###

**Derivation of matrix form**

*f* *x* *x* *f*

*f* *f*

*f*

*f*

^{T}2 2 2

2 2

2

### 2 1

**x** **x**

**x** **x**

**x**

**x**

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

###

**Accurate keypoint localization**

**• x is a 3-vector**

• Change sample point if offset is larger than 0.5

• Throw out low contrast (<0.03)

**Accurate keypoint localization**

• Throw out low contrast ^{|} ^{D}^{(}^{x}^{ˆ}^{)} ^{|}^{} ^{0}^{.}^{03}

**x** **x**

**x** **x**
**x** **x**

**x**
**x**

**x** **x**
**x**

**x**
**x**

**x**
**x**

**x** **x**
**x**

**x**
**x**

**x**
**x**

**x** **x**
**x**

**x** **x**
**x**

**x** **x**
**x**

2 ˆ 1

ˆ) 2 (

ˆ 1 2 ˆ 1

2 ˆ 1

2 ˆ 1

ˆ 2 ˆ

ˆ 1 ˆ)

(

1 2 2

1 2 2 2 2 2

2

1 2 2 2

1 2 2 2

2 2

*T*

*T*
*T*

*T*
*T*

*T* *T*
*T*

*T* *T*

*T*
*T*

*D* *D*

*D*
*D* *D*

*D*
*D*

*D*
*D* *D*

*D*
*D*

*D*
*D*

*D*
*D* *D*

*D*
*D*

*D*
*D*

*D*
*D* *D*

*D*
*D* *D*

*D*

**Eliminating edge responses**

r=10 Let

Keep the points with

Hessian matrix at keypoint location

**Maxima in D**

**Remove low contrast and edges**

**Keypoint detector**

**233x89** **832 extrema**

**729 after con-**

**trast filtering** **536 after cur-**
**vature filtering**

**3. Orientation assignment**

• By assigning a consistent orientation, the

keypoint descriptor can be orientation invariant.

• For a keypoint, L is the Gaussian-smoothed image with the closest scale,

orientation histogram (36 bins)
*(Lx, Ly)*

*m*
*θ*

**Orientation assignment**

**Orientation assignment**

**Orientation assignment**

**Orientation assignment**

**σ=1.5*scale of **
**the keypoint**

**Orientation assignment**

**Orientation assignment**

**Orientation assignment**

**accurate peak position **
**is determined by fitting**

**Orientation assignment**

0 2

36-bin orientation histogram over 360°,

weighted by m and 1.5*scale falloff Peak is the orientation

Local peak within 80% creates multiple orientations

About 15% has multiple orientations and they contribute a lot to stability

**SIFT descriptor**

**4. Local image descriptor**

• Thresholded image gradients are sampled over 16x16 array of locations in scale space

• Create array of orientation histograms (w.r.t. key orientation)

• 8 orientations x 4x4 histogram array = 128 dimensions

• Normalized, clip values larger than 0.2, renormalize

**σ=0.5*width**

**Why 4x4x8?**

**Sensitivity to affine change**

**Feature matching**

• for a feature x, he found the closest feature x_{1}
and the second closest feature x_{2}. If the

distance ratio of d(x, x_{1}) and d(x, x_{1}) is smaller
than 0.8, then it is accepted as a match.

**SIFT flow**

**Maxima in D**

**Remove low contrast**

**Remove edges**

**SIFT descriptor**

**Estimated rotation**

• Computed affine transformation from rotated image to original image:

0.7060 -0.7052 128.4230 0.7057 0.7100 -128.9491 0 0 1.0000

• Actual transformation from rotated image to original image:

0.7071 -0.7071 128.6934 0.7071 0.7071 -128.6934 0 0 1.0000

**SIFT extensions**

**PCA**

**PCA-SIFT**

• Only change step 4

• Pre-compute an eigen-space for local gradient patches of size 41x41

• 2x39x39=3042 elements

• Only keep 20 components

• A more compact descriptor

**GLOH (Gradient location-orientation histogram)**

17 location bins 16 orientation bins

Analyze the 17x16=272-d

eigen-space, keep 128 components SIFT is still considered the best.

SIFT

**Multi-Scale Oriented Patches**

• Simpler than SIFT. Designed for image

matching. [Brown, Szeliski, Winder, CVPR’2005]

• Feature detector

– Multi-scale Harris corners

– Orientation from blurred gradient – Geometrically invariant to rotation

• Feature descriptor

– Bias/gain normalized sampling of local patch (8x8) – Photometrically invariant to affine changes in

intensity

**Multi-Scale Harris corner detector**

• Image stitching is mostly concerned with

matching images that have the same scale, so sub-octave pyramid might not be necessary.

### 2

*s*

**Multi-Scale Harris corner detector**

smoother version of gradients

Corner detection function:

Pick local maxima of 3x3 and larger than 10

**Keypoint detection function**

Experiments show roughly the same performance.

**Non-maximal suppression**

• Restrict the maximal number of interest points, but also want them spatially well distributed

• Only retain maximums in a neighborhood of
*radius r.*

*• Sort them by strength, decreasing r from *

infinity until the number of keypoints (500) is satisfied.

**Non-maximal suppression**

**Sub-pixel refinement**

**Orientation assignment**

• Orientation = blurred gradient

**Descriptor Vector**

• Rotation Invariant Frame

– Scale-space position (x, y, s) + orientation ()

**MOPS descriptor vector**

• 8x8 oriented patch sampled at 5 x scale. See TR for details.

• Sampled from with spacing=5

8 pixels

40 pixels

**MOPS descriptor vector**

• 8x8 oriented patch sampled at 5 x scale. See TR for details.

• Bias/gain normalisation: I’ = (I – )/

• Wavelet transform

8 pixels

40 pixels

**Detections at multiple scales**

**Summary**

• Multi-scale Harris corner detector

• Sub-pixel refinement

• Orientation assignment by gradients

• Blurred intensity patch as descriptor

**Feature matching**

• Exhaustive search

*– for each feature in one image, look at all the other *
features in the other image(s)

• Hashing

– compute a short descriptor from each feature vector, or hash longer descriptors (randomly)

• Nearest neighbor techniques

*– k-trees and their variants (Best Bin First)*

**Wavelet-based hashing**

• Compute a short (3-vector) descriptor from an 8x8 patch using a Haar “wavelet”

• Quantize each value into 10 (overlapping) bins
(10^{3} total entries)

• [Brown, Szeliski, Winder, CVPR’2005]

**Nearest neighbor techniques**

*• k-D tree*
and

• Best Bin First

(BBF)

Indexing Without Invariants in 3D Object Recognition, Beis and Lowe, PAMI’99

**Applications**

**Recognition**

**SIFT Features**

**3D object recognition**

**3D object recognition**

**Office of the past**

Video of desk Images from PDF

**Track & **

**recognize**

T T+1

Internal representation

**Scene Graph**

Desk Desk

### …

> 5000 imageschange in viewing angle

**Image retrieval**

22 correct matches

**Image retrieval**

### …

> 5000 images change in viewing angle+ scale change

**Image retrieval**

**Robot location**

**Robotics: Sony Aibo**

SIFT is used for

Recognizing

charging station

Communicating with visual cards

Teaching object recognition

soccer

**Structure from Motion**

• The SFM Problem

– Reconstruct scene geometry and camera motion from two or more images

**Track**

**2D Features** **Estimate**

**3D** **Optimize**

**(Bundle Adjust)**

**Fit Surfaces**

**SFM Pipeline**

**Structure from Motion**

**Poor mesh** **Good mesh**

**Augmented reality**

**Automatic image stitching**

**Automatic image stitching**

**Automatic image stitching**

**Automatic image stitching**

**Automatic image stitching**

**Reference**

• Chris Harris, Mike Stephens, A Combined Corner and Edge Detector , 4th Alvey Vision Conference, 1988, pp147-151.

• David G. Lowe,

Distinctive Image Features from Scale-Invariant Keypoints,

International Journal of Computer Vision, 60(2), 2004, pp91-110.

• Yan Ke, Rahul Sukthankar,

PCA-SIFT: A More Distinctive Representation for Local Image Descri ptors

, CVPR 2004.

• Krystian Mikolajczyk, Cordelia Schmid,

A performance evaluation of local descriptors, Submitted to PAMI, 2004.

• SIFT Keypoint Detector, David Lowe.

• Matlab SIFT Tutorial, University of Toronto.