{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from ipfml import processing\n",
    "from ipfml import utils\n",
    "from ipfml import metrics\n",
    "from PIL import Image\n",
    "from scipy import signal\n",
    "from skimage import color\n",
    "import scipy.stats as stats\n",
    "import seaborn as sns\n",
    "import cv2\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import os"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "data_folder = \"../fichiersSVD_light\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# SVD analysis on zones of Synthesis Images "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Utils functions definition"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def compute_images_path(dict_data):\n",
    "    scene = dict_data['name']\n",
    "    prefix = dict_data['prefix']\n",
    "    indices = dict_data['indices']\n",
    "    \n",
    "    images_path = []\n",
    "    for index in indices:\n",
    "        path = os.path.join(data_folder, os.path.join(scene, prefix + index + \".png\"))\n",
    "        print(path)\n",
    "        images_path.append(path)\n",
    "    return images_path"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_images_zones(dict_data, images_path):\n",
    "    \n",
    "    zones_indices = dict_data['zones']\n",
    "    zones_img = []\n",
    "    \n",
    "    for path in images_path:\n",
    "        img = Image.open(path)\n",
    "        zones = processing.divide_in_blocks(img, (200, 200))\n",
    "        \n",
    "        zones_list = []\n",
    "        \n",
    "        for id_zone in zones_indices:\n",
    "            zones_list.append(zones[id_zone])\n",
    "            \n",
    "        zones_img.append(zones_list)\n",
    "        \n",
    "    return zones_img"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def display_sv_data(dict_data, zones_data, interval, _norm=False):\n",
    "    \n",
    "    scene_name = dict_data['name']\n",
    "    image_indices = dict_data['indices']\n",
    "    zones_indices = dict_data['zones']\n",
    "    colors = ['C0', 'C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7', 'C8', 'C9']\n",
    "    \n",
    "    plt.figure(figsize=(25, 20))\n",
    "    \n",
    "    sv_data = []\n",
    "    begin, end = interval\n",
    "    for id_img, zones in enumerate(zones_data):\n",
    "        \n",
    "        for id_zone, zone in enumerate(zones):\n",
    "            U, s, V = processing.get_LAB_L_SVD(zone)\n",
    "        \n",
    "            data = s[begin:end]\n",
    "            \n",
    "            if _norm:\n",
    "                data = utils.normalize_arr(data)\n",
    "                \n",
    "            plt.plot(data, \n",
    "                     color=colors[id_zone], \n",
    "                     label='Zone ' + str(zones_indices[id_zone]) + ' of ' + scene_name + '_' + str(image_indices[id_img]))\n",
    "            \n",
    "    plt.legend(fontsize=18)\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Scenes zones data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# start 00020 - ref 00900 - step 10\n",
    "dict_appart = {'name': 'Appart1opt02', \n",
    "               'prefix': 'appartAopt_', \n",
    "               'indices': [\"00020\", \"00200\", \"00900\"],\n",
    "               'zones': [3, 6]}\n",
    "\n",
    "# start 00050 - ref 01200 - step 10\n",
    "dict_cuisine = {'name': 'Cuisine01', \n",
    "               'prefix': 'cuisine01_', \n",
    "               'indices': [\"00050\", \"00400\", \"01200\"],\n",
    "               'zones': [3, 6]}\n",
    "\n",
    "# start 00020 - ref 00950 - step 10\n",
    "dict_sdb_c = {'name': 'SdbCentre', \n",
    "               'prefix': 'SdB2_', \n",
    "               'indices': [\"00020\", \"00400\", \"00950\"],\n",
    "               'zones': [3, 6]}\n",
    "\n",
    "# start 00020 - ref 00950 - step 10\n",
    "dict_sdb_d = {'name': 'SdbDroite', \n",
    "               'prefix': 'SdB2_D_', \n",
    "               'indices': [\"00020\", \"00400\", \"00950\"],\n",
    "               'zones': [2, 3, 10, 13]}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "current_dict = dict_sdb_d\n",
    "interval = (30, 200)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Simulations obtained from best model of SdbDroite scene"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 215876 characters]\n",
      "text/plain": [
       "<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=2859x1797 at 0x7FE44C669908>"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "simu_image = \"/home/jbuisine/Downloads/SdbDroite_simulation_curve.png\"\n",
    "Image.open(simu_image)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Zones 2, 13 well predicted vs zones 3, 10 not well predicted"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ici on va s'intéresser à visualiser à différents niveaux de bruits (nombre de samples) les valeurs des SV entre zones. L'objectif est de comprendre pourquoi le modèle apprend et n'apprend pas correctement une zone."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Without normalization of data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "../fichiersSVD_light/SdbDroite/SdB2_D_00020.png\n",
      "../fichiersSVD_light/SdbDroite/SdB2_D_00400.png\n",
      "../fichiersSVD_light/SdbDroite/SdB2_D_00950.png\n"
     ]
    },
    {
     "data": {
      "image/png": "[encoded data, 332132 characters]\n",
      "text/plain": [
       "<Figure size 1800x1440 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "images_path = compute_images_path(current_dict)\n",
    "zones_data = get_images_zones(current_dict, images_path)\n",
    "display_sv_data(current_dict, zones_data, interval)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "La tendance des courbes, ne semblent pas avoir d'influence sur la prédiction finale étant donné la quantité d'informations présentes dans la zone 13."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### With data normalization"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "../fichiersSVD_light/SdbDroite/SdB2_D_00020.png\n",
      "../fichiersSVD_light/SdbDroite/SdB2_D_00400.png\n",
      "../fichiersSVD_light/SdbDroite/SdB2_D_00950.png\n"
     ]
    },
    {
     "data": {
      "image/png": "[encoded data, 362004 characters]\n",
      "text/plain": [
       "<Figure size 1800x1440 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "images_path = compute_images_path(current_dict)\n",
    "zones_data = get_images_zones(current_dict, images_path)\n",
    "display_sv_data(current_dict, zones_data, interval, True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Le fait de normaliser permet de ramener les différentes valeurs des SV sur la même grandeur, toutefois **une différenciation avec une zone détectée correctement et non détectée lors de simulation par un modèle, ne semble pas être visible.**"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "thesis-venv",
   "language": "python",
   "name": "thesis-venv"
  },
  "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.6.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
