TensorFlow: обучение на собственном образе

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

Есть ли какой-нибудь пример для обучения нового набора данных?


person VICTOR    schedule 20.05.2016    source источник
comment
Я прочитал этот googleresearch.blogspot.hk/ 2016/03 / Однако я понятия не имею, где мне менять код.   -  person VICTOR    schedule 20.05.2016
comment
новое расположение ссылки ai.googleblog.com/2016 / 03 /   -  person sansknwoledge    schedule 05.12.2018


Ответы (3)


Если вас интересует, как вводить собственные данные в TensorFlow, вы можете посмотреть это руководство.
Я также написал руководство с лучшими практиками для CS230 в Стэнфорде здесь.


Новый ответ (с tf.data) и с ярлыками

С введением tf.data в r1.4 мы можем создавать пакеты изображений без заполнителей и без очередей. Шаги следующие:

  1. Создайте список, содержащий имена файлов изображений и соответствующий список ярлыков.
  2. Создайте tf.data.Dataset чтение этих имен файлов и меток
  3. Предварительно обработать данные
  4. Создайте итератор из tf.data.Dataset, который даст следующий пакет

Код такой:

# step 1
filenames = tf.constant(['im_01.jpg', 'im_02.jpg', 'im_03.jpg', 'im_04.jpg'])
labels = tf.constant([0, 1, 0, 1])

# step 2: create a dataset returning slices of `filenames`
dataset = tf.data.Dataset.from_tensor_slices((filenames, labels))

# step 3: parse every image in the dataset using `map`
def _parse_function(filename, label):
    image_string = tf.read_file(filename)
    image_decoded = tf.image.decode_jpeg(image_string, channels=3)
    image = tf.cast(image_decoded, tf.float32)
    return image, label

dataset = dataset.map(_parse_function)
dataset = dataset.batch(2)

# step 4: create iterator and final input tensor
iterator = dataset.make_one_shot_iterator()
images, labels = iterator.get_next()

Теперь мы можем работать напрямую sess.run([images, labels]), не передавая никаких данных через заполнители.


Старый ответ (с очередями TensorFlow)

Подводя итог, у вас есть несколько шагов:

  1. Создайте список имен файлов (например, пути к вашим изображениям)
  2. Создайте очередь имен файлов в TensorFlow.
  3. Прочтите и расшифруйте каждое изображение, измените их размер до фиксированного размера (необходимо для пакетной обработки)
  4. Вывести пакет этих изображений

Самый простой код:

# step 1
filenames = ['im_01.jpg', 'im_02.jpg', 'im_03.jpg', 'im_04.jpg']

# step 2
filename_queue = tf.train.string_input_producer(filenames)

# step 3: read, decode and resize images
reader = tf.WholeFileReader()
filename, content = reader.read(filename_queue)
image = tf.image.decode_jpeg(content, channels=3)
image = tf.cast(image, tf.float32)
resized_image = tf.image.resize_images(image, [224, 224])

