YOLOv4+tensorflow2.0训练⾃⼰的数据
YOLOv4+tensorflow2.0训练⾃⼰的数据
⼀、环境配置
1.1 实验源码
1.2 环境要求
在本⽂使⽤的源码中,作者明确指出了,改源码使⽤的是tensorflow2.0版本,所以在实验之前,需要保证⾃⼰电脑上装的是2.0版本的tensorflow,如果你的电脑上装的是1.0版本的,则需要提升tensorflow的版本,因为2.0版本和1.0版本在⼀些函数的调⽤上会有所不同,如果使⽤1.0版本的tensorflow来运⾏该代码,改错会改到让你怀疑⼈⽣。所以,还是乖乖的换2.0版本吧
这⾥我使⽤的tensorflow版本是2.3.0,搭配的Keras版本是2.3.1
我使⽤的是anaconda来搭建环境,主要步骤如下:
1.2.1 安装anaconda
anaconda的安装步骤见另⼀篇⽂章:
1.2.2 在anaconda中创建tensorflow2.0-gpu虚拟环境
为了不影响其他搭建好的编译环境,这⾥选择重新创建⼀个虚拟环境,在anaconda中创建虚拟环境的⽅法见另⼀篇⽂章:
1.2.3 安装CUDA和cudnn
由于模型⽐较⼤,需要使⽤GPU进⾏训练,使⽤GPU训练就需要安装CUDA和cudnn,具体的安装⽅法可以参考我的另⼀篇⽂章:
1.2.4 1.4 安装tensorflow GPU版
由于模型⽐较⼤,需要在gpu下运⾏,所以在装tensorflow的时候需要装gpu版本的,由于该源码要求使⽤tensorflow2.0版本,所以这⾥我装的是tensorflow-gpu2.3.0
第⼀步:打开命令提⽰符
第⼆步:激活tensorflow2.0-gpu环境(我装的虚拟环境取名为tensorflow2.0-gpu),输⼊命令:
activate tensorflow2.0-gpu
第三步:安装tensorflow-gpu,输⼊命令:
pip install tensorflow-gpu==2.3.0
然后就是等待安装完成,可能需要⼀定的时间。
第四步:测试tensorflow-gpu是否安装成功,接着上⼀步,先输⼊命令打开python编译环境:
python
再输⼊命令导⼊tensorflow模块,需要注意的是,虽然装的是tensorflow-gpu,但是我们在导⼊模块的时候仍然使⽤的是tensorflow:import tensorflow as tf
若能成功导⼊模块,则说明安装成功,否则就需要查看在哪⾥出了错,重新安装了。
另外还可以输⼊以下命令来查看tensorflow的版本:
tf.__version__
⼆、环境测试
在训练⾃⼰的数据集之前,先测试⼀下能不能利⽤作者训练的好的权重进⾏⽽检测。
2.1 下载权重⽂件
测试之前需要准备YOLOv4权重⽂件,可以去⾃⾏提取,提取密码:o6hd
将下载的权重⽂件yolov4.weights放到tensorflow-yolov4-tflite-master\data⽂件夹下
2.2 权重⽂件转换
在这⼀步需要将前⾯下载的权重⽂件yolov4.weights转换成在tensorflow环境下使⽤的⽂件类型,打开命令提⽰符,进⼊主⽬录(tensorflow-yolov4-tflite-master\):
输⼊下⾯的命令:
python save_model.py --weights ./data/yolov4.weights --output ./checkpoints/yolov4-416 --input_size 416 --model yolov4
运⾏结束后,将会在tensorflow-yolov4-tflite-master\checkpoints⽂件夹下产⽣⼀个yolov4-416⽂件夹
打开yolov4-416⽂件夹,⾥⾯会有⼀个saved_model.pb⽂件,这个就是我们进⾏测试需要使⽤的权重⽂件了。
2.3 测试
(1)图⽚测试。打开命令提⽰符,进⼊主⽬录(tensorflow-yolov4-tflite-master\),输⼊以下命令:
python detect.py --weights ./checkpoints/yolov4-416 --size 416 --model yolov4 --image ./data/kite.jpg --output ./data/kite_d.jpg
就能得到如下测试结果
并且在tensorflow-yolov4-tflite-master\data⽂件夹下将产⽣⼀个kite_d.jpg⽂件,也就是我们保存的带有检测结果的图⽚。
(2)视频测试。打开命令提⽰符,进⼊主⽬录(tensorflow-yolov4-tflite-master\),输⼊以下命令:
python detectvideo.py --weights ./checkpoints/yolov4-416 --size 416 --model yolov4 --video ./data/road.mp4 --output ./data/road_d.mp4
测试结果如下:
并且在tensorflow-yolov4-tflite-master\data⽂件夹下将产⽣⼀个road_d.mp4⽂件,也就是我们保存的带有检测结果的视频。
三、使⽤⾃⼰的数据训练
改源码的作者在代码下⽅说了,该代码的“训练性能还没有完全复制出来,所以我建议使⽤Alex的Darknet来训练你⾃⼰的数据,然后把.weights转换成tensorflow或tflite。”
不知道现在这版代码是否已经将训练性能完全复制出来了,所以保险起见,还是建议使⽤YOLOv4原⽂作者Alex给出的进⾏训练。
使⽤Darknet源码进⾏训练的操作步骤可以参考我上⼀篇⽂章:
这⾥就不再复述使⽤Darknet进⾏训练的过程了。
下⾯还是讲述⼀下使⽤本⽂这个tensorflow版本的代码进⾏训练的步骤。
3.1 数据集制作
关于数据集的制作,⼤家可以参考我的另⼀篇⽂章:
这⾥就不再特别讲述了。
3.2 在data/dataset⽂件夹下⽣成数据的描述⽂件
根据作者在github上的声明,该程序在训练时还需要两个对图⽚信息的描述⽂件和,格式如下
作者给出了⽣成这两个⽂件的代码scripts\voc_annotation.py。需要做部分的修改:
(1)将第7⾏的classes修改为⾃⼰的类别名称:
classes =['类别1','类别2','类别3','类别4']
(2)将相关路径修改为⾃⼰的路径
我的数据集完整路径如下,⼤家可以参考,然后根据⾃⼰的数据集修改下⾯的路径
if __name__ =='__main__':
parser = argparse.ArgumentParser()
# 将相关路径中default的路径修改为⾃⼰的路径,最好是写绝对路径,不然后⾯容易出错
tensorflow版本选择parser.add_argument("--data_path", default="E:/tensorflow-yolov4-tflite-master/VOCdevkit/")
# 将default的路径更改为⾃⼰的存放的位置
parser.add_argument("--train_annotation", default="../data/dataset/")
# 将default的路径更改为⾃⼰的存放的位置
parser.add_argument("--test_annotation", default="../data/dataset/")
flags = parser.parse_args()
if ain_annotation):os.ain_annotation)
if st_annotation):os.st_annotation)
# 更改训练集和测试集的相对路径,由于本实验的训练数据只有⼀个路径,所以注释掉了num2
num1 = convert_voc_annotation(os.path.join(flags.data_path,'VOCTrainVal'),'trainval', ain_annotation,False)
#num2 = convert_voc_annotation(os.path.join(flags.data_path, 'VOCTrainVal'), 'trainval', ain_annotation, False)
num3 = convert_voc_annotation(os.path.join(flags.data_path,'VOCTest'),'test', st_annotation,False)
print('=> The number of image for train is: %d\tThe number of image for test is:%d'%(num1, num3))
做了以上更改后直接运⾏该⽂件即可。这时候data\dataset⽂件加下将多出两个⽂件:
3.3 修改其他⽂件
3.3.1 修改voc_names
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论