下面我将详细讲解Windows下实现将Pascal VOC转化为TFRecords的完整攻略,包含以下步骤:
1. 安装Python
首先,我们需要在Windows系统中安装Python,可以从官网https://www.python.org/downloads/windows/ 下载对应版本的Python。
2. 下载Pascal VOC数据集
Pascal VOC数据集是一个常用的目标检测数据集,包含多个类别的物体的图片和对应的标注文件。可以从官网http://host.robots.ox.ac.uk/pascal/VOC/voc2012/#data 下载VOC2012数据集。
3. 安装TensorFlow和其他依赖包
在Python环境中使用以下命令安装TensorFlow和其他依赖包:
pip install tensorflow
pip install lxml
pip install pillow
pip install Cython
pip install contextlib2
pip install jupyter
pip install matplotlib
4. 下载TFRecords转换脚本
下载官方的TFRecords转换脚本,保存到本地。
5. 编译protobuf
在TensorFlow项目中,需要用到protobuf。可以到https://github.com/google/protobuf/releases 下载对应版本的protobuf,并按照官方文档进行编译安装。
6. 修改TFRecords转换脚本中的变量
修改TFRecords转换脚本中的变量,包括图片所在的路径、标注文件所在的路径、输出TFRecords文件的路径等。具体修改方法可以参考脚本中的注释。
from object_detection.dataset_tools.create_pascal_tf_record import main
image_dir = 'JPEGImages'
anno_dir = 'Annotations'
output_path = 'voc2012_test.tfrecords'
main(['', 'pascal_voc', 'data/VOCdevkit', 'data/ImageSets/Main/test.txt', image_dir, anno_dir, output_path])
7. 运行转换脚本
在命令行中进入到TFRecords转换脚本所在的目录,运行以下命令即可将Pascal VOC转换为TFRecords:
python create_tf_record.py
示例1:将Pascal VOC转换为TFRecords
假设我们有一个Pascal VOC的数据集,包含两个类别('cat'和'dog')的物体。图片和标注文件的路径分别为:
data/
Annotations/
000001.xml
000002.xml
...
JPEGImages/
000001.jpg
000002.jpg
...
使用以下脚本即可将Pascal VOC转换为TFRecords:
from object_detection.dataset_tools.create_pascal_tf_record import main
image_dir = 'data/JPEGImages'
anno_dir = 'data/Annotations'
output_path = 'voc_test.tfrecords'
main(['', 'pascal_voc', '.', 'data/ImageSets/Main/test.txt', image_dir, anno_dir, output_path])
运行以上代码后,将会在当前目录下生成一个名为voc_test.tfrecords
的TFRecords文件。
示例2:将Pascal VOC转换为TFRecords并读取
可以使用TensorFlow提供的Dataset API读取TFRecords数据,并进行训练。
import tensorflow as tf
# 定义解析TFRecords数据的函数
def parse_func(serialized_example):
features = {
'image/height': tf.FixedLenFeature([], tf.int64),
'image/width': tf.FixedLenFeature([], tf.int64),
'image/filename': tf.FixedLenFeature([], tf.string),
'image/source_id': tf.FixedLenFeature([], tf.string),
'image/format': tf.FixedLenFeature([], tf.string),
'image/encoded': tf.FixedLenFeature([], tf.string),
'image/object/bbox/xmin': tf.VarLenFeature(tf.float32),
'image/object/bbox/xmax': tf.VarLenFeature(tf.float32),
'image/object/bbox/ymin': tf.VarLenFeature(tf.float32),
'image/object/bbox/ymax': tf.VarLenFeature(tf.float32),
'image/object/class/text': tf.VarLenFeature(tf.string),
'image/object/class/label': tf.VarLenFeature(tf.int64),
}
parsed = tf.parse_single_example(serialized_example, features)
image = tf.image.decode_jpeg(parsed['image/encoded'])
image_height = tf.cast(parsed['image/height'], tf.int32)
image_width = tf.cast(parsed['image/width'], tf.int32)
xmin = tf.sparse_tensor_to_dense(parsed['image/object/bbox/xmin'])
xmax = tf.sparse_tensor_to_dense(parsed['image/object/bbox/xmax'])
ymin = tf.sparse_tensor_to_dense(parsed['image/object/bbox/ymin'])
ymax = tf.sparse_tensor_to_dense(parsed['image/object/bbox/ymax'])
text = tf.sparse_tensor_to_dense(parsed['image/object/class/text'])
label = tf.sparse_tensor_to_dense(parsed['image/object/class/label'])
bbox = tf.stack([ymin, xmin, ymax, xmax], axis=-1)
return image, bbox, label
# 读取TFRecords数据
dataset = tf.data.TFRecordDataset('voc_test.tfrecords')
dataset = dataset.map(parse_func)
dataset = dataset.batch(32)
# 训练模型
# ...
以上代码可以读取示例1中生成的voc_test.tfrecords
文件,并将数据传入模型进行训练。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Windows下实现将Pascal VOC转化为TFRecords - Python技术站