IT이야기

Tensorflow는 레이블이 있는 이미지를 읽습니다.

cyworld 2021. 10. 25. 21:29
반응형

Tensorflow는 레이블이 있는 이미지를 읽습니다.


Tensorflow로 표준 이미지 분류 모델을 구축 중입니다. 이를 위해 각각 레이블({0,1}의 숫자)이 할당된 입력 이미지가 있습니다. 따라서 데이터는 다음 형식을 사용하여 목록에 저장할 수 있습니다.

/path/to/image_0 label_0
/path/to/image_1 label_1
/path/to/image_2 label_2
...

TensorFlow의 대기열 시스템을 사용하여 내 데이터를 읽고 내 모델에 공급하고 싶습니다. 레이블을 무시하고 string_input_producer를 사용하여 이를 쉽게 달성할 수 있습니다 wholeFileReader. 여기 코드:

def read_my_file_format(filename_queue):
  reader = tf.WholeFileReader()
  key, value = reader.read(filename_queue)
  example = tf.image.decode_png(value)
  return example

#removing label, obtaining list containing /path/to/image_x
image_list = [line[:-2] for line in image_label_list]

input_queue = tf.train.string_input_producer(image_list)                                                     
input_images = read_my_file_format(input_queue)

그러나 이미지 데이터가 입력 파이프라인의 일부로 의도적으로 섞이기 때문에 해당 프로세스에서 레이블이 손실됩니다. 입력 대기열을 통해 이미지 데이터와 함께 레이블을 푸시하는 가장 쉬운 방법은 무엇입니까?


사용하면 slice_input_producer훨씬 더 깨끗한 솔루션을 제공합니다. Slice Input Producer를 사용하면 임의로 많은 분리 가능한 값을 포함하는 입력 큐를 생성할 수 있습니다. 이 질문의 스니펫은 다음과 같습니다.

def read_labeled_image_list(image_list_file):
    """Reads a .txt file containing pathes and labeles
    Args:
       image_list_file: a .txt file with one /path/to/image per line
       label: optionally, if set label will be pasted after each line
    Returns:
       List with all filenames in file image_list_file
    """
    f = open(image_list_file, 'r')
    filenames = []
    labels = []
    for line in f:
        filename, label = line[:-1].split(' ')
        filenames.append(filename)
        labels.append(int(label))
    return filenames, labels

def read_images_from_disk(input_queue):
    """Consumes a single filename and label as a ' '-delimited string.
    Args:
      filename_and_label_tensor: A scalar string tensor.
    Returns:
      Two tensors: the decoded image, and the string label.
    """
    label = input_queue[1]
    file_contents = tf.read_file(input_queue[0])
    example = tf.image.decode_png(file_contents, channels=3)
    return example, label

# Reads pfathes of images together with their labels
image_list, label_list = read_labeled_image_list(filename)

images = ops.convert_to_tensor(image_list, dtype=dtypes.string)
labels = ops.convert_to_tensor(label_list, dtype=dtypes.int32)

# Makes an input queue
input_queue = tf.train.slice_input_producer([images, labels],
                                            num_epochs=num_epochs,
                                            shuffle=True)

image, label = read_images_from_disk(input_queue)

# Optional Preprocessing or Data Augmentation
# tf.image implements most of the standard image augmentation
image = preprocess_image(image)
label = preprocess_label(label)

# Optional Image and Label Batching
image_batch, label_batch = tf.train.batch([image, label],
                                          batch_size=batch_size)

전체 입력 파이프라인 TensorVision 예제 generic_input_producer 도 참조하세요 .


이 문제를 해결하는 세 가지 주요 단계가 있습니다.

  1. tf.train.string_input_producer()파일 이름과 레이블을 포함하는 공백으로 구분된 원래 문자열을 포함하는 문자열 목록을 채웁니다 .

  2. 이미지 파일을 읽는 tf.read_file(filename)대신 사용하십시오 tf.WholeFileReader(). tf.read_file()단일 파일 이름을 사용하고 파일 내용이 포함된 단일 문자열을 생성하는 상태 비저장 작업입니다. 순수 함수라는 장점이 있어 데이터를 입력과 출력에 연결하기 쉽습니다. 예를 들어 read_my_file_format함수는 다음과 같습니다.

    def read_my_file_format(filename_and_label_tensor):
      """Consumes a single filename and label as a ' '-delimited string.
    
      Args:
        filename_and_label_tensor: A scalar string tensor.
    
      Returns:
        Two tensors: the decoded image, and the string label.
      """
      filename, label = tf.decode_csv(filename_and_label_tensor, [[""], [""]], " ")
      file_contents = tf.read_file(filename)
      example = tf.image.decode_png(file_contents)
      return example, label
    
  3. read_my_file_format에서 큐에서 제거된 단일 요소를 전달하여 의 새 버전을 호출합니다 input_queue.

    image, label = read_my_file_format(input_queue.dequeue())         
    

그런 다음 나머지 모델에서 imagelabel텐서 를 사용할 수 있습니다 .


제공된 답변 외에도 수행할 수 있는 몇 가지 다른 작업이 있습니다.

Encode your label into the filename. If you have N different categories you can rename your files to something like: 0_file001, 5_file002, N_file003. Afterwards when you read the data from a reader key, value = reader.read(filename_queue) your key/value are:

The output of Read will be a filename (key) and the contents of that file (value)

Then parse your filename, extract the label and convert it to int. This will require a little bit of preprocessing of the data.

Use TFRecords which will allow you to store the data and labels at the same file.

ReferenceURL : https://stackoverflow.com/questions/34340489/tensorflow-read-images-with-labels

반응형