从零开始 yolov3 的 tensorfow-gpu 环境搭建及成功实现迁移学
习全过程
yolov3 所需环境为 tensorflow-gpu 和 keras,keras 很简单,但是搭建
tensorflow-gpu 并且使 yolov3 程序可以跑起来却不是那么容易,在本人第二次
搭建环境的情况下,却也折腾了一个白天,中途出现各种问题,要不就是可以
运行程序,但不是在 GPU 上运行;要不就是直接各种报错,最后还是成功搭建
好,并且能够运行了,下面我将把整个流程(环境安装,成功运行程序)记录
下来。本实验程序为 github 上大神 qqwweee 项目:
https://github.com/qqwweee/keras-yolo3
1、tensorflow-gpu 环境搭建
在这里我还是建议使用 anaconda 进行 tensorflow-gpu 的安装,因为 conda
安装可以省去很多 cuda 和 cudnn 的配置,这这两个的版本配置还跟 tensorflow-
gpu 版本有很大关系,所以自行配很容易出错,这里直接使用 conda 安装,
anaconda 的安装可以直接去 anaconda 官网下载安装(注:安装时候记得勾选自
动设置环境变量,要不然在命令提示符界面 conda 指令就运行不了),如果不
小心没有设置好环境变量,可以自行在设置界面搜索”环境变量“,然后进入
后在系统变量那一栏找到”path“,双击后把下面四行一个一个的添加上去并
保存即可:
'''
C:\ProgramData\Anaconda3
C:\ProgramData\Anaconda3\python
C:\ProgramData\Anaconda3\Scripts
C:\ProgramData\Anaconda3\Library\bin
'''
1.1、给 conda 设置镜像源
因为 conda 自带的安装源速度特别慢,所以如果你不设置镜像源下载几乎
还是安装不了,中途会自动断开,这里我选择清华镜像源,首先打开 anaconda
prompt,依次输入以下四个指令:
添加镜像源:conda config --add channels
https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
添加镜像源:conda config --add channels
https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
设置搜索时显示通道地址:conda config --set show_channel_urls yes
显示镜像源设置情况:conda config --show channels
这里最后一行为显示镜像源设置情况,如果看到结果显示有上述链接表示设置
成功。当然也有删除镜像源的指令如下:
删除镜像源:conda config --remove channels
https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
1.2、conda 安装 tensorflow-gpu
这里我建议使用 conda 创建一个新环境给 tensorflow-gpu,因为这样在这个
环境下任何修改不会影响到其它环境,当然更重要的是,在其他环境下的一些
操作不会影响到这,要不然可能你之后运行其他程序导致 tensorflow 需要的一
些模块改变容易导致 yolo 运行报错。
创建新环境指令为:conda creat -n tensorflow-gpu tensorflow-gpu==1.14.0
创建环境名为 tensorflow-gpu 的新环境,并且在新环境安装 tensorflow-gpu1.14.0
版本,此版本可以运行 yolov3,本人目前也在使用此版本,稍等片刻后会弹出
一个让你选择是否下载的选项,输入 y 就行,这个时候就等安装成功即可。
环境创建好后,就是进入新环境了,因为后续操作都是在新环境下,所以
需要先进入新环境,使用下面一些指令可以激活和退出、删除等对环境的操
作:
1、激活环境:activate tensorflow-gpu
2、退出环境:deactivate
3、删除环境(慎重):conda remove -n tensorflow-gpu
4、列出所有虚拟环境:conda env list
5、列出当前环境所有包:conda list
1.3、其他依赖模块安装
因为 yolov3 还需要安装 keras、pil、matplotlib、cv2,所以直接使用以下指
令在新环境 tensorflow-gpu 内下载安装即可:
pip install keras
pip install pillow
pip install matplotlib
pip install opencv.python
2、yolov3 复现
首先我相信你已经在 github 上下载好了代码,下面将从实现 voc 数据集训
练及预测开始到迁移学习训练自己数据集来讲解 yolov3 的使用:
2.1、voc 数据集的下载及处理
正如你看到的,keras-yolov3-master 文件夹里有一个 voc_annotation.py 文
件,这是用来将 voc 数据集处理成 txt 文件类型以方便模型进行训练,所以我们
首先也是要使用 voc_annotation.py 程序来获取我们需要的 train.txt 文件,当然在
这之前你肯定需要将 pascal_voc 数据集下载好,这里我给出下载地址,官网有
时候打不开,推荐使用镜像链接:
镜像下载地址: https://pjreddie.com/projects/pascal-voc-dataset-mirror/
官网下载地址: http://host.robots.ox.ac.uk/pascal/VOC/
在运行 voc_annotation.py 程序之前,还是有几点需要注意,首先是 voc 数
据集下载后你解压的位置,如果你不想后续麻烦我建议直接解压到 keras-yolo3-
master 的目录下,这样可以直接在这个路径上运行程序,如果你解压到其他路
径上就需要在 voc 数据集的 vocdevkit 目录地址上运行程序,并且解压是直接将
三个压缩包一起解压就行;同时作者程序是默认只生成 voc_2007 的数据集,如
果你想用 2012 的数据集,需要在程序中修改一下 sets 里面数字。
运行好 voc_annotation.py 后,你就会在当前目录下看到生成的 train.txt 和
val.txt 以及 test.txt 文件,当然 yolov3 训练程序还是只会用到 train.txt,验证集
是从 train_data 里面划分出来的。然后你只需要把这些 txt 文件放在 keras-yolo3-
master 的目录下即玩成了这一步。
2.2、使用聚类计算 anchors
在文件中,有一个 model_data 文件夹,里面已经存放了作者默认的
yolo_anchors 和 tiny_yolo_anchors 两个文件,但是如果你想要使用更适合你自己
数据集的 anchors,那么你就需要使用 kmeans.py 程序了,首先,你还是要打开
kmeans.py,滑到最下面几行代码:
'''
if __name__ == "__main__":
cluster_number = 9
filename = "2012_train.txt"
kmeans = YOLO_Kmeans(cluster_number, filename)
kmeans.txt2clusters()
'''
将 cluster_number 设置为你的个数,如果你想用完整版 yolov3,那就填 9,如果
你想用 tiny-yolov3 那就填 6;filename 就填你之前产生的训练集的 txt 文件名。
运行后会产生一个名为 yolo_anchors.txt 文件,当然这个文件名你也可以在程序
的第 61 行处修改。产生的该文件就可以复制到 model_data 文件夹里面去。
2.3、convert.py 生成 h5 模型文件
这一步其实不是必须的,但是可以通过这一步直接获取已经训练好的模型
权重,方便快速实现模型预测,想跳过这一步的直接可以看下一节使用 train.py
模型训练。当然一些必要的准备工作还是必须的,逆你需要提前下载好权
重.weight 文件,这些文件可以通过下面链接下载,对应于不同类型模型的权
重:
yolov3.weights: https://pjreddie.com/media/files/yolov3.weights
yolov3-tiny.weights: https://pjreddie.com/media/files/yolov3-tiny.weights
darknet53.weights: https://pjreddie.com/media/files/darknet53.conv.74
上述链接都可以在 yolo 官网找到: https://pjreddie.com/darknet/yolo/
下载好后可以直接就放在 master 文件内的目录下,然后在终端上直接输入
下面指令,当然,不同模型权重你需要更改.cfg 的文件名和保持的 h5 文件名,过
完这一步其实已经可以做预测了,可以直接跳转到 2.6 节。
'''
python convert.py yolov3.cfg yolov3.weights model_data/yolo.h5
'''
2.4、使用 train.py 模型训练
到这里必要的准备工作差不多已经做完,差不多可以开始训练了,训练呢
肯定就是使用 train.py 文件,需要明白的是,训练这里其实分为两种,一种是不
含初始权重的训练,另一种是使用上一节生成的 h5 模型文件继续训练,如果你
是做跟 voc 或者 coco 数据集类似的数据集训练,第二种方法可以更快让你模型
收敛,但是如果你训练集跟它们完全不一样,比如细胞的检测,那么我还是建
议直接从 0 开始训练,也就不需要之前的 h5 模型文件。
下面我们具体来讲讲怎样修改 train.py 文件实现模型训练,首先打开
train.py 代码,可以看到前面可修改参数:
'''
def _main():
annotation_path = 'train.txt' #训练集的 txt 文件名
log_dir = 'logs/000/' #模型保存的文件夹,这个需要自己提
前创建好
classes_path = 'model_data/voc_classes.txt' #数据集的 class.txt 文件
anchors_path = 'model_data/yolo_anchors.txt' #anchors 文件
'''
根据具体情况可以对上述变量赋值,接下来是跳转到 train.py 程序第 30 行和第
33 行
'''
if is_tiny_version:
model = create_tiny_model(input_shape, anchors, num_classes,
freeze_body=2, weights_path='model_data/tiny_yolo_weights.h5')
else:
model = create_model(input_shape, anchors, num_classes,
freeze_body=2, weights_path='model_data/yolo_weights.h5')
'''
这里是当你准备选用第二种方式训练模型(即使用已有模型 h5 文件继续
训练),需要将准备继续训练的 h5 文件路径写入 weight_path 中。但是如果你
准备使用第一种训练方法,那你就需要跳转到代码第 105 和 135 行(分别对应
yolo 和 tiny_yolo)的模型生成函数处,将 load_pretrained 参数设置为 False,如下
所示:
'''
def create_model(input_shape, anchors, num_classes, load_pretrained=False, freeze_
body=2,
weights_path='model_data/yolo_weights.h5'):
'''
当然,你可以在代码的第 57 行和 76 行设置你的 batch_size 的大小,在 63
和 82 行设置你的训练轮数等,你可能会问这里怎么有两次模型训练代码,因为
这里作者是这样设计的:第一次模型训练是一直训练完毕设置的 epochs,而第
二次训练其 learn_rate 会自行调节,并且有早停功能,即发现 loss 一直不降会直
接停止训练并且保存最优模型,所以其实这一部分训练所需内存很大,因为要
保存很多次模型结果,如果你发现到这一步会保错,可以试着降低 batch_size。
需要设置的部分差不多就这些了,然后你就可以开始训练了,直接控制台
运行 python train.py 即可。
2.5、运行 train.py 报错解决办法
当然本人还是遇到一些问题,如果你跟我一样遇到下面报错,那就使用下
面方法解决,下面是报错图
片:
具体来说就是下面这个错误:
'''
IternalError:Blas SGEMM launch failed : m=43264, n=32, k=64
'''
我的解决办法是在 train.py 代码的前面加上这几行代码:
'''
import tensorflow as tf
import keras
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
keras.backend.tensorflow_backend.set_session(tf.Session(config=config))
'''
接着运行一下发现可以运行了。nice!!!!(这里再插播一条,如果你做
预测时也遇到同样问题,也还是同样解决办法,再 yolo_video.py 代码前加上述
代码)
2.6、yolo_video.py 预测
模型训练完后,或者之前 convert 产生的 h5 文件,就可以拿来做预测了,
yolo_video.py 其实更像是一个脚本文件,真正我们很多需要更改的参数其实是
在 yolo.py 程序里,所以,我们打开 yolo.py 代码,可以看到前面参数设置:
'''
class YOLO(object):
_defaults = {
"model_path": 'model_data/yolo.h5', #模型文件地址
"anchors_path": 'model_data/yolo_anchors.txt', #anchors 地址
"classes_path": 'model_data/coco_classes.txt', #数据集的 class 地址
"score" : 0.3,
#预测框分数阈值,如果预测框少可以试着调小
"iou" : 0.45,
#iou 阈值,如果预测框少可以试着调小
"model_image_size" : (416, 416), #不用更改
"gpu_num" : 1,
#gpu 使用数
}
'''
更改完上述参数,保存好,你就可以直接使用指令:
'''