# step 4: Batching
image_batch = tf.train.batch([resized_image], batch_size=8)
person Olivier Moindrot    schedule 20.05.2016
comment
Для shuffle_batch () требуется как минимум 4 аргумента. После того, как я добавил еще два аргумента: num_threads = 1, capacity = 5000. В нем говорится: TypeError: объект Tensor не повторяется. - person VICTOR; 23.05.2016
comment
Вы правы, первым аргументом tf.train.batch или tf.train.shuffle_batch должен быть список [image], а не просто image. Я исправил это в коде. - person Olivier Moindrot; 23.05.2016
comment
@Olivier Moindrot Извините, у меня все еще есть ошибка. В нем говорится: ValueError: все формы должны быть полностью определены: [TensorShape ([Dimension (None), Dimension (None), Dimension (3)])]. Эта ошибка возникает на этапе пакетной обработки. - person VICTOR; 24.05.2016
comment
В очередной раз вы правы, я исправил это в коде. Вы должны изменить размер всех изображений на одну и ту же форму, чтобы сделать их партией. - person Olivier Moindrot; 24.05.2016
comment
@Olivier Moindrot Большое спасибо. Теперь это работает. Я хочу спросить, после обучения модели, как я могу классифицировать входное изображение с моей собственной базой данных? - person VICTOR; 24.05.2016
comment
Если у вас есть метки обучающих изображений, вы также должны получить их в качестве входных данных и связать их с изображениями: image_batch, label_batch = tf.train.batch([resized_image, label], batch_size=8). Затем вам нужно создать модель с изображениями в качестве входных и меток в качестве выходных, см. это руководство для получения дополнительной информации. - person Olivier Moindrot; 24.05.2016
comment
@Olivier Moindrot Что делать, если я делаю классификацию по одному классу? Я получил данные только по одному классу. Я хочу провести классификацию между Target и Outlier. Тогда как мне составить массив для метки? - person VICTOR; 24.05.2016
comment
Позвольте нам продолжить это обсуждение в чате. - person Olivier Moindrot; 24.05.2016
comment
resized_image = tf.image.resize_images(images, 224, 224) Здесь первым аргументом метода resize_images должно быть изображение, а не изображения, верно? - person iamas; 01.01.2017
comment
resized_image = tf.image.resize_images (изображения, [224, 224]) - person Jack; 12.01.2017
comment
куда войдут метки изображений? - person Saravanabalagi Ramachandran; 19.02.2017
comment
спасибо Mr @ olivier-moindrot, но если у меня есть партия формата изображения .tif - person Sakhri Houssem; 05.02.2018
comment
Спасибо, мистер @ olivier-moindrot. Я использовал tf.image.decode_gif и этот мой DataSetGen код, но я не знаю, правильно ли это - person Sakhri Houssem; 06.02.2018
comment
Как обращаться с этикетками в таком случае? - person Bastian; 05.03.2018
comment
@OlivierMoindrot я получил ошибку вне допустимого диапазона в get_next, когда файлов всего 2 и 2 совпадающих метки [0,1] вместо 4 файлов и меток [0,1,0,1] - person datdinhquoc; 12.04.2019
comment
@datdinhquoc: если у вас есть только два файла и метки с размером пакета 2, вы можете выполнить только одну итерацию, и тогда вы получите ошибку OutOfRange. - person Olivier Moindrot; 12.04.2019
comment
После тренировки моих данных, как можно использовать для обнаружения изображения? - person D T; 22.05.2019
comment
Как насчет того, если будет больше трех 3-х канальных изображений и формат файла .mat .. код будет таким же? - person Aadnan Farooq A; 02.09.2019
comment
@AadnanFarooqA: в этом случае вам нужно изменить _parse_function, чтобы прочитать файл .mat - person Olivier Moindrot; 02.09.2019
comment
начиная с шага 1, у меня есть 100 изображений, которые хранятся в папке типа Root directory - ›Class1 -› images; 2 класс - ›изображения; 3 класс - ›изображения; как я буду читать все изображения с меткой в ​​качестве имени папки? - person Aadnan Farooq A; 03.09.2019
comment
Вы можете просто получить все имена файлов и метки в python, а затем использовать мой код, чтобы поместить его в тензорный поток - person Olivier Moindrot; 03.09.2019
comment
для Tensorflow 2 замените tf.read_file(filename) на tf.io.read_file(filename) - person Mehdi Zare; 20.07.2020
comment
Привет, @OlivierMoindrot, спасибо за этот ответ. У меня возникла проблема с пониманием ожидаемого ввода для модели TFLite. Не могли бы вы взглянуть? stackoverflow.com/questions/63486440 / - person Roi Mulia; 19.08.2020
comment
как изменить размер изображений в новой версии? - person Samantha Cruz; 08.04.2021
comment
@SamanthaCruz: вы можете добавить его в _parse_function - person Olivier Moindrot; 08.04.2021

