Дата публикации Oct 3, 2019
Будут части, которые будут пересмотрены и разработаны для лучшего понимания, однако, я подтверждаю, что следующий пост основан на учебнике TensorFlow, представленном в:
Для более подробных объяснений и базовых знаний о кодах и наборе данных вы всегда можете обратиться по ссылке.
Мы все знаем, что такое изображения, поэтому мы можем пропуститьчто - ?"часть в этом посте.
Затем самый важный вопрос остается.
Почему мы хотим импортировать файл изображения?
Прежде чем ответить на этот вопрос, у меня есть более фундаментальный вопрос:какова конечная цель ИИ?Наш будущий ИИ будет думать как человек или подражать механизму человеческого разума. Например, AlphaGo показала публике, на что направлен наш проект ИИ. Игра Go требует максимальной способности человеческого интеллекта; интуиция, стратегическое мышление и способность к обучению, не говоря уже о вычислительных навыках.
Многие из вас слышали об этой истории; Саммит Го с Ли Се Доли одна победа игрока и так далее. Победы AlphaGo доказали, что ИИ может делать больше, чем просто подражать человеческому разуму. Саммит состоялся более 3 лет назад, и ИИ постоянно обновлялся.
Легкая часть обучения альфа-го заключается в том, что всем известны правила игры в го, несмотря на ее сложность. (На самом деле, я понятия не имею, как работает игра, но в любом случае правила являются известными фактами)
Однако когда дело доходит докартинкиэто становится все сложнее. Мы все видим вещи. Люди, собаки, кошки, птицы видят и собирают информацию о движущихся изображениях каждую секунду или каждый вздох, за исключением слепых. (К вашему сведению, я искал и выяснил, что «слепой» - идеальное слово для ПК).
Тем не менее, кто-нибудь может объяснить, как мы видим и обрабатываем данные изображения? Это все еще сложный вопрос для нейробиологов. По иронии судьбы, это объясняет необходимость преобразования данных изображения в обрабатываемые данные для тензорного потока. Для ИИ, чтобы иметь похожий на человека механизм, распознавание изображений является важной и очень базовой способностью. В учебнике Tensorflow вы увидите, что у «Изображений» есть свой собственный раздел, который подразумевает его высокую важность. Затем,как мы имеем дело с изображениями в машинном обучении?
Чтобы заинтересовать вас, давайте посмотрим, что Google может сделать с данными изображений. Вы когда-нибудь использовали поиск изображений в Google?
Допустим, вы сделали снимок картины в музее, но забыли, чей это рисунок, его название и все остальное.
Все, что вам нужно сделать, это пойти вimages.google.comи поместите файл изображения в поле поиска. Тогда что у вас есть это:
Или вы будете удивлены, увидев, что Google может сделать вphotos.google.com, Он может искать определенное лицо или окрестности (парки, пляж, Сеул и т. Д.) И анализировать фотографии соответственно. Технология достигла многого, и нам необходимо понять основы этого механизма.
Как вы можете себе представить, анализ данных изображения - это очень длинная история. То, что мы собираемся сделать в этом посте, простозагрузка данных изображения и преобразование его в tf.dataset для дальнейшей процедуры.
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
import IPython.display as display
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
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)
tf.keras.utils.get_file
скачать файл с именемfname='flower_photos'.
train_file_path = tf.keras.utils.get_file("train.csv", TRAIN_DATA_URL)
от загрузки CSV пост.pathlib.Path
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
Тогда, какие у нас есть подкаталоги?(спойлер: «Маргаритка», «розы», «подсолнухи», «одуванчик», «тюльпаны» и один «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')]
Итак, мы имеем,
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.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))
На самом деле есть другой способ загрузки изображения;keras.preprocessing,однако по соображениям эффективности это не очень рекомендуется. Хотя это будет опущено в этом посте, вы всегда можете посетить руководство по тензорному потоку.
Прежде чем что-то сделать,Я хотел бы определить некоторые переменные, которые использовались в части обработки keras.pre и продолжат использоваться в tf.data.Dataset.
BATCH_SIZE = 32
IMG_HEIGHT = 224
IMG_WIDTH = 224
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 =строка)
Для этого мы будемопределить 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)
Мы будем использовать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]
В целях эффективности мы будем использовать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
train_ds = prepare_for_training(labeled_ds)image_batch, label_batch = next(iter(train_ds))show_batch(image_batch.numpy(), label_batch.numpy())
Мы проверим производительность путем измерения времени, потраченного на загрузку изображений.
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 года "Четыре дерева". Что вы думаете о картине?
© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map