Загрузка файлов PNG в TensorFlow - PullRequest
0 голосов
/ 08 июля 2020

Я пытаюсь загрузить сделанные на заказ файлы png, созданные мной для обучения моей модели. Следуя инструкциям из руководства TensorFlow здесь , я использовал этот код:

import tensorflow as tf
import numpy as np
from pathlib import Path, WindowPath

train_df = pd.DataFrame(
    {'file_name': {0: WindowsPath('hypothesis/temp/81882f4e-0a94-4446-b4ac-7869cf198534.png'), 1: WindowsPath('hypothesis/temp/531162e2-2b4c-4e64-8b3f-1f285b0e1040.png')}, 'label': {0: -0.019687398020669655, 1: 0.0002379227226001479}}
)

file_path_list = [i.read_bytes() for i in train_df['file_name']]

dataset = tf.data.TFRecordDataset(filenames=file_path_list)

raw_example = next(iter(dataset))
parsed = tf.train.Example.FromString(raw_example.numpy())


Запуск строки raw_example... возвращает это сообщение об ошибке:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x89 in position 43: invalid start byte

Я сгенерировал файлы PNG с использованием matplotlib.

Ответы [ 2 ]

1 голос
/ 08 июля 2020

Я предлагаю читать файлы png с помощью встроенных методов io tenorflow. Приведенный ниже фрагмент кода сгенерирует список файлов с расширением .png и затем перебирает их. Во время каждой итерации он читает файл и затем декодирует закодированное изображение png

image_dir = 'hypothesis/temp'
image_root = pathlib.Path(image_dir)
list_ds = tf.data.Dataset.list_files(str(image_root/'*.png'))
for f in list_ds:
  image = tf.io.read_file(f)
  image = tf.io.decode_png(image)
0 голосов
/ 08 июля 2020

Думаю, проблема в i.read_bytes(). Это считывает содержимое файла, когда вам просто нужно имя файла.

Минимальное изменение будет примерно таким:

file_path_list = [str(i) for i in train_df['file_name']]
dataset = tf.data.TFRecordDataset(filenames=file_path_list)

Но если вам просто нужен список путей к файлам , нет причин сначала создавать фрейм данных:

file_path_list = ['foo/bar/1.png', 'foo/bar/2.png']

Причина, по которой вы получали ошибку, заключается в том, что TFRecordDataset () ожидал список строк в именах файлов, поэтому он попытался и не смог преобразовать данные двоичного файла на utf-8.

...