Assignment 6
Computational Vision
U. Minn. Psy 5036
Daniel Kersten

Off[General::spell1];

Themes

Modeling image variation: Scene-based vs. image-based

Geometric vs. photometric variation

Different generative models make different predictions for recognition inference

Humans easily recognize familiar 3D objects from unfamiliar views. Humans can also recognize a familiar object under an unfamiliar illumination. How is this done? There are many possible models. Thinking about how to model image variation--i.e. the generative process, suggests some basic hypotheses to test, even if we don't have a precise model of recognition.  
One can model viewpoint and illumination change  using "true" 3D scene-based models of image formation. Perhaps the visual system in effect "knows" how the 3D structure of the object interacts with viewpoint and illumination, and uses this knowledge to allow for image variations. 

Alternatively, image variation can be modeled using 2D image-based knowledge. One way this could be done is if the visual system has 2D knowledge of a few instances of images it has seen before, and then interpolates between them to allow for variation (Ullman & Basri, 1991).
In the first two exercises, you are going to see how to model viewpoint change using 3D (scene-based) and 2D (image-based) manipulations. This second (2D) method is just one of many ways to model 2D variations ( e.g. if one has 2D "affine" operations for scale or rotation, or shear that are workable approximations to model 3D depth or 3D rotations over small domains). In these exercises, you will be modeling "geometrical" variation.

In the second two exercises, you will model illumination change using 3D (scene-based) and 2D (image-based) manipulations. In these second two exercises, you will be modeling "photometric" variation.

3D Scene-based modeling of viewpoint change

Generate an n-segmented 3D wire object--"bent paper clip"

s = Table[{Random[]-0.5,Random[]-0.5,Random[]-0.5},{6}];

Connect the points with lines

lines=Partition[s,2,1];

View the object under perspective (e.g. Viewpoint at {-2,-2,-2}) allowing rotations about Viewpoint axis

Manipulate[Graphics3D[{Thick,Rotate[Line[lines],theta,{-1,-1,-1}]},ViewPoint->{-2,-2,-2},PlotRange->{{-1,1},{-1,1},{-1,1}},AspectRatio->1,Axes->True,AxesLabel->{"x","y","z"},ImageSize->Medium,PreserveImageOptions->True],{theta,0,Pi}]

Make an orthographic projection of paper clip by setting the z-coordinate to 0, and using ListPlot[ ]

