您的位置:首页 > Web前端 > HTML5

在google cloud上部署的jupyter notebook用gpu跑一遍yolov2算法进行物体检测及yolo.h5文件的生成(三)

2019-01-03 13:33 537 查看

上一篇中讲了如何在google cloud 中部署jupyter notebook, 这一篇就用它来测试一下tensorflow-gpu的实际运行效果怎么样.
本文数据来源和内容均来自吴恩达博士的

cousera深度学习课程 - 卷积神经网络 - 第四周 - 第三课
的课程作业.

  1. 首先需要下载数据集, 我是把整个作业的内容搬过来了, 可以在

    https://github.com/marsggbo/deeplearning.ai_JupyterNotebooks/tree/master/4_Convolutional%20Neural%20Networks/week3
    找到.

    git clone
    命令只支持克隆整个项目, 不能clone单个文件夹, 推荐一个神器DownGit, 直接把文件夹的链接copy过去就可以下载到本地. 暂时不知道怎么clone一个git文件夹到云端, 所以我的操作是先下载到本地, 然后再上传到云端:
    1.1
    mkdir JupyterProjects
    然后
    cd JupyterProjects
    然后操作本地浏览器端的jupyter notebook上传即可.
    1.2 或者用scp命令, 支持任意方向的copy, 参考:

    scp /home/work/source.txt work@192.168.0.10:/home/work/   #把本地的source.txt文件拷贝到192.168.0.10机器上的/home/work目录下
    scp work@192.168.0.10:/home/work/source.txt work@192.168.0.11:/home/work/   #把192.168.0.10机器上的source.txt文件拷贝到192.168.0.11机器的/home/work目录下
    scp -r /home/work/sourcedir work@192.168.0.10:/home/work/   #拷贝文件夹,加-r参数
  2. 有了数据集和支持文件, 会发现在

    model_data
    文件夹下少了一个关键文件, 那就是
    yolo.h5
    ——已经训练好的yolo模型. 这个文件一般都是需要自己生成的, 网上直接下的yolo.h5文件有可能不能用. 为了生成这个文件, 我掉了不少坑, 好在最后还是解决了. 方法如下:
    2.1 下载yad2k

    git clone https://github.com/allanzelener/yad2k.git

    2.2 下载yolov2.weights

    wget http://pjreddie.com/media/files/yolov2.weights

    2.3 下载yolov2.cfg

    wget https://github.com/pjreddie/darknet/tree/master/cfg/yolov2.cfg

    2.4 将

    yolov2.weights
    yolov2.cfg
    文件放入yad2k文件夹中, 然后
    cd yad2k
    进入yad2k文件夹, 终端输入

    python yad2k.py yolov2.cfg yolov2.weights model_data/yolo.h5

    这时我本来以为终于要好了, 结果告诉我显存不足…
    卧槽! 我刚装的一台带k80gpu的服务器啊, 跑个yolo.h5文件就显存不足?? 于是输入

    nvidia-smi
    查看gpu状态:

    这是我解决问题之后的情况, 可以看到显存一共有11441MB, 差不多11G, 现在只有一个pid为1594的进程用了16MB, 当时还有一个python进程, 用了10多G的显存, 忘截图了, 我也不知道这个进程是哪里来的. 然后我用
    kill -9 pid
    把那个进程关闭了.
    重新输入:

    python yad2k.py yolov2.cfg yolov2.weights model_data/yolo.h5

    然后就在

    yad2k/model_data/
    下看到了yolo.h5文件.

  3. 把yolo.h5移动到

    week3/model_data/
    文件夹下, 就可以跑了!

import argparse
import os
import matplotlib.pyplot as plt
from matplotlib.pyplot import imshow
import scipy.io
import scipy.misc
import numpy as np
import pandas as pd
import PIL
import tensorflow as tf
from keras import backend as K
from keras.layers import Input, Lambda, Conv2D
from keras.models import load_model, Model
from yolo_utils import read_classes, read_anchors, generate_colors,preprocess_image, draw_boxes, scale_boxes
from yad2k.models.keras_yolo import yolo_head, yolo_boxes_to_corners, preprocess_true_boxes, yolo_loss, yolo_body
def yolo_filter_boxes(box_confidence,boxes,box_class_probs,threshold= .6):
box_scores=box_confidence*box_class_probs
box_classes=K.argmax(box_scores,axis=-1)
box_class_scores=K.max(box_scores,axis=-1)
filtering_mask=box_class_scores>=threshold
scores=tf.boolean_mask(box_class_scores,filtering_mask)
boxes=tf.boolean_mask(boxes,filtering_mask)
classes=tf.boolean_mask(box_classes,filtering_mask)
return scores,boxes,classes
def iou(box1,box2):
xi1=max(box1[0],box2[0])
yi1=max(box1[1],box2[1])
xi2=min(box1[2],box2[2])
yi2=min(box1[3],box2[3])
inter_area=(yi2-yi1)*(xi2-xi1)
box1_area=(box1[3]-box1[1])*(box1[2]-box1[0])
box2_area=(box2[3]-box2[1])*(box2[2]-box2[0])
union_area=box1_area+box2_area-inter_area
iou=inter_area/union_area
return iou
def yolo_non_max_suppression(scores,boxes,classes,max_boxes=10,iou_threshold=0.5):
max_boxes_tensor=K.variable(max_boxes,dtype="int32")
K.get_session().run(tf.variables_initializer([max_boxes_tensor]))
nms_indices=tf.image.non_max_suppression(boxes,scores,max_boxes,iou_threshold)
scores=K.gather(scores,nms_indices)
boxes=K.gather(boxes,nms_indices)
classes=K.gather(classes,nms_indices)
return scores,boxes,classes
def yolo_eval(yolo_outputs,image_shape=(720.,1280.),max_boxes=10,score_threshold=.6,iou_threshold=.5):
box_confidence,box_xy,box_wh,box_class_prob=yolo_outputs[:]
boxes=yolo_boxes_to_corners(box_xy,box_wh)
scores,boxes,classes=yolo_filter_boxes(box_confidence,boxes,box_class_prob,score_threshold)
boxes=scale_boxes(boxes,image_shape)
scores,boxes,classes=yolo_non_max_suppression(scores,boxes,classes,max_boxes,iou_threshold)
return scores,boxes,classes
sess=K.get_session()
class_names = read_classes("model_data/coco_classes.txt")
anchors = read_anchors("model_data/yolo_anchors.txt")
image_shape = (720., 1280.)
yolo_model=load_model("model_data/yolo.h5")
yolo_model.summary()
yolo_outputs = yolo_head(yolo_model.output, anchors, len(class_names))
scores, boxes, classes = yolo_eval(yolo_outputs, image_shape)
def predict(sess,image_file):
image,image_data=preprocess_image("images/"+image_file,model_image_size=(608,608))
out_scores,out_boxes,out_classes=sess.run([scores,boxes,classes],feed_dict={yolo_model.input:image_data,K.learning_phase():0})
print('Found {} boxes for {}'.format(len(out_boxes),image_file))
colors=generate_colors(class_names)
draw_boxes(image,out_scores,out_boxes,out_classes,class_names,colors)
image.save(os.path.join("out",image_file),quality=90)
output_image=scipy.misc.imread(os.path.join("out",image_file))
imshow(output_image)
plt.show()
return out_scores,out_boxes,out_classes
out_scores, out_boxes, out_classes = predict(sess, "test.jpg")

输出结果如图所示:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: