www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home
Занимательная история, выдающиеся люди, малоизвестные факты, находки, открытия, фальсификации. Присоединяйся!

[Tensorflow 2.0] Загрузка изображений в tenorflow

Дата публикации Oct 3, 2019

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

Загрузить изображения | TensorFlow Core

В этом руководстве приведен простой пример загрузки набора данных изображений с использованием tf.data. Набор данных, использованный в этом примере ...

www.tensorflow.org

Для более подробных объяснений и базовых знаний о кодах и наборе данных вы всегда можете обратиться по ссылке.


Введение

Мы все знаем, что такое изображения, поэтому мы можем пропуститьчто - ?"часть в этом посте.
Затем самый важный вопрос остается.

Почему мы хотим импортировать файл изображения?

Прежде чем ответить на этот вопрос, у меня есть более фундаментальный вопрос:какова конечная цель ИИ?Наш будущий ИИ будет думать как человек или подражать механизму человеческого разума. Например, AlphaGo показала публике, на что направлен наш проект ИИ. Игра Go требует максимальной способности человеческого интеллекта; интуиция, стратегическое мышление и способность к обучению, не говоря уже о вычислительных навыках.

Многие из вас слышали об этой истории; Саммит Го с Ли Се Доли одна победа игрока и так далее. Победы AlphaGo доказали, что ИИ может делать больше, чем просто подражать человеческому разуму. Саммит состоялся более 3 лет назад, и ИИ постоянно обновлялся.

Легкая часть обучения альфа-го заключается в том, что всем известны правила игры в го, несмотря на ее сложность. (На самом деле, я понятия не имею, как работает игра, но в любом случае правила являются известными фактами)

Однако когда дело доходит докартинкиэто становится все сложнее. Мы все видим вещи. Люди, собаки, кошки, птицы видят и собирают информацию о движущихся изображениях каждую секунду или каждый вздох, за исключением слепых. (К вашему сведению, я искал и выяснил, что «слепой» - идеальное слово для ПК).

Тем не менее, кто-нибудь может объяснить, как мы видим и обрабатываем данные изображения? Это все еще сложный вопрос для нейробиологов. По иронии судьбы, это объясняет необходимость преобразования данных изображения в обрабатываемые данные для тензорного потока. Для ИИ, чтобы иметь похожий на человека механизм, распознавание изображений является важной и очень базовой способностью. В учебнике Tensorflow вы увидите, что у «Изображений» есть свой собственный раздел, который подразумевает его высокую важность. Затем,как мы имеем дело с изображениями в машинном обучении?


Чтобы заинтересовать вас, давайте посмотрим, что Google может сделать с данными изображений. Вы когда-нибудь использовали поиск изображений в Google?
Допустим, вы сделали снимок картины в музее, но забыли, чей это рисунок, его название и все остальное.

Все, что вам нужно сделать, это пойти вimages.google.comи поместите файл изображения в поле поиска. Тогда что у вас есть это:

Или вы будете удивлены, увидев, что Google может сделать вphotos.google.com, Он может искать определенное лицо или окрестности (парки, пляж, Сеул и т. Д.) И анализировать фотографии соответственно. Технология достигла многого, и нам необходимо понять основы этого механизма.

Как вы можете себе представить, анализ данных изображения - это очень длинная история. То, что мы собираемся сделать в этом посте, простозагрузка данных изображения и преобразование его в tf.dataset для дальнейшей процедуры.


II. Техническая настройка

from __future__ import absolute_import, division, print_function, unicode_literalstry:
# %tensorflow_version only exists in Colab.
%tensorflow_version 2.x
except Exception:

pass
import tensorflow as tf

С точки зренияпопытка и кроме линииМы будем придерживаться наших предыдущих кодов, но руководство по тензорному потоку находится на обновлении, поэтому мы должны оставаться в курсе его окончательной редакции.

Итак, пока в нашей записной книжке
tf.__version__будет извлекать«2.0.0-RC2»

AUTOTUNE=tf.data.experimental.AUTOTUNE
  • AUTOTUNE - это новое лицо для нас. Это будетавтоматическая настройка времени выполнения tf.data для динамической настройки значения во время выполнениядля вопроса эффективности.Однако на этом уровне давайте не будем тратить наше время, чтобы понять это.
