require(EBImage)
require(magick)
require(tidyverse)
require(ggthemes)
require(knitr)
require(kableExtra)
theme_set(theme_tufte(base_size = 16))
set.seed(3)

Safna öllum myndum í eitt gagnasafn (Kóði)

Allar myndirnar eru geymdar undir yfirmöppunni Myndir sem skiptist í undirmöppur:

  • nirscene1

  • places2

Þær möppurnar skiptast svo í urban / nature sem hafa hvor sína undirhópa:

  • urban: building, indoors, object, streetview

  • nature: field, forest, rock, water

files <- list()
for (db in list.files('Myndir')) {
    for (type in list.files(paste('Myndir', db, sep = '/'))) {
        for (subtype in list.files(paste('Myndir', db, type, sep = '/'))) {
            
            files[[db]][[type]][[subtype]] <- data_frame(database = db,
                       type = type,
                       subtype = subtype,
                       slóð = list.files(paste('Myndir',
                                               db,
                                               type,
                                               subtype,
                                               sep = '/')) %>%
                           paste('Myndir', db, type, subtype, ., sep = '/'))
        }
        
    }
}

Þá er kominn listi af mörgum litlum gagnasöfnum. Næst sameina ég öll litlu gagnsöfnin í eitt stórt.

files_df <- files %>%
    map(~ map(., ~reduce(., rbind))) %>%
    map(~ reduce(., rbind)) %>%
    reduce(rbind)
rm(files)

Það gæti verið að einhverjar möppurnar séu tóma þ.a. ég tek burt allar raðir í gagnarammanum hverrar slóð endar ekki á forminu .(einhverjirbókstafir).

files_df <- files_df %>%
    filter(str_detect(slóð, '([a-zA-Z0-9]+\\.[a-zA-Z]+)'))
files_df %>%
    sample_n(100) %>%
    kable(format = 'html', caption = 'Gagnasafn (hægt að scrolla allt)') %>%
    kable_styling(full_width = TRUE, bootstrap_options = c('striped', 'hover')) %>%
    scroll_box(height = '400px')