orthographic[x_]:= Drop[#,-1]&/@x

ortholines=Partition[orthographic[s],2,1];

ListPlot[ortholines,Joined->True,PlotRange->{{-1,1},{-1,1}}]

Define a rotation matrix to rotate each {x, y, z} vertex of the paper clip by θ about a vector {1, 1, 1}.

Dot[RotationMatrix[Pi/16,{1,1,1}],#]&/@s

Rotate the paper clip by θ = Pi/8, and then make an orthographic projection again using ListPlot[ ]

ListPlot[orthographic[Dot[RotationMatrix[Pi/16,{1,1,1}],#]&/@s],Joined->True,PlotRange->{{-1,1},{-1,1}}]

Now make a series of plots from  θ = Pi/8 to 3*Pi/4 in steps of Pi/16. (i.e. iterate {θ,Pi/4,3*Pi/4,Pi/16}).

gorthorotateclips = Table[ListPlot[orthographic[Dot[RotationMatrix[θ,{1,1,1}],#]&/@s],AspectRatio->1,Joined->True,PlotRange->{{-1,1},{-1,1}}],{θ,Pi/8,3*Pi/4,Pi/16}];

2D Image-based modeling of viewpoint change

Make a list of the first view of the above animation, i.e.  θ = Pi/8. Call it firstview.

firstview = orthographic[Dot[RotationMatrix[Pi/8, {1, 1, 1}], #] & /@ s];

Make a list of the last view of the above animation, i.e.  θ = 3*Pi/4. Call it lastview.

lastview = orthographic[Dot[RotationMatrix[3*Pi/4, {1, 1, 1}], #] & /@ s];

Define a function of t that interpolates between the 2D vertices of firstview (t=0) and lastview (t=1)

interview[t_]:= t*lastview + (1-t)*firstview;

Make an animation using ListPlot[ ], for t=0 to 1, in steps of 0.1 (i.e. iterate {t, 0, 1, .1}).

gorthorotateclipsinterv = Table[ListPlot[interview[t],Joined->True, AspectRatio->1,PlotRange->{{-1,1},{-1,1}}],{t,0,1,.1}];

Compare "true" 3D rotations with 2D image-based interpolated approximations

Manipulate[GraphicsRow[{gorthorotateclips[[i]],gorthorotateclipsinterv[[i]]}],{i,1,Dimensions[gorthorotateclips][[1]],1}]

3D scene-based modeling of illumination change

In this section, we will make use of Mathematica's in-built 3D rendering model as used in ListPlot3D.

Range data defines surface list

Range data to define rface list

rface = 255*ImageData[ColorConvert[ImageAdjust@,"Grayscale"]];
{size,hsize}={Dimensions[rface][[1]],Dimensions[rface][[1]]/2}

(Range data from: http://sampl.eng.ohio-state.edu/)
Intensity in a ArrayPlot is inversely proportional to the z (depth) from the camera

GraphicsRow[{Image[rface/255],ListPlot3D[rface,PlotRange->{0,255}]}]

Define ShadedListPlot3D[ ]

ShadedListPlot3D[list_,ref_,illum_] := ListPlot3D[Reverse[rface],PlotRange->{0,255},Mesh->False,AspectRatio->1,Ticks->False,Axes->False,Boxed->False,
	PlotRangePadding -> None,ImageSize->Tiny,PlotStyle->RGBColor[1,1,1],
	Lighting -> {{"Directional", GrayLevel[1],{{0,0,0},illum}}},ViewPoint->{0,0,-10}];

theta = N[Pi/4]; (*light direction*)
gillum=Table[Image@ShadedListPlot3D[rface,ref,{Cos[theta],1,Sin[theta]}],{theta,Pi/4,3*Pi/4,Pi/8}];

2D image-based modeling of illumination change

Initialize left and right illuminated faces

firstframe=;

secondframe=;

Extract graylevel images

leftillumface =ImageData@ColorConvert[firstframe,"Grayscale"];
rightillumface =ImageData@ColorConvert[secondframe,"Grayscale"];

Define interpolation function

interillumface[t_] := t*rightillumface + (1-t)*leftillumface;

gilluminterp=Table[Image@interillumface[t],{t,0,1,.25}];

Compare "true" 3D illumination with linearly image-based interpolated illumination

Manipulate[GraphicsRow[{gillum[[i]],gilluminterp[[i]]}],{i,1,Dimensions[gilluminterp][[1]],1}]

QUESTIONS 1-6

You will be graded on the following

Evaluate and try to understand each of the above sections.

Then type your answers to the following questions:

QUESTIONS 7 -11: Supervised learning using a DCNN

We first set up a deep convolutional neural network to learn to classify image patches belonging to one of three classes:
	{background, elbows, heads}
Each patch is 51x51 pixels. They are in color, so the input tensor has dimensions 3x51x51.

Execute cell to define <trainingset>. Open the enclosed cell if you want to see all of them

trainingset = {->1,->1,->2,->2,->1,->1,->1,->2,->2,->1,->2,->2,->2,->0,->2,->1,->0,->2,->2,->0,->2,->2,->0,->2,->1,->2,->0,->2,->2,->2,->0,->1,->0,->2,->2,->0,->0,->1,->0,->1,->2,->0,->1,->2,->1,->2,->0,->0,->2,->2,->0,->0,->1,->0,->1,->2,->2,->2,->1,->0,->1,->0,->0,->0,->1,->1,->1,->2,->2,->0,->0,->2,->1,->1,->0,->0,->1,->1,->0,->0,->0,->0,->0,->0,->0,->2,->2,->1,->0,->1,->0,->1,->2,->0,->2,->0,->2,->2,->2,->2,->2,->2,->1,->2,->0,->2,->1,->0,->0,->0,->0,->1,->1,->2,->2,->1,->0,->0,->0,->0,->0,->1,->0,->2,->0,->2,->2,->2,->2,->2,->2,->1,->0,->1,->1,->1,->2,->1,->0,->2,->1,->1,->0,->0,->2,->2,->2,->2,->2,->0,->0,->2,->0,->0,->0,->1,->1,->1,->2,->1,->2,->1,->1,->1,->2,->2,->0,->0,->0,->1,->1,->0,->0,->0,->1,->2,->0,->1,->2,->1,->1,->1,->1,->0,->1,->2,->2,->0,->2,->0,->1,->0,->1,->0,->0,->2,->1,->2,->1,->0,->1,->2,->2,->0,->1,->2,->2,->2,->2,->1,->0,->1,->2,->0,->2,->2,->1,->2,->1,->2,->0,->1,->2,->1,->2,->1,->2,->1,->1,->1,->2,->1,->2,->0,->1,->2,->2,->2,->0,->0,->1,->0,->2,->1,->1,->1,->2,->2,->0,->0,->0,->1,->0,->1,->0,->0,->2,->2,->0,->2,->2,->1,->1,->2,->0,->1,->1,->2,->2,->2,->2,->2,->0,->1,->1,->1,->0,->0,->2,->0,->2,->0,->1,->0,->0,->2,->1,->1,->0,->2,->2,->0,->0,->1,->0,->2,->0,->1,->0,->0,->2,->1,->2,->2,->0,->0,->2,->0,->0,->1,->0,->2,->2,->0,->1,->0,->0,->0,->0,->1,->1,->0,->2,->0,->1,->2,->1,->2,->2,->1,->0,->0,->1,->2,->1,->0,->2,->2,->1,->2,->1,->2,->2,->1,->0,->1,->1,->0,->1,->2,->1,->2,->1,->2,->0,->2,->1,->2,->0,->0,->0,->0,->0,->1,->2,->2,->0,->0,->2,->2,->0,->1,->0,->1,->0,->1,->0,->0,->0,->1,->2,->2,->2,->1,->1,->0,->2,->0,->2,->1,->2,->1,->1,->0,->1,->0,->0,->2,->0,->2,->2,->1,->0,->1,->0,->0,->0,->1,->0,->0,->2,->2,->0,->1,->1,->2,->1,->2,->1,->1,->2,->2,->2,->1,->0,->2,->1,->2,->2,->2,->0,->2,->2,->1,->0,->2,->2,->2,->0,->2,->0,->2,->0,->2,->1,->2,->2,->0,->0,->2,->2,->1,->1,->1,->2,->1,->0,->1,->0,->2,->0,->1,->0,->0,->2,->1,->0,->2,->2,->2,->2,->0,->0,->1,->2,->1,->0,->2,->0,->1,->0,->0,->2,->2,->1,->0,->2,->1,->1,->0,->0,->1,->1,->2,->0,->0,->1,->1,->0,->2,->1,->1,->0,->1,->2,->2,->1,->0,->2,->2,->1,->1,->0,->2,->2,->2,->2,->2,->0,->1,->2,->1,->1,->2,->1,->2,->1,->0,->1,->0,->1,->1,->1,->1,->1,->1,->0,->0,->0,->1,->0,->0,->0,->2,->2,->0,->2,->1,->2,->0,->2,->0,->0,->0,->0,->2,->2,->2,->0,->2,->2,->1,->0,->0,->2,->0,->2,->2,->2,->1,->0,->2,->1,->2,->2,->0,->2,->0,->1,->0,->0,->0,->0,->2,->1,->1,->0,->1,->1,->0,->0,->2,->2,->2,->1,->0,->0,->0,->1,->0,->2,->2,->0,->0,->2,->1,->2,->2,->1,->0,->0,->2,->2,->0,->2,->2,->0,->0,->1,->2,->2,->2,->1,->1,->0,->0,->2,->0,->2,->0,->2,->2,->2,->1,->0,->2,->2,->0,->2,->2,->2,->1,->0,->2,->1,->2,->0,->2,->1,->2,->1,->2,->2,->1,->0,->0,->0,->0,->0,->0,->2,->2,->0,->0,->0,->1,->1,->0,->2,->2,->1,->2,->0,->0,->0,->0,->2,->2,->1,->1,->1,->2,->2,->2,->2,->0,->0,->0,->1,->0,->1,->0,->0,->0,->2,->2,->2,->0,->1,->0,->1,->1,->2,->0,->2,->1,->0,->0,->2,->2,->1,->0,->0,->1,->1,->1,->2,->0,->2,->2,->2,->1,->1,->2,->0,->0,->1,->0,->2,->0,->1,->0,->2,->0,->2,->1,->0,->1,->2,->0,->2,->2,->0,->2,->1,->1,->2,->0,->1,->2,->0,->2,->0,->0,->1,->0,->2,->0,->1,->2,->0,->0,->2,->1,->0,->0,->2,->1,->0,->2,->1,->1,->0,->1,->0,->1,->1,->2,->0,->1,->2,->1,->1,->2,->2,->2,->1,->1,->1,->0,->2,->1,->2,->2,->0,->0,->1,->2,->1,->1,->2,->0,->2,->0,->1,->2,->0,->1,->2,->2,->1,->0,->0,->2,->1,->1,->0,->2,->0,->0,->2,->1,->0,->0,->0,->0,->1,->0,->2,->0,->1,->1,->0,->0,->0,->1,->2,->1,->2,->1,->1,->0,->2,->2,->1,->2,->2,->1,->0,->0,->1,->2,->1,->2,->1,->0,->2,->0,->0,->0,->1,->2,->2,->0,->0,->2,->1,->1,->1,->1,->1,->0,->0,->1,->2,->2,->1,->1,->0,->1,->1,->0,->0,->1,->0,->1,->1,->0,->1,->0,->0,->0,->1,->2,->1,->1,->2,->1,->2,->0,->0,->2,->0,->0,->0,->2,->1,->2,->1,->1,->1,->0,->2,->0,->1,->1,->0,->2,->2,->2,->2,->2,->0,->0,->2,->0,->2,->1,->2,->1,->0,->1,->2,->2,->2,->0,->0,->0,->1,->2,->2,->2,->0,->2,->0,->1,->1,->2,->2,->2,->2,->1,->2,->2,->1,->2,->2,->2,->0,->1,->2,->2,->1,->2,->2,->0,->1,->2,->1,->1,->1,->0,->0,->2,->0,->2,->2,->2,->1,->1,->0,->0,->1,->2,->0,->0,->1,->2,->1,->1,->1,->1,->0,->2,->2,->1,->2,->0,->1,->0,->1,->2,->2,->0,->1,->2,->2,->1,->0,->1,->1,->1,->1,->2,->0,->0,->1,->0,->0,->0,->2,->1,->0,->1,->0,->0,->0,->2,->0,->0,->2,->2,->0,->2,->0,->1,->1,->1,->2,->1,->1,->0,->1,->1,->2,->1,->0,->0,->1,->0,->2,->0,->2,->0,->2,->2,->0,->2,->1,->2,->2,->1,->2,->1,->2,->1,->1,->0,->0,->0,->1,->1,->1,->2,->0,->1,->1,->2,->1,->2,->0,->2,->1,->1,->2,->0,->0,->0,->0,->2,->0,->1,->0,->2,->0,->1,->1,->2,->2,->1,->2,->0,->2,->1,->1,->2,->2,->2,->0,->0,->1,->2,->1,->1,->0,->1,->2,->2,->2,->0,->1,->2,->1,->1,->2,->2,->0,->1,->2,->2,->2,->0,->2,->1,->0,->0,->1,->2,->2,->1,->1,->1,->0,->0,->0,->1,->0,->0,->1,->2,->1,->1,->2,->0,->0,->2,->2,->0,->2,->0,->1,->0,->0,->1,->1,->0,->0,->2,->1,->1,->1,->2,->2,->0,->1,->2,->2,->0,->1,->0,->1,->1,->2,->0,->2,->0,->1,->2,->0,->0,->2,->2,->0,->0,->0,->0,->1,->2,->1,->2,->0,->0,->1,->2,->1,->2,->2,->0,->2,->0,->2,->1,->2,->0,->1,->1,->1,->2,->2,->1,->2,->1,->0,->0,->0,->2,->0,->0,->0,->0,->1,->2,->0,->1,->1,->1,->2,->0,->1,->0,->2,->2,->2,->0,->0,->2,->0,->2,->2,->1,->2,->1,->1,->1,->0,->2,->1,->2,->2,->2,->0,->0,->2,->1,->0,->1,->0,->2,->1,->2,->0,->1,->0,->2,->1,->0,->1,->2,->2,->1,->2,->1,->2,->2,->1,->1,->1,->2,->1,->1,->2,->0,->0,->0,->0,->1,->1,->2,->2,->1,->0,->1,->1,->1,->2,->1,->2,->2,->1,->0,->1,->0,->1,->2,->1,->1,->2,->0,->1,->0,->1,->2,->1,->2,->1,->1,->2,->2,->1,->2,->0,->0,->0,->1,->1,->0,->0,->1,->2,->0,->2,->1,->2,->2,->1,->1,->1,->0,->1,->0,->1,->0,->0,->2,->1,->0,->1,->2,->0,->1,->2,->1,->2,->1,->1,->2,->2,->1,->2,->0,->2,->1,->2,->1,->0,->0,->1,->1,->2,->1,->1,->2,->1,->2,->1,->0,->1,->0,->0,->0,->2,->0,->0,->0,->2,->0,->1,->1,->2,->0,->1,->2,->1,->0,->1,->1,->1,->0,->1,->0,->2,->0,->0,->2,->2,->2,->2,->0,->0,->1,->2,->2,->1,->0,->2,->0,->2,->2,->0,->1,->1,->2,->2,->0,->2,->1,->0,->2,->1,->0,->2,->2,->0,->1,->1,->2,->0,->2,->2,->0,->2,->2,->2,->0,->2,->0,->1,->0,->1,->2,->0,->0,->1,->0,->0,->1,->1,->2,->1,->0,->1,->1,->1,->2,->2,->1,->2,->0,->2,->0,->2,->2,->1,->0,->1,->0,->1,->1,->2,->0,->2,->2,->1,->1,->1,->1,->1,->2,->2,->2,->0,->2,->0,->0,->1,->1,->2,->2,->0,->0,->1,->1,->1,->2,->1,->0,->2,->0,->2,->0,->0,->2,->1,->1,->0,->2,->0,->0,->2,->2,->0,->1,->0,->2,->1,->2,->1,->1,->2,->2,->2,->2,->1,->2,->1,->2,->0,->1,->1,->0,->0,->0,->1,->2,->2,->2,->0,->1,->0,->1,->1,->2,->0,->1,->1,->1,->1,->2,->0,->2,->1,->1,->0,->2,->0,->2,->0,->1,->1,->0,->2,->2,->2,->1,->0,->1,->1,->2,->2,->1,->2,->1,->0,->2,->2,->0,->0,->1,->0,->0,->2,->1,->0,->1,->1,->1,->2,->0,->1,->1,->0,->2,->1,->1,->1,->2,->2,->0,->0,->1,->1,->1,->1,->2,->1,->1,->1,->2,->2,->1,->1,->1,->1,->2,->2,->2,->1,->1,->2,->2,->0,->0,->2,->2,->1,->2,->0,->0,->0,->0,->0,->2,->2,->2,->0,->0,->1,->1,->0,->1,->2,->0,->1,->1,->0,->2,->2,->1,->0,->0,->0,->2,->2,->0,->0,->1,->2,->0,->2,->1,->1,->2,->0,->0,->1,->2,->0,->1,->2,->1,->1,->2,->2,->1,->2,->0,->1,->1,->2,->2,->0,->1,->1,->1,->0,->2,->1,->0,->0,->0,->2,->0,->2,->1,->2,->1,->1,->0,->1,->2,->1,->2,->0,->0,->1,->0,->2,->2,->0,->1,->1,->0,->0,->2,->2,->1,->0,->0,->1,->0,->0,->2,->0,->2,->1,->1,->1,->2,->0,->2,->0,->2,->0,->0,->0,->0,->2,->0,->1,->2,->0,->2,->1,->1,->2,->2,->2,->0,->1,->1,->1,->1,->1,->2,->1,->2,->2,->0,->2,->1,->2,->2,->0,->0,->1,->0,->1,->2,->1,->1,->0,->2,->0,->0,->2,->2,->0,->0,->0,->1,->2,->2,->2,->0,->0,->1,->2,->0,->2,->0,->2,->0,->0,->1,->2,->1,->1,->2,->2,->1,->2,->0,->0,->0,->1,->2,->2,->1,->0,->1,->2,->2,->2,->0,->1,->2,->0,->2,->2,->2,->2,->1,->1,->0,->1,->1,->0,->0,->0,->1,->0,->0,->1,->2,->2,->1,->2,->1,->1,->2,->0,->0,->0,->0,->1,->1,->1,->2,->1,->1,->2,->1,->0,->2,->2,->2,->0,->1,->0,->1,->0,->1,->1,->2,->2,->0,->0,->0,->2,->2,->0,->0,->0,->1,->1,->0,->2,->0,->0,->2,->0,->2,->1,->2,->2,->2,->2,->2,->1,->2,->2,->1,->0,->0,->0,->1,->2,->0,->2,->2,->1,->2,->0,->2,->0,->1,->2,->1,->1,->2,->2,->1,->0,->0,->2,->2,->2,->0,->1,->2,->2,->0,->2,->1,->0,->0,->0,->2,->1,->2,->2,->2,->1,->1,->0,->1,->2,->0,->2,->2,->0,->1,->2,->2,->1,->2,->2,->0,->0,->1,->2,->2,->0,->0,->1,->0,->0,->2,->0,->1,->2,->1,->1,->1,->1,->0,->2,->1,->0,->0,->0,->1,->0,->1,->1,->2,->1,->2,->1,->0,->1,->1,->1,->0,->2,->2,->2,->2,->1,->2,->2,->1,->1,->1,->2,->2,->1,->2,->1,->0,->1,->2,->0,->1,->2,->2,->2,->0,->2,->0,->1,->1,->1,->0,->0,->0,->1,->0,->1,->0,->1,->1,->1,->2,->0,->1,->2,->2,->2,->2,->1,->2,->1,->1,->2,->0,->2,->0,->2,->2,->2,->1,->0,->0,->1,->0,->0,->1,->1,->0,->1,->0,->1,->0,->2,->2,->2,->1,->1,->2,->1,->0,->0,->1,->1,->0,->0,->2,->1,->0,->1,->1,->0,->2,->1,->1,->0,->1,->1,->2,->1,->1,->0,->1,->2,->0,->2,->2,->0,->0,->1,->2,->0,->2,->2,->1,->0,->1,->1,->2,->0,->0,->2,->0,->1,->0,->1,->2,->2,->0,->2,->0,->1,->2,->0,->0,->1,->1,->1,->1,->1,->0,->0,->2,->1,->1,->0,->2,->1,->2,->1,->0,->1,->0,->2,->1,->1,->2,->0,->0,->2,->2,->2,->1,->2,->0,->1,->2,->2,->1,->1,->2,->0,->1,->2,->2,->2,->0,->1,->1,->0,->1,->0,->1,->0,->0,->2,->2,->1,->1,->2,->1,->1,->2,->0,->0,->1,->0,->1,->2,->2,->0,->0,->2,->0,->0,->1,->1,->0,->0,->2,->1,->2,->1,->0,->0,->1,->1,->1,->1,->0,->0,->1,->2,->2,->1,->2,->0,->2,->1,->2,->1,->0,->1,->1,->1,->2,->1,->1,->0,->2,->2,->2,->2,->2,->1,->1,->2,->2,->1,->2,->0,->0,->0,->0,->1,->2,->0,->2,->0,->1,->1,->2,->2,->0,->2,->1,->2,->1,->1,->0,->2,->1,->2,->0,->0,->1,->2,->2,->2,->1,->0,->1,->1,->2,->0,->1,->1,->0,->2,->0,->2,->2,->0,->0,->2,->2,->0,->0,->1,->2,->0,->0,->1,->1,->2,->0,->1,->1,->2,->0,->0,->2,->0,->1,->0,->0,->2,->1,->0,->0,->2,->0,->0,->2,->0,->0,->1,->2,->0,->0,->2,->0,->0,->0,->1,->1,->0,->1,->0,->1,->0,->1,->2,->2,->2,->2,->0,->0,->1,->1,->0,->1,->0,->2,->1,->1,->2,->1,->2,->2,->0,->1,->0,->0,->1,->0,->2,->2,->1,->2,->2,->1,->1,->2,->0,->1,->0,->2,->1,->0,->0,->0,->0,->1,->2,->0,->2,->2,->1,->2,->0,->2,->0,->1,->0,->0,->2,->0,->2,->1,->1,->2,->1,->1,->2,->1,->2,->0,->0,->2,->0,->1,->0,->0,->1,->2,->2,->2,->1,->1,->0,->0,->2,->1,->0,->0,->2,->1,->2,->2,->2,->0,->2,->0,->1,->2,->2,->1,->2,->2,->0,->2,->0,->1,->1,->0,->0,->2,->2,->1,->2,->2,->0,->0,->0,->0,->1,->1,->0,->0,->0,->1,->0,->0,->1,->1,->1,->0,->2,->1,->0,->1,->1,->2,->2,->0,->1,->0,->0,->2,->1,->2,->2,->2,->1,->1,->2,->0,->0,->1,->1,->0,->2,->2,->0,->2,->2,->0,->0,->1,->2,->1,->1,->2,->1,->0,->1,->1,->2,->1,->2,->2,->1,->2,->1,->1,->1,->2,->1,->0,->0,->2,->0,->2,->2,->1,->1,->0,->2,->1,->0,->0,->1,->2,->0,->2,->1,->1,->2,->2,->2,->1,->1,->0,->0,->0,->2,->0,->1,->0,->2,->2,->0,->2,->2,->0,->0,->0,->1,->2,->1,->2,->0,->0,->2,->1,->0,->0,->1,->0,->0,->2,->2,->2,->2,->2,->0,->0,->2,->2,->2,->1,->2,->2,->1,->0,->0,->2,->0,->0,->1,->0,->0,->0,->2,->2,->1,->1,->2,->0,->2,->1,->1,->1,->2,->1,->2,->0,->1,->0,->2,->0,->0,->1,->2,->1,->2,->1,->1,->2,->1,->0,->2,->1,->2,->1,->2,->2,->0,->1,->0,->2,->2,->0,->1,->0,->1,->0,->0,->1,->1,->2,->2,->2,->2,->0,->0,->2,->1,->2,->0,->2,->0,->2,->0,->1,->1,->2,->0,->0,->1,->0,->0,->1,->1,->2,->1,->0,->0,->1,->0,->0,->2,->2,->1,->0,->1,->2,->2,->2,->1,->0,->0,->2,->2,->1,->1,->2,->0,->1,->2,->0,->2,->0,->1,->2,->0,->1,->0,->1,->1,->2,->0,->1,->1,->2,->1,->1,->1,->0,->0,->2,->1,->2,->1,->1,->2,->0,->0,->1,->2,->2,->1,->0,->2,->1,->0,->2,->2,->0,->1,->1,->0,->1,->1,->0,->2,->1,->1,->1,->0,->1,->2,->2,->0,->1,->1,->1,->2,->2,->1,->0,->2,->2,->0,->2,->2,->2,->2,->1,->1,->2,->1,->0,->2,->2,->1,->2,->1,->0,->1,->0,->0,->1,->2,->2,->0,->2,->2,->0,->0,->1,->0,->1,->2,->2};

Execute cell to define <testset>. Open the enclosed cell if you want to see all of them

testset = {->0,->2,->0,->2,->0,->0,->2,->2,->1,->1,->0,->1,->0,->0,->2,->2,->2,->0,->2,->0,->0,->1,->0,->1,->1,->0,->2,->0,->2,->0,->2,->0,->0,->1,->0,->2,->1,->1,->2,->2,->1,->1,->1,->1,->0,->2,->0,->2,->2,->1,->1,->0,->0,->0,->0,->1,->0,->1,->2,->0,->1,->0,->0,->1,->1,->0,->0,->2,->2,->0,->2,->2,->1,->1,->1,->2,->2,->1,->2,->2,->0,->1,->2,->1,->1,->1,->0,->0,->2,->1,->1,->2,->0,->1,->2,->1,->0,->0,->2,->0,->0,->0,->1,->1,->1,->1,->2,->0,->2,->2,->1,->0,->1,->2,->0,->2,->0,->0,->2,->0,->1,->2,->1,->2,->1,->2,->0,->1,->2,->2,->0,->2,->2,->0,->0,->0,->2,->0,->2,->2,->2,->0,->1,->1,->1,->1,->2,->2,->2,->1,->1,->2,->1,->1,->1,->2,->1,->0,->1,->1,->1,->0,->1,->0,->0,->1,->2,->0,->1,->1,->2,->0,->2,->0,->1,->2,->0,->0,->0,->2,->2,->2,->0,->0,->0,->0,->1,->0,->1,->0,->0,->0,->0,->2,->2,->2,->2,->0,->0,->0,->2,->2,->2,->2,->0,->1,->2,->1,->1,->1,->1,->1,->0,->2,->2,->2,->2,->2,->1,->2,->0,->0,->2,->0,->0,->0,->0,->1,->2,->2,->2,->1,->0,->2,->0,->0,->1,->1,->2,->1,->0,->1,->0,->2,->1,->0,->0,->0,->0,->0,->1,->1,->1,->1,->2,->2,->0,->2,->1,->0,->2,->0,->0,->1,->2,->0,->1,->0,->2,->1,->0,->1,->2,->2,->0,->1,->1,->2,->2,->2,->0,->1,->0,->2,->2,->1,->0,->0,->0,->0,->0,->2,->1,->0,->2,->1,->1,->2,->0,->2,->2,->1,->1,->0,->1,->2,->2,->2,->1,->2,->0,->0,->0,->0,->1,->1,->0,->0,->2,->0,->1,->2,->0,->0,->2,->2,->1,->0,->2,->1,->1,->1,->2,->2,->2,->0,->0,->0,->1,->0,->1,->0,->1,->0,->1,->1,->1,->2,->0,->1,->2,->1,->2,->2,->1,->2,->0,->2,->0,->1,->0,->2,->0,->1,->2,->1,->1,->0,->1,->1,->2,->0,->1,->0,->0,->1,->2,->2,->1,->0,->1,->2,->2,->0,->2,->2,->0,->0,->1,->2,->2,->1,->0,->2,->0,->2,->1,->2,->2,->2,->0,->0,->1,->0,->2,->2,->0,->1,->0,->1,->0,->2,->1,->2,->2,->1,->1,->0,->2,->0,->0,->1,->0,->2,->2,->1,->1,->1,->1,->1,->2,->2,->2,->0,->1,->1,->0,->0,->2,->1,->2,->1,->2,->0,->1,->1,->2,->1,->0,->0,->2,->0,->0,->0,->2,->0,->1,->2,->2,->2,->1,->2,->2,->1,->0,->1,->1,->2,->0,->0,->2,->1,->1,->0,->1,->0,->2,->2,->2,->0,->0,->0,->0,->2,->1,->0,->0,->2,->1,->0,->1,->2,->2,->1,->0,->2,->1,->0,->1,->1,->2,->0,->2,->0,->2,->2,->2,->2,->0,->2,->0,->2,->1,->0,->1,->1,->0,->2,->2,->1,->2,->1,->2,->1,->2,->1,->1,->0,->1,->2,->1,->0,->0,->0,->0,->2,->0,->2,->2,->0,->2,->1,->2,->1,->1,->1,->2,->0,->0,->2,->0,->1,->2,->1,->0,->1,->1,->2,->1,->1,->2,->0,->2,->2,->0,->2,->2,->1,->0,->2,->0,->1,->1,->2,->2,->1,->2,->0,->2,->0,->1,->0,->2,->2,->0,->0,->2,->2,->1,->1,->0,->1,->0,->1,->2,->2,->2,->1,->2,->1,->1,->1,->1,->1,->1,->1,->2,->0,->1,->0,->2,->1,->2,->2,->0,->1,->0,->0,->0,->1,->0,->0,->0,->1,->1,->0,->0,->1,->2,->2,->2,->0,->2,->2,->0,->2,->0,->1,->0,->1,->1,->0,->1,->2,->2,->1,->2,->0,->0,->1,->1,->2,->2,->1,->0,->0,->2,->1,->2,->0,->2,->1,->0,->1,->2,->0,->2,->2,->2,->0,->1,->1,->2,->0,->1,->1,->1,->1,->1,->1,->2,->2,->2,->2,->0,->0,->1,->1,->1,->1,->2,->0,->2,->1,->1,->1,->0};

Check a random samplings of the training and testsets to see if they seem reasonable

RandomSample[trainingset,12]
RandomSample[testset,12]

Inspect the number of training and test pairs.

{Dimensions[trainingset],Dimensions[testset],Union@Values[trainingset]}

Set up a DCNN to train supervised convolutional network to do head vs. elbow vs. background classification

classes=Union@Values[trainingset]

lenet=NetChain[
{ConvolutionLayer[40,5],Ramp,PoolingLayer[2,2,"Stride"->2],ConvolutionLayer[20,5],Ramp,PoolingLayer[2,2],FlattenLayer[],500,Ramp,3,SoftmaxLayer[]},
"Output"->NetDecoder[{"Class",classes}],
"Input"->NetEncoder[{"Image",{51,51}}]
];

(*trained=NetTrain[lenet,trainingset,{"TrainedNet","LastRoundLoss","LastValidationLoss"},ValidationSet->testset, MaxTrainingRounds->4] produces a problem when summarizing performance using cm=ClassifierMeasurements[trained,testset]; below*)

trained=NetTrain[lenet,trainingset,ValidationSet->testset,MaxTrainingRounds->4]

(For reference, defaults can be changed by specifying options during the setup of NetChain[].)

By taking a small random selection of the results, let’s do a quick inspection of predicted and actual class decisions from testset.

minitest = RandomSample[testset,16]

trained[Keys@minitest]
Values[minitest]

Summarize performance on the whole test set

cm=ClassifierMeasurements[trained,testset];
{"accuracy = ",cm["Accuracy"]}
cm["ConfusionMatrixPlot"]

Output the confusion matrix in standard form. Double check the above accuracy by calculating the proportion correct.

Values@Values[cm["ConfusionFunction"]]//MatrixForm
N@Total@Diagonal[%]/Length[testset]

This performance isn’t very good, given that current DCNN algorithms are getting accuracies within a few percent of perfect and with many more classes.

References

Belhumeur, P., & Kriegman, D. (1996). What is the set of images of an object under all possible lighting conditions? Paper presented at the IEEE Conf. on Computer Vision and Pattern Recognition, San Francisco, CA.
Braje, W. L., Kersten, D., Tarr, M. J., & Troje, N. F. (1998). Illumination effects in face recognition. Psychobiology, 26(4), 371-380.
Fiser, J., & Biederman, I. (2001). Invariance of long-term visual priming to scale, reflection, translation, and hemisphere. Vision Res, 41(2), 221-234.
Grill-Spector, K., Kushnir, T., Edelman, S., Avidan, G., Itzchak, Y., & Malach, R. (1999). Differential processing of objects under various viewing conditions in the human lateral occipital complex. Neuron, 24(1), 187-203.
Liu, Z., Knill, D. C., & Kersten, D. (1995). Object Classification for Human and Ideal Observers. Vision Research, 35(4), 549-568.
Liu, Z., & Kersten, D. (1998). 2D observers for human 3D object recognition? Vision Res, 38(15-16), 2507-2519.
Poggio, T., & Edelman, S. (1990). A network that learns to recognize three-dimensional objects. Nature, 343, 263-266.
Poggio, T., & Ullman, S. (2013). Vision: are models of object recognition catching up with the brain? Annals of the New York Academy of Sciences, 1–11. doi:10.1111/nyas.12148
Rock, I., & Di Vita, J. (1987). A case of viewer-centered object perception. Cognitive Psychology, 19, 280-293.
Tarr, M. J., Kersten, D., & Bulthoff, H. H. (1998). Why the visual recognition system might encode the effects of illumination. Vision Res, 38(15-16), 2259-2275.
Tarr, M. J., & Bülthoff, H. H. (1995). Is human object recognition better described by  geon-structural-descriptions or by multiple-views? Journal of Experimental Psychology: Human Perception and Performance, 21(6), 1494-1505.
Ullman, S., & Basri, R. (1991). Recognition by linear combinations of models. IEEE Transactions on Pattern Analysis and Machine Intelligence, 13(10), 992-1006.
Ullman, S. (1996). High-level Vision: Object Recognition and Visual Cognition. Cambridge, Massachusetts: MIT Press.
Vogels, R., & Biederman, I. (2002). Effects of illumination intensity and direction on object coding in macaque inferior temporal cortex. Cereb Cortex, 12(7), 756-766.