0

나는 내 자신의 데이터 세트에서 alexnet_v2를 교육했으며 이제 다른 응용 프로그램 내에서 사용하고 싶습니다. 이것은 매우 간단해야하며 여러 가지 방법으로 구현하려고 시도했으나 해결할 수없는 오류가 발생하거나 (아래 코드의 경우) 무한정 중단됩니다.사전 훈련 된 이미지 (Tensorflow)를 사용하여 이미지 분류 CNN

이상적으로는 C++ (C++ API는 신뢰할 수없는 것처럼 보이거나 적어도 많은 곳에서 오래된 문서를 가지고 있으므로 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}) 

편집 : 굵게 표시된 줄을 추가하면 프로그램이 더 이상 중단되지 않습니다. 그러나 자리 표시 자 오류가 발생합니다.

맞춤법 검사를 두 번 반복했으며, 올바르게 보았습니다. 올바르게 입력했습니다. 뭐가 문제 야?

답변

0

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}) 
+0

그 덕분에 문제가 해결되었습니다. 감사합니다. 하지만 이제는 자리 표시 자 오류가 발생합니다 ... – Loz

+0

문제는 큐 러너 ('sess.run() '를 내부적으로 호출하여 이미지를 일괄 처리하는 데 사용되는 큐를 채우는)'image_filename_placeholder'가 아니라 큐 주자는 먹일 파일 이름을 모릅니다. 한 번에 하나의 이미지를 분류한다면, 프로그램에서 좀 더 자세히 살펴보면'tf.train.batch()'가 전혀 필요 없다 : 단순히'tf.decode_jpeg()'의 결과를 전달하면된다. 'network_fn()'(아마 그것을 재 형성 한 후에). – mrry

+0

마지막 프로그램에서 네트워크 당 총 80 개의 이미지를 분류하려고합니다. 따라서 배치를 전달해야 할 필요가있는 이유가 여기에 있습니다 (원래 질문에 대해 간단하게 단순화했습니다). – Loz