Классификация изображений с использованием предварительно обученного (Tensorflow) CNN

Я обучил alexnet_v2 своему собственному набору данных и теперь хотел бы использовать его в другом приложении. Это должно быть очень просто, и я попытался реализовать это несколькими способами, но либо я получаю ошибки, которые я не могу обойти, либо (в случае кода ниже) он зависает на неопределенное время.

В идеале мне бы хотелось, чтобы это было в C++ (но API C++ кажется ненадежным или, по крайней мере, во многих местах устарела документация, поэтому Python приемлем), и я бы хотел классифицировать большие группы изображений (например: предоставление программа с 80 изображениями животных и возвращение, показывает ли какое-либо из них кота).

Правильно ли я делаю это с приведенным ниже кодом? Если так, как я могу это исправить.

Если нет, есть ли рабочие примеры лучшего способа?

Большое спасибо.

import tensorflow as tf

#Using preprocessing and alexnet_v2 net from the slim examples

from nets import nets_factory
from preprocessing import preprocessing_factory

#Checkpoint file from training on binary dataset

checkpoint_path = '/home/ubuntu/tensorflow/models/slim/data/checkpoint.ckpt'

slim = tf.contrib.slim

number_of_classes = 2


image_filename = '/home/ubuntu/tensorflow/models/slim/data/images/neg_sample_123459.jpg'

image_filename_placeholder = tf.placeholder(tf.string)

image_tensor = tf.read_file(image_filename_placeholder)

image_tensor = tf.image.decode_jpeg(image_tensor, channels=3)

image_batch_tensor = tf.expand_dims(image_tensor, axis=0)

#Use slim's alexnet_v2 implementation

network_fn = nets_factory.get_network_fn('alexnet_v2',num_classes=2,is_training=False)

#Use inception preprocessing

preprocessing_name = 'inception'
image_preprocessing_fn= preprocessing_factory.get_preprocessing(preprocessing_name,is_training=False)

image_tensor=image_preprocessing_fn(image_tensor,network_fn.default_image_size,network_fn.default_image_size)

label=3
images,labels=tf.train.batch(
    [image_tensor,label],
    batch_size=2,
    num_threads=1,
    capacity=10)

pred,_=network_fn(images)

initializer = tf.local_variables_initializer()

init_fn=slim.assign_from_checkpoint_fn(
    checkpoint_path,
    slim.get_model_variables('alexnet_v2'))

with tf.Session() as sess:

    sess.run(initializer)
    init_fn(sess)
    tf.train.start_queue_runners(sess)
    image_np, pred_np = sess.run([image_tensor, pred], feed_dict={image_filename_placeholder: image_filename})

РЕДАКТИРОВАТЬ: после добавления строки жирным шрифтом, программа больше не зависает. Однако я получаю ошибку заполнителя:

InvalidArgumentError: Необходимо передать значение для тензора-заполнителя 'Placeholder' с помощью строки dtype [[Node: Placeholder = Placeholderdtype=DT_STRING, shape=[], _device="/job:localhost/replica:0/task:0/ task: 0 / cpu:0"]]

Я дважды проверил орфографию и, насколько я вижу, правильно кормлю. В чем дело?

1 ответ

Решение

tf.train.batch() Функция использует фоновые потоки для предварительной выборки примеров, но вам нужно добавить явную команду (tf.train.start_queue_runners(sess)) чтобы начать эти темы. Переписав последнюю часть вашего кода следующим образом, вы остановите его:

with tf.Session() as sess:
  sess.run(initializer)
  init_fn(sess)

  # Starts background threads for input preprocessing.
  tf.train.start_queue_runners(sess)

  image_np, pred_np = sess.run(
      [image_tensor, pred],
      feed_dict={image_filename_placeholder: image_filename})
Другие вопросы по тегам