yolov2模型导入keras方法及问题

yolov2模型导入keras方法及问题

yolo是基于darknet框架开发、训练的模型,如果想通过keras进行使用,
需要进行模型数据的转换

===============part 1======================
参考:
在Python 3中使用YOLOv2
https://www.jianshu.com/p/3e77cefeb49b
https://www.jianshu.com/p/86be0b809951
https://blog.csdn.net/sinat_21591675/article/details/82596640

我们目前主要是使用yad2k这个开源的实现来进行转换
他有一些限制,该项目使用了keras,tensorflow作为后端,以及其它一些库(常规安装即可)
而且只能转换yolov2(也叫YOLO9000)
必须注意的地方:
1. tensorflow可以是gpu版本,也可以是cpu版本,具体查看方法:pip list

2. keras必须和tf版本一致,版本对应参考:https://docs.floydhub.com/guides/environments/
   我们带gpu的PC使用的是tf 1.9,所以keras需要下载2.2.0,即pip install keras==2.2.0
   TensorFlow 1.9   tensorflow-1.9  TensorFlow 1.9.0 + Keras 2.2.0 on Python 3.6.   floydhub/tensorflow TensorFlow-1.9

   不带GPU的PC使用tf 1.13版本,keras使用2.2.4
   TensorFlow 1.13  tensorflow-1.13 TensorFlow 1.13.0 + Keras 2.2.4 on Python 3.6.  floydhub/tensorflow TensorFlow-1.13
   python解释器版本不用完全一致,差别不大即可
   安装好keras后,在python中导入测试一下,如果没有问题,说明keras和当前版本的tf可以正常工作

以下是常见的一个keras和tf不匹配的报错
module 'tensorflow.python.keras.backend' has no attribute 'get_graph'

另外,由于tensorflow版本(gpu、cpu)、keras版本等差异,因此网上下载的别人生成的yolo.h5文件自己未必能正常使用,
典型的现象就是使用keras导入模型时,会导致python崩溃
例如,我们用tf-gpu-1.9 + keras-2.2.0产生的模型,在tf-cpu-1.13.1 + keras-2.2.4下,就无法正常使用,导入崩溃
这时就需要自己手动从yolo原始的weights和cfg文件转成keras模型

===============part 2======================
基本工作做好以后,就可以下载yad2k了
Github:https://github.com/allanzelener/YAD2K
下载好解压,然后需要手动修改源程序中的一次代码错误(该项目已经多年没有更新了,存在一些问题)
test_yolo.py的第117行处,添加部分代码:
    for image_file in os.listdir(test_path):
        try:
            #----add code----
            print('>>>>', image_file, test_path)
            # 过滤'.\', '..\\'这种文件
            if not os.path.isfile(os.path.join(test_path, image_file)):
                continue
            #----------------

            image_type = imghdr.what(os.path.join(test_path, image_file))
            if not image_type:
                continue
        except IsADirectoryError:
            continue
不修改这个bug,处理demo图片会异常终止,报错,因为处理了目录文件
    Traceback (most recent call last):
      File ".\test_yolo.py", line 194, in 
        _main(parser.parse_args())
      File ".\test_yolo.py", line 119, in _main
        image_type = imghdr.what(os.path.join(test_path, image_file))
      File "D:\Program Files\Python\lib\imghdr.py", line 16, in what
        f = open(file, 'rb')
    PermissionError: [Errno 13] Permission denied: 'images\\out'

然后下载yolo的weights, cfg,放到yad2k-master目录下

===============part 3======================
yad2k-master目录下执行脚本执行转换:
python yad2k.py yolov2.cfg yolov2.weights yolov2.h5

如果不在master下执行,会报错:No module named 'yad2k.models'; 'yad2k' is not a package
https://www.cnblogs.com/pengzhi12345/p/11900994.html
yad2k.models这个到底是哪里来的尚不清楚


CPU版本tensorflow构建模型时,一切顺利,GPU版本则遇到些问题,如下:
以下情况也许会因PC差异有些不同
笔者使用的是GTX-1060的显卡,tf-gpu-1.9.0, python3.6(IDLE),win10

一开始遇到一个CUDA_ERROR_OUT_OF_MEMORY显存不足的问题
但是从打印看,GPU显存是够的。
totalMemory: 6.00GiB freeMemory: 4.97GiB
查看win10任务管理器,确实占用了3.2G的独立显存
(剩下2.8G < 4.2G需要分配的大小)

