2017-10-11 2 views
1

Ich benutze Python 2.7.13 und Tensorflow 1.3.0 auf der CPU.Decoding tfrecord mit tfslim

Ich möchte DensNet (https://github.com/pudae/tensorflow-densenet) für Regressionsproblem verwenden. Meine Daten enthalten 60000 JPEG-Bilder mit 37 Float-Labels für jedes Bild. gespeichert ich meine Daten in tfrecords Dateien von:

def Read_Labels(label_path): 
labels_csv = pd.read_csv(label_path) 
labels = np.array(labels_csv) 
return labels[:,1:] 

`

def load_image(addr): 
# read an image and resize to (224, 224) 
img = cv2.imread(addr) 
img = cv2.resize(img, (224, 224), interpolation=cv2.INTER_CUBIC) 
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 
img = img.astype(np.float32) 
return img 

def Shuffle_images_with_labels(shuffle_data, photo_filenames, labels): 
if shuffle_data: 
    c = list(zip(photo_filenames, labels)) 
    shuffle(c) 
    addrs, labels = zip(*c) 
    return addrs, labels 

def image_to_tfexample_mine(image_data, image_format, height, width, label): 
return tf.train.Example(features=tf.train.Features(feature={ 
    'image/encoded': bytes_feature(image_data),  
    'image/format': bytes_feature(image_format), 
    'image/class/label': _float_feature(label), 
    'image/height': int64_feature(height), 
    'image/width': int64_feature(width), 
})) 

def _convert_dataset(split_name, filenames, labels, dataset_dir): 
assert split_name in ['train', 'validation'] 

num_per_shard = int(math.ceil(len(filenames)/float(_NUM_SHARDS))) 

with tf.Graph().as_default(): 

    for shard_id in range(_NUM_SHARDS): 
     output_filename = _get_dataset_filename(dataset_path, split_name, shard_id) 

     with tf.python_io.TFRecordWriter(output_filename) as tfrecord_writer: 
      start_ndx = shard_id * num_per_shard 
      end_ndx = min((shard_id+1) * num_per_shard, len(filenames)) 
      for i in range(start_ndx, end_ndx): 
       sys.stdout.write('\r>> Converting image %d/%d shard %d' % (
         i+1, len(filenames), shard_id)) 
       sys.stdout.flush() 

       img = load_image(filenames[i]) 
       image_data = tf.compat.as_bytes(img.tostring()) 

       label = labels[i] 

       example = image_to_tfexample_mine(image_data, image_format, height, width, label) 

       # Serialize to string and write on the file 
       tfrecord_writer.write(example.SerializeToString()) 

sys.stdout.write('\n') 
sys.stdout.flush() 

def run(dataset_dir): 

labels = Read_Labels(dataset_dir + '/training_labels.csv') 

photo_filenames = _get_filenames_and_classes(dataset_dir + '/images_training') 

shuffle_data = True 

photo_filenames, labels = Shuffle_images_with_labels(
     shuffle_data,photo_filenames, labels) 

training_filenames = photo_filenames[_NUM_VALIDATION:] 
training_labels = labels[_NUM_VALIDATION:] 

validation_filenames = photo_filenames[:_NUM_VALIDATION] 
validation_labels = labels[:_NUM_VALIDATION] 

_convert_dataset('train', 
       training_filenames, training_labels, dataset_path) 
_convert_dataset('validation', 
       validation_filenames, validation_labels, dataset_path) 

print('\nFinished converting the Flowers dataset!') 

Und ich dekodieren von:

with tf.Session() as sess: 

feature = { 
    'image/encoded': tf.FixedLenFeature((), tf.string, default_value=''), 
    'image/format': tf.FixedLenFeature((), tf.string, default_value='jpeg'), 
    'image/class/label': tf.FixedLenFeature(
     [37,], tf.float32, default_value=tf.zeros([37,], dtype=tf.float32)), 
    } 

filename_queue = tf.train.string_input_producer([data_path], num_epochs=1) 

reader = tf.TFRecordReader() 
_, serialized_example = reader.read(filename_queue) 

features = tf.parse_single_example(serialized_example, features=feature) 

image = tf.decode_raw(features['image/encoded'], tf.float32) 
print(image.get_shape()) 

label = tf.cast(features['image/class/label'], tf.float32) 

image = tf.reshape(image, [224, 224, 3]) 

images, labels = tf.train.shuffle_batch([image, label], batch_size=10, capacity=30, num_threads=1, min_after_dequeue=10) 

init_op = tf.group(tf.global_variables_initializer(), tf.local_variables_initializer()) 
sess.run(init_op) 

coord = tf.train.Coordinator() 
threads = tf.train.start_queue_runners(coord=coord) 

for batch_index in range(6): 
    img, lbl = sess.run([images, labels]) 
    img = img.astype(np.uint8) 
    print(img.shape) 
    for j in range(6): 
     plt.subplot(2, 3, j+1) 
     plt.imshow(img[j, ...]) 
    plt.show() 

coord.request_stop() 

coord.join(threads) 

Es ist alles in Ordnung dazu angestiftet Punkt. Aber wenn ich die brüllen Befehle zum Dekodieren TFRecord Dateien verwenden:

reader = tf.TFRecordReader 

keys_to_features = { 
     'image/encoded': tf.FixedLenFeature((), tf.string, default_value=''), 
     'image/format': tf.FixedLenFeature((), tf.string, default_value='raw'), 
     'image/class/label': tf.FixedLenFeature(
     [37,], tf.float32, default_value=tf.zeros([37,], dtype=tf.float32)), 
     } 

items_to_handlers = { 
     'image': slim.tfexample_decoder.Image('image/encoded'), 
     'label': slim.tfexample_decoder.Tensor('image/class/label'), 
    } 

decoder = slim.tfexample_decoder.TFExampleDecoder(
     keys_to_features, items_to_handlers) 

Ich erhalte die folgende Fehlermeldung.

INFO: tensorflow: Fehler zu Coordinator gemeldet: Assertionsfehler: [Kann nicht Bytes als JPEG, PNG, GIF entschlüsseln, oder BMP] [[Knoten: case/If_0/decode_image/cond_jpeg/cond_png/cond_gif/Assert_1/Assert = Bestätigen [T = [DT_STRING], summarisieren = 3, _device = "/ job: localhost/replik: 0/task: 0/cpu: 0"] (fall/If_0/decode_image/cond_jpeg/cond_png/cond_gif/is_bmp, case/Wenn_0/decode_image/cond_jpeg/cond_png/cond_gif/Assert_1/Assert/data_0)]] INFO: Tensorfluss: Caught OutOfRangeError. Training stoppen. INFO: Sensorflow: Abgeschlossenes Training! Modell auf Festplatte speichern.


Um Densenet für mein Problem, ich benutze zuerst den Fehler beheben sollte. Könnte mir bitte jemand aus diesem Problem helfen. Dieser Code funktioniert perfekt für die Datasets wie Blumen, MNIST und CIFAR10, die unter https://github.com/pudae/tensorflow-densenet/tree/master/datasets verfügbar sind, funktioniert aber nicht für meine Daten.

Antwort

0

Nach dem Fehler, ich denke, das Problem ist, dass Sie einen Image-Decoder für Array-Daten (dekodierte Daten) verwenden, weil Sie decodierte Daten beim Erstellen von TFRecords gespeichert. Vielleicht haben Sie bemerkt, wenn Sie nicht slim verwenden, verwenden Sie tf.decode_raw, um die Daten zu dekodieren. Aber wenn Sie slim verwenden, wird 'image/format': tf.FixedLenFeature((), tf.string, default_value='raw') nicht verwendet und standardmäßig wird slim Bilddecoder verwendet.

Ich glaube, Sie verwenden den Code in slim/data, wo format_key = 'image/format' Sie benötigen. So, wie folgt aus:

keys_to_features = { 
    'image/encoded': tf.FixedLenFeature((), tf.string, default_value=''), 
    'image/format': tf.FixedLenFeature((), tf.string, default_value='raw'), 
    'image/class/label': tf.FixedLenFeature(
     [1], tf.int64, default_value=tf.zeros([1], dtype=tf.int64)), 
} 

items_to_handlers = { 
    'image': tfexample_decoder.Image(
     image_key = 'image/encoded', 
     format_key = 'image/format', 
    'label': tfexample_decoder.Tensor('image/class/label'), 
} 

decoder = tfexample_decoder.TFExampleDecoder(
    keys_to_features, items_to_handlers) 

Aber ich bin nicht sicher, ob dies Ihr Problem lösen kann perfekt, weil ich nicht die Arbeit in meinem Rechner wiedergeben kann.

1

Dank pudae, ist das Problem gelöst. Ich brauchte:

image_data = tf.gfile.FastGFile(filenames[i], 'rb').read() 

Statt dies für das Laden von Daten. Das funktioniert jetzt perfekt.

img = load_image(filenames[i]) 
image_data = tf.compat.as_bytes(img.tostring())