import IPython.display as display
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
  • IPython.displayдля отображения изображений позже.
  • из PIL import Image: из PIL (сокращение от Python Image Library, a.k.a Pillow) импорт изображений для загрузки, управления, сохранения файлов изображений в различных форматах.

III. Получить изображения

1 - Скачать файлы изображений
Мы будем использовать данные изображений, предлагаемые Google.

import pathlibdata_dir = tf.keras.utils.get_file(origin='https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz',fname='flower_photos', untar=True)data_dir = pathlib.Path(data_dir)
  • pathlibэто модуль, который предлагает классы, представляющие пути файловой системы с семантикой, подходящей для различных операционных систем. (из docs.python.org) каталог
  • Мы будем использоватьtf.keras.utils.get_fileскачать файл с именемfname='flower_photos'.
    Recap)train_file_path = tf.keras.utils.get_file("train.csv", TRAIN_DATA_URL)от загрузки CSV пост.
  • Теперь мы хотим увидеть явный путь к файловой системе, используяpathlib.Path
    тогда,data_dir выведет
    PosixPath ( «/ корень / .keras / наборы данных / flower_photos»).
  • Наш файл flower_photos будет вкаталог ".keras / datasets"
    FYI) .keras
    это что-то невидимое для нас, но тогда существует.

2 - Давайте посмотрим глубже в нашем наборе данных

Я скачал прямо на ноутбук, как обычно, чтобы показать вам, что находится в наборе данных. (Не рекомендуется)
В папке «flower_photos» находятся 5 папок «маргаритка», «розы», «подсолнухи», «одуванчик», «тюльпаны» и один файл «License.txt».

фотографии из каждой папки

И каждая папка имеет от 600 до 800 фотографий цветов, которые соответствуют названию папки.

3 - Вернуться к Tensorflow

Теперь забудь опапки, До 1 - у нас есть копии фотографий цветов. Мы хотим знать, какflower_photosКаталог выглядит как в записной книжке Colab.

Во-первых, сколько у нас изображений?

image_count = len(list(data_dir.glob('*/*.jpg')))
image_count
#output: 3670
  • В ‘* / *. Jpg’ * означает, что все может заполнить пробел. Итак, мы ищемJPGфайл, который находится влюбое имя каталогаслюбое имя изображения,
  • data_dir.globсломаю все, что есть вdata_dir,

Тогда, какие у нас есть подкаталоги?(спойлер: «Маргаритка», «розы», «подсолнухи», «одуванчик», «тюльпаны» и один «License.txt»)

print(item for item in data_dir.glob('*')if item.name != "LICENSE.txt"])[PosixPath('/root/.keras/datasets/flower_photos/sunflowers'), PosixPath('/root/.keras/datasets/flower_photos/daisy'), PosixPath('/root/.keras/datasets/flower_photos/tulips'), PosixPath('/root/.keras/datasets/flower_photos/dandelion'), PosixPath('/root/.keras/datasets/flower_photos/roses')]
  • знак равносредстване равно; нас не интересует текстовый файл.
  • Есть 5 "предметов" вdata_dir,обычное название для предмета будет ‘подкаталог».
  • Тем не менее, то, что мы хотим знать, этоимя классаИтак, мы будем использоватьназвание предметаскорее, чемпредмети мы преобразуем его вМассив NumPyдля дальнейшей обработки.

Итак, мы имеем,

CLASS_NAMES = np.array([item.name for item in data_dir.glob('*') if item.name != "LICENSE.txt"])
CLASS_NAMES

массив ([«подсолнухи», «маргаритка», «тюльпаны», «одуванчик», «розы»], dtype = «<U10»)

Теперь мы можем сделать вывод, чтоКаталог flower_photos содержит 5 подкаталогов с одним подкаталогом на один класс.

Мы можем проверить, сколько фотографий у каждого класса.

a=len(list(data_dir.glob('sunflowers/*.jpg'))) #a=699
b=len(list(data_dir.glob('daisy/*.jpg'))) #b=633
c=len(list(data_dir.glob('tulips/*.jpg'))) #c=799
d=len(list(data_dir.glob('dandelion/*.jpg'))) #d=898
e=len(list(data_dir.glob('roses/*.jpg'))) #e=641

Или, может быть, мы хотим увидеть несколько фотографий роз.

roses = list(data_dir.glob('roses/*'))

Фото в розахкласс будет иметь путь, который выглядит как PosixPath (root / root / .keras / datasets / flower_photos / roses / 3265902330_d8b1e44545.jpg ’).

