Parcourir la source

Merge remote-tracking branch 'upstream/master'

jqueguiner il y a 6 ans
Parent
commit
8c7ec73a04
100 fichiers modifiés avec 905 ajouts et 307 suppressions
  1. 0 4
      .vscode/settings.json
  2. 2 2
      ColorizeTrainingArtistic.ipynb
  3. 2 2
      ColorizeTrainingStable.ipynb
  4. 779 0
      ColorizeTrainingStableLargeBatch.ipynb
  5. 2 2
      ColorizeTrainingVideo.ipynb
  6. 1 1
      Dockerfile
  7. 46 0
      Dockerfile-api
  8. 48 15
      README.md
  9. 1 1
      fasterai/dataset.py
  10. 2 2
      fasterai/unet.py
  11. 22 11
      fasterai/visualize.py
  12. 0 3
      resource_images/0_LivingRoom1920Sweden_artistic_RF46.jpg
  13. 0 3
      resource_images/0_LivingRoom1920Sweden_artistic_RF46_compared.jpg
  14. 0 3
      resource_images/0_LivingRoom1920Sweden_artistic_RF46_compared_sm.jpg
  15. 0 3
      resource_images/10_dorothea-lange_artistic_RF25.jpg
  16. 0 3
      resource_images/10_dorothea-lange_artistic_RF25_compared.jpg
  17. 0 3
      resource_images/10_dorothea-lange_artistic_RF25_compared_sm.jpg
  18. 0 3
      resource_images/11_ParisLate1800s_artistic_RF18.jpg
  19. 0 3
      resource_images/12_Evelyn_Nesbit_artistic_RF21.jpg
  20. 0 3
      resource_images/13_1939GypsyKids_stable_RF37.jpg
  21. 0 3
      resource_images/14_1910Racket_artistic_RF34.jpg
  22. 0 3
      resource_images/15_smoking_kid_stable_RF35.jpg
  23. 0 3
      resource_images/16_TV1930s_artistic_RF30.jpg
  24. 0 3
      resource_images/17_Chief_artistic_RF14.jpg
  25. 0 3
      resource_images/18_TitanicGym_RF31.jpg
  26. 0 3
      resource_images/19_ParisLadies1910_artistic_RF38.jpg
  27. 0 3
      resource_images/1_ClassDivide1930sBrittain_artistic_RF30.jpg
  28. 0 3
      resource_images/1_ClassDivide1930sBrittain_artistic_RF30_compared.jpg
  29. 0 3
      resource_images/1_ClassDivide1930sBrittain_artistic_RF30_compared_sm.jpg
  30. 0 3
      resource_images/20_EasterNyc1911_artistic_RF20.jpg
  31. 0 3
      resource_images/21_Edinburgh1920s_stable_RF17.jpg
  32. 0 3
      resource_images/22_1850Geography_artistic_RF22.jpg
  33. 0 3
      resource_images/23_1909Chicago_artistic_RF14.jpg
  34. 0 3
      resource_images/2_1911ThanksgivingMaskers_artistic_RF36.jpg
  35. 0 3
      resource_images/2_1911ThanksgivingMaskers_artistic_RF36_compared.jpg
  36. 0 3
      resource_images/2_1911ThanksgivingMaskers_artistic_RF36_compared_sm.jpg
  37. 0 3
      resource_images/3_1925GypsyCampMaryland_artistic_RF45.jpg
  38. 0 3
      resource_images/3_1925GypsyCampMaryland_artistic_RF45_compared.jpg
  39. 0 3
      resource_images/3_1925GypsyCampMaryland_artistic_RF45_compared_sm.jpg
  40. 0 3
      resource_images/4_1941GeorgiaFarmhouse_stable_RF43.jpg
  41. 0 3
      resource_images/4_1941GeorgiaFarmhouse_stable_RF43_compared.jpg
  42. 0 3
      resource_images/4_1941GeorgiaFarmhouse_stable_RF43_compared_sm.jpg
  43. 0 3
      resource_images/5_GoldenGateConstruction_stable_RF45.jpg
  44. 0 3
      resource_images/5_GoldenGateConstruction_stable_RF45_compared.jpg
  45. 0 3
      resource_images/5_GoldenGateConstruction_stable_RF45_compared_sm.jpg
  46. 0 3
      resource_images/6_CafeTerrace1925Paris_artistic_RF37.jpg
  47. 0 3
      resource_images/6_CafeTerrace1925Paris_artistic_RF37_compared.jpg
  48. 0 3
      resource_images/6_CafeTerrace1925Paris_artistic_RF37_compared_sm.jpg
  49. 0 3
      resource_images/7_NorwegianBride1890s_artistic_RF40.jpg
  50. 0 3
      resource_images/7_NorwegianBride1890s_artistic_RF40_compared.jpg
  51. 0 3
      resource_images/7_NorwegianBride1890s_artistic_RF40_compared_sm.jpg
  52. 0 3
      resource_images/8_NativeWoman1898_artistic_RF19.jpg
  53. 0 3
      resource_images/8_NativeWoman1898_artistic_RF19_compared.jpg
  54. 0 3
      resource_images/8_NativeWoman1898_artistic_RF19_compared_sm.jpg
  55. 0 3
      resource_images/9_ChinaOpiumc1880_artistic_RF43.jpg
  56. 0 3
      resource_images/9_ChinaOpiumc1880_artistic_RF43_compared.jpg
  57. 0 3
      resource_images/9_ChinaOpiumc1880_artistic_RF43_compared_sm.jpg
  58. 0 3
      test_images/1850Geography.jpg
  59. 0 3
      test_images/1850SchoolForGirls.jpg
  60. 0 3
      test_images/1852GatekeepersWindsor.jpg
  61. 0 3
      test_images/1860Girls.jpg
  62. 0 3
      test_images/1860sSamauris.jpg
  63. 0 3
      test_images/1864UnionSoldier.jpg
  64. 0 3
      test_images/1867MusicianConstantinople.jpg
  65. 0 3
      test_images/1870Girl.jpg
  66. 0 3
      test_images/1870sSphinx.jpg
  67. 0 3
      test_images/1874Mexico.png
  68. 0 3
      test_images/1875Olds.jpg
  69. 0 3
      test_images/1880Paris.jpg
  70. 0 3
      test_images/1880sBrooklynBridge.jpg
  71. 0 3
      test_images/1886Hoop.jpg
  72. 0 3
      test_images/1886ProspectPark.jpg
  73. 0 3
      test_images/1888Slum.jpg
  74. 0 3
      test_images/1890BostonHospital.jpg
  75. 0 3
      test_images/1890CliffHouseSF.jpg
  76. 0 3
      test_images/1890Surfer.png
  77. 0 3
      test_images/1890sChineseImmigrants.jpg
  78. 0 3
      test_images/1890sMedStudents.jpg
  79. 0 3
      test_images/1890sPingPong.jpg
  80. 0 3
      test_images/1890sShoeShopOhio.jpg
  81. 0 3
      test_images/1890sTouristsEgypt.png
  82. 0 3
      test_images/1892WaterLillies.jpg
  83. 0 3
      test_images/1895BikeMaidens.jpg
  84. 0 3
      test_images/1896NewsBoyGirl.jpg
  85. 0 3
      test_images/1897BlindmansBluff.jpg
  86. 0 3
      test_images/1897VancouverAmberlamps.jpg
  87. 0 3
      test_images/1899NycBlizzard.jpg
  88. 0 3
      test_images/1899SodaFountain.jpg
  89. 0 3
      test_images/1900NJThanksgiving.jpg
  90. 0 3
      test_images/1900ParkDog.jpg
  91. 0 3
      test_images/1900sDaytonaBeach.png
  92. 0 3
      test_images/1900sLadiesTeaParty.jpg
  93. 0 3
      test_images/1900sSaloon.jpg
  94. 0 3
      test_images/1901Electrophone.jpg
  95. 0 3
      test_images/1902FrenchYellowBellies.jpg
  96. 0 3
      test_images/1904ChineseMan.jpg
  97. 0 3
      test_images/1907Cowboys.jpg
  98. 0 3
      test_images/1908FamilyPhoto.jpg
  99. 0 3
      test_images/1908RookeriesLondon.jpg
  100. 0 3
      test_images/1909Chicago.jpg

