www.machinelearningmastery.ru

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

Home

Классификация изображений по меткам с помощью сети

Дата публикации Apr 2, 2017

Архитектура Inception v3. (источник)

Обновить:Эта статья была обновлена ​​для устранения возможных проблем с расчетом точности, указаннымТереза ​​Бартон,мерзавецтакже был обновлен, и вы можете найти все изменения там.


Начало v3является глубоко сверточной нейронной сетью, обученной для однокомпонентной классификации изображений наImageNetнабор данных. Команда TensorFlow уже подготовиларуководствопри переподготовке, чтобы выделить ряд классов на основе наших собственных примеров. Мы собираемся изменить скрипт переподготовкиretrain.pyиз этого урокапревратить сеть в классификатор с несколькими метками.

Если вы просто хотите перейти к полученному коду,Вотсо всеми необходимыми файлами и информацией, необходимой для его работы. Отныне я буду предполагать, что вы клонировали указанный репозиторий и ссылаетесь на его файлы.

Итак, что нужно сделать? Прежде всего, мы должны как-то сообщить сети, какие метки являются правильными для каждого изображения. Затем мы должны изменить как последний слой, который переобучается, так и метод оценки сгенерированных прогнозов, чтобы иметь возможность обучать его в отношении множества возможных правильных классов для каждого изображения.

Требования

Предварительная обработка данных

Подготовьте тренировочные образы

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

Подготовьте этикетки для каждого тренировочного образа

Нам нужно подготовить файлы с правильными метками для каждого изображения. Назовите файлы.текст= если у вас есть изображениеcar.jpg,сопровождающий файл должен быть названcar.jpg.txt,

Поместите каждую метку в новую строку внутри файла, ничего больше.

Теперь скопируйте все созданные файлы вimage_labels_dirкаталог, расположенный в корне проекта. Вы можете изменить путь к этой папке, отредактировав глобальную переменную IMAGE_LABELS_DIR вretrain.py,

Создайте файл, содержащий все метки

Исходная сеть Inception использовала структуру папок для получения списка классов. В нашем случае все обучающие образы находятся в одной папке, и поэтому нам нужно перечислить классы во внешнем файле.

Создать файлlabels.txtв корне проекта и заполните его всеми возможными метками. Каждый ярлык на новой строке, больше ничего. Так же, какimage_labelфайл для изображения во всех возможных классах.

Модификация основной

Метод main () первоначально загружал структуру каталогов, содержащую изображения для каждой метки в отдельных папках, и создавалПроверка,тестированиеа такжеподготовкаустанавливает для каждого класса:

image_lists = create_image_lists(FLAGS.image_dir, FLAGS.testing_percentage,cFLAGS.validation_percentage)

Теперь у нас есть все изображения в одном каталоге и, следовательно,image_lists.keys ()содержит только один элемент, и это папка со всеми нашими изображениями (например, multi-label). Все тренировочные образы разбиты наПроверка,тестированиеа такжеподготовканаборы доступны через этот ключ.

Теперь, когда наши данные правильно разделены, нам просто нужно загрузить список меток и рассчитать количество классов:

with open(ALL_LABELS_FILE) as f:
labels = f.read().splitlines()
class_count = len(labels)

Создание векторов ground_truth

  1. Добавлятьget_image_labels_path ()метод, который только слегка отредактированget_image_path ()метод, возвращающий путь к файлу, содержащему правильные метки изображения = например,image_labels_dir / car.jpg.txtдляcar.jpg,
  2. редактироватьget_random_cached_bottlenecks ()метод:

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

ground_truth = np.zeros(class_count, dtype=np.float32)

и затем поместите 1.0 в положение правильной метки, которую мы знали, потому что это имя папки, из которой мы взяли изображение:

ground_truth[label_index] = 1.0

Это не так просто с мульти-меткой классификации. Нам нужно будет загрузить все правильные метки для данного изображения из его image_label_file.

Получите путь к файлу с правильными метками:

labels_file = get_image_labels_path(image_lists,label_name,image_index, IMAGE_LABELS_DIR, category)

Читать все строки = метки из файла и сохранять их в массивtrue_labels:

with open(labels_file) as f:
true_labels = f.read().splitlines()

