Разделите одну папку (с изображениями) на две и переместите изображения в новую папку - PullRequest
2 голосов
/ 08 апреля 2020

У меня есть одна папка, которая называется train , которая содержит две подпапки hot_dog и not_hot_dog . Из первой папки train Я хотел бы случайным образом выбрать изображения из обеих подпапок hot_dog и not_hot_dog и поместить их в новую папку, которая называется validation . В этой папке проверки снова есть две подпапки, которые называются hot_dog и not_hot_dog . Количество случайно выбранных изображений должно составлять ок. 20% от исходного количества изображений. Те изображения, которые были случайно выбраны и сохранены в новой папке проверки , должны быть удалены в исходной папке train .

Структура текущей папки выглядит следующим образом:

current folder structure

Конечный результат структуры папок должен выглядеть следующим образом:

target folder structure

Ответы [ 3 ]

1 голос
/ 08 апреля 2020

Сначала укажите текущему рабочему каталогу путь, по которому папка train расположена в setwd(). Затем запустите следующий код:

# setwd("path/to/folder/train")
path1 <- file.path("train", c("hot_dog", "not_hot_dog"))
path2 <- file.path("validation", c("hot_dog", "not_hot_dog"))
dir.create("validation")
lapply(path2, dir.create)
Map(function(x, y){
  file <- dir(x) ; n <- length(file)
  file_selected <- file.path(x, sample(file, ceiling(n * 0.2)))
  file.copy(file_selected, y)
  file.remove(file_selected)
}, path1, path2)

1 голос
/ 08 апреля 2020

Вот базовый подход R, который может работать для вас. Это не то, что я бы назвал элегантным, но это относительно легко понять.

Обязательно замените ~/Stack Overflow/ тем каталогом, в котором находится ваш каталог train.

Короче говоря, мы используем dir.create для создания новых каталогов (если они не существуют) уже). Затем мы используем list.files, чтобы составить список файлов в каждом из двух обучающих каталогов. Затем мы используем sample, чтобы взять образец этих файлов. Наконец, мы используем file.copy, чтобы разместить их в новом доме.

setwd("~/Stack Overflow/")
sample.fraction <- 0.2
train.true.dir <- "train/hot_dog"
train.false.dir <- "train/not_hot_dog"
valid.true.dir <- "validation/hot_dog"
valid.false.dir <- "validation/not_hot_dog"
sapply(c("validation",valid.true.dir,valid.false.dir),function(x){dir.create(x,showWarnings = FALSE)})
true.files <- list.files(train.true.dir)
false.files <- list.files(train.false.dir)
true.sample <- sample(true.files,size = ceiling(length(true.files) * sample.fraction))
false.sample <- sample(false.files,size = ceiling(length(false.files) * sample.fraction))
sapply(true.sample,function(x){file.copy(paste(train.true.dir,x,sep="/"),paste(valid.true.dir,x,sep="/"))})
sapply(false.sample,function(x){file.copy(paste(train.false.dir,x,sep="/"),paste(valid.false.dir,x,sep="/"))})

Если вы захотите впоследствии удалить эти файлы, вы можете использовать эти две строки.

Сначала сделайте резервную копию.

sapply(true.sample,function(x){file.remove(paste(train.true.dir,x,sep="/"))})
sapply(false.sample,function(x){file.remove(paste(train.false.dir,x,sep="/"))})

0 голосов
/ 08 апреля 2020

Это последний код, который я затем использовал:

path2 <- file.path(here(), "data/hot-dog-not-hot-dog/validation", c("hot_dog", "not_hot_dog"))
dir.create(file.path(here(), "data/hot-dog-not-hot-dog/validation"))
lapply(path2, dir.create)
Map(function(x, y){
  file <- dir(x) ; n <- length(file)
  file_selected <- file.path(x, sample(file, ceiling(n * 0.2)))
  file.copy(file_selected, y)
  file.remove(file_selected)
}, path1, path2)```
...