<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-18848565</id><updated>2011-09-19T07:29:53.204-05:00</updated><title type='text'>Research Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>37</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-18848565.post-5315863713941540240</id><published>2007-10-18T16:19:00.000-05:00</published><updated>2007-10-18T16:20:44.282-05:00</updated><title type='text'>Moving</title><content type='html'>My research blog is moving: here is the new URL:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mit.edu/%7Ejglov/research/"&gt;http://www.mit.edu/~jglov/research/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-5315863713941540240?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/5315863713941540240/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=5315863713941540240' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/5315863713941540240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/5315863713941540240'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2007/10/moving.html' title='Moving'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-7832793142599051140</id><published>2007-08-08T16:16:00.000-05:00</published><updated>2007-08-08T16:22:51.126-05:00</updated><title type='text'>New Manipulation Timeline</title><content type='html'>GOAL PLAN&lt;br /&gt;&lt;br /&gt;(F 8-10)  goal 1: pick up 1 object (known geometry)&lt;br /&gt;(T 8-14)  goal 2: locate, pick up object from a pile (known geometry)&lt;br /&gt;(T 8-21)  goal 3: pick up 1 object (probabilistic geometry)&lt;br /&gt;(T 8-28)  goal 4: pick up object from a pile (probabilistic geometry)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;DAILY PLAN&lt;br /&gt;&lt;br /&gt;W 8-08:  mount camera, calibrate camera (image to world)&lt;br /&gt;R 8-09:  locate object in image, write grasp planner (search for&lt;br /&gt;............ intersecting friction cones), demonstrate picking up object&lt;br /&gt;F 8-10:  &lt;span style="font-weight: bold;"&gt;*** goal 1 experiments, collect data &amp; images ***&lt;/span&gt;&lt;br /&gt;S 8-11:  write goal 4 pseudo-code&lt;br /&gt;S 8-12:  segmentation, layer analysis, determine goal 4 daily plan&lt;br /&gt;............ (with nick)&lt;br /&gt;M 8-13:  write object pile planner, demonstrate picking up objects&lt;br /&gt;T 8-14:  &lt;span style="font-weight: bold;"&gt;*** goal 2 experiments, collect data &amp; images ***&lt;/span&gt;&lt;br /&gt;W 8-15:  find correspondences, then use PCA to plan grasp on&lt;br /&gt;............. projected contour&lt;br /&gt;R 8-16:  write probablistic grasp planner pseudo-code&lt;br /&gt;F 8-17:  implement probablistic grasp planner&lt;br /&gt;S 8-18: (out of town)&lt;br /&gt;S 8-19: (out of town)&lt;br /&gt;M 8-20:  demonstrate picking up object (with probabilistic&lt;br /&gt;............. geometry)&lt;br /&gt;T 8-21:  &lt;span style="font-weight: bold;"&gt;*** goal 3 experiments, collect data &amp; images ***&lt;/span&gt;&lt;br /&gt;W 8-22:&lt;br /&gt;R 8-23:&lt;br /&gt;F 8-24:&lt;br /&gt;S 8-25:&lt;br /&gt;S 8-26:&lt;br /&gt;M 8-27:&lt;br /&gt;T 8-28:  &lt;span style="font-weight: bold;"&gt;*** goal 4 experiments, collect data &amp; images ***&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-7832793142599051140?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/7832793142599051140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=7832793142599051140' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/7832793142599051140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/7832793142599051140'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2007/08/new-manipulation-timeline.html' title='New Manipulation Timeline'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-9103780025693096519</id><published>2007-07-12T23:02:00.000-05:00</published><updated>2007-07-12T23:04:50.773-05:00</updated><title type='text'>Manipulation Timeline</title><content type='html'>&lt;span style="color: rgb(255, 0, 0);"&gt;(7-16)&lt;/span&gt;   1. drive around and process images of the ground&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;(7-20)&lt;/span&gt;    2. pick up single object with known geometry&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;(7-27)&lt;/span&gt;    3. pick up objects with known geometry from a pile&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;(8-3) &lt;/span&gt;    4. pick up single object with unknown (probabilistic) geometry&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;(8-17)&lt;/span&gt;    5. pick up objects with unknown (probabilistic) geometry from a pile&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-9103780025693096519?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/9103780025693096519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=9103780025693096519' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/9103780025693096519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/9103780025693096519'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2007/07/manipulation-timeline.html' title='Manipulation Timeline'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-2635303240907944396</id><published>2007-07-12T22:23:00.000-05:00</published><updated>2007-07-12T23:02:06.056-05:00</updated><title type='text'>Thesis Timeline</title><content type='html'>I. Introduction&lt;br /&gt;    - specific example&lt;br /&gt;    - motivation&lt;br /&gt;    - contribution&lt;br /&gt;&lt;br /&gt;II. Background &amp; Related Work&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;(7-31)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;III. Geometry&lt;br /&gt;    - Procrustes&lt;br /&gt;    - mean shape&lt;br /&gt;    - tangent space PCA&lt;br /&gt;    - model inference&lt;br /&gt;    - shape completion&lt;br /&gt;    - anecdotal results&lt;br /&gt;    - marginalization vs. completion&lt;br /&gt;&lt;br /&gt;IV. Data Assocation&lt;br /&gt;    - graphical models&lt;br /&gt;    - COPAP algorithms&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;(8-15)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;V. Experimental Results&lt;br /&gt;    - MPEG-II Shape B&lt;br /&gt;    - Manipulation&lt;br /&gt;&lt;br /&gt;VI. Conclusion&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;(8-31)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-2635303240907944396?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/2635303240907944396/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=2635303240907944396' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/2635303240907944396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/2635303240907944396'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2007/07/thesis-timeline.html' title='Thesis Timeline'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-6034649318890596985</id><published>2007-05-09T17:24:00.000-05:00</published><updated>2007-05-09T17:44:20.217-05:00</updated><title type='text'>Graphical Models for COPAP</title><content type='html'>At a high level, the graphical model for COPAP looks like this:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_uJJ12QjUj7M/RkJOK5w2WeI/AAAAAAAAAGc/HB6vyNRfqVo/s1600-h/graphical_model_high.png"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_uJJ12QjUj7M/RkJOK5w2WeI/AAAAAAAAAGc/HB6vyNRfqVo/s400/graphical_model_high.png" alt="" id="BLOGGER_PHOTO_ID_5062694880329226722" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;where phi is the correspondence vector from shape x to shape y. The independence assumption in local features breaks the model into&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_uJJ12QjUj7M/RkJOK5w2WfI/AAAAAAAAAGk/PJSSHfFKtx8/s1600-h/graphical_model_xi_yi_phi.png"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_uJJ12QjUj7M/RkJOK5w2WfI/AAAAAAAAAGk/PJSSHfFKtx8/s400/graphical_model_xi_yi_phi.png" alt="" id="BLOGGER_PHOTO_ID_5062694880329226738" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;where {x_i} and {y_i} are local shape descriptors. We wish to maximize P(phi|x,y), which is broken down into (1/Z)*P(x,y|phi)*P(phi), where Z is a normalizing constant. We model P(x,y|phi) using the PLSD assignment costs. In order to model P(phi), we note that building the cyclic-ordering constraint into P(phi) introduces dependencies between the phi_i's. In fact, these dependencies will be non-Markovian since phi_i depends on the last non-zero (i.e. non-skipped) assignment, which may or may not be phi_{i-1}. However, we can transform the model for P(phi) into a cyclic Markov chain by adding the following state:&lt;br /&gt;&lt;br /&gt;alpha_i = last non-zero assignment (before phi_i)&lt;br /&gt;omega_i = wrapping point (i.e. j s.t. phi_j &lt; alpha_j)&lt;br /&gt;&lt;br /&gt;In a legal matching, all omega_i's must be the same (i.e. there is only one wrapping assignment), and aside from the wrapping assignment, phi_i &gt; alpha_i for all i. Graphically, the structure is:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_uJJ12QjUj7M/RkJOLJw2WgI/AAAAAAAAAGs/iLTfoS-Hi7k/s1600-h/graphical_model_phi_prime.png"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_uJJ12QjUj7M/RkJOLJw2WgI/AAAAAAAAAGs/iLTfoS-Hi7k/s400/graphical_model_phi_prime.png" alt="" id="BLOGGER_PHOTO_ID_5062694884624194050" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;where the graph wraps around on itself to form a cycle. If we collapse the tuple (phi_i, alpha_i, omega_i) into a single variable, phi'_i, we get the following cyclic Markov chain:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_uJJ12QjUj7M/RkJOLJw2WhI/AAAAAAAAAG0/4FIuALrw3nA/s1600-h/graphical_model_phi_prime_circle.png"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_uJJ12QjUj7M/RkJOLJw2WhI/AAAAAAAAAG0/4FIuALrw3nA/s400/graphical_model_phi_prime_circle.png" alt="" id="BLOGGER_PHOTO_ID_5062694884624194066" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Now, if we knew ahead of time where the wrapping point was going to be (i.e. omega_i = k for all i, k known), then the cycle would be broken between phi'_{k-1} and phi'_k, yielding a linear chain:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_uJJ12QjUj7M/RkJOLJw2WiI/AAAAAAAAAG8/IY35-SuN0dQ/s1600-h/graphical_model_phi_prime_one_omega.png"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_uJJ12QjUj7M/RkJOLJw2WiI/AAAAAAAAAG8/IY35-SuN0dQ/s400/graphical_model_phi_prime_one_omega.png" alt="" id="BLOGGER_PHOTO_ID_5062694884624194082" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Therefore a naive approach (and the approach we will ultimately use, with some modifications), is to simply try each wrapping point, k, each time solving the linear Markov chain using dynamic programming, and then to pick the k that yields the maximum likelihood assignment vector, phi.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-6034649318890596985?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/6034649318890596985/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=6034649318890596985' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/6034649318890596985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/6034649318890596985'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2007/05/graphical-models-for-copap.html' title='Graphical Models for COPAP'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_uJJ12QjUj7M/RkJOK5w2WeI/AAAAAAAAAGc/HB6vyNRfqVo/s72-c/graphical_model_high.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-300360846716273542</id><published>2007-05-07T18:36:00.000-05:00</published><updated>2007-05-07T18:47:50.391-05:00</updated><title type='text'>MPEG-7 Shape Classification Results</title><content type='html'>15 training shapes per class, 5 testing shapes. Classification rates were about as expected, perhaps slightly better than expected, since correct classification means that the correct model must have the highest likelihood out of all 70 shape models. In other words, there is no difference between 2nd best and worst in terms of classification error.  &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_uJJ12QjUj7M/Rj-47pw2WbI/AAAAAAAAAGE/F1efW8_Q9H8/s1600-h/class_rate_pcs.png"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_uJJ12QjUj7M/Rj-47pw2WbI/AAAAAAAAAGE/F1efW8_Q9H8/s400/class_rate_pcs.png" alt="" id="BLOGGER_PHOTO_ID_5061967841150261682" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Figure 1. Classification rate (averaged over all shape classes) vs. number of principle components retained in the tangent space PCA shape models in each class.  There was an error in the classification with 15 PCs (perhaps due to singularities).  On average, overfitting does not appear to be a major problem in the models since the classification rate increases monotonically with model dimensionality.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_uJJ12QjUj7M/Rj-47pw2WcI/AAAAAAAAAGM/klwhrfMkRQc/s1600-h/class_rates.png"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_uJJ12QjUj7M/Rj-47pw2WcI/AAAAAAAAAGM/klwhrfMkRQc/s400/class_rates.png" alt="" id="BLOGGER_PHOTO_ID_5061967841150261698" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Figure 2.  Average classification rates for each shape class (averaged over all numbers of principle components).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_uJJ12QjUj7M/Rj-475w2WdI/AAAAAAAAAGU/0LmymdiHWj8/s1600-h/max_class_rates.png"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_uJJ12QjUj7M/Rj-475w2WdI/AAAAAAAAAGU/0LmymdiHWj8/s400/max_class_rates.png" alt="" id="BLOGGER_PHOTO_ID_5061967845445229010" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Figure 3.  Max. classification rates for each shape class (maximized over all numbers of principle components).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-300360846716273542?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/300360846716273542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=300360846716273542' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/300360846716273542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/300360846716273542'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2007/05/mpeg-7-shape-classification-results.html' title='MPEG-7 Shape Classification Results'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_uJJ12QjUj7M/Rj-47pw2WbI/AAAAAAAAAGE/F1efW8_Q9H8/s72-c/class_rate_pcs.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-5217960943663465539</id><published>2007-04-23T05:27:00.000-05:00</published><updated>2007-04-23T05:32:07.557-05:00</updated><title type='text'>MPEG-7 Shape B dataset model building experiments (attempt #1)</title><content type='html'>[ &lt;a href="http://www.mit.edu/~jglov/report.doc"&gt;doc (color)&lt;/a&gt; ]  [ &lt;a href="http://www.mit.edu/~jglov/report.pdf"&gt;pdf (gray)&lt;/a&gt; ]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-5217960943663465539?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/5217960943663465539/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=5217960943663465539' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/5217960943663465539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/5217960943663465539'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2007/04/mpeg-7-shape-b-dataset-model-building.html' title='MPEG-7 Shape B dataset model building experiments (attempt #1)'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-3634554395611122556</id><published>2007-03-23T09:51:00.000-05:00</published><updated>2007-03-23T10:23:37.612-05:00</updated><title type='text'>WPLSD and symmetric COPAP-lambda</title><content type='html'>the weighted Procrustes Local Shape Distance (where we use a weighted sum of the entire local shape vs. neighborhood size curve instead of just the min value) performed much better for finding correspondences between shapes with missing/extra parts, and i was able to generate the mean shapes for a few examples of pairs of shapes with extra parts.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_uJJ12QjUj7M/RgPrYl7qnpI/AAAAAAAAAEI/uaU9vh7ThkM/s1600-h/bird1_xy_wplsd_lambda_1.png"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_uJJ12QjUj7M/RgPrYl7qnpI/AAAAAAAAAEI/uaU9vh7ThkM/s320/bird1_xy_wplsd_lambda_1.png" alt="" id="BLOGGER_PHOTO_ID_5045134815316844178" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;matching between two birds correctly skips over left foot of red bird.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_uJJ12QjUj7M/RgPrY17qnqI/AAAAAAAAAEQ/i0tOE28hVbQ/s1600-h/rect_copap_lambda_5.png"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_uJJ12QjUj7M/RgPrY17qnqI/AAAAAAAAAEQ/i0tOE28hVbQ/s320/rect_copap_lambda_5.png" alt="" id="BLOGGER_PHOTO_ID_5045134819611811490" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_uJJ12QjUj7M/RgPrZF7qnrI/AAAAAAAAAEY/8wm8ebu2mc0/s1600-h/rect_copap_lambda_5_mean.png"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_uJJ12QjUj7M/RgPrZF7qnrI/AAAAAAAAAEY/8wm8ebu2mc0/s320/rect_copap_lambda_5_mean.png" alt="" id="BLOGGER_PHOTO_ID_5045134823906778802" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;matching (left) and mean shape (right)&lt;br /&gt;&lt;br /&gt;unfortunately, even with the weighted PLSD the quality of the match depended on the order of matching--matching the shape with the extra part to the shape without the extra part did horribly while the other way around did perfectly. this is because we were not allowing the correspondence to skip over any points on the first shape (i.e. the lambda spacing penalties were only on the horizontal edges in the COPAP graph).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_uJJ12QjUj7M/RgPrYl7qnpI/AAAAAAAAAEI/uaU9vh7ThkM/s1600-h/bird1_xy_wplsd_lambda_1.png"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_uJJ12QjUj7M/RgPrYl7qnpI/AAAAAAAAAEI/uaU9vh7ThkM/s320/bird1_xy_wplsd_lambda_1.png" alt="" id="BLOGGER_PHOTO_ID_5045134815316844178" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_uJJ12QjUj7M/RgPslF7qnsI/AAAAAAAAAEg/2UfWYbuZtsA/s1600-h/bird1_yx_wplsd_lambda_0.png"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_uJJ12QjUj7M/RgPslF7qnsI/AAAAAAAAAEg/2UfWYbuZtsA/s320/bird1_yx_wplsd_lambda_0.png" alt="" id="BLOGGER_PHOTO_ID_5045136129576836802" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;good match (left) and bad match (right) due to asymmetry in the correpondence graph.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_uJJ12QjUj7M/RgPrY17qnqI/AAAAAAAAAEQ/i0tOE28hVbQ/s1600-h/rect_copap_lambda_5.png"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_uJJ12QjUj7M/RgPrY17qnqI/AAAAAAAAAEQ/i0tOE28hVbQ/s320/rect_copap_lambda_5.png" alt="" id="BLOGGER_PHOTO_ID_5045134819611811490" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_uJJ12QjUj7M/RgPslV7qntI/AAAAAAAAAEo/fT2tSUC8gRI/s1600-h/rect_yx_wplsd_lambda_5.png"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_uJJ12QjUj7M/RgPslV7qntI/AAAAAAAAAEo/fT2tSUC8gRI/s320/rect_yx_wplsd_lambda_5.png" alt="" id="BLOGGER_PHOTO_ID_5045136133871804114" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;good match (left) and bad match (right) due to asymmetry in the correpondence graph.&lt;br /&gt;&lt;br /&gt;because of this problem, tonight i tried using lambda on both the horizontal and vertical edges of the COPAP graph, where the vertical edges now allow us to skip points on the matching (first) shape. with this small change, i'm now getting correspondences that look quite resonable for almost all the hard classes of shapes in the MPEG shape database (i'll post some picture on my blog when i wake up later today). the only caveat is that now if we turn the lambda parameter down too low, we will get an empty correspondence, since it will low cost to skip over all the points on both shapes. i've been playing around with the lambda parameter, and it seems like a good choice of lambda depends on 1) the complexity of the shape, and 2) the number of points used to represent the shape. i think regression seems like the right way to learn the lambda parameter, although we may also need to adaptively change lambda on the fly if we get a bad match.&lt;br /&gt;&lt;br /&gt;here are some examples of correspondences with the symmetric COPAP graph (with the weighted PLSD):&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_uJJ12QjUj7M/RgPuz17qn0I/AAAAAAAAAFg/LaBkNQG_uoc/s1600-h/fly_symmetric_match_blue2red.png"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_uJJ12QjUj7M/RgPuz17qn0I/AAAAAAAAAFg/LaBkNQG_uoc/s320/fly_symmetric_match_blue2red.png" alt="" id="BLOGGER_PHOTO_ID_5045138582003162946" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_uJJ12QjUj7M/RgPu0F7qn1I/AAAAAAAAAFo/9rIOn5IZ5VU/s1600-h/horse_symmetric_match_blue2red.png"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_uJJ12QjUj7M/RgPu0F7qn1I/AAAAAAAAAFo/9rIOn5IZ5VU/s320/horse_symmetric_match_blue2red.png" alt="" id="BLOGGER_PHOTO_ID_5045138586298130258" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_uJJ12QjUj7M/RgPu0F7qn2I/AAAAAAAAAFw/-xRm-QLUT00/s1600-h/lizzard_symmetric_match_blue2red.png"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_uJJ12QjUj7M/RgPu0F7qn2I/AAAAAAAAAFw/-xRm-QLUT00/s320/lizzard_symmetric_match_blue2red.png" alt="" id="BLOGGER_PHOTO_ID_5045138586298130274" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_uJJ12QjUj7M/RgPu0V7qn3I/AAAAAAAAAF4/riRqT4Q-r0I/s1600-h/rect_symmetric_match_blue2red.png"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_uJJ12QjUj7M/RgPu0V7qn3I/AAAAAAAAAF4/riRqT4Q-r0I/s320/rect_symmetric_match_blue2red.png" alt="" id="BLOGGER_PHOTO_ID_5045138590593097586" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_uJJ12QjUj7M/RgPub17qnvI/AAAAAAAAAE4/Eqm3LlzC6vw/s1600-h/bird_symmetric_match_blue2red.png"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_uJJ12QjUj7M/RgPub17qnvI/AAAAAAAAAE4/Eqm3LlzC6vw/s320/bird_symmetric_match_blue2red.png" alt="" id="BLOGGER_PHOTO_ID_5045138169686302450" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_uJJ12QjUj7M/RgPub17qnwI/AAAAAAAAAFA/5gQAxxmyiv8/s1600-h/camel_symmetric_match_blue2red.png"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_uJJ12QjUj7M/RgPub17qnwI/AAAAAAAAAFA/5gQAxxmyiv8/s320/camel_symmetric_match_blue2red.png" alt="" id="BLOGGER_PHOTO_ID_5045138169686302466" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_uJJ12QjUj7M/RgPucF7qnxI/AAAAAAAAAFI/DMlpTwZYYio/s1600-h/cattle_symmetric_match_blue2red.png"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_uJJ12QjUj7M/RgPucF7qnxI/AAAAAAAAAFI/DMlpTwZYYio/s320/cattle_symmetric_match_blue2red.png" alt="" id="BLOGGER_PHOTO_ID_5045138173981269778" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_uJJ12QjUj7M/RgPucF7qnyI/AAAAAAAAAFQ/MBVOqGQkg9o/s1600-h/chicken_symmetric_match_blue2red.png"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_uJJ12QjUj7M/RgPucF7qnyI/AAAAAAAAAFQ/MBVOqGQkg9o/s320/chicken_symmetric_match_blue2red.png" alt="" id="BLOGGER_PHOTO_ID_5045138173981269794" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_uJJ12QjUj7M/RgPucV7qnzI/AAAAAAAAAFY/ZYGrIDUYGMk/s1600-h/device5_symmetric_match_blue2red.png"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_uJJ12QjUj7M/RgPucV7qnzI/AAAAAAAAAFY/ZYGrIDUYGMk/s320/device5_symmetric_match_blue2red.png" alt="" id="BLOGGER_PHOTO_ID_5045138178276237106" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;one interesting thing we can see from these pictures is that when one shape has two legs very close together where the other one only has one leg, the correspondence often skips over the concavity between the two legs rather than skipping over one of the legs.  a priori, this makes sense--there is no reason to bias the correspondence towards positive curvature portions of the curve.  also, from the horse matching, we can see that the tail of the blue horse is matched up to the back leg of the red horse.  but notice that the back leg and tail do look strikingly similar!  it is only due to prior knowledge of horses that i as a human am able to distinguish the tail from the leg on the blue horse.&lt;br /&gt;&lt;br /&gt;finally, flies and lizards are simply extremely hard to match well with contour-based shape models--lizards deform too much, and flies have too many pointy appendages.  still--the correspondences are resonable for the lizard at least, and if we didn't know the fly was a fly then the fly correspondences may not be that bad either.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-3634554395611122556?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/3634554395611122556/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=3634554395611122556' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/3634554395611122556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/3634554395611122556'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2007/03/wplsd-and-symmetric-copap-lambda.html' title='WPLSD and symmetric COPAP-lambda'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_uJJ12QjUj7M/RgPrYl7qnpI/AAAAAAAAAEI/uaU9vh7ThkM/s72-c/bird1_xy_wplsd_lambda_1.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-2975487993976509581</id><published>2007-03-15T22:19:00.000-05:00</published><updated>2007-03-15T23:21:36.282-05:00</updated><title type='text'>Weighted PLSD</title><content type='html'>The PLSD can underestimate the local feature similarity when the minimum of the PLSD curve lies at the smallest scale. In the following example, the left corner of the perturbance at the top of the red shape matches locally to the top-left corner of the blue shape, and thus the PLSD (the dashed line in the figure) is just as low as for the correct match in the figures below. However, at larger neighborhood sizes, the local shapes do not match well.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_uJJ12QjUj7M/RfoNuyM0LvI/AAAAAAAAACw/liV0TyCcbmA/s1600-h/bad_match.png"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_uJJ12QjUj7M/RfoNuyM0LvI/AAAAAAAAACw/liV0TyCcbmA/s320/bad_match.png" alt="" id="BLOGGER_PHOTO_ID_5042357830195359474" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_uJJ12QjUj7M/RfoQRiM0LzI/AAAAAAAAADQ/KdnLChEhiNU/s1600-h/bad_match_curve.png"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_uJJ12QjUj7M/RfoQRiM0LzI/AAAAAAAAADQ/KdnLChEhiNU/s320/bad_match_curve.png" alt="" id="BLOGGER_PHOTO_ID_5042360626219069234" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_uJJ12QjUj7M/RfoNvSM0LxI/AAAAAAAAADA/kFBXoUYLFl0/s1600-h/good_match.png"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_uJJ12QjUj7M/RfoNvSM0LxI/AAAAAAAAADA/kFBXoUYLFl0/s320/good_match.png" alt="" id="BLOGGER_PHOTO_ID_5042357838785294098" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_uJJ12QjUj7M/RfoQRyM0L0I/AAAAAAAAADY/fMzDi5mitPA/s1600-h/good_match_curve.png"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_uJJ12QjUj7M/RfoQRyM0L0I/AAAAAAAAADY/fMzDi5mitPA/s320/good_match_curve.png" alt="" id="BLOGGER_PHOTO_ID_5042360630514036546" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Also plotted on the PLSD curve figures on the right is the weighted PLSD (solid line), which is formed by the weighted sum of Procrustes distances over each scale, where the weights are proportional to 1 at the smallest scale, 1 - 1/n at the second smallest scale, ... , and 1/n at the highest scale. (n is the number of scales in total, and weights are scaled by 2/(n+1) so as to form a probability distribution.) Clearly, the weighted PLSD, which weights smaller scales more heavily than larger scales, is more discriminitive for the features above.&lt;br /&gt;&lt;br /&gt;Running COPAP on the two shapes (blue to red) yields:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_uJJ12QjUj7M/RfoYACM0L1I/AAAAAAAAADg/WP2bPER7X30/s1600-h/rect_xy_plsd_lambda_0.png"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_uJJ12QjUj7M/RfoYACM0L1I/AAAAAAAAADg/WP2bPER7X30/s320/rect_xy_plsd_lambda_0.png" alt="" id="BLOGGER_PHOTO_ID_5042369121664380754" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_uJJ12QjUj7M/RfoYNyM0L3I/AAAAAAAAADw/kzSQ_U_I63g/s1600-h/rect_xy_wplsd_lambda_0.png"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_uJJ12QjUj7M/RfoYNyM0L3I/AAAAAAAAADw/kzSQ_U_I63g/s320/rect_xy_wplsd_lambda_0.png" alt="" id="BLOGGER_PHOTO_ID_5042369357887582066" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;where the regular (min) PLSD was used on the left, and the weighted PLSD is shown on the right. Spacing penalty (lambda) was zero for both figures, although matched are similar for lambda up to 12 (which is extremely high).&lt;br /&gt;&lt;br /&gt;Matching from the red shape to the blue shape does not yield good results, however:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_uJJ12QjUj7M/RfoaviM0L4I/AAAAAAAAAD4/RNC0rr-4Y40/s1600-h/rect_yx_plsd_lambda_0.png"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_uJJ12QjUj7M/RfoaviM0L4I/AAAAAAAAAD4/RNC0rr-4Y40/s320/rect_yx_plsd_lambda_0.png" alt="" id="BLOGGER_PHOTO_ID_5042372136731422594" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_uJJ12QjUj7M/RfoaviM0L5I/AAAAAAAAAEA/19QXaMtrIkk/s1600-h/rect_yx_wplsd_lambda_0.png"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_uJJ12QjUj7M/RfoaviM0L5I/AAAAAAAAAEA/19QXaMtrIkk/s320/rect_yx_wplsd_lambda_0.png" alt="" id="BLOGGER_PHOTO_ID_5042372136731422610" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To handle this case (where a shape with an extra part is matched to a shape without the part), we must modify the COPAP graph--no local distance will compensate for this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-2975487993976509581?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/2975487993976509581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=2975487993976509581' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/2975487993976509581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/2975487993976509581'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2007/03/weighted-plsd.html' title='Weighted PLSD'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_uJJ12QjUj7M/RfoNuyM0LvI/AAAAAAAAACw/liV0TyCcbmA/s72-c/bad_match.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-8715828135068341010</id><published>2007-03-13T04:11:00.000-05:00</published><updated>2007-03-13T05:30:07.793-05:00</updated><title type='text'>Effect of uneven spacing on PLSD correspondences</title><content type='html'>When the spacing of points varies around the two contours, the PLSD can be a bad approximation for local shape dissimilarity.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_uJJ12QjUj7M/RfZ16iM0LlI/AAAAAAAAABg/dHZJu7DdJJU/s1600-h/x.png"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_uJJ12QjUj7M/RfZ16iM0LlI/AAAAAAAAABg/dHZJu7DdJJU/s200/x.png" alt="" id="BLOGGER_PHOTO_ID_5041346481361268306" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_uJJ12QjUj7M/RfZ2DSM0LmI/AAAAAAAAABo/yULYwb5XDN0/s1600-h/y.png"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_uJJ12QjUj7M/RfZ2DSM0LmI/AAAAAAAAABo/yULYwb5XDN0/s200/y.png" alt="" id="BLOGGER_PHOTO_ID_5041346631685123682" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Given the blue and red contours above, here is the COPAP solution (blue to red) using the original PLSD, with spacing penalty lambda = 0, where we compute neighborhoods simply by taking k points directly from the contour (without attempting to correct for uneven spacing):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_uJJ12QjUj7M/RfZ2DiM0LnI/AAAAAAAAABw/QiWSU-MlDLo/s1600-h/COPAP_PLSD_xy_lambda_0_.png"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_uJJ12QjUj7M/RfZ2DiM0LnI/AAAAAAAAABw/QiWSU-MlDLo/s200/COPAP_PLSD_xy_lambda_0_.png" alt="" id="BLOGGER_PHOTO_ID_5041346635980090994" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As we can see, this matching is quite bad--two corners of the blue shape are matched to sides on the red shape. We must crank lambda up to 2 in order to correct for this poor match:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_uJJ12QjUj7M/RfZ2DiM0LoI/AAAAAAAAAB4/dSbUlKCk3CI/s1600-h/COPAP_PLSD_xy_lambda_5_.png"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_uJJ12QjUj7M/RfZ2DiM0LoI/AAAAAAAAAB4/dSbUlKCk3CI/s200/COPAP_PLSD_xy_lambda_5_.png" alt="" id="BLOGGER_PHOTO_ID_5041346635980091010" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The story for matching from the red shape to the blue shape is even worse--for lambda = 0 we get the following mess:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_uJJ12QjUj7M/RfZ6BSM0LpI/AAAAAAAAACA/uuLn5QRUobw/s1600-h/COPAP_PLSD_yx_lambda_0_.png"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_uJJ12QjUj7M/RfZ6BSM0LpI/AAAAAAAAACA/uuLn5QRUobw/s200/COPAP_PLSD_yx_lambda_0_.png" alt="" id="BLOGGER_PHOTO_ID_5041350995371896466" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It is only when we crank up lambda to 6 that the correspondences look reasonable:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_uJJ12QjUj7M/RfZ6BiM0LqI/AAAAAAAAACI/0jSjF7yt5Zo/s1600-h/COPAP_PLSD_yx_lambda_6_.png"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_uJJ12QjUj7M/RfZ6BiM0LqI/AAAAAAAAACI/0jSjF7yt5Zo/s200/COPAP_PLSD_yx_lambda_6_.png" alt="" id="BLOGGER_PHOTO_ID_5041350999666863778" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;True, with the higher spacing penalties good correspondences can seemingly be found; however, this may be an artifact of the particular example chosen, and it seems very unsatisfactory to have to rely on the spacing penalty to achieve a solution which is even close to being reasonable. The spacing penalty's place is to avoid bunching up correspondences along long, flat portions of the contours, not to make a reasonable over-all match possible.&lt;br /&gt;&lt;br /&gt;To remedy this situation, we change the PLSD as follows.&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;Instead of forming neighborhoods of size k by grabbing k nearby contour points (which may or may not be spaced evenly from one contour to the next), we instead take k evenly-spaced points along the nearby contour boundary (interpolating between vertices as necessary) up to some maximum neighborhood distance, d.&lt;/li&gt; &lt;/ul&gt; In this way, we can achieve reasonable COPAP solutions even with lambda = 0:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_uJJ12QjUj7M/RfZ8MiM0LrI/AAAAAAAAACQ/x3tXPYioEkI/s1600-h/COPAP_PLSD2_xy_lambda_0_.png"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_uJJ12QjUj7M/RfZ8MiM0LrI/AAAAAAAAACQ/x3tXPYioEkI/s200/COPAP_PLSD2_xy_lambda_0_.png" alt="" id="BLOGGER_PHOTO_ID_5041353387668680370" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_uJJ12QjUj7M/RfZ8MyM0LsI/AAAAAAAAACY/6aHk-2Fepxk/s1600-h/COPAP_PLSD2_yx_lambda_0_.png"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_uJJ12QjUj7M/RfZ8MyM0LsI/AAAAAAAAACY/6aHk-2Fepxk/s200/COPAP_PLSD2_yx_lambda_0_.png" alt="" id="BLOGGER_PHOTO_ID_5041353391963647682" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(blue to red, red to blue)&lt;br /&gt;&lt;br /&gt;Now when lambda is cranked up, the effect is only to even out the bunched up spacings along, and does not change the overall structure of the matching:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_uJJ12QjUj7M/RfZ83yM0LtI/AAAAAAAAACg/Y7RYNNU47pE/s1600-h/COPAP_PLSD2_xy_lambda_5_.png"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_uJJ12QjUj7M/RfZ83yM0LtI/AAAAAAAAACg/Y7RYNNU47pE/s200/COPAP_PLSD2_xy_lambda_5_.png" alt="" id="BLOGGER_PHOTO_ID_5041354130698022610" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_uJJ12QjUj7M/RfZ84CM0LuI/AAAAAAAAACo/rXEsF57Vs5Q/s1600-h/COPAP_PLSD2_yx_lambda_5_.png"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_uJJ12QjUj7M/RfZ84CM0LuI/AAAAAAAAACo/rXEsF57Vs5Q/s200/COPAP_PLSD2_yx_lambda_5_.png" alt="" id="BLOGGER_PHOTO_ID_5041354134992989922" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-8715828135068341010?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/8715828135068341010/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=8715828135068341010' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/8715828135068341010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/8715828135068341010'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2007/03/effect-of-uneven-spacing-on-plsd.html' title='Effect of uneven spacing on PLSD correspondences'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_uJJ12QjUj7M/RfZ16iM0LlI/AAAAAAAAABg/dHZJu7DdJJU/s72-c/x.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-7568206958673499286</id><published>2007-03-11T03:59:00.000-05:00</published><updated>2007-03-11T04:03:17.184-05:00</updated><title type='text'>MS Thesis Timeline</title><content type='html'>&lt;span style="font-weight: bold;"&gt;TIMELINE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;3/12: (A1,B1) Complete initial comparison (bullseye test) of correspondence algorithms for shape retrieval on MPEG7 Shape B data set. Collect additional image data sets of 2-D shapes.&lt;br /&gt;&lt;br /&gt;3/16: (B1,C1) Complete full evaluation of shape retrieval/recognition of&lt;br /&gt;shape models (built with best correspondence algorithm variant from 3/12&lt;br /&gt;task) on all image data sets of 2-D shapes.&lt;br /&gt;&lt;br /&gt;3/23: (B3) Complete generation of view-dependent shape models of 3-D&lt;br /&gt;objects.&lt;br /&gt;&lt;br /&gt;3/30: (Spring Break) (C1) Finish evaluation of shape recognition of view dependent shape models of 3-D objects.&lt;br /&gt;&lt;br /&gt;4/13: (A2) Finish development and implementation of algorithms for partial contour correspondences.&lt;br /&gt;&lt;br /&gt;4/20: (C2) Complete evaluation of partial shape completion on 2-D shape&lt;br /&gt;image data.&lt;br /&gt;&lt;br /&gt;4/27: (C2) Complete evaluation of partial shape completion (and view&lt;br /&gt;recovery) on 2-D views of 3-D shape data.&lt;br /&gt;&lt;br /&gt;* 5/4: (D1,D2) Segment images and overlapping contours with shape priors. (B2) Generate shape models from laser data of chairs, couches, etc.  Test shape recognition, shape completion, and segmentation on laser data.&lt;br /&gt;&lt;br /&gt;5/11: Finish thesis draft.&lt;br /&gt;&lt;br /&gt;5/18: Submit thesis.&lt;br /&gt;&lt;br /&gt;* The tasks for 5/4 are marked as optional, since image segmentation and&lt;br /&gt;modeling laser range data are not the main focus of this thesis.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;KEY&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For my master’s thesis, I would like to achieve the following goals:&lt;br /&gt;&lt;br /&gt;• A. Correspondences&lt;br /&gt;1. Evaluate the PLSD point assignment cost function and variants; compare to shape contexts, ICP, etc.&lt;br /&gt;2. Develop and evaluate PLSD-based correspondence algorithms for partial&lt;br /&gt;contours.&lt;br /&gt;&lt;br /&gt;• B. Shape Modeling&lt;br /&gt;1. Generate statistical shape models from images of 2-D shapes.&lt;br /&gt;2. Generate statistical shape models from laser range data.&lt;br /&gt;3. Generate view-dependent statistical shape models from images of 3-D&lt;br /&gt;shapes.&lt;br /&gt;&lt;br /&gt;• C. Shape Recognition / Shape Completion&lt;br /&gt;1. Evaluate full contour shape recognition on all three types of data sets&lt;br /&gt;listed above; compare to published performance of existing algorithms&lt;br /&gt;(e.g. shock graphs, shape contexts, etc.) on publicly-available shape&lt;br /&gt;data sets.&lt;br /&gt;2. Evaluate several iterative methods for shape completion (with respect&lt;br /&gt;to tangent space principle components shape models) according to two&lt;br /&gt;measures: (i) completion accuracy as a function of occlusion size, and&lt;br /&gt;(ii) partial shape classification rate.&lt;br /&gt;&lt;br /&gt;• D. Data Association / Segmentation&lt;br /&gt;1. Use shape priors to segment image data.&lt;br /&gt;2. Use shape models to separate overlapping shape contours.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-7568206958673499286?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/7568206958673499286/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=7568206958673499286' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/7568206958673499286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/7568206958673499286'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2007/03/ms-thesis-timeline.html' title='MS Thesis Timeline'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-3067144909329698136</id><published>2007-03-11T03:57:00.000-05:00</published><updated>2007-03-11T03:58:16.283-05:00</updated><title type='text'>Master's Thesis Proposal</title><content type='html'>&lt;a href="http://www.mit.edu/%7Ejglov/ms_thesis_proposal.pdf"&gt;ms_thesis_proposal.pdf&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-3067144909329698136?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/3067144909329698136/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=3067144909329698136' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/3067144909329698136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/3067144909329698136'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2007/03/masters-thesis-proposal.html' title='Master&apos;s Thesis Proposal'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-8840436895813976349</id><published>2007-03-11T03:46:00.000-05:00</published><updated>2007-03-11T03:56:41.417-05:00</updated><title type='text'>Advanced Algorithms Final Project</title><content type='html'>&lt;a href="http://www.mit.edu/%7Ejglov/copap.pdf"&gt;Solving the Cyclic Order-Preserving Assignment Problem&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Jared Glover, Christian Uldall Pedersen, Erik Taarnhøj&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-8840436895813976349?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/8840436895813976349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=8840436895813976349' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/8840436895813976349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/8840436895813976349'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2007/03/advanced-algorithms-final-project.html' title='Advanced Algorithms Final Project'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-2126229781459408764</id><published>2007-02-26T23:01:00.000-05:00</published><updated>2007-02-26T23:20:23.739-05:00</updated><title type='text'>Multi-scale shape matching</title><content type='html'>The cuts problem is the problem of making point correspondences between the following two contours:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_uJJ12QjUj7M/ReOuzZDbC0I/AAAAAAAAAAk/XUjSDWgcLcg/s1600-h/device3-13.gif"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_uJJ12QjUj7M/ReOuzZDbC0I/AAAAAAAAAAk/XUjSDWgcLcg/s200/device3-13.gif" alt="" id="BLOGGER_PHOTO_ID_5036061006252149570" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_uJJ12QjUj7M/ReOuzZDbC1I/AAAAAAAAAAs/KRzPbuYEoSI/s1600-h/device3-11.gif"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_uJJ12QjUj7M/ReOuzZDbC1I/AAAAAAAAAAs/KRzPbuYEoSI/s200/device3-11.gif" alt="" id="BLOGGER_PHOTO_ID_5036061006252149586" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In order to solve this cuts problem, one may either allow for points on one contour to be skipped in the correspondence (e.g. in COPAP-lambda), or one may separate the low and high frequencies of each contour, developing a pyramidal shape recognition algorithm which would determine that, at the highest resolution, the two shapes above just aren't very similar, whereas after downsampling or blurring the shapes are extremely similar.&lt;br /&gt;&lt;br /&gt;The only question is whether to perform this downsampling in image space, or directly on the contour, e.g. removing the highest-frequency terms in the curvature space around the contour.  In support of the former (downsampling in image space) is the following example:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_uJJ12QjUj7M/ReOvFZDbC2I/AAAAAAAAAA0/ubLwXiB1qiY/s1600-h/device6-2.gif"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_uJJ12QjUj7M/ReOvFZDbC2I/AAAAAAAAAA0/ubLwXiB1qiY/s200/device6-2.gif" alt="" id="BLOGGER_PHOTO_ID_5036061315489794914" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_uJJ12QjUj7M/ReOvFZDbC3I/AAAAAAAAAA8/kLfY6u7pLv8/s1600-h/device6-11.gif"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_uJJ12QjUj7M/ReOvFZDbC3I/AAAAAAAAAA8/kLfY6u7pLv8/s200/device6-11.gif" alt="" id="BLOGGER_PHOTO_ID_5036061315489794930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In this case downsampling in curvature space would simply shrink the arms of the shape on the left until just a stump in the center is left, whereas the effect we are looking for is to close the gaps between the arms so that the shape is recognized as a pentagon.  This task is clearly better accomplished in image space.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-2126229781459408764?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/2126229781459408764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=2126229781459408764' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/2126229781459408764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/2126229781459408764'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2007/02/multi-scale-shape-matching.html' title='Multi-scale shape matching'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_uJJ12QjUj7M/ReOuzZDbC0I/AAAAAAAAAAk/XUjSDWgcLcg/s72-c/device3-13.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-116481033410979239</id><published>2006-11-29T09:09:00.000-05:00</published><updated>2006-11-29T09:42:09.286-05:00</updated><title type='text'>Local Shape Neighborhood Distance</title><content type='html'>Here are the results of some experiments using local shape neighborhood distances to compute the assignment cost function for the contour correspondence dynamic program.&lt;br /&gt;&lt;br /&gt;First, on tools, with lambda=0, 0.5, 1, and 2:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3761/1854/1600/641903/DPG_LND_lambda_0_tool1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/x/blogger/3761/1854/400/706878/DPG_LND_lambda_0_tool1.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3761/1854/1600/114430/DPG_LND_lambda_0.5_tool1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/x/blogger/3761/1854/400/58915/DPG_LND_lambda_0.5_tool1.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3761/1854/1600/343203/DPG_LND_lambda_1_tool1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/x/blogger/3761/1854/400/565796/DPG_LND_lambda_1_tool1.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3761/1854/1600/513017/DPG_LND_lambda_2_tool1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/x/blogger/3761/1854/400/786428/DPG_LND_lambda_2_tool1.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Next, on forks (lambda=0,1,2):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3761/1854/1600/578711/DPG_LND_lambda_0_fork1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/x/blogger/3761/1854/400/927850/DPG_LND_lambda_0_fork1.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3761/1854/1600/482503/DPG_LND_lambda_1_fork1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/x/blogger/3761/1854/400/551207/DPG_LND_lambda_1_fork1.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3761/1854/1600/665763/DPG_LND_lambda_2_fork1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/x/blogger/3761/1854/400/618207/DPG_LND_lambda_2_fork1.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And on mugs (lambda=0,1,2):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3761/1854/1600/814105/DPG_LND_lambda_0_mug1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/x/blogger/3761/1854/400/370488/DPG_LND_lambda_0_mug1.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3761/1854/1600/478179/DPG_LND_lambda_1_mug1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/x/blogger/3761/1854/400/830480/DPG_LND_lambda_1_mug1.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3761/1854/1600/208752/DPG_LND_lambda_2_mug1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/x/blogger/3761/1854/400/934243/DPG_LND_lambda_2_mug1.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Again on mugs (lambda=0,.5,1,2):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3761/1854/1600/127647/DPG_LND_lambda_0_mug2.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/x/blogger/3761/1854/400/961631/DPG_LND_lambda_0_mug2.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3761/1854/1600/120235/DPG_LND_lambda_0.5_mug2.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/x/blogger/3761/1854/400/248086/DPG_LND_lambda_0.5_mug2.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3761/1854/1600/553552/DPG_LND_lambda_1_mug2.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/x/blogger/3761/1854/400/822950/DPG_LND_lambda_1_mug2.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3761/1854/1600/12155/DPG_LND_lambda_2_mug2.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/x/blogger/3761/1854/400/347478/DPG_LND_lambda_2_mug2.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Some comments:&lt;br /&gt;&lt;br /&gt;First of all, the local shape neighborhood cost function seems to perform relatively well (for lambda &gt; 0) on the mugs and the tools, but not on the forks.  This is because the forks are actually quite different when local shape is considered, since one contour has prongs, while the other does not.&lt;br /&gt;&lt;br /&gt;Second, the local shape neighborhood cost function seems to give good correspondence results for points with high curvature, while sometimes being sloppy about points along flat portions of the contours.  This can be explained by looking at the cost matrices for the tools, mugs, and forks (darker means higher shape distance):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3761/1854/1600/666798/LND_min_cost_matrix_tool1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/x/blogger/3761/1854/400/517110/LND_min_cost_matrix_tool1.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3761/1854/1600/959400/LND_min_cost_matrix_mug2.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/x/blogger/3761/1854/400/588451/LND_min_cost_matrix_mug2.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3761/1854/1600/669132/LND_min_cost_matrix_fork1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/x/blogger/3761/1854/400/749338/LND_min_cost_matrix_fork1.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In each case, there are several dark rows and columns, which correspond to points on the two contours whose local shape doesn't match up well with most of the local shapes on the other contour.  In other words, these rows and columns point out locations on the shape which are distinct.  The other rows and columns represent undistinct local shapes on the contours.  This points out a natural way to find salient local features of two shapes to be matched, which should significantly reduce the computational burden.  The only drawback is that the cost matrix itself is quite costly to compute (as each element in the matrix is the minimum of a vector of local shape distances at different scales).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-116481033410979239?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/116481033410979239/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=116481033410979239' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/116481033410979239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/116481033410979239'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2006/11/local-shape-neighborhood-distance.html' title='Local Shape Neighborhood Distance'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-116470392207358888</id><published>2006-11-28T03:49:00.000-05:00</published><updated>2006-11-28T03:52:02.073-05:00</updated><title type='text'>Algorithms Project Timeline</title><content type='html'>&lt;span style="font-weight: bold;"&gt;thu  nov 23&lt;/span&gt;    - thanksgiving&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;mon  nov 27&lt;/span&gt;  - nail down algorithms to implement &amp; design experiments&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;fri  dec  1&lt;/span&gt;          - finish implementation&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;wed  dec  6&lt;/span&gt;      - finish experiments&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;mon  dec 11&lt;/span&gt;   - finish final paper&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;wed  dec 13&lt;/span&gt;    - final paper due&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-116470392207358888?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/116470392207358888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=116470392207358888' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/116470392207358888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/116470392207358888'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2006/11/algorithms-project-timeline.html' title='Algorithms Project Timeline'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-116470373895227585</id><published>2006-11-28T03:44:00.000-05:00</published><updated>2006-11-28T03:48:58.966-05:00</updated><title type='text'>Algorithms Project Summary</title><content type='html'>We will solve the geometric problem of finding the "best" correspondences between the points of two closed contours in 2D.  We will compare two popular representations in the literature, shape contexts and shock graphs, with a third method which I have been developing in my research for the past year, using local contour shapes over multiple scales.&lt;br /&gt;&lt;br /&gt;Shape contexts and shock graphs are both ways of respresenting the shapes of objects in the plane; shape contexts model the relative positions of points on an object, while shock graphs model the skeletal structure of the object, and thus capture the global shape topology.  In the literature, both representations have primarily been used for the tasks of shape retrieval and classification, while in our study we wish to solve a different problem--finding correspondences between contours.  While the basic shape retrieval algorithms using shape contexts do find point correspondences as an intermediate step (via bipartite graph matching), shock graph methods do not, instead relying in most cases on the graph edit distance as well as differences in local geometry of parts to compute a shape distance.  While some attempts have been made to utilize skeletal (e.g. shock graph) representations of contours in order to find point correspondences, we have been unable to find a satisfactory algorithm for this purpose, and so will make a slight modification to an existing shock graph matching algorithm in order to match contour points (rather than just contour skeletons) using the built-in notion of part similarity inherant in the shock graph models.  For our final method, we will use similarity in local shape around contour points (at multiple scales) in order to determine point correspondences.&lt;br /&gt;&lt;br /&gt;The output of all three methods will be a cost function, c(x_i, y_j) for each pair of points on contour x and y representing the cost of a potential correspondence from point x_i on contour x to point y_j on contour y.  Many algorithms exist to then compute a min-cost matching between the two contours (for example relaxation labelling or the hungarian method), however since we are restricting ourselves to closed contours, we will find an order-preserving min-cost matching from x to y, which can be done very efficiently with dynamic programming.&lt;br /&gt;&lt;br /&gt;We will evaluate each algorithm by comparing its performance (1) against human correspondences, and (2) with respect to shape retrieval.  The baseline algorithm of simply finding the best starting point and making one-to-one correspondences around the contours will also be considered.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-116470373895227585?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/116470373895227585/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=116470373895227585' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/116470373895227585'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/116470373895227585'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2006/11/algorithms-project-summary.html' title='Algorithms Project Summary'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-116416261254952866</id><published>2006-11-21T21:22:00.000-05:00</published><updated>2006-11-21T21:30:12.563-05:00</updated><title type='text'>DP for correspondences</title><content type='html'>Modified dynamic program from Scott &amp; Nowak's "Robust Contour Matching Via the Order-Preserving Assignment Problem" paper to include spacing penalty, lambda.  Here's how it performs on the tool, for lambda=0, 0.5, and 1:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/DP_euclidean_lambda_0_tool1_ICP.0.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/3761/1854/400/DP_euclidean_lambda_0_tool1_ICP.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/DP_euclidean_lambda_0.5_tool1_ICP.0.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/3761/1854/400/DP_euclidean_lambda_0.5_tool1_ICP.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/DP_euclidean_lambda_1_tool1_ICP.0.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/3761/1854/400/DP_euclidean_lambda_1_tool1_ICP.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Appears to do better than greedy search, and is just as fast.  Next step is to try including local shape match in the distance function...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-116416261254952866?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/116416261254952866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=116416261254952866' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/116416261254952866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/116416261254952866'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2006/11/dp-for-correspondences.html' title='DP for correspondences'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-116380719338028657</id><published>2006-11-17T17:40:00.000-05:00</published><updated>2006-11-17T18:49:17.880-05:00</updated><title type='text'>Correspondence from alignment: greedy search with spacing regularization</title><content type='html'>Modified greedy assignment algorithm to add a spacing penalty, lambda, which (when assigning the kth point on contour X to contour Y) is a multiplier on a squared error term on the difference between the actual circumference travelled thus far on Y, and the desired circumference travelled on Y in the first k points.  The desired circumference travelled is equal to k/n times the total circumference of Y.  (Figures are with lambda=0, 0.5, 2, and 5.)&lt;br /&gt;&lt;br /&gt;Correspondences are still not perfect, expecially around the ends of the tool handles, so it appears that a different metric between contour points on X and Y is needed, e.g. using shape contexts or local shape distances.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/greedy_s0_tool1_ICP.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/3761/1854/400/greedy_s0_tool1_ICP.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/greedy_s_0.5_tool1_ICP.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/3761/1854/400/greedy_s_0.5_tool1_ICP.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/greedy_s_2_tool1_ICP.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/3761/1854/400/greedy_s_2_tool1_ICP.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/greedy_s_5_tool1_ICP.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/3761/1854/400/greedy_s_5_tool1_ICP.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-116380719338028657?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/116380719338028657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=116380719338028657' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/116380719338028657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/116380719338028657'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2006/11/correspondence-from-alignment-greedy.html' title='Correspondence from alignment: greedy search with spacing regularization'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-116363608723157871</id><published>2006-11-15T19:09:00.000-05:00</published><updated>2006-11-15T19:14:47.243-05:00</updated><title type='text'>Accomplished this week</title><content type='html'>1. Hausdorff vs. ICP alignment&lt;br /&gt;2. formulated ILP and LP relaxation&lt;br /&gt;3. formulated, implemented and tested search w/pruning and greedy search&lt;br /&gt;4. read Dellaert's chain flipping paper for SFM&lt;br /&gt;5. contour correspondence literature search&lt;br /&gt;   four main approaches:&lt;br /&gt;    --&gt; medial axis&lt;br /&gt;    --&gt; shape contexts&lt;br /&gt;    --&gt; landmark sliding&lt;br /&gt;    --&gt; greedy, sequential&lt;br /&gt;5a. read paper on evaluating the performance of shape recognition algorithms on partial shapes&lt;br /&gt;6. got two new datasets:&lt;br /&gt;    --&gt; mpeg7shapeB&lt;br /&gt;    --&gt; articu&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-116363608723157871?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/116363608723157871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=116363608723157871' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/116363608723157871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/116363608723157871'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2006/11/accomplished-this-week.html' title='Accomplished this week'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-116350290910950359</id><published>2006-11-14T05:32:00.000-05:00</published><updated>2006-11-14T06:15:09.190-05:00</updated><title type='text'>Correspondence from alignment</title><content type='html'>Implemented pruning search over space of feasible (i.e. satisfying the contour ordering constraints) assignments, minimizing the sum of squared Euclidean distances between corresponding points.&lt;br /&gt;&lt;br /&gt;First of all, here's what happens with the greedy algorithm (greedily make NN-assignments, while satisfying the ordering constraints):&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/greedy_fork1.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/400/greedy_fork1.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/greedy_tool1.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/400/greedy_tool1.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/greedy_tool2.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/400/greedy_tool2.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(Click on the images to view them in more detail)&lt;br /&gt;&lt;br /&gt;The first interesting thing to note is how good the greedy solutions are when the shapes are fairly similar. Even in the second tool case, when the shapes don't align very well, the correspondences are quite good in a least squares sense.&lt;br /&gt;&lt;br /&gt;The pruning search algorithm is as follows:&lt;br /&gt;&lt;br /&gt;1) Set dmin = sum of squares distance in greedy solution, and cmin = greedy solution&lt;br /&gt;&lt;br /&gt;2) Search over space of feasible assignments in the assignment tree which first branches on c1, then c2, then c3, etc., pruning the branch when the sum of squared distances in the partial assignment plus the minimum (NN) sum of squared distances in the remaining, unassigned points is greater than the current best sum of squared distances, dmin. In other words, if the best score we can possibly get by following the current branch to a leaf is worse than the current best score, then we don't need to explore this assignment branch any more.&lt;br /&gt;&lt;br /&gt;Some results:&lt;br /&gt;&lt;br /&gt;When the shapes are very similar (as in the first tool example after ICP), the pruning search can run extremely fast (in this case, .08 secs). This is because the greedy solution is already quite good, so any deviation from a nearly optimal solution will be pruned immediately.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/lowres_100x100_tool1_ICP.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/400/lowres_100x100_tool1_ICP.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;When the shapes are not similar, the algorithm can run arbitrarily slowly. However, we don't have to find an assignment of ALL the points; we can simply assign a small subset of evenly spaced points on one contour, and after finding the best such "low-resolution" assignment, we can interpolate assignments between these points:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/lowres_10x100_tool1.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/400/lowres_10x100_tool1.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/lowres_10x100_tool2.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/400/lowres_10x100_tool2.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;At least in these few examples, however, this low-resolution approach doesn't appear to improve upon the greedy solution. In fact, even incorporating the interpolated point assignments into the score computation during the pruning search does not appear to improve upon the greedy solution, in the second tool case:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/lowres_interp_10x100_tool2.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/400/lowres_interp_10x100_tool2.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;While these are clearly very preliminary results, they appear to show that the greedy solution is often near-optimal, assuming a "good" alignment has been found, when only least-squares distance between corresponding points is considered.  However, the greedy solution is often quite unappealing, as we saw in the first images at the top of this post!  In order to improve upon this situation, it may be desirable to incorporate additional criteria into the objective function, such as local shape matches, shape context distances, or spacing regularization penalties.  With these additional objectives in place, the LP formulation of the correspondence problem (which will be given in a later post) may become more desirable, since the more complicated the objective function is, the harder it is to design an effective pruning strategy for a search algorithm.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-116350290910950359?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/116350290910950359/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=116350290910950359' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/116350290910950359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/116350290910950359'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2006/11/correspondence-from-alignment.html' title='Correspondence from alignment'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-116350029777150037</id><published>2006-11-14T05:27:00.000-05:00</published><updated>2006-11-14T05:31:37.773-05:00</updated><title type='text'>Email about Hausdorff vs. ICP</title><content type='html'>Date: Sat, 11 Nov 2006 15:20:25 -0500 (EST)&lt;br /&gt;From: Jared M Glover &lt;jglov@mit.edu&gt;&lt;br /&gt;To: Nicholas Roy &lt;nickroy@mit.edu&gt;&lt;br /&gt;Cc: Daniela Rus &lt;rus@csail.mit.edu&gt;&lt;br /&gt;Subject: Re: hausdorff matching images&lt;br /&gt;&lt;br /&gt;the figures are side by side--default alignment is on the left-hand side, and final alignment (after hausdorff) is on the right side.  i think the color scheme was just reversed on the right-hand side.  the hausdorff search was in a 50x50x30 space (50x50 for translation, 30 for rotation), and took on the order of one minute per alignment. i'm sure it could be sped up considerably using some multi-resolution techniques, which is why i didn't post any hard numbers, although i doubt it will ever run as fast as ICP (&lt;&lt; 1 sec).&lt;br /&gt;&lt;br /&gt;the fundamental insight, i think, is that the hausdorff metric doesn't give a good estimate of shape similarity when we are dealing with images that change in predictable, non-linear ways, such as opening and closing of a tool.  it is very much an image similarity metric, rather than a shape metric.  i think we are much more likely to have success with ICP or some other metric designed for shapes, such as shape contexts.  i will try to implement an algorithm to get feasible (in-order) contour correspondences from the ICP alignment, and i will also try to implement belongie's shape context correspondence algorithm to compare against.&lt;br /&gt;&lt;br /&gt;-jared&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-116350029777150037?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/116350029777150037/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=116350029777150037' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/116350029777150037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/116350029777150037'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2006/11/email-about-hausdorff-vs-icp.html' title='Email about Hausdorff vs. ICP'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-116349999409689823</id><published>2006-11-14T05:18:00.000-05:00</published><updated>2006-11-14T05:26:34.123-05:00</updated><title type='text'>Timeline</title><content type='html'>Nov 9&lt;br /&gt;-------&lt;br /&gt;Show ICP with no scaling&lt;br /&gt;           - on tools&lt;br /&gt; Show Hausdorff-minimizing transformations&lt;br /&gt;  - on tools&lt;br /&gt; --&gt; Do we need more sophisticated correspondence functions?&lt;br /&gt;&lt;br /&gt;Nov 12&lt;br /&gt;---------&lt;br /&gt;Read Frank Dellaert's MCMC Chain Flipping paper&lt;br /&gt;&lt;br /&gt;Nov 14&lt;br /&gt;---------&lt;br /&gt;Preliminary implementation of correspondence algorithm&lt;br /&gt;&lt;br /&gt;Nov 21&lt;br /&gt;---------&lt;br /&gt;Evaluate complete correspondence algorithm on a reasonable set of objects.&lt;br /&gt;      Build shape distributions from complete contours with correspondences&lt;br /&gt;&lt;br /&gt;Nov 23&lt;br /&gt;---------&lt;br /&gt;Thanksgiving&lt;br /&gt;&lt;br /&gt;Nov 28&lt;br /&gt;---------&lt;br /&gt;Preliminary object completion&lt;br /&gt;&lt;br /&gt;Dec 5&lt;br /&gt;--------&lt;br /&gt;Testing, begin 2D grasping&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-116349999409689823?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/116349999409689823/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=116349999409689823' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/116349999409689823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/116349999409689823'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2006/11/timeline.html' title='Timeline'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-116319987330738824</id><published>2006-11-10T17:47:00.000-05:00</published><updated>2006-11-10T18:04:33.326-05:00</updated><title type='text'>Hausdorff alignment</title><content type='html'>Here are some results of aligning contours by finding the Hausdorff-distance-minimizing rigid transformation (via a discretized search in translation and rotation space). What is interesting about these results is how badly the alignment is when the two contours vary by more than a certain tolerance. ICP appears to outperform Hausdorff in these cases because contours naturally do have correspondences (since the points around them are well-ordered), and so two shapes whose contour images may not look very similar at all (e.g. the first two tool matching figures) may actually be a reasonable match once correspondences are considered. Furthermore, Hausdorff-matching is MUCH slower than ICP, as a search is required, rather than being iterative like ICP.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/hausdorff_matching_tool1_init.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/hausdorff_matching_tool1_init.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/hausdorff_matching_tool1_final.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/hausdorff_matching_tool1_final.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/hausdorff_matching_tool2_init.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/hausdorff_matching_tool2_init.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/hausdorff_matching_tool2_final.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/hausdorff_matching_tool2_final.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/hausdorff_matching_tool3_init.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/hausdorff_matching_tool3_init.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/hausdorff_matching_tool3_final.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/hausdorff_matching_tool3_final.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/hausdorff_matching_fork1_init.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/hausdorff_matching_fork1_init.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/hausdorff_matching_fork1_final.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/hausdorff_matching_fork1_final.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-116319987330738824?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/116319987330738824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=116319987330738824' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/116319987330738824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/116319987330738824'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2006/11/hausdorff-alignment.html' title='Hausdorff alignment'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-116312329623836328</id><published>2006-11-09T20:03:00.000-05:00</published><updated>2006-11-09T20:48:16.283-05:00</updated><title type='text'>ICP for initial alignment</title><content type='html'>Implemented ICP (with translation and rotation) to find initial correspondences and alignment of two complete contours. Initialized ICP with one-to-one correspondences found by searching for the best starting points on the two contours and matching evenly around the two contours starting from there (e.g. 1-&gt;25, 2-&gt;26, 3-&gt;27, ...). NN was used for point correspondences at each step of the ICP algorithm. Here are the initial alignments and final matching alignments for some sample contours:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/ICP_matching_mug1_init.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/ICP_matching_mug1_init.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/ICP_matching_mug1_final.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/ICP_matching_mug1_final.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/ICP_matching_mug2_init.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/ICP_matching_mug2_init.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/ICP_matching_mug2_final.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/ICP_matching_mug2_final.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/ICP_matching_mug3_init.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/ICP_matching_mug3_init.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/ICP_matching_mug3_final.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/ICP_matching_mug3_final.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/ICP_matching_fork1_init.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/ICP_matching_fork1_init.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/ICP_matching_fork1_final.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/ICP_matching_fork1_final.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/ICP_matching_fork2_init.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/ICP_matching_fork2_init.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/ICP_matching_fork2_final.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/ICP_matching_fork2_final.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/ICP_matching_fork3_init.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/ICP_matching_fork3_init.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/ICP_matching_fork3_final.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/ICP_matching_fork3_final.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/ICP_matching_tool1.0.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/ICP_matching_tool1.0.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/ICP_matching_tool1_final.0.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/ICP_matching_tool1_final.0.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/ICP_matching_tool2_init.0.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/ICP_matching_tool2_init.0.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/ICP_matching_tool2_final.0.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/ICP_matching_tool2_final.0.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/ICP_matching_tool3_init.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/ICP_matching_tool3_init.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/ICP_matching_tool3_final.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/ICP_matching_tool3_final.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/ICP_matching_tool4_init.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/ICP_matching_tool4_init.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/ICP_matching_tool4_final.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/ICP_matching_tool4_final.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Interestingly, only the second tool example seems to make a bad match at all; even given bad initial correspondences (such as in the 2nd and 3rd fork examples), the ICP algorithm does a good job of bringing the contours into alignment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-116312329623836328?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/116312329623836328/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=116312329623836328' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/116312329623836328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/116312329623836328'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2006/11/icp-for-initial-alignment.html' title='ICP for initial alignment'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-115252862714489122</id><published>2006-07-10T05:47:00.000-05:00</published><updated>2006-07-10T05:50:27.156-05:00</updated><title type='text'>Silverware Shape Completion</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/spoons_partial5_best_completion.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/spoons_partial5_best_completion.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/spoons_partial4_best_completion.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/spoons_partial4_best_completion.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/forks_partial3_best_completion.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/forks_partial3_best_completion.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/forks_partial2_best_completion.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/forks_partial2_best_completion.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/spoons_partial1_best_completion.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/spoons_partial1_best_completion.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/spoons_partial2_best_completion.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/spoons_partial2_best_completion.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/forks_partial1_best_completion.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/forks_partial1_best_completion.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-115252862714489122?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/115252862714489122/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=115252862714489122' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/115252862714489122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/115252862714489122'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2006/07/silverware-shape-completion.html' title='Silverware Shape Completion'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-115242223001328902</id><published>2006-07-09T00:05:00.000-05:00</published><updated>2006-07-09T00:17:10.030-05:00</updated><title type='text'>Shape Completion Experiments (part 2)</title><content type='html'>More text from an email:&lt;br /&gt;&lt;br /&gt;-------------------------------------------&lt;br /&gt;&lt;br /&gt;i just finished running some more shape completion experiments with single&lt;br /&gt;partial contours and unknown correspondences.  results were good for partial&lt;br /&gt;contours very similar to the mean shape, as the algorithm tries to&lt;br /&gt;find correspondences from the partial contour to the mean shape.  results&lt;br /&gt;for partial contours sufficiently different from the mean shape were not&lt;br /&gt;good.&lt;br /&gt;&lt;br /&gt;it seems to me that what we have here is a classic hidden variable problem:&lt;br /&gt;we assume the completed shape should be a mix of principle components in our&lt;br /&gt;shape model (i.e. the completed shape lies in eigenspace), and the&lt;br /&gt;difficulty in finding correspondences is that we don't know a priori the&lt;br /&gt;mixing coefficients (principle component coordinates) of the completed&lt;br /&gt;shape.  if we knew the mixing coefficients, we could use the resulting shape&lt;br /&gt;(rather than the mean shape, as we are currently doing) to find&lt;br /&gt;correspondences to the partial contour.&lt;br /&gt;&lt;br /&gt;i don't know if it's worth the time to write this out as an EM problem, but&lt;br /&gt;i just thought i'd point it out that the problem exists.  for now, we could&lt;br /&gt;try a sampling technique, for example:&lt;br /&gt;&lt;br /&gt;1) sample 50 full shapes from the tangent space shape distribution.&lt;br /&gt;2) for each sample, find the best correspondences to the partial shape.&lt;br /&gt;3) use these correspondences and the sample full shape to sample several&lt;br /&gt;orientations and scales.&lt;br /&gt;4) complete the shapes for each (full shape sample, orientation, scale)&lt;br /&gt;combination, and take the best one.&lt;br /&gt;&lt;br /&gt;-------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here is the data I was referring to; once again we use the occluded tools contour:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/tools_partial1_complete.0.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/tools_partial1_complete.0.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We again hand-segment out the following two partial contours:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/tools_partial1_highlighted.0.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/tools_partial1_highlighted.0.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/tools_partial2_highlighted.0.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/tools_partial2_highlighted.0.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;For the partial contour on the right, results were almost identical (even slightly improved) to the previous experiment where correspondences from the partial shape to the mean shape were estimated by hand. Here is the best completion (in green) shown against the mean shape (in blue):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/tools_partial2_AI_best_completion.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/tools_partial2_AI_best_completion.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;For the partial contour on the left, however, the situation was much worse.  As is explained in the text from the email above, this is likely due to the fact that the partial contour was generated from a full contour which is significantly different from the mean shape, so finding correspondences to the mean shape is the wrong thing to do.  Here is the &lt;span style="font-style:italic;"&gt;best&lt;/span&gt; completion (the rest were just as bad):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/tools_partial1_AI_best_completion.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/3761/1854/320/tools_partial1_AI_best_completion.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-115242223001328902?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/115242223001328902/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=115242223001328902' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/115242223001328902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/115242223001328902'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2006/07/shape-completion-experiments-part-2.html' title='Shape Completion Experiments (part 2)'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-115242135299824560</id><published>2006-07-08T23:29:00.000-05:00</published><updated>2006-07-09T00:02:33.046-05:00</updated><title type='text'>Shape Completion Experiments</title><content type='html'>Here are the effects of the first 5 eigenvectors on the mean shape for a model of a wire-cutter tool:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/tool1_eigen1.0.png"&gt;&lt;span class="" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;/span&gt;&lt;span class="" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;/span&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/tool1_eigen1.0.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/tool1_eigen3.0.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/tool1_eigen3.0.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/tool1_eigen4.0.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/tool1_eigen4.0.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/tool1_eigen2.0.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/tool1_eigen2.0.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/tool1_eigen5.0.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/tool1_eigen5.0.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here is a contour of two tools occluding eachother:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/tools_partial1_complete.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/tools_partial1_complete.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Segmenting this contour by hand yields the following two partial contours (shown in dashed-red):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/tools_partial1_highlighted.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/tools_partial1_highlighted.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/tools_partial2_highlighted.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/tools_partial2_highlighted.png" alt="" border="0" /&gt;&lt;/a&gt;With hand-labelled correspondences between partial contours and the mean shape, 50 (scale, orientation) pairs were sampled. Here are some of the resulting sample completed shapes (in green) for the first partial contour (on the left):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/tools_partial1_sample_completion2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/tools_partial1_sample_completion2.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/tools_partial1_sample_completion3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/tools_partial1_sample_completion3.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/tools_partial1_sample_completion1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/tools_partial1_sample_completion1.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/tools_partial1_sample_completion4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/tools_partial1_sample_completion4.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Clearly, either of the first two completions is to be preferred over the latter two; however, the maximum likelihood shape completion was closer to the bottom two:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/tools_partial1_best_completion.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/tools_partial1_best_completion.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The situation is slightly better for the second partial shape (on the right).  Here are a few sample completions (in green):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/tools_partial2_sample_completion4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/tools_partial2_sample_completion4.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/tools_partial2_sample_completion1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/tools_partial2_sample_completion1.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/tools_partial2_sample_completion3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/tools_partial2_sample_completion3.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/tools_partial2_sample_completion2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/tools_partial2_sample_completion2.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and here is the best completion:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/tools_partial2_best_completion.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/tools_partial2_best_completion.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here is a brief discussion (from an email to my advisor) of the challenges of shape completion as pertains to this experiment:&lt;br /&gt;&lt;br /&gt;-------------------------------------------&lt;br /&gt;&lt;br /&gt;i've just completed some experiments with known correspondences, and one&lt;br /&gt;issue that stuck out as being problematic is that the shape completion is&lt;br /&gt;highly sensitive to the eigenvalues of the gaussian eigenspace model.  for&lt;br /&gt;example, if the model thinks that opening and closing of a tool (a&lt;br /&gt;wire-cutter) is much more likely than changes in perspective, the completed&lt;br /&gt;shape will incorporate very little perspective change, even if the resulting&lt;br /&gt;completed shape is quite ridiculous (e.g. makes the tool look like one of&lt;br /&gt;the handles is crooked).&lt;br /&gt;&lt;br /&gt;clearly this is a modelling problem, and not a flaw in the shape completion&lt;br /&gt;algorithm.  one way this issue is dealt with in some of the active contour&lt;br /&gt;literature is to use the original dataset of complete contours from which&lt;br /&gt;the model is generated to simply discover modes of transformation&lt;br /&gt;(eigenvectors) while ignoring the relative eigenvalues associated with the&lt;br /&gt;transformations.  thus, such an discovery algorithm for the wire-cutter&lt;br /&gt;should discover the modes of opening/closing, and one or two perspective&lt;br /&gt;transformations.  this approach makes sense when the changes in contour&lt;br /&gt;appearance have more to do with external factors, such as camera positioning&lt;br /&gt;or deformation by a human (opening/closing), rather than to internal changes&lt;br /&gt;such as the change in shape between two different wire-cutters (as was the&lt;br /&gt;case for the fish classification problem).&lt;br /&gt;&lt;br /&gt;--------------------------------------------&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-115242135299824560?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/115242135299824560/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=115242135299824560' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/115242135299824560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/115242135299824560'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2006/07/shape-completion-experiments.html' title='Shape Completion Experiments'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-114770814936370678</id><published>2006-05-15T10:37:00.000-05:00</published><updated>2006-05-15T10:49:09.390-05:00</updated><title type='text'>New fish video</title><content type='html'>&lt;a href="http://www.mit.edu/%7Ejglov/fish_classification_pseg_bkd_et025.mpg"&gt;fish_classification_pseg_bkd_et025.mpg&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Found: one bug (in Mahalanobis distance computation)&lt;br /&gt;&lt;br /&gt;Implemented: background subtraction contour classification (blue contours in video; red contours are still from color segmentation contours)&lt;br /&gt;&lt;br /&gt;Reduced: number of principle components (by about half)&lt;br /&gt;&lt;br /&gt;Realized: for noisy data, you still need a couple of high frequency principle components in order to perform robust classification.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-114770814936370678?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/114770814936370678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=114770814936370678' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/114770814936370678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/114770814936370678'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2006/05/new-fish-video.html' title='New fish video'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-114755452470532610</id><published>2006-05-13T14:30:00.000-05:00</published><updated>2006-05-13T16:08:44.783-05:00</updated><title type='text'>Fish Finding</title><content type='html'>After porting the shape modeling code from matlab to opencv, I finally have results from the Cousteau video:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mit.edu/%7Ejglov/fish_classification_pseg.mpeg"&gt;fish_classification_pseg.mpeg&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The main limitation at this point is the contour extraction; nearly all of the human-discernable fish-like contours that were extracted by the algorithm were classified correctly. Contours were extracted using a pyramid color segmentation algorithm, then for the first one-third of the video fish contours were labelled by hand to train the fish shape model.&lt;br /&gt;&lt;br /&gt;Many of the contours were quite noisy:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/contour2.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/contour2.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/contour1.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/contour1.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/contour3.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/contour3.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Tangent space PCA was performed to get a set of principle components. Here are the mean shape and the effects of the first four principle components:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/mean.1.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/mean.1.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/eigen1.1.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/eigen1.1.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/eigen2.1.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/eigen2.1.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/eigen4.1.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/eigen4.1.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/eigen3.1.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/eigen3.1.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The corresponding eigenvalues were:&lt;br /&gt;eigenvalue 1 = 0.084449&lt;br /&gt;eigenvalue 2 = 0.048138&lt;br /&gt;eigenvalue 3 = 0.031195&lt;br /&gt;eigenvalue 4 = 0.016441&lt;br /&gt;&lt;br /&gt;To my surprise, when I looked at the dataset after running the algorithm, there were 18 principle components in use, with the lowest eigenvalue being 1/100th the heighest eigenvalue. All but the top four principle components were simply modeling high-frequency noise. For example, the 18th principle component was:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/eigen18.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/eigen18.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Despite this massive case of overfitting, the model still performed quite well on the dataset, where the classification rule was a thresholded Mahalanobis distance from the origin to the new shape (normalized and projected into the tangent space), with a penalty for projecting onto the eigenspace which was inversely proportional to the lowest eigenvalue.  The threshold was determined by hand, and was set to about 1/10th the largest  Mahalanobis distance in the training set.  Thus, not all of the hand-labelled fish from the training set were recognized as fish by the classification algorithm.&lt;br /&gt;&lt;br /&gt;In addition to reducing the number of principle components in the model, there are a few other improvements that can be made to the algorithm.  First, learning a generative model of noise would enable an ML or MAP classifier, eliminating the need for a knob to control the maximum Mahalanobis distance.  Second, contours from the thresholded background subtraction images should be analyzed to increase the detection rate.  Finally, the mirror image of each contour should be classified, in order to detect flipped, non-symmetric shapes.&lt;br /&gt;&lt;br /&gt;More videos will be forthcoming!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-114755452470532610?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/114755452470532610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=114755452470532610' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/114755452470532610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/114755452470532610'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2006/05/fish-finding.html' title='Fish Finding'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-114619610390903590</id><published>2006-04-27T20:14:00.000-05:00</published><updated>2006-04-27T22:48:23.946-05:00</updated><title type='text'>Honduras Report</title><content type='html'>Here's a short video from the Honduras trip:  [ &lt;a href="http://www.mit.edu/%7Ejglov/fish5.avi"&gt;fish5.avi&lt;/a&gt; ]&lt;br /&gt;&lt;br /&gt;Watch it, and you will realize why I haven't gotten any major new results in shape classification this semester. The changes in lighting, camera jitter, small relative size of fish to the image, and abundance of texture (but not color) on which to segment make extracting fish contours an &lt;span style="font-style: italic;"&gt;extremely &lt;/span&gt;challenging problem. Color segmentation (e.g. with pyramidal flood-filling) does a terrible job: under-water most objects are some shade of aqua-marine, and the texture varies so much when the fish is seen on the backdrop of the sea floor that the resulting contours are based almost exclusively on local texture patterns.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/fish5_screenshot.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/fish5_screenshot.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/fish5_pseg.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/fish5_pseg.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Background subtraction also does a bad job, since the camera is moving too quickly:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/fish5_bkd_sub.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/fish5_bkd_sub.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Even motion subtraction, via affine warping the previous frame to fit as closely as possible the current frame (using the flow field from sparse pyramidal Lucas Kanade optical flow) doesn't help us find the fish (which should be moving differently from the rest of the image). Due to the large range in scales across the image and the high degree of occlusion, many other pixels in the image stand out apart from the fish.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/fish5_flow.0.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/fish5_flow.0.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/fish5_motion_sub.0.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/fish5_motion_sub.0.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;At this point you may be saying to yourself: "but there &lt;span style="font-style: italic;"&gt;aren't&lt;/span&gt; any fish in this image."  In fact, there are two:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/fish5_fish.0.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/fish5_fish.0.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It is only when the motion of the fish is seen that humans can even detect them.  Thus, more complicated techniques for motion segmentation are needed, such as:&lt;br /&gt;&lt;br /&gt;"Hierarchical Image-Motion Segmentation by Swendsen-Wang Cuts"&lt;br /&gt;&lt;a href="http://civs.stat.ucla.edu/Barbu_Research/Motion/index.html"&gt;http://civs.stat.ucla.edu/Barbu_Research/Motion/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I have also been playing around with some texture metrics for the purposes of segmenting out the sea-bed and for finding and classifying coral.  However, for the time being I am giving up on the Honduras videos because they are simply too difficult to process.  I will generate shape models from the Cousteau video, where fish are usually against the solid backdrop of the open sea, and where lighting conditions are much more favorable.  I also have a Hokuyo laser range finder (&lt;a href="http://www.hokuyo-aut.jp/products/urg/urg.htm"&gt;http://www.hokuyo-aut.jp/products/urg/urg.htm&lt;/a&gt;) to play with for 3D shape analysis--I worked out the math for 3D Procrustean shape analysis while we were in Honduras.&lt;br /&gt;&lt;br /&gt;Finally, while in Honduras the main application I worked on was optical flow/visual odometry.  I had an implementation in OpenCV before we left; unfortunately we were using a Blackfin DSP processor, so OpenCV had to be ported.  This turned out to be much more difficult than anticipated, even though there is at least one reference on the web claiming to have ported OpenCV to the Blackfin (or at least there was a reference...a google search for "opencv blackfin" turns up nothing now).  The main problem is that the Blackfin has no hardware support for floating point arithmetic, so all of OpenCV's math functions were extremely slow, and had to be changed to use fixed point.  Aside from over/underflow problems, in the end some of the algorithms themselves were too slow--pyramidal sparse Lucas Kanade optical flow was a little &lt;span style="font-style: italic;"&gt;too&lt;/span&gt; pyramidal for the Blackfin's taste, it seems.  In the end, after rewriting many of the image processing functions in OpenCV, the frame-rate was down to a &lt;span style="font-style: italic;"&gt;blazingly&lt;/span&gt; fast 1.5 Hz through the JTAG debugging interface (*sarcasm*).  Ironically, when we tried to run the program without the JTAG, the Blackfin operating system complained.  The most likely explanation I got from the hardware people on the trip was that the program was too big.  *Sigh*&lt;br /&gt;&lt;br /&gt;Finally, on the last night of the trip, I gave up on OpenCV and hacked together a non-optical-flow-based image registration algorithm which almost, sorta-kinda worked.  More processing power (to increase the searchable motion space) and smarter image processing techniques (registering edge images, for example) should improve results, but I haven't had a chance to work on it any more yet.&lt;br /&gt;&lt;br /&gt;That's all for now!  I remember why I usually don't post to my blog now...it takes so much time!&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-114619610390903590?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/114619610390903590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=114619610390903590' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/114619610390903590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/114619610390903590'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2006/04/honduras-report.html' title='Honduras Report'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-114618657119519704</id><published>2006-04-27T20:04:00.000-05:00</published><updated>2006-04-27T20:09:31.196-05:00</updated><title type='text'>More Fish Art</title><content type='html'>Forget to re-normalize the log-distance transform of an edge map of a fish, and this is what you get =)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/psychadelic_log_distance.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/400/psychadelic_log_distance.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-114618657119519704?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/114618657119519704/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=114618657119519704' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/114618657119519704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/114618657119519704'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2006/04/more-fish-art.html' title='More Fish Art'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-114618165123345757</id><published>2006-04-27T18:20:00.000-05:00</published><updated>2006-04-27T20:03:09.263-05:00</updated><title type='text'>Fall '05 Final Paper</title><content type='html'>My final paper for Machine Learning last semester:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mit.edu/%7Ejglov/project05.pdf"&gt;Probabilistic Procrustean Shape Analysis for Object Recognition&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and a short set of slides for my vision class on the final project:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;[ &lt;a href="http://www.mit.edu/%7Ejglov/shapes_MV.ppt"&gt;ppt slides&lt;/a&gt; ]&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;The task was to generate shape models of two types of fish from training image data, and then to classify new shapes extracted from test image data.&lt;br /&gt;&lt;br /&gt;Contours were extracted by hand, using color thresholding to get binary images from which contours could be extracted. Gaussian smoothing and morphological dilation and erosion operations were used to remove noise from the contours. All of this was done using OpenCV from Intel.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/fish_red_channel.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/fish_red_channel.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/fish_gray.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/fish_gray.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/fish_green_channel.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/fish_green_channel.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/fish_blue_channel.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/fish_blue_channel.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/fish_binary.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/fish_binary.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/fish_contour.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/fish_contour.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The correspondence problem was handled in two steps.  First, features were found using peaks in "local shape derivatives."&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/lsd_good.0.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/lsd_good.0.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/lsd_good_features.0.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/lsd_good_features.0.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Next, a probabilistic search algorithm for finding feature correspondences between two contours was designed by considering neighborhoods of local shape at varying scales around each feature, together with feature spacing, and the overall shape of the features.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/shape_neighborhoods2.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/shape_neighborhoods2.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/shape_neighborhoods1.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/shape_neighborhoods1.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/local_shape_match_curve1.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/local_shape_match_curve1.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;All the matched contours in the training set were then hand-labeled as belonging either to the "angelfish" of "yellow tang" classes, and then mean shapes and tangent plane principle components were found using Procrustean shape analysis.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Effects of principle components on the mean shape:&lt;br /&gt;&lt;br /&gt;Angelfish&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/eigen1_cropped.0.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/200/eigen1_cropped.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/eigen2_cropped.0.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/200/eigen2_cropped.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/mean_shape_cropped.2.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/200/mean_shape_cropped.1.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Yellow Tang&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/eigen2_cropped_small.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/eigen2_cropped_small.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/eigen1_cropped_small.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/eigen1_cropped_small.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/mean_shape_cropped_small.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/mean_shape_cropped_small.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Contours extracted from test data were then feature-matched against the mean shapes of each class and then classified to the shape class with the smallest Mahalanobis distance. In other words, Gaussian models were assumed for each shape class and classification was acheived with a maximum likelihood decision rule.&lt;br /&gt;&lt;br /&gt;Results were nearly perfect for the small dataset we had (10 angelfish and 14 yellow tang contours), but obviously more data and shape categories are needed to truly test the validity of the matching algorithm.  The novel part of the algorithm lies in the feature extraction and correspondence methods; tangent-plane PCA on shape models using the Procrustes metric has been done many times before in other domains, although it is a relatively unknown technique to the vision community.&lt;br /&gt;&lt;br /&gt;The next steps are to extract shapes from video, and to apply our shape completion techniques to complete partially-occluded shapes in video sequences.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-114618165123345757?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/114618165123345757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=114618165123345757' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/114618165123345757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/114618165123345757'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2006/04/fall-05-final-paper.html' title='Fall &apos;05 Final Paper'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-113998085278173727</id><published>2006-02-15T00:12:00.000-05:00</published><updated>2006-02-15T00:20:52.803-05:00</updated><title type='text'>Good DSP Reference</title><content type='html'>More and more it seems my discrete-math-heavy background at Carnegie Mellon University left me woefully unprepared for the very continuous flavor of math at MIT; recently I've been trying to better understand convolution and Fourier transforms as they seem to pop up everywhere.  I've found a good basic reference for these and other DSP concepts in a book called:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Scientist and Engineer's Guide to Digital Signal Processing&lt;br /&gt;&lt;a href="http://www.dspguide.com"&gt;http://www.dspguide.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Back to reading!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-113998085278173727?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/113998085278173727/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=113998085278173727' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/113998085278173727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/113998085278173727'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2006/02/good-dsp-reference.html' title='Good DSP Reference'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-113341014789214874</id><published>2005-11-30T23:02:00.000-05:00</published><updated>2005-11-30T23:20:20.520-05:00</updated><title type='text'>Psychedelic Fish Art</title><content type='html'>So I was trying to segment fish from a Jacques Cousteau video today (playing around with background subtraction, active contours, etc.)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/snakes.1.png"&gt;&lt;img style="float:top; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/3761/1854/320/snakes.1.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/contours.1.png"&gt;&lt;img style="float:top; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/3761/1854/320/contours.1.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;...when I accidentally forgot to erase a window every frame, resulting in the following AI/Cousteau-generated art:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/colors4.png"&gt;&lt;img style="float:top; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/3761/1854/320/colors4.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/colors1.png"&gt;&lt;img style="float:top; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/3761/1854/320/colors1.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/colors2.png"&gt;&lt;img style="float:top; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/3761/1854/320/colors2.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/colors5.png"&gt;&lt;img style="float:top; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/3761/1854/320/colors5.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-113341014789214874?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/113341014789214874/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=113341014789214874' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/113341014789214874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/113341014789214874'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2005/11/psychedelic-fish-art_30.html' title='Psychedelic Fish Art'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-113173562225916665</id><published>2005-11-11T13:43:00.000-05:00</published><updated>2005-11-11T14:00:22.266-05:00</updated><title type='text'>Installing OpenCV beta5 (0.9.7) in Cygwin</title><content type='html'>These are revised instructions from:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dh.aist.go.jp/%7Ekimura/opencv/opencv-0.9.7.html.en"&gt;http://www.dh.aist.go.jp/~kimura/opencv/opencv-0.9.7.html.en&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;First of all, install the Windows version of OpenCV 0.9.7 from the binaries on Sourceforge.  Then, run this script from within an empty directory in cygwin:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mit.edu/%7Ejglov/opencv-cygwin-install.sh"&gt;opencv-cygwin-install.sh&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;That's it!  You can try running the OpenCV examples  (C:/Program Files/OpenCV/samples/c/*.exe)  from a cygwin shell to make sure the DLLs were built properly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-113173562225916665?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/113173562225916665/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=113173562225916665' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/113173562225916665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/113173562225916665'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2005/11/installing-opencv-beta5-097-in-cygwin.html' title='Installing OpenCV beta5 (0.9.7) in Cygwin'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18848565.post-113166782824818245</id><published>2005-11-10T17:29:00.000-05:00</published><updated>2005-11-10T19:25:59.950-05:00</updated><title type='text'>Shape Completion</title><content type='html'>Here is a set of six training shapes:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/tmp_shape6.0.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/tmp_shape6.0.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/tmp_shape5.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/tmp_shape5.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/tmp_shape1.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/tmp_shape1.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/tmp_shape3.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/tmp_shape3.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/tmp_shape2.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/tmp_shape2.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/tmp_shape4.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/tmp_shape4.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;After computing the mean shape and performing PCA in the tangent space, the effects of the most significant eigenvectors (from highest to lowest) can be plotted (green shape is mean, blue shape is mean + 3*eigenvector):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/tmp_shape_e1.0.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/tmp_shape_e1.0.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/tmp_shape_e2.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/tmp_shape_e2.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/tmp_shape_e3.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/tmp_shape_e3.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now if we input a partial shape, we can sample orientation and scale from the Bookstein matching between the mean shape and the partial shape (with Gaussian noise). For every orientation and scale sample we can compute the MLE completed shape with respect to our normal shape distribution (in the tangent plane).&lt;br /&gt;&lt;br /&gt;A partial shape:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/partial_shape.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/partial_shape.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="file:///C:/cygwin/home/jrod/talks/partial_shape.jpg" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;Some completed sample shapes:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/partial_shape_sample5.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/partial_shape_sample5.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/partial_shape_sample3.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/partial_shape_sample3.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/partial_shape_sample4.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/partial_shape_sample4.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/partial_shape_sample2.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/partial_shape_sample2.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/partial_shape_sample1.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/partial_shape_sample1.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/partial_shape_sample8.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/partial_shape_sample8.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And here is the completed shape with max. likelihood among all 50 samples:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3761/1854/1600/partial_shape_sample_best.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: top; cursor: pointer;" src="http://photos1.blogger.com/blogger/3761/1854/320/partial_shape_sample_best.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18848565-113166782824818245?l=jglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jglov.blogspot.com/feeds/113166782824818245/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18848565&amp;postID=113166782824818245' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/113166782824818245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18848565/posts/default/113166782824818245'/><link rel='alternate' type='text/html' href='http://jglov.blogspot.com/2005/11/shape-completion.html' title='Shape Completion'/><author><name>Jared</name><uri>http://www.blogger.com/profile/05640366179762492926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
