2017-12-26 32 views
0

Tensorflow를 사용하여 이미지를 분류 할 수있는 CNN을 만들고 있습니다. 나는 .txt 파일을 열고 반복적으로 사용하여 이미지 데이터를 읽을 함수를 작성했습니다파일 이름이 포함 된 .txt 파일을 사용하여 이미지 데이터 읽기

image1.jpg,4 
image2.jpg,3 
image3.jpg,2 

: 나는 다음과 같은 형식으로 해당 라벨과 함께 .jpg 파일의 목록을 포함하는 images.txt 파일이 베개 :

data = [] 
labels = [] 

def preprocess(): 
    with open('images.txt') as f: 
     for line in f: 
      // Did some string processing to get path of the image 

      img = Image.open(path) 
      arr = np.array(img.getdata(), dtype=np.int8) 
      data.append(arr) 

이 절차의 자연 속도는 확실하지 않지만 꽤 느립니다. 약 5000 줄의 이미지 (예 : images.txt)를 읽어야하는데,이 기능을 실행하는 데 약 60 초가 걸립니다.

누군가가이 문제에 대해 의견을 개진하고 성능 향상을 위해 무엇을해야하는지 알려주시겠습니까? 감사.

답변

1

이 작업을 수행하는 최적의 방법은 Tensorflow를 사용하여 모든 작업을 수행하는 것입니다.

이 할 수있는 간단한 방법이있다 : 당신은 CSV, 이미지와 레이블을 읽고 크기의 배치 (32)

당신은 수를 만들 Tensorflow를 사용하는이 방법

# load csv content 
csv_path = tf.train.string_input_producer(['images.txt']) 
textReader = tf.TextLineReader() 
_, csv_content = textReader.read(csv_path) 
im_name, label = tf.decode_csv(csv_content, record_defaults=[[""], [0]]) 

# load images 
im_content = tf.read_file(im_name) 
image = tf.image.decode_jpeg(im_content, channels=3) 
# preprocess your input image (scale, subtract mean, resize, ...) 

# make batches 
bs = 32 
im_batch, lb_batch = tf.train.batch([image, label], batch_size=bs) 

im_batchlb_batch을 입력 및 네트워크 대상으로 사용하십시오.

+0

감사를 사용하여 만든 모델로 데이터 집합을 일괄 처리하지만, '''train_accuracy = accuracy.eval (feed_dict = {x : batch [0], y_ : batch [1], keep_prob : 1.0})'''은'''오류를 생성합니다 :''TypeError : 피드의 값은 tf.Tensor 객체가 될 수 없습니다. 사용할 수있는 피드 값에는 Python 스칼라, 문자열, 목록, numpy ndarrays 또는 TensorHandles가 포함됩니다. '''어떻게 해결할 수 있습니까? – ccying

+0

자리 표시 자의 값으로 사용할 필요는 없습니다. 그들은 이미 그래프의 일부이므로 아무 것도 먹이지 않아도됩니다. 더 나은 이해를 위해이 안내서를 읽으십시오 : https://www.tensorflow.org/api_guides/python/reading_data – nessuno

0

를 사용하여 새 데이터 집합 API (TF 1.4 버전의 일부로서 발표) 전체 프로세스를 CSV 파일에서 읽기위한

단계의 속도 :

1) CSV 파일 이름을 읽기
2) CSV 파일 이름을 제공하여 TextLineDataset을 만듭니다.
3) 디코딩을위한 구문 분석 기능을 만들고 입력 데이터에서 사전 처리 작업을 수행합니다. 4) 일괄 처리, 반복 (에포크 없음) 및 셔플을 만듭니다. g) 이전 단계에서 생성 된 데이터 세트를 사용합니다.
5) 필수 입력을 일괄 처리로 가져 오는 Iterator를 만듭니다. 미니 배치)

예 : 코드 : 내가 정확성을 확인하고 때

from matplotlib.image import imread 
def input_model_function(): 
    csv_filename =['images.txt'] 
    dataset = tf.data.TextLineDataset(csv_filename) 
    dataset = dataset.map(_parse_function) 
    dataset = dataset.batch(20)# you can use any number of batching 
    iterator = dataset.make_one_shot_iterator() 
    sess = tf.Session() 
    batch_images, batch_labels = sess.run(iterator.get_next()) 
return {'x':batch_images}, batch_labels 

def _parse_function(line): 
    image, labels= tf.decode_csv(line,record_defaults=[[""], [0]]) 
    # Decode the raw bytes so it becomes a tensor with type. 
    image = imread(image)# give full path name of image 
return image, labels 

마지막으로 입력 (모든 사전 제작 견적 또는 사용자 정의 견적 API)