3.6 创建TensorFlow TFRecord文件
TensorFlow官方建议使用TensorFlow TFRecord格式文件向TensorFlow模型输入训练数据,速度最快,效率最高。TensorFlow内核很多数据处理机制都是基于TFRecord文件做的优化。
TFRecord格式文件是TensorFlow定义的二进制文件,基于Google Protocol Buffers这个跨平台跨语言序列化结构数据的协议标准。
TFRecord格式文件的扩展名是*.tfrecord。
3.6.1 将*.xml文件转换为*.csv文件
TensorFlow Object Detection API框架提供了一个*.tfrecord文件转换工具,要求首先将多个*.xml文件转换为一个*.csv文件,具体步骤如下。
第一步,请将本书提供的scripts文件夹复制到tf_train文件下,这是用于转换*.xml文件到*.tfrecord文件的用Python脚本写的工具,直接使用,无需开发。文件夹结构如图3-27所示。
图3-27 复制scripts文件夹到tf_train文件夹
preprocessing文件夹中的各文件作用如下。
● xml_to_csv.py用于将多个*.xml文件转换为一个*.csv文件。
● generate_tfrecord.py用于将*.csv文件转换为*.tfrecord文件。
第二步,由于这两个工具都使用了pandas库,所以请用命令conda install pandas安装pandas库,如图3-28所示。
图3-28 安装pandas库
第三步,进入tf_train\scripts\preprocessing文件夹,在文件夹地址栏中输入“cmd”,启动Windows命令行终端,然后输入命令“conda activate tf_gpu”,激活tf_gpu虚拟环境,并输入命令,命令格式如下。
请将[PATH_TO_IMAGES_FOLDER]替换为images文件夹的绝对路径,本书是D:\tf_train\workspaces\cats_dogs\images。
请把[PATH_TO_ANNOTATIONS_FOLDER]替换为annotations文件夹的绝对路径,本书是D:\tf_train\workspaces\cats_dogs\annotations。
请将xxx_labels.csv替换为对应的train_labels.csv或者eval_labels.csv。
train标注数据转换为csv文件的完整命令为
同样,eval标注数据转换为csv文件的完整命令为
运行结果如图3-29所示。
图3-29 xml文件转换为csv文件
3.6.2 将*.csv文件转换为*.tfrecord文件
用generate_tfrecord.py将*.csv文件转换为*.tfrecord文件,具体步骤如下。
第一步,用文本编辑器打开generate_tfrecord.py文件,由于本书使用了2个label(标签),所以修改第28~49行源代码,如图3-30所示。
若使用了3个label(标签),则下图方框中的程序如代码清单3-3所示。更多标签以此类推。
图3-30 修改generate_tfrecord.py
代码清单3-3 3个标签对应的程序
第二步,进入tf_train\scripts\preprocessing文件夹,在文件夹地址栏中输入“cmd”,启动Windows命令行终端,然后输入命令“conda activate tf_gpu”,激活tf_gpu虚拟环境并输入命令,命令格式如下。
请将[label_name0]、[label_name1]替换为标签名字,本书是cat和dog,需要注意的是:标签名字中不能有空格。
请将[PATH_TO_IMAGES_FOLDER]替换为images文件夹的绝对路径,本书是D:\tf_train\workspaces\cats_dogs\images。
请将[PATH_TO_ANNOTATIONS_FOLDER]替换为annotations文件夹的绝对路径,本书是D:\tf_train\workspaces\cats_dogs\annotations。
将xxx_labels.csv替换为对应的train_labels.csv或者eval_labels.csv,把xxx.tfrecord替换为对应的train.tfrecord或者eval.tfrecord。
train_labels.csv文件转换为train.tfrecord文件的完整命令为
同样,eval_labels.csv文件转换为eval.tfrecord文件的完整命令为
运行结果如图3-31所示。
图3-31 csv文件转换为tfrecord文件