训练自己的目标检测模型(SSD篇)SSD-Tensorflow-master MAC纠错版,并使用Google colab进行训练^_^
本文主体部分来自于文章:
https://blog.csdn.net/comway_Li/article/details/85240291
在应用SSD-Tensorflow-master于mac的过程中遇到诸多问题,记之。
本次的任务在于识别出环境下的文本文件,废话不多说,成品图
1.第一步:制作数据集by labelImg(这一步很重要啊,大家想训练啥一定要制作自己的数据集)
下载labelimg:github页面(https://github.com/tzutalin/labelImg)
Mac 安装应该挺简单,可百度,安装完成之后启动labelImg,打开终端,
输入:
labelImg
即可启动
标注数据
成功安装了标注工具后,现在就来开始标注数据了。
按照VOC数据集的要求,创建以下文件夹
Annotations:用于存放标注后的xml文件
ImageSets/Main:用于存放训练集、测试集、验收集的文件列表
JPEGImages:用于存放原始图像
打开labelImg,打开目录,导入原始图片,开始标记,依次标记并保存即可
标记完所有的数据集之后,划分训练集、测试集、验证集
完成所有熊猫照片的标注后,还要将数据集划分下训练集、测试集和验证集。在github上下载一个自动划分的脚本(https://github.com/EddyGao/make_VOC2007/blob/master/make_main_txt.py)
将此py文件放入同一目录下,如下
运行
python make_main_txt.py
2.转换数据集类型并开始训练
本案例是基于tensorflow的,因此,在github上下载一个基于tensorflow的SSD,地址是 https://github.com/balancap/SSD-Tensorflow
在下载好的SSD-Tensorflow-master文件中(此处为区分我将文件名改为SSD-Tensorflow-master gpu)加入两个新文件 text_voc2007 和 text_tfrecord
将刚刚配置好的三个文件拷贝进入 text_voc2007
以上为准备工作,完成之后打开终端,路径cd 至
python tf_convert_data.py --dataset_name=pascalvoc --dataset_dir=./text_voc2007/ --output_name=voc_2007_train --output_dir=./text_tfrecord/
此时按下回车,mac一般都会报错
一般情况下会warning:numpy相关的问题 可直接忽略
但mac可能会爆出另外的错误即:
其中.DS_S.jpg为mac文件格式中特有的检查文件可修改相关的代码 删去.DS_S.jpg文件即可 根据报错 我的解决方法为找到 pascalvoc_to_tfrecords.py文件
在第200行插入
index=filenames.index('.DS_Store')
filenames.pop(index)
删除.DS_Store文件即可
再次回车
接下来会出现报错
UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xff in position 0: invalid start byte
推测为读取方式错误,网上查找后
应为pascalvoc_to_tfrecords.py文件第83行出错
将r改为rb即可
修改完成后依旧会报错(key error可能是其他,不重要)
主要是ssd例子中没有我们自己的目标 ,打开
pascalvoc_common.py
将其中的字典的key修改为自己的labelimg中保存的标签即可(我的为line和circle)
再运行就发现finished
以上数据转换就基本完成
下载预训练模型
SSD-Tensorflow提供了预训练好的模型,基于VGG模型,可直接百度此模型vgg_voc0712_ssd_300x300_ft_iter_120000
选择他
文件内部
创建此文件夹,将vgg网络文件放入其中
右下角有文件名,请参考
〉===================
标注文件、SSD模型都配置完成,开始训练
在训练模型之前,有个参数要修改下,打开SSD-Tensorflow-master/train_ssd_network.py找到里面的DATA_FORMAT参数项,如果是使用cpu训练则值为NHWC,如果是使用gpu训练则值为NCHW,如下:
DATA_FORMAT = 'NCHW' # gpu
# DATA_FORMAT = 'NHWC' # cpu
而mac一般情况下都是cpu版,直接改成cpu就行
打开终端,cd至
python train_ssd_network.py \
--train_dir=./text_model \
--dataset_dir=./text_tfrecord \
--dataset_name=pascalvoc_2007 \
--dataset_split_name=train \
--model_name=ssd_300_vgg \
--checkpoint_path=./model_pre_train/VGG_VOC0712_SSD_300x300_ft_iter_120000.ckpt/VGG_VOC0712_SSD_300x300_ft_iter_120000.ckpt\
--save_summaries_secs=60 \
--save_interval_secs=600 \
--weight_decay=0.0005 \
--optimizer=adam \
--learning_rate=0.01 \
--batch_size=8
输入后如图
有可能训练成功,但也有可能失败,应该是错误
检查两项
1.checkpoint的的地址是否正确, --checkpoint_path=./model_pre_train/VGG_VOC0712_SSD_300x300_ft_iter_120000.ckpt/VGG_VOC0712_SSD_300x300_ft_iter_120000.ckpt
应为此种形式
2.检查程序是cpu版还是gpu版
默认为gpu版,若需要更改为CPU版即可
若检查都为正常,却还是报错
实在无法解决的路径问题 直接在代码中固定
终端运行代码,去掉啦checkpoint_path
python train_ssd_network.py \
--train_dir=./text_model \
--dataset_dir=./text_tfrecord \
--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.01 \
--batch_size=8
此时mac上的代码一般运行应该无错,出现queue 和 step基本就是正确的啦
》〉》〉》〉》〉》〉》〉》〉》〉》〉》〉》〉》〉》〉
正片开始
你的mac去训练一定非常慢,那么在没有服务器的情况下怎么办呢,使用智商上网模式,打开google,右上角九宫格
打开云端硬盘,新建文件夹,导入你刚刚测试成功的SSD文件,如下
再新建 colabortory ## (注意:要先关联更多应用,但我第一次关联之后新建没有colabortory,可直接google “colabortory” 进入官方网站,在那里新建,再回到云端硬盘,就有啦)
应该是此种模式,这里面和jupyter差不多
首先,修改,重要重要重要
然后装载云端硬盘
from google.colab import drive
drive.mount('/content/drive')
运行这段代码,刷新左侧,看见我们的云端文件加载进来啦,hhhh
同样,首先应该cd至相关文件下,自己的文件名自己cd,不要说cd都不会^_^
cd drive/My\ Drive/line/SSD-Tensorflow-master gpu
这个时候操作就和终端里差不多啦(注意:终端命令前面要加“!”)
!python train_ssd_network.py \
--train_dir=./line_model \
--dataset_dir=./line_tfrecord \
--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.01 \
--batch_size=8
输入代码直接训练,成功
训练了2万多步control+c终止就可,会自动保存,然后到云端硬盘把最后一步的文件下载下来就可以啦。hhh
OK,到此基本结束,有啥问题欢迎联系704020674@qq.com