1138 lines
112 KiB
Text
1138 lines
112 KiB
Text
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import torch\n",
|
||
"import matplotlib\n",
|
||
"%matplotlib notebook\n",
|
||
"from matplotlib import pyplot as plt\n",
|
||
"import pickle\n",
|
||
"import torch.nn as nn\n",
|
||
"import numpy as np"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def load_net(file_path): \n",
|
||
" pkl_file = open(file_path, 'rb')\n",
|
||
" net= pickle.load(pkl_file)\n",
|
||
" pkl_file.close()\n",
|
||
" return net\n",
|
||
"\n",
|
||
"def ini():\n",
|
||
" kernel=torch.zeros([8,3,3,3])\n",
|
||
" array_0=np.array([[1,2,1],[0,0,0],[-1,-2,-1]],dtype='float32')\n",
|
||
" array_1=np.array([[2,1,0],[1,0,-1],[0,-1,-2]],dtype='float32')\n",
|
||
" array_2=np.array([[1,0,-1],[2,0,-2],[1,0,-1]],dtype='float32')\n",
|
||
" array_3=np.array([[0,-1,-2],[1,0,-1],[2,1,0]],dtype='float32')\n",
|
||
" array_4=np.array([[-1,-2,-1],[0,0,0],[1,2,1]],dtype='float32')\n",
|
||
" array_5=np.array([[-2,-1,0],[-1,0,1],[0,1,2]],dtype='float32')\n",
|
||
" array_6=np.array([[-1,0,1],[-2,0,2],[-1,0,1]],dtype='float32')\n",
|
||
" array_7=np.array([[0,1,2],[-1,0,1],[-2,-1,0]],dtype='float32')\n",
|
||
" for i in range(3):\n",
|
||
" kernel[0,i,:]=torch.from_numpy(array_0)\n",
|
||
" kernel[1,i,:]=torch.from_numpy(array_1)\n",
|
||
" kernel[2,i,:]=torch.from_numpy(array_2)\n",
|
||
" kernel[3,i,:]=torch.from_numpy(array_3)\n",
|
||
" kernel[4,i,:]=torch.from_numpy(array_4)\n",
|
||
" kernel[5,i,:]=torch.from_numpy(array_5)\n",
|
||
" kernel[6,i,:]=torch.from_numpy(array_6)\n",
|
||
" kernel[7,i,:]=torch.from_numpy(array_7)\n",
|
||
" return torch.nn.Parameter(kernel,requires_grad=True) \n",
|
||
"\n",
|
||
"class Net(nn.Module):\n",
|
||
" def __init__(self,frag_size,psize):\n",
|
||
" super(Net, self).__init__()\n",
|
||
" \n",
|
||
" h_fr=frag_size\n",
|
||
" w_fr=frag_size\n",
|
||
" \n",
|
||
" n=int(h_fr/psize) # n*m patches dans le patch d'entrée\n",
|
||
" m=int(w_fr/psize)\n",
|
||
" \n",
|
||
" self.conv1 = nn.Conv2d(3,4,kernel_size=3,stride=1,padding=1)\n",
|
||
" # Si vous souhaitez initialiser Conv1 avec les poids de DeepMatch, exécutez la ligne suivante\n",
|
||
" # self.conv1.weight=ini()\n",
|
||
" self.Relu = nn.ReLU(inplace=True)\n",
|
||
" self.maxpooling=nn.MaxPool2d(3,stride=2, padding=1)\n",
|
||
" \n",
|
||
" self.shift1=nn.Conv2d(n*m,n*m,kernel_size=3,stride=1,padding=1)\n",
|
||
" self.shift1.weight=kernel_shift_ini(n,m)\n",
|
||
" self.add1 = nn.Conv2d(n*m,int(n/2)*int(m/2),kernel_size=1,stride=1,padding=0)\n",
|
||
" self.add1.weight=kernel_add_ini(n,m)\n",
|
||
" \n",
|
||
" n=int(n/2)\n",
|
||
" m=int(m/2)\n",
|
||
" if n>=2 and m>=2:# Si n=m=1,Notre réseau n'a plus besoin de plus de couches pour agréger les cartes de corrélation\n",
|
||
" self.shift2=nn.Conv2d(n*m,n*m,kernel_size=3,stride=1,padding=1)\n",
|
||
" self.shift2.weight=kernel_shift_ini(n,m)\n",
|
||
" self.add2 = nn.Conv2d(n*m,int(n/2)*int(m/2),kernel_size=1,stride=1,padding=0)\n",
|
||
" self.add2.weight=kernel_add_ini(n,m)\n",
|
||
" \n",
|
||
" n=int(n/2)\n",
|
||
" m=int(m/2)\n",
|
||
" if n>=2 and m>=2:\n",
|
||
" self.shift3=nn.Conv2d(n*m,n*m,kernel_size=3,stride=1,padding=1)\n",
|
||
" self.shift3.weight=kernel_shift_ini(n,m)\n",
|
||
" self.add3 = nn.Conv2d(n*m,int(n/2)*int(m/2),kernel_size=1,stride=1,padding=0)\n",
|
||
" self.add3.weight=kernel_add_ini(n,m)\n",
|
||
" \n",
|
||
" def get_descripteur(self,img,using_cuda):\n",
|
||
" # Utilisez Conv1 pour calculer le descripteur,\n",
|
||
" descripteur_img=self.Relu(self.conv1(img))\n",
|
||
" b,c,h,w=descripteur_img.shape\n",
|
||
" couche_constante=0.5*torch.ones([1,1,h,w])\n",
|
||
" if using_cuda:\n",
|
||
" couche_constante=couche_constante.cuda()\n",
|
||
" # Ajouter une couche constante pour éviter la division par 0 lors de la normalisation\n",
|
||
" descripteur_img=torch.cat((descripteur_img,couche_constante),1)\n",
|
||
" # la normalisation\n",
|
||
" descripteur_img_norm=descripteur_img/torch.norm(descripteur_img,dim=1)\n",
|
||
" return descripteur_img_norm\n",
|
||
" \n",
|
||
" def forward(self,img,frag,using_cuda):\n",
|
||
" psize=4\n",
|
||
" # Utilisez Conv1 pour calculer le descripteur,\n",
|
||
" descripteur_input1=self.get_descripteur(img,using_cuda)\n",
|
||
" descripteur_input2=self.get_descripteur(frag,using_cuda)\n",
|
||
" \n",
|
||
" b,c,h,w=frag.shape\n",
|
||
" n=int(h/psize)\n",
|
||
" m=int(w/psize)\n",
|
||
" \n",
|
||
" #######################################\n",
|
||
" # Calculer la carte de corrélation par convolution pour les n*m patchs plus petit.\n",
|
||
" for i in range(n):\n",
|
||
" for j in range(m):\n",
|
||
" if i==0 and j==0:\n",
|
||
" map_corre=F.conv2d(descripteur_input1,get_patch(descripteur_input2,psize,i,j),padding=2)\n",
|
||
" else:\n",
|
||
" a=F.conv2d(descripteur_input1,get_patch(descripteur_input2,psize,i,j),padding=2)\n",
|
||
" map_corre=torch.cat((map_corre,a),1)\n",
|
||
" ########################################\n",
|
||
" # Étape de polymérisation\n",
|
||
" map_corre=self.maxpooling(map_corre)\n",
|
||
" map_corre=self.shift1(map_corre)\n",
|
||
" map_corre=self.add1(map_corre)\n",
|
||
" \n",
|
||
" #########################################\n",
|
||
" # Répétez l'étape d'agrégation jusqu'à obtenir le graphique de corrélation du patch d'entrée\n",
|
||
" n=int(n/2)\n",
|
||
" m=int(m/2)\n",
|
||
" if n>=2 and m>=2:\n",
|
||
" map_corre=self.maxpooling(map_corre)\n",
|
||
" map_corre=self.shift2(map_corre)\n",
|
||
" map_corre=self.add2(map_corre)\n",
|
||
" \n",
|
||
" \n",
|
||
" n=int(n/2)\n",
|
||
" m=int(m/2)\n",
|
||
" if n>=2 and m>=2:\n",
|
||
" map_corre=self.maxpooling(map_corre)\n",
|
||
" map_corre=self.shift3(map_corre)\n",
|
||
" map_corre=self.add3(map_corre)\n",
|
||
" \n",
|
||
" \n",
|
||
" b,c,h,w=map_corre.shape\n",
|
||
" # Normalisation de la division par maximum\n",
|
||
" map_corre=map_corre/(map_corre.max())\n",
|
||
" # Normalisation SoftMax\n",
|
||
" #map_corre=(F.softmax(map_corre.reshape(1,1,h*w,1),dim=2)).reshape(b,c,h,w)\n",
|
||
" return map_corre\n",
|
||
"\n",
|
||
"def normalize(a):\n",
|
||
" return((a - np.min(a))/np.ptp(a))\n",
|
||
"\n",
|
||
"def carte(w,save_filename,title):\n",
|
||
" \n",
|
||
" fig,axs = plt.subplots(3,8,figsize=(15,8))\n",
|
||
" \n",
|
||
" max_ptp = 0\n",
|
||
" ref_im = None\n",
|
||
" \n",
|
||
" for i in range(3):\n",
|
||
" for j in range(8):\n",
|
||
" im = axs[i,j].imshow(normalize(w[j,i,:,:]))\n",
|
||
" \n",
|
||
" if i == 0:\n",
|
||
" axs[i,j].set_title('Couche {}'.format(j))\n",
|
||
" if j == 0:\n",
|
||
" axs[i,j].set_ylabel('Channel {}'.format(i+1))\n",
|
||
" \n",
|
||
" axs[i,j].set_xticks([])\n",
|
||
" axs[i,j].set_yticks([])\n",
|
||
"\n",
|
||
" fig.subplots_adjust(right=0.8)\n",
|
||
" cbar_ax = fig.add_axes([0.85, 0.15, 0.05, 0.7])\n",
|
||
" fig.colorbar(im, cax=cbar_ax)\n",
|
||
" \n",
|
||
" \n",
|
||
" \n",
|
||
" fig.suptitle(\"{}\".format(title),fontsize=16)\n",
|
||
" \n",
|
||
" if save_filename != None:\n",
|
||
" plt.savefig(save_filename)\n",
|
||
" #plt.close()\n",
|
||
"\n",
|
||
"def carte4(w,save_filename,title):\n",
|
||
" \n",
|
||
" fig,axs = plt.subplots(3,4,figsize=(15,8))\n",
|
||
" \n",
|
||
" max_ptp = 0\n",
|
||
" ref_im = None\n",
|
||
" \n",
|
||
" for i in range(3):\n",
|
||
" for j in range(4):\n",
|
||
" im = axs[i,j].imshow(normalize(w[j,i,:,:]))\n",
|
||
" \n",
|
||
" if i == 0:\n",
|
||
" axs[i,j].set_title('Couche {}'.format(j))\n",
|
||
" if j == 0:\n",
|
||
" axs[i,j].set_ylabel('Channel {}'.format(i+1))\n",
|
||
" \n",
|
||
" axs[i,j].set_xticks([])\n",
|
||
" axs[i,j].set_yticks([])\n",
|
||
"\n",
|
||
" fig.subplots_adjust(right=0.8)\n",
|
||
" cbar_ax = fig.add_axes([0.85, 0.15, 0.05, 0.7])\n",
|
||
" fig.colorbar(im, cax=cbar_ax)\n",
|
||
" \n",
|
||
" \n",
|
||
" \n",
|
||
" fig.suptitle(\"{}\".format(title),fontsize=16)\n",
|
||
" \n",
|
||
" if save_filename != None:\n",
|
||
" plt.savefig(save_filename)\n",
|
||
" #plt.close()\n",
|
||
" \n",
|
||
"def carte_32(w,save_filename,title):\n",
|
||
" \n",
|
||
" fig,axs = plt.subplots(3,4,figsize=(15,8))\n",
|
||
" \n",
|
||
" max_ptp = 0\n",
|
||
" ref_im = None\n",
|
||
" \n",
|
||
" for i in range(3):\n",
|
||
" for j in range(4):\n",
|
||
" #im = axs[i,j].imshow(normalize(w[j,i,:,:]))\n",
|
||
" im = axs[i,j].imshow(w[j,i,:,:],cmap='coolwarm')\n",
|
||
" \n",
|
||
" for a in range(3):\n",
|
||
" for b in range(3):\n",
|
||
" text = axs[i,j].text(b, a, round(w[j, i, a, b],2),\n",
|
||
" ha=\"center\", va=\"center\", color=\"w\")\n",
|
||
" \n",
|
||
" if i == 0:\n",
|
||
" axs[i,j].set_title('Couche {}'.format(j))\n",
|
||
" if j == 0:\n",
|
||
" axs[i,j].set_ylabel('Channel {}'.format(i+1))\n",
|
||
" \n",
|
||
" axs[i,j].set_xticks([])\n",
|
||
" axs[i,j].set_yticks([])\n",
|
||
"\n",
|
||
" fig.subplots_adjust(right=0.8)\n",
|
||
" cbar_ax = fig.add_axes([0.85, 0.15, 0.05, 0.7])\n",
|
||
" \n",
|
||
" mini,maxi = np.min(w),np.max(w)\n",
|
||
" \n",
|
||
" cmap = matplotlib.cm.coolwarm\n",
|
||
" norm = matplotlib.colors.Normalize(vmin=mini, vmax=maxi)\n",
|
||
" \n",
|
||
" fig.colorbar(matplotlib.cm.ScalarMappable(norm=norm, cmap=cmap), cax=cbar_ax,orientation='vertical')\n",
|
||
" \n",
|
||
" \n",
|
||
" \n",
|
||
" fig.suptitle(\"{}\".format(title),fontsize=16)\n",
|
||
" \n",
|
||
" if save_filename != None:\n",
|
||
" plt.savefig(save_filename)\n",
|
||
" #plt.close()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 4,
|
||
"metadata": {
|
||
"scrolled": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"(8, 3, 3, 3)\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"application/javascript": [
|
||
"/* Put everything inside the global mpl namespace */\n",
|
||
"window.mpl = {};\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.get_websocket_type = function() {\n",
|
||
" if (typeof(WebSocket) !== 'undefined') {\n",
|
||
" return WebSocket;\n",
|
||
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
|
||
" return MozWebSocket;\n",
|
||
" } else {\n",
|
||
" alert('Your browser does not have WebSocket support. ' +\n",
|
||
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
|
||
" 'Firefox 4 and 5 are also supported but you ' +\n",
|
||
" 'have to enable WebSockets in about:config.');\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
|
||
" this.id = figure_id;\n",
|
||
"\n",
|
||
" this.ws = websocket;\n",
|
||
"\n",
|
||
" this.supports_binary = (this.ws.binaryType != undefined);\n",
|
||
"\n",
|
||
" if (!this.supports_binary) {\n",
|
||
" var warnings = document.getElementById(\"mpl-warnings\");\n",
|
||
" if (warnings) {\n",
|
||
" warnings.style.display = 'block';\n",
|
||
" warnings.textContent = (\n",
|
||
" \"This browser does not support binary websocket messages. \" +\n",
|
||
" \"Performance may be slow.\");\n",
|
||
" }\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.imageObj = new Image();\n",
|
||
"\n",
|
||
" this.context = undefined;\n",
|
||
" this.message = undefined;\n",
|
||
" this.canvas = undefined;\n",
|
||
" this.rubberband_canvas = undefined;\n",
|
||
" this.rubberband_context = undefined;\n",
|
||
" this.format_dropdown = undefined;\n",
|
||
"\n",
|
||
" this.image_mode = 'full';\n",
|
||
"\n",
|
||
" this.root = $('<div/>');\n",
|
||
" this._root_extra_style(this.root)\n",
|
||
" this.root.attr('style', 'display: inline-block');\n",
|
||
"\n",
|
||
" $(parent_element).append(this.root);\n",
|
||
"\n",
|
||
" this._init_header(this);\n",
|
||
" this._init_canvas(this);\n",
|
||
" this._init_toolbar(this);\n",
|
||
"\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" this.waiting = false;\n",
|
||
"\n",
|
||
" this.ws.onopen = function () {\n",
|
||
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
|
||
" fig.send_message(\"send_image_mode\", {});\n",
|
||
" if (mpl.ratio != 1) {\n",
|
||
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
|
||
" }\n",
|
||
" fig.send_message(\"refresh\", {});\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.imageObj.onload = function() {\n",
|
||
" if (fig.image_mode == 'full') {\n",
|
||
" // Full images could contain transparency (where diff images\n",
|
||
" // almost always do), so we need to clear the canvas so that\n",
|
||
" // there is no ghosting.\n",
|
||
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
|
||
" }\n",
|
||
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
|
||
" };\n",
|
||
"\n",
|
||
" this.imageObj.onunload = function() {\n",
|
||
" fig.ws.close();\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.ws.onmessage = this._make_on_message_function(this);\n",
|
||
"\n",
|
||
" this.ondownload = ondownload;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_header = function() {\n",
|
||
" var titlebar = $(\n",
|
||
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
|
||
" 'ui-helper-clearfix\"/>');\n",
|
||
" var titletext = $(\n",
|
||
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
|
||
" 'text-align: center; padding: 3px;\"/>');\n",
|
||
" titlebar.append(titletext)\n",
|
||
" this.root.append(titlebar);\n",
|
||
" this.header = titletext[0];\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_canvas = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var canvas_div = $('<div/>');\n",
|
||
"\n",
|
||
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
|
||
"\n",
|
||
" function canvas_keyboard_event(event) {\n",
|
||
" return fig.key_event(event, event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
|
||
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
|
||
" this.canvas_div = canvas_div\n",
|
||
" this._canvas_extra_style(canvas_div)\n",
|
||
" this.root.append(canvas_div);\n",
|
||
"\n",
|
||
" var canvas = $('<canvas/>');\n",
|
||
" canvas.addClass('mpl-canvas');\n",
|
||
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
|
||
"\n",
|
||
" this.canvas = canvas[0];\n",
|
||
" this.context = canvas[0].getContext(\"2d\");\n",
|
||
"\n",
|
||
" var backingStore = this.context.backingStorePixelRatio ||\n",
|
||
"\tthis.context.webkitBackingStorePixelRatio ||\n",
|
||
"\tthis.context.mozBackingStorePixelRatio ||\n",
|
||
"\tthis.context.msBackingStorePixelRatio ||\n",
|
||
"\tthis.context.oBackingStorePixelRatio ||\n",
|
||
"\tthis.context.backingStorePixelRatio || 1;\n",
|
||
"\n",
|
||
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
|
||
"\n",
|
||
" var rubberband = $('<canvas/>');\n",
|
||
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
|
||
"\n",
|
||
" var pass_mouse_events = true;\n",
|
||
"\n",
|
||
" canvas_div.resizable({\n",
|
||
" start: function(event, ui) {\n",
|
||
" pass_mouse_events = false;\n",
|
||
" },\n",
|
||
" resize: function(event, ui) {\n",
|
||
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
||
" },\n",
|
||
" stop: function(event, ui) {\n",
|
||
" pass_mouse_events = true;\n",
|
||
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
||
" },\n",
|
||
" });\n",
|
||
"\n",
|
||
" function mouse_event_fn(event) {\n",
|
||
" if (pass_mouse_events)\n",
|
||
" return fig.mouse_event(event, event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" rubberband.mousedown('button_press', mouse_event_fn);\n",
|
||
" rubberband.mouseup('button_release', mouse_event_fn);\n",
|
||
" // Throttle sequential mouse events to 1 every 20ms.\n",
|
||
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
|
||
"\n",
|
||
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
|
||
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
|
||
"\n",
|
||
" canvas_div.on(\"wheel\", function (event) {\n",
|
||
" event = event.originalEvent;\n",
|
||
" event['data'] = 'scroll'\n",
|
||
" if (event.deltaY < 0) {\n",
|
||
" event.step = 1;\n",
|
||
" } else {\n",
|
||
" event.step = -1;\n",
|
||
" }\n",
|
||
" mouse_event_fn(event);\n",
|
||
" });\n",
|
||
"\n",
|
||
" canvas_div.append(canvas);\n",
|
||
" canvas_div.append(rubberband);\n",
|
||
"\n",
|
||
" this.rubberband = rubberband;\n",
|
||
" this.rubberband_canvas = rubberband[0];\n",
|
||
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
|
||
" this.rubberband_context.strokeStyle = \"#000000\";\n",
|
||
"\n",
|
||
" this._resize_canvas = function(width, height) {\n",
|
||
" // Keep the size of the canvas, canvas container, and rubber band\n",
|
||
" // canvas in synch.\n",
|
||
" canvas_div.css('width', width)\n",
|
||
" canvas_div.css('height', height)\n",
|
||
"\n",
|
||
" canvas.attr('width', width * mpl.ratio);\n",
|
||
" canvas.attr('height', height * mpl.ratio);\n",
|
||
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
|
||
"\n",
|
||
" rubberband.attr('width', width);\n",
|
||
" rubberband.attr('height', height);\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
|
||
" // upon first draw.\n",
|
||
" this._resize_canvas(600, 600);\n",
|
||
"\n",
|
||
" // Disable right mouse context menu.\n",
|
||
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
|
||
" return false;\n",
|
||
" });\n",
|
||
"\n",
|
||
" function set_focus () {\n",
|
||
" canvas.focus();\n",
|
||
" canvas_div.focus();\n",
|
||
" }\n",
|
||
"\n",
|
||
" window.setTimeout(set_focus, 100);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_toolbar = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var nav_element = $('<div/>');\n",
|
||
" nav_element.attr('style', 'width: 100%');\n",
|
||
" this.root.append(nav_element);\n",
|
||
"\n",
|
||
" // Define a callback function for later on.\n",
|
||
" function toolbar_event(event) {\n",
|
||
" return fig.toolbar_button_onclick(event['data']);\n",
|
||
" }\n",
|
||
" function toolbar_mouse_event(event) {\n",
|
||
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" for(var toolbar_ind in mpl.toolbar_items) {\n",
|
||
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
||
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
||
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
||
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
||
"\n",
|
||
" if (!name) {\n",
|
||
" // put a spacer in here.\n",
|
||
" continue;\n",
|
||
" }\n",
|
||
" var button = $('<button/>');\n",
|
||
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
|
||
" 'ui-button-icon-only');\n",
|
||
" button.attr('role', 'button');\n",
|
||
" button.attr('aria-disabled', 'false');\n",
|
||
" button.click(method_name, toolbar_event);\n",
|
||
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
||
"\n",
|
||
" var icon_img = $('<span/>');\n",
|
||
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
|
||
" icon_img.addClass(image);\n",
|
||
" icon_img.addClass('ui-corner-all');\n",
|
||
"\n",
|
||
" var tooltip_span = $('<span/>');\n",
|
||
" tooltip_span.addClass('ui-button-text');\n",
|
||
" tooltip_span.html(tooltip);\n",
|
||
"\n",
|
||
" button.append(icon_img);\n",
|
||
" button.append(tooltip_span);\n",
|
||
"\n",
|
||
" nav_element.append(button);\n",
|
||
" }\n",
|
||
"\n",
|
||
" var fmt_picker_span = $('<span/>');\n",
|
||
"\n",
|
||
" var fmt_picker = $('<select/>');\n",
|
||
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
|
||
" fmt_picker_span.append(fmt_picker);\n",
|
||
" nav_element.append(fmt_picker_span);\n",
|
||
" this.format_dropdown = fmt_picker[0];\n",
|
||
"\n",
|
||
" for (var ind in mpl.extensions) {\n",
|
||
" var fmt = mpl.extensions[ind];\n",
|
||
" var option = $(\n",
|
||
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
|
||
" fmt_picker.append(option);\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Add hover states to the ui-buttons\n",
|
||
" $( \".ui-button\" ).hover(\n",
|
||
" function() { $(this).addClass(\"ui-state-hover\");},\n",
|
||
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
|
||
" );\n",
|
||
"\n",
|
||
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
|
||
" nav_element.append(status_bar);\n",
|
||
" this.message = status_bar[0];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
|
||
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
|
||
" // which will in turn request a refresh of the image.\n",
|
||
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.send_message = function(type, properties) {\n",
|
||
" properties['type'] = type;\n",
|
||
" properties['figure_id'] = this.id;\n",
|
||
" this.ws.send(JSON.stringify(properties));\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.send_draw_message = function() {\n",
|
||
" if (!this.waiting) {\n",
|
||
" this.waiting = true;\n",
|
||
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
||
" var format_dropdown = fig.format_dropdown;\n",
|
||
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
|
||
" fig.ondownload(fig, format);\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
|
||
" var size = msg['size'];\n",
|
||
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
|
||
" fig._resize_canvas(size[0], size[1]);\n",
|
||
" fig.send_message(\"refresh\", {});\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
|
||
" var x0 = msg['x0'] / mpl.ratio;\n",
|
||
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
|
||
" var x1 = msg['x1'] / mpl.ratio;\n",
|
||
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
|
||
" x0 = Math.floor(x0) + 0.5;\n",
|
||
" y0 = Math.floor(y0) + 0.5;\n",
|
||
" x1 = Math.floor(x1) + 0.5;\n",
|
||
" y1 = Math.floor(y1) + 0.5;\n",
|
||
" var min_x = Math.min(x0, x1);\n",
|
||
" var min_y = Math.min(y0, y1);\n",
|
||
" var width = Math.abs(x1 - x0);\n",
|
||
" var height = Math.abs(y1 - y0);\n",
|
||
"\n",
|
||
" fig.rubberband_context.clearRect(\n",
|
||
" 0, 0, fig.canvas.width / mpl.ratio, fig.canvas.height / mpl.ratio);\n",
|
||
"\n",
|
||
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
|
||
" // Updates the figure title.\n",
|
||
" fig.header.textContent = msg['label'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
|
||
" var cursor = msg['cursor'];\n",
|
||
" switch(cursor)\n",
|
||
" {\n",
|
||
" case 0:\n",
|
||
" cursor = 'pointer';\n",
|
||
" break;\n",
|
||
" case 1:\n",
|
||
" cursor = 'default';\n",
|
||
" break;\n",
|
||
" case 2:\n",
|
||
" cursor = 'crosshair';\n",
|
||
" break;\n",
|
||
" case 3:\n",
|
||
" cursor = 'move';\n",
|
||
" break;\n",
|
||
" }\n",
|
||
" fig.rubberband_canvas.style.cursor = cursor;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
|
||
" fig.message.textContent = msg['message'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
|
||
" // Request the server to send over a new figure.\n",
|
||
" fig.send_draw_message();\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
|
||
" fig.image_mode = msg['mode'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
||
" // Called whenever the canvas gets updated.\n",
|
||
" this.send_message(\"ack\", {});\n",
|
||
"}\n",
|
||
"\n",
|
||
"// A function to construct a web socket function for onmessage handling.\n",
|
||
"// Called in the figure constructor.\n",
|
||
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
|
||
" return function socket_on_message(evt) {\n",
|
||
" if (evt.data instanceof Blob) {\n",
|
||
" /* FIXME: We get \"Resource interpreted as Image but\n",
|
||
" * transferred with MIME type text/plain:\" errors on\n",
|
||
" * Chrome. But how to set the MIME type? It doesn't seem\n",
|
||
" * to be part of the websocket stream */\n",
|
||
" evt.data.type = \"image/png\";\n",
|
||
"\n",
|
||
" /* Free the memory for the previous frames */\n",
|
||
" if (fig.imageObj.src) {\n",
|
||
" (window.URL || window.webkitURL).revokeObjectURL(\n",
|
||
" fig.imageObj.src);\n",
|
||
" }\n",
|
||
"\n",
|
||
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
|
||
" evt.data);\n",
|
||
" fig.updated_canvas_event();\n",
|
||
" fig.waiting = false;\n",
|
||
" return;\n",
|
||
" }\n",
|
||
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
|
||
" fig.imageObj.src = evt.data;\n",
|
||
" fig.updated_canvas_event();\n",
|
||
" fig.waiting = false;\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" var msg = JSON.parse(evt.data);\n",
|
||
" var msg_type = msg['type'];\n",
|
||
"\n",
|
||
" // Call the \"handle_{type}\" callback, which takes\n",
|
||
" // the figure and JSON message as its only arguments.\n",
|
||
" try {\n",
|
||
" var callback = fig[\"handle_\" + msg_type];\n",
|
||
" } catch (e) {\n",
|
||
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" if (callback) {\n",
|
||
" try {\n",
|
||
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
|
||
" callback(fig, msg);\n",
|
||
" } catch (e) {\n",
|
||
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
|
||
" }\n",
|
||
" }\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
|
||
"mpl.findpos = function(e) {\n",
|
||
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
|
||
" var targ;\n",
|
||
" if (!e)\n",
|
||
" e = window.event;\n",
|
||
" if (e.target)\n",
|
||
" targ = e.target;\n",
|
||
" else if (e.srcElement)\n",
|
||
" targ = e.srcElement;\n",
|
||
" if (targ.nodeType == 3) // defeat Safari bug\n",
|
||
" targ = targ.parentNode;\n",
|
||
"\n",
|
||
" // jQuery normalizes the pageX and pageY\n",
|
||
" // pageX,Y are the mouse positions relative to the document\n",
|
||
" // offset() returns the position of the element relative to the document\n",
|
||
" var x = e.pageX - $(targ).offset().left;\n",
|
||
" var y = e.pageY - $(targ).offset().top;\n",
|
||
"\n",
|
||
" return {\"x\": x, \"y\": y};\n",
|
||
"};\n",
|
||
"\n",
|
||
"/*\n",
|
||
" * return a copy of an object with only non-object keys\n",
|
||
" * we need this to avoid circular references\n",
|
||
" * http://stackoverflow.com/a/24161582/3208463\n",
|
||
" */\n",
|
||
"function simpleKeys (original) {\n",
|
||
" return Object.keys(original).reduce(function (obj, key) {\n",
|
||
" if (typeof original[key] !== 'object')\n",
|
||
" obj[key] = original[key]\n",
|
||
" return obj;\n",
|
||
" }, {});\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
|
||
" var canvas_pos = mpl.findpos(event)\n",
|
||
"\n",
|
||
" if (name === 'button_press')\n",
|
||
" {\n",
|
||
" this.canvas.focus();\n",
|
||
" this.canvas_div.focus();\n",
|
||
" }\n",
|
||
"\n",
|
||
" var x = canvas_pos.x * mpl.ratio;\n",
|
||
" var y = canvas_pos.y * mpl.ratio;\n",
|
||
"\n",
|
||
" this.send_message(name, {x: x, y: y, button: event.button,\n",
|
||
" step: event.step,\n",
|
||
" guiEvent: simpleKeys(event)});\n",
|
||
"\n",
|
||
" /* This prevents the web browser from automatically changing to\n",
|
||
" * the text insertion cursor when the button is pressed. We want\n",
|
||
" * to control all of the cursor setting manually through the\n",
|
||
" * 'cursor' event from matplotlib */\n",
|
||
" event.preventDefault();\n",
|
||
" return false;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
||
" // Handle any extra behaviour associated with a key event\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.key_event = function(event, name) {\n",
|
||
"\n",
|
||
" // Prevent repeat events\n",
|
||
" if (name == 'key_press')\n",
|
||
" {\n",
|
||
" if (event.which === this._key)\n",
|
||
" return;\n",
|
||
" else\n",
|
||
" this._key = event.which;\n",
|
||
" }\n",
|
||
" if (name == 'key_release')\n",
|
||
" this._key = null;\n",
|
||
"\n",
|
||
" var value = '';\n",
|
||
" if (event.ctrlKey && event.which != 17)\n",
|
||
" value += \"ctrl+\";\n",
|
||
" if (event.altKey && event.which != 18)\n",
|
||
" value += \"alt+\";\n",
|
||
" if (event.shiftKey && event.which != 16)\n",
|
||
" value += \"shift+\";\n",
|
||
"\n",
|
||
" value += 'k';\n",
|
||
" value += event.which.toString();\n",
|
||
"\n",
|
||
" this._key_event_extra(event, name);\n",
|
||
"\n",
|
||
" this.send_message(name, {key: value,\n",
|
||
" guiEvent: simpleKeys(event)});\n",
|
||
" return false;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
|
||
" if (name == 'download') {\n",
|
||
" this.handle_save(this, null);\n",
|
||
" } else {\n",
|
||
" this.send_message(\"toolbar_button\", {name: name});\n",
|
||
" }\n",
|
||
"};\n",
|
||
"\n",
|
||
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
|
||
" this.message.textContent = tooltip;\n",
|
||
"};\n",
|
||
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
|
||
"\n",
|
||
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
|
||
"\n",
|
||
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
|
||
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
|
||
" // object with the appropriate methods. Currently this is a non binary\n",
|
||
" // socket, so there is still some room for performance tuning.\n",
|
||
" var ws = {};\n",
|
||
"\n",
|
||
" ws.close = function() {\n",
|
||
" comm.close()\n",
|
||
" };\n",
|
||
" ws.send = function(m) {\n",
|
||
" //console.log('sending', m);\n",
|
||
" comm.send(m);\n",
|
||
" };\n",
|
||
" // Register the callback with on_msg.\n",
|
||
" comm.on_msg(function(msg) {\n",
|
||
" //console.log('receiving', msg['content']['data'], msg);\n",
|
||
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
|
||
" ws.onmessage(msg['content']['data'])\n",
|
||
" });\n",
|
||
" return ws;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.mpl_figure_comm = function(comm, msg) {\n",
|
||
" // This is the function which gets called when the mpl process\n",
|
||
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
|
||
"\n",
|
||
" var id = msg.content.data.id;\n",
|
||
" // Get hold of the div created by the display call when the Comm\n",
|
||
" // socket was opened in Python.\n",
|
||
" var element = $(\"#\" + id);\n",
|
||
" var ws_proxy = comm_websocket_adapter(comm)\n",
|
||
"\n",
|
||
" function ondownload(figure, format) {\n",
|
||
" window.open(figure.imageObj.src);\n",
|
||
" }\n",
|
||
"\n",
|
||
" var fig = new mpl.figure(id, ws_proxy,\n",
|
||
" ondownload,\n",
|
||
" element.get(0));\n",
|
||
"\n",
|
||
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
|
||
" // web socket which is closed, not our websocket->open comm proxy.\n",
|
||
" ws_proxy.onopen();\n",
|
||
"\n",
|
||
" fig.parent_element = element.get(0);\n",
|
||
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
|
||
" if (!fig.cell_info) {\n",
|
||
" console.error(\"Failed to find cell for figure\", id, fig);\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" var output_index = fig.cell_info[2]\n",
|
||
" var cell = fig.cell_info[0];\n",
|
||
"\n",
|
||
"};\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
|
||
" var width = fig.canvas.width/mpl.ratio\n",
|
||
" fig.root.unbind('remove')\n",
|
||
"\n",
|
||
" // Update the output cell to use the data from the current canvas.\n",
|
||
" fig.push_to_output();\n",
|
||
" var dataURL = fig.canvas.toDataURL();\n",
|
||
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
|
||
" // the notebook keyboard shortcuts fail.\n",
|
||
" IPython.keyboard_manager.enable()\n",
|
||
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
|
||
" fig.close_ws(fig, msg);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
|
||
" fig.send_message('closing', msg);\n",
|
||
" // fig.ws.close()\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
|
||
" // Turn the data on the canvas into data in the output cell.\n",
|
||
" var width = this.canvas.width/mpl.ratio\n",
|
||
" var dataURL = this.canvas.toDataURL();\n",
|
||
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
||
" // Tell IPython that the notebook contents must change.\n",
|
||
" IPython.notebook.set_dirty(true);\n",
|
||
" this.send_message(\"ack\", {});\n",
|
||
" var fig = this;\n",
|
||
" // Wait a second, then push the new image to the DOM so\n",
|
||
" // that it is saved nicely (might be nice to debounce this).\n",
|
||
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_toolbar = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var nav_element = $('<div/>');\n",
|
||
" nav_element.attr('style', 'width: 100%');\n",
|
||
" this.root.append(nav_element);\n",
|
||
"\n",
|
||
" // Define a callback function for later on.\n",
|
||
" function toolbar_event(event) {\n",
|
||
" return fig.toolbar_button_onclick(event['data']);\n",
|
||
" }\n",
|
||
" function toolbar_mouse_event(event) {\n",
|
||
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" for(var toolbar_ind in mpl.toolbar_items){\n",
|
||
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
||
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
||
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
||
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
||
"\n",
|
||
" if (!name) { continue; };\n",
|
||
"\n",
|
||
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
|
||
" button.click(method_name, toolbar_event);\n",
|
||
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
||
" nav_element.append(button);\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Add the status bar.\n",
|
||
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
|
||
" nav_element.append(status_bar);\n",
|
||
" this.message = status_bar[0];\n",
|
||
"\n",
|
||
" // Add the close button to the window.\n",
|
||
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
|
||
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
|
||
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
|
||
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
|
||
" buttongrp.append(button);\n",
|
||
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
|
||
" titlebar.prepend(buttongrp);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._root_extra_style = function(el){\n",
|
||
" var fig = this\n",
|
||
" el.on(\"remove\", function(){\n",
|
||
"\tfig.close_ws(fig, {});\n",
|
||
" });\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
|
||
" // this is important to make the div 'focusable\n",
|
||
" el.attr('tabindex', 0)\n",
|
||
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
|
||
" // off when our div gets focus\n",
|
||
"\n",
|
||
" // location in version 3\n",
|
||
" if (IPython.notebook.keyboard_manager) {\n",
|
||
" IPython.notebook.keyboard_manager.register_events(el);\n",
|
||
" }\n",
|
||
" else {\n",
|
||
" // location in version 2\n",
|
||
" IPython.keyboard_manager.register_events(el);\n",
|
||
" }\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
||
" var manager = IPython.notebook.keyboard_manager;\n",
|
||
" if (!manager)\n",
|
||
" manager = IPython.keyboard_manager;\n",
|
||
"\n",
|
||
" // Check for shift+enter\n",
|
||
" if (event.shiftKey && event.which == 13) {\n",
|
||
" this.canvas_div.blur();\n",
|
||
" // select the cell after this one\n",
|
||
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
|
||
" IPython.notebook.select(index + 1);\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
||
" fig.ondownload(fig, null);\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.find_output_cell = function(html_output) {\n",
|
||
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
|
||
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
|
||
" // IPython event is triggered only after the cells have been serialised, which for\n",
|
||
" // our purposes (turning an active figure into a static one), is too late.\n",
|
||
" var cells = IPython.notebook.get_cells();\n",
|
||
" var ncells = cells.length;\n",
|
||
" for (var i=0; i<ncells; i++) {\n",
|
||
" var cell = cells[i];\n",
|
||
" if (cell.cell_type === 'code'){\n",
|
||
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
|
||
" var data = cell.output_area.outputs[j];\n",
|
||
" if (data.data) {\n",
|
||
" // IPython >= 3 moved mimebundle to data attribute of output\n",
|
||
" data = data.data;\n",
|
||
" }\n",
|
||
" if (data['text/html'] == html_output) {\n",
|
||
" return [cell, data, j];\n",
|
||
" }\n",
|
||
" }\n",
|
||
" }\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"// Register the function which deals with the matplotlib target/channel.\n",
|
||
"// The kernel may be null if the page has been refreshed.\n",
|
||
"if (IPython.notebook.kernel != null) {\n",
|
||
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
|
||
"}\n"
|
||
],
|
||
"text/plain": [
|
||
"<IPython.core.display.Javascript object>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABdwAAAMgCAYAAAA5taA8AAAgAElEQVR4nOzdd3hUZf6/8SeQQkKJBCkBQxJ6DyFBUAQUEUVBwcWOC5a1K7qrrl/ZFSsCIooFsLCsFV3siq4FhLViAwtdREWKKEiRDnn//sjvHDPJzDAZEh4Oz/26rs916UzmZDKZeThzz+SMEQAAAAAAAAAA2GfG9hUAAAAAAAAAAOBgQHAHAAAAAAAAAKACENwBAAAAAAAAAKgABHcAAAAAAAAAACoAwR0AAAAAAAAAgApAcAcAAAAAAAAAoAIQ3AEAAAAAAAAAqAAEdwAAAAAAAAAAKgDBHQAAAAAAAACACkBwBwAAAAAAAACgAhDcAQAAAAAAAACoAAR3AAAAAAAAAAAqAMEdAAAAAAAAAIAKQHAHAAAAAAAAAKACENwBAAAAAAAAAKgABHcAAOJkjJEx5f+ntGfPnjLG6N133634KxWj7OxsGWO0fPlya9cB7oj3sQIgOEaMGCFjjEaMGGH7qlS6A+Hf8YqyfPlyGWOUnZ1d7stGW9uXL1+uM844Q3Xr1lVCQoKMMZoyZcq+XVkAAAKCZz4AgIOKF5JLTrVq1dSkSROdd955+uabbyrsexHcERQvvviiRowYoblz51r5/gT3inPPPfdoxIgR+u233+K6/JQpUzR06FB16NBBdevWVWJiojIyMnTMMcdoypQp2rNnT5nLFBUV6b333tO1116rLl26KD09XUlJScrMzNSpp56qmTNn7uuPFeLzzz/Xtddeq+7duysrK0vVqlVTWlqa2rZtq2uvvVZr1qwJe7kVK1bonnvuUb9+/dSoUSMlJSWpVq1a6tq1q8aNG6ft27dXyPXbtm2bmjVr5t+vV6xYUSHbDTqCezBVRnDfvn27cnNzZYxR3bp11bVrV3Xr1k2vv/66pH1fxwAAONDxzAcAcFDxQnLz5s3VrVs3devWTW3btlVycrKMMUpJSdErr7xSId+rZcuWatmyZbkvdyA8USe4u2XIkCFW310Y72MFZe3rY7dRo0YyxigtLU3NmzdXQUGB6tWr54ezvn37aseOHSGXeeedd/zzq1SpohYtWig/P181atTwT//HP/5RAT9dseHDh8sYo6pVq6pRo0YqKChQ06ZNVbVqVRljVKdOHX3xxRdlLnfYYYf516d+/foqLCz0f15jjDp27Khff/21wq4fwT0UwT2Y9iW4R1rbX375ZRljVFhYGPaFLvZBAAAHO4I7AOCg4j2JKx0W16xZo969e/uxZvPmzXauoA6MJ+o82XWL7eCOirOvj90HHnhAH3/8cZl3sk+fPl01a9aUMUZjxowJOe/tt99Ws2bNNGHCBK1fv94/fceOHfq///s/Pzy/+uqrcV2n0t566y298MIL2rhxY8jp33//vXr16iVjjNq2bVvmcs2aNdNVV12lr776KuT0d955x39R4U9/+tM+XbcFCxYoOTlZJ598MsG9FIJ7MO1LcI9k9OjRMsbo+uuvD3s++yAAgIMdwR0AcFCJFNwlafXq1UpJSZExRi+88ML+v3L/34HwRJ0nu24huB88KvOxO2bMGBljdOSRR4acvnHjRu3atSvi5fr27StjjE4++eQKv06l/fzzz/7xoJcsWRJy3rp16yJe7plnnvHfoR/vu9yLiorUvXt3paam+pGS4P4HgnswVUZwv/nmm6PeF9gHAQAc7AjuAICDSrTgLknt2rWTMUajR48OOX3nzp2677771LlzZ9WsWVNpaWnq0KGDbr/9dm3ZsiXstqIdl/qXX37RpZdeqoYNGyolJUUtWrTQrbfeqp07d0Z8ov7777/rlltuUfv27ZWWlqaUlBQddthh6tmzp+68807t3LmzXLfF999/r3POOUd169ZVamqq2rdvrwceeEBFRUURn+zu7Vjb8TxJXr16te677z716dNH2dnZSklJ0SGHHKIePXro8ccfD3uZkgGgqKhI9913n9q1a6fU1FTVrVtXgwcP1g8//BD2siV/hueee07du3dXenp62Ov93//+V/3791e9evWUnJysRo0aaejQofr222/Dbvvrr7/W2WefrcMOO0xJSUlKT09Xs2bNdNZZZ+mNN96I+TbxrFixQldeeaWaN2+uatWqKT09XUcffbSmTZsW9utL3ncWLlyoQYMGqU6dOqpWrZo6deqkZ599NuTrS0bBcFMyhsRyu8Xzuyy97ZJK3p8++ugjnXDCCTrkkEOUlpamo446SjNmzIi4zaKiIk2dOlW9e/dWRkaGkpOTlZubqyuvvFKrV68u8/XvvvuujDHq2bOndu/erVGjRqlVq1aqVq2asrOzNWLECD8qb926Vf/4xz/UtGlTpaSkqEmTJho9erSKiooiXp85c+bojDPOUMOGDZWUlKR6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q1dXQkKC3n77bUnSnj171L17dxljdOmll8b0fX755Re9/PLLatmypYwxeuCBB2K+jpJ07733+gE12rvAI/Huj++8845/WrzBfc+ePTryyCNljNGZZ56pNWvW+OetWLHCv22uvfbakMt5QTsxMVHt27cP+T3Nnj3bf6Gq9G0zd+5cf80fM2aMH+S3b9/uP17S09PL3Ee92ywtLU1PPPFESMhft26d7r77bq1du7bM9UtKSlKPHj20cuVK/7xXXnnF/9Dbki8krV27VlWqVFF6erref//9kO+/bds2TZ06tVwvkJT3Or/66qv+bfrkk0/6p2/cuNH/tzwnJ6fMix+Rgvv999/vvyD01ltv+ad7L35GWtNiWX9jVd79iZL/3taqVSvkBbDVq1erQ4cOMsbo73//e8TrXdreDi/EIWUAAAc7gjsA4KASKbj//PPPfqStXbu2Nm3aJKn4SbX3TrZw76L75JNPZIxRQkJCmcOMhHuiuXTpUv9dhN98802Z7XmHXij9RP3OO++UMUbjx4+P8yf/wzvvvCNjit+FHO4daVdddZV/HfZHcI/luv7lL38JOb3koVCuuuqqMpf7+eef/Xe6z5w5M+zPcOWVV4b9njt27FCDBg1UtWrViO+m894BXfIwKV7oK/1BjvH461//KmOMrrnmmrDnexGoV69eIad7kScvL6/Mu1h37typBg0ayBhT5ucqT3CPdLvtTaTfZcltl+bdn/r371/mvF9++cV/gaxk5F67dq1SUlJUq1atsKFzz5496ty5s4wx+t///uef7gX3SI/1s846y3+sh7tfeO8YLf35D96LWy+//HKZy0h/vKB36623hpwe7fb+6quv/AhaWkU9Bkv+hYf3c5933nn6/vvvy7Wdhx56yA+FkQ7F5H1No0aNtH79en+9a9GiRdQXEufOnRtyHY0p/ouj8n4466pVq/y/OCj9e4iFd98+88wzQ06PN7h7h+7p3Llz2Ji6atUq1ahRQzVq1AgJvV7ENMaEvDjsue+++/xAXPKFSO/FgnB/hVNUVOT/5dc///lP//StW7f6t1m0w0WV5F2/1NTUsLfJqaeeKmOMxo0b55/20UcfyRijgQMHxvQ9oonnOnsRvPRfYEjFh/w59NBDZYwJ+WsgKXxwLyoq8t/Zfc8995TZ3k8//eS/07304bL2df0tqbz7EyX/vb377rvL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l17SSy+9pPbt26t27drasGGDv72ZM2cqOTlZ3bt317PPPqv//ve/Gjp0qIwxmjJlStSfbdKkSTLGaP78+WXOKyws1BFHHBHz7QQEHetDdAR3uIz1ITZDhgxRYmKifv3117guDwQR60Nku3bt0u+//673339frVq10lFHHcXnPADAQYTgDkCStGbNGhljdOaZZ8b09QsXLpQxRpdddlnI6XPmzJExRjfeeKN/Wqw7xLfeequMMXr77bcjfl9vh7h9+/YhO6WffPJJmXekt2rVSvn5+dq1a1fINvr166fMzMyQQ0KUdscdd8gYo9WrV5c5r0+fPmrRokXEywIHG9aH6AjucBnrw969+eabqlKliq655ppyXQ4IOtaH8D766CMZY/w58cQTtWnTpr1eDgAQHAR3AJLKv0PsHWvwk08+KXNe69atQ97JEusO8RFHHLHXkO3tEN9www0hp2/fvl3GGI0aNUqStHTpUhljNHbsWO3atStkvOu+YMGCiN/HC+5r1qwpc16fPn3UsmXLqNcTOJiwPkRHcIfLWB+i+/zzz5Wenq4jjzwy7PGrgYMZ60N4v//+uz799FPNnj1b48ePV2Zmprp06aItW7bs9bIAgGAguAOQVP4/+bzttttkjClzPEVJOvbYY9WsWTP//2PdIW7WrJl69eoV9ftG+1AjY4xGjBgh6Y9jsEeb//3vfxG/D4eUAf7A+hAdwR0uY32I7IsvvlBGRoYKCwtDDkkBuIL1ITYff/yxjDEaN25cuS8LADgwEdwB+Pr376/ExMSwO7ml7e0dKF27dvX/v2XLlmHf2dK2bdu434Gytx3iRYsWyRij//u//9Onn34adqL96eYHH3wgY4yeeeaZkNN37drFh6bCSawPkRHc4TrWh7K82J6fn6/169fv9euBgxXrw97t3r1bVapU0SWXXFLuywIADkwEdwC+Dz/8UFWrVtUJJ5ygHTt2lDl/586deuWVVyT9scN51VVXhXyNd6zD4cOH+6cdf/zxatOmTcjXLV68WImJiWGPsThjxoyI1zHWHWJJat68uU488cSoP3Mku3fvVmZmpk444YSQ06dOnSpjjN544424tgsEFetDZAR3uI71IdTcuXOVkZGhDh068CGpcB7rw97NmDHDP1QNAODgQHAHEOLhhx9WYmKi2rVrpwcffFCzZs3S22+/rTFjxqhZs2Ya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f3GgzX7xfw7gPnRTtfvw8k8GxavPN9vs2Y37WW3SYddabcLB87gRgmrgfvr3LouznpjNCnb69y4D3KmSAHeiErW3t0dTUxNjDbf29nb1H6/0cR9Yo477sPNxH1ijjvuw83EfWCOPG/H2BrgD7qQPcCcq0bZt26K9vT06Ojpiy5YtjKVfR0dHtLe3x7Zt29R/vNLHfWCNNu5D98V9YI027kP3xX1gjThuhKYtW/4I7qd+9xPxgccvZwU79bufANypkgB3IiIiIiIiIiKiBghwB9xJH+BORERERERERETUANXA/eS/nRHv33AFK9jJfzsDcKdKAtyJiIiIiIiIiIgaIMAdcCd9gDsREREREREREVEDVAP3yX87I07bMIcVbDLgThUFuBMRERERERERETVAgDvgTvoAdyIiIiIiIiIiogYIcAfcSR/gTkRERERERERE1ADVwH0MttmrAAAgAElEQVTSQzPjlMfmsoJNemgm4E6VBLgTERERERERERE1QIA74E76AHciIiIiIiIiIqIGqAbuJ3xnVkx+dB4r2AnfmQW4UyUB7kRERERERERERA0Q4A64kz7AnYiIiIiIiIiIqAGqgfuEb38yJv3Dp1jBJnz7k4A7VRLgTkRERERERERE1AAB7oA76QPciYiIiIiIiIiIGqAauB/3rdlxwiNXsoId963ZgDtVEuBORERERERERETUAAHugDvpA9yJiIiIiIiIiIgaoBq4H/vg5THx769iBTv2wcsBd6okwJ2IiIiIiIiIiKgBAtwBd9IHuBMRERERERERETVANXA/+sEr4vi/v5oV7OgHrwDcqZIAdyIiIiIiIiIiogYIcAfcSR/gTkRERERERERE1AAB7oA76QPciYiIiIiIiIiIGqAauI9/YE4c+/A1rGDjH5gDuFMlAe5EREREREREREQNEOAOuJM+wJ2IiIiIiIiIiKgBqoH7uG/OjWP+7tOsYOO+ORdwp0oC3ImIiIiIiIiIiBogwB1wJ32AOxERERERERERUQNUA/ex98+Lo75/LSvY2PvnAe5USYA7ERERERERERFRAwS4A+6kD3AnIiIiIiIiIiJqgGrgfuR9n4rx35vPCnbkfZ8C3KmSAHciIiIiIiIiIqIGCHAH3Ekf4E5ERERERERERNQA1cB9zDeujPd99zpWsDHfuBJwp0oC3ImIiIiIiIiIiBog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O+kD3IlK1N7eHk1NTYw13Nrb29V/vNLHfWCNOu7Dzsd9YI067sPOx31gjTxuxNtbHdwvbo3RM9pYwQ67GHCnagLciUq0bdu2aG9vj46OjtiyZQtj6dfR0RHt7e2xbds29R+v9HEfWKON+9B9cR9Yo4370H1xH1gjjhuhacsWwB1wJ3WAOxERERERERERUQNUB/fprTH6E22sYIdNB9ypmgB3IiIiIiIiIiKiBghwB9xJH+BORERERERERETUANXA/fBprTHmsjZWsMOnAe5UTYA7ERERERERERFRAwS4A+6kD3AnIiIiIiIiIiJqgOrgflFrjPl4GyvY4RcB7lRNgDsREREREREREVEDBLgD7qQPcCciIiIiIiIiImqAauB+xIUtceSla1jBjriwBXCnSgLciYiIiIiIiIiIGiDAHXAnfYA7ERERERERERFRA1QH9wta4shL1rCCHXEB4E7VBLgTERERERERERE1QIA74E76AHciIiIiIiIiIqIGCHAH3Ekf4E5ERERERERERNQA1cB99MdaYuzFa1jBRn8McKdqAtyJiIiIiIiIiIgaIMAdcCd9gDsREREREREREVEDVAf3j7bE2OlrWMFGfxRwp2oC3ImIiIiIiIiIiBogwB1wJ32AOxERERERERERUQNUA/cx57fE+6atYQUbcz7gTtUEuBMRERERERERETVAgDvgTvoAdyIiIiIiIiIiogaoDu4faYn3XbSGFWzMRwB3qibAnYiIiIiIiIiIqAEC3AF30ge4ExERERERERERNUA1cD/ywy0x7sI1rGBHfhhwp2oC3ImIiIiIiIiIiBogwB1wJ32AOxERERERERERUQMEuAPupA9wJyIiIiIiIiIiaoDq4D61JcZdsIYV7MipgDtVE+BORERERERERETUAAHugDvpA9yJiIiIiIiIiIgaoP8/uI//2BpWMMCdqgpwJyIiIiIiIiIiaoAAd8Cd9AHuREREREREREREDVAd3D+0IsZ/dDUr2JEfWgG4UyUB7kRERERERERERA0Q4A64kz7AnYiIiIiIiIiIqAGqgfvY81bEUeevZgUbex7gTtUEuBMRERERERERETVAgDvgTvoAdyIiIiIiIiIiogaoDu4fXBFHfWQ1K9jYDwLuVE2AOxERERERERERUQMEuAPupA9wJyIiIiIiIiIiaoAAd8Cd9AHuRCXa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\" width=\"1500\">"
|
||
],
|
||
"text/plain": [
|
||
"<IPython.core.display.HTML object>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"model_filename = './trained_net/net_trainned_SLLShift_E3_03-10_21-02_0007'\n",
|
||
"\n",
|
||
"net = load_net(model_filename)\n",
|
||
"\n",
|
||
"w = net.conv1.weight.data.cpu().numpy()\n",
|
||
"\n",
|
||
"print(w.shape)\n",
|
||
"\n",
|
||
"carte4(w,'poids_32_E4.svg',\"Poids du apres entrainement 32x32 4 epochs color_shift\")\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"w_values_filename = './trained_net/save_weights_NOMB02-18_20-39_0005'\n",
|
||
"\n",
|
||
"with open(w_values_filename,'rb') as f:\n",
|
||
" w_values = pickle.load(f)\n",
|
||
"\n",
|
||
"#print(w_values[0][0])\n",
|
||
"#print(w_values[-1][0])\n",
|
||
" \n",
|
||
"carte4(w_values[0],None,'Premiere')\n",
|
||
"carte4(w_values[-1],None,'Derniere')\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"w_values_filename = './trained_net/save_weights_02-03_01-33_0002'\n",
|
||
"\n",
|
||
"with open(w_values_filename,'rb') as f:\n",
|
||
" w_values = pickle.load(f)\n",
|
||
"\n",
|
||
"save_filename = './results/images_weights/image{:05}.png'\n",
|
||
"\n",
|
||
"N = len(w_values)\n",
|
||
"for i,w in enumerate(w_values):\n",
|
||
" print(w.shape)\n",
|
||
" print(\"Generating carte {}/{}\".format(i,N))\n",
|
||
" carte(w,save_filename.format(i),i*10)\n",
|
||
" \n",
|
||
"print(\"Done.\")\n"
|
||
]
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": "Python 3",
|
||
"language": "python",
|
||
"name": "python3"
|
||
},
|
||
"language_info": {
|
||
"codemirror_mode": {
|
||
"name": "ipython",
|
||
"version": 3
|
||
},
|
||
"file_extension": ".py",
|
||
"mimetype": "text/x-python",
|
||
"name": "python",
|
||
"nbconvert_exporter": "python",
|
||
"pygments_lexer": "ipython3",
|
||
"version": "3.8.5"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 4
|
||
}
|