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 도 참조하세요 .
이 문제를 해결하는 세 가지 주요 단계가 있습니다.
tf.train.string_input_producer()
파일 이름과 레이블을 포함하는 공백으로 구분된 원래 문자열을 포함하는 문자열 목록을 채웁니다 .이미지 파일을 읽는
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
read_my_file_format
에서 큐에서 제거된 단일 요소를 전달하여 의 새 버전을 호출합니다input_queue
.image, label = read_my_file_format(input_queue.dequeue())
그런 다음 나머지 모델에서 image
및 label
텐서 를 사용할 수 있습니다 .
제공된 답변 외에도 수행할 수 있는 몇 가지 다른 작업이 있습니다.
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
'IT이야기' 카테고리의 다른 글
이들go get과 go install의 차이점 (0) | 2021.10.25 |
---|---|
반응 수명 주기 방법 이해 (0) | 2021.10.25 |
인터페이스 대신 람다 전달 (0) | 2021.10.24 |
ASP.NET MVC의 컨트롤러에서 경로 이름 얻는 방법 (0) | 2021.10.24 |
Eclipse에서 XML 파일 실행을 중지하는 방법 (0) | 2021.10.24 |