参考https://blog.csdn.net/pts_mjt/article/details/84557681
但是并未解决,
尝试重启电脑,重启后查看任务管理器,GPU显存清空了,剩余6G
这个时候,再去执行转换指令,成功了,打印
totalMemory: 6.00GiB freeMemory: 4.97GiB(说明这个剩余显存打印并不准确)

至此,yolo模型转keras模型h5文件成功了,进行测试

===============part 4======================
1. 确保test_yolo.py执行需要的默认文件都存在(根据脚本代码):
原工程默认缺乏anchors文件,需要将与转换h5文件一起生产的yolov2_anchors.txt放入model_data目录,
并改名替换原来的yolo_anchors.txt

2. 如果GPU版本:确保GPU显存没有泄露(上面h5生成后,默认是会释放显存的)

yad2k-master目录下执行脚本执行测试指令:
python test_yolo.py yolov2.h5

因为脚本的代码bug上面已经修改了,所以理论上执行是没有问题的,打印如下
>>>> dog.jpg images
Found 4 boxes for dog.jpg
motorbike 0.31 (60, 78) (113, 125)
dog 0.78 (137, 214) (322, 540)
truck 0.80 (462, 82) (694, 168)
bicycle 0.84 (80, 113) (555, 468)
>>>> eagle.jpg images
Found 1 boxes for eagle.jpg
bird 0.95 (128, 47) (643, 468)
>>>> giraffe.jpg images
Found 2 boxes for giraffe.jpg
zebra 0.83 (241, 208) (422, 442)
giraffe 0.89 (166, 0) (439, 448)
>>>> horses.jpg images
Found 4 boxes for horses.jpg
horse 0.65 (0, 188) (169, 378)
horse 0.75 (253, 196) (435, 371)
horse 0.89 (435, 210) (603, 350)
horse 0.89 (6, 193) (305, 411)
>>>> out images(这就算修改代码的原因,其将.\\当成一个图片文件进行处理)
>>>> person.jpg images
Found 3 boxes for person.jpg
dog 0.80 (70, 258) (209, 356)
person 0.81 (190, 97) (271, 379)
horse 0.89 (398, 129) (605, 352)
>>>> scream.jpg images
Found 0 boxes for scream.jpg

然后,查看images\out下,会产生对应的图像,上面有绘制对应的目标框
至此,模型转换测试完成

===============part 5======================
导入测试一下
>>> import keras
Using TensorFlow backend.
>>> y2 = keras.models.load_model(r'E:\projects\python\DL\CNN\YAD2K-master\YAD2K-master\yolov2_right.h5')

Warning (from warnings module):
  File "D:\Program Files\Python\lib\site-packages\keras\engine\saving.py", line 270
    warnings.warn('No training configuration found in save file: '
UserWarning: No training configuration found in save file: the model was *not* compiled. Compile it manually.
>>> y2.summary()
.........................

或者

>>> import tensorflow as tf

>>> y22 = tf.keras.models.load_model(r'E:\projects\python\DL\CNN\YAD2K-master\YAD2K-master\yolov2_right.h5')

WARNING:tensorflow:No training configuration found in save file: the model was *not* compiled. Compile it manually.
>>>

>>> y22.summary()
.........................

the model was *not* compiled
模型未编译的警告原因
参考:https://stackoverflow.com/questions/53295570/userwarning-no-training-configuration-found-in-save-file-the-model-was-not-c

我想补充一下olejorgenb的答案-对于特定的情况,您不想训练模型,只需使用它即可(例如在生产中)。
“编译”是指“准备培训”,主要包括设置优化程序。它也可能之前已经保存过,然后在加载保存的模型后可以继续进行“相同”训练。
解决方法
但是,情况如何-我只想运行模型?好吧,使用compile=False参数来load_model表示这样:
trained_model = load_model('model.h5', compile=False)
如果不先.fit()使用trained_model.compile(...),就无法使用该模型,但最重要的是-警告将消失。
杂项说明
顺便说一句,在我的Keras版本中,该参数include_optimizer的默认值为True。这也适用于trainig回调,例如Checkpoint。这意味着,在加载Keras保存的模型时,通常可以指望所包含的优化器(情况除外:请参见Hull Gasper的回答)。
但是,当您有一个未经Keras训练的模型时(例如,转换由Darknet训练的模型时),该模型将被保存为未编译状态。这会产生警告,您可以按照上述方法消除警告。

 

你可能感兴趣的:(tensorflow,深度学习,神经网络)