Gagnasafn (hægt að scrolla allt)
database type subtype slóð
nirscene1 nature rock Myndir/nirscene1/nature/rock/0016_rgb.tiff
places2 urban building Myndir/places2/urban/building/Places365_val_00001321.jpg
nirscene1 urban indoor Myndir/nirscene1/urban/indoor/0011_rgb.tiff
nirscene1 urban building Myndir/nirscene1/urban/building/building0014_rgb.tiff
places2 nature field Myndir/places2/nature/field/Places365_val_00000300.jpg
places2 urban streetview Myndir/places2/urban/streetview/Places365_val_00001372.jpg
nirscene1 nature forest Myndir/nirscene1/nature/forest/0056_rgb.tiff
nirscene1 nature water Myndir/nirscene1/nature/water/0060_rgb.tiff
nirscene1 urban streetview Myndir/nirscene1/urban/streetview/0079_rgb.tiff
places2 nature field Myndir/places2/nature/field/Places365_val_00001027.jpg
nirscene1 urban indoor Myndir/nirscene1/urban/indoor/0050_rgb.tiff
nirscene1 urban indoor Myndir/nirscene1/urban/indoor/0048_rgb.tiff
nirscene1 urban streetview Myndir/nirscene1/urban/streetview/0000_rgb.tiff
nirscene1 urban streetview Myndir/nirscene1/urban/streetview/0049_rgb.tiff
places2 urban indoor Myndir/places2/urban/indoor/Places365_val_00000753.jpg
places2 urban building Myndir/places2/urban/building/Places365_val_00001077.jpg
nirscene1 nature forest Myndir/nirscene1/nature/forest/0036_rgb.tiff
places2 nature forest Myndir/places2/nature/forest/Places365_val_00001131.jpg
places2 urban indoor Myndir/places2/urban/indoor/Places365_val_00001111.jpg
nirscene1 nature water Myndir/nirscene1/nature/water/0036_rgb.tiff
nirscene1 nature rock Myndir/nirscene1/nature/rock/0039_rgb.tiff
nirscene1 nature field Myndir/nirscene1/nature/field/0010_rgb.tiff
places2 urban streetview Myndir/places2/urban/streetview/Places365_val_00001336.jpg
nirscene1 nature forest Myndir/nirscene1/nature/forest/0023_rgb.tiff
nirscene1 nature rock Myndir/nirscene1/nature/rock/0043_rgb.tiff
places2 nature water Myndir/places2/nature/water/Places365_val_00000510.jpg
nirscene1 urban streetview Myndir/nirscene1/urban/streetview/0067_rgb.tiff
places2 urban indoor Myndir/places2/urban/indoor/Places365_val_00000861.jpg
nirscene1 urban indoor Myndir/nirscene1/urban/indoor/0056_rgb.tiff
places2 nature rock Myndir/places2/nature/rock/Places365_val_00000124.jpg
nirscene1 urban building Myndir/nirscene1/urban/building/building0027_rgb.tiff
nirscene1 urban building Myndir/nirscene1/urban/building/building0022_rgb.tiff
nirscene1 nature rock Myndir/nirscene1/nature/rock/0010_rgb.tiff
nirscene1 urban indoor Myndir/nirscene1/urban/indoor/0021_rgb.tiff
nirscene1 nature water Myndir/nirscene1/nature/water/0006_rgb.tiff
nirscene1 urban building Myndir/nirscene1/urban/building/0058_rgb.tiff
places2 urban building Myndir/places2/urban/building/Places365_val_00001177.jpg
nirscene1 nature rock Myndir/nirscene1/nature/rock/0022_rgb.tiff
places2 urban streetview Myndir/places2/urban/streetview/Places365_val_00001034.jpg
nirscene1 nature rock Myndir/nirscene1/nature/rock/0024_rgb.tiff
nirscene1 nature water Myndir/nirscene1/nature/water/0026_rgb.tiff
places2 urban object Myndir/places2/urban/object/Places365_val_00001194.jpg
nirscene1 nature rock Myndir/nirscene1/nature/rock/0009_rgb.tiff
nirscene1 urban indoor Myndir/nirscene1/urban/indoor/0051_rgb.tiff
nirscene1 urban indoor Myndir/nirscene1/urban/indoor/0001_rgb.tiff
places2 urban object Myndir/places2/urban/object/Places365_val_00001041.jpg
nirscene1 nature field Myndir/nirscene1/nature/field/forest0032_rgb.tiff
nirscene1 nature forest Myndir/nirscene1/nature/forest/0024_rgb.tiff
nirscene1 nature water Myndir/nirscene1/nature/water/0038_rgb.tiff
places2 nature rock Myndir/places2/nature/rock/Places365_val_00000025.jpg
nirscene1 nature rock Myndir/nirscene1/nature/rock/0029_rgb.tiff
places2 urban object Myndir/places2/urban/object/Places365_val_00000654.jpg
places2 nature water Myndir/places2/nature/water/Places365_val_00000897.jpg
places2 urban indoor Myndir/places2/urban/indoor/Places365_val_00000914.jpg
places2 nature rock Myndir/places2/nature/rock/Places365_val_00000714.jpg
places2 nature water Myndir/places2/nature/water/Places365_val_00001591.jpg
nirscene1 urban indoor Myndir/nirscene1/urban/indoor/0015_rgb.tiff
nirscene1 nature rock Myndir/nirscene1/nature/rock/0025_rgb.tiff
places2 urban streetview Myndir/places2/urban/streetview/Places365_val_00000759.jpg
places2 urban indoor Myndir/places2/urban/indoor/Places365_val_00001291.jpg
places2 nature forest Myndir/places2/nature/forest/Places365_val_00001238.jpg
nirscene1 nature field Myndir/nirscene1/nature/field/forest0035_rgb.tiff
places2 nature forest Myndir/places2/nature/forest/Places365_val_00000629.jpg
places2 urban streetview Myndir/places2/urban/streetview/Places365_val_00000323.jpg
places2 nature field Myndir/places2/nature/field/Places365_val_00001394.jpg
nirscene1 nature water Myndir/nirscene1/nature/water/0021_rgb.tiff
places2 nature field Myndir/places2/nature/field/Places365_val_00001161.jpg
nirscene1 urban indoor Myndir/nirscene1/urban/indoor/0029_rgb.tiff
nirscene1 nature water Myndir/nirscene1/nature/water/0083_rgb.tiff
nirscene1 nature forest Myndir/nirscene1/nature/forest/0012_rgb.tiff
places2 nature field Myndir/places2/nature/field/Places365_val_00000637.jpg
places2 urban streetview Myndir/places2/urban/streetview/Places365_val_00000909.jpg
places2 urban indoor Myndir/places2/urban/indoor/Places365_val_00000935.jpg
places2 nature water Myndir/places2/nature/water/Places365_val_00001305.jpg
nirscene1 urban indoor Myndir/nirscene1/urban/indoor/0019_rgb.tiff
nirscene1 urban indoor Myndir/nirscene1/urban/indoor/0027_rgb.tiff
nirscene1 nature forest Myndir/nirscene1/nature/forest/0058_rgb.tiff
places2 urban building Myndir/places2/urban/building/Places365_val_00000290.jpg
places2 nature field Myndir/places2/nature/field/Places365_val_00000716.jpg
nirscene1 urban streetview Myndir/nirscene1/urban/streetview/0097_rgb.tiff
places2 nature field Myndir/places2/nature/field/Places365_val_00000438.jpg
places2 urban indoor Myndir/places2/urban/indoor/Places365_val_00001448.jpg
places2 urban streetview Myndir/places2/urban/streetview/Places365_val_00001335.jpg
nirscene1 nature field Myndir/nirscene1/nature/field/0008_rgb.tiff
places2 nature rock Myndir/places2/nature/rock/Places365_val_00001180.jpg
places2 nature field Myndir/places2/nature/field/Places365_val_00001469.jpg
nirscene1 nature rock Myndir/nirscene1/nature/rock/0012_rgb.tiff
nirscene1 urban indoor Myndir/nirscene1/urban/indoor/0003_rgb.tiff
nirscene1 urban indoor Myndir/nirscene1/urban/indoor/0042_rgb.tiff
places2 nature rock Myndir/places2/nature/rock/Places365_val_00000017.jpg
places2 nature water Myndir/places2/nature/water/Places365_val_00001290.jpg
nirscene1 nature rock Myndir/nirscene1/nature/rock/0030_rgb.tiff
nirscene1 urban building Myndir/nirscene1/urban/building/building0006_rgb.tiff
places2 urban building Myndir/places2/urban/building/Places365_val_00000784.jpg
places2 nature water Myndir/places2/nature/water/Places365_val_00001236.jpg
places2 urban object Myndir/places2/urban/object/Places365_val_00000252.jpg
places2 urban indoor Myndir/places2/urban/indoor/Places365_val_00000657.jpg
places2 urban streetview Myndir/places2/urban/streetview/Places365_val_00000228.jpg
nirscene1 nature forest Myndir/nirscene1/nature/forest/forest0031_rgb.tiff
nirscene1 urban indoor Myndir/nirscene1/urban/indoor/0046_rgb.tiff