for image_path in roses[:3]: display.display(Image.open(str(image_path)))

Вы сможете увидеть 3 фотографии в каталоге роз.


Внутривенно Загрузка с использованием tf.data.Dataset

Вы помните, что мы использовалиtf.data.Dataset.from_tensor_slicesв нагрузке данные Numpy и панды. DataFrame?
Recap)
dataset = tf.data.Dataset.from_tensor_slices((df.values, target.values))илиtrain_dataset = tf.data.Dataset.from_tensor_slices((train_examples, train_labels))

Опять же, мы загрузим изображение, используя tf.data.Dataset

На самом деле есть другой способ загрузки изображения;keras.preprocessing,однако по соображениям эффективности это не очень рекомендуется. Хотя это будет опущено в этом посте, вы всегда можете посетить руководство по тензорному потоку.

Прежде чем что-то сделать,Я хотел бы определить некоторые переменные, которые использовались в части обработки keras.pre и продолжат использоваться в tf.data.Dataset.

BATCH_SIZE = 32
IMG_HEIGHT = 224
IMG_WIDTH = 224

1 - Создать набор данных относительно путей к файлам.

list_ds = tf.data.Dataset.list_files(str(data_dir/'*/*'))

Для понимания давайте посмотрим, как«list_ds»выглядит как.

for f in list_ds.take(1):
print(f)

tf.Tensor (b ’/ root / .keras / datasets / flower_photos / sunflowers / 14460075029_5cd715bb72_m.jpg’, shape = (), dtype = string)

Что такое list_ds?

Давайте вернемся кdata_dir.

data_dir был; PosixPath ( «/ корень / .keras / наборы данных / flower_photos»)

Затем,list_ds

list_ds = tf.data.Dataset.list_files(str(data_dir/'*/*'))

1,str(data_dir/’*/*’)«Стрилизует»(data_dir / ‘* / *’);
/root/.keras/datasets/flower_photos/*/*.

Первая звездочка является пробелом для имени класса или подкаталога, затем следующая для имени фотографии.
2.
tf.data.Dataset.list_files(...)сохранит строки втензоры,

Теперь мы можем понять результат.

тс.Тензор(Б»/ корень / .keras / наборов данных / flower_photos /подсолнух/14460075029_5cd715bb72_m.jpg’, Shape = (), dtype =строка)

2 - Конвертировать путь к файлу (изображение, метка)

Для этого мы будемопределить 3 функции.

я) Получить метки из file_path:Функция get_label ().

def get_label(file_path):
parts = tf.strings.split(file_path, '/')
return parts[-2] == CLASS_NAMES

tf.strings.splitпролил "file_path", взяв "/" в качестве разделителя. Части или компоненты пути будут сохранены в виде списка в«часть».

В случаекорень / .keras / наборы данных / flower_photos /подсолнух/14460075029_5cd715bb72_m.jpg»,
частибудет иметь список[root, .keras, наборы данных,…,подсолнух, 14460075029_5cd715bb72_m.jpg].
Среди компонентов списка нас интересует ярлык или каталог классов «Подсолнухи». Вот почему мы индексируемчасти [-2].

Тогда функция будетвернуть True или Falseв зависимости от того, совпадают ли части [-2] с каждым элементомCLASS_NAMES массив,

Если результатом функции get_label () является [False False FalseПравдаЛожь], так какCLASS_NAMEявляетсямассив([«Подсолнухи», «Ромашка», «Тюльпаны», «одуванчик"," Розы "]) мы можем заключить, что наша фотография находится вкласс одуванчика.

II) декодировать изображение:Функция decode_img ().

Декодирование - это смутное понятие, но в основном это способ преобразования человеческой версии изображения в компьютерную версию изображения. Наша цель сdecode_imgэто преобразовать изображение в формат сетки в соответствии с его содержимым RGB.

def decode_img(img):
img = tf.image.decode_jpeg(img, channels=3) #color images
img = tf.image.convert_image_dtype(img, tf.float32)
#convert unit8 tensor to floats in the [0,1]range
return tf.image.resize(img, [IMG_WIDTH, IMG_HEIGHT])
#resize the image into 224*224

iii) Объединитьget_label () и decode_img (), чтобы мы могли получить пару (image, label) для заданного file_path:Функция process_path ().

