Created
February 20, 2016 15:57
-
-
Save szagoruyko/b358209ab31c370fe006 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Example of extracting descriptors on CPU\n", | |
"===========" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"nn = require 'nn'" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Define input patches" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 19, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
" 8\n", | |
" 1\n", | |
" 64\n", | |
" 64\n", | |
"[torch.LongStorage of size 4]\n", | |
"\n" | |
] | |
}, | |
"execution_count": 19, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"N = 8 -- the number of patches to match\n", | |
"patches = torch.randn(N,1,64,64):float()\n", | |
"print(patches:size())" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Load network" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 20, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"nn.Sequential {\n", | |
" [input -> (1) -> (2) -> (3) -> (4) -> output]\n", | |
" (1): nn.Parallel {\n", | |
" input\n", | |
" |`-> (1): nn.Sequential {\n", | |
" | [input -> (1) -> (2) -> (3) -> (4) -> (5) -> (6) -> (7) -> (8) -> (9) -> (10) -> output]\n", | |
" | (1): nn.Reshape(1x64x64)\n", | |
" | (2): nn.SpatialConvolution(1 -> 96, 7x7, 3,3)\n", | |
" | (3): nn.ReLU\n", | |
" | (4): nn.SpatialMaxPooling(2,2,2,2)\n", | |
" | (5): nn.SpatialConvolution(96 -> 192, 5x5, 1,1)\n", | |
" | (6): nn.ReLU\n", | |
" | (7): nn.SpatialMaxPooling(2,2,2,2)\n", | |
" | (8): nn.SpatialConvolution(192 -> 256, 3x3, 1,1)\n", | |
" | (9): nn.ReLU\n", | |
" | (10): nn.View(-1)\n", | |
" | }\n", | |
" |`-> (2): nn.Sequential {\n", | |
" [input -> (1) -> (2) -> (3) -> (4) -> (5) -> (6) -> (7) -> (8) -> (9) -> (10) -> output]\n", | |
" (1): nn.Reshape(1x64x64)\n", | |
" (2): nn.SpatialConvolution(1 -> 96, 7x7, 3,3)\n", | |
" (3): nn.ReLU\n", | |
" (4): nn.SpatialMaxPooling(2,2,2,2)\n", | |
" (5): nn.SpatialConvolution(96 -> 192, 5x5, 1,1)\n", | |
" (6): nn.ReLU\n", | |
" (7): nn.SpatialMaxPooling(2,2,2,2)\n", | |
" (8): nn.SpatialConvolution(192 -> 256, 3x3, 1,1)\n", | |
" (9): nn.ReLU\n", | |
" (10): nn.View(-1)\n", | |
" }\n", | |
" ... -> output\n", | |
" }\n", | |
" (2): nn.Linear(512 -> 512)\n", | |
" (3): nn.ReLU\n", | |
" (4): nn.Linear(512 -> 1)\n", | |
"}\t\n" | |
] | |
}, | |
"execution_count": 20, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"net = torch.load'/tmp/networks/siam/siam_liberty.t7'\n", | |
"print(tostring(net))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Compute similarity" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Let's compute similarity between the generated patches and a copy of them" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 21, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"patch_pairs size:\n", | |
"\t 8\n", | |
" 2\n", | |
" 64\n", | |
" 64\n", | |
"[torch.LongStorage of size 4]\n", | |
"\n", | |
"similarities:\t\n" | |
] | |
}, | |
"execution_count": 21, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
" 19.0403\n", | |
" 21.5694\n", | |
" 23.9795\n", | |
" 21.1930\n", | |
" 20.9802\n", | |
" 23.6913\n", | |
" 20.4643\n", | |
" 17.5520\n", | |
"[torch.FloatTensor of size 8x1]\n", | |
"\n" | |
] | |
}, | |
"execution_count": 21, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"-- in place mean subtraction\n", | |
"local p = patches:view(N,1,64*64)\n", | |
"p:add(-1, p:mean(3):expandAs(p))\n", | |
"\n", | |
"local patch_pairs = torch.cat(patches, patches, 2)\n", | |
"print('patch_pairs size:\\n',patch_pairs:size())\n", | |
"\n", | |
"-- propagate through the network\n", | |
"print'similarities:'\n", | |
"print(net:forward(patch_pairs))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Similarities are high as expected" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Compute descriptors" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Lets take the first branch of our network:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 25, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"nn.Sequential {\n", | |
" [input -> (1) -> (2) -> (3) -> (4) -> (5) -> (6) -> (7) -> (8) -> (9) -> (10) -> output]\n", | |
" (1): nn.Reshape(1x64x64)\n", | |
" (2): nn.SpatialConvolution(1 -> 96, 7x7, 3,3)\n", | |
" (3): nn.ReLU\n", | |
" (4): nn.SpatialMaxPooling(2,2,2,2)\n", | |
" (5): nn.SpatialConvolution(96 -> 192, 5x5)\n", | |
" (6): nn.ReLU\n", | |
" (7): nn.SpatialMaxPooling(2,2,2,2)\n", | |
" (8): nn.SpatialConvolution(192 -> 256, 3x3)\n", | |
" (9): nn.ReLU\n", | |
" (10): nn.View(-1)\n", | |
"}\t\n" | |
] | |
}, | |
"execution_count": 25, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"descriptor_net = net:get(1):get(1)\n", | |
"print(tostring(descriptor_net))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 29, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
" 124\n", | |
" 1\n", | |
" 64\n", | |
" 64\n", | |
"[torch.LongStorage of size 4]\n", | |
"\n" | |
] | |
}, | |
"execution_count": 29, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
" 124\n", | |
" 256\n", | |
"[torch.LongStorage of size 2]\n", | |
"\n" | |
] | |
}, | |
"execution_count": 29, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"N = 124 -- the number of patches to match\n", | |
"patches = torch.randn(N,1,64,64):float()\n", | |
"print(patches:size())\n", | |
"\n", | |
"-- propagate only patches, not pairs\n", | |
"output = descriptor_net:forward(patches)\n", | |
"\n", | |
"-- print the size of the output tensor\n", | |
"print(#output)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 30, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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", | |
"text/plain": [ | |
"Console does not support images" | |
] | |
}, | |
"metadata": { | |
"image/png": { | |
"height": 124, | |
"width": 256 | |
} | |
}, | |
"output_type": "display_data" | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
"\n" | |
] | |
}, | |
"execution_count": 30, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"-- Visualize our descriptors\n", | |
"itorch.image(output)" | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "iTorch", | |
"language": "lua", | |
"name": "itorch" | |
}, | |
"language_info": { | |
"name": "lua", | |
"version": "5.1" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 0 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment