上一篇中讲了如何在google cloud 中部署jupyter notebook, 这一篇就用它来测试一下tensorflow-gpu的实际运行效果怎么样.
本文数据来源和内容均来自吴恩达博士的cousera深度学习课程 - 卷积神经网络 - 第四周 - 第三课
的课程作业.
首先需要下载数据集, 我是把整个作业的内容搬过来了, 可以在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参数
有了数据集和支持文件, 会发现在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文件.
把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")
输出结果如图所示: