在完成吴恩达coursera上面深度学习第四门课卷积神经网络(Convolutional Neural Networks的第三周目标检测(Object detection)的编程作业使用YOLO算法完成车辆检测时,由于TensorFlow版本不兼容的关系,作业上使用的是TensorFlow1.x,而我现在学的是TensorFlow2.x,所以在加载作业中给出的预训练的YOLO模型时会出现如下报错:
# 加载
yolo_model = tf.keras.models.load_model("model_data/yolov2.h5")
# unfortunately,报错了
AttributeError: module 'tensorflow' has no attribute 'space_to_depth'
#(直接原因是tf2中space_to_depth函数的调用路径为tf.nn.space_to_depth,而tf1中直接使用tf.space_to_depth)
但是为了完成这个作业,体会下YOLO算法的美妙,在参考博客1、参考博客2以及TensorFlow2.1官方API的帮助下,我重新生成了一个适用于tf2.0以上的一个yolov2.h5文件,以下是我的经验和步骤,互勉。
另外,这个步骤也是适用于其他开源的训练好的模型的导入,原理是一样的,这样就可以用预训练的模型来微调得到自己的模型或者使用别人的参数进行初始化。
1. 文件准备
-
yad2k文件夹和yad2k.py:
去GitHub上下载YOLOv2的脚本https://github.com/allanzelener/YAD2K
然后你会得到一个YAD2K-master的文件夹,把其中yad2k文件夹和yad2k.py移到一个新的文件夹中先放在桌面,假设把这个新的文件夹命名为YOLO
-
预训练的权重yolov2.weights和配置文件yolov2.cfg:
yolov2.weights:可以直接下载,但很慢http://pjreddie.com/media/files/yolo.weights
yolov2.cfg:在cfg中选择yolov2.cfg下载https://github.com/pjreddie/darknet
上述两个文件也可以直接使用课程的文件夹中的(我是这样做的,因为网速太慢),然后将这类两个文件放入刚刚的yad2k文件夹中。(然后还可以在YOLO文件夹中增加一个新的model_data文件夹来存放等下要生成的yolo.h5,以及数据类别、描框大小等标签,这个不影响生成,只是路径,如果不这样,等下改一下路径就可以)最后得到的文件夹如下:
-
修改接口,将tf1的函数改为tf2的,并且用tf.keras来替代keras
参考API,修改以下几个文件。这一步最为关键,也比较容易出错,不过没事,就算没改完等下终端会报错,再接着改然后重新执行即可。
2. 生成文件
- 打开终端进入TensorFlow2.1环境,并且进入YOLO目录
source activate TF2.1
cd Desktop/YOLO
- 生成文件
python yad2k.py yolov2.cfg yolov2.weights model_data/yolov2.h5
如果上述命令在终端报错那就根据提示继续修改,没问题的话就能得到一个yolov2.h5文件了。