Hvernig ég flokkaði myndirnar

Urban

Building

Myndir með eina byggingu í fyrrirrúmi eða sem leggja áherslu á einhvern eiginleika einnar byggingar.

n <- sample(1:10, 1)
files_df %>%
    filter(subtype == 'building') %>%
    slice(n) %>%
    .[['slóð']] %>%
    image_read %>%
    plot()

Indoor

Myndir sem eru teknar innandyra og sýna umhverfi, en ekki bara einn/fáeina hluti.

files_df %>%
    filter(subtype == 'indoor') %>%
    sample_n(., 1) %>%
    .[['slóð']] %>%
    image_read %>%
    plot()

Object

Mynd af hlut eða fyrirbæri sem er einkennandi fyrir borgarlíf bæði utan- og innandyra

files_df %>%
    filter(subtype == 'object') %>%
    slice(n) %>%
    .[['slóð']] %>%
    image_read %>%
    plot()

Streetview

Mynd tekin utandyra sem leggur ekki áherslu á einn sérstakan hlut.

files_df %>%
    filter(subtype == 'streetview') %>%
    slice(n) %>%
    .[['slóð']] %>%
    image_read %>%
    plot()

Nature

Field

Mynd sem einkennist af opnu svæði í náttúrunnu. Getur verið skyld öðrum flokkum en myndin einkennir engan af hinum flokkunum.

files_df %>%
    filter(subtype == 'field') %>%
    slice(n) %>%
    .[['slóð']] %>%
    image_read %>%
    plot()

Forest

Mynd af skógi tekin innan úr skóginum eða nálægt skóginum þar sem skógurinn sjálfur er í fyrirrúmi, en ekki vatn/fjall/opið svæði osf.

files_df %>%
    filter(subtype == 'forest') %>%
    slice(n) %>%
    .[['slóð']] %>%
    image_read %>%
    plot()

Rock

