使用TensorFlow训练模型

帧准备:

1. 下载框架代码,以ssd-为例

基于 VGG 的 SSD 网络的实现(具有 300 和 512 个输入)

2.按要求下载数据集:VOC数据集(2007和2012)或使用自己的数据集(数据集制作)

3. 下载基础模型

需要Fq下载:

4.安装(根据需要可以在IDE中修改代码直接执行,无需安装)

数据集制作:

1. 下载标记工具,这里推荐标记工具(box )

提取码:6666

2.给自己的数据集打标签(得到一个xml文件,里面包含标签框的坐标、名称等)

创建文件路径:

–主文件夹

—放置xml生成文件的文件夹

– –放置数据集图像的文件夹

–Main–放置自动划分train/val/test的txt文件

3.使用.py生成一个txt文件,划分训练集、验证集、测试集,生成的文件放在Main中

4. 使用框架中的 .py 将数据集转换成方便的 tf 类型文件

在构建之后创建一个文件夹

训练模型

一、修改.py代码

1.进入SSD—>—>.py改代码,根据自己的情况改。

    VOC_LABELS = { 
        'none': (0, 'Background'), 
        'aeroplane': (1, 'Vehicle'), 
        'bicycle': (2, 'Vehicle'), 
        'bird': (3, 'Animal'), 
     ...
    }

2. SSD—>—>ds.py

一个。然后将文件第83行改为’rb’: = tf.gfile.(, ‘rb’).read()

b. = 200,你可以根据自己的需要修改,可以保持不变。意思是把200张图片转换成一个文件。

3..py

一个。修改最大训练步数参数,例如将None改为50000。

b.参数根据类别数量变化,数量为类别数量加1。

s/.py

将 , , 更改为您的类别数加 1

5./.py

= 1

6..py 更改为您的类别编号加上 1.

      会出现shape不匹配等问题

二、使用.py训练模型,注意调整参数

训练的两种情况,第一种情况,不加载模型,直接全部训练。第二种情况,加载预训练好的模型,训练一些参数。

第一种:不加载模型,直接全部训练

    python3 train_ssd_network.py 
        --train_dir=/media/comway/data/dial_SSD/SSD-Tensorflow-master/train_log/ 
        --dataset_dir=/media/comway/data/dial_SSD/SSD-Tensorflow-master/dialvoc-train-tfrecords 
        --dataset_name=pascalvoc_2007 
        --dataset_split_name=train 
        --model_name=ssd_300_vgg 
        --save_summaries_secs=60 
        --save_interval_secs=600 
        --weight_decay=0.0005 
        --optimizer=adam 
        --learning_rate=0.001 
        --learning_rate_decay_factor=0.94 
        --batch_size=16 

第二种:加载预训练好的模型,训练一些参数。从 vgg 开始训练其中一些层的参数。其实就是加了–copes,还有–。

python3 train_ssd_network.py 
    --train_dir=/media/comway/data/dial_SSD/SSD-Tensorflow-master/train_log/    #训练生成模型的存放路径
    --dataset_dir=/media/comway/data/dial_SSD/SSD-Tensorflow-master/dialvoc-train-tfrecords   #数据存放路径
    --dataset_name=pascalvoc_2007   #数据名的前缀,我觉得应该通过这个调用是2007还是2012
    --dataset_split_name=train   #是加载训练集还是测试集
    --model_name=ssd_300_vgg   #加载的模型的名字
    --checkpoint_path=/media/comway/data/dial_SSD/SSD-Tensorflow-master/checkpoints/ssd_300_vgg.ckpt   #所加载模型的路径
 --checkpoint_exclude_scopes=ssd_300_vgg/conv6,ssd_300_vgg/conv7,ssd_300_vgg/block8,ssd_300_vgg/block9,ssd_300_vgg/block10,ssd_300_vgg/block11,ssd_300_vgg/block4_box,ssd_300_vgg/block7_box,ssd_300_vgg/block8_box,ssd_300_vgg/block9_box,ssd_300_vgg/block10_box,ssd_300_vgg/block11_box 
    --trainable_scopes=ssd_300_vgg/conv6,ssd_300_vgg/conv7,ssd_300_vgg/block8,ssd_300_vgg/block9,ssd_300_vgg/block10,ssd_300_vgg/block11,ssd_300_vgg/block4_box,ssd_300_vgg/block7_box,ssd_300_vgg/block8_box,ssd_300_vgg/block9_box,ssd_300_vgg/block10_box,ssd_300_vgg/block11_box 
    --save_summaries_secs=60 #每60s保存一下日志
    --save_interval_secs=600   #每600s保存一下模型
    --weight_decay=0.0005    #正则化的权值衰减的系数
    --optimizer=adam   #选取的最优化函数
    --learning_rate=0.001   #学习率
    --learning_rate_decay_factor=0.94   #学习率的衰减因子
    --batch_size=16    
    --gpu_memory_fraction=0.9  #指定占用gpu内存的百分比