На основе ответа @ olivier-moindrot, но для Tensorflow 2.0+:

# step 1
filenames = tf.constant(['im_01.jpg', 'im_02.jpg', 'im_03.jpg', 'im_04.jpg'])
labels = tf.constant([0, 1, 0, 1])

# step 2: create a dataset returning slices of `filenames`
dataset = tf.data.Dataset.from_tensor_slices((filenames, labels))

def im_file_to_tensor(file, label):
    def _im_file_to_tensor(file, label):
        path = f"../foo/bar/{file.numpy().decode()}"
        im = tf.image.decode_jpeg(tf.io.read_file(path), channels=3)
        im = tf.cast(image_decoded, tf.float32) / 255.0
        return im, label
    return tf.py_function(_im_file_to_tensor, 
                          inp=(file, label), 
                          Tout=(tf.float32, tf.uint8))

dataset = dataset.map(im_file_to_tensor)

Если вы столкнулись с проблемой, похожей на:

ValueError: невозможно взять длину формы с неизвестным рангом

при передаче тензоров tf.data.Dataset в model.fit взгляните на https://github.com/tensorflow/tensorflow/issues/24520. Исправление для приведенного выше фрагмента кода:

def im_file_to_tensor(file, label):
    def _im_file_to_tensor(file, label):
        path = f"../foo/bar/{file.numpy().decode()}"
        im = tf.image.decode_jpeg(tf.io.read_file(path), channels=3)
        im = tf.cast(image_decoded, tf.float32) / 255.0
        return im, label

    file, label = tf.py_function(_im_file_to_tensor, 
                                 inp=(file, label), 
                                 Tout=(tf.float32, tf.uint8))
    file.set_shape([192, 192, 3])
    label.set_shape([])
    return (file, label)
person Madiyar    schedule 01.02.2020

Совместимый ответ 2.0 с использованием Tensorflow Hub: Tensorflow Hub - это предложение / продукт, предлагаемый Tensorflow, который включает модели, разработанные Google для наборов данных текста и изображений.

Это saves Thousands of Hours of Training Time and Computational Effort, так как повторно использует существующую предварительно обученную модель.

Если у нас есть набор данных изображений, мы можем взять существующие предварительно обученные модели из TF Hub и адаптировать их к нашему набору данных.

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

import itertools
import os

import matplotlib.pylab as plt
import numpy as np

import tensorflow as tf
import tensorflow_hub as hub

module_selection = ("mobilenet_v2_100_224", 224) #@param ["(\"mobilenet_v2_100_224\", 224)", "(\"inception_v3\", 299)"] {type:"raw", allow-input: true}
handle_base, pixels = module_selection
MODULE_HANDLE ="https://tfhub.dev/google/imagenet/{}/feature_vector/4".format(handle_base)
IMAGE_SIZE = (pixels, pixels)
print("Using {} with input size {}".format(MODULE_HANDLE, IMAGE_SIZE))

BATCH_SIZE = 32 #@param {type:"integer"}

#Here we need to Pass our Dataset

data_dir = tf.keras.utils.get_file(
    'flower_photos',
    'https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz',
    untar=True)

model = tf.keras.Sequential([
    hub.KerasLayer(MODULE_HANDLE, trainable=do_fine_tuning),
    tf.keras.layers.Dropout(rate=0.2),
    tf.keras.layers.Dense(train_generator.num_classes, activation='softmax',
                          kernel_regularizer=tf.keras.regularizers.l2(0.0001))
])
model.build((None,)+IMAGE_SIZE+(3,))
model.summary()

Полный код для руководства по переобучению изображений можно найти по этой ссылке на Github < / а>.

Дополнительную информацию о Tensorflow Hub можно найти в этом блоге TF .

Предварительно обученные модули, связанные с изображениями, можно найти в этом Ссылка на TF Hub.

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

Наконец, это базовая страница для Tensorflow Hub.

person Tensorflow Support    schedule 28.01.2020