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

上一篇中讲了如何在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 [email protected]:/home/work/   #把本地的source.txt文件拷贝到192.168.0.10机器上的/home/work目录下 
    scp [email protected]:/home/work/source.txt [email protected]:/home/work/   #把192.168.0.10机器上的source.txt文件拷贝到192.168.0.11机器的/home/work目录下
    scp -r /home/work/sourcedir [email protected]:/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.weightsyolov2.cfg文件放入yad2k文件夹中, 然后cd yad2k进入yad2k文件夹, 终端输入

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

    这时我本来以为终于要好了, 结果告诉我显存不足…
    卧槽! 我刚装的一台带k80gpu的服务器啊, 跑个yolo.h5文件就显存不足?? 于是输入nvidia-smi查看gpu状态:
    在google cloud上部署的jupyter notebook用gpu跑一遍yolov2算法进行物体检测及yolo.h5文件的生成(三)_第1张图片
    这是我解决问题之后的情况, 可以看到显存一共有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")

输出结果如图所示:

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