1.指定数据集的位置,即文件的位置

2. 指定基础模型的位置,框架中的一个文件夹

3. 指定生成模型的放置位置,自己创建文件夹。这是一个模型的例子

4.根据电脑配置调整batch-size等参数

问题:

执行.py时遇到错误

1.使用CPU执行代码时:

修改代码中的 DATA_FORMAT = 'NCHW'

2.提示找不到“标注名称”

在框架中datasets文件夹中pascalvoc_common.py里找到VOC_LABELS={ 。。。}, 将除去‘none’外所有不属于自己的标签都可以删掉,然后填入自己标注时的标签名称

3. 错误:Nan in for:///

    1. 修改batch-size,将数值改小 (每次处理的图像数量)
    2. 修改learning_rate,将数值改小,可改为0.0001(学习速率)
        同时修改end_learning_rate,可改为0.00001

4. 错误: 错误: : .// : ./ >> 图像 1/(最后一次调用):文件“./.py”,第 59 行,intf.app.run(): ‘utf-8’ codec can’t byte 0xff in 0: start byte

修改:将datasets/pascalvoc_to_tfrecords.py文件83行中的读取方式由
    image_data = tf.gfile.FastGFile(filename, 'r').read()
  改为image_data = tf.gfile.FastGFile(filename, 'rb').read()

5. 错误:INFO::Error to : ,所有框必须在 [0.0, 1.0]: 1.002 中。 . .

一般是在转tfrecord文件时,tf_convert_data.py,产生错误(数据集中的数据标记不规范,出现了bbox四个坐标值落到到图像外的情况。)

解决问题方法1
错误位置:datasets
/pascalvoc_to_tfrecords.py bboxes.append((float(bbox.find('ymin').text) / shape[0], float(bbox.find('xmin').text) / shape[1], float(bbox.find('ymax').text) / shape[0], float(bbox.find('xmax').text) / shape[1] )) 修改为: ymin = max(float(bbox.find('ymin').text) / shape[0], 0.0)
xmin = max(float(bbox.find('xmin').text) / shape[1], 0.0)
ymax = min(float(bbox.find('ymax').text) / shape[0], 1.0)
xmax = min(float(bbox.find('xmax').text) / shape[1], 1.0)
bboxes.append(ymin, xmin, ymax, xmax
)

解决问题方法2:
如果修改后还会有此类报错,也可能是图像扩展时,某个框跑到了旋转后的页面之外。
可以尝试在修改方法1中的bboxes.append(ymin, xmin, ymax, xmax)之前增加一行代码:
...

if max(ymin, xmin, ymax, xmax) > 1.0:
return False

bboxes.append(ymin, xmin, ymax, xmax)
当筛选后的两个顶角坐标仍有超过图像尺寸的,直接跳过

 

注意:

数据集的图像不能太小。目前,vgg模型支持的标准图片尺寸有:224*224、300*300、512*512。图片太小会报错

© 版权声明
THE END
喜欢就支持一下吧
点赞13赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容