+ 0 - 4
.vscode/settings.json

@@ -1,4 +0,0 @@
-{
-    "python.pythonPath": "/home/jason/anaconda3/envs/fastaiv1/bin/python",
-    "python.linting.enabled": true
-}

+ 2 - 2
ColorizeTrainingArtistic.ipynb

@@ -111,7 +111,7 @@
     "            o.save(path_gen/names[i].name)\n",
     "            i += 1\n",
     "    \n",
-    "def save_gen_images(learn_gen):\n",
+    "def save_gen_images():\n",
     "    if path_gen.exists(): shutil.rmtree(path_gen)\n",
     "    path_gen.mkdir(exist_ok=True)\n",
     "    data_gen = get_data(bs=bs, sz=sz, keep_pct=0.085)\n",
@@ -418,7 +418,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "save_gen_images(gen_name)"
+    "save_gen_images()"
    ]
   },
   {

+ 2 - 2
ColorizeTrainingStable.ipynb

@@ -111,7 +111,7 @@
     "            o.save(path_gen/names[i].name)\n",
     "            i += 1\n",
     "    \n",
-    "def save_gen_images(learn_gen):\n",
+    "def save_gen_images():\n",
     "    if path_gen.exists(): shutil.rmtree(path_gen)\n",
     "    path_gen.mkdir(exist_ok=True)\n",
     "    data_gen = get_data(bs=bs, sz=sz, keep_pct=0.085)\n",
@@ -418,7 +418,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "save_gen_images(gen_name)"
+    "save_gen_images()"
    ]
   },
   {

+ 779 - 0
ColorizeTrainingStableLargeBatch.ipynb

@@ -0,0 +1,779 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Stable Model Training (Large Batch/Limited GPU Memory Support)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## IMPORTANT: Training has -not- been verified by myself for this notebook ~jantic"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "#### NOTES:  \n",
+    "* This is \"NoGAN\" based training, described in the DeOldify readme.\n",
+    "* This model prioritizes stable and reliable renderings.  It does particularly well on portraits and landscapes.  It's not as colorful as the artistic model."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import os\n",
+    "os.environ['CUDA_VISIBLE_DEVICES']='0' "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import fastai\n",
+    "from fastai import *\n",
+    "from fastai.vision import *\n",
+    "from fastai.callbacks.tensorboard import *\n",
+    "from fastai.vision.gan import *\n",
+    "from fasterai.generators import *\n",
+    "from fasterai.critics import *\n",
+    "from fasterai.dataset import *\n",
+    "from fasterai.loss import *\n",
+    "from fasterai.save import *\n",
+    "from PIL import Image, ImageDraw, ImageFont\n",
+    "from PIL import ImageFile"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Setup"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Activate Large Model Support for PyTorch\n",
+    "This will allow us to fit the model within a GPU with smaller memory capacity (e.g. GTX 1070 8Gb)."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Large Model Support (LMS) is a feature provided in IBM Watson Machine Learning Community Edition (WML-CE) PyTorch V1.1.0 that allows the successful training of deep learning models that would otherwise exhaust GPU memory and abort with “out-of-memory” errors. LMS manages this oversubscription of GPU memory by temporarily swapping tensors to host memory when they are not needed. One or more elements of a deep learning model can lead to GPU memory exhaustion.\n",
+    "\n",
+    "Requires the use of IBM WML-CE (Available here: https://www.ibm.com/support/knowledgecenter/en/SS5SF7_1.6.1/welcome/welcome.html)\n",
+    "\n",
+    "Further Reading on PyTorch with Large Model Support: https://www.ibm.com/support/knowledgecenter/en/SS5SF7_1.6.1/navigation/wmlce_getstarted_pytorch.html"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import shutil"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Set limit of GPU used before swapping to tensors to host memory\n",
+    "max_gpu_mem = 7\n",
+    "\n",
+    "def gb_to_bytes(gb):\n",
+    "    return gb*1024*1024*1024\n",
+    "\n",
+    "# Enable PyTorch LMS\n",
+    "torch.cuda.set.enabled_lms(True)\n",
+    "# Set LMS limit\n",
+    "torch.cuda.set_limit_lms(gb_to_bytes(max_gpu_mem))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Check LMS is enabled\n",
+    "torch.cuda.get_enabled_lms()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Check LMS Limit has been set\n",
+    "torch.cuda.get_limit_lms()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    " "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Path to Training Data\n",
+    "path = Path('data/imagenet/ILSVRC/Data/CLS-LOC')\n",
+    "path_hr = path\n",
+    "\n",
+    "# Path to Black and White images\n",
+    "path_bandw = Path('/training/DeOldify')\n",
+    "path_lr = path_bandw/'bandw'\n",
+    "\n",
+    "# Name of Model\n",
+    "proj_id = 'StableModel'\n",
+    "\n",
+    "# Name of Generator\n",
+    "gen_name = proj_id + '_gen'\n",
+    "pre_gen_name = gen_name + '_0'\n",
+    "\n",
+    "# Name of Critic\n",
+    "crit_name = proj_id + '_crit'\n",
+    "\n",
+    "# Name of Generated Images folder, located within the Black and White folder\n",
+    "name_gen = proj_id + '_image_gen'\n",
+    "path_gen = path/name_gen\n",
+    "\n",
+    "# Path to tensorboard data\n",
+    "TENSORBOARD_PATH = Path('data/tensorboard/' + proj_id)\n",
+    "\n",
+    "nf_factor = 2\n",
+    "pct_start = 1e-8\n",
+    "\n",
+    "# Number of workers for DataLoader\n",
+    "num_works = 2"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def get_data(bs:int, sz:int, keep_pct:float):\n",
+    "    return get_colorize_data(sz=sz, bs=bs, crappy_path=path_lr, good_path=path_hr, \n",
+    "                             random_seed=None, keep_pct=keep_pct, num_workers=num_works)\n",
+    "\n",
+    "def get_crit_data(classes, bs, sz):\n",
+    "    src = ImageList.from_folder(path, include=classes, recurse=True).random_split_by_pct(0.1, seed=42)\n",
+    "    ll = src.label_from_folder(classes=classes)\n",
+    "    data = (ll.transform(get_transforms(max_zoom=2.), size=sz)\n",
+    "           .databunch(bs=bs).normalize(imagenet_stats))\n",
+    "    return data\n",
+    "\n",
+    "def create_training_images(fn,i):\n",
+    "    dest = path_lr/fn.relative_to(path_hr)\n",
+    "    dest.parent.mkdir(parents=True, exist_ok=True)\n",
+    "    img = PIL.Image.open(fn).convert('LA').convert('RGB')\n",
+    "    img.save(dest)  \n",
+    "    \n",
+    "def save_preds(dl):\n",
+    "    i=0\n",
+    "    names = dl.dataset.items\n",
+    "    \n",
+    "    for b in dl:\n",
+    "        preds = learn_gen.pred_batch(batch=b, reconstruct=True)\n",
+    "        for o in preds:\n",
+    "            o.save(path_gen/names[i].name)\n",
+    "            i += 1\n",
+    "    \n",
+    "def save_gen_images():\n",
+    "    if path_gen.exists(): shutil.rmtree(path_gen)\n",
+    "    path_gen.mkdir(exist_ok=True)\n",
+    "    data_gen = get_data(bs=bs, sz=sz, keep_pct=0.085)\n",
+    "    save_preds(data_gen.fix_dl)\n",
+    "    PIL.Image.open(path_gen.ls()[0])"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Create black and white training images"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Only runs if the directory isn't already created."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "if not path_lr.exists():\n",
+    "    il = ImageList.from_folder(path_hr)\n",
+    "    parallel(create_training_images, il.items)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Pre-train generator"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "#### NOTE\n",
+    "Most of the training takes place here in pretraining for NoGAN.  The goal here is to take the generator as far as possible with conventional training, as that is much easier to control and obtain glitch-free results compared to GAN training."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### 64px"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "bs=88 # This can be increased if using PyTorch LMS, training could be slower.\n",
+    "sz=64\n",
+    "keep_pct=1.0"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "data_gen = get_data(bs=bs, sz=sz, keep_pct=keep_pct)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "learn_gen = gen_learner_wide(data=data_gen, gen_loss=FeatureLoss(), nf_factor=nf_factor)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "learn_gen.callback_fns.append(partial(ImageGenTensorboardWriter, base_dir=TENSORBOARD_PATH, name='GenPre'))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "learn_gen.fit_one_cycle(1, pct_start=0.8, max_lr=slice(1e-3))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "learn_gen.save(pre_gen_name)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "learn_gen.unfreeze()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "learn_gen.fit_one_cycle(1, pct_start=pct_start,  max_lr=slice(3e-7, 3e-4))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "learn_gen.save(pre_gen_name)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### 128px"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "bs=40 # This can be increased if using PyTorch LMS, training could be slower.\n",
+    "sz=128\n",
+    "keep_pct=1.0"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "learn_gen.data = get_data(sz=sz, bs=bs, keep_pct=keep_pct)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "learn_gen.unfreeze()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "learn_gen.fit_one_cycle(1, pct_start=pct_start, max_lr=slice(1e-7,1e-4))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "learn_gen.save(pre_gen_name)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### 192px"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "bs=16 # This can be increased if using PyTorch LMS, training could be slower.\n",
+    "sz=192\n",
+    "keep_pct=0.50"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "learn_gen.data = get_data(sz=sz, bs=bs, keep_pct=keep_pct)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "learn_gen.unfreeze()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "learn_gen.fit_one_cycle(1, pct_start=pct_start, max_lr=slice(5e-8,5e-5))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "learn_gen.save(pre_gen_name)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### 256px"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "bs=8 # This can be increased if using PyTorch LMS, training could be slower.\n",
+    "sz=256\n",
+    "keep_pct=0.50"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "learn_gen.data = get_data(sz=sz, bs=bs, keep_pct=keep_pct)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "learn_gen.unfreeze()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "learn_gen.fit_one_cycle(1, pct_start=pct_start, max_lr=slice(5e-8,5e-5))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "learn_gen.save(pre_gen_name)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Repeatable GAN Cycle"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "#### NOTE\n",
+    "Best results so far have been based on repeating the cycle below a few times (about 5-8?), until diminishing returns are hit (no improvement in image quality).  Each time you repeat the cycle, you want to increment that old_checkpoint_num by 1 so that new check points don't overwrite the old.  "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "old_checkpoint_num = 0\n",
+    "checkpoint_num = old_checkpoint_num + 1\n",
+    "gen_old_checkpoint_name = gen_name + '_' + str(old_checkpoint_num)\n",
+    "gen_new_checkpoint_name = gen_name + '_' + str(checkpoint_num)\n",
+    "crit_old_checkpoint_name = crit_name + '_' + str(old_checkpoint_num)\n",
+    "crit_new_checkpoint_name= crit_name + '_' + str(checkpoint_num)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Save Generated Images"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "bs=8\n",
+    "sz=256"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "learn_gen = gen_learner_wide(data=data_gen, gen_loss=FeatureLoss(), nf_factor=nf_factor).load(gen_old_checkpoint_name, with_opt=False)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "save_gen_images()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Pretrain Critic"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "##### Only need full pretraining of critic when starting from scratch.  Otherwise, just finetune!"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "if old_checkpoint_num == 0:\n",
+    "    bs=64\n",
+    "    sz=128\n",
+    "    learn_gen=None\n",
+    "    gc.collect()\n",
+    "    data_crit = get_crit_data([name_gen, 'test'], bs=bs, sz=sz)\n",
+    "    data_crit.show_batch(rows=3, ds_type=DatasetType.Train, imgsize=3)\n",
+    "    learn_critic = colorize_crit_learner(data=data_crit, nf=256)\n",
+    "    learn_critic.callback_fns.append(partial(LearnerTensorboardWriter, base_dir=TENSORBOARD_PATH, name='CriticPre'))\n",
+    "    learn_critic.fit_one_cycle(6, 1e-3)\n",
+    "    learn_critic.save(crit_old_checkpoint_name)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "bs=8\n",
+    "sz=256"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "data_crit = get_crit_data([name_gen, 'test'], bs=bs, sz=sz)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "data_crit.show_batch(rows=3, ds_type=DatasetType.Train, imgsize=3)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "learn_critic = colorize_crit_learner(data=data_crit, nf=256).load(crit_old_checkpoint_name, with_opt=False)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "learn_critic.callback_fns.append(partial(LearnerTensorboardWriter, base_dir=TENSORBOARD_PATH, name='CriticPre'))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "learn_critic.fit_one_cycle(4, 1e-4)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "learn_critic.save(crit_new_checkpoint_name)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### GAN"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "learn_crit=None\n",
+    "learn_gen=None\n",
+    "gc.collect()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "lr=2e-5\n",
+    "sz=256\n",
+    "bs=5"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "data_crit = get_crit_data([name_gen, 'test'], bs=bs, sz=sz)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "learn_crit = colorize_crit_learner(data=data_crit, nf=256).load(crit_new_checkpoint_name, with_opt=False)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "learn_gen = gen_learner_wide(data=data_gen, gen_loss=FeatureLoss(), nf_factor=nf_factor).load(gen_old_checkpoint_name, with_opt=False)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "switcher = partial(AdaptiveGANSwitcher, critic_thresh=0.65)\n",
+    "learn = GANLearner.from_learners(learn_gen, learn_crit, weights_gen=(1.0,1.5), show_img=False, switcher=switcher,\n",
+    "                                 opt_func=partial(optim.Adam, betas=(0.,0.9)), wd=1e-3)\n",
+    "learn.callback_fns.append(partial(GANDiscriminativeLR, mult_lr=5.))\n",
+    "learn.callback_fns.append(partial(GANTensorboardWriter, base_dir=TENSORBOARD_PATH, name='GanLearner', visual_iters=100))\n",
+    "learn.callback_fns.append(partial(GANSaveCallback, learn_gen=learn_gen, filename=gen_new_checkpoint_name, save_iters=100))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "#### Instructions:  \n",
+    "Find the checkpoint just before where glitches start to be introduced.  This is all very new so you may need to play around with just how far you go here with keep_pct."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "learn.data = get_data(sz=sz, bs=bs, keep_pct=0.03)\n",
+    "learn_gen.freeze_to(-1)\n",
+    "learn.fit(1,lr)"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.7.0"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}

+ 2 - 2
ColorizeTrainingVideo.ipynb

@@ -105,7 +105,7 @@
     "            o.save(path_gen/names[i].name)\n",
     "            i += 1\n",
     "            \n",
-    "def save_gen_images(learn_gen):\n",
+    "def save_gen_images():\n",
     "    if path_gen.exists(): shutil.rmtree(path_gen)\n",
     "    path_gen.mkdir(exist_ok=True)\n",
     "    data_gen = get_data(bs=bs, sz=sz, keep_pct=0.085)\n",
@@ -262,7 +262,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "save_gen_images(gen_name)"
+    "save_gen_images()"
    ]
   },
   {

+ 1 - 1
Dockerfile

@@ -2,7 +2,7 @@ From nvcr.io/nvidia/pytorch:19.04-py3
 
 RUN apt-get -y update
 
-RUN apt-get install -y python3-pip software-properties-common wget
+RUN apt-get install -y python3-pip software-properties-common wget ffmpeg
 
 RUN add-apt-repository ppa:git-core/ppa
 

+ 46 - 0
Dockerfile-api

@@ -0,0 +1,46 @@
+From nvcr.io/nvidia/pytorch:19.04-py3
+
+RUN apt-get -y update
+
+RUN apt-get install -y python3-pip software-properties-common wget ffmpeg
+
+RUN add-apt-repository ppa:git-core/ppa
+
+RUN apt-get -y update
+
+RUN curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash
+
+RUN apt-get install -y git-lfs --allow-unauthenticated
+
+RUN git lfs install
+
+ENV GIT_WORK_TREE=/data
+
+RUN mkdir -p /root/.torch/models
+
+RUN mkdir -p /data/models
+
+RUN wget -O /root/.torch/models/vgg16_bn-6c64b313.pth https://download.pytorch.org/models/vgg16_bn-6c64b313.pth
+
+RUN wget -O /root/.torch/models/resnet34-333f7ec4.pth https://download.pytorch.org/models/resnet34-333f7ec4.pth
+
+RUN wget -O /root/.torch/models/resnet101-5d3b4d8f.pth https://download.pytorch.org/models/resnet101-5d3b4d8f.pth
+
+RUN wget -O /data/models/ColorizeArtistic_gen.pth https://www.dropbox.com/s/zkehq1uwahhbc2o/ColorizeArtistic_gen.pth?dl=0 
+
+RUN wget -O /data/models/ColorizeVideo_gen.pth https://www.dropbox.com/s/336vn9y4qwyg9yz/ColorizeVideo_gen.pth?dl=0
+
+ADD . /data/
+
+WORKDIR /data
+
+RUN pip install -r requirements.txt
+
+RUN pip install  Flask
+
+RUN cd /data/test_images && git lfs pull
+
+EXPOSE 5000
+
+ENTRYPOINT ["python3", "app.py"]
+

+ 48 - 15
README.md

@@ -34,58 +34,58 @@ NOTE:  Click images to watch
 
 "Migrant Mother" by Dorothea Lange (1936)
 
-![MigrantMother](resource_images/10_dorothea-lange_artistic_RF25_compared_sm.jpg)
+![MigrantMother](https://i.imgur.com/Bt0vnke.jpg)
 
 
 Woman relaxing in her livingroom in Sweden (1920)
 
-![SwedenLivingRoom](resource_images/0_LivingRoom1920Sweden_artistic_RF46_compared_sm.jpg)
+![SwedenLivingRoom](https://i.imgur.com/158d0oU.jpg)
 
 
 "Toffs and Toughs" by Jimmy Sime (1937)
 
-![ClassDivide](resource_images/1_ClassDivide1930sBrittain_artistic_RF30_compared_sm.jpg)
+![ClassDivide](https://i.imgur.com/VYuav4I.jpg)
 
 
 Thanksgiving Maskers (1911)
 
-![ThanksgivingMaskers](resource_images/2_1911ThanksgivingMaskers_artistic_RF36_compared_sm.jpg)
+![ThanksgivingMaskers](https://i.imgur.com/n8qVJ5c.jpg)
 
 
 Glen Echo Madame Careta Gypsy Camp in Maryland (1925)
 
-![GypsyCamp](resource_images/3_1925GypsyCampMaryland_artistic_RF45_compared_sm.jpg)
+![GypsyCamp](https://i.imgur.com/1oYrJRI.jpg)
 
 
 "Mr. and Mrs. Lemuel Smith and their younger children in their farm house, Carroll County, Georgia." (1941)
 
-![GeorgiaFarmhouse](resource_images/4_1941GeorgiaFarmhouse_stable_RF43_compared_sm.jpg)
+![GeorgiaFarmhouse](https://i.imgur.com/I2j8ynm.jpg)
 
  
 "Building the Golden Gate Bridge" (est 1937)
 
-![GoldenGateBridge](resource_images/5_GoldenGateConstruction_stable_RF45_compared_sm.jpg)
+![GoldenGateBridge](https://i.imgur.com/6SbFjfq.jpg)
 <sub>NOTE:  What you might be wondering is while this render looks cool, are the colors accurate? The original photo certainly makes it look like the towers of the bridge could be white. We looked into this and it turns out the answer is no- the towers were already covered in red primer by this time. So that's something to keep in mind- historical accuracy remains a huge challenge!</sub>
 
 
 "Terrasse de café, Paris" (1925)
 
-![CafeParis](resource_images/6_CafeTerrace1925Paris_artistic_RF37_compared_sm.jpg)
+![CafeParis](https://i.imgur.com/WprQwP5.jpg)
 
 
 Norwegian Bride (est late 1890s)
 
-![NorwegianBride](resource_images/7_NorwegianBride1890s_artistic_RF40_compared_sm.jpg)
+![NorwegianBride](https://i.imgur.com/MmtvrZm.jpg)
 
 
 Zitkála-Šá (Lakota: Red Bird), also known as Gertrude Simmons Bonnin (1898)
 
-![NativeWoman](resource_images/8_NativeWoman1898_artistic_RF19_compared_sm.jpg)
+![NativeWoman](https://i.imgur.com/zIGM043.jpg)
 
 
 Chinese Opium Smokers (1880)
 
-![OpiumReal](resource_images/9_ChinaOpiumc1880_artistic_RF43_compared_sm.jpg)
+![OpiumReal](https://i.imgur.com/lVGq8Vq.jpg)
 
 -------------------------
 ### Stuff That Should Probably Be In A Paper
@@ -215,7 +215,7 @@ jupyter lab
 
 From there you can start running the notebooks in Jupyter Lab, via the url they provide you in the console.  
 
-#### Docker
+#### Docker for Jupyter
 
 You can build and run the docker using the following process:
 
@@ -226,18 +226,47 @@ git clone https://github.com/jantic/DeOldify.git DeOldify
 
 Building Docker
 ```console
-cd DeOldify && docker build -t deoldify .
+cd DeOldify && docker build -t deoldify_jupyter -f Dockerfile .
 ```
 
 Running Docker
 ```console
-echo "http://$(curl ifconfig.io):8888" && nvidia-docker run --ipc=host --env NOTEBOOK_PASSWORD="pass123" -p 8888:8888 -it deoldify
+echo "http://$(curl ifconfig.io):8888" && nvidia-docker run --ipc=host --env NOTEBOOK_PASSWORD="pass123" -p 8888:8888 -it deoldify_jupyter
 ```
 
+#### Docker for API
+
+You can build and run the docker using the following process:
+
+Cloning
+```console
+git clone https://github.com/jantic/DeOldify.git DeOldify
+```
+
+Building Docker
+```console
+cd DeOldify && docker build -t deoldify_api -f Dockerfile-api .
+```
+
+Running Docker
+```console
+echo "http://$(curl ifconfig.io):5000" && nvidia-docker run --ipc=host -p 5000:5000 -d deoldify_api
+```
+
+Calling the API for image processing
+```console
+curl -X POST "http://MY_SUPER_API_IP:5000/process_image" -H "accept: image/png" -H "Content-Type: application/json" -d "{\"source_url\":\"http://www.afrikanheritage.com/wp-content/uploads/2015/08/slave-family-P.jpeg\", \"render_factor\":35}" --output colorized_image.png
+```
+
+Calling the API for video processing
+```console
+curl -X POST "http://MY_SUPER_API_IP:5000/process_video" -H "accept: application/octet-stream" -H "Content-Type: application/json" -d "{\"source_url\":\"https://v.redd.it/d1ku57kvuf421/HLSPlaylist.m3u8\", \"render_factor\":35}" --output colorized_video.mp4
+```
+#### Note Regarding Docker
 If you don't have Nvidia Docker, here is the installation guide :
 https://github.com/nvidia/nvidia-docker/wiki/Installation-(version-2.0)#installing-version-20
 
-#### Note 
+#### Note GIT LFS (test images download support)
 Make sure you have Git LFS installed if you're planning on using images in the /test_images/ folder.  Otherwise, you'll just wind up getting tiny files that will have the same file names but you will run into errors trying to open them or colorize them.  If you have a fancy shmancy git client like GitHub Desktop, it will probably prompt you to install it and do it for you.  If that doesn't happen,  get it here: https://git-lfs.github.com/
 
 --------------------------
@@ -290,3 +319,7 @@ We suspect some of you are going to want access to the original DeOldify model f
 
 I'll be posting more results on Twitter. [<img src="resource_images/Twitter_Social_Icon_Rounded_Square_Color.svg" width="28">](https://twitter.com/citnaj)
 
+-------------------------
+### License
+All code in this repository is under the MIT license as specified by the LICENSE file.
+The model weights listed in this readme under the "Pretrained Weights" section are trained by ourselves and are released under the MIT license.

+ 1 - 1
fasterai/dataset.py

@@ -9,7 +9,7 @@ from .augs import noisify
 def get_colorize_data(sz:int, bs:int, crappy_path:Path, good_path:Path, random_seed:int=None, 
         keep_pct:float=1.0, num_workers:int=8, xtra_tfms=[])->ImageDataBunch:
 
-    src = (ImageImageList.from_folder(crappy_path)
+    src = (ImageImageList.from_folder(crappy_path, convert_mode='RGB')
         .use_partial_data(sample_pct=keep_pct, seed=random_seed)
         .split_by_rand_pct(0.1, seed=random_seed))
 

+ 2 - 2
fasterai/unet.py

@@ -68,7 +68,7 @@ class DynamicUnetDeep(SequentialEx):
         imsize = (256,256)
         sfs_szs = model_sizes(encoder, size=imsize)
         sfs_idxs = list(reversed(_get_sfs_idxs(sfs_szs)))
-        self.sfs = hook_outputs([encoder[i] for i in sfs_idxs])
+        self.sfs = hook_outputs([encoder[i] for i in sfs_idxs], detach=False)
         x = dummy_eval(encoder, imsize).detach()
 
         ni = sfs_szs[-1][1]
@@ -138,7 +138,7 @@ class DynamicUnetWide(SequentialEx):
         imsize = (256,256)
         sfs_szs = model_sizes(encoder, size=imsize)
         sfs_idxs = list(reversed(_get_sfs_idxs(sfs_szs)))
-        self.sfs = hook_outputs([encoder[i] for i in sfs_idxs])
+        self.sfs = hook_outputs([encoder[i] for i in sfs_idxs], detach=False)
         x = dummy_eval(encoder, imsize).detach()
 
         ni = sfs_szs[-1][1]

+ 22 - 11
fasterai/visualize.py

@@ -104,13 +104,10 @@ class VideoColorizer():
             if re.search('.*?\.jpg', f):
                 os.remove(os.path.join(dir, f))
 
-    def _get_fps(self, source_path: Path)->float:
+    def _get_fps(self, source_path: Path)->str:
         probe = ffmpeg.probe(str(source_path))
         stream_data = next((stream for stream in probe['streams'] if stream['codec_type'] == 'video'), None)
-        avg_frame_rate = stream_data['avg_frame_rate']
-        fps_num=avg_frame_rate.split("/")[0]
-        fps_den = avg_frame_rate.rsplit("/")[1]
-        return round(float(fps_num)/float(fps_den))
+        return stream_data['avg_frame_rate']
 
     def _download_video_from_url(self, source_url, source_path:Path):
         if source_path.exists(): source_path.unlink()
@@ -143,17 +140,31 @@ class VideoColorizer():
                 color_image.save(str(colorframes_folder/img))
     
     def _build_video(self, source_path:Path)->Path:
-        result_path = self.result_folder/source_path.name
+        colorized_path = self.result_folder/(source_path.name.replace('.mp4', '_no_audio.mp4'))
         colorframes_folder = self.colorframes_root/(source_path.stem)
         colorframes_path_template = str(colorframes_folder/'%5d.jpg')
-        result_path.parent.mkdir(parents=True, exist_ok=True)
-        if result_path.exists(): result_path.unlink()
+        colorized_path.parent.mkdir(parents=True, exist_ok=True)
+        if colorized_path.exists(): colorized_path.unlink()
         fps = self._get_fps(source_path)
 
-        ffmpeg.input(str(colorframes_path_template), format='image2', vcodec='mjpeg', framerate=str(fps)) \
-            .output(str(result_path), crf=17, vcodec='libx264') \
+        ffmpeg.input(str(colorframes_path_template), format='image2', vcodec='mjpeg', framerate=fps) \
+            .output(str(colorized_path), crf=17, vcodec='libx264') \
             .run(capture_stdout=True)
-        
+
+        result_path = self.result_folder/source_path.name
+        if result_path.exists(): result_path.unlink()
+        #making copy of non-audio version in case adding back audio doesn't apply or fails.
+        shutil.copyfile(str(colorized_path), str(result_path))
+
+        # adding back sound here
+        audio_file = Path(str(source_path).replace('.mp4', '.aac'))
+        if audio_file.exists(): audio_file.unlink()
+
+        os.system('ffmpeg -y -i "' + str(source_path) + '" -vn -acodec copy "' + str(audio_file) + '"')
+
+        if audio_file.exists:
+            os.system('ffmpeg -y -i "' + str(colorized_path) + '" -i "' + str(audio_file) 
+                + '" -shortest -c:v copy -c:a aac -b:a 256k "' + str(result_path) + '"')
         print('Video created here: ' + str(result_path))
         return result_path
 

+ 0 - 3
resource_images/0_LivingRoom1920Sweden_artistic_RF46.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:42fffe04df8b3bfccd67ec6749df8de948c83df762329ce556b898fb38b404bc
-size 234063

+ 0 - 3
resource_images/0_LivingRoom1920Sweden_artistic_RF46_compared.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:586bd829047a5d5e6e2749f6f1421f5f596f63d0f08842564860f6493bf2b8ce
-size 1213100

+ 0 - 3
resource_images/0_LivingRoom1920Sweden_artistic_RF46_compared_sm.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:6b2084e68ffbb7859588d82ec4019a5ec161ff8065f0a2849bcadf71555f713a
-size 612587

+ 0 - 3
resource_images/10_dorothea-lange_artistic_RF25.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9b30b47ac0015d7a96763816da31e3ae9a6a0ecccb53cd8e368ad534af08fd5e
-size 111561

+ 0 - 3
resource_images/10_dorothea-lange_artistic_RF25_compared.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a96d16a66004826f2dcd1aba86865838eb7fe0360bc47bb77df9915ed8d0beea
-size 730133

+ 0 - 3
resource_images/10_dorothea-lange_artistic_RF25_compared_sm.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:10724caceca5fbee2a7b58b241fbde999ed8e1a854c08fb3ffe6100f3c0abafb
-size 231089

+ 0 - 3
resource_images/11_ParisLate1800s_artistic_RF18.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b18ab44a941e42b62f7f7f9f2ff77010aa2a9f18394e7b147f9cbc3f6bb1a1f0
-size 214554

+ 0 - 3
resource_images/12_Evelyn_Nesbit_artistic_RF21.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4e094357792b896a0e0c01c178e3e223bd32c020d12e24a3e345adf8d6966d7b
-size 301809

+ 0 - 3
resource_images/13_1939GypsyKids_stable_RF37.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:87c9a79f58f508b94fd086e7424cbb93b8fdbc7b4d9fffe3fb9a0224bf8866b8
-size 59249

+ 0 - 3
resource_images/14_1910Racket_artistic_RF34.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:06697db894377cfd5a0914900c916849bfe95e24e7510d66dc785dda4872841c
-size 481829

+ 0 - 3
resource_images/15_smoking_kid_stable_RF35.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:155c1b76661f6037f3123dca052f8ba3d6240a7067662a0deee441c586a5ebc7
-size 99133

+ 0 - 3
resource_images/16_TV1930s_artistic_RF30.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:cf6df05d15a42462b70e3cf2971e0def2aa36d0e59342f87118f3a7229a10c64
-size 88422

+ 0 - 3
resource_images/17_Chief_artistic_RF14.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ea3163832919a0fd0165a867058b2a57f324a627191a248dee36100d1adcf881
-size 99918

+ 0 - 3
resource_images/18_TitanicGym_RF31.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f481ec91030bfbc3d839899c22de876a5c5adb31f47d5c304ae7855baf046aca
-size 149643

+ 0 - 3
resource_images/19_ParisLadies1910_artistic_RF38.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:35378595ed31d07ed81139f0b4744dd12c26c2e4ab6b0a848fe5489ce6f91f89
-size 52754

+ 0 - 3
resource_images/1_ClassDivide1930sBrittain_artistic_RF30.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:bd75d6c245a5af8c614178409c108bdc1f754fa415c443a7db0b9413d4c9bc12
-size 483267

+ 0 - 3
resource_images/1_ClassDivide1930sBrittain_artistic_RF30_compared.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:dbf3d4a2e8696f1080c82a8b40e37e562fa271dba6467b16d43d3e286771bc92
-size 3392575

+ 0 - 3
resource_images/1_ClassDivide1930sBrittain_artistic_RF30_compared_sm.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:832f904da55eacb7f77014b3d033639e58527fbf42b42db4e496190688bac2b2
-size 129144

+ 0 - 3
resource_images/20_EasterNyc1911_artistic_RF20.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:dbdf824d5161ffacb154814b76b07818b715fc661d54e8d447e78f95236589d2
-size 116388

+ 0 - 3
resource_images/21_Edinburgh1920s_stable_RF17.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c2657e927c1085b9804a01e358d46374d3a614c88953db5fd75bf89e2f8f2b78
-size 927005

+ 0 - 3
resource_images/22_1850Geography_artistic_RF22.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a4b67a3eae686ef08e1f7166a609c94dd60e7fb1c40056ad86a1a2640a542d61
-size 74144

+ 0 - 3
resource_images/23_1909Chicago_artistic_RF14.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:870a1294c6d24d4d9731b768dc7f9bc1ccc2b0af355ce5371a24405859ac96d3
-size 259782

+ 0 - 3
resource_images/2_1911ThanksgivingMaskers_artistic_RF36.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9b860462ae64c4783ba514ccadc9c18b8e16dd1369c0d5438dc6541fbd162bbb
-size 268713

+ 0 - 3
resource_images/2_1911ThanksgivingMaskers_artistic_RF36_compared.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:cb8aa25edf7f57b8861d49e9fecb0b93dc8b81def74ac31ae767335864c43e97
-size 1751927

+ 0 - 3
resource_images/2_1911ThanksgivingMaskers_artistic_RF36_compared_sm.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:6eadfe0777a6946682878eb025a82d4d2ff663b64d5f899e65ce56cbf134893c
-size 233198

+ 0 - 3
resource_images/3_1925GypsyCampMaryland_artistic_RF45.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:1675907d0b034fa2dac8c9ee82d6a374906217b3788c358baa49c52bc5e740a7
-size 212866

+ 0 - 3
resource_images/3_1925GypsyCampMaryland_artistic_RF45_compared.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3aa5bf9786ac5f04a118502ac61f3b78d8e409c8547be1dfc8b06f613b0f89bc
-size 1261777

+ 0 - 3
resource_images/3_1925GypsyCampMaryland_artistic_RF45_compared_sm.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:62131a4e5f8008b95939020e786640c02a4768252db280cd5fb2595dc8dd7908
-size 335399

+ 0 - 3
resource_images/4_1941GeorgiaFarmhouse_stable_RF43.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:0195b4e9004b92d8a07b8a340daa987f662e501983dbceec30e4d0cb59d18adf
-size 1039015

+ 0 - 3
resource_images/4_1941GeorgiaFarmhouse_stable_RF43_compared.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:786d6ac07be6b3b772567d10541f47fe82843f20dd3ecfaadb4b7d78f6195080
-size 6843480

+ 0 - 3
resource_images/4_1941GeorgiaFarmhouse_stable_RF43_compared_sm.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:2e4c5dacbd36e5ab7380efd39ee65b3483f121239e222ce67f71455dbc83e371
-size 458491

+ 0 - 3
resource_images/5_GoldenGateConstruction_stable_RF45.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c5aaa1bdb4bc4e17e0c31ac1b234d197701e399c883e8ec9a6db1e8f7e148c60
-size 143693

+ 0 - 3
resource_images/5_GoldenGateConstruction_stable_RF45_compared.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:062495947f732158d89e6bee3ac9592b6b718eb1b8f6e213e917948b3f750ffa
-size 723303

+ 0 - 3
resource_images/5_GoldenGateConstruction_stable_RF45_compared_sm.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a4aa5cf6f506707ab8608d6003ed8648ea459235d3a1b0bd8a16927f075f1702
-size 137067

+ 0 - 3
resource_images/6_CafeTerrace1925Paris_artistic_RF37.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f882a5f65e428f36521ce4610857a480ff174f296ee87d4162bebb585f07e0f9
-size 150918

+ 0 - 3
resource_images/6_CafeTerrace1925Paris_artistic_RF37_compared.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:86fa95b2edb857227b3b59e9f67f7e63549eccfd7d00274067c700e610a1ee22
-size 793126

+ 0 - 3
resource_images/6_CafeTerrace1925Paris_artistic_RF37_compared_sm.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:72e4c531fe513775b54e9925d868cc3f8858468b7ae1ad3e94bfdc1305f6cd6a
-size 109076

+ 0 - 3
resource_images/7_NorwegianBride1890s_artistic_RF40.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:50a7b9fad79f9a2173b6e6b876d821774b5be4e29229a2457a77b16358c7e430
-size 71152

+ 0 - 3
resource_images/7_NorwegianBride1890s_artistic_RF40_compared.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:8fb7db5b2224af0ef8b64a94c713f7eb1b066f2821fdd77b42395af18655f0a2
-size 434760

+ 0 - 3
resource_images/7_NorwegianBride1890s_artistic_RF40_compared_sm.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:8a63ff755bf4258ee5e87d836694083108fa71f027ee255654519722d100c282
-size 201535

+ 0 - 3
resource_images/8_NativeWoman1898_artistic_RF19.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:8ed31ec5804288f5c203c9bf6a5cd7dca420ec1eaa9d5a0d9cb8ca8e322cc01c
-size 72831

+ 0 - 3
resource_images/8_NativeWoman1898_artistic_RF19_compared.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c6aa5b8085af98c7930169cfbfe41d3ef4f7ba14c74d702d627596529c006684
-size 556172

+ 0 - 3
resource_images/8_NativeWoman1898_artistic_RF19_compared_sm.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3f954c405ee120284553da066613519ac1bde09e15469dedb47e98692d7a883e
-size 140305

+ 0 - 3
resource_images/9_ChinaOpiumc1880_artistic_RF43.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f01f7432c1bdbf1f7e4a2321ca782a68de689709d5109da14e5bfb63f5253c96
-size 329321

+ 0 - 3
resource_images/9_ChinaOpiumc1880_artistic_RF43_compared.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:433206e6cad12f69bc1b443e930a4f950a75c085f027b9d2ff98fd47d3aca6fc
-size 1785573

+ 0 - 3
resource_images/9_ChinaOpiumc1880_artistic_RF43_compared_sm.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9c00a52c6bb87b32c6ff8c329ca23aedebe64affd3edf105fdebaebd97535ab5
-size 252142

+ 0 - 3
test_images/1850Geography.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:7e6a52eeb7631d400f6f40fc418eea94c72a4b28ced0c629b834de172980a87c
-size 64919

+ 0 - 3
test_images/1850SchoolForGirls.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f8290997c829ddb94954f522ef41f2259b3dc454641255ae6e801792a77ee06a
-size 122321

+ 0 - 3
test_images/1852GatekeepersWindsor.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:64f524b690c10961f6a2a8053583e4f67da42209d8af6b379d25c5682383a2b5
-size 232084

+ 0 - 3
test_images/1860Girls.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:537317db688c01e02be4ee246a785470cd2ee211fd400789c56130a7fbb5ed76
-size 633175

+ 0 - 3
test_images/1860sSamauris.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4f8cb046206642f9af8934995ad4cb790e533f89a72618f0bc4b249f93e077e3
-size 115337

+ 0 - 3
test_images/1864UnionSoldier.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:1bb9ed358f908064af87c158c809a945cc33139d7742f0e7ed35790283ab0464
-size 82395

+ 0 - 3
test_images/1867MusicianConstantinople.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4b1f4b4d0299ea53d71c9a9d016f1ffa4d86fd1a067c41702025263271db0490
-size 129194

+ 0 - 3
test_images/1870Girl.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:e8147cd46316671aa95a3488b0fefa59944a42fdce89e3914f80f33d4c411061
-size 97908

+ 0 - 3
test_images/1870sSphinx.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:0f02b0b7cff589a8db6e2207bb90817a17da31179345fcec5736238a59952326
-size 141240

+ 0 - 3
test_images/1874Mexico.png

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f5a7c895b2aa3ff059d7b1893e21346bc2156b7df7faf3728683959b368805f1
-size 687715

+ 0 - 3
test_images/1875Olds.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:65392fcfc059dba92fef4f8581ea8d98804c554e32779ef5dc37f075dda37e69
-size 8054415

+ 0 - 3
test_images/1880Paris.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c9e26125901020faac2cdbf4111ae30597d2f83135d3928155f56ac8232aa08f
-size 180959

+ 0 - 3
test_images/1880sBrooklynBridge.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3fc70f36ff3792596788e94e4807c889d6a2c2b6ae34aa216ffa7b2859a3aad9
-size 58452

+ 0 - 3
test_images/1886Hoop.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a7d3dc903293dcd3dc78fcc4ac80fa847ff10f0e39fe71bf15515be71390901b
-size 147130

+ 0 - 3
test_images/1886ProspectPark.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:97483a0fb76a72fa356d63bbf08b3b1a2f35d8899c8f0066371205de4cc7f176
-size 157593

+ 0 - 3
test_images/1888Slum.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:e3db6d5a85acc5f298c6e77cfb25176a83925a1f965c33568c68d87ee9fac4f3
-size 69849

+ 0 - 3
test_images/1890BostonHospital.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:bb78baa1340c7ed9eaecb48576e7c92c092b8d5ef8ce12b0c20ba1fcb64f6081
-size 121767

+ 0 - 3
test_images/1890CliffHouseSF.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c2e55c8621a8fc3bd5cdf2d02de55e6b8768f13a3e4003ab207d0e31531fa2d4
-size 48377

+ 0 - 3
test_images/1890Surfer.png

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b5d509d9fd45ed968b8686689394595d20e91027b120ddbb76643dc5bf0b3a46
-size 297061

+ 0 - 3
test_images/1890sChineseImmigrants.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:1149eed69b918bebfcf88218a459b564a477ce04c30d032eeac64142328b9a1e
-size 252364

+ 0 - 3
test_images/1890sMedStudents.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:165f6e8d2cb96dc79dc1558d2ab46a9bd7ab91d1dfbf5cdbf0e306250e85b60e
-size 135206

+ 0 - 3
test_images/1890sPingPong.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:75e2f83e533267cb28919729976ec14a007144ab1afacc874132c6f7028cc03e
-size 227379

+ 0 - 3
test_images/1890sShoeShopOhio.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:77caaf2090de13c3487919ae3ac16d2369f8f4908b2ff23c82d69f6063aa0d93
-size 69692

+ 0 - 3
test_images/1890sTouristsEgypt.png

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fb973a9b9b3213a5aba498e6dddd262c86f6d24d8b24f84298b67d31c75b5f21
-size 932481

+ 0 - 3
test_images/1892WaterLillies.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3f670bcb39e3f0e6d1a57d9bad1c0aac7abd3b9ea21db69c8e81d76e4bd30f94
-size 156605

+ 0 - 3
test_images/1895BikeMaidens.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:490be08a3eab33c71a65b0a64bc3a28598c71728a6d9f0432a901d7311c415a1
-size 108972

+ 0 - 3
test_images/1896NewsBoyGirl.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c625df6e3432fa9b03154fb7d2a5617b17f5690502036a950f2d30c6d9ac6525
-size 40430

+ 0 - 3
test_images/1897BlindmansBluff.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:11ab23fdf71bfc195796b079cdf91e92cce6c0b345c252412cf48489b27964dc
-size 67498

+ 0 - 3
test_images/1897VancouverAmberlamps.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:02a6f4ea0f4214e2a5c2917a311d514cd7290fa9a28c37525fc98f4e79e9a8a4
-size 877517

+ 0 - 3
test_images/1899NycBlizzard.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ab047e2fea66a2609b7a08fcc9c38237e02628ec9632cb560343f985f118c4d2
-size 521801

+ 0 - 3
test_images/1899SodaFountain.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:e5a1312df88d948d7c1122dc3652202b3d84f48cb956c45b9cac81e59fbe9acd
-size 375719

+ 0 - 3
test_images/1900NJThanksgiving.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9ffa8824cb450eeb96f32cf002436d42a75a01e5cca98c2ca8c35d39f6b71bc6
-size 957904

+ 0 - 3
test_images/1900ParkDog.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:5fd53faaafcb2941109489c56e4e45a7aa6bffc2308fab6194f81d1b516233c4
-size 153711

+ 0 - 3
test_images/1900sDaytonaBeach.png

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ba0cf7906beacfaf1bace6aa695b6ee186d09075d8ad8c34721cb595d572a9a5
-size 319993

+ 0 - 3
test_images/1900sLadiesTeaParty.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a101f258edfe04aaa56a2007dd544bd72e36c60dfb90a98403ace46907510bcd
-size 470435

+ 0 - 3
test_images/1900sSaloon.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3ea9a8d01750b5730b24f9916d2a86f3d78c8c26b2f1b9085c7b70c480a1deeb
-size 1057399

+ 0 - 3
test_images/1901Electrophone.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:8c19aa375635b93daf6ebe787b544365a9912fcde66df465d415e8e847d131fa
-size 127896

+ 0 - 3
test_images/1902FrenchYellowBellies.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:afde50ed276a92432bda5f3ef00b4cad09d4455ea7c9a6b176d32074c33bd97f
-size 94042

+ 0 - 3
test_images/1904ChineseMan.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:db671e85d756c98203d99d975eff8c04cacac424d30e511bf792e3fe3d61b4dc
-size 80472

+ 0 - 3
test_images/1907Cowboys.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3b1af96471aea4c33b3cfe4749491e470f27e6e9c79f509a8730ff995e61490f
-size 128624

+ 0 - 3
test_images/1908FamilyPhoto.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:53dc11d50820988f2b7fc4884416090ec13c372c1bf3f9905a20d15d677d109c
-size 80163

+ 0 - 3
test_images/1908RookeriesLondon.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f6edc02efd49d34994b510e70ac00d0d5eb5b307b2203121dab6aa0da9e7e800
-size 173888

+ 0 - 3
test_images/1909Chicago.jpg

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:85fe2a66fdd36e7b70151bf278f74d0135cbcebb7ed63c1ff6aca6e6a69e3fa0
-size 273400

Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff