{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "63ce0734-aad1-48c2-948c-f6ad0606132f",
   "metadata": {},
   "source": [
    "# Run a pipeline adding a custom algorithm"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cdbd6fb8-f668-4a18-bbb7-f92a3bdf2172",
   "metadata": {},
   "source": [
    "This process will run the entire pipeline described in a configuration file and will add a custom algorithm to it"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "70bb1245-d074-48ce-a8ae-34b1e3cdbe40",
   "metadata": {},
   "source": [
    "# Using a Custom algorithm that process each image individually"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3219b25a-41f2-42af-b012-069534821d03",
   "metadata": {},
   "source": [
    "## Import dependencies"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "83709523-e070-4f02-842b-5f61c3f14b0e",
   "metadata": {},
   "outputs": [],
   "source": [
    "%load_ext autoreload\n",
    "%autoreload 2\n",
    "from paidiverpy.pipeline import Pipeline"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "faaf1514-8855-470e-a012-30f5001de7af",
   "metadata": {},
   "source": [
    "## Instantiate the Pipeline class"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "011674d7-972e-4aaa-a4cc-510133ae65d9",
   "metadata": {},
   "source": [
    "When you instantiate the pipeline class, it will install some dependencies described in the configuration file that are necessary for the custom algorithm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "46f413c1-b9a5-4dc1-a27d-9cba7f9c745c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[92m☁ paidiverpy ☁  |       INFO | 2025-09-16 18:02:26 | No dataset UUID found in the dataset metadata. A new UUID has been generated: 03d48d4a-8739-4f21-b0de-e1f71a99efe3\u001b[0m\n"
     ]
    }
   ],
   "source": [
    "pipeline = Pipeline(config_file_path=\"../config_files/config_custom_algorithm.yml\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "803ad74e-ad2a-4e54-b93b-2a862a7d6612",
   "metadata": {},
   "source": [
    "This occurs because of the following step that you added in the conf file:\n",
    "\n",
    "```\n",
    "steps:\n",
    "    ...\n",
    "\n",
    "  - custom:\n",
    "      name: \"min_max_data\"\n",
    "      file_path: \"/mnt/noc/code/paidiver/paidiverpy/examples/custom_algorithms/custom_algorithm_example.py\"\n",
    "      class_name: \"MyMethod\"\n",
    "      dependencies: \"scikit-learn\"\n",
    "      params:\n",
    "        feature_range: (0, 1)\n",
    "```\n",
    "\n",
    "In this case, you are saying that you need to install scikit-learn to use the custom algorithm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "33d720e0-74f9-4802-9452-46dcfe759550",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div><svg style=\"position: absolute; width: 0; height: 0; overflow: hidden\">\n",
       "<defs>\n",
       "<symbol id=\"arrow-right\" viewBox=\"0 0 330 330\">\n",
       "  <path id=\"XMLID_222_\" d=\"M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001\n",
       "\tc-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213\n",
       "\tC82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606\n",
       "\tC255,161.018,253.42,157.202,250.606,154.389z\"/>\n",
       "</defs>\n",
       "</svg>\n",
       "<style>/* CSS stylesheet for displaying Paidiverpy objects in jupyterlab.\n",
       " *\n",
       " */\n",
       "\n",
       ":root {\n",
       "  --ppy-font-color: var(--jp-content-font-color, rgba(0, 0, 0, 1));\n",
       "  --ppy-font-color-brown: var(--jp-content-font-color-brown, brown);\n",
       "  --ppy-font-color-olive: var(--jp-content-font-color-olive, olive);\n",
       "  --ppy-font-color-teal: var(--jp-content-font-color-teal, teal);\n",
       "  --ppy-font-color-blue: var(--jp-content-font-color-blue, blue);\n",
       "  --ppy-font-color-gray: var(--jp-content-font-color-gray, gray);\n",
       "  --ppy-border-color: var(--jp-border-color2, #e0e0e0);\n",
       "  --ppy-disabled-color: var(--jp-layout-color3, #bdbdbd);\n",
       "  --ppy-background-color: var(--jp-layout-color, white);\n",
       "  --ppy-background-color2: var(--jp-layout-color3, rgba(212, 212, 212, 0.15));\n",
       "}\n",
       "\n",
       "\n",
       "html[theme=\"dark\"],\n",
       "html[data-theme=\"dark\"],\n",
       "body[data-theme=\"dark\"],\n",
       "body.vscode-dark {\n",
       "  --ppy-font-color: rgba(255, 255, 255, 1);\n",
       "  --ppy-font-color-brown: brown;\n",
       "  --ppy-font-color-olive: olive;\n",
       "  --ppy-font-color-teal: teal;\n",
       "  --ppy-font-color-blue: blue;\n",
       "  --ppy-font-color-gray: gray;\n",
       "  --ppy-border-color: #1f1f1f;\n",
       "  --ppy-disabled-color: #515151;\n",
       "  --ppy-background-color: #111111;\n",
       "}\n",
       "\n",
       ".ppy-background-color {\n",
       "  background-color: var(--ppy-background-color) !important;\n",
       "}\n",
       "\n",
       ".ppy-font-color-brown {\n",
       "  color: var(--ppy-font-color-brown) !important;\n",
       "}\n",
       "\n",
       ".ppy-font-color {\n",
       "  color: var(--ppy-font-color) !important;\n",
       "}\n",
       ".ppy-h2 {\n",
       "  font-size: 20px !important;\n",
       "}\n",
       ".ppy-h3 {\n",
       "  font-size: 13px !important;\n",
       "}\n",
       ".ppy-p {\n",
       "  font-size: 10px;\n",
       "}\n",
       ".ppy-p-error {\n",
       "  color: var(--ppy-font-color-brown);\n",
       "  font-weight: bold;\n",
       "  display: block;\n",
       "}\n",
       "\n",
       ".ppy-text-repr-fallback {\n",
       "  /* fallback to plain text repr when CSS is not injected (untrusted notebook) */\n",
       "  display: none;\n",
       "}\n",
       "\n",
       ".ppy-pipeline-wrap{\n",
       "  display: flex;\n",
       "  flex-wrap: wrap;\n",
       "  align-items: center;\n",
       "}\n",
       "\n",
       ".ppy-pipeline {\n",
       "  float:left;\n",
       "  cursor: pointer;\n",
       "  padding: 10px;\n",
       "  width: max-content;\n",
       "  height: 150px;\n",
       "  margin: 10px;\n",
       "  border: 1px solid #000;\n",
       "  text-align: center;\n",
       "  /* line-height: 80px; */\n",
       "}\n",
       "\n",
       ".ppy-pipeline-clear-fix {\n",
       "  clear: both;\n",
       "}\n",
       "\n",
       ".ppy-pipeline-parameters-all {\n",
       "  padding: 10px;\n",
       "  margin: 10px;\n",
       "}\n",
       "\n",
       ".ppy-images-step-header {\n",
       "  cursor: pointer;\n",
       "  font-weight: bold;\n",
       "  margin-top: 10px;\n",
       "  margin-bottom: 5px;\n",
       "}\n",
       ".ppy-images-metadata {\n",
       "  margin-left: 20px;\n",
       "  margin-bottom: 10px;\n",
       "}\n",
       ".ppy-images {\n",
       "  display: flex;\n",
       "  flex-wrap: wrap;\n",
       "  gap: 10px;\n",
       "  margin-left: 20px;\n",
       "}\n",
       "\n",
       ".ppy-show-more-button, .ppy-hide-button {\n",
       "  margin-left: 20px;\n",
       "  background-color: #007bff;\n",
       "  color: white;\n",
       "  border: none;\n",
       "  padding: 5px 10px;\n",
       "  cursor: pointer;\n",
       "}\n",
       "\n",
       "\n",
       ".ppy-pipeline-arrow {\n",
       "  float:left;\n",
       "  width: 50px;\n",
       "  height: 80px;\n",
       "  margin: 10px;\n",
       "  text-align: center;\n",
       "  line-height: 80px;\n",
       "}\n",
       "\n",
       ".ppy-images-img{\n",
       "  display: block;\n",
       "  max-width: 200px;\n",
       "  margin: 10px;\n",
       "}\n",
       "\n",
       ".ppy-images-toggle-arrow {\n",
       "  cursor: pointer;\n",
       "  margin-left: 5px;\n",
       "}\n",
       "\n",
       ".ppy-images-image-p {\n",
       "  cursor: pointer;\n",
       "}\n",
       "\n",
       ".ppy-arrow-right {\n",
       "  display: inline-block;\n",
       "  vertical-align: middle;\n",
       "  width: 1em;\n",
       "  height: 1.5em !important;\n",
       "  stroke-width: 0;\n",
       "  stroke: currentColor;\n",
       "  fill: currentColor;\n",
       "}\n",
       "\n",
       "\n",
       ".ppy-json-block {\n",
       "  font-family: monospace;\n",
       "  background: var(--ppy-background-color);\n",
       "  padding: 1em;\n",
       "  border-radius: 6px;\n",
       "}\n",
       ".ppy-json-key {\n",
       "  color: var(--ppy-font-color-brown);\n",
       "}\n",
       ".ppy-json-string {\n",
       "  color: var(--ppy-font-color-olive);\n",
       "}\n",
       ".ppy-json-number {\n",
       "  color: var(--ppy-font-color-teal);\n",
       "}\n",
       ".ppy-json-bool {\n",
       "  color: var(--ppy-font-color-blue);\n",
       "}\n",
       ".ppy-json-null {\n",
       "  color: var(--ppy-font-color-gray);\n",
       "}\n",
       "\n",
       "\n",
       ".ppy-pn-title-0 {\n",
       "  font-size: 30px;\n",
       "}\n",
       "\n",
       ".ppy-pn-title-1 {\n",
       "  font-size: 20px;\n",
       "}\n",
       ".ppy-pn-title-2 {\n",
       "  font-size: 17px;\n",
       "}\n",
       ".ppy-pn-title-3 {\n",
       "  font-size: 14px;\n",
       "}\n",
       ".ppy-pn-title-4 {\n",
       "  font-size: 12px;\n",
       "}\n",
       "\n",
       ".ppy-pn-bold {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".ppy-pn-italic {\n",
       "  font-style: italic;\n",
       "}\n",
       ".ppy-pn-description {\n",
       "  font-size: 14px;\n",
       "  margin-bottom: 1px;\n",
       "}\n",
       "\n",
       ".bk-root {\n",
       "  width: 100% !important;\n",
       "  max-width: 100% !important;\n",
       "  box-sizing: border-box;\n",
       "}\n",
       "\n",
       "input, .bk-input, .bk-input-group {\n",
       "  margin-top: 0px;\n",
       "  margin-bottom: 3px;\n",
       "  padding-top: 0px;\n",
       "  padding-bottom: 0px;\n",
       "}\n",
       "\n",
       ".ppy-pn-header-button .bk-btn {\n",
       "  background: none !important;\n",
       "  border: none !important;\n",
       "  font-weight: bold;\n",
       "  font-size: 16px;\n",
       "  text-align: left;\n",
       "  padding-left: 0;\n",
       "  cursor: pointer;\n",
       "  box-shadow: none !important;\n",
       "  color: black;\n",
       "}\n",
       "\n",
       ".ppy-pn-danger-modal{\n",
       "  border: 2px solid red;\n",
       "  border-radius: 10px;\n",
       "  box-shadow: 0px 0px 10px rgba(255, 0, 0, 0.5);\n",
       "}\n",
       "\n",
       ".ppy-pn-config-form{\n",
       "  padding: 10px;\n",
       "  margin-top: 10px;\n",
       "  margin-bottom: 10px;\n",
       "  background-color: var(--ppy-background-color2);\n",
       "  border-radius: 5px;\n",
       "  box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1);\n",
       "}\n",
       "\n",
       "\n",
       ".ppy-pn-align-right {\n",
       "  display: flex;\n",
       "  justify-content: flex-end;\n",
       "}\n",
       "</style><script>function toggleMetadata(stepIndex, randomId) {\n",
       "  var metadata = document.getElementById(\"ppy-images-metadata-\" + randomId + \"-\" + stepIndex);\n",
       "  var arrow = document.getElementById(\"ppy-images-arrow-\" + randomId + \"-\" + stepIndex);\n",
       "  if (metadata.style.display === \"none\") {\n",
       "      metadata.style.display = \"block\";\n",
       "      arrow.innerHTML = \"▼\";\n",
       "      arrow.classList.remove(\"ppy-font-color\");\n",
       "      arrow.classList.add(\"ppy-font-color-brown\");\n",
       "  } else {\n",
       "      metadata.style.display = \"none\";\n",
       "      arrow.innerHTML = \"►\";\n",
       "      arrow.classList.remove(\"ppy-font-color-brown\");\n",
       "      arrow.classList.add(\"ppy-font-color\");\n",
       "  }\n",
       "}\n",
       "function toggleImage(imageId, randomId) {\n",
       "  var img = document.getElementById(imageId);\n",
       "  var arrow = document.getElementById(\"ppy-images-arrow-\" + randomId + \"-\" + imageId);\n",
       "  if (img.style.display === \"none\") {\n",
       "      img.style.display = \"block\";\n",
       "      arrow.innerHTML = \"▼\";\n",
       "      arrow.classList.remove(\"ppy-font-color\");\n",
       "      arrow.classList.add(\"ppy-font-color-brown\");\n",
       "  } else {\n",
       "      img.style.display = \"none\";\n",
       "      arrow.innerHTML = \"►\";\n",
       "      arrow.classList.remove(\"ppy-font-color-brown\");\n",
       "      arrow.classList.add(\"ppy-font-color\");\n",
       "  }\n",
       "}\n",
       "function showMore(stepIndex) {\n",
       "  var moreImages = document.getElementById(\"ppy-more-images-\" + stepIndex);\n",
       "  var showMoreButton = document.getElementById(\"ppy-show-more-button-\" + stepIndex);\n",
       "  var hideButton = document.getElementById(\"ppy-hide-button-\" + stepIndex);\n",
       "  moreImages.style.display = \"flex\";\n",
       "  showMoreButton.style.display = \"none\";\n",
       "  hideButton.style.display = \"inline-block\";\n",
       "}\n",
       "function hide(stepIndex) {\n",
       "  var moreImages = document.getElementById(\"ppy-more-images-\" + stepIndex);\n",
       "  var showMoreButton = document.getElementById(\"ppy-show-more-button-\" + stepIndex);\n",
       "  var hideButton = document.getElementById(\"ppy-hide-button-\" + stepIndex);\n",
       "  moreImages.style.display = \"none\";\n",
       "  showMoreButton.style.display = \"inline-block\";\n",
       "  hideButton.style.display = \"none\";\n",
       "}\n",
       "\n",
       "\n",
       "function showParameters(id, randomId) {\n",
       "  var currentTarget = document.getElementById('ppy-pipeline-' + randomId + '-' + id);\n",
       "  var square = document.getElementsByClassName('ppy-pipeline-' + randomId);\n",
       "  var allParams = document.getElementsByClassName('ppy-pipeline-parameters-' + randomId);\n",
       "  var selectedParams = document.getElementById('ppy-pipeline-parameters-' + randomId + '-' + id);\n",
       "  var idWasVisible = false;\n",
       "  if (selectedParams) {\n",
       "      var idWasVisible = selectedParams.style.display === 'block';\n",
       "  }\n",
       "  for (var i = 0; i < square.length; i++) {\n",
       "      square[i].classList.remove('ppy-font-color-brown');\n",
       "      square[i].classList.add('ppy-font-color');\n",
       "  }\n",
       "  for (var i = 0; i < allParams.length; i++) {\n",
       "      allParams[i].style.display = 'none';\n",
       "  }\n",
       "  // Show the selected parameter section\n",
       "  if (selectedParams) {\n",
       "      if (idWasVisible) {\n",
       "          selectedParams.style.display = 'none';\n",
       "          currentTarget.classList.remove('ppy-font-color-brown');\n",
       "          currentTarget.classList.add('ppy-font-color');\n",
       "      } else {\n",
       "          selectedParams.style.display = 'block';\n",
       "          currentTarget.classList.remove('ppy-font-color');\n",
       "          currentTarget.classList.add('ppy-font-color-brown');\n",
       "      }\n",
       "  }\n",
       "}\n",
       "\n",
       "hljs.highlightAll();\n",
       "</script><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github.min.css\"><script src=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js\"></script><script>hljs.highlightAll();</script><pre class='ppy-text-repr-fallback'>{\n",
       "    &quot;general&quot;: {\n",
       "        &quot;name&quot;: &quot;raw&quot;,\n",
       "        &quot;step_name&quot;: &quot;open&quot;,\n",
       "        &quot;sample_data&quot;: &quot;benthic_csv&quot;,\n",
       "        &quot;input_path&quot;: &quot;/home/tobfer/.paidiverpy_cache/benthic_csv/images&quot;,\n",
       "        &quot;output_path&quot;: &quot;output&quot;,\n",
       "        &quot;metadata_path&quot;: &quot;/home/tobfer/.paidiverpy_cache/benthic_csv/metadata/metadata_benthic_csv.csv&quot;,\n",
       "        &quot;metadata_type&quot;: &quot;CSV_FILE&quot;,\n",
       "        &quot;image_open_args&quot;: &quot;PNG&quot;,\n",
       "        &quot;append_data_to_metadata&quot;: &quot;/home/tobfer/.paidiverpy_cache/benthic_csv/metadata/appended_metadata_benthic_csv.csv&quot;,\n",
       "        &quot;n_jobs&quot;: 1,\n",
       "        &quot;track_changes&quot;: true,\n",
       "        &quot;rename&quot;: &quot;datetime&quot;,\n",
       "        &quot;sampling&quot;: [\n",
       "            {\n",
       "                &quot;name&quot;: &quot;sampling&quot;,\n",
       "                &quot;step_name&quot;: &quot;sampling&quot;,\n",
       "                &quot;test&quot;: false,\n",
       "                &quot;params&quot;: {\n",
       "                    &quot;value&quot;: 0.1,\n",
       "                    &quot;raise_error&quot;: false\n",
       "                },\n",
       "                &quot;mode&quot;: &quot;percent&quot;\n",
       "            }\n",
       "        ]\n",
       "    },\n",
       "    &quot;steps&quot;: [\n",
       "        {\n",
       "            &quot;name&quot;: &quot;colour_correction&quot;,\n",
       "            &quot;step_name&quot;: &quot;colour&quot;,\n",
       "            &quot;test&quot;: false,\n",
       "            &quot;params&quot;: {\n",
       "                &quot;method&quot;: &quot;opencv&quot;,\n",
       "                &quot;invert_colours&quot;: false,\n",
       "                &quot;raise_error&quot;: false\n",
       "            },\n",
       "            &quot;mode&quot;: &quot;grayscale&quot;\n",
       "        },\n",
       "        {\n",
       "            &quot;name&quot;: &quot;min_max_data&quot;,\n",
       "            &quot;file_path&quot;: &quot;example&quot;,\n",
       "            &quot;class_name&quot;: &quot;MyCustomClass&quot;,\n",
       "            &quot;step_name&quot;: &quot;custom&quot;,\n",
       "            &quot;test&quot;: false,\n",
       "            &quot;processing_type&quot;: &quot;image&quot;,\n",
       "            &quot;dependencies&quot;: &quot;scikit-learn&quot;,\n",
       "            &quot;params&quot;: {\n",
       "                &quot;raise_error&quot;: false,\n",
       "                &quot;feature_range&quot;: &quot;(0, 1)&quot;\n",
       "            }\n",
       "        }\n",
       "    ]\n",
       "}</pre><div><pre class=\"ppy-json-block\"><span class=\"ppy-json-key\">general</span>:\n",
       "  <span class=\"ppy-json-key\">name</span>: <span class=\"ppy-json-string\">\"raw\"</span>\n",
       "  <span class=\"ppy-json-key\">step_name</span>: <span class=\"ppy-json-string\">\"open\"</span>\n",
       "  <span class=\"ppy-json-key\">sample_data</span>: <span class=\"ppy-json-string\">\"benthic_csv\"</span>\n",
       "  <span class=\"ppy-json-key\">input_path</span>: <span class=\"ppy-json-string\">\"/home/tobfer/.paidiverpy_cache/benthic_csv/images\"</span>\n",
       "  <span class=\"ppy-json-key\">output_path</span>: <span class=\"ppy-json-string\">\"output\"</span>\n",
       "  <span class=\"ppy-json-key\">metadata_path</span>: <span class=\"ppy-json-string\">\"/home/tobfer/.paidiverpy_cache/benthic_csv/metadata/metadata_benthic_csv.csv\"</span>\n",
       "  <span class=\"ppy-json-key\">metadata_type</span>: <span class=\"ppy-json-string\">\"CSV_FILE\"</span>\n",
       "  <span class=\"ppy-json-key\">image_open_args</span>: <span class=\"ppy-json-string\">\"PNG\"</span>\n",
       "  <span class=\"ppy-json-key\">append_data_to_metadata</span>: <span class=\"ppy-json-string\">\"/home/tobfer/.paidiverpy_cache/benthic_csv/metadata/appended_metadata_benthic_csv.csv\"</span>\n",
       "  <span class=\"ppy-json-key\">n_jobs</span>: <span class=\"ppy-json-number\">1</span>\n",
       "  <span class=\"ppy-json-key\">track_changes</span>: <span class=\"ppy-json-number\">True</span>\n",
       "  <span class=\"ppy-json-key\">rename</span>: <span class=\"ppy-json-string\">\"datetime\"</span>\n",
       "  <span class=\"ppy-json-key\">sampling</span>:\n",
       "    - <span class=\"ppy-json-key\">name</span>: <span class=\"ppy-json-string\">\"sampling\"</span>\n",
       "      <span class=\"ppy-json-key\">step_name</span>: <span class=\"ppy-json-string\">\"sampling\"</span>\n",
       "      <span class=\"ppy-json-key\">test</span>: <span class=\"ppy-json-number\">False</span>\n",
       "      <span class=\"ppy-json-key\">params</span>:\n",
       "        <span class=\"ppy-json-key\">value</span>: <span class=\"ppy-json-number\">0.1</span>\n",
       "        <span class=\"ppy-json-key\">raise_error</span>: <span class=\"ppy-json-number\">False</span>\n",
       "      <span class=\"ppy-json-key\">mode</span>: <span class=\"ppy-json-string\">\"percent\"</span>\n",
       "<span class=\"ppy-json-key\">steps</span>:\n",
       "  - <span class=\"ppy-json-key\">name</span>: <span class=\"ppy-json-string\">\"colour_correction\"</span>\n",
       "    <span class=\"ppy-json-key\">step_name</span>: <span class=\"ppy-json-string\">\"colour\"</span>\n",
       "    <span class=\"ppy-json-key\">test</span>: <span class=\"ppy-json-number\">False</span>\n",
       "    <span class=\"ppy-json-key\">params</span>:\n",
       "      <span class=\"ppy-json-key\">method</span>: <span class=\"ppy-json-string\">\"opencv\"</span>\n",
       "      <span class=\"ppy-json-key\">invert_colours</span>: <span class=\"ppy-json-number\">False</span>\n",
       "      <span class=\"ppy-json-key\">raise_error</span>: <span class=\"ppy-json-number\">False</span>\n",
       "    <span class=\"ppy-json-key\">mode</span>: <span class=\"ppy-json-string\">\"grayscale\"</span>\n",
       "  - <span class=\"ppy-json-key\">name</span>: <span class=\"ppy-json-string\">\"min_max_data\"</span>\n",
       "    <span class=\"ppy-json-key\">file_path</span>: <span class=\"ppy-json-string\">\"example\"</span>\n",
       "    <span class=\"ppy-json-key\">class_name</span>: <span class=\"ppy-json-string\">\"MyCustomClass\"</span>\n",
       "    <span class=\"ppy-json-key\">step_name</span>: <span class=\"ppy-json-string\">\"custom\"</span>\n",
       "    <span class=\"ppy-json-key\">test</span>: <span class=\"ppy-json-number\">False</span>\n",
       "    <span class=\"ppy-json-key\">processing_type</span>: <span class=\"ppy-json-string\">\"image\"</span>\n",
       "    <span class=\"ppy-json-key\">dependencies</span>: <span class=\"ppy-json-string\">\"scikit-learn\"</span>\n",
       "    <span class=\"ppy-json-key\">params</span>:\n",
       "      <span class=\"ppy-json-key\">raise_error</span>: <span class=\"ppy-json-number\">False</span>\n",
       "      <span class=\"ppy-json-key\">feature_range</span>: <span class=\"ppy-json-string\">\"(0, 1)\"</span></pre></div></div>"
      ],
      "text/plain": [
       "{\n",
       "    \"general\": {\n",
       "        \"name\": \"raw\",\n",
       "        \"step_name\": \"open\",\n",
       "        \"sample_data\": \"benthic_csv\",\n",
       "        \"input_path\": \"/home/tobfer/.paidiverpy_cache/benthic_csv/images\",\n",
       "        \"output_path\": \"output\",\n",
       "        \"metadata_path\": \"/home/tobfer/.paidiverpy_cache/benthic_csv/metadata/metadata_benthic_csv.csv\",\n",
       "        \"metadata_type\": \"CSV_FILE\",\n",
       "        \"image_open_args\": \"PNG\",\n",
       "        \"append_data_to_metadata\": \"/home/tobfer/.paidiverpy_cache/benthic_csv/metadata/appended_metadata_benthic_csv.csv\",\n",
       "        \"n_jobs\": 1,\n",
       "        \"track_changes\": true,\n",
       "        \"rename\": \"datetime\",\n",
       "        \"sampling\": [\n",
       "            {\n",
       "                \"name\": \"sampling\",\n",
       "                \"step_name\": \"sampling\",\n",
       "                \"test\": false,\n",
       "                \"params\": {\n",
       "                    \"value\": 0.1,\n",
       "                    \"raise_error\": false\n",
       "                },\n",
       "                \"mode\": \"percent\"\n",
       "            }\n",
       "        ]\n",
       "    },\n",
       "    \"steps\": [\n",
       "        {\n",
       "            \"name\": \"colour_correction\",\n",
       "            \"step_name\": \"colour\",\n",
       "            \"test\": false,\n",
       "            \"params\": {\n",
       "                \"method\": \"opencv\",\n",
       "                \"invert_colours\": false,\n",
       "                \"raise_error\": false\n",
       "            },\n",
       "            \"mode\": \"grayscale\"\n",
       "        },\n",
       "        {\n",
       "            \"name\": \"min_max_data\",\n",
       "            \"file_path\": \"example\",\n",
       "            \"class_name\": \"MyCustomClass\",\n",
       "            \"step_name\": \"custom\",\n",
       "            \"test\": false,\n",
       "            \"processing_type\": \"image\",\n",
       "            \"dependencies\": \"scikit-learn\",\n",
       "            \"params\": {\n",
       "                \"raise_error\": false,\n",
       "                \"feature_range\": \"(0, 1)\"\n",
       "            }\n",
       "        }\n",
       "    ]\n",
       "}"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pipeline.config"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "310d8998-6ac7-4db4-a706-50270b6895ee",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div><svg style=\"position: absolute; width: 0; height: 0; overflow: hidden\">\n",
       "<defs>\n",
       "<symbol id=\"arrow-right\" viewBox=\"0 0 330 330\">\n",
       "  <path id=\"XMLID_222_\" d=\"M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001\n",
       "\tc-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213\n",
       "\tC82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606\n",
       "\tC255,161.018,253.42,157.202,250.606,154.389z\"/>\n",
       "</defs>\n",
       "</svg>\n",
       "<style>/* CSS stylesheet for displaying Paidiverpy objects in jupyterlab.\n",
       " *\n",
       " */\n",
       "\n",
       ":root {\n",
       "  --ppy-font-color: var(--jp-content-font-color, rgba(0, 0, 0, 1));\n",
       "  --ppy-font-color-brown: var(--jp-content-font-color-brown, brown);\n",
       "  --ppy-font-color-olive: var(--jp-content-font-color-olive, olive);\n",
       "  --ppy-font-color-teal: var(--jp-content-font-color-teal, teal);\n",
       "  --ppy-font-color-blue: var(--jp-content-font-color-blue, blue);\n",
       "  --ppy-font-color-gray: var(--jp-content-font-color-gray, gray);\n",
       "  --ppy-border-color: var(--jp-border-color2, #e0e0e0);\n",
       "  --ppy-disabled-color: var(--jp-layout-color3, #bdbdbd);\n",
       "  --ppy-background-color: var(--jp-layout-color, white);\n",
       "  --ppy-background-color2: var(--jp-layout-color3, rgba(212, 212, 212, 0.15));\n",
       "}\n",
       "\n",
       "\n",
       "html[theme=\"dark\"],\n",
       "html[data-theme=\"dark\"],\n",
       "body[data-theme=\"dark\"],\n",
       "body.vscode-dark {\n",
       "  --ppy-font-color: rgba(255, 255, 255, 1);\n",
       "  --ppy-font-color-brown: brown;\n",
       "  --ppy-font-color-olive: olive;\n",
       "  --ppy-font-color-teal: teal;\n",
       "  --ppy-font-color-blue: blue;\n",
       "  --ppy-font-color-gray: gray;\n",
       "  --ppy-border-color: #1f1f1f;\n",
       "  --ppy-disabled-color: #515151;\n",
       "  --ppy-background-color: #111111;\n",
       "}\n",
       "\n",
       ".ppy-background-color {\n",
       "  background-color: var(--ppy-background-color) !important;\n",
       "}\n",
       "\n",
       ".ppy-font-color-brown {\n",
       "  color: var(--ppy-font-color-brown) !important;\n",
       "}\n",
       "\n",
       ".ppy-font-color {\n",
       "  color: var(--ppy-font-color) !important;\n",
       "}\n",
       ".ppy-h2 {\n",
       "  font-size: 20px !important;\n",
       "}\n",
       ".ppy-h3 {\n",
       "  font-size: 13px !important;\n",
       "}\n",
       ".ppy-p {\n",
       "  font-size: 10px;\n",
       "}\n",
       ".ppy-p-error {\n",
       "  color: var(--ppy-font-color-brown);\n",
       "  font-weight: bold;\n",
       "  display: block;\n",
       "}\n",
       "\n",
       ".ppy-text-repr-fallback {\n",
       "  /* fallback to plain text repr when CSS is not injected (untrusted notebook) */\n",
       "  display: none;\n",
       "}\n",
       "\n",
       ".ppy-pipeline-wrap{\n",
       "  display: flex;\n",
       "  flex-wrap: wrap;\n",
       "  align-items: center;\n",
       "}\n",
       "\n",
       ".ppy-pipeline {\n",
       "  float:left;\n",
       "  cursor: pointer;\n",
       "  padding: 10px;\n",
       "  width: max-content;\n",
       "  height: 150px;\n",
       "  margin: 10px;\n",
       "  border: 1px solid #000;\n",
       "  text-align: center;\n",
       "  /* line-height: 80px; */\n",
       "}\n",
       "\n",
       ".ppy-pipeline-clear-fix {\n",
       "  clear: both;\n",
       "}\n",
       "\n",
       ".ppy-pipeline-parameters-all {\n",
       "  padding: 10px;\n",
       "  margin: 10px;\n",
       "}\n",
       "\n",
       ".ppy-images-step-header {\n",
       "  cursor: pointer;\n",
       "  font-weight: bold;\n",
       "  margin-top: 10px;\n",
       "  margin-bottom: 5px;\n",
       "}\n",
       ".ppy-images-metadata {\n",
       "  margin-left: 20px;\n",
       "  margin-bottom: 10px;\n",
       "}\n",
       ".ppy-images {\n",
       "  display: flex;\n",
       "  flex-wrap: wrap;\n",
       "  gap: 10px;\n",
       "  margin-left: 20px;\n",
       "}\n",
       "\n",
       ".ppy-show-more-button, .ppy-hide-button {\n",
       "  margin-left: 20px;\n",
       "  background-color: #007bff;\n",
       "  color: white;\n",
       "  border: none;\n",
       "  padding: 5px 10px;\n",
       "  cursor: pointer;\n",
       "}\n",
       "\n",
       "\n",
       ".ppy-pipeline-arrow {\n",
       "  float:left;\n",
       "  width: 50px;\n",
       "  height: 80px;\n",
       "  margin: 10px;\n",
       "  text-align: center;\n",
       "  line-height: 80px;\n",
       "}\n",
       "\n",
       ".ppy-images-img{\n",
       "  display: block;\n",
       "  max-width: 200px;\n",
       "  margin: 10px;\n",
       "}\n",
       "\n",
       ".ppy-images-toggle-arrow {\n",
       "  cursor: pointer;\n",
       "  margin-left: 5px;\n",
       "}\n",
       "\n",
       ".ppy-images-image-p {\n",
       "  cursor: pointer;\n",
       "}\n",
       "\n",
       ".ppy-arrow-right {\n",
       "  display: inline-block;\n",
       "  vertical-align: middle;\n",
       "  width: 1em;\n",
       "  height: 1.5em !important;\n",
       "  stroke-width: 0;\n",
       "  stroke: currentColor;\n",
       "  fill: currentColor;\n",
       "}\n",
       "\n",
       "\n",
       ".ppy-json-block {\n",
       "  font-family: monospace;\n",
       "  background: var(--ppy-background-color);\n",
       "  padding: 1em;\n",
       "  border-radius: 6px;\n",
       "}\n",
       ".ppy-json-key {\n",
       "  color: var(--ppy-font-color-brown);\n",
       "}\n",
       ".ppy-json-string {\n",
       "  color: var(--ppy-font-color-olive);\n",
       "}\n",
       ".ppy-json-number {\n",
       "  color: var(--ppy-font-color-teal);\n",
       "}\n",
       ".ppy-json-bool {\n",
       "  color: var(--ppy-font-color-blue);\n",
       "}\n",
       ".ppy-json-null {\n",
       "  color: var(--ppy-font-color-gray);\n",
       "}\n",
       "\n",
       "\n",
       ".ppy-pn-title-0 {\n",
       "  font-size: 30px;\n",
       "}\n",
       "\n",
       ".ppy-pn-title-1 {\n",
       "  font-size: 20px;\n",
       "}\n",
       ".ppy-pn-title-2 {\n",
       "  font-size: 17px;\n",
       "}\n",
       ".ppy-pn-title-3 {\n",
       "  font-size: 14px;\n",
       "}\n",
       ".ppy-pn-title-4 {\n",
       "  font-size: 12px;\n",
       "}\n",
       "\n",
       ".ppy-pn-bold {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".ppy-pn-italic {\n",
       "  font-style: italic;\n",
       "}\n",
       ".ppy-pn-description {\n",
       "  font-size: 14px;\n",
       "  margin-bottom: 1px;\n",
       "}\n",
       "\n",
       ".bk-root {\n",
       "  width: 100% !important;\n",
       "  max-width: 100% !important;\n",
       "  box-sizing: border-box;\n",
       "}\n",
       "\n",
       "input, .bk-input, .bk-input-group {\n",
       "  margin-top: 0px;\n",
       "  margin-bottom: 3px;\n",
       "  padding-top: 0px;\n",
       "  padding-bottom: 0px;\n",
       "}\n",
       "\n",
       ".ppy-pn-header-button .bk-btn {\n",
       "  background: none !important;\n",
       "  border: none !important;\n",
       "  font-weight: bold;\n",
       "  font-size: 16px;\n",
       "  text-align: left;\n",
       "  padding-left: 0;\n",
       "  cursor: pointer;\n",
       "  box-shadow: none !important;\n",
       "  color: black;\n",
       "}\n",
       "\n",
       ".ppy-pn-danger-modal{\n",
       "  border: 2px solid red;\n",
       "  border-radius: 10px;\n",
       "  box-shadow: 0px 0px 10px rgba(255, 0, 0, 0.5);\n",
       "}\n",
       "\n",
       ".ppy-pn-config-form{\n",
       "  padding: 10px;\n",
       "  margin-top: 10px;\n",
       "  margin-bottom: 10px;\n",
       "  background-color: var(--ppy-background-color2);\n",
       "  border-radius: 5px;\n",
       "  box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1);\n",
       "}\n",
       "\n",
       "\n",
       ".ppy-pn-align-right {\n",
       "  display: flex;\n",
       "  justify-content: flex-end;\n",
       "}\n",
       "</style><script>function toggleMetadata(stepIndex, randomId) {\n",
       "  var metadata = document.getElementById(\"ppy-images-metadata-\" + randomId + \"-\" + stepIndex);\n",
       "  var arrow = document.getElementById(\"ppy-images-arrow-\" + randomId + \"-\" + stepIndex);\n",
       "  if (metadata.style.display === \"none\") {\n",
       "      metadata.style.display = \"block\";\n",
       "      arrow.innerHTML = \"▼\";\n",
       "      arrow.classList.remove(\"ppy-font-color\");\n",
       "      arrow.classList.add(\"ppy-font-color-brown\");\n",
       "  } else {\n",
       "      metadata.style.display = \"none\";\n",
       "      arrow.innerHTML = \"►\";\n",
       "      arrow.classList.remove(\"ppy-font-color-brown\");\n",
       "      arrow.classList.add(\"ppy-font-color\");\n",
       "  }\n",
       "}\n",
       "function toggleImage(imageId, randomId) {\n",
       "  var img = document.getElementById(imageId);\n",
       "  var arrow = document.getElementById(\"ppy-images-arrow-\" + randomId + \"-\" + imageId);\n",
       "  if (img.style.display === \"none\") {\n",
       "      img.style.display = \"block\";\n",
       "      arrow.innerHTML = \"▼\";\n",
       "      arrow.classList.remove(\"ppy-font-color\");\n",
       "      arrow.classList.add(\"ppy-font-color-brown\");\n",
       "  } else {\n",
       "      img.style.display = \"none\";\n",
       "      arrow.innerHTML = \"►\";\n",
       "      arrow.classList.remove(\"ppy-font-color-brown\");\n",
       "      arrow.classList.add(\"ppy-font-color\");\n",
       "  }\n",
       "}\n",
       "function showMore(stepIndex) {\n",
       "  var moreImages = document.getElementById(\"ppy-more-images-\" + stepIndex);\n",
       "  var showMoreButton = document.getElementById(\"ppy-show-more-button-\" + stepIndex);\n",
       "  var hideButton = document.getElementById(\"ppy-hide-button-\" + stepIndex);\n",
       "  moreImages.style.display = \"flex\";\n",
       "  showMoreButton.style.display = \"none\";\n",
       "  hideButton.style.display = \"inline-block\";\n",
       "}\n",
       "function hide(stepIndex) {\n",
       "  var moreImages = document.getElementById(\"ppy-more-images-\" + stepIndex);\n",
       "  var showMoreButton = document.getElementById(\"ppy-show-more-button-\" + stepIndex);\n",
       "  var hideButton = document.getElementById(\"ppy-hide-button-\" + stepIndex);\n",
       "  moreImages.style.display = \"none\";\n",
       "  showMoreButton.style.display = \"inline-block\";\n",
       "  hideButton.style.display = \"none\";\n",
       "}\n",
       "\n",
       "\n",
       "function showParameters(id, randomId) {\n",
       "  var currentTarget = document.getElementById('ppy-pipeline-' + randomId + '-' + id);\n",
       "  var square = document.getElementsByClassName('ppy-pipeline-' + randomId);\n",
       "  var allParams = document.getElementsByClassName('ppy-pipeline-parameters-' + randomId);\n",
       "  var selectedParams = document.getElementById('ppy-pipeline-parameters-' + randomId + '-' + id);\n",
       "  var idWasVisible = false;\n",
       "  if (selectedParams) {\n",
       "      var idWasVisible = selectedParams.style.display === 'block';\n",
       "  }\n",
       "  for (var i = 0; i < square.length; i++) {\n",
       "      square[i].classList.remove('ppy-font-color-brown');\n",
       "      square[i].classList.add('ppy-font-color');\n",
       "  }\n",
       "  for (var i = 0; i < allParams.length; i++) {\n",
       "      allParams[i].style.display = 'none';\n",
       "  }\n",
       "  // Show the selected parameter section\n",
       "  if (selectedParams) {\n",
       "      if (idWasVisible) {\n",
       "          selectedParams.style.display = 'none';\n",
       "          currentTarget.classList.remove('ppy-font-color-brown');\n",
       "          currentTarget.classList.add('ppy-font-color');\n",
       "      } else {\n",
       "          selectedParams.style.display = 'block';\n",
       "          currentTarget.classList.remove('ppy-font-color');\n",
       "          currentTarget.classList.add('ppy-font-color-brown');\n",
       "      }\n",
       "  }\n",
       "}\n",
       "\n",
       "hljs.highlightAll();\n",
       "</script><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github.min.css\"><script src=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js\"></script><script>hljs.highlightAll();</script><pre class='ppy-text-repr-fallback'>&lt;paidiverpy.pipeline.pipeline.Pipeline object at 0x7e3e48293130&gt;</pre><div>\n",
       "    <div class=\"ppy-pipeline-wrap\">\n",
       "        \n",
       "    <div id=\"ppy-pipeline-eco-general\" title=\"Click to see more information\"\n",
       "        class=\"ppy-pipeline ppy-pipeline-eco\"\n",
       "        onclick=\"showParameters('general', 'eco')\">\n",
       "        <h2 class=\"ppy-h2\">Raw</h2>\n",
       "        <h3 class=\"ppy-h3\">Type: Open</h2>\n",
       "    </div>\n",
       "    <div class=\"ppy-pipeline-arrow\"><svg class='icon ppy-arrow-right'><use xlink:href='#arrow-right'></use></svg></div>\n",
       "            <div id=\"ppy-pipeline-eco-step-0\" title=\"Click to see more information\"\n",
       "                class=\"ppy-pipeline ppy-pipeline-eco\" onclick=\"showParameters('step-0', 'eco')\">\n",
       "                <h2 class=\"ppy-h2\">Colour_correction</h2>\n",
       "                <h3 class=\"ppy-h3\">Type: Colour</h2>\n",
       "            </div>\n",
       "        <div class='ppy-pipeline-arrow'><svg class='icon ppy-arrow-right'><use xlink:href='#arrow-right'></use></svg></div>\n",
       "            <div id=\"ppy-pipeline-eco-step-1\" title=\"Click to see more information\"\n",
       "                class=\"ppy-pipeline ppy-pipeline-eco\" onclick=\"showParameters('step-1', 'eco')\">\n",
       "                <h2 class=\"ppy-h2\">Min_max_data</h2>\n",
       "                <h3 class=\"ppy-h3\">Type: Custom</h2>\n",
       "            </div>\n",
       "        \n",
       "    </div>\n",
       "    <div id=\"ppy-pipeline-parameters\" class=\"ppy-pipeline-parameters-all\">\n",
       "            <div id=\"ppy-pipeline-parameters-eco-step-0\"\n",
       "                class=\"ppy-pipeline-parameters ppy-pipeline-parameters-eco\"\n",
       "                style=\"display: none;\">\n",
       "                <h4 class=\"ppy-h4\">Parameters:</h4>\n",
       "                <pre class=\"ppy-json-block\"><span class=\"ppy-json-key\">name</span>: <span class=\"ppy-json-string\">\"colour_correction\"</span>\n",
       "<span class=\"ppy-json-key\">step_name</span>: <span class=\"ppy-json-string\">\"colour\"</span>\n",
       "<span class=\"ppy-json-key\">test</span>: <span class=\"ppy-json-number\">False</span>\n",
       "<span class=\"ppy-json-key\">params</span>:\n",
       "  <span class=\"ppy-json-key\">method</span>: <span class=\"ppy-json-string\">\"opencv\"</span>\n",
       "  <span class=\"ppy-json-key\">invert_colours</span>: <span class=\"ppy-json-number\">False</span>\n",
       "  <span class=\"ppy-json-key\">raise_error</span>: <span class=\"ppy-json-number\">False</span>\n",
       "<span class=\"ppy-json-key\">mode</span>: <span class=\"ppy-json-string\">\"grayscale\"</span></pre>\n",
       "            </div>\n",
       "        \n",
       "            <div id=\"ppy-pipeline-parameters-eco-step-1\"\n",
       "                class=\"ppy-pipeline-parameters ppy-pipeline-parameters-eco\"\n",
       "                style=\"display: none;\">\n",
       "                <h4 class=\"ppy-h4\">Parameters:</h4>\n",
       "                <pre class=\"ppy-json-block\"><span class=\"ppy-json-key\">name</span>: <span class=\"ppy-json-string\">\"min_max_data\"</span>\n",
       "<span class=\"ppy-json-key\">file_path</span>: <span class=\"ppy-json-string\">\"example\"</span>\n",
       "<span class=\"ppy-json-key\">class_name</span>: <span class=\"ppy-json-string\">\"MyCustomClass\"</span>\n",
       "<span class=\"ppy-json-key\">step_name</span>: <span class=\"ppy-json-string\">\"custom\"</span>\n",
       "<span class=\"ppy-json-key\">test</span>: <span class=\"ppy-json-number\">False</span>\n",
       "<span class=\"ppy-json-key\">processing_type</span>: <span class=\"ppy-json-string\">\"image\"</span>\n",
       "<span class=\"ppy-json-key\">dependencies</span>: <span class=\"ppy-json-string\">\"scikit-learn\"</span>\n",
       "<span class=\"ppy-json-key\">params</span>:\n",
       "  <span class=\"ppy-json-key\">raise_error</span>: <span class=\"ppy-json-number\">False</span>\n",
       "  <span class=\"ppy-json-key\">feature_range</span>: <span class=\"ppy-json-string\">\"(0, 1)\"</span></pre>\n",
       "            </div>\n",
       "        \n",
       "        <div id=\"ppy-pipeline-parameters-eco-general\" class=\"ppy-pipeline-parameters ppy-pipeline-parameters-eco\"\n",
       "            style=\"display: none;\">\n",
       "            <h4 class=\"ppy-h4\">Parameters:</h4>\n",
       "            <pre class=\"ppy-json-block\"><span class=\"ppy-json-key\">name</span>: <span class=\"ppy-json-string\">\"raw\"</span>\n",
       "<span class=\"ppy-json-key\">step_name</span>: <span class=\"ppy-json-string\">\"open\"</span>\n",
       "<span class=\"ppy-json-key\">sample_data</span>: <span class=\"ppy-json-string\">\"benthic_csv\"</span>\n",
       "<span class=\"ppy-json-key\">input_path</span>: <span class=\"ppy-json-string\">\"/home/tobfer/.paidiverpy_cache/benthic_csv/images\"</span>\n",
       "<span class=\"ppy-json-key\">output_path</span>: <span class=\"ppy-json-string\">\"output\"</span>\n",
       "<span class=\"ppy-json-key\">metadata_path</span>: <span class=\"ppy-json-string\">\"/home/tobfer/.paidiverpy_cache/benthic_csv/metadata/metadata_benthic_csv.csv\"</span>\n",
       "<span class=\"ppy-json-key\">metadata_type</span>: <span class=\"ppy-json-string\">\"CSV_FILE\"</span>\n",
       "<span class=\"ppy-json-key\">image_open_args</span>: <span class=\"ppy-json-string\">\"PNG\"</span>\n",
       "<span class=\"ppy-json-key\">append_data_to_metadata</span>: <span class=\"ppy-json-string\">\"/home/tobfer/.paidiverpy_cache/benthic_csv/metadata/appended_metadata_benthic_csv.csv\"</span>\n",
       "<span class=\"ppy-json-key\">n_jobs</span>: <span class=\"ppy-json-number\">1</span>\n",
       "<span class=\"ppy-json-key\">track_changes</span>: <span class=\"ppy-json-number\">True</span>\n",
       "<span class=\"ppy-json-key\">rename</span>: <span class=\"ppy-json-string\">\"datetime\"</span>\n",
       "<span class=\"ppy-json-key\">sampling</span>:\n",
       "  - <span class=\"ppy-json-key\">name</span>: <span class=\"ppy-json-string\">\"sampling\"</span>\n",
       "    <span class=\"ppy-json-key\">step_name</span>: <span class=\"ppy-json-string\">\"sampling\"</span>\n",
       "    <span class=\"ppy-json-key\">test</span>: <span class=\"ppy-json-number\">False</span>\n",
       "    <span class=\"ppy-json-key\">params</span>:\n",
       "      <span class=\"ppy-json-key\">value</span>: <span class=\"ppy-json-number\">0.1</span>\n",
       "      <span class=\"ppy-json-key\">raise_error</span>: <span class=\"ppy-json-number\">False</span>\n",
       "    <span class=\"ppy-json-key\">mode</span>: <span class=\"ppy-json-string\">\"percent\"</span></pre>\n",
       "        </div>\n",
       "    </div>\n",
       "    </div></div>"
      ],
      "text/plain": [
       "<paidiverpy.pipeline.pipeline.Pipeline at 0x7e3e48293130>"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# See the pipeline steps. Click in a step to see more information about it\n",
    "pipeline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "e61c25b4-79fd-4f28-94bb-e68aab8d0e94",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('raw',\n",
       "  paidiverpy.open_layer.open_layer.OpenLayer,\n",
       "  {'name': 'raw',\n",
       "   'step_name': 'open',\n",
       "   'sample_data': 'benthic_csv',\n",
       "   'input_path': PosixPath('/home/tobfer/.paidiverpy_cache/benthic_csv/images'),\n",
       "   'output_path': PosixPath('output'),\n",
       "   'metadata_path': PosixPath('/home/tobfer/.paidiverpy_cache/benthic_csv/metadata/metadata_benthic_csv.csv'),\n",
       "   'metadata_type': 'CSV_FILE',\n",
       "   'image_open_args': 'PNG',\n",
       "   'append_data_to_metadata': '/home/tobfer/.paidiverpy_cache/benthic_csv/metadata/appended_metadata_benthic_csv.csv',\n",
       "   'n_jobs': 1,\n",
       "   'track_changes': True,\n",
       "   'rename': 'datetime',\n",
       "   'sampling': [{'name': 'sampling',\n",
       "     'step_name': 'sampling',\n",
       "     'test': False,\n",
       "     'params': {'value': 0.1, 'raise_error': False},\n",
       "     'mode': 'percent'}]}),\n",
       " ('colour_correction',\n",
       "  paidiverpy.colour_layer.colour_layer.ColourLayer,\n",
       "  {'name': 'colour_correction',\n",
       "   'step_name': 'colour',\n",
       "   'test': False,\n",
       "   'params': {'method': 'opencv',\n",
       "    'invert_colours': False,\n",
       "    'raise_error': False},\n",
       "   'mode': 'grayscale'}),\n",
       " ('min_max_data',\n",
       "  paidiverpy.custom_layer.custom_layer.CustomLayer,\n",
       "  {'name': 'min_max_data',\n",
       "   'file_path': 'example',\n",
       "   'class_name': 'MyCustomClass',\n",
       "   'step_name': 'custom',\n",
       "   'test': False,\n",
       "   'processing_type': 'image',\n",
       "   'dependencies': 'scikit-learn',\n",
       "   'params': {'raise_error': False, 'feature_range': '(0, 1)'}})]"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# See the pipeline steps in json format\n",
    "pipeline.steps"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a975363d-f31b-4c20-b7c2-fd6e0310864b",
   "metadata": {},
   "source": [
    "The `min_max_data` is a custom algorithm available in `file_path`: `/mnt/noc/code/paidiver/paidiverpy/examples/custom_algorithms/custom_algorithm_example.py`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "0131f808-2a6a-40e0-beb7-41726f5c638a",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[92m☁ paidiverpy ☁  |       INFO | 2025-09-16 18:02:26 | Processing images using 1 cores\u001b[0m\n",
      "\u001b[92m☁ paidiverpy ☁  |       INFO | 2025-09-16 18:02:26 | Running step 0: raw - OpenLayer\u001b[0m\n",
      "\u001b[92m☁ paidiverpy ☁  |       INFO | 2025-09-16 18:02:26 | Original image shape: (128, 128, 4)\u001b[0m\n",
      "\u001b[92m☁ paidiverpy ☁  |       INFO | 2025-09-16 18:02:26 | Corrected image shape: (128, 128, 4)\u001b[0m\n",
      "\u001b[92m☁ paidiverpy ☁  |       INFO | 2025-09-16 18:02:26 | Original image shape: (128, 128, 4)\u001b[0m\n",
      "\u001b[92m☁ paidiverpy ☁  |       INFO | 2025-09-16 18:02:26 | Corrected image shape: (128, 128, 4)\u001b[0m\n",
      "\u001b[92m☁ paidiverpy ☁  |       INFO | 2025-09-16 18:02:26 | Original image shape: (128, 128, 4)\u001b[0m\n",
      "\u001b[92m☁ paidiverpy ☁  |       INFO | 2025-09-16 18:02:26 | Corrected image shape: (128, 128, 4)\u001b[0m\n",
      "\u001b[92m☁ paidiverpy ☁  |       INFO | 2025-09-16 18:02:26 | Original image shape: (128, 128, 4)\u001b[0m\n",
      "\u001b[92m☁ paidiverpy ☁  |       INFO | 2025-09-16 18:02:26 | Corrected image shape: (128, 128, 4)\u001b[0m\n",
      "\u001b[92m☁ paidiverpy ☁  |       INFO | 2025-09-16 18:02:26 | Original image shape: (128, 128, 4)\u001b[0m\n",
      "\u001b[92m☁ paidiverpy ☁  |       INFO | 2025-09-16 18:02:26 | Corrected image shape: (128, 128, 4)\u001b[0m\n",
      "\u001b[92m☁ paidiverpy ☁  |       INFO | 2025-09-16 18:02:26 | Padded image shape: (128, 128, 4)\u001b[0m\n",
      "\u001b[92m☁ paidiverpy ☁  |       INFO | 2025-09-16 18:02:26 | Padded image shape: (128, 128, 4)\u001b[0m\n",
      "\u001b[92m☁ paidiverpy ☁  |       INFO | 2025-09-16 18:02:26 | Padded image shape: (128, 128, 4)\u001b[0m\n",
      "\u001b[92m☁ paidiverpy ☁  |       INFO | 2025-09-16 18:02:26 | Padded image shape: (128, 128, 4)\u001b[0m\n",
      "\u001b[92m☁ paidiverpy ☁  |       INFO | 2025-09-16 18:02:26 | Padded image shape: (128, 128, 4)\u001b[0m\n",
      "\u001b[92m☁ paidiverpy ☁  |       INFO | 2025-09-16 18:02:26 | Step 0 completed\u001b[0m\n",
      "\u001b[92m☁ paidiverpy ☁  |       INFO | 2025-09-16 18:02:26 | Running step 1: colour_correction - ColourLayer\u001b[0m\n",
      "\u001b[92m☁ paidiverpy ☁  |       INFO | 2025-09-16 18:02:26 | Step 1 completed\u001b[0m\n",
      "\u001b[92m☁ paidiverpy ☁  |       INFO | 2025-09-16 18:02:26 | Running step 2: min_max_data - CustomLayer\u001b[0m\n",
      "\u001b[92m☁ paidiverpy ☁  |       INFO | 2025-09-16 18:02:27 | Step 2 completed\u001b[0m\n"
     ]
    }
   ],
   "source": [
    "# Run the pipeline\n",
    "pipeline.run()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "a5aa8ca4-9231-4769-8b12-b4f3d435a29a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div><svg style=\"position: absolute; width: 0; height: 0; overflow: hidden\">\n",
       "<defs>\n",
       "<symbol id=\"arrow-right\" viewBox=\"0 0 330 330\">\n",
       "  <path id=\"XMLID_222_\" d=\"M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001\n",
       "\tc-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213\n",
       "\tC82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606\n",
       "\tC255,161.018,253.42,157.202,250.606,154.389z\"/>\n",
       "</defs>\n",
       "</svg>\n",
       "<style>/* CSS stylesheet for displaying Paidiverpy objects in jupyterlab.\n",
       " *\n",
       " */\n",
       "\n",
       ":root {\n",
       "  --ppy-font-color: var(--jp-content-font-color, rgba(0, 0, 0, 1));\n",
       "  --ppy-font-color-brown: var(--jp-content-font-color-brown, brown);\n",
       "  --ppy-font-color-olive: var(--jp-content-font-color-olive, olive);\n",
       "  --ppy-font-color-teal: var(--jp-content-font-color-teal, teal);\n",
       "  --ppy-font-color-blue: var(--jp-content-font-color-blue, blue);\n",
       "  --ppy-font-color-gray: var(--jp-content-font-color-gray, gray);\n",
       "  --ppy-border-color: var(--jp-border-color2, #e0e0e0);\n",
       "  --ppy-disabled-color: var(--jp-layout-color3, #bdbdbd);\n",
       "  --ppy-background-color: var(--jp-layout-color, white);\n",
       "  --ppy-background-color2: var(--jp-layout-color3, rgba(212, 212, 212, 0.15));\n",
       "}\n",
       "\n",
       "\n",
       "html[theme=\"dark\"],\n",
       "html[data-theme=\"dark\"],\n",
       "body[data-theme=\"dark\"],\n",
       "body.vscode-dark {\n",
       "  --ppy-font-color: rgba(255, 255, 255, 1);\n",
       "  --ppy-font-color-brown: brown;\n",
       "  --ppy-font-color-olive: olive;\n",
       "  --ppy-font-color-teal: teal;\n",
       "  --ppy-font-color-blue: blue;\n",
       "  --ppy-font-color-gray: gray;\n",
       "  --ppy-border-color: #1f1f1f;\n",
       "  --ppy-disabled-color: #515151;\n",
       "  --ppy-background-color: #111111;\n",
       "}\n",
       "\n",
       ".ppy-background-color {\n",
       "  background-color: var(--ppy-background-color) !important;\n",
       "}\n",
       "\n",
       ".ppy-font-color-brown {\n",
       "  color: var(--ppy-font-color-brown) !important;\n",
       "}\n",
       "\n",
       ".ppy-font-color {\n",
       "  color: var(--ppy-font-color) !important;\n",
       "}\n",
       ".ppy-h2 {\n",
       "  font-size: 20px !important;\n",
       "}\n",
       ".ppy-h3 {\n",
       "  font-size: 13px !important;\n",
       "}\n",
       ".ppy-p {\n",
       "  font-size: 10px;\n",
       "}\n",
       ".ppy-p-error {\n",
       "  color: var(--ppy-font-color-brown);\n",
       "  font-weight: bold;\n",
       "  display: block;\n",
       "}\n",
       "\n",
       ".ppy-text-repr-fallback {\n",
       "  /* fallback to plain text repr when CSS is not injected (untrusted notebook) */\n",
       "  display: none;\n",
       "}\n",
       "\n",
       ".ppy-pipeline-wrap{\n",
       "  display: flex;\n",
       "  flex-wrap: wrap;\n",
       "  align-items: center;\n",
       "}\n",
       "\n",
       ".ppy-pipeline {\n",
       "  float:left;\n",
       "  cursor: pointer;\n",
       "  padding: 10px;\n",
       "  width: max-content;\n",
       "  height: 150px;\n",
       "  margin: 10px;\n",
       "  border: 1px solid #000;\n",
       "  text-align: center;\n",
       "  /* line-height: 80px; */\n",
       "}\n",
       "\n",
       ".ppy-pipeline-clear-fix {\n",
       "  clear: both;\n",
       "}\n",
       "\n",
       ".ppy-pipeline-parameters-all {\n",
       "  padding: 10px;\n",
       "  margin: 10px;\n",
       "}\n",
       "\n",
       ".ppy-images-step-header {\n",
       "  cursor: pointer;\n",
       "  font-weight: bold;\n",
       "  margin-top: 10px;\n",
       "  margin-bottom: 5px;\n",
       "}\n",
       ".ppy-images-metadata {\n",
       "  margin-left: 20px;\n",
       "  margin-bottom: 10px;\n",
       "}\n",
       ".ppy-images {\n",
       "  display: flex;\n",
       "  flex-wrap: wrap;\n",
       "  gap: 10px;\n",
       "  margin-left: 20px;\n",
       "}\n",
       "\n",
       ".ppy-show-more-button, .ppy-hide-button {\n",
       "  margin-left: 20px;\n",
       "  background-color: #007bff;\n",
       "  color: white;\n",
       "  border: none;\n",
       "  padding: 5px 10px;\n",
       "  cursor: pointer;\n",
       "}\n",
       "\n",
       "\n",
       ".ppy-pipeline-arrow {\n",
       "  float:left;\n",
       "  width: 50px;\n",
       "  height: 80px;\n",
       "  margin: 10px;\n",
       "  text-align: center;\n",
       "  line-height: 80px;\n",
       "}\n",
       "\n",
       ".ppy-images-img{\n",
       "  display: block;\n",
       "  max-width: 200px;\n",
       "  margin: 10px;\n",
       "}\n",
       "\n",
       ".ppy-images-toggle-arrow {\n",
       "  cursor: pointer;\n",
       "  margin-left: 5px;\n",
       "}\n",
       "\n",
       ".ppy-images-image-p {\n",
       "  cursor: pointer;\n",
       "}\n",
       "\n",
       ".ppy-arrow-right {\n",
       "  display: inline-block;\n",
       "  vertical-align: middle;\n",
       "  width: 1em;\n",
       "  height: 1.5em !important;\n",
       "  stroke-width: 0;\n",
       "  stroke: currentColor;\n",
       "  fill: currentColor;\n",
       "}\n",
       "\n",
       "\n",
       ".ppy-json-block {\n",
       "  font-family: monospace;\n",
       "  background: var(--ppy-background-color);\n",
       "  padding: 1em;\n",
       "  border-radius: 6px;\n",
       "}\n",
       ".ppy-json-key {\n",
       "  color: var(--ppy-font-color-brown);\n",
       "}\n",
       ".ppy-json-string {\n",
       "  color: var(--ppy-font-color-olive);\n",
       "}\n",
       ".ppy-json-number {\n",
       "  color: var(--ppy-font-color-teal);\n",
       "}\n",
       ".ppy-json-bool {\n",
       "  color: var(--ppy-font-color-blue);\n",
       "}\n",
       ".ppy-json-null {\n",
       "  color: var(--ppy-font-color-gray);\n",
       "}\n",
       "\n",
       "\n",
       ".ppy-pn-title-0 {\n",
       "  font-size: 30px;\n",
       "}\n",
       "\n",
       ".ppy-pn-title-1 {\n",
       "  font-size: 20px;\n",
       "}\n",
       ".ppy-pn-title-2 {\n",
       "  font-size: 17px;\n",
       "}\n",
       ".ppy-pn-title-3 {\n",
       "  font-size: 14px;\n",
       "}\n",
       ".ppy-pn-title-4 {\n",
       "  font-size: 12px;\n",
       "}\n",
       "\n",
       ".ppy-pn-bold {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".ppy-pn-italic {\n",
       "  font-style: italic;\n",
       "}\n",
       ".ppy-pn-description {\n",
       "  font-size: 14px;\n",
       "  margin-bottom: 1px;\n",
       "}\n",
       "\n",
       ".bk-root {\n",
       "  width: 100% !important;\n",
       "  max-width: 100% !important;\n",
       "  box-sizing: border-box;\n",
       "}\n",
       "\n",
       "input, .bk-input, .bk-input-group {\n",
       "  margin-top: 0px;\n",
       "  margin-bottom: 3px;\n",
       "  padding-top: 0px;\n",
       "  padding-bottom: 0px;\n",
       "}\n",
       "\n",
       ".ppy-pn-header-button .bk-btn {\n",
       "  background: none !important;\n",
       "  border: none !important;\n",
       "  font-weight: bold;\n",
       "  font-size: 16px;\n",
       "  text-align: left;\n",
       "  padding-left: 0;\n",
       "  cursor: pointer;\n",
       "  box-shadow: none !important;\n",
       "  color: black;\n",
       "}\n",
       "\n",
       ".ppy-pn-danger-modal{\n",
       "  border: 2px solid red;\n",
       "  border-radius: 10px;\n",
       "  box-shadow: 0px 0px 10px rgba(255, 0, 0, 0.5);\n",
       "}\n",
       "\n",
       ".ppy-pn-config-form{\n",
       "  padding: 10px;\n",
       "  margin-top: 10px;\n",
       "  margin-bottom: 10px;\n",
       "  background-color: var(--ppy-background-color2);\n",
       "  border-radius: 5px;\n",
       "  box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1);\n",
       "}\n",
       "\n",
       "\n",
       ".ppy-pn-align-right {\n",
       "  display: flex;\n",
       "  justify-content: flex-end;\n",
       "}\n",
       "</style><script>function toggleMetadata(stepIndex, randomId) {\n",
       "  var metadata = document.getElementById(\"ppy-images-metadata-\" + randomId + \"-\" + stepIndex);\n",
       "  var arrow = document.getElementById(\"ppy-images-arrow-\" + randomId + \"-\" + stepIndex);\n",
       "  if (metadata.style.display === \"none\") {\n",
       "      metadata.style.display = \"block\";\n",
       "      arrow.innerHTML = \"▼\";\n",
       "      arrow.classList.remove(\"ppy-font-color\");\n",
       "      arrow.classList.add(\"ppy-font-color-brown\");\n",
       "  } else {\n",
       "      metadata.style.display = \"none\";\n",
       "      arrow.innerHTML = \"►\";\n",
       "      arrow.classList.remove(\"ppy-font-color-brown\");\n",
       "      arrow.classList.add(\"ppy-font-color\");\n",
       "  }\n",
       "}\n",
       "function toggleImage(imageId, randomId) {\n",
       "  var img = document.getElementById(imageId);\n",
       "  var arrow = document.getElementById(\"ppy-images-arrow-\" + randomId + \"-\" + imageId);\n",
       "  if (img.style.display === \"none\") {\n",
       "      img.style.display = \"block\";\n",
       "      arrow.innerHTML = \"▼\";\n",
       "      arrow.classList.remove(\"ppy-font-color\");\n",
       "      arrow.classList.add(\"ppy-font-color-brown\");\n",
       "  } else {\n",
       "      img.style.display = \"none\";\n",
       "      arrow.innerHTML = \"►\";\n",
       "      arrow.classList.remove(\"ppy-font-color-brown\");\n",
       "      arrow.classList.add(\"ppy-font-color\");\n",
       "  }\n",
       "}\n",
       "function showMore(stepIndex) {\n",
       "  var moreImages = document.getElementById(\"ppy-more-images-\" + stepIndex);\n",
       "  var showMoreButton = document.getElementById(\"ppy-show-more-button-\" + stepIndex);\n",
       "  var hideButton = document.getElementById(\"ppy-hide-button-\" + stepIndex);\n",
       "  moreImages.style.display = \"flex\";\n",
       "  showMoreButton.style.display = \"none\";\n",
       "  hideButton.style.display = \"inline-block\";\n",
       "}\n",
       "function hide(stepIndex) {\n",
       "  var moreImages = document.getElementById(\"ppy-more-images-\" + stepIndex);\n",
       "  var showMoreButton = document.getElementById(\"ppy-show-more-button-\" + stepIndex);\n",
       "  var hideButton = document.getElementById(\"ppy-hide-button-\" + stepIndex);\n",
       "  moreImages.style.display = \"none\";\n",
       "  showMoreButton.style.display = \"inline-block\";\n",
       "  hideButton.style.display = \"none\";\n",
       "}\n",
       "\n",
       "\n",
       "function showParameters(id, randomId) {\n",
       "  var currentTarget = document.getElementById('ppy-pipeline-' + randomId + '-' + id);\n",
       "  var square = document.getElementsByClassName('ppy-pipeline-' + randomId);\n",
       "  var allParams = document.getElementsByClassName('ppy-pipeline-parameters-' + randomId);\n",
       "  var selectedParams = document.getElementById('ppy-pipeline-parameters-' + randomId + '-' + id);\n",
       "  var idWasVisible = false;\n",
       "  if (selectedParams) {\n",
       "      var idWasVisible = selectedParams.style.display === 'block';\n",
       "  }\n",
       "  for (var i = 0; i < square.length; i++) {\n",
       "      square[i].classList.remove('ppy-font-color-brown');\n",
       "      square[i].classList.add('ppy-font-color');\n",
       "  }\n",
       "  for (var i = 0; i < allParams.length; i++) {\n",
       "      allParams[i].style.display = 'none';\n",
       "  }\n",
       "  // Show the selected parameter section\n",
       "  if (selectedParams) {\n",
       "      if (idWasVisible) {\n",
       "          selectedParams.style.display = 'none';\n",
       "          currentTarget.classList.remove('ppy-font-color-brown');\n",
       "          currentTarget.classList.add('ppy-font-color');\n",
       "      } else {\n",
       "          selectedParams.style.display = 'block';\n",
       "          currentTarget.classList.remove('ppy-font-color');\n",
       "          currentTarget.classList.add('ppy-font-color-brown');\n",
       "      }\n",
       "  }\n",
       "}\n",
       "\n",
       "hljs.highlightAll();\n",
       "</script><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github.min.css\"><script src=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js\"></script><script>hljs.highlightAll();</script><pre class='ppy-text-repr-fallback'>&lt;paidiverpy.images_layer.ImagesLayer object at 0x7e3e48291360&gt;</pre><div>\n",
       "            <div class='ppy-h2 ppy-images-step-header' onclick='toggleMetadata(0, \"ewc\")'>\n",
       "                Step 0: raw\n",
       "                <span id='ppy-images-arrow-ewc-0'\n",
       "                    class='ppy-images-toggle-arrow ppy-font-color-brown'>▼\n",
       "                </span>\n",
       "            </div>\n",
       "            <div id='ppy-images-metadata-ewc-0' class='ppy-images-metadata' style='display:block;'><div class='ppy-images'>\n",
       "        <div>\n",
       "            <p onclick='toggleImage(\"image-ewc-0-0\", \"ewc\")' class=\"ppy-images-image-p\" >\n",
       "                Image: 2018-06-11T04:15:11\n",
       "                <span id='ppy-images-arrow-ewc-image-ewc-0-0' class='ppy-images-toggle-arrow ppy-font-color-brown'>▼</span>\n",
       "            </p>\n",
       "        \n",
       "            <img id='image-ewc-0-0'\n",
       "                src='data:image/png;base64,[encoded data, 29300 characters]'\n",
       "                class='ppy-images-img'/></div>\n",
       "            \n",
       "        <div>\n",
       "            <p onclick='toggleImage(\"image-ewc-0-1\", \"ewc\")' class=\"ppy-images-image-p\" >\n",
       "                Image: 2018-06-11T04:15:21\n",
       "                <span id='ppy-images-arrow-ewc-image-ewc-0-1' class='ppy-images-toggle-arrow ppy-font-color-brown'>▼</span>\n",
       "            </p>\n",
       "        \n",
       "            <img id='image-ewc-0-1'\n",
       "                src='data:image/png;base64,[encoded data, 29676 characters]'\n",
       "                class='ppy-images-img'/></div>\n",
       "            \n",
       "        <div>\n",
       "            <p onclick='toggleImage(\"image-ewc-0-2\", \"ewc\")' class=\"ppy-images-image-p\" >\n",
       "                Image: 2018-06-11T04:19:21\n",
       "                <span id='ppy-images-arrow-ewc-image-ewc-0-2' class='ppy-images-toggle-arrow ppy-font-color-brown'>▼</span>\n",
       "            </p>\n",
       "        \n",
       "            <img id='image-ewc-0-2'\n",
       "                src='data:image/png;base64,[encoded data, 39148 characters]'\n",
       "                class='ppy-images-img'/></div>\n",
       "            \n",
       "        <div>\n",
       "            <p onclick='toggleImage(\"image-ewc-0-3\", \"ewc\")' class=\"ppy-images-image-p\" >\n",
       "                Image: 2018-06-11T04:21:21\n",
       "                <span id='ppy-images-arrow-ewc-image-ewc-0-3' class='ppy-images-toggle-arrow ppy-font-color-brown'>▼</span>\n",
       "            </p>\n",
       "        \n",
       "            <img id='image-ewc-0-3'\n",
       "                src='data:image/png;base64,[encoded data, 46692 characters]'\n",
       "                class='ppy-images-img'/></div>\n",
       "            \n",
       "        <div>\n",
       "            <p onclick='toggleImage(\"image-ewc-0-4\", \"ewc\")' class=\"ppy-images-image-p\" >\n",
       "                Image: 2018-06-11T04:21:41\n",
       "                <span id='ppy-images-arrow-ewc-image-ewc-0-4' class='ppy-images-toggle-arrow ppy-font-color-brown'>▼</span>\n",
       "            </p>\n",
       "        \n",
       "            <img id='image-ewc-0-4'\n",
       "                src='data:image/png;base64,[encoded data, 45844 characters]'\n",
       "                class='ppy-images-img'/></div>\n",
       "            </div></div>\n",
       "            <div class='ppy-h2 ppy-images-step-header' onclick='toggleMetadata(1, \"ewc\")'>\n",
       "                Step 1: colour_correction\n",
       "                <span id='ppy-images-arrow-ewc-1'\n",
       "                    class='ppy-images-toggle-arrow ppy-font-color-brown'>▼\n",
       "                </span>\n",
       "            </div>\n",
       "            <div id='ppy-images-metadata-ewc-1' class='ppy-images-metadata' style='display:block;'><div class='ppy-images'>\n",
       "        <div>\n",
       "            <p onclick='toggleImage(\"image-ewc-1-0\", \"ewc\")' class=\"ppy-images-image-p\" >\n",
       "                Image: 2018-06-11T04:15:11\n",
       "                <span id='ppy-images-arrow-ewc-image-ewc-1-0' class='ppy-images-toggle-arrow ppy-font-color-brown'>▼</span>\n",
       "            </p>\n",
       "        \n",
       "            <img id='image-ewc-1-0'\n",
       "                src='data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCACAAIABAREA/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEBAAA/APRse1IaaRTStRkUhFNIpuKQigLTsUlSIKlUVIFqQCgimEU0ikNMIppFMIpMUmKcBQRxQBzUqipFFSqKkAppFNIphFNIppFMNNxTSKAKcBRilUVKoqQCpQKeBTSKYRTDTTTTTcU0jimYpQKWinAVIlSgVItSCmGmHimEU00w0hpppuKBS0uKcBTk61MKkFSAU01G1NNMIphpCKaaaRSUopwpaetSipFqVaYaa1MPSmGmGm000mKMUuKWlHNSLTxUqVIKYaaaYaaajNNPWkoxRiigU4U9akFSLUq1GaYaaaYaYTTDRS0YopKcKetSCpFqVaiJphppphphpKSloNFFANPWpVNSLUq1EaYaYajJppNNzS0ZopaQ0U9TUq1KtSCoie9MNMY1GaaaTNJS5ozzS0hNAp4NSKamU1IDUJpjGmk1GTTTSUUA0hNLmijNOBqRamU1KpqAmmE00nFMJpppKTNGaM0ZoozTgalU1KpqRTUBNMJphNJmkJppNGaKTNLmjNFOBqRTUqmpFNQE0wn0pppKaetITxSZozSUuaM0A08GnKalU1Ipr//Z'\n",
       "                class='ppy-images-img'/></div>\n",
       "            \n",
       "        <div>\n",
       "            <p onclick='toggleImage(\"image-ewc-1-1\", \"ewc\")' class=\"ppy-images-image-p\" >\n",
       "                Image: 2018-06-11T04:15:21\n",
       "                <span id='ppy-images-arrow-ewc-image-ewc-1-1' class='ppy-images-toggle-arrow ppy-font-color-brown'>▼</span>\n",
       "            </p>\n",
       "        \n",
       "            <img id='image-ewc-1-1'\n",
       "                src='data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCACAAIABAREA/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEBAAA/APRyKjIphFRsKjIpMUmKXFLjilFPFSAVIoqQU4CngVGRUZFRsKYwqI9aMU2lFLSinipFFSingU8CngVG1RsKjYVG1RkUlIRQBSilxTxUi1KtPFSCngVERTDUZFRsKjIptIaQU4U4CnAVItSLUg6VIKeBURphphFRNTCKZTTQBTgKkApcU8CpFqRakFPFRNTCKYaiamGmGmd6cOlOFOAp4pwp61IKkFPFRtTSOKiaoz3phFMIppFKBxTgKcDThTh0qRelSCnrUgqI001G1RmmU0im4pRS9KAacKetSL0qRRT1qQVEaYTUbVGaSmkUmOaXFIaAeadmnipFqQU8U8VGajamGmGm96XFIRimnimdaUGlp6mpVNSKaeKkFQ5pjUw0yilpDUZptFKDUi08VIKkBp6moc0xjTDSUtLTTTDTDSUop6mpRTwacDUimoCeKaTTM0madmjNITTTTDTe+KWnCpFNSCnA1ItQZptNNJ3pe1GaQnmmk00mkFL1pRUimng08VIKr54pM000meaXOKTNITSGm0vSgdKBTwaeDUimpFNVs0hNJmkzSE0meKCaQtikzRmlzRmnA08Gng1IDX//2Q=='\n",
       "                class='ppy-images-img'/></div>\n",
       "            \n",
       "        <div>\n",
       "            <p onclick='toggleImage(\"image-ewc-1-2\", \"ewc\")' class=\"ppy-images-image-p\" >\n",
       "                Image: 2018-06-11T04:19:21\n",
       "                <span id='ppy-images-arrow-ewc-image-ewc-1-2' class='ppy-images-toggle-arrow ppy-font-color-brown'>▼</span>\n",
       "            </p>\n",
       "        \n",
       "            <img id='image-ewc-1-2'\n",
       "                src='data:image/jpeg;base64,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'\n",
       "                class='ppy-images-img'/></div>\n",
       "            \n",
       "        <div>\n",
       "            <p onclick='toggleImage(\"image-ewc-1-3\", \"ewc\")' class=\"ppy-images-image-p\" >\n",
       "                Image: 2018-06-11T04:21:21\n",
       "                <span id='ppy-images-arrow-ewc-image-ewc-1-3' class='ppy-images-toggle-arrow ppy-font-color-brown'>▼</span>\n",
       "            </p>\n",
       "        \n",
       "            <img id='image-ewc-1-3'\n",
       "                src='data:image/jpeg;base64,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'\n",
       "                class='ppy-images-img'/></div>\n",
       "            \n",
       "        <div>\n",
       "            <p onclick='toggleImage(\"image-ewc-1-4\", \"ewc\")' class=\"ppy-images-image-p\" >\n",
       "                Image: 2018-06-11T04:21:41\n",
       "                <span id='ppy-images-arrow-ewc-image-ewc-1-4' class='ppy-images-toggle-arrow ppy-font-color-brown'>▼</span>\n",
       "            </p>\n",
       "        \n",
       "            <img id='image-ewc-1-4'\n",
       "                src='data:image/jpeg;base64,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'\n",
       "                class='ppy-images-img'/></div>\n",
       "            </div></div>\n",
       "            <div class='ppy-h2 ppy-images-step-header' onclick='toggleMetadata(2, \"ewc\")'>\n",
       "                Step 2: min_max_data\n",
       "                <span id='ppy-images-arrow-ewc-2'\n",
       "                    class='ppy-images-toggle-arrow ppy-font-color-brown'>▼\n",
       "                </span>\n",
       "            </div>\n",
       "            <div id='ppy-images-metadata-ewc-2' class='ppy-images-metadata' style='display:block;'><div class='ppy-images'>\n",
       "        <div>\n",
       "            <p onclick='toggleImage(\"image-ewc-2-0\", \"ewc\")' class=\"ppy-images-image-p\" >\n",
       "                Image: 2018-06-11T04:15:11\n",
       "                <span id='ppy-images-arrow-ewc-image-ewc-2-0' class='ppy-images-toggle-arrow ppy-font-color-brown'>▼</span>\n",
       "            </p>\n",
       "        \n",
       "            <img id='image-ewc-2-0'\n",
       "                src='data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCACAAIABAREA/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEBAAA/APn+iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiv/9k='\n",
       "                class='ppy-images-img'/></div>\n",
       "            \n",
       "        <div>\n",
       "            <p onclick='toggleImage(\"image-ewc-2-1\", \"ewc\")' class=\"ppy-images-image-p\" >\n",
       "                Image: 2018-06-11T04:15:21\n",
       "                <span id='ppy-images-arrow-ewc-image-ewc-2-1' class='ppy-images-toggle-arrow ppy-font-color-brown'>▼</span>\n",
       "            </p>\n",
       "        \n",
       "            <img id='image-ewc-2-1'\n",
       "                src='data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCACAAIABAREA/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEBAAA/APn+iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiv/9k='\n",
       "                class='ppy-images-img'/></div>\n",
       "            \n",
       "        <div>\n",
       "            <p onclick='toggleImage(\"image-ewc-2-2\", \"ewc\")' class=\"ppy-images-image-p\" >\n",
       "                Image: 2018-06-11T04:19:21\n",
       "                <span id='ppy-images-arrow-ewc-image-ewc-2-2' class='ppy-images-toggle-arrow ppy-font-color-brown'>▼</span>\n",
       "            </p>\n",
       "        \n",
       "            <img id='image-ewc-2-2'\n",
       "                src='data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCACAAIABAREA/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEBAAA/APn+iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiv/9k='\n",
       "                class='ppy-images-img'/></div>\n",
       "            \n",
       "        <div>\n",
       "            <p onclick='toggleImage(\"image-ewc-2-3\", \"ewc\")' class=\"ppy-images-image-p\" >\n",
       "                Image: 2018-06-11T04:21:21\n",
       "                <span id='ppy-images-arrow-ewc-image-ewc-2-3' class='ppy-images-toggle-arrow ppy-font-color-brown'>▼</span>\n",
       "            </p>\n",
       "        \n",
       "            <img id='image-ewc-2-3'\n",
       "                src='data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCACAAIABAREA/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEBAAA/APn+iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiv/9k='\n",
       "                class='ppy-images-img'/></div>\n",
       "            \n",
       "        <div>\n",
       "            <p onclick='toggleImage(\"image-ewc-2-4\", \"ewc\")' class=\"ppy-images-image-p\" >\n",
       "                Image: 2018-06-11T04:21:41\n",
       "                <span id='ppy-images-arrow-ewc-image-ewc-2-4' class='ppy-images-toggle-arrow ppy-font-color-brown'>▼</span>\n",
       "            </p>\n",
       "        \n",
       "            <img id='image-ewc-2-4'\n",
       "                src='data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCACAAIABAREA/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEBAAA/APn+iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiv/9k='\n",
       "                class='ppy-images-img'/></div>\n",
       "            </div></div></div></div>"
      ],
      "text/plain": [
       "<paidiverpy.images_layer.ImagesLayer at 0x7e3e48291360>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# See the images output\n",
    "pipeline.images"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "69fffbd2-5ee8-4666-894a-c0b78df5743d",
   "metadata": {},
   "source": [
    "# Using a Custom algorithm that process the entire dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "05fbad93-3910-49f9-bacf-78fb5f1bcb18",
   "metadata": {},
   "outputs": [],
   "source": [
    "pipeline = Pipeline(config_file_path=\"../config_files/config_custom_algorithm_dataset.yml\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7e9dd58e-b64c-48cc-9512-906269552fc8",
   "metadata": {},
   "source": [
    "This occurs because of the following step that you added in the conf file:\n",
    "\n",
    "```\n",
    "steps:\n",
    "    ...\n",
    "\n",
    "  - custom:\n",
    "      name: \"min_max_data\"\n",
    "      file_path: \"/mnt/noc/code/paidiver/paidiverpy/examples/custom_algorithms/custom_algorithm_example_dataset.py\"\n",
    "      class_name: \"MyMethod\"\n",
    "      processing_type: \"dataset\"    \n",
    "      dependencies: \"scikit-learn\"\n",
    "      params:\n",
    "        feature_range: (0, 1)\n",
    "```\n",
    "\n",
    "In this case, you are saying that you need to install scikit-learn to use the custom algorithm.\n",
    "\n",
    "And you are also adding the flag `processing_type` and setting it to `dataset`, which means that the custom algorithm will have access to the whole dataset at once"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "c3e123f2-ef3f-497f-acc1-534af1d34524",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div><svg style=\"position: absolute; width: 0; height: 0; overflow: hidden\">\n",
       "<defs>\n",
       "<symbol id=\"arrow-right\" viewBox=\"0 0 330 330\">\n",
       "  <path id=\"XMLID_222_\" d=\"M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001\n",
       "\tc-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213\n",
       "\tC82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606\n",
       "\tC255,161.018,253.42,157.202,250.606,154.389z\"/>\n",
       "</defs>\n",
       "</svg>\n",
       "<style>/* CSS stylesheet for displaying Paidiverpy objects in jupyterlab.\n",
       " *\n",
       " */\n",
       "\n",
       ":root {\n",
       "  --ppy-font-color: var(--jp-content-font-color, rgba(0, 0, 0, 1));\n",
       "  --ppy-font-color-brown: var(--jp-content-font-color-brown, brown);\n",
       "  --ppy-font-color-olive: var(--jp-content-font-color-olive, olive);\n",
       "  --ppy-font-color-teal: var(--jp-content-font-color-teal, teal);\n",
       "  --ppy-font-color-blue: var(--jp-content-font-color-blue, blue);\n",
       "  --ppy-font-color-gray: var(--jp-content-font-color-gray, gray);\n",
       "  --ppy-border-color: var(--jp-border-color2, #e0e0e0);\n",
       "  --ppy-disabled-color: var(--jp-layout-color3, #bdbdbd);\n",
       "  --ppy-background-color: var(--jp-layout-color, white);\n",
       "  --ppy-background-color2: var(--jp-layout-color3, rgba(212, 212, 212, 0.15));\n",
       "}\n",
       "\n",
       "\n",
       "html[theme=\"dark\"],\n",
       "html[data-theme=\"dark\"],\n",
       "body[data-theme=\"dark\"],\n",
       "body.vscode-dark {\n",
       "  --ppy-font-color: rgba(255, 255, 255, 1);\n",
       "  --ppy-font-color-brown: brown;\n",
       "  --ppy-font-color-olive: olive;\n",
       "  --ppy-font-color-teal: teal;\n",
       "  --ppy-font-color-blue: blue;\n",
       "  --ppy-font-color-gray: gray;\n",
       "  --ppy-border-color: #1f1f1f;\n",
       "  --ppy-disabled-color: #515151;\n",
       "  --ppy-background-color: #111111;\n",
       "}\n",
       "\n",
       ".ppy-background-color {\n",
       "  background-color: var(--ppy-background-color) !important;\n",
       "}\n",
       "\n",
       ".ppy-font-color-brown {\n",
       "  color: var(--ppy-font-color-brown) !important;\n",
       "}\n",
       "\n",
       ".ppy-font-color {\n",
       "  color: var(--ppy-font-color) !important;\n",
       "}\n",
       ".ppy-h2 {\n",
       "  font-size: 20px !important;\n",
       "}\n",
       ".ppy-h3 {\n",
       "  font-size: 13px !important;\n",
       "}\n",
       ".ppy-p {\n",
       "  font-size: 10px;\n",
       "}\n",
       ".ppy-p-error {\n",
       "  color: var(--ppy-font-color-brown);\n",
       "  font-weight: bold;\n",
       "  display: block;\n",
       "}\n",
       "\n",
       ".ppy-text-repr-fallback {\n",
       "  /* fallback to plain text repr when CSS is not injected (untrusted notebook) */\n",
       "  display: none;\n",
       "}\n",
       "\n",
       ".ppy-pipeline-wrap{\n",
       "  display: flex;\n",
       "  flex-wrap: wrap;\n",
       "  align-items: center;\n",
       "}\n",
       "\n",
       ".ppy-pipeline {\n",
       "  float:left;\n",
       "  cursor: pointer;\n",
       "  padding: 10px;\n",
       "  width: max-content;\n",
       "  height: 150px;\n",
       "  margin: 10px;\n",
       "  border: 1px solid #000;\n",
       "  text-align: center;\n",
       "  /* line-height: 80px; */\n",
       "}\n",
       "\n",
       ".ppy-pipeline-clear-fix {\n",
       "  clear: both;\n",
       "}\n",
       "\n",
       ".ppy-pipeline-parameters-all {\n",
       "  padding: 10px;\n",
       "  margin: 10px;\n",
       "}\n",
       "\n",
       ".ppy-images-step-header {\n",
       "  cursor: pointer;\n",
       "  font-weight: bold;\n",
       "  margin-top: 10px;\n",
       "  margin-bottom: 5px;\n",
       "}\n",
       ".ppy-images-metadata {\n",
       "  margin-left: 20px;\n",
       "  margin-bottom: 10px;\n",
       "}\n",
       ".ppy-images {\n",
       "  display: flex;\n",
       "  flex-wrap: wrap;\n",
       "  gap: 10px;\n",
       "  margin-left: 20px;\n",
       "}\n",
       "\n",
       ".ppy-show-more-button, .ppy-hide-button {\n",
       "  margin-left: 20px;\n",
       "  background-color: #007bff;\n",
       "  color: white;\n",
       "  border: none;\n",
       "  padding: 5px 10px;\n",
       "  cursor: pointer;\n",
       "}\n",
       "\n",
       "\n",
       ".ppy-pipeline-arrow {\n",
       "  float:left;\n",
       "  width: 50px;\n",
       "  height: 80px;\n",
       "  margin: 10px;\n",
       "  text-align: center;\n",
       "  line-height: 80px;\n",
       "}\n",
       "\n",
       ".ppy-images-img{\n",
       "  display: block;\n",
       "  max-width: 200px;\n",
       "  margin: 10px;\n",
       "}\n",
       "\n",
       ".ppy-images-toggle-arrow {\n",
       "  cursor: pointer;\n",
       "  margin-left: 5px;\n",
       "}\n",
       "\n",
       ".ppy-images-image-p {\n",
       "  cursor: pointer;\n",
       "}\n",
       "\n",
       ".ppy-arrow-right {\n",
       "  display: inline-block;\n",
       "  vertical-align: middle;\n",
       "  width: 1em;\n",
       "  height: 1.5em !important;\n",
       "  stroke-width: 0;\n",
       "  stroke: currentColor;\n",
       "  fill: currentColor;\n",
       "}\n",
       "\n",
       "\n",
       ".ppy-json-block {\n",
       "  font-family: monospace;\n",
       "  background: var(--ppy-background-color);\n",
       "  padding: 1em;\n",
       "  border-radius: 6px;\n",
       "}\n",
       ".ppy-json-key {\n",
       "  color: var(--ppy-font-color-brown);\n",
       "}\n",
       ".ppy-json-string {\n",
       "  color: var(--ppy-font-color-olive);\n",
       "}\n",
       ".ppy-json-number {\n",
       "  color: var(--ppy-font-color-teal);\n",
       "}\n",
       ".ppy-json-bool {\n",
       "  color: var(--ppy-font-color-blue);\n",
       "}\n",
       ".ppy-json-null {\n",
       "  color: var(--ppy-font-color-gray);\n",
       "}\n",
       "\n",
       "\n",
       ".ppy-pn-title-0 {\n",
       "  font-size: 30px;\n",
       "}\n",
       "\n",
       ".ppy-pn-title-1 {\n",
       "  font-size: 20px;\n",
       "}\n",
       ".ppy-pn-title-2 {\n",
       "  font-size: 17px;\n",
       "}\n",
       ".ppy-pn-title-3 {\n",
       "  font-size: 14px;\n",
       "}\n",
       ".ppy-pn-title-4 {\n",
       "  font-size: 12px;\n",
       "}\n",
       "\n",
       ".ppy-pn-bold {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".ppy-pn-italic {\n",
       "  font-style: italic;\n",
       "}\n",
       ".ppy-pn-description {\n",
       "  font-size: 14px;\n",
       "  margin-bottom: 1px;\n",
       "}\n",
       "\n",
       ".bk-root {\n",
       "  width: 100% !important;\n",
       "  max-width: 100% !important;\n",
       "  box-sizing: border-box;\n",
       "}\n",
       "\n",
       "input, .bk-input, .bk-input-group {\n",
       "  margin-top: 0px;\n",
       "  margin-bottom: 3px;\n",
       "  padding-top: 0px;\n",
       "  padding-bottom: 0px;\n",
       "}\n",
       "\n",
       ".ppy-pn-header-button .bk-btn {\n",
       "  background: none !important;\n",
       "  border: none !important;\n",
       "  font-weight: bold;\n",
       "  font-size: 16px;\n",
       "  text-align: left;\n",
       "  padding-left: 0;\n",
       "  cursor: pointer;\n",
       "  box-shadow: none !important;\n",
       "  color: black;\n",
       "}\n",
       "\n",
       ".ppy-pn-danger-modal{\n",
       "  border: 2px solid red;\n",
       "  border-radius: 10px;\n",
       "  box-shadow: 0px 0px 10px rgba(255, 0, 0, 0.5);\n",
       "}\n",
       "\n",
       ".ppy-pn-config-form{\n",
       "  padding: 10px;\n",
       "  margin-top: 10px;\n",
       "  margin-bottom: 10px;\n",
       "  background-color: var(--ppy-background-color2);\n",
       "  border-radius: 5px;\n",
       "  box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1);\n",
       "}\n",
       "\n",
       "\n",
       ".ppy-pn-align-right {\n",
       "  display: flex;\n",
       "  justify-content: flex-end;\n",
       "}\n",
       "</style><script>function toggleMetadata(stepIndex, randomId) {\n",
       "  var metadata = document.getElementById(\"ppy-images-metadata-\" + randomId + \"-\" + stepIndex);\n",
       "  var arrow = document.getElementById(\"ppy-images-arrow-\" + randomId + \"-\" + stepIndex);\n",
       "  if (metadata.style.display === \"none\") {\n",
       "      metadata.style.display = \"block\";\n",
       "      arrow.innerHTML = \"▼\";\n",
       "      arrow.classList.remove(\"ppy-font-color\");\n",
       "      arrow.classList.add(\"ppy-font-color-brown\");\n",
       "  } else {\n",
       "      metadata.style.display = \"none\";\n",
       "      arrow.innerHTML = \"►\";\n",
       "      arrow.classList.remove(\"ppy-font-color-brown\");\n",
       "      arrow.classList.add(\"ppy-font-color\");\n",
       "  }\n",
       "}\n",
       "function toggleImage(imageId, randomId) {\n",
       "  var img = document.getElementById(imageId);\n",
       "  var arrow = document.getElementById(\"ppy-images-arrow-\" + randomId + \"-\" + imageId);\n",
       "  if (img.style.display === \"none\") {\n",
       "      img.style.display = \"block\";\n",
       "      arrow.innerHTML = \"▼\";\n",
       "      arrow.classList.remove(\"ppy-font-color\");\n",
       "      arrow.classList.add(\"ppy-font-color-brown\");\n",
       "  } else {\n",
       "      img.style.display = \"none\";\n",
       "      arrow.innerHTML = \"►\";\n",
       "      arrow.classList.remove(\"ppy-font-color-brown\");\n",
       "      arrow.classList.add(\"ppy-font-color\");\n",
       "  }\n",
       "}\n",
       "function showMore(stepIndex) {\n",
       "  var moreImages = document.getElementById(\"ppy-more-images-\" + stepIndex);\n",
       "  var showMoreButton = document.getElementById(\"ppy-show-more-button-\" + stepIndex);\n",
       "  var hideButton = document.getElementById(\"ppy-hide-button-\" + stepIndex);\n",
       "  moreImages.style.display = \"flex\";\n",
       "  showMoreButton.style.display = \"none\";\n",
       "  hideButton.style.display = \"inline-block\";\n",
       "}\n",
       "function hide(stepIndex) {\n",
       "  var moreImages = document.getElementById(\"ppy-more-images-\" + stepIndex);\n",
       "  var showMoreButton = document.getElementById(\"ppy-show-more-button-\" + stepIndex);\n",
       "  var hideButton = document.getElementById(\"ppy-hide-button-\" + stepIndex);\n",
       "  moreImages.style.display = \"none\";\n",
       "  showMoreButton.style.display = \"inline-block\";\n",
       "  hideButton.style.display = \"none\";\n",
       "}\n",
       "\n",
       "\n",
       "function showParameters(id, randomId) {\n",
       "  var currentTarget = document.getElementById('ppy-pipeline-' + randomId + '-' + id);\n",
       "  var square = document.getElementsByClassName('ppy-pipeline-' + randomId);\n",
       "  var allParams = document.getElementsByClassName('ppy-pipeline-parameters-' + randomId);\n",
       "  var selectedParams = document.getElementById('ppy-pipeline-parameters-' + randomId + '-' + id);\n",
       "  var idWasVisible = false;\n",
       "  if (selectedParams) {\n",
       "      var idWasVisible = selectedParams.style.display === 'block';\n",
       "  }\n",
       "  for (var i = 0; i < square.length; i++) {\n",
       "      square[i].classList.remove('ppy-font-color-brown');\n",
       "      square[i].classList.add('ppy-font-color');\n",
       "  }\n",
       "  for (var i = 0; i < allParams.length; i++) {\n",
       "      allParams[i].style.display = 'none';\n",
       "  }\n",
       "  // Show the selected parameter section\n",
       "  if (selectedParams) {\n",
       "      if (idWasVisible) {\n",
       "          selectedParams.style.display = 'none';\n",
       "          currentTarget.classList.remove('ppy-font-color-brown');\n",
       "          currentTarget.classList.add('ppy-font-color');\n",
       "      } else {\n",
       "          selectedParams.style.display = 'block';\n",
       "          currentTarget.classList.remove('ppy-font-color');\n",
       "          currentTarget.classList.add('ppy-font-color-brown');\n",
       "      }\n",
       "  }\n",
       "}\n",
       "\n",
       "hljs.highlightAll();\n",
       "</script><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github.min.css\"><script src=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js\"></script><script>hljs.highlightAll();</script><pre class='ppy-text-repr-fallback'>{\n",
       "    &quot;general&quot;: {\n",
       "        &quot;name&quot;: &quot;raw&quot;,\n",
       "        &quot;step_name&quot;: &quot;open&quot;,\n",
       "        &quot;sample_data&quot;: &quot;benthic_csv&quot;,\n",
       "        &quot;input_path&quot;: &quot;/home/tobfer/.paidiverpy_cache/benthic_csv/images&quot;,\n",
       "        &quot;output_path&quot;: &quot;output&quot;,\n",
       "        &quot;metadata_path&quot;: &quot;/home/tobfer/.paidiverpy_cache/benthic_csv/metadata/metadata_benthic_csv.csv&quot;,\n",
       "        &quot;metadata_type&quot;: &quot;CSV_FILE&quot;,\n",
       "        &quot;image_open_args&quot;: &quot;PNG&quot;,\n",
       "        &quot;append_data_to_metadata&quot;: &quot;/home/tobfer/.paidiverpy_cache/benthic_csv/metadata/appended_metadata_benthic_csv.csv&quot;,\n",
       "        &quot;n_jobs&quot;: 1,\n",
       "        &quot;track_changes&quot;: true,\n",
       "        &quot;rename&quot;: &quot;datetime&quot;,\n",
       "        &quot;sampling&quot;: [\n",
       "            {\n",
       "                &quot;name&quot;: &quot;sampling&quot;,\n",
       "                &quot;step_name&quot;: &quot;sampling&quot;,\n",
       "                &quot;test&quot;: false,\n",
       "                &quot;params&quot;: {\n",
       "                    &quot;value&quot;: 0.1,\n",
       "                    &quot;raise_error&quot;: false\n",
       "                },\n",
       "                &quot;mode&quot;: &quot;percent&quot;\n",
       "            }\n",
       "        ]\n",
       "    },\n",
       "    &quot;steps&quot;: [\n",
       "        {\n",
       "            &quot;name&quot;: &quot;colour_correction&quot;,\n",
       "            &quot;step_name&quot;: &quot;colour&quot;,\n",
       "            &quot;test&quot;: false,\n",
       "            &quot;params&quot;: {\n",
       "                &quot;method&quot;: &quot;opencv&quot;,\n",
       "                &quot;invert_colours&quot;: false,\n",
       "                &quot;raise_error&quot;: false\n",
       "            },\n",
       "            &quot;mode&quot;: &quot;grayscale&quot;\n",
       "        },\n",
       "        {\n",
       "            &quot;name&quot;: &quot;min_max_data_dataset&quot;,\n",
       "            &quot;file_path&quot;: &quot;example_dataset&quot;,\n",
       "            &quot;class_name&quot;: &quot;MyDatasetCustomClass&quot;,\n",
       "            &quot;step_name&quot;: &quot;custom&quot;,\n",
       "            &quot;test&quot;: false,\n",
       "            &quot;processing_type&quot;: &quot;dataset&quot;,\n",
       "            &quot;dependencies&quot;: &quot;scikit-learn&quot;,\n",
       "            &quot;params&quot;: {\n",
       "                &quot;raise_error&quot;: false,\n",
       "                &quot;feature_range&quot;: &quot;(0, 1)&quot;\n",
       "            }\n",
       "        }\n",
       "    ]\n",
       "}</pre><div><pre class=\"ppy-json-block\"><span class=\"ppy-json-key\">general</span>:\n",
       "  <span class=\"ppy-json-key\">name</span>: <span class=\"ppy-json-string\">\"raw\"</span>\n",
       "  <span class=\"ppy-json-key\">step_name</span>: <span class=\"ppy-json-string\">\"open\"</span>\n",
       "  <span class=\"ppy-json-key\">sample_data</span>: <span class=\"ppy-json-string\">\"benthic_csv\"</span>\n",
       "  <span class=\"ppy-json-key\">input_path</span>: <span class=\"ppy-json-string\">\"/home/tobfer/.paidiverpy_cache/benthic_csv/images\"</span>\n",
       "  <span class=\"ppy-json-key\">output_path</span>: <span class=\"ppy-json-string\">\"output\"</span>\n",
       "  <span class=\"ppy-json-key\">metadata_path</span>: <span class=\"ppy-json-string\">\"/home/tobfer/.paidiverpy_cache/benthic_csv/metadata/metadata_benthic_csv.csv\"</span>\n",
       "  <span class=\"ppy-json-key\">metadata_type</span>: <span class=\"ppy-json-string\">\"CSV_FILE\"</span>\n",
       "  <span class=\"ppy-json-key\">image_open_args</span>: <span class=\"ppy-json-string\">\"PNG\"</span>\n",
       "  <span class=\"ppy-json-key\">append_data_to_metadata</span>: <span class=\"ppy-json-string\">\"/home/tobfer/.paidiverpy_cache/benthic_csv/metadata/appended_metadata_benthic_csv.csv\"</span>\n",
       "  <span class=\"ppy-json-key\">n_jobs</span>: <span class=\"ppy-json-number\">1</span>\n",
       "  <span class=\"ppy-json-key\">track_changes</span>: <span class=\"ppy-json-number\">True</span>\n",
       "  <span class=\"ppy-json-key\">rename</span>: <span class=\"ppy-json-string\">\"datetime\"</span>\n",
       "  <span class=\"ppy-json-key\">sampling</span>:\n",
       "    - <span class=\"ppy-json-key\">name</span>: <span class=\"ppy-json-string\">\"sampling\"</span>\n",
       "      <span class=\"ppy-json-key\">step_name</span>: <span class=\"ppy-json-string\">\"sampling\"</span>\n",
       "      <span class=\"ppy-json-key\">test</span>: <span class=\"ppy-json-number\">False</span>\n",
       "      <span class=\"ppy-json-key\">params</span>:\n",
       "        <span class=\"ppy-json-key\">value</span>: <span class=\"ppy-json-number\">0.1</span>\n",
       "        <span class=\"ppy-json-key\">raise_error</span>: <span class=\"ppy-json-number\">False</span>\n",
       "      <span class=\"ppy-json-key\">mode</span>: <span class=\"ppy-json-string\">\"percent\"</span>\n",
       "<span class=\"ppy-json-key\">steps</span>:\n",
       "  - <span class=\"ppy-json-key\">name</span>: <span class=\"ppy-json-string\">\"colour_correction\"</span>\n",
       "    <span class=\"ppy-json-key\">step_name</span>: <span class=\"ppy-json-string\">\"colour\"</span>\n",
       "    <span class=\"ppy-json-key\">test</span>: <span class=\"ppy-json-number\">False</span>\n",
       "    <span class=\"ppy-json-key\">params</span>:\n",
       "      <span class=\"ppy-json-key\">method</span>: <span class=\"ppy-json-string\">\"opencv\"</span>\n",
       "      <span class=\"ppy-json-key\">invert_colours</span>: <span class=\"ppy-json-number\">False</span>\n",
       "      <span class=\"ppy-json-key\">raise_error</span>: <span class=\"ppy-json-number\">False</span>\n",
       "    <span class=\"ppy-json-key\">mode</span>: <span class=\"ppy-json-string\">\"grayscale\"</span>\n",
       "  - <span class=\"ppy-json-key\">name</span>: <span class=\"ppy-json-string\">\"min_max_data_dataset\"</span>\n",
       "    <span class=\"ppy-json-key\">file_path</span>: <span class=\"ppy-json-string\">\"example_dataset\"</span>\n",
       "    <span class=\"ppy-json-key\">class_name</span>: <span class=\"ppy-json-string\">\"MyDatasetCustomClass\"</span>\n",
       "    <span class=\"ppy-json-key\">step_name</span>: <span class=\"ppy-json-string\">\"custom\"</span>\n",
       "    <span class=\"ppy-json-key\">test</span>: <span class=\"ppy-json-number\">False</span>\n",
       "    <span class=\"ppy-json-key\">processing_type</span>: <span class=\"ppy-json-string\">\"dataset\"</span>\n",
       "    <span class=\"ppy-json-key\">dependencies</span>: <span class=\"ppy-json-string\">\"scikit-learn\"</span>\n",
       "    <span class=\"ppy-json-key\">params</span>:\n",
       "      <span class=\"ppy-json-key\">raise_error</span>: <span class=\"ppy-json-number\">False</span>\n",
       "      <span class=\"ppy-json-key\">feature_range</span>: <span class=\"ppy-json-string\">\"(0, 1)\"</span></pre></div></div>"
      ],
      "text/plain": [
       "{\n",
       "    \"general\": {\n",
       "        \"name\": \"raw\",\n",
       "        \"step_name\": \"open\",\n",
       "        \"sample_data\": \"benthic_csv\",\n",
       "        \"input_path\": \"/home/tobfer/.paidiverpy_cache/benthic_csv/images\",\n",
       "        \"output_path\": \"output\",\n",
       "        \"metadata_path\": \"/home/tobfer/.paidiverpy_cache/benthic_csv/metadata/metadata_benthic_csv.csv\",\n",
       "        \"metadata_type\": \"CSV_FILE\",\n",
       "        \"image_open_args\": \"PNG\",\n",
       "        \"append_data_to_metadata\": \"/home/tobfer/.paidiverpy_cache/benthic_csv/metadata/appended_metadata_benthic_csv.csv\",\n",
       "        \"n_jobs\": 1,\n",
       "        \"track_changes\": true,\n",
       "        \"rename\": \"datetime\",\n",
       "        \"sampling\": [\n",
       "            {\n",
       "                \"name\": \"sampling\",\n",
       "                \"step_name\": \"sampling\",\n",
       "                \"test\": false,\n",
       "                \"params\": {\n",
       "                    \"value\": 0.1,\n",
       "                    \"raise_error\": false\n",
       "                },\n",
       "                \"mode\": \"percent\"\n",
       "            }\n",
       "        ]\n",
       "    },\n",
       "    \"steps\": [\n",
       "        {\n",
       "            \"name\": \"colour_correction\",\n",
       "            \"step_name\": \"colour\",\n",
       "            \"test\": false,\n",
       "            \"params\": {\n",
       "                \"method\": \"opencv\",\n",
       "                \"invert_colours\": false,\n",
       "                \"raise_error\": false\n",
       "            },\n",
       "            \"mode\": \"grayscale\"\n",
       "        },\n",
       "        {\n",
       "            \"name\": \"min_max_data_dataset\",\n",
       "            \"file_path\": \"example_dataset\",\n",
       "            \"class_name\": \"MyDatasetCustomClass\",\n",
       "            \"step_name\": \"custom\",\n",
       "            \"test\": false,\n",
       "            \"processing_type\": \"dataset\",\n",
       "            \"dependencies\": \"scikit-learn\",\n",
       "            \"params\": {\n",
       "                \"raise_error\": false,\n",
       "                \"feature_range\": \"(0, 1)\"\n",
       "            }\n",
       "        }\n",
       "    ]\n",
       "}"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pipeline.config"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "a513b4e4-a820-4b37-8dbe-afab06d2dd4b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[92m☁ paidiverpy ☁  |       INFO | 2025-09-11 16:48:18 | Processing images using 1 cores\u001b[0m\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:paidiverpy:Processing images using 1 cores\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[92m☁ paidiverpy ☁  |       INFO | 2025-09-11 16:48:18 | Running step 0: raw - OpenLayer\u001b[0m\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:paidiverpy:Running step 0: raw - OpenLayer\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[92m☁ paidiverpy ☁  |       INFO | 2025-09-11 16:48:18 | Step 0 completed\u001b[0m\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:paidiverpy:Step 0 completed\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[92m☁ paidiverpy ☁  |       INFO | 2025-09-11 16:48:19 | Running step 1: colour_correction - ColourLayer\u001b[0m\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:paidiverpy:Running step 1: colour_correction - ColourLayer\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[92m☁ paidiverpy ☁  |       INFO | 2025-09-11 16:48:19 | Step 1 completed\u001b[0m\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:paidiverpy:Step 1 completed\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[92m☁ paidiverpy ☁  |       INFO | 2025-09-11 16:48:19 | Running step 2: min_max_data_dataset - CustomLayer\u001b[0m\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:paidiverpy:Running step 2: min_max_data_dataset - CustomLayer\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[92m☁ paidiverpy ☁  |       INFO | 2025-09-11 16:48:19 | Step 2 completed\u001b[0m\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:paidiverpy:Step 2 completed\n"
     ]
    }
   ],
   "source": [
    "pipeline.run()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "f1641c90-27e5-4434-852e-f372b9ef8694",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div><svg style=\"position: absolute; width: 0; height: 0; overflow: hidden\">\n",
       "<defs>\n",
       "<symbol id=\"arrow-right\" viewBox=\"0 0 330 330\">\n",
       "  <path id=\"XMLID_222_\" d=\"M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001\n",
       "\tc-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213\n",
       "\tC82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606\n",
       "\tC255,161.018,253.42,157.202,250.606,154.389z\"/>\n",
       "</defs>\n",
       "</svg>\n",
       "<style>/* CSS stylesheet for displaying Paidiverpy objects in jupyterlab.\n",
       " *\n",
       " */\n",
       "\n",
       ":root {\n",
       "  --ppy-font-color: var(--jp-content-font-color, rgba(0, 0, 0, 1));\n",
       "  --ppy-font-color-brown: var(--jp-content-font-color-brown, brown);\n",
       "  --ppy-font-color-olive: var(--jp-content-font-color-olive, olive);\n",
       "  --ppy-font-color-teal: var(--jp-content-font-color-teal, teal);\n",
       "  --ppy-font-color-blue: var(--jp-content-font-color-blue, blue);\n",
       "  --ppy-font-color-gray: var(--jp-content-font-color-gray, gray);\n",
       "  --ppy-border-color: var(--jp-border-color2, #e0e0e0);\n",
       "  --ppy-disabled-color: var(--jp-layout-color3, #bdbdbd);\n",
       "  --ppy-background-color: var(--jp-layout-color, white);\n",
       "  --ppy-background-color2: var(--jp-layout-color3, rgba(212, 212, 212, 0.15));\n",
       "}\n",
       "\n",
       "\n",
       "html[theme=\"dark\"],\n",
       "html[data-theme=\"dark\"],\n",
       "body[data-theme=\"dark\"],\n",
       "body.vscode-dark {\n",
       "  --ppy-font-color: rgba(255, 255, 255, 1);\n",
       "  --ppy-font-color-brown: brown;\n",
       "  --ppy-font-color-olive: olive;\n",
       "  --ppy-font-color-teal: teal;\n",
       "  --ppy-font-color-blue: blue;\n",
       "  --ppy-font-color-gray: gray;\n",
       "  --ppy-border-color: #1f1f1f;\n",
       "  --ppy-disabled-color: #515151;\n",
       "  --ppy-background-color: #111111;\n",
       "}\n",
       "\n",
       ".ppy-background-color {\n",
       "  background-color: var(--ppy-background-color) !important;\n",
       "}\n",
       "\n",
       ".ppy-font-color-brown {\n",
       "  color: var(--ppy-font-color-brown) !important;\n",
       "}\n",
       "\n",
       ".ppy-font-color {\n",
       "  color: var(--ppy-font-color) !important;\n",
       "}\n",
       ".ppy-h2 {\n",
       "  font-size: 20px !important;\n",
       "}\n",
       ".ppy-h3 {\n",
       "  font-size: 13px !important;\n",
       "}\n",
       ".ppy-p {\n",
       "  font-size: 10px;\n",
       "}\n",
       ".ppy-p-error {\n",
       "  color: var(--ppy-font-color-brown);\n",
       "  font-weight: bold;\n",
       "  display: block;\n",
       "}\n",
       "\n",
       ".ppy-text-repr-fallback {\n",
       "  /* fallback to plain text repr when CSS is not injected (untrusted notebook) */\n",
       "  display: none;\n",
       "}\n",
       "\n",
       ".ppy-pipeline-wrap{\n",
       "  display: flex;\n",
       "  flex-wrap: wrap;\n",
       "  align-items: center;\n",
       "}\n",
       "\n",
       ".ppy-pipeline {\n",
       "  float:left;\n",
       "  cursor: pointer;\n",
       "  padding: 10px;\n",
       "  width: max-content;\n",
       "  height: 150px;\n",
       "  margin: 10px;\n",
       "  border: 1px solid #000;\n",
       "  text-align: center;\n",
       "  /* line-height: 80px; */\n",
       "}\n",
       "\n",
       ".ppy-pipeline-clear-fix {\n",
       "  clear: both;\n",
       "}\n",
       "\n",
       ".ppy-pipeline-parameters-all {\n",
       "  padding: 10px;\n",
       "  margin: 10px;\n",
       "}\n",
       "\n",
       ".ppy-images-step-header {\n",
       "  cursor: pointer;\n",
       "  font-weight: bold;\n",
       "  margin-top: 10px;\n",
       "  margin-bottom: 5px;\n",
       "}\n",
       ".ppy-images-metadata {\n",
       "  margin-left: 20px;\n",
       "  margin-bottom: 10px;\n",
       "}\n",
       ".ppy-images {\n",
       "  display: flex;\n",
       "  flex-wrap: wrap;\n",
       "  gap: 10px;\n",
       "  margin-left: 20px;\n",
       "}\n",
       "\n",
       ".ppy-show-more-button, .ppy-hide-button {\n",
       "  margin-left: 20px;\n",
       "  background-color: #007bff;\n",
       "  color: white;\n",
       "  border: none;\n",
       "  padding: 5px 10px;\n",
       "  cursor: pointer;\n",
       "}\n",
       "\n",
       "\n",
       ".ppy-pipeline-arrow {\n",
       "  float:left;\n",
       "  width: 50px;\n",
       "  height: 80px;\n",
       "  margin: 10px;\n",
       "  text-align: center;\n",
       "  line-height: 80px;\n",
       "}\n",
       "\n",
       ".ppy-images-img{\n",
       "  display: block;\n",
       "  max-width: 200px;\n",
       "  margin: 10px;\n",
       "}\n",
       "\n",
       ".ppy-images-toggle-arrow {\n",
       "  cursor: pointer;\n",
       "  margin-left: 5px;\n",
       "}\n",
       "\n",
       ".ppy-images-image-p {\n",
       "  cursor: pointer;\n",
       "}\n",
       "\n",
       ".ppy-arrow-right {\n",
       "  display: inline-block;\n",
       "  vertical-align: middle;\n",
       "  width: 1em;\n",
       "  height: 1.5em !important;\n",
       "  stroke-width: 0;\n",
       "  stroke: currentColor;\n",
       "  fill: currentColor;\n",
       "}\n",
       "\n",
       "\n",
       ".ppy-json-block {\n",
       "  font-family: monospace;\n",
       "  background: var(--ppy-background-color);\n",
       "  padding: 1em;\n",
       "  border-radius: 6px;\n",
       "}\n",
       ".ppy-json-key {\n",
       "  color: var(--ppy-font-color-brown);\n",
       "}\n",
       ".ppy-json-string {\n",
       "  color: var(--ppy-font-color-olive);\n",
       "}\n",
       ".ppy-json-number {\n",
       "  color: var(--ppy-font-color-teal);\n",
       "}\n",
       ".ppy-json-bool {\n",
       "  color: var(--ppy-font-color-blue);\n",
       "}\n",
       ".ppy-json-null {\n",
       "  color: var(--ppy-font-color-gray);\n",
       "}\n",
       "\n",
       "\n",
       ".ppy-pn-title-0 {\n",
       "  font-size: 30px;\n",
       "}\n",
       "\n",
       ".ppy-pn-title-1 {\n",
       "  font-size: 20px;\n",
       "}\n",
       ".ppy-pn-title-2 {\n",
       "  font-size: 17px;\n",
       "}\n",
       ".ppy-pn-title-3 {\n",
       "  font-size: 14px;\n",
       "}\n",
       ".ppy-pn-title-4 {\n",
       "  font-size: 12px;\n",
       "}\n",
       "\n",
       ".ppy-pn-bold {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".ppy-pn-italic {\n",
       "  font-style: italic;\n",
       "}\n",
       ".ppy-pn-description {\n",
       "  font-size: 14px;\n",
       "  margin-bottom: 1px;\n",
       "}\n",
       "\n",
       ".bk-root {\n",
       "  width: 100% !important;\n",
       "  max-width: 100% !important;\n",
       "  box-sizing: border-box;\n",
       "}\n",
       "\n",
       "input, .bk-input, .bk-input-group {\n",
       "  margin-top: 0px;\n",
       "  margin-bottom: 3px;\n",
       "  padding-top: 0px;\n",
       "  padding-bottom: 0px;\n",
       "}\n",
       "\n",
       ".ppy-pn-header-button .bk-btn {\n",
       "  background: none !important;\n",
       "  border: none !important;\n",
       "  font-weight: bold;\n",
       "  font-size: 16px;\n",
       "  text-align: left;\n",
       "  padding-left: 0;\n",
       "  cursor: pointer;\n",
       "  box-shadow: none !important;\n",
       "  color: black;\n",
       "}\n",
       "\n",
       ".ppy-pn-danger-modal{\n",
       "  border: 2px solid red;\n",
       "  border-radius: 10px;\n",
       "  box-shadow: 0px 0px 10px rgba(255, 0, 0, 0.5);\n",
       "}\n",
       "\n",
       ".ppy-pn-config-form{\n",
       "  padding: 10px;\n",
       "  margin-top: 10px;\n",
       "  margin-bottom: 10px;\n",
       "  background-color: var(--ppy-background-color2);\n",
       "  border-radius: 5px;\n",
       "  box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1);\n",
       "}\n",
       "\n",
       "\n",
       ".ppy-pn-align-right {\n",
       "  display: flex;\n",
       "  justify-content: flex-end;\n",
       "}\n",
       "</style><script>function toggleMetadata(stepIndex, randomId) {\n",
       "  var metadata = document.getElementById(\"ppy-images-metadata-\" + randomId + \"-\" + stepIndex);\n",
       "  var arrow = document.getElementById(\"ppy-images-arrow-\" + randomId + \"-\" + stepIndex);\n",
       "  if (metadata.style.display === \"none\") {\n",
       "      metadata.style.display = \"block\";\n",
       "      arrow.innerHTML = \"▼\";\n",
       "      arrow.classList.remove(\"ppy-font-color\");\n",
       "      arrow.classList.add(\"ppy-font-color-brown\");\n",
       "  } else {\n",
       "      metadata.style.display = \"none\";\n",
       "      arrow.innerHTML = \"►\";\n",
       "      arrow.classList.remove(\"ppy-font-color-brown\");\n",
       "      arrow.classList.add(\"ppy-font-color\");\n",
       "  }\n",
       "}\n",
       "function toggleImage(imageId, randomId) {\n",
       "  var img = document.getElementById(imageId);\n",
       "  var arrow = document.getElementById(\"ppy-images-arrow-\" + randomId + \"-\" + imageId);\n",
       "  if (img.style.display === \"none\") {\n",
       "      img.style.display = \"block\";\n",
       "      arrow.innerHTML = \"▼\";\n",
       "      arrow.classList.remove(\"ppy-font-color\");\n",
       "      arrow.classList.add(\"ppy-font-color-brown\");\n",
       "  } else {\n",
       "      img.style.display = \"none\";\n",
       "      arrow.innerHTML = \"►\";\n",
       "      arrow.classList.remove(\"ppy-font-color-brown\");\n",
       "      arrow.classList.add(\"ppy-font-color\");\n",
       "  }\n",
       "}\n",
       "function showMore(stepIndex) {\n",
       "  var moreImages = document.getElementById(\"ppy-more-images-\" + stepIndex);\n",
       "  var showMoreButton = document.getElementById(\"ppy-show-more-button-\" + stepIndex);\n",
       "  var hideButton = document.getElementById(\"ppy-hide-button-\" + stepIndex);\n",
       "  moreImages.style.display = \"flex\";\n",
       "  showMoreButton.style.display = \"none\";\n",
       "  hideButton.style.display = \"inline-block\";\n",
       "}\n",
       "function hide(stepIndex) {\n",
       "  var moreImages = document.getElementById(\"ppy-more-images-\" + stepIndex);\n",
       "  var showMoreButton = document.getElementById(\"ppy-show-more-button-\" + stepIndex);\n",
       "  var hideButton = document.getElementById(\"ppy-hide-button-\" + stepIndex);\n",
       "  moreImages.style.display = \"none\";\n",
       "  showMoreButton.style.display = \"inline-block\";\n",
       "  hideButton.style.display = \"none\";\n",
       "}\n",
       "\n",
       "\n",
       "function showParameters(id, randomId) {\n",
       "  var currentTarget = document.getElementById('ppy-pipeline-' + randomId + '-' + id);\n",
       "  var square = document.getElementsByClassName('ppy-pipeline-' + randomId);\n",
       "  var allParams = document.getElementsByClassName('ppy-pipeline-parameters-' + randomId);\n",
       "  var selectedParams = document.getElementById('ppy-pipeline-parameters-' + randomId + '-' + id);\n",
       "  var idWasVisible = false;\n",
       "  if (selectedParams) {\n",
       "      var idWasVisible = selectedParams.style.display === 'block';\n",
       "  }\n",
       "  for (var i = 0; i < square.length; i++) {\n",
       "      square[i].classList.remove('ppy-font-color-brown');\n",
       "      square[i].classList.add('ppy-font-color');\n",
       "  }\n",
       "  for (var i = 0; i < allParams.length; i++) {\n",
       "      allParams[i].style.display = 'none';\n",
       "  }\n",
       "  // Show the selected parameter section\n",
       "  if (selectedParams) {\n",
       "      if (idWasVisible) {\n",
       "          selectedParams.style.display = 'none';\n",
       "          currentTarget.classList.remove('ppy-font-color-brown');\n",
       "          currentTarget.classList.add('ppy-font-color');\n",
       "      } else {\n",
       "          selectedParams.style.display = 'block';\n",
       "          currentTarget.classList.remove('ppy-font-color');\n",
       "          currentTarget.classList.add('ppy-font-color-brown');\n",
       "      }\n",
       "  }\n",
       "}\n",
       "\n",
       "hljs.highlightAll();\n",
       "</script><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github.min.css\"><script src=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js\"></script><script>hljs.highlightAll();</script><pre class='ppy-text-repr-fallback'>&lt;paidiverpy.images_layer.ImagesLayer object at 0x74dcda5f73a0&gt;</pre><div>\n",
       "            <div class='ppy-h2 ppy-images-step-header' onclick='toggleMetadata(0, \"rrw\")'>\n",
       "                Step 0: raw\n",
       "                <span id='ppy-images-arrow-rrw-0'\n",
       "                    class='ppy-images-toggle-arrow ppy-font-color-brown'>▼\n",
       "                </span>\n",
       "            </div>\n",
       "            <div id='ppy-images-metadata-rrw-0' class='ppy-images-metadata' style='display:block;'><div class='ppy-images'>\n",
       "        <div>\n",
       "            <p onclick='toggleImage(\"image-rrw-0-0\", \"rrw\")' class=\"ppy-images-image-p\" >\n",
       "                Image: 2018-06-11T04:14:31\n",
       "                <span id='ppy-images-arrow-rrw-image-rrw-0-0' class='ppy-images-toggle-arrow ppy-font-color-brown'>▼</span>\n",
       "            </p>\n",
       "        \n",
       "            <img id='image-rrw-0-0'\n",
       "                src='data:image/png;base64,[encoded data, 30992 characters]'\n",
       "                class='ppy-images-img'/></div>\n",
       "            \n",
       "        <div>\n",
       "            <p onclick='toggleImage(\"image-rrw-0-1\", \"rrw\")' class=\"ppy-images-image-p\" >\n",
       "                Image: 2018-06-11T04:17:21\n",
       "                <span id='ppy-images-arrow-rrw-image-rrw-0-1' class='ppy-images-toggle-arrow ppy-font-color-brown'>▼</span>\n",
       "            </p>\n",
       "        \n",
       "            <img id='image-rrw-0-1'\n",
       "                src='data:image/png;base64,[encoded data, 36088 characters]'\n",
       "                class='ppy-images-img'/></div>\n",
       "            \n",
       "        <div>\n",
       "            <p onclick='toggleImage(\"image-rrw-0-2\", \"rrw\")' class=\"ppy-images-image-p\" >\n",
       "                Image: 2018-06-11T04:17:41\n",
       "                <span id='ppy-images-arrow-rrw-image-rrw-0-2' class='ppy-images-toggle-arrow ppy-font-color-brown'>▼</span>\n",
       "            </p>\n",
       "        \n",
       "            <img id='image-rrw-0-2'\n",
       "                src='data:image/png;base64,[encoded data, 38268 characters]'\n",
       "                class='ppy-images-img'/></div>\n",
       "            \n",
       "        <div>\n",
       "            <p onclick='toggleImage(\"image-rrw-0-3\", \"rrw\")' class=\"ppy-images-image-p\" >\n",
       "                Image: 2018-06-11T04:17:51\n",
       "                <span id='ppy-images-arrow-rrw-image-rrw-0-3' class='ppy-images-toggle-arrow ppy-font-color-brown'>▼</span>\n",
       "            </p>\n",
       "        \n",
       "            <img id='image-rrw-0-3'\n",
       "                src='data:image/png;base64,[encoded data, 38584 characters]'\n",
       "                class='ppy-images-img'/></div>\n",
       "            \n",
       "        <div>\n",
       "            <p onclick='toggleImage(\"image-rrw-0-4\", \"rrw\")' class=\"ppy-images-image-p\" >\n",
       "                Image: 2018-06-11T04:20:01\n",
       "                <span id='ppy-images-arrow-rrw-image-rrw-0-4' class='ppy-images-toggle-arrow ppy-font-color-brown'>▼</span>\n",
       "            </p>\n",
       "        \n",
       "            <img id='image-rrw-0-4'\n",
       "                src='data:image/png;base64,[encoded data, 42456 characters]'\n",
       "                class='ppy-images-img'/></div>\n",
       "            </div></div>\n",
       "            <div class='ppy-h2 ppy-images-step-header' onclick='toggleMetadata(1, \"rrw\")'>\n",
       "                Step 1: colour_correction\n",
       "                <span id='ppy-images-arrow-rrw-1'\n",
       "                    class='ppy-images-toggle-arrow ppy-font-color-brown'>▼\n",
       "                </span>\n",
       "            </div>\n",
       "            <div id='ppy-images-metadata-rrw-1' class='ppy-images-metadata' style='display:block;'><div class='ppy-images'>\n",
       "        <div>\n",
       "            <p onclick='toggleImage(\"image-rrw-1-0\", \"rrw\")' class=\"ppy-images-image-p\" >\n",
       "                Image: 2018-06-11T04:14:31\n",
       "                <span id='ppy-images-arrow-rrw-image-rrw-1-0' class='ppy-images-toggle-arrow ppy-font-color-brown'>▼</span>\n",
       "            </p>\n",
       "        \n",
       "            <img id='image-rrw-1-0'\n",
       "                src='data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCACAAIABAREA/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEBAAA/AOwxxSYyaawqI+lBWjbTgtLjNPVcVIoqUCngVItPUVKBTwKyCKb0prGo8U/HFIR6Cj+VOAqQCngVKq1IFp4WpFWpAKeBWQRxTSOKjIzSYoxQRQRz1pyipAM09RUyipAKeBUiipQKUCsikIphHNNIoxTTSd6eB3qRRxUiipFFSrUqipAKkApwFYvSkJphoxzTTwaTtSY5qRRUiipFFSqKkAqVRUiipAKUViGm000UYzTSO1GKetSDiplqRakAqRakWpBTsViEcUwjHamkZpAKcBSEUmKUVIvWplqVRUop4FSKKfTxWKRnimEUw0AUvSg0mKMYp69amWplqQVItSilHWpFrGaozTMUClIoxRSU9RUoqValFSipAaUVItZBFRsKjooHWlzSUtOFPXrUyVKKkWpBTlqRayj0qNqiNJRRQOtLTgKkFSLUqmpFqQGnA1ItZbVGx4qLk0lJR0opw5p4pwqRTUimpVNPBp4NPU1mmomHrTDxTabSUoNPB5pwNOzT1NSKealBpwPFPU1IKziajamGo2NJnFJmjNOVqcDUgNOFSL1qQGnA1Ip5qYHiswmmMajNMOabRRQDTgTUoNPBp4NPBp6mpVNSqazvrUb1ETSUyg9KTPNKDTgaepp4NPBqRTUgNSKalU1//9k='\n",
       "                class='ppy-images-img'/></div>\n",
       "            \n",
       "        <div>\n",
       "            <p onclick='toggleImage(\"image-rrw-1-1\", \"rrw\")' class=\"ppy-images-image-p\" >\n",
       "                Image: 2018-06-11T04:17:21\n",
       "                <span id='ppy-images-arrow-rrw-image-rrw-1-1' class='ppy-images-toggle-arrow ppy-font-color-brown'>▼</span>\n",
       "            </p>\n",
       "        \n",
       "            <img id='image-rrw-1-1'\n",
       "                src='data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCACAAIABAREA/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEBAAA/AOiIINKD6U0HnrTs5pjiqz9feosfhUmPlzTk5qYDHNP9KAKcBxRS9KXOKYTk4pjHBpA2TTt3r6U0sCKrN940AUpPy06OpwOKTODUgOQKfj0pMc5pe1NIpv8AOmsMjFMxgZpucg0HPemle9NK5HvS7eKco9TUwYGkYfnSqcCpAacKXHFIR2qM8UznNIx+WoQxB5p+cikNB+tKOBzSH2zSo1Sn5gKQDtUinFSClNIOPrUR60081GTxUTAhuacppSKQE5pT7UhPGKTdUqnIqRRz1p+KcM5p+KacA1ExwKi3Z701jxUZPJpAeuKlB4pVFGKjajGTUqj2qVcVIOlLSk4ppqu5qKkJNREn0puTip0OcVOo79qY5496j6Uo7VKvSpU5IqT1o5OKXvQRVNuetNPFNY1Cx+amg5bHepk6CplbC0hORUZIyRTwMjrUyjjFSLTx+lOAyKULxQelUMfhQfrTD6VC3GaiydwNTq3pUmcDHWnD7tRHrUsZ4qft1pynNOzzjNPB4pQ3GKQtVPJNJmo261C5JNR5z657VIh4xUoxmnk8YzTQOKegA4zUozTx2o/GnZxS7j60ZqqDxTCSM1Hu5IpGAIxnmoCNpp6EYzUoODTi2cU6nJ1qVafSmgUoznnpTSfSqiyqw+Ug/Smsw5po5NDZz1qJ+KYnXrVgYxgd6djilBxUqDvUooJzTgaAfehh+dMP3aybYBCSCTjg/WpS3NPU8gjj0p7DNR44Jxk+9IqDiplQ96Ug0Y6GpIzgCpRzS0ZIBoB4p2c01uc1iRfIgXPbrU4qb+EU84OKZ0JGKXFTpz1p2ATTWxTV61KjcU7NIfWjNOU+lHbFYaHOBmp1J6VMDjNHzEZGSPanbW6lT+VLg5BIIqYe1KOlJSYApVPFKWpcjFKOlOHA5peMVl2kVqqCS6kdd33UTr9akuRBG6+RJvQjIJ6j61WM3OBU9rGkiSl5VXavA55NMUOSEAO7sMdassrQxxlt4ds5DAjipUlfOD/KpTIFVSQpz146VC1wp/g4+tJLKoVSFHzDP05/+tUazAHkZGan8xSoYp1700SqTjHapd2DjGCOtOpAfyr/2Q=='\n",
       "                class='ppy-images-img'/></div>\n",
       "            \n",
       "        <div>\n",
       "            <p onclick='toggleImage(\"image-rrw-1-2\", \"rrw\")' class=\"ppy-images-image-p\" >\n",
       "                Image: 2018-06-11T04:17:41\n",
       "                <span id='ppy-images-arrow-rrw-image-rrw-1-2' class='ppy-images-toggle-arrow ppy-font-color-brown'>▼</span>\n",
       "            </p>\n",
       "        \n",
       "            <img id='image-rrw-1-2'\n",
       "                src='data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCACAAIABAREA/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEBAAA/AG7McAcU8LgA4pDGOtKFxxg8U4DIFMdagZNx9qglXg47CoUTIJI6VPDFhskVcZfkBzUMmAp71CI8DpzSldpA7npTipHWomGc1rMvcCmkfMCf1NPC8UhTjpxS7PkqNgcn6VCU+U+tQsgPTrSCLnHT6VNEmAalZfl/WoXTJyRg1Ecrx2oChpBkcVI4OOAKh244PNbG000rk9/xpVUc8U/bxTStRleeRUbDnpmmCLnNO8vv60uzjtQR8v8AWo24qCUdD/KlhwRUhFRMvFbIXmjZg0gXFGO2KQjHSmECkZOc4pBHke1NIw3rRjJ56fWmkdaikX5TVR2GOTzSQ8c571Y7imHjNb23jjk0wrzRjHakK5FAFRlcn0FBQ9CKTAwcVGc9+abgdhg009BUcnKnt6VTkQE5FNVtvfHeplYGh1z0roTHimsvTNMK/lRnt2pvT3oxTTwMVHg5NDrxmmkd6iI4xgUxkyPSqrpgmoZEzzTkI4GOKmPb+ldIx9BmomINRsc00enOaCD+FKOlIw4pmOtNPQ0w4ximEd8Uh5PNVnUgmoWBxTVTHapdv0roGOKjPJ4pcZqNl56YoIPSjp3pCaYRleKCB7UwjnjrRt4HrUbL+tRMuRioHWmH0qRB7ittuaAuadt9KayAVD0JpevNITSfWmt3pBRn/wDXTTg5qLAFQMRnmqrtggnpUiSDkg1vHkinrj0pw7Cmv0qsclulKAc+tOI600rgUxj6mo2yKTdxSbs4GKjdufwqCTnNV2APWo+j10vWngetOA9KH6VCRzR2z6UnbNNJGDUTVFnLY70Hk5prHioZDmo25qJlO0nPAOOtV5QNtdQMYzT+cUoJ5obpUZ6mmE44ppNNLCmNUYHeg/pTGI4BHHeqzH5uaYW5qNuD/wDWqGU8AcV0SEAcVMrGpMZprE4qNjgVCWyaaTjmk3UhPWmZzSE9faoXYk1XZietNOKaT06ECoZduepx6V0C8KMVIGz/APXqVW+Wkc/LUBbJPNRk88mms3vTdwPFIxNM54p3sagkIxx+FVjnqKcOnX8ahLDnPaoJOWOOgrolbipFOfanB8GlYll/wqFg3YGoXJB5qJjn/wDVSjOMjpTzjGCKaBxzS56EdqicDpVd1APWoixyQO1MK55OKay5BOK6C3SLy1aZiM9AvWpJVRCPLfcpGeag3fN/Kpo1Vo33OAQOKrEHcFGd3YAdaSZWhjUksGOeGGKh8+YMo/TAqZrjZs3Kjbhz8vTk/wBKa91GTjyxj60k0qoiEIPnXd9Ocf0qNJQoyyZB96JLhAgZoiAeAfXH41Qe8hJwUJOOMH+dK7KkhTaVdDhvT0p55A6801lx9DX/2Q=='\n",
       "                class='ppy-images-img'/></div>\n",
       "            \n",
       "        <div>\n",
       "            <p onclick='toggleImage(\"image-rrw-1-3\", \"rrw\")' class=\"ppy-images-image-p\" >\n",
       "                Image: 2018-06-11T04:17:51\n",
       "                <span id='ppy-images-arrow-rrw-image-rrw-1-3' class='ppy-images-toggle-arrow ppy-font-color-brown'>▼</span>\n",
       "            </p>\n",
       "        \n",
       "            <img id='image-rrw-1-3'\n",
       "                src='data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCACAAIABAREA/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEBAAA/AHbBj3pQMnH60jdTxSe+Kmj+btQ64NJgkVCyHPA+tJtHcge1Tw4wVzUqjPFMkUYqAphTVcjk00rj6U3AxxWkq7qftA4qN04qEnBxU8fAz3qQgMaXbxUEq8nGahKkU8ICRg4NTB9p5NOPzYpjAEe9VzH82SaQxgd6hcenWtHGOlOAJpX6c1VdBkVNGAPSrCJmn7feoJEquUxSDjr0ofnBBNPDEAfSnEblyPyqI564qJuvWoyO9a3l5NAQqeh5odOMVXaMnIAzzUkcRHWrAG1aQnvUTYxyeagkODURORSBhikEoBIJ4p4mGMU0yfN7GmycEU0jNdD5WOaQx4zxUTRnNM8vBpGOzrSZLDPSopCcVCSQcg004YVC5CjNVXuFHIFV3ut/OMEVPFIGGM1KzArjPIoV+NpP0oyc11YwaGXFQuMcmoXYCq8hBpo4NJJ93NV+1NfgYHaoJcnvVGVcZNVJOB60iOV5Bq9EWMfJOetTEZHHWngbhuHUda6lSeTTt4IqGQ8Y7VVkPNQk5IxRmmscrUDDFNY/LULH1qpOMKD0rPlPrSwKCegzV+MdSe1HmZzToHIYmunDe9OZufemluuaruf1qMjk4qMnHXNGeKY3SoX4JqFsbqrXAwtZ0nJqWBemKuqu3iq8isj5xkehqZFwvuT1rpwRijPvTWPAqLqTxQVIqFgBSZ96Yx/Ooj0qtJw1VbhstjtVMn5hxwKuQqCMjvVpV4GagmGMHBNOVhgcdK6DJA4oX1J5NKcUi96azcH0qBuWpp+XGKY3fNRPkA4qpNnGe/rVJmyeelQuCTkdqswEqMZ5q+p4yDUTjOc+tRMCj4A610BalzleKAwxTl5GRTGGO1MKjNRsaj700j0FV5VBGO1UJIcE4qudwPIwPepYyC+ARV2NsAZ4OKHYEcGo3IH19K1lmD8qQR9amD+/FITmpEbIxSk55qOTjNVyefSozweaax596aRnqKa0AKk4+lVGjPmDsRUBRlIIHT2qVH3Ken4UrE44qHccEN1rRtVCcqScDBz61cDfnT93HJ6Uqmnh+1Mdsrmq78+ue1MJx159aYASR9elSY5608jjFVnXnjg+9RSpleOtUTlJCPXkU8MT7U1+2K1YQUiVfQdalHOKlBBNIGGT2pQ5xwaCxPFIUJ7cVE6c0EcA0o4+lAPBqBjg0wnjFUJh+/PHB9KYDjkZppYnrj8K2Y2H51Kpweaaz7egznrT1VmXcOc+9SKjDPyn8aftIycUnSoyMjNMbjFN78mnnpnFVpOtQlwDioZBk1GqhT8w/AUhXJzgc+lblnDapEsl5I67uVSPr9adeRwR4NtKZI2XIz1HsazjIWkCDj1q9ZwxyJKXkVdq/KCDyfwoMb7woyWPQVO6vDEm7crnOQwPSovPlXg9enSla4CBdwRtwyePunNRtdRkf6ofnTJ5lRUIRRvXd16c4x+lQm6VOWTcM9M017yIRLI8BCsSFOODj8apfbrdmIMTFsYGG4J96klkVZXjKFZEO1+eBjj/ADzTdh5OaY2VFf/Z'\n",
       "                class='ppy-images-img'/></div>\n",
       "            \n",
       "        <div>\n",
       "            <p onclick='toggleImage(\"image-rrw-1-4\", \"rrw\")' class=\"ppy-images-image-p\" >\n",
       "                Image: 2018-06-11T04:20:01\n",
       "                <span id='ppy-images-arrow-rrw-image-rrw-1-4' class='ppy-images-toggle-arrow ppy-font-color-brown'>▼</span>\n",
       "            </p>\n",
       "        \n",
       "            <img id='image-rrw-1-4'\n",
       "                src='data:image/jpeg;base64,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'\n",
       "                class='ppy-images-img'/></div>\n",
       "            </div></div>\n",
       "            <div class='ppy-h2 ppy-images-step-header' onclick='toggleMetadata(2, \"rrw\")'>\n",
       "                Step 2: min_max_data_dataset\n",
       "                <span id='ppy-images-arrow-rrw-2'\n",
       "                    class='ppy-images-toggle-arrow ppy-font-color-brown'>▼\n",
       "                </span>\n",
       "            </div>\n",
       "            <div id='ppy-images-metadata-rrw-2' class='ppy-images-metadata' style='display:block;'><div class='ppy-images'>\n",
       "        <div>\n",
       "            <p onclick='toggleImage(\"image-rrw-2-0\", \"rrw\")' class=\"ppy-images-image-p\" >\n",
       "                Image: 2018-06-11T04:14:31\n",
       "                <span id='ppy-images-arrow-rrw-image-rrw-2-0' class='ppy-images-toggle-arrow ppy-font-color-brown'>▼</span>\n",
       "            </p>\n",
       "        \n",
       "            <img id='image-rrw-2-0'\n",
       "                src='data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCACAAIABAREA/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEBAAA/APAKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKSlooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooor/9k='\n",
       "                class='ppy-images-img'/></div>\n",
       "            \n",
       "        <div>\n",
       "            <p onclick='toggleImage(\"image-rrw-2-1\", \"rrw\")' class=\"ppy-images-image-p\" >\n",
       "                Image: 2018-06-11T04:17:21\n",
       "                <span id='ppy-images-arrow-rrw-image-rrw-2-1' class='ppy-images-toggle-arrow ppy-font-color-brown'>▼</span>\n",
       "            </p>\n",
       "        \n",
       "            <img id='image-rrw-2-1'\n",
       "                src='data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCACAAIABAREA/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEBAAA/APn+iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiv/9k='\n",
       "                class='ppy-images-img'/></div>\n",
       "            \n",
       "        <div>\n",
       "            <p onclick='toggleImage(\"image-rrw-2-2\", \"rrw\")' class=\"ppy-images-image-p\" >\n",
       "                Image: 2018-06-11T04:17:41\n",
       "                <span id='ppy-images-arrow-rrw-image-rrw-2-2' class='ppy-images-toggle-arrow ppy-font-color-brown'>▼</span>\n",
       "            </p>\n",
       "        \n",
       "            <img id='image-rrw-2-2'\n",
       "                src='data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCACAAIABAREA/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEBAAA/APn+iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiv/9k='\n",
       "                class='ppy-images-img'/></div>\n",
       "            \n",
       "        <div>\n",
       "            <p onclick='toggleImage(\"image-rrw-2-3\", \"rrw\")' class=\"ppy-images-image-p\" >\n",
       "                Image: 2018-06-11T04:17:51\n",
       "                <span id='ppy-images-arrow-rrw-image-rrw-2-3' class='ppy-images-toggle-arrow ppy-font-color-brown'>▼</span>\n",
       "            </p>\n",
       "        \n",
       "            <img id='image-rrw-2-3'\n",
       "                src='data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCACAAIABAREA/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEBAAA/APn+iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiv/9k='\n",
       "                class='ppy-images-img'/></div>\n",
       "            \n",
       "        <div>\n",
       "            <p onclick='toggleImage(\"image-rrw-2-4\", \"rrw\")' class=\"ppy-images-image-p\" >\n",
       "                Image: 2018-06-11T04:20:01\n",
       "                <span id='ppy-images-arrow-rrw-image-rrw-2-4' class='ppy-images-toggle-arrow ppy-font-color-brown'>▼</span>\n",
       "            </p>\n",
       "        \n",
       "            <img id='image-rrw-2-4'\n",
       "                src='data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCACAAIABAREA/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEBAAA/APn+iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiv/9k='\n",
       "                class='ppy-images-img'/></div>\n",
       "            </div></div></div></div>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pipeline.images()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5526f79c-95b4-4f72-a629-5a143fe3d0f7",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "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.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
