tensorflow实现yolo
运行yolo的demo
1 github下载YOLOv3的tensorflow实现代码
git clone https://github.com/YunYang1994/tensorflow-yolov3.git
2 安装一些依赖
cd tensorflow-yolov3-master
pip install -r ./docs/requirements.txt
3 下载YOLOv3的初始权值放到checkpoint文件夹中
4 将./checkpoint目录下的.ckpt转化成.pb文件
python convert_weight.py
在./checkpoint目录下的生成 XXX_demo.ckpt文件
python freeze_graph.py
在tensorflow-yolov3-master文件夹下生成.pb文件
5 运行测试代码
测试一张图片
python image_demo.py
测试一个视频
python video_demo.py
如果想要用本地摄像头视频,则更改video_demo.py代码,令video_path = 0
使用voc2007数据集训练模型
1 下载数据集,存放在 data/dataset/VOC2007/文件夹下面
格式为:
其中:
Annotations文件夹中存放的是.xml文件,每个xml文件都对应于JPEGImages文件夹的一张图片
ImageSets中有三个文件:
Layout存放的四个文件test.txt , train.txt, val.txt ,trainval.txt(这个稍后要用于第二步生成.txt,所以要注意一下路径,看有的博主说这四个文件是在Main下面,可以找一下自己文件夹具体存放地址)
其中内容格式为:
Main存放的是图像物体识别的数据,分为20类。
Segmentation存放的是可用于分割的数据,做检测识别也是用不到的.
JPEGImages文件夹里包含了训练图片和测试图片,混放在一起
2 生成索引.txt文件
修改tensorflow-yolov3-master/data/dataset/中voc_annotation.py文件
(1)修改类别
(2)注意路径
这个为.xml的路径
这个为.txt路径(注意四个文件test.txt , train.txt, val.txt ,trainval.txt存放位置,因为博主是在Layout下面,有的是在Main下,注意修改)
这个为图片路径
最终生成文件路径在与voc_annotation.py相同的文件夹下面,即tensorflow-yolov3-master/data/dataset/文件夹下面,生成的文件格式为:
格式:图片路径(空格)矩形框左上和右下角坐标(空格)标签(空格)下一个矩形框位置+标签
3 修改配置文件
修改./core/config.py里的配置路径
__C.YOLO.CLASSES = "./data/classes/voc.names"
__C.TRAIN.ANNOT_PATH = "./data/dataset/2007_train.txt"
__C.TEST.ANNOT_PATH = "./data/dataset/2007_test.txt"
4 训练
从coco数据集预训练结果进行迁移学习:
python convert_weight.py --train_from_coco
python train.py
如果数据量够,可以头训练,直接
python train.py
训练的结果为:
在/checkpoint/文件下生成.ckpt文件
5 .ckpt转化成.pb文件
修改freeze_graph.py代码
pb_file = "./XXX.pb" #.pb文件的路径
ckpt_file = "./checkpoint/yolov3_test_loss=3.2343.ckpt-37" #上一步生成的.ckpt文件的路径(生成很多,选择一个最合适的)
6 测试
修改image_demo.py或者video_demo.py代码
将其中.pb文件换成自己生成的
同时将类别数目换成自己的数目
可以看到运行结果。
训练自己的数据集
1 制作自己的数据集
参考链接
在data/dataset/文件夹下面新建VOC2007文件夹,该文件夹下面有以下三个文件夹
- 处理JPEGSImages文件夹,重命名图片
把你的图片放到JPEGSImages里面,在VOC2007里面,人家的图片文件名都是000001.jpg类似这样的,我们也统一格式,把我们的图片名字重命名成这样的,代码如下:
代码
- 处理Annatations文件夹,生成xml文件
1)下载链接,博主有介绍如何使用
2)注意修改保存的路径为Annatations文件夹, - 生成ImageSets文件夹中的Main文件夹中的四个文件.
test.txt是测试集,train.txt是训练集,val.txt是验证集,trainval.txt是训练和验证集.VOC2007中,trainval大概是整个数据集的50%,test也大概是整个数据集的50%;train大概是trainval的50%,val大概是trainval的50%,下面的代码生成这四个文件,百分比可以自己调整.
import os
import random
trainval_percent = 0.7
train_percent = 0.5
xmlfilepath = 'Annotations'
txtsavepath = 'ImageSets\Main'
total_xml = os.listdir(xmlfilepath)
num=len(total_xml)
list=range(num)
tv=int(num*trainval_percent)
tr=int(tv*train_percent)
trainval= random.sample(list,tv)
train=random.sample(trainval,tr)
ftrainval = open('ImageSets/Main/trainval.txt', 'w')
ftest = open('ImageSets/Main/test.txt', 'w')
ftrain = open('ImageSets/Main/train.txt', 'w')
fval = open('ImageSets/Main/val.txt', 'w')
for i in list:
name=total_xml[i][:-4]+'\n'
if i in trainval:
ftrainval.write(name)
if i in train:
ftrain.write(name)
else:
fval.write(name)
else:
ftest.write(name)
ftrainval.close()
ftrain.close()
fval.close()
ftest .close()
到此数据集制作完成
2 生成索引.txt文件
参考上面使用voc2007数据集训练模型的步骤2,注意修改路径,因为上面博主四个test.txt , train.txt, val.txt ,trainval.txt是在Layout下,现在制作放在了Main下面,所以要修改路径。
3 步骤
之后步骤同上面使用voc2007数据集训练模型的步骤一样,不再重述。