将本地图片数据集做成TFRecord文件

制作tfrecord文件时,先考虑我想保存图片的什么信息。

直接将图片输入到卷积神经网络中,需要图片的名称、维度和内容,所以制作tfrecord文件时需要将这三个内容记录下来。

第一步、读取文件夹中的图片。因为项目之后要用到opencv,所以我直接使用cv2读取文件。

def read_image(file_path, resize_h=0, resize_w=0, nomalization=False):
    """
    读取图片,默认情况下返回numpy.uint8类型的图片
    :param file_path:图片所在路径
    :param resize_h:重新调整图片的高度,默认情况下不对图片进行reshape
    :param resize_w:重新设置图片的宽度,默认情况下不对图片进行reshape
    :param nomalization:默认为False,此时不对图片归一化处理;当为True时,对图片像素值归一化处理
    :return:默认情况下返回np.unit8类型的图片,归一化时返回[resize_h, resize_w, 3]的float64类型的图片
    """
    or_image = cv2.imread(file_path)
    if resize_h > 0 and resize_w > 0:
        or_image = cv2.resize(or_image, (resize_w, resize_h))
    if nomalization:
        or_image = or_image / 255.0
    return or_image

 

第二步,对图片构造example信息。如何构造example信息在这里已经记录过了:https://blog.youkuaiyun.com/Mr_None/article/details/106384102

def create_example(img):
    """
     为每张图片创建一个example消息,并将其序列化
    :param img:需要创建example的图像
    :return:序列化后的Example对象
    """
    # np.tostring方法将np数组转化成bytes类型,方便写入tfrecord,但这个方法会丢失矩阵的维度信息,所以还需要记录图片的长宽信息
    img_content = img.tostring()
    example = tf.train.Example(features=tf.train.Features(feature={
            'img_content': bytes_feature(img_content),
            'img_height': int64_feature(img.shape[0]),
            'img_width': int64_feature(img.shape[1]),
            'img_chanel': int64_feature(img.shape[2])
        }))
    example_str = example.SerializeToString()
    return example_str

 

第三步,将每张图片的example信息写入record文件,此时需要遍历文件夹下的所有图片,这里我使用os模块,用os.listdir()读取当前文件夹下所有文件名称,返回一个列表,列表元素为每个文件的名称,类型为字符串。

def record(file_path, record_path, resize_h=0, resize_w=0, normalization=False):
    """
    将文件夹中的图片做成tfrecord文件
    :param file_path: 数据集所在的文件夹路径
    :param record_path: tfrecord文件所在路径
    :param resize_h: 需要重新设置的图片的高度,默认情况下不进行reshape
    :param resize_w: 需要重新设置的图片的宽度,默认情况下不进行reshape
    :param normalization: 归一化参数,默认为不归一化
    :return: None
    """
    img_list = os.listdir(file_path)
    tf_writer = tf.python_io.TFRecordWriter(record_path)
    for img_name in img_list:
        img_path = os.path.join(file_path, img_name)
        img = read_image(img_path, resize_h, resize_w, normalization)
        example = create_example(img)
        tf_writer.write(example)
    print('We had record your data to tfrecord file. You can see it in the file named: ' + record_path)
    tf_writer.close()

 有个额外的问题,当我使用argparse模块,将源图像文件夹的路径和生成的record文件的路径作为可选参数添加到参数列表后,成功运行

import argparse
import tensorflow as tf
import cv2
import os

# 创建一个解析器
parser = argparse.ArgumentParser(description='The source image path and record path')
# # 添加参数
parser.add_argument('--source_path', type=str, default='D:\\CHR\\data\\reconstruction materials\\video1', help='Raw data file path.')
parser.add_argument('--record_path', default='record', help='The path of tfrecord file.')
# parser.add_argument('--record_path', type=str, default='D:\\CHR\\code\\patent_spring\\ImgToRecord\\video2\\record', help='The path of tfrecord file.')
# 解析参数
args = parser.parse_args()

在命令行运行程序,更改record文件路径(也就是不适用上面代码提供的默认值),结果失败,如下:

 

但是我修改代码,将上面命令行中提供的路径修改成默认的record文件路径,可以运行成功,如下:

import argparse
# 创建一个解析器
parser = argparse.ArgumentParser(description='The source image path and record path')
# # 添加参数
parser.add_argument('--source_path', default='D:\\CHR\\data\\reconstruction materials\\video1', help='Raw data file path.')
# parser.add_argument('--record_path', default='D:\\CHR\\code\\data_build\\record', help='The path of tfrecord file.')
parser.add_argument('--record_path', default='D:\\CHR\\code\\patent_spring\\ImgToRecord\\video2\\record', help='The path of tfrecord file.')
# 解析参数
args = parser.parse_args()
....
record(args.source_path, args.record_path)

还要再学习学习argparse模块的用法

### 使用SSD框架训练自定义目标检测模型 为了使用SSD框架训练自己的目标检测模型,以下是详细的说明: #### 安装必要的依赖项 首先需要确保环境中有Jupyter Notebook可用。如果尚未安装,则可以通过以下命令完成安装: ```bash conda install jupyter ``` 此操作将帮助设置运行Notebook所需的环境[^1]。 #### 准备数据集 在开始训练之前,需准备用于训练的数据集。这通常涉及以下几个方面的工作: - **收集图像**:获取一组包含感兴趣对象的图像。 - **标注工具**:利用如LabelImg之类的工具对这些图像中的对象进行标记。每张图像应附带相应的XML文件或其他格式的标签文件,描述其中的对象类别及其边界框坐标[^3]。 #### 数据预处理 一旦有了标注好的数据集,就需要将其转换成适合输入到SSD模型的形式。一般情况下,这意味着要把原始图片连同其对应的标签一起转化为TFRecord格式——这是TensorFlow推荐的一种高效存储大量结构化数据的方法。具体转化过程可参照官方文档或者社区分享的相关脚本实现。 #### 配置参数与调整超参 接下来就是配置阶段了,在这里主要做两件事情: 1. 修改`ssd_pipline.config`等相关配置文件里的路径指向本地的数据位置; 2. 调整一些重要的超参数比如学习率、批量大小(batch size)等以适应特定的任务需求[^4]。 #### 开始训练 当一切准备工作就绪之后就可以启动实际的训练流程了。假设已经克隆下来了一个版本库(例如`SSD-Tensorflow-master`),那么可以在该仓库根目录下执行如下指令开启训练进程: ```bash python train_ssd.py --pipeline_config_path=path/to/ssd_pipeline.config --model_dir=path/to/model_directory/ ``` 上述命令中指定了使用的管道配置文件(`--pipeline_config_path`)以及保存检查点和其他输出物的位置(`--model_dir`)。随着迭代次数增加,你会看到损失逐渐下降的趋势图以及其他评估指标的变化情况。 #### 测试与验证 最后一步是对新训练出来的模型效果加以检验。可以加载最新生成的最佳权重,并挑选部分测试样本来观察预测结果是否合理准确。同样也可以计算mAP(mean Average Precision)这样的量化评价标准来衡量整体性能表现如何。 ```python import tensorflow as tf from object_detection.utils import label_map_util, visualization_utils as vis_util # 加载冻结图(frozen graph) def load_model(model_path): detection_graph = tf.Graph() with detection_graph.as_default(): od_graph_def = tf.compat.v1.GraphDef() with tf.io.gfile.GFile(model_path, 'rb') as fid: serialized_graph = fid.read() od_graph_def.ParseFromString(serialized_graph) tf.import_graph_def(od_graph_def, name='') return detection_graph # 初始化session并读取图片进行推理... ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值