在跑MTCNN的時候,在跑這個程式時,出現的錯誤 gen_PNet_tfrecords.py
已經困擾了我好幾天了 有沒有大佬可以告訴我哪里錯了
這是我的代碼,只改了地址
#coding:utf-8
import os
import random
import sys
import time
import tensorflow as tf
from tfrecord_utils import _process_image_withoutcoder, _convert_to_example_simple
def _add_to_tfrecord(filename, image_example, tfrecord_writer):
"""Loads data from image and annotations files and add them to a TFRecord.
Args:
filename: Dataset directory;
name: Image name to add to the TFRecord;
tfrecord_writer: The TFRecord writer to use for writing.
"""
#print('---', filename)
#imaga_data:array to string
#height:original image's height
#width:original image's width
#image_example dict contains image's info
image_data, height, width = _process_image_withoutcoder(filename)
example = _convert_to_example_simple(image_example, image_data)
tfrecord_writer.write(example.SerializeToString())
def _get_output_filename(output_dir, name, net):
#st = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
#return '%s/%s_%s_%s.tfrecord' % (output_dir, name, net, st)
return '%s/train_PNet_landmark.tfrecord' % (output_dir)
def run(dataset_dir, net, output_dir, name='MTCNN', shuffling=False):
"""Runs the conversion operation.
Args:
dataset_dir: The dataset directory where the dataset is stored.
output_dir: Output directory.
"""
#tfrecord name
tf_filename = _get_output_filename(output_dir, name, net)
if tf.io.gfile.exists(tf_filename):
print('Dataset files already exist. Exiting without re-creating them.')
return
# GET Dataset, and shuffling.
dataset = get_dataset(dataset_dir, net=net)
# filenames = dataset['filename']
if shuffling:
tf_filename = tf_filename + '_shuffle'
#random.seed(12345454)
random.shuffle(dataset)
# Process dataset files.
# write the data to tfrecord
print('lala')
with tf.compat.v1.python_io.TFRecordWriter(tf_filename) as tfrecord_writer:
for i, image_example in enumerate(dataset):
if (i+1) % 100 == 0:
sys.stdout.write('\r>> %d/%d images has been converted' % (i+1, len(dataset)))
#sys.stdout.write('\r>> Converting image %d/%d' % (i + 1, len(dataset)))
sys.stdout.flush()
filename = image_example['filename']
_add_to_tfrecord(filename, image_example, tfrecord_writer)
# Finally, write the labels file:
# labels_to_class_names = dict(zip(range(len(_CLASS_NAMES)), _CLASS_NAMES))
# dataset_utils.write_label_file(labels_to_class_names, dataset_dir)
print('\nFinished converting the MTCNN dataset!')
def get_dataset(dir, net='PNet'):
#get file name , label and anotation
#item = 'imglists/PNet/train_%s_raw.txt' % net
item = 'D:/MTCNN-Tensorflow-master/prepare_data/DATA/imglists/PNet/train_%s_landmark.txt' % net
dataset_dir = os.path.join(dir, item)
#print(dataset_dir)
imagelist = open(dataset_dir, 'r')
dataset = []
for line in imagelist.readlines():
info = line.strip().split(' ')
data_example = dict()
bbox = dict()
data_example['filename'] = info[0]
#print(data_example['filename'])
data_example['label'] = int(info[1])
bbox['xmin'] = 0
bbox['ymin'] = 0
bbox['xmax'] = 0
bbox['ymax'] = 0
bbox['xlefteye'] = 0
bbox['ylefteye'] = 0
bbox['xrighteye'] = 0
bbox['yrighteye'] = 0
bbox['xnose'] = 0
bbox['ynose'] = 0
bbox['xleftmouth'] = 0
bbox['yleftmouth'] = 0
bbox['xrightmouth'] = 0
bbox['yrightmouth'] = 0
if len(info) == 6:
bbox['xmin'] = float(info[2])
bbox['ymin'] = float(info[3])
bbox['xmax'] = float(info[4])
bbox['ymax'] = float(info[5])
if len(info) == 12:
bbox['xlefteye'] = float(info[2])
bbox['ylefteye'] = float(info[3])
bbox['xrighteye'] = float(info[4])
bbox['yrighteye'] = float(info[5])
bbox['xnose'] = float(info[6])
bbox['ynose'] = float(info[7])
bbox['xleftmouth'] = float(info[8])
bbox['yleftmouth'] = float(info[9])
bbox['xrightmouth'] = float(info[10])
bbox['yrightmouth'] = float(info[11])
data_example['bbox'] = bbox
dataset.append(data_example)
return dataset
if __name__ == '__main__':
dir = 'D:/MTCNN-Tensorflow-master/prepare_data/DATA/'
net = 'PNet'
output_directory = 'D:/MTCNN-Tensorflow-master/prepare_data/DATA/imglists/PNet'
run(dir, net, output_directory, shuffling=True)
uj5u.com熱心網友回復:
另外一個呼叫的程式是這個,tfrecord_utils.py#coding:utf-8
import tensorflow as tf
import os
import cv2
from PIL import Image
def _int64_feature(value):
"""Wrapper for insert int64 feature into Example proto."""
if not isinstance(value, list):
value = [value]
return tf.train.Feature(int64_list=tf.train.Int64List(value=https://bbs.csdn.net/topics/value))
def _float_feature(value):
"""Wrapper for insert float features into Example proto."""
if not isinstance(value, list):
value = [value]
return tf.train.Feature(float_list=tf.train.FloatList(value=https://bbs.csdn.net/topics/value))
def _bytes_feature(value):
"""Wrapper for insert bytes features into Example proto."""
if not isinstance(value, list):
value = [value]
return tf.train.Feature(bytes_list=tf.train.BytesList(value=https://bbs.csdn.net/topics/value))
def _convert_to_example(image_example, image_buffer, colorspace=b'RGB', channels=3, image_format=b'JPEG'):
"""
covert to tfrecord file
:param image_example: dict, an image example
:param image_buffer: string, JPEG encoding of RGB image
:param colorspace:
:param channels:
:param image_format:
:return:
Example proto
"""
# filename = str(image_example['filename'])
# class label for the whole image
class_label = image_example['label']
# print(class_label)
image_bboxes = image_example.get('bbox', {})
xmin = image_bboxes.get('xmin', [])
xmax = image_bboxes.get('xmax', [])
ymin = image_bboxes.get('ymin', [])
ymax = image_bboxes.get('ymax', [])
# print(xmin)
example = tf.train.Example(features=tf.train.Features(feature={
'image/colorspace': _bytes_feature(colorspace),
'image/channels': _int64_feature(channels),
'image/format': _bytes_feature(image_format),
'image/encoded': _bytes_feature(image_buffer),
'image/label': _int64_feature(class_label),
'image/image_bbox/xmin': _float_feature(xmin),
'image/image_bbox/ymin': _float_feature(ymin),
'image/image_bbox/xmax': _float_feature(xmax),
'image/image_bbox/ymax': _float_feature(ymax),
}))
return example
def _convert_to_example_simple(image_example, image_buffer):
"""
covert to tfrecord file
:param image_example: dict, an image example
:param image_buffer: string, JPEG encoding of RGB image
:param colorspace:
:param channels:
:param image_format:
:return:
Example proto
"""
# filename = str(image_example['filename'])
# class label for the whole image
class_label = image_example['label']
bbox = image_example['bbox']
roi = [bbox['xmin'],bbox['ymin'],bbox['xmax'],bbox['ymax']]
landmark = [bbox['xlefteye'],bbox['ylefteye'],bbox['xrighteye'],bbox['yrighteye'],bbox['xnose'],bbox['ynose'],
bbox['xleftmouth'],bbox['yleftmouth'],bbox['xrightmouth'],bbox['yrightmouth']]
example = tf.train.Example(features=tf.train.Features(feature={
'image/encoded': _bytes_feature(image_buffer),
'image/label': _int64_feature(class_label),
'image/roi': _float_feature(roi),
'image/landmark': _float_feature(landmark)
}))
return example
class ImageCoder(object):
"""Helper class that provides TensorFlow image coding utilities."""
def __init__(self):
# Create a single Session to run all image coding calls.
self._sess = tf.Session()
# Initializes function that converts PNG to JPEG data.
self._png_data = tf.placeholder(dtype=tf.string)
image = tf.image.decode_png(self._png_data, channels=3)
self._png_to_jpeg = tf.image.encode_jpeg(image, format='rgb', quality=100)
# Initializes function that decodes RGB JPEG data.
self._decode_jpeg_data = tf.placeholder(dtype=tf.string)
self._decode_jpeg = tf.image.decode_jpeg(self._decode_jpeg_data, channels=3)
def png_to_jpeg(self, image_data):
# Convert the image data from png to jpg
return self._sess.run(self._png_to_jpeg,
feed_dict={self._png_data: image_data})
def decode_jpeg(self, image_data):
# Decode the image data as a jpeg image
image = self._sess.run(self._decode_jpeg,
feed_dict={self._decode_jpeg_data: image_data})
assert len(image.shape) == 3, "JPEG needs to have height x width x channels"
assert image.shape[2] == 3, "JPEG needs to have 3 channels (RGB)"
return image
def _is_png(filename):
"""Determine if a file contains a PNG format image.
Args:
filename: string, path of the image file.
Returns:
boolean indicating if the image is a PNG.
"""
_, file_extension = os.path.splitext(filename)
return file_extension.lower() == '.png'
def _process_image(filename, coder):
"""Process a single image file.
Args:
filename: string, path to an image file e.g., '/path/to/example.JPG'.
coder: instance of ImageCoder to provide TensorFlow image coding utils.
Returns:
image_buffer: string, JPEG encoding of RGB image.
height: integer, image height in pixels.
width: integer, image width in pixels.
"""
# Read the image file.
# Note: tf bug 使用‘r‘會出錯,無法解碼,只能以2進制形式讀取
# image_data = tf.gfile.FastGFile(filename, 'r').read()
# image_raw_data = tf.gfile.FastGFile(filename, 'rb').read()
# img_data_jpg = tf.image.decode_jpeg(image_raw_data)
# img_data_jpg = tf.image.convert_image_dtype(img_data_jpg, dtype=tf.float32)
# resized_image = tf.image.resize_images(img_data_jpg, [25, 25])
# image_data = sess.run(tf.cast(resized_image, tf.uint8)).tobytes()
# image = Image.open(filename) # 圖片的型別必須為array
filename = filename + '.jpg'
print(filename)
image = cv2.imread(filename)
# image.show()
# image_data = image.tobytes()
image_data = image.tostring()
# Clean the dirty data.
if _is_png(filename):
print(filename, 'to convert jpeg')
image_data = coder.png_to_jpeg(image_data)
# Decode the RGB JPEG.
# image = coder.decode_jpeg(image_data)
# print(image.shape)
# Check that image converted to RGB
assert len(image.shape) == 3
height = image.shape[0]
width = image.shape[1]
assert image.shape[2] == 3
return image_data, height, width
def _process_image_withoutcoder(filename):
#print(filename)
image = cv2.imread(filename)
#print(type(image))
# transform data into string format
image_data = image.tostring()
assert len(image.shape) == 3
height = image.shape[0]
width = image.shape[1]
assert image.shape[2] == 3
# return string data and initial height and width of the image
return image_data, height, width
uj5u.com熱心網友回復:
有沒有大佬幫幫忙看看uj5u.com熱心網友回復:
有沒有大佬看到這個的啊轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/95084.html
上一篇:小白求教