Mynd af fjalli/bergi, þ.e. einkennist af grjóti. Getur verið skógur eða vatn á myndinni en stein-fyrirbæri er í fyrirrúmi.

files_df %>%
    filter(subtype == 'rock') %>%
    slice(n) %>%
    .[['slóð']] %>%
    image_read %>%
    plot()

Water

Mynd með vatn sem aðaláherslu, stöðuvatn, á, sjór osf. Getur verið inni í skógi eða hjá fjalli osf en vatnið einkennir myndina.

files_df %>%
    filter(subtype == 'water') %>%
    slice(n) %>%
    .[['slóð']] %>%
    image_read %>%
    plot()

Gagnasafn í tölum

files_df %>%
    group_by(database) %>%
    tally %>%
    kable
database n
nirscene1 201
places2 141
files_df %>%
    group_by(database, type) %>%
    tally %>%
    kable
database type n
nirscene1 nature 100
nirscene1 urban 101
places2 nature 62
places2 urban 79
files_df %>%
    group_by(database, type, subtype) %>%
    tally %>%
    kable
database type subtype n
nirscene1 nature field 18
nirscene1 nature forest 27
nirscene1 nature rock 34
nirscene1 nature water 21
nirscene1 urban building 23
nirscene1 urban indoor 53
nirscene1 urban streetview 25
places2 nature field 17
places2 nature forest 14
places2 nature rock 15
places2 nature water 16
places2 urban building 14
places2 urban indoor 24
places2 urban object 15
places2 urban streetview 26

Gagnasafn í myndum

Fjöldi mynda eftir flokkum

files_df %>%
    group_by(database, type) %>%
    summarize(n = n()) %>%
    ggplot(aes(type, n, fill = database)) +
    geom_col(position = 'dodge')

files_df %>%
    group_by(database, subtype) %>%
    summarize(n = n()) %>%
    ggplot(aes(database, n, fill = subtype)) +
    geom_col(position = 'dodge')

Um myndirnar

Það eru ekki allar myndirnar jafnstórar eða í sömu hlutföllum. Skoðum dreifingu stærðar og hlutfalla

files_df %>%
    sample_n(100) %>%
    mutate(mynd = map(slóð, readImage),
           breidd = map_int(mynd, nrow),
           hæð = map_int(mynd, ncol)) %>%
    ggplot(aes(breidd/hæð)) +
    geom_density() +
    facet_wrap(~ database, scales = 'free') +
    labs(title = 'dreifing á ratio (breidd/hæð) eftir gagnasafni') +
    ggsave('ratiodens.png', device = 'png')
files_df %>%
    sample_n(100) %>%
    mutate(mynd = map(slóð, readImage),
           breidd = map_int(mynd, nrow),
           hæð = map_int(mynd, ncol)) %>%
    ggplot(aes(breidd*hæð)) +
    geom_density() +
    facet_wrap(~ database, scales = 'free') +
    labs(title = 'dreifing á stærð(breidd*hæð) eftir gagnasafni') +
    ggsave('sizedens.png', device = 'png')

Við sjáum að places myndirnar eru mun dreifðari í hlutföllum auk þess að vera í verri upplausn.

files_df %>%
    sample_n(100) %>%
    mutate(mynd = map(slóð, readImage),
           birtustig = map_dbl(mynd, mean)) %>%
    ggplot(aes(birtustig)) +
    geom_density() +
    facet_wrap(~ database, scales = 'free') +
    labs(title = 'dreifing á meðalbirtustigi eftir gagnasafni') +
    ggsave('birtudens.png', device = 'png')
files_df %>%
    sample_n(100) %>%
    mutate(mynd = map(slóð, readImage),
           birtustig = map_dbl(mynd, sd)) %>%
    ggplot(aes(birtustig)) +
    geom_density() +
    facet_wrap(~ database) +
    labs(title = 'dreifing á contrast eftir gagnasafni') +
    ggsave('contrastdens.png', device = 'png')

Velja myndir

Planið mitt er að sía burt myndir sem eru með of lágt eða of hátt ratio og líka myndir sem eru með of lága upplausn. Get svo komið myndunum í eina stærð. Ég hugsa að það gæti verið sniðugt að sía myndir sem ég stækka mikið með mjög veikum low-pass filter til að losna við rusl pixla frá stækkuninni. Skrái það náttla allt í bókhaldið. Kem svo myndunum á grayscale og aljafna luminance í kringum eitthvað meðaltal.