def process_path(file_path):
label = get_label(file_path)
img = tf.io.read_file(file_path)
img = decode_img(img)
return img, label

Есть две строки кода, которые не были рассмотрены.

def decode_img(img):
img = tf.image.decode_jpeg(img, channels=3)

Строка выше преобразует сжатую строку в трехмерный блок 8 тензор. Это нужно, потому что нашprocess_pathфункция имеетtf.io read_file (Путь к файлу) функциякоторый читает и выводит все содержимое ввода"Как строка"

def process_path(file_path):
img = tf.io.read_file(file_path)

3 - Создайте набор данных из пар (изображение, метка).

Мы будем использоватьDataset.mapа такжеnum_parallel_callsопределяется так, что несколько изображений загружаются одновременно.

labeled_ds = list_ds.map(process_path, num_parallel_calls=AUTOTUNE)

Давайте проверим, что находится в labeleled_ds.

for image, label in labeled_ds.take(1):
print("Image shape: ", image.numpy().shape)
print("Label: ", label.numpy())

Форма изображения: (224, 224, 3) Метка: [False False False True False]

  • Мы изменили размер изображения в decode_image () до 224 × 224. И 3 для цветного изображения RGB.
  • Метка: [Ложь Ложь ЛожьПравдаFalse]. Наш пример в классе одуванчиков.

V. Подготовиться к тренировкам

В целях эффективности мы будем использоватьtf.data api.

def prepare_for_training(ds, cache=True, shuffle_buffer_size=1000):

if cache:
if isinstance(cache, str):
ds = ds.cache(cache)
else:
ds = ds.cache() ds = ds.shuffle(buffer_size=shuffle_buffer_size) ds = ds.repeat() #repeat forever ds = ds.batch(BATCH_SIZE) ds = ds.prefetch(buffer_size=AUTOTUNE) return ds
  • Функция isinstance (кеш, str)возвращаетсяправдаесли кеш - строковый тип
  • кэшэкономит время (мы будем проверять это позже), потому чтостроковые данныехранится в памяти, и нет необходимости загружать более одного раза. (в среде colab он сохраняется в памяти colab).
  • упреждающейподготовит следующую партию в фоновом режиме, пока модель тренируется.
train_ds = prepare_for_training(labeled_ds)image_batch, label_batch = next(iter(train_ds))show_batch(image_batch.numpy(), label_batch.numpy())
часть продукции

VI. Спектакль

Мы проверим производительность путем измерения времени, потраченного на загрузку изображений.

import time
default_timeit_steps = 1000def timeit(ds, steps=default_timeit_steps):
start = time.time()
it = iter(ds)
for i in range(steps):
batch = next(it)
if i%10 == 0:
print('.',end='')
print()
end = time.time() duration = end-start
print("{} batches: {} s".format(steps, duration))
print("{:0.5f} Images/s".format(BATCH_SIZE*steps/duration))

timeit ()Функция - это не более чем технический способ проверки затраченного времени, поэтому просто примите его как есть. Нечего бояться! 😜

1 - сравнить keras.preprocessing и tf.data

#keras.preprocessing
timeit(train_data_gen)

1000 партий: 97,74200057983398 с 327,39252 Изображения / с

#tf.data
timeit(train_ds)

1000 партий: 16,27811074256897 с 1965,83010 изображений / с

Вы видите, чтоtf.data«Генератор данных» примерно в 6 раз быстрее?

2 - использование .cache довольно большое дело.

#without cache 
uncached_ds = prepare_for_training(labeled_ds, cache=False)
timeit(uncached_ds)

1000 партий: 81,07855153083801 с 394,67898 изображений / с

filecache_ds = prepare_for_training(labeled_ds, cache="./flowers.tfcache")
timeit(filecache_ds)

1000 серий: 47,67451047897339 с 671,21822 Изображения / с

Вы видите, что использование.cacheделает примерно в 2 раза быстрее?

Это все для загрузки изображений в tf.data.
Следующий пост будет на CNN, и анализ изображений будет покрыт в течение следующих недель.
Так что следите за обновлениями и до скорой встречи.

Если у вас есть какие-либо комментарии или вопросы, я был бы рад ответить на них.
Спасибо всегда за ваш интерес. 😍
Надеюсь, ваш октябрь памятует.

Постскриптум картина Эгона Шиле 1917 года "Четыре дерева". Что вы думаете о картине?

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map