Инициализируйте вектор ground_truth нулями:

ground_truth = np.zeros(class_count, dtype=np.float32)

Укажите правильные метки в векторе ground_truth с помощью 1.0:

idx = 0
for label in labels:
if label in true_labels:
ground_truth[idx] = 1.0
idx += 1

этикеткисписок является добавленным параметром кget_random_cached_bottlenecks ()метод и содержит имена всех возможных классов.

Это оно! Мы можем улучшить это решение путем кэширования созданногоground_truths, Что мешает создаватьground_truthvector каждый раз, когда мы запрашиваем его для одного и того же изображения, что обязательно произойдет, если мы будем тренироваться для нескольких эпох. Вот для чего нужен глобальный словарь CACHED_GROUND_TRUTH_VECTORS.

Модификация обучения

add_final_training_ops ()Изначально в метод добавлен новый софтмакс и полностью связанный слой для тренировок Нам просто нужно заменить функцию softmax на другую.

Зачем?

Функция softmax объединяет все значения вектора в диапазоне от [0,1], суммируя вместе до 1. Это именно то, что мы хотим в классификации с одной меткой. Но для нашего случая с несколькими метками мы хотели бы, чтобы наши вероятности класса могли выразить, что изображение автомобиля принадлежит классуавтомобильс вероятностью 90% и в класснесчастный случайс вероятностью 30% и т. д.

Мы добьемся этого, используя, например,сигмоидфункция.

В частности, мы заменим:

final_tensor = tf.nn.softmax(logits, name=final_tensor_name)

с:

final_tensor = tf.nn.sigmoid(logits, name=final_tensor_name)

Мы также должны обновить способ расчета кросс-энтропии, чтобы правильно обучить нашу сеть:

Опять же, просто замените softmax на сигмовидную:

cross_entropy = tf.nn.sigmoid_cross_entropy_with_logits(logits,ground_truth_input)

Изменение оценки

Методadd_evaluation_step ()вставляет операции, которые нам нужны, чтобы оценить точность предсказанных меток. Изначально это выглядело так:

correct_prediction = tf.equal(tf.argmax(result_tensor, 1), tf.argmax(ground_truth_tensor, 1))

Хорошо, что здесь происходит?

И то и другоеresult_tensorа такжеground_truth_tensorможно представить как двумерные массивы:

|        | label1  | label2 | label3  |
| image1 | 0 | 1 | 0 |
| image2 | 1 | 0 | 0 |

Поэтому эта строка:

tf.argmax(result_tensor, 1)

возвращает индекс максимального значения в каждомряд, Каждая строка из-за (ось =1) параметр.

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

Чтобы адаптировать этот подход к нашему мульти-лейблу, мы просто заменимArgmax ()скруглый()который превращает вероятности в 0 и 1. Затем мы сравниваемresult_tensorсground_truth_tensorуже содержит только 0 и 1:

correct_prediction = tf.equal(tf.round(result_tensor), ground_truth_tensor)

Это все изменения, которые мы должны сделать, чтобы правильно классифицировать изображения с несколькими метками.

Запуск переподготовки

Просто запустите эту команду из корня проекта:

python retrain.py \
--bottleneck_dir=bottlenecks \
--how_many_training_steps 500 \
--model_dir=model_dir \
--output_graph=retrained_graph.pb \
--output_labels=retrained_labels.txt \
--summaries_dir=retrain_logs \
--image_dir=images

Я рекомендую поиграть с количеством тренировочных шагов, чтобы не перегружать вашу модель.

Тестирование переобученной модели

Бег:

python label_image.py <image_name>

Я немного доработалlabel_image.pyвыписать полученные проценты класса вresults.txt,

Визуализация обучения

После переподготовки вы можете просмотреть журналы, выполнив:

tensorboard --logdir retrain_logs

и навигация кhttp://127.0.0.1:6006/в вашем браузере.

Конец

Я надеюсь, что я сделал все изменения и причины, стоящие за ними, настолько ясными, насколько это возможно, и что вы узнали что-то новое сегодня :)

Если у вас есть дополнительные вопросы, вы можете найти меня наLinkedInилинапишите мне напрямую,

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

Footer decor

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