diff --git a/3.2 - Images - Download pre-downsized images for machine learning.ipynb b/3.2 - Images - Download pre-downsized images for machine learning.ipynb
index 413b54ed22705fb64444ab2e136cfb54377dbdf8..31979d1ce614f7f78e95055657bcd310ec782cb1 100644
--- a/3.2 - Images - Download pre-downsized images for machine learning.ipynb
+++ b/3.2 - Images - Download pre-downsized images for machine learning.ipynb
@@ -28,7 +28,7 @@
},
"source": [
"Let's say you got a bunch of old timey scenery photographs.\n",
- "And you want to extract all images of lakes, why not.\n",
+ "And you want to extract all images containing mountains, why not.\n",
"And, because you can, you want an AI to do all the dirty work for you.\n",
"\n",
"What that has to do with this workshop?\n",
@@ -51,7 +51,7 @@
"* [Keras](https://www.tensorflow.org/guide/keras) or\n",
"* [PyTorch](https://pytorch.org/).\n",
"\n",
- "One way to do it: Download a VGG16 network that's pre-trained on ImageNet, remove the last layer (the actual classifier), add your own output layer with 2 outputs ('lakes', 'no lakes') and train that one.\n",
+ "One way to do it: Download a VGG16 network that's pre-trained on ImageNet, remove the last layer (the actual classifier), add your own output layer with 2 outputs ('mountain', 'no mountain') and train that one.\n",
"\n",
"Now back to the show."
]
@@ -68,11 +68,11 @@
"\n",
"* **Download Metdata**\n",
" * List of all available postcards\n",
- " * Info about the 'lake-ness' of postcards\n",
+ " * Info about the 'mountain-ness' of postcards\n",
"* **Create Download Links**\n",
" * To fetch all images\n",
"* **Split Into Two Sets**\n",
- " * Lakes and non-lakes\n",
+ " * Mountain and non-mountain\n",
"* **Download Images**"
]
},
@@ -80,7 +80,7 @@
"cell_type": "markdown",
"metadata": {
"slideshow": {
- "slide_type": "subslide"
+ "slide_type": "slide"
}
},
"source": [
@@ -103,7 +103,7 @@
"name": "stderr",
"output_type": "stream",
"text": [
- "/home/kst/tmp/dingsdi/lib/python3.7/site-packages/IPython/core/interactiveshell.py:3049: DtypeWarning: Columns (13) have mixed types. Specify dtype option on import or set low_memory=False.\n",
+ "/home/oida/labs/pydays19/venv/lib/python3.7/site-packages/IPython/core/interactiveshell.py:3049: DtypeWarning: Columns (13) have mixed types. Specify dtype option on import or set low_memory=False.\n",
" interactivity=interactivity, compiler=compiler, result=result)\n"
]
}
@@ -120,7 +120,7 @@
},
{
"cell_type": "code",
- "execution_count": 4,
+ "execution_count": 2,
"metadata": {
"slideshow": {
"slide_type": "subslide"
@@ -182,274 +182,282 @@
" \n",
"
\n",
" \n",
- " 21958 | \n",
- " 21958 | \n",
- " AK036_452 | \n",
- " 21573 | \n",
- " 355.0 | \n",
+ " 6683 | \n",
+ " 6683 | \n",
+ " AK121_352 | \n",
+ " 80931 | \n",
" NaN | \n",
- " Piesting | \n",
- " True | \n",
+ " Zwinger | \n",
+ " Dresden | \n",
+ " False | \n",
+ " v. 1907 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
- " Ledermann | \n",
- " Wien | \n",
" NaN | \n",
" NaN | \n",
- " 1906.0 | \n",
" NaN | \n",
" NaN | \n",
- " 2014-08-04 07:59:10.288 | \n",
- " 1906 | \n",
+ " NaN | \n",
+ " Geogr. Topogr. Bilder-Samml. 1943, 7402 | \n",
+ " 2014-08-25 13:52:35.479 | \n",
+ " vor 1907 | \n",
" P | \n",
- " PPLA3 | \n",
- " 2771869.0 | \n",
- " 47.87358 | \n",
- " 16.12510 | \n",
- " Piesting | \n",
- " AT | \n",
+ " PPLA | \n",
+ " 2935022.0 | \n",
+ " 51.05089 | \n",
+ " 13.73832 | \n",
+ " Dresden | \n",
+ " DE | \n",
" NaN | \n",
" NaN | \n",
- " 47.87358, 16.1251 | \n",
+ " 51.05089, 13.73832 | \n",
"
\n",
" \n",
- " 31428 | \n",
- " 31428 | \n",
- " AK102_214 | \n",
- " 66938 | \n",
- " NaN | \n",
+ " 1060 | \n",
+ " 1060 | \n",
+ " AK074_287 | \n",
+ " 45904 | \n",
" NaN | \n",
- " Schaffhausen | \n",
- " False | \n",
- " v. 1907 | \n",
" NaN | \n",
- " Hohfluh | \n",
+ " Solingen | \n",
+ " True | \n",
+ " 1908 gel | \n",
" NaN | \n",
+ " Kaiser Wilhelm-Brücke | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
- " Geogr. Topogr. Bilder-Samml. 1951, 1093 | \n",
- " 2014-09-03 10:50:31.524 | \n",
- " vor 1907 | \n",
- " P | \n",
- " PPLA | \n",
- " 2658761.0 | \n",
- " 47.69732 | \n",
- " 8.63493 | \n",
- " Schaffhausen | \n",
- " CH | \n",
" NaN | \n",
" NaN | \n",
- " 47.69732, 8.63493 | \n",
+ " 2014-08-19 15:22:42.160 | \n",
+ " gelaufen 1908 | \n",
+ " P | \n",
+ " PPLA3 | \n",
+ " 2831580.0 | \n",
+ " 51.17343 | \n",
+ " 7.08450 | \n",
+ " Solingen | \n",
+ " DE | \n",
+ " Nordrhein-Westfalen | \n",
+ " 07 | \n",
+ " 51.17343, 7.0845 | \n",
"
\n",
" \n",
- " 13828 | \n",
- " 13828 | \n",
- " AK008_015 | \n",
- " 4271 | \n",
+ " 34225 | \n",
+ " 34225 | \n",
+ " AK087_169 | \n",
+ " 54994 | \n",
" NaN | \n",
" NaN | \n",
- " Eiskaarspitze | \n",
+ " Venezia, Piazza S. Marco | \n",
" False | \n",
+ " 1925 gel | \n",
+ " NaN | \n",
+ " NaN | \n",
" NaN | \n",
- " Dachstein | \n",
" NaN | \n",
" NaN | \n",
- " Ledermann | \n",
- " Wien | \n",
" NaN | \n",
" NaN | \n",
- " 1921.0 | \n",
" NaN | \n",
" NaN | \n",
- " 2014-08-04 07:59:09.895 | \n",
- " 1921 | \n",
- " T | \n",
- " MT | \n",
- " 2775701.0 | \n",
- " 47.47545 | \n",
- " 13.60588 | \n",
- " Dachstein | \n",
- " AT | \n",
" NaN | \n",
+ " 2014-08-25 09:26:12.544 | \n",
+ " gelaufen 1925 | \n",
+ " P | \n",
+ " PPLA | \n",
+ " 3164603.0 | \n",
+ " 45.43713 | \n",
+ " 12.33265 | \n",
+ " Venecia | \n",
+ " IT | \n",
" NaN | \n",
- " 47.47545, 13.60588 | \n",
+ " NaN | \n",
+ " 45.43713, 12.33265 | \n",
"
\n",
" \n",
- " 22725 | \n",
- " 22725 | \n",
- " AK039_299 | \n",
- " 23224 | \n",
+ " 20250 | \n",
+ " 20250 | \n",
+ " AK030_367 | \n",
+ " 17883 | \n",
" NaN | \n",
" NaN | \n",
- " Attnang | \n",
+ " Vorder Stoder | \n",
" False | \n",
" NaN | \n",
+ " Todtengebirge, Spitzmauer, Kleiner Priel, Groß... | \n",
" NaN | \n",
" NaN | \n",
- " NaN | \n",
- " Topf | \n",
- " Attnang-Puchheim | \n",
+ " Ledermann | \n",
+ " Wien | \n",
" NaN | \n",
" NaN | \n",
- " 1919.0 | \n",
+ " 1909.0 | \n",
" NaN | \n",
" NaN | \n",
- " 2014-08-04 07:59:10.309 | \n",
- " 1919 | \n",
+ " 2014-08-04 07:59:10.235 | \n",
+ " 1909 | \n",
" P | \n",
- " PPLX | \n",
- " 2782285.0 | \n",
- " 48.01667 | \n",
- " 13.71667 | \n",
- " Attnang | \n",
+ " PPL | \n",
+ " 2762185.0 | \n",
+ " 47.71337 | \n",
+ " 14.22712 | \n",
+ " Vorderstoder | \n",
" AT | \n",
" NaN | \n",
" NaN | \n",
- " 48.01667, 13.71667 | \n",
+ " 47.71337, 14.22712 | \n",
"
\n",
" \n",
- " 32047 | \n",
- " 32047 | \n",
- " AK067_186 | \n",
- " 40906 | \n",
+ " 19981 | \n",
+ " 19981 | \n",
+ " AK029_173 | \n",
+ " 17088 | \n",
" NaN | \n",
" NaN | \n",
- " Salzburg | \n",
+ " Pöggstall | \n",
" False | \n",
- " 1918 gel | \n",
- " Mönchsberg | \n",
+ " 1903 gel | \n",
" NaN | \n",
" NaN | \n",
- " Würthle & Sohn Nachfolger G. m. b. H | \n",
- " Salzburg | \n",
" NaN | \n",
+ " Hofmeister | \n",
+ " Pöggstall | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
- " 2014-08-12 14:04:34.797 | \n",
- " gelaufen 1918 | \n",
+ " NaN | \n",
+ " 2014-08-04 07:59:10.223 | \n",
+ " gelaufen 1903 | \n",
" P | \n",
- " PPLA | \n",
- " 2766824.0 | \n",
- " 47.79941 | \n",
- " 13.04399 | \n",
- " Salzburg | \n",
+ " PPLA3 | \n",
+ " 2768616.0 | \n",
+ " 48.31667 | \n",
+ " 15.18333 | \n",
+ " Pöggstall | \n",
" AT | \n",
" NaN | \n",
" NaN | \n",
- " 47.79941, 13.04399 | \n",
+ " 48.31667, 15.18333 | \n",
"
\n",
" \n",
- " 17407 | \n",
- " 17407 | \n",
- " AK020_443 | \n",
- " 11927 | \n",
+ " 30492 | \n",
+ " 30492 | \n",
+ " AK088_055 | \n",
+ " 55510 | \n",
" NaN | \n",
" NaN | \n",
- " Saalfelden | \n",
+ " Neutitschein, Obertorstrasse | \n",
" False | \n",
- " v 1907 | \n",
+ " 1920 gel | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
- " Ledermann | \n",
- " Wien | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
- " 2014-08-04 07:59:10.121 | \n",
- " vor 1907 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 2014-08-28 13:39:02.860 | \n",
+ " gelaufen 1920 | \n",
" P | \n",
- " PPLA3 | \n",
- " 2766922.0 | \n",
- " 47.42681 | \n",
- " 12.84800 | \n",
- " Saalfelden am Steinernen Meer | \n",
- " AT | \n",
+ " PPL | \n",
+ " 3069305.0 | \n",
+ " 49.59438 | \n",
+ " 18.01028 | \n",
+ " Neutitschein | \n",
+ " CZ | \n",
" NaN | \n",
" NaN | \n",
- " 47.42681, 12.848 | \n",
+ " 49.59438, 18.01028 | \n",
"
\n",
" \n",
"\n",
""
],
"text/plain": [
- " Unnamed: 0 akon_id id altitude building city color \\\n",
- "21958 21958 AK036_452 21573 355.0 NaN Piesting True \n",
- "31428 31428 AK102_214 66938 NaN NaN Schaffhausen False \n",
- "13828 13828 AK008_015 4271 NaN NaN Eiskaarspitze False \n",
- "22725 22725 AK039_299 23224 NaN NaN Attnang False \n",
- "32047 32047 AK067_186 40906 NaN NaN Salzburg False \n",
- "17407 17407 AK020_443 11927 NaN NaN Saalfelden False \n",
+ " Unnamed: 0 akon_id id altitude building \\\n",
+ "6683 6683 AK121_352 80931 NaN Zwinger \n",
+ "1060 1060 AK074_287 45904 NaN NaN \n",
+ "34225 34225 AK087_169 54994 NaN NaN \n",
+ "20250 20250 AK030_367 17883 NaN NaN \n",
+ "19981 19981 AK029_173 17088 NaN NaN \n",
+ "30492 30492 AK088_055 55510 NaN NaN \n",
"\n",
- " comment mountain other photographer \\\n",
- "21958 NaN NaN NaN NaN \n",
- "31428 v. 1907 NaN Hohfluh NaN \n",
- "13828 NaN Dachstein NaN NaN \n",
- "22725 NaN NaN NaN NaN \n",
- "32047 1918 gel Mönchsberg NaN NaN \n",
- "17407 v 1907 NaN NaN NaN \n",
+ " city color comment \\\n",
+ "6683 Dresden False v. 1907 \n",
+ "1060 Solingen True 1908 gel \n",
+ "34225 Venezia, Piazza S. Marco False 1925 gel \n",
+ "20250 Vorder Stoder False NaN \n",
+ "19981 Pöggstall False 1903 gel \n",
+ "30492 Neutitschein, Obertorstrasse False 1920 gel \n",
"\n",
- " publisher publisher_place region \\\n",
- "21958 Ledermann Wien NaN \n",
- "31428 NaN NaN NaN \n",
- "13828 Ledermann Wien NaN \n",
- "22725 Topf Attnang-Puchheim NaN \n",
- "32047 Würthle & Sohn Nachfolger G. m. b. H Salzburg NaN \n",
- "17407 Ledermann Wien NaN \n",
+ " mountain \\\n",
+ "6683 NaN \n",
+ "1060 NaN \n",
+ "34225 NaN \n",
+ "20250 Todtengebirge, Spitzmauer, Kleiner Priel, Groß... \n",
+ "19981 NaN \n",
+ "30492 NaN \n",
+ "\n",
+ " other photographer publisher publisher_place region \\\n",
+ "6683 NaN NaN NaN NaN NaN \n",
+ "1060 Kaiser Wilhelm-Brücke NaN NaN NaN NaN \n",
+ "34225 NaN NaN NaN NaN NaN \n",
+ "20250 NaN NaN Ledermann Wien NaN \n",
+ "19981 NaN NaN Hofmeister Pöggstall NaN \n",
+ "30492 NaN NaN NaN NaN NaN \n",
"\n",
" water_body year inventory_number \\\n",
- "21958 NaN 1906.0 NaN \n",
- "31428 NaN NaN NaN \n",
- "13828 NaN 1921.0 NaN \n",
- "22725 NaN 1919.0 NaN \n",
- "32047 NaN NaN NaN \n",
- "17407 NaN NaN NaN \n",
+ "6683 NaN NaN NaN \n",
+ "1060 NaN NaN NaN \n",
+ "34225 NaN NaN NaN \n",
+ "20250 NaN 1909.0 NaN \n",
+ "19981 NaN NaN NaN \n",
+ "30492 NaN NaN NaN \n",
"\n",
" signature revision_date \\\n",
- "21958 NaN 2014-08-04 07:59:10.288 \n",
- "31428 Geogr. Topogr. Bilder-Samml. 1951, 1093 2014-09-03 10:50:31.524 \n",
- "13828 NaN 2014-08-04 07:59:09.895 \n",
- "22725 NaN 2014-08-04 07:59:10.309 \n",
- "32047 NaN 2014-08-12 14:04:34.797 \n",
- "17407 NaN 2014-08-04 07:59:10.121 \n",
+ "6683 Geogr. Topogr. Bilder-Samml. 1943, 7402 2014-08-25 13:52:35.479 \n",
+ "1060 NaN 2014-08-19 15:22:42.160 \n",
+ "34225 NaN 2014-08-25 09:26:12.544 \n",
+ "20250 NaN 2014-08-04 07:59:10.235 \n",
+ "19981 NaN 2014-08-04 07:59:10.223 \n",
+ "30492 NaN 2014-08-28 13:39:02.860 \n",
"\n",
" date feature_class feature_code geoname_id latitude \\\n",
- "21958 1906 P PPLA3 2771869.0 47.87358 \n",
- "31428 vor 1907 P PPLA 2658761.0 47.69732 \n",
- "13828 1921 T MT 2775701.0 47.47545 \n",
- "22725 1919 P PPLX 2782285.0 48.01667 \n",
- "32047 gelaufen 1918 P PPLA 2766824.0 47.79941 \n",
- "17407 vor 1907 P PPLA3 2766922.0 47.42681 \n",
+ "6683 vor 1907 P PPLA 2935022.0 51.05089 \n",
+ "1060 gelaufen 1908 P PPLA3 2831580.0 51.17343 \n",
+ "34225 gelaufen 1925 P PPLA 3164603.0 45.43713 \n",
+ "20250 1909 P PPL 2762185.0 47.71337 \n",
+ "19981 gelaufen 1903 P PPLA3 2768616.0 48.31667 \n",
+ "30492 gelaufen 1920 P PPL 3069305.0 49.59438 \n",
"\n",
- " longitude name country_id admin_name_1 \\\n",
- "21958 16.12510 Piesting AT NaN \n",
- "31428 8.63493 Schaffhausen CH NaN \n",
- "13828 13.60588 Dachstein AT NaN \n",
- "22725 13.71667 Attnang AT NaN \n",
- "32047 13.04399 Salzburg AT NaN \n",
- "17407 12.84800 Saalfelden am Steinernen Meer AT NaN \n",
+ " longitude name country_id admin_name_1 admin_code_1 \\\n",
+ "6683 13.73832 Dresden DE NaN NaN \n",
+ "1060 7.08450 Solingen DE Nordrhein-Westfalen 07 \n",
+ "34225 12.33265 Venecia IT NaN NaN \n",
+ "20250 14.22712 Vorderstoder AT NaN NaN \n",
+ "19981 15.18333 Pöggstall AT NaN NaN \n",
+ "30492 18.01028 Neutitschein CZ NaN NaN \n",
"\n",
- " admin_code_1 geo \n",
- "21958 NaN 47.87358, 16.1251 \n",
- "31428 NaN 47.69732, 8.63493 \n",
- "13828 NaN 47.47545, 13.60588 \n",
- "22725 NaN 48.01667, 13.71667 \n",
- "32047 NaN 47.79941, 13.04399 \n",
- "17407 NaN 47.42681, 12.848 "
+ " geo \n",
+ "6683 51.05089, 13.73832 \n",
+ "1060 51.17343, 7.0845 \n",
+ "34225 45.43713, 12.33265 \n",
+ "20250 47.71337, 14.22712 \n",
+ "19981 48.31667, 15.18333 \n",
+ "30492 49.59438, 18.01028 "
]
},
- "execution_count": 4,
+ "execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
@@ -466,12 +474,12 @@
}
},
"source": [
- "Ok, we have metadata. And look, there's a column *water_body:*"
+ "Ok, we have metadata. And look, there's a column *mountain:*"
]
},
{
"cell_type": "code",
- "execution_count": 4,
+ "execution_count": 3,
"metadata": {},
"outputs": [
{
@@ -496,61 +504,55 @@
" \n",
" | \n",
" akon_id | \n",
- " water_body | \n",
+ " mountain | \n",
"
\n",
" \n",
" \n",
" \n",
- " 19411 | \n",
- " AK027_436 | \n",
- " Millstätter See | \n",
+ " 33148 | \n",
+ " AK076_442 | \n",
+ " Watzmann, Hochkalter | \n",
"
\n",
" \n",
- " 24183 | \n",
- " AK045_467 | \n",
+ " 29503 | \n",
+ " AK070_327 | \n",
" NaN | \n",
"
\n",
" \n",
- " 7038 | \n",
- " AK082_171 | \n",
+ " 5663 | \n",
+ " AK075_470 | \n",
" NaN | \n",
"
\n",
" \n",
- " 21425 | \n",
- " AK035_008 | \n",
+ " 31604 | \n",
+ " AK107_561 | \n",
" NaN | \n",
"
\n",
" \n",
- " 8853 | \n",
- " AK107_209 | \n",
+ " 8748 | \n",
+ " AK091_235 | \n",
" NaN | \n",
"
\n",
- " \n",
- " 27306 | \n",
- " AK057_094 | \n",
- " Csorba See | \n",
- "
\n",
" \n",
"\n",
""
],
"text/plain": [
- " akon_id water_body\n",
- "19411 AK027_436 Millstätter See\n",
- "24183 AK045_467 NaN\n",
- "7038 AK082_171 NaN\n",
- "21425 AK035_008 NaN\n",
- "8853 AK107_209 NaN\n",
- "27306 AK057_094 Csorba See"
+ " akon_id mountain\n",
+ "33148 AK076_442 Watzmann, Hochkalter\n",
+ "29503 AK070_327 NaN\n",
+ "5663 AK075_470 NaN\n",
+ "31604 AK107_561 NaN\n",
+ "8748 AK091_235 NaN"
]
},
- "execution_count": 4,
+ "execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
- "meta.sample(6)[['akon_id', 'water_body']]"
+ "meta.sample(5)[['akon_id', 'mountain']]"
]
},
{
@@ -564,7 +566,7 @@
"cell_type": "markdown",
"metadata": {
"slideshow": {
- "slide_type": "subslide"
+ "slide_type": "slide"
}
},
"source": [
@@ -615,7 +617,7 @@
},
{
"cell_type": "code",
- "execution_count": 11,
+ "execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
@@ -625,7 +627,7 @@
},
{
"cell_type": "code",
- "execution_count": 12,
+ "execution_count": 5,
"metadata": {
"slideshow": {
"slide_type": "fragment"
@@ -638,7 +640,7 @@
"'https://iiif.onb.ac.at/presentation/AKON/AK024_176/manifest'"
]
},
- "execution_count": 12,
+ "execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
@@ -660,7 +662,7 @@
},
{
"cell_type": "code",
- "execution_count": 14,
+ "execution_count": 6,
"metadata": {
"scrolled": true,
"slideshow": {
@@ -735,7 +737,7 @@
" 'on': 'https://iiif.onb.ac.at/presentation/AKON/AK024_176/canvas/176'}]}]}]}"
]
},
- "execution_count": 14,
+ "execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
@@ -755,12 +757,12 @@
}
},
"source": [
- "The manifest link seems to work. Let's add them to the dataframe."
+ "The manifest link seems to work. Let's add manifest links for all postcards to the dataframe:"
]
},
{
"cell_type": "code",
- "execution_count": 16,
+ "execution_count": 7,
"metadata": {
"slideshow": {
"slide_type": "fragment"
@@ -773,7 +775,7 @@
},
{
"cell_type": "code",
- "execution_count": 17,
+ "execution_count": 8,
"metadata": {
"slideshow": {
"slide_type": "fragment"
@@ -807,34 +809,34 @@
" \n",
" \n",
" \n",
- " 34406 | \n",
- " AK072_262 | \n",
- " https://iiif.onb.ac.at/presentation/AKON/AK072... | \n",
+ " 32242 | \n",
+ " AK049_538 | \n",
+ " https://iiif.onb.ac.at/presentation/AKON/AK049... | \n",
"
\n",
" \n",
- " 30373 | \n",
- " AK085_299 | \n",
- " https://iiif.onb.ac.at/presentation/AKON/AK085... | \n",
+ " 10827 | \n",
+ " AK001_237 | \n",
+ " https://iiif.onb.ac.at/presentation/AKON/AK001... | \n",
"
\n",
" \n",
- " 18098 | \n",
- " AK023_263 | \n",
- " https://iiif.onb.ac.at/presentation/AKON/AK023... | \n",
+ " 14148 | \n",
+ " AK009_081 | \n",
+ " https://iiif.onb.ac.at/presentation/AKON/AK009... | \n",
"
\n",
" \n",
- " 3152 | \n",
- " AK122_506 | \n",
- " https://iiif.onb.ac.at/presentation/AKON/AK122... | \n",
+ " 8074 | \n",
+ " AK087_246 | \n",
+ " https://iiif.onb.ac.at/presentation/AKON/AK087... | \n",
"
\n",
" \n",
- " 31981 | \n",
- " AK097_136 | \n",
- " https://iiif.onb.ac.at/presentation/AKON/AK097... | \n",
+ " 33232 | \n",
+ " AK082_006 | \n",
+ " https://iiif.onb.ac.at/presentation/AKON/AK082... | \n",
"
\n",
" \n",
- " 160 | \n",
- " AK111_325 | \n",
- " https://iiif.onb.ac.at/presentation/AKON/AK111... | \n",
+ " 22877 | \n",
+ " AK040_083 | \n",
+ " https://iiif.onb.ac.at/presentation/AKON/AK040... | \n",
"
\n",
" \n",
"\n",
@@ -842,15 +844,15 @@
],
"text/plain": [
" akon_id manifest_link\n",
- "34406 AK072_262 https://iiif.onb.ac.at/presentation/AKON/AK072...\n",
- "30373 AK085_299 https://iiif.onb.ac.at/presentation/AKON/AK085...\n",
- "18098 AK023_263 https://iiif.onb.ac.at/presentation/AKON/AK023...\n",
- "3152 AK122_506 https://iiif.onb.ac.at/presentation/AKON/AK122...\n",
- "31981 AK097_136 https://iiif.onb.ac.at/presentation/AKON/AK097...\n",
- "160 AK111_325 https://iiif.onb.ac.at/presentation/AKON/AK111..."
+ "32242 AK049_538 https://iiif.onb.ac.at/presentation/AKON/AK049...\n",
+ "10827 AK001_237 https://iiif.onb.ac.at/presentation/AKON/AK001...\n",
+ "14148 AK009_081 https://iiif.onb.ac.at/presentation/AKON/AK009...\n",
+ "8074 AK087_246 https://iiif.onb.ac.at/presentation/AKON/AK087...\n",
+ "33232 AK082_006 https://iiif.onb.ac.at/presentation/AKON/AK082...\n",
+ "22877 AK040_083 https://iiif.onb.ac.at/presentation/AKON/AK040..."
]
},
- "execution_count": 17,
+ "execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
@@ -879,7 +881,7 @@
},
{
"cell_type": "code",
- "execution_count": 18,
+ "execution_count": 9,
"metadata": {
"scrolled": true
},
@@ -951,7 +953,7 @@
" 'on': 'https://iiif.onb.ac.at/presentation/AKON/AK024_176/canvas/176'}]}]}]}"
]
},
- "execution_count": 18,
+ "execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
@@ -976,7 +978,7 @@
},
{
"cell_type": "code",
- "execution_count": 21,
+ "execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
@@ -987,7 +989,7 @@
},
{
"cell_type": "code",
- "execution_count": 23,
+ "execution_count": 11,
"metadata": {
"slideshow": {
"slide_type": "fragment"
@@ -1000,7 +1002,7 @@
"['https://iiif.onb.ac.at/images/AKON/AK024_176/176/full/full/0/native.jpg']"
]
},
- "execution_count": 23,
+ "execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
@@ -1022,7 +1024,7 @@
},
{
"cell_type": "code",
- "execution_count": 27,
+ "execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
@@ -1033,40 +1035,26 @@
" try:\n",
" json = r.json()\n",
" except:\n",
- " # default to empty on any errors\n",
- " # makes batch processing easier in pandas\n",
+ " # default to empty on exceptions - makes batch processing easier in pandas\n",
" json = {}\n",
" image_links = [match.value for match in image_id_jp.find(json)]\n",
" return image_links"
]
},
{
- "cell_type": "code",
- "execution_count": 28,
+ "cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "['https://iiif.onb.ac.at/images/AKON/AK024_176/176/full/full/0/native.jpg']"
- ]
- },
- "execution_count": 28,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
"source": [
- "image_links_for_manifest_link(akon_id_to_manifest_link('AK024_176'))"
+ "Let's test it:"
]
},
{
"cell_type": "code",
- "execution_count": 29,
+ "execution_count": 13,
"metadata": {
"slideshow": {
"slide_type": "fragment"
@@ -1076,21 +1064,27 @@
{
"data": {
"text/plain": [
- "['https://iiif.onb.ac.at/images/AKON/AK111_325/325/full/full/0/native.jpg']"
+ "['https://iiif.onb.ac.at/images/AKON/AK036_284/284/full/full/0/native.jpg']"
]
},
- "execution_count": 29,
+ "execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
- "image_links_for_manifest_link(akon_id_to_manifest_link('AK111_325'))"
+ "random_akon_id = meta.sample().iloc[0]['akon_id']\n",
+ "manifest_link = akon_id_to_manifest_link(random_akon_id)\n",
+ "image_links_for_manifest_link(manifest_link)"
]
},
{
"cell_type": "markdown",
- "metadata": {},
+ "metadata": {
+ "slideshow": {
+ "slide_type": "fragment"
+ }
+ },
"source": [
"Looking good."
]
@@ -1110,22 +1104,13 @@
},
{
"cell_type": "code",
- "execution_count": 31,
+ "execution_count": 14,
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "CPU times: user 7min 26s, sys: 18 s, total: 7min 44s\n",
- "Wall time: 12min 34s\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"# %%time\n",
"# meta['image_links'] = meta['manifest_link'].apply(image_links_for_manifest_link)"
@@ -1133,120 +1118,914 @@
},
{
"cell_type": "code",
- "execution_count": 33,
+ "execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
- "/home/kst/tmp/dingsdi/lib/python3.7/site-packages/IPython/core/interactiveshell.py:3049: DtypeWarning: Columns (14) have mixed types. Specify dtype option on import or set low_memory=False.\n",
+ "/home/oida/labs/pydays19/venv/lib/python3.7/site-packages/IPython/core/interactiveshell.py:3049: DtypeWarning: Columns (14) have mixed types. Specify dtype option on import or set low_memory=False.\n",
" interactivity=interactivity, compiler=compiler, result=result)\n"
]
}
],
"source": [
- "meta = pd.read_csv('postcards_with_image_links.csv.bz2', compression='bz2')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "## Split Into Two Sets"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**TODO**"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "## Download"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**TODO**"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "# Just The Code"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "import pandas as pd\n",
- "\n",
- "\n",
- "def akon_id_to_manifest_link(akon_id):\n",
- " return f'https://iiif.onb.ac.at/presentation/AKON/{akon_id}/manifest'\n",
+ "import json\n",
"\n",
+ "def load_json(s):\n",
+ " try:\n",
+ " return json.loads(s.replace(\"'\", '\"'))\n",
+ " except:\n",
+ " return []\n",
"\n",
- "meta = pd.read_csv('https://labs.onb.ac.at/gitlab/labs-team/' \\\n",
- " 'raw-metadata/raw/master/akon_postcards_public_domain.csv.bz2', compression='bz2')\n",
- "meta['manifest_link'] = meta['akon_id'].apply(akon_id_to_manifest_link)"
+ "meta = pd.read_csv('postcards_with_image_links.csv.bz2', compression='bz2', converters={\n",
+ " 'image_links': load_json\n",
+ "})"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 16,
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
- "outputs": [],
- "source": [
- "import requests\n",
- "from jsonpath_ng import jsonpath, parse\n",
- "\n",
- "\n",
- "image_id_jp = parse('$.sequences[*].canvases[*].images[*].resource.@id')\n",
- "\n",
- "def image_links_for_manifest_link(manifest_link):\n",
- " r = requests.get(manifest_link)\n",
- " try:\n",
- " json = r.json()\n",
- " except:\n",
- " json = {}\n",
- " return [match.value for match in image_id_jp.find(json)]\n",
- "\n",
- "\n",
- "meta['image_links'] = meta['manifest_link'].apply(image_links_for_manifest_link)"
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Unnamed: 0 | \n",
+ " Unnamed: 0.1 | \n",
+ " akon_id | \n",
+ " id | \n",
+ " altitude | \n",
+ " building | \n",
+ " city | \n",
+ " color | \n",
+ " comment | \n",
+ " mountain | \n",
+ " other | \n",
+ " photographer | \n",
+ " publisher | \n",
+ " publisher_place | \n",
+ " region | \n",
+ " water_body | \n",
+ " year | \n",
+ " inventory_number | \n",
+ " signature | \n",
+ " revision_date | \n",
+ " date | \n",
+ " feature_class | \n",
+ " feature_code | \n",
+ " geoname_id | \n",
+ " latitude | \n",
+ " longitude | \n",
+ " name | \n",
+ " country_id | \n",
+ " admin_name_1 | \n",
+ " admin_code_1 | \n",
+ " geo | \n",
+ " manifest_link | \n",
+ " image_links | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 243 | \n",
+ " 243 | \n",
+ " 243 | \n",
+ " AK111_476 | \n",
+ " 75139 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " Rochlitz | \n",
+ " False | \n",
+ " v. 1907 | \n",
+ " Rochlitzer Berg | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " Niederösterreichische Landesbibliothek 1672 | \n",
+ " 2014-09-05 11:30:43.299 | \n",
+ " vor 1907 | \n",
+ " T | \n",
+ " HLL | \n",
+ " 2846260.0 | \n",
+ " 51.02678 | \n",
+ " 12.77079 | \n",
+ " Rochlitzer Berg | \n",
+ " DE | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 51.02678, 12.77079 | \n",
+ " https://iiif.onb.ac.at/presentation/AKON/AK111... | \n",
+ " [https://iiif.onb.ac.at/images/AKON/AK111_476/... | \n",
+ "
\n",
+ " \n",
+ " 34809 | \n",
+ " 34809 | \n",
+ " 34809 | \n",
+ " AK073_578 | \n",
+ " 45523 | \n",
+ " NaN | \n",
+ " Kgl. Residenz | \n",
+ " Würzburg | \n",
+ " False | \n",
+ " 1909 gel | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " Martin | \n",
+ " Nürnberg | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 2014-08-19 14:22:35.340 | \n",
+ " gelaufen 1909 | \n",
+ " P | \n",
+ " PPLA2 | \n",
+ " 2805615.0 | \n",
+ " 49.79391 | \n",
+ " 9.95121 | \n",
+ " Würzburg | \n",
+ " DE | \n",
+ " Bayern | \n",
+ " 02 | \n",
+ " 49.79391, 9.95121 | \n",
+ " https://iiif.onb.ac.at/presentation/AKON/AK073... | \n",
+ " [https://iiif.onb.ac.at/images/AKON/AK073_578/... | \n",
+ "
\n",
+ " \n",
+ " 18069 | \n",
+ " 18069 | \n",
+ " 18069 | \n",
+ " AK023_145 | \n",
+ " 13445 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " Villach | \n",
+ " True | \n",
+ " NaN | \n",
+ " Mittagskogel | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 1912.0 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 2014-08-04 07:59:10.156 | \n",
+ " 1912 | \n",
+ " P | \n",
+ " PPLA2 | \n",
+ " 2762372.0 | \n",
+ " 46.61028 | \n",
+ " 13.85583 | \n",
+ " Villach | \n",
+ " AT | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 46.61028, 13.85583 | \n",
+ " https://iiif.onb.ac.at/presentation/AKON/AK023... | \n",
+ " [https://iiif.onb.ac.at/images/AKON/AK023_145/... | \n",
+ "
\n",
+ " \n",
+ " 4554 | \n",
+ " 4554 | \n",
+ " 4554 | \n",
+ " AK034_086 | \n",
+ " 20003 | \n",
+ " 693.0 | \n",
+ " Chorherrensift Vorau | \n",
+ " Vorau | \n",
+ " False | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " Raza | \n",
+ " Vorau | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 1924.0 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 2014-09-16 14:48:11.455 | \n",
+ " 1924 | \n",
+ " S | \n",
+ " MSTY | \n",
+ " 2762297.0 | \n",
+ " 47.40000 | \n",
+ " 15.90000 | \n",
+ " Stift Vorau | \n",
+ " AT | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 47.4, 15.9 | \n",
+ " https://iiif.onb.ac.at/presentation/AKON/AK034... | \n",
+ " [https://iiif.onb.ac.at/images/AKON/AK034_086/... | \n",
+ "
\n",
+ " \n",
+ " 20907 | \n",
+ " 20907 | \n",
+ " 20907 | \n",
+ " AK032_497 | \n",
+ " 19311 | \n",
+ " NaN | \n",
+ " Schloss Purgstall | \n",
+ " NaN | \n",
+ " False | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 1918.0 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 2014-08-04 07:59:10.257 | \n",
+ " 1918 | \n",
+ " A | \n",
+ " ADM3 | \n",
+ " 7873031.0 | \n",
+ " 48.05513 | \n",
+ " 15.13316 | \n",
+ " Purgstall an der Erlauf | \n",
+ " AT | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 48.05513, 15.13316 | \n",
+ " https://iiif.onb.ac.at/presentation/AKON/AK032... | \n",
+ " [https://iiif.onb.ac.at/images/AKON/AK032_497/... | \n",
+ "
\n",
+ " \n",
+ " 5136 | \n",
+ " 5136 | \n",
+ " 5136 | \n",
+ " AK111_054 | \n",
+ " 74715 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " Kindberg | \n",
+ " False | \n",
+ " 1901 gel | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " Niederösterreichische Landesbibliothek 1664 | \n",
+ " 2014-09-05 10:17:42.132 | \n",
+ " gelaufen 1901 | \n",
+ " P | \n",
+ " PPLA3 | \n",
+ " 2774437.0 | \n",
+ " 47.50000 | \n",
+ " 15.45000 | \n",
+ " Kindberg | \n",
+ " AT | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 47.5, 15.45 | \n",
+ " https://iiif.onb.ac.at/presentation/AKON/AK111... | \n",
+ " [https://iiif.onb.ac.at/images/AKON/AK111_054/... | \n",
+ "
\n",
+ " \n",
+ " 3871 | \n",
+ " 3871 | \n",
+ " 3871 | \n",
+ " AK125_381 | \n",
+ " 83488 | \n",
+ " 601.0 | \n",
+ " Hans Hackl's Gasthof zum Jaidhaus | \n",
+ " Hinterstoder | \n",
+ " False | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 1911.0 | \n",
+ " NaN | \n",
+ " Nationalbibliothek Karten Abteilung 5862 | \n",
+ " 2014-09-12 16:07:31.780 | \n",
+ " 1911 | \n",
+ " P | \n",
+ " PPL | \n",
+ " 2776235.0 | \n",
+ " 47.69957 | \n",
+ " 14.15468 | \n",
+ " Hinterstoder | \n",
+ " AT | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 47.69957, 14.15468 | \n",
+ " https://iiif.onb.ac.at/presentation/AKON/AK125... | \n",
+ " [https://iiif.onb.ac.at/images/AKON/AK125_381/... | \n",
+ "
\n",
+ " \n",
+ " 1174 | \n",
+ " 1174 | \n",
+ " 1174 | \n",
+ " AK116_235 | \n",
+ " 77922 | \n",
+ " NaN | \n",
+ " Burgruine Gars | \n",
+ " Gars a. Kamp | \n",
+ " False | \n",
+ " 1913 gel | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " Kiennast | \n",
+ " Gars | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 79/59 K | \n",
+ " NaN | \n",
+ " 2014-09-09 12:22:52.928 | \n",
+ " gelaufen 1913 | \n",
+ " P | \n",
+ " PPLA3 | \n",
+ " 2778845.0 | \n",
+ " 48.58333 | \n",
+ " 15.65000 | \n",
+ " Gars am Kamp | \n",
+ " AT | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 48.58333, 15.65 | \n",
+ " https://iiif.onb.ac.at/presentation/AKON/AK116... | \n",
+ " [https://iiif.onb.ac.at/images/AKON/AK116_235/... | \n",
+ "
\n",
+ " \n",
+ " 1897 | \n",
+ " 1897 | \n",
+ " 1897 | \n",
+ " AK118_376 | \n",
+ " 65136 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " False | \n",
+ " 1925 gel | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " Grundlsee | \n",
+ " NaN | \n",
+ " 11/44 Kt. | \n",
+ " Geogr. Topogr. Bilder-Samml. 1944, 4144 | \n",
+ " 2014-09-10 07:51:30.611 | \n",
+ " gelaufen 1925 | \n",
+ " H | \n",
+ " LK | \n",
+ " 2777424.0 | \n",
+ " 47.63333 | \n",
+ " 13.86667 | \n",
+ " Grundlsee | \n",
+ " AT | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 47.63333, 13.86667 | \n",
+ " https://iiif.onb.ac.at/presentation/AKON/AK118... | \n",
+ " [https://iiif.onb.ac.at/images/AKON/AK118_376/... | \n",
+ "
\n",
+ " \n",
+ " 33243 | \n",
+ " 33243 | \n",
+ " 33243 | \n",
+ " AK083_217 | \n",
+ " 52264 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " Höllenthal | \n",
+ " False | \n",
+ " v 1905 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " Johannes | \n",
+ " Partenkirchen-Garmisch | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 2014-08-26 12:14:56.005 | \n",
+ " vor 1905 | \n",
+ " T | \n",
+ " CRQ | \n",
+ " 2900507.0 | \n",
+ " 47.43333 | \n",
+ " 11.01667 | \n",
+ " Höllental Kar | \n",
+ " DE | \n",
+ " Bayern | \n",
+ " 02 | \n",
+ " 47.43333, 11.01667 | \n",
+ " https://iiif.onb.ac.at/presentation/AKON/AK083... | \n",
+ " [https://iiif.onb.ac.at/images/AKON/AK083_217/... | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Unnamed: 0 Unnamed: 0.1 akon_id id altitude \\\n",
+ "243 243 243 AK111_476 75139 NaN \n",
+ "34809 34809 34809 AK073_578 45523 NaN \n",
+ "18069 18069 18069 AK023_145 13445 NaN \n",
+ "4554 4554 4554 AK034_086 20003 693.0 \n",
+ "20907 20907 20907 AK032_497 19311 NaN \n",
+ "5136 5136 5136 AK111_054 74715 NaN \n",
+ "3871 3871 3871 AK125_381 83488 601.0 \n",
+ "1174 1174 1174 AK116_235 77922 NaN \n",
+ "1897 1897 1897 AK118_376 65136 NaN \n",
+ "33243 33243 33243 AK083_217 52264 NaN \n",
+ "\n",
+ " building city color comment \\\n",
+ "243 NaN Rochlitz False v. 1907 \n",
+ "34809 Kgl. Residenz Würzburg False 1909 gel \n",
+ "18069 NaN Villach True NaN \n",
+ "4554 Chorherrensift Vorau Vorau False NaN \n",
+ "20907 Schloss Purgstall NaN False NaN \n",
+ "5136 NaN Kindberg False 1901 gel \n",
+ "3871 Hans Hackl's Gasthof zum Jaidhaus Hinterstoder False NaN \n",
+ "1174 Burgruine Gars Gars a. Kamp False 1913 gel \n",
+ "1897 NaN NaN False 1925 gel \n",
+ "33243 NaN Höllenthal False v 1905 \n",
+ "\n",
+ " mountain other photographer publisher publisher_place \\\n",
+ "243 Rochlitzer Berg NaN NaN NaN NaN \n",
+ "34809 NaN NaN NaN Martin Nürnberg \n",
+ "18069 Mittagskogel NaN NaN NaN NaN \n",
+ "4554 NaN NaN NaN Raza Vorau \n",
+ "20907 NaN NaN NaN NaN NaN \n",
+ "5136 NaN NaN NaN NaN NaN \n",
+ "3871 NaN NaN NaN NaN NaN \n",
+ "1174 NaN NaN NaN Kiennast Gars \n",
+ "1897 NaN NaN NaN NaN NaN \n",
+ "33243 NaN NaN NaN Johannes Partenkirchen-Garmisch \n",
+ "\n",
+ " region water_body year inventory_number \\\n",
+ "243 NaN NaN NaN NaN \n",
+ "34809 NaN NaN NaN NaN \n",
+ "18069 NaN NaN 1912.0 NaN \n",
+ "4554 NaN NaN 1924.0 NaN \n",
+ "20907 NaN NaN 1918.0 NaN \n",
+ "5136 NaN NaN NaN NaN \n",
+ "3871 NaN NaN 1911.0 NaN \n",
+ "1174 NaN NaN NaN 79/59 K \n",
+ "1897 NaN Grundlsee NaN 11/44 Kt. \n",
+ "33243 NaN NaN NaN NaN \n",
+ "\n",
+ " signature revision_date \\\n",
+ "243 Niederösterreichische Landesbibliothek 1672 2014-09-05 11:30:43.299 \n",
+ "34809 NaN 2014-08-19 14:22:35.340 \n",
+ "18069 NaN 2014-08-04 07:59:10.156 \n",
+ "4554 NaN 2014-09-16 14:48:11.455 \n",
+ "20907 NaN 2014-08-04 07:59:10.257 \n",
+ "5136 Niederösterreichische Landesbibliothek 1664 2014-09-05 10:17:42.132 \n",
+ "3871 Nationalbibliothek Karten Abteilung 5862 2014-09-12 16:07:31.780 \n",
+ "1174 NaN 2014-09-09 12:22:52.928 \n",
+ "1897 Geogr. Topogr. Bilder-Samml. 1944, 4144 2014-09-10 07:51:30.611 \n",
+ "33243 NaN 2014-08-26 12:14:56.005 \n",
+ "\n",
+ " date feature_class feature_code geoname_id latitude \\\n",
+ "243 vor 1907 T HLL 2846260.0 51.02678 \n",
+ "34809 gelaufen 1909 P PPLA2 2805615.0 49.79391 \n",
+ "18069 1912 P PPLA2 2762372.0 46.61028 \n",
+ "4554 1924 S MSTY 2762297.0 47.40000 \n",
+ "20907 1918 A ADM3 7873031.0 48.05513 \n",
+ "5136 gelaufen 1901 P PPLA3 2774437.0 47.50000 \n",
+ "3871 1911 P PPL 2776235.0 47.69957 \n",
+ "1174 gelaufen 1913 P PPLA3 2778845.0 48.58333 \n",
+ "1897 gelaufen 1925 H LK 2777424.0 47.63333 \n",
+ "33243 vor 1905 T CRQ 2900507.0 47.43333 \n",
+ "\n",
+ " longitude name country_id admin_name_1 \\\n",
+ "243 12.77079 Rochlitzer Berg DE NaN \n",
+ "34809 9.95121 Würzburg DE Bayern \n",
+ "18069 13.85583 Villach AT NaN \n",
+ "4554 15.90000 Stift Vorau AT NaN \n",
+ "20907 15.13316 Purgstall an der Erlauf AT NaN \n",
+ "5136 15.45000 Kindberg AT NaN \n",
+ "3871 14.15468 Hinterstoder AT NaN \n",
+ "1174 15.65000 Gars am Kamp AT NaN \n",
+ "1897 13.86667 Grundlsee AT NaN \n",
+ "33243 11.01667 Höllental Kar DE Bayern \n",
+ "\n",
+ " admin_code_1 geo \\\n",
+ "243 NaN 51.02678, 12.77079 \n",
+ "34809 02 49.79391, 9.95121 \n",
+ "18069 NaN 46.61028, 13.85583 \n",
+ "4554 NaN 47.4, 15.9 \n",
+ "20907 NaN 48.05513, 15.13316 \n",
+ "5136 NaN 47.5, 15.45 \n",
+ "3871 NaN 47.69957, 14.15468 \n",
+ "1174 NaN 48.58333, 15.65 \n",
+ "1897 NaN 47.63333, 13.86667 \n",
+ "33243 02 47.43333, 11.01667 \n",
+ "\n",
+ " manifest_link \\\n",
+ "243 https://iiif.onb.ac.at/presentation/AKON/AK111... \n",
+ "34809 https://iiif.onb.ac.at/presentation/AKON/AK073... \n",
+ "18069 https://iiif.onb.ac.at/presentation/AKON/AK023... \n",
+ "4554 https://iiif.onb.ac.at/presentation/AKON/AK034... \n",
+ "20907 https://iiif.onb.ac.at/presentation/AKON/AK032... \n",
+ "5136 https://iiif.onb.ac.at/presentation/AKON/AK111... \n",
+ "3871 https://iiif.onb.ac.at/presentation/AKON/AK125... \n",
+ "1174 https://iiif.onb.ac.at/presentation/AKON/AK116... \n",
+ "1897 https://iiif.onb.ac.at/presentation/AKON/AK118... \n",
+ "33243 https://iiif.onb.ac.at/presentation/AKON/AK083... \n",
+ "\n",
+ " image_links \n",
+ "243 [https://iiif.onb.ac.at/images/AKON/AK111_476/... \n",
+ "34809 [https://iiif.onb.ac.at/images/AKON/AK073_578/... \n",
+ "18069 [https://iiif.onb.ac.at/images/AKON/AK023_145/... \n",
+ "4554 [https://iiif.onb.ac.at/images/AKON/AK034_086/... \n",
+ "20907 [https://iiif.onb.ac.at/images/AKON/AK032_497/... \n",
+ "5136 [https://iiif.onb.ac.at/images/AKON/AK111_054/... \n",
+ "3871 [https://iiif.onb.ac.at/images/AKON/AK125_381/... \n",
+ "1174 [https://iiif.onb.ac.at/images/AKON/AK116_235/... \n",
+ "1897 [https://iiif.onb.ac.at/images/AKON/AK118_376/... \n",
+ "33243 [https://iiif.onb.ac.at/images/AKON/AK083_217/... "
+ ]
+ },
+ "execution_count": 16,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "meta.sample(10)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "source": [
+ "## Split Into Two Sets"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We'll split the dataframe into two: One with mountains, one without."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "fragment"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "nomountain = meta[ meta['mountain'].isnull() ]\n",
+ "mountain = meta[ ~ meta['mountain'].isnull() ]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "fragment"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(34846, 29271, 5575)"
+ ]
+ },
+ "execution_count": 18,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "len(meta), len(nomountain), len(mountain)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Yeah, that adds up."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "source": [
+ "## Download"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Ok, so what's left to do?\n",
+ "\n",
+ "* Download all image data into two separate directories for training\n",
+ "* Resize the images for the CNN used\n",
+ "\n",
+ "VGG16 and VGG19 expect 224x224 pixel RGB images."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "source": [
+ "Luckily, IIIF allows us to request images already resized to our demands. That saves on bandwidth, time and code complexity.\n",
+ "\n",
+ "According to the [standard](https://iiif.io/api/image/2.1/#size) we can use the `size` parameter to resize the image exactly to the dimensions we need.\n",
+ "\n",
+ "The links, before and after, would be:\n",
+ "\n",
+ "`https://iiif.onb.ac.at/images/AKON/AK024_176/176/full/full/0/native.jpg`\n",
+ "\n",
+ "`https://iiif.onb.ac.at/images/AKON/AK024_176/176/full/224,224/0/native.jpg`"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "source": [
+ "Let's try it:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "fragment"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "r = requests.get('https://iiif.onb.ac.at/images/AKON/AK024_176/176/full/224,224/0/native.jpg')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "fragment"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "from IPython.display import display, Image"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "fragment"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/jpeg": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "display(Image(r.content))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "That looks about right."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "source": [
+ "Download to file:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "-"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "import shutil\n",
+ "\n",
+ "def download_to_file(url, filename):\n",
+ " with requests.get(url, stream=True) as r:\n",
+ " with open(filename, 'wb') as fh:\n",
+ " shutil.copyfileobj(r.raw, fh)\n",
+ "\n",
+ "def sized_link(iiif_url, size='224,224'):\n",
+ " frags = iiif_url.split('/')\n",
+ " frags[-3] = size\n",
+ " return '/'.join(frags)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "fragment"
+ }
+ },
+ "source": [
+ "Test that:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "link = sized_link('https://iiif.onb.ac.at/images/AKON/AK024_176/176/full/full/0/native.jpg')\n",
+ "download_to_file(link, 'testimg.jpg')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "fragment"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/jpeg": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "with open('testimg.jpg', 'rb') as fh:\n",
+ " display(Image(fh.read()))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "source": [
+ "Create directories:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "-"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "import os\n",
+ "\n",
+ "os.mkdir('./images')\n",
+ "os.mkdir('./images/mountain')\n",
+ "os.mkdir('./images/nomountain')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "source": [
+ "Now let's download!"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "...................."
+ ]
+ }
+ ],
+ "source": [
+ "# For this demonstration we'll just take 10 images each\n",
+ "for idx, row in mountain.sample(10).iterrows():\n",
+ " akon_id = row['akon_id']\n",
+ " for n, link in enumerate(row['image_links']):\n",
+ " small_image_link = sized_link(link)\n",
+ " file_name = f'./images/mountain/{akon_id}_{n}.jpg'\n",
+ " download_to_file(small_image_link, file_name)\n",
+ " print('.', end='')\n",
+ "for idx, row in nomountain.sample(10).iterrows():\n",
+ " akon_id = row['akon_id']\n",
+ " for n, link in enumerate(row['image_links']):\n",
+ " small_image_link = sized_link(link)\n",
+ " file_name = f'./images/nomountain/{akon_id}_{n}.jpg'\n",
+ " download_to_file(small_image_link, file_name)\n",
+ " print('.', end='') "
]
}
],