在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 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.weightsyolov2.cfg文件放入yad2k文件夹中, 然后cd yad2k进入yad2k文件夹, 终端输入

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

    这时我本来以为终于要好了, 结果告诉我显存不足…
    卧槽! 我刚装的一台带k80gpu的服务器啊, 跑个yolo.h5文件就显存不足?? 于是输入nvidia-smi查看gpu状态:
    nvidia-smi的输出结果
    这是我解决问题之后的情况, 可以看到显存一共有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")

输出结果如图所示:
输出结果

Jupyter Notebook是一个交互式的计算环境,用户可以在其中编写、运行并共享包含文本、代码和可视化结果等内容的文档。它提供了一个动态的环境,适合于数据清洗、数据分析、实验设计、科学计算以及教学目的。 要使用 Jupyter Notebook 运行 YOLO (You Only Look Once) 模型,你需要首先安装必要的 Python 库,并准备好训练好的 YOLO 模型。YOLO 是一种用于目标检测的人工智能算法,在实时图像识别任务中效果显著。以下是基本步骤: ### 步骤 1: 安装必要的库 你需要安装一些关键的 Python 包,如 `tensorflow` 和 `keras`,因为它们提供了对预训练YOLO 模型的支持: ```bash pip install tensorflow keras ``` ### 步骤 2: 导入所需的模块 在 Jupyter Notebook 中导入需要使用的库: ```python import numpy as np from keras.models import load_model from PIL import Image, ImageDraw, ImageFont import os ``` ### 步骤 3: 加载预训练YOLO 模型 YOLO 模型通常是由特定的数据集训练得到的。你可以下载预训练的模型权重文件并在代码中加载它: ```python # 根据实际路径修改 model_path = "path_to_your_pretrained_model.h5" model = load_model(model_path) ``` ### 步骤 4: 准备测试图片 将图片读取为 numpy 数组,并适当调整其大小和格式,以便通过模型进行预测: ```python image_path = 'path_to_your_image.jpg' img = Image.open(image_path).convert('RGB') width, height = img.size img = img.resize((416, 416)) # YOLO 输入尺寸可能需要调整 img_array = np.array(img) img_array = img_array / 255. input_img = np.expand_dims(img_array, axis=0) ``` ### 步骤 5: 使用模型进行预测 使用加载的模型对图像进行预测: ```python predictions = model.predict(input_img) ``` ### 步骤 6: 解析预测结果 解析模型的输出以获取边界框、类别标签及其置信度: ```python boxes, scores, classes = parse_predictions(predictions, confidence_threshold=0.5) ``` ### 步骤 7: 绘制预测结果到原图 在这个部分,你可能需要一个更复杂的函数来绘制边界框、标签和置信度得分到原始图像上。 ### 结束 以上就是在 Jupyter Notebook 上加载 YOLO 模型并对图像进行目标检测的基本过程。注意,实际操作时可能还需要根据具体的模型配置和输入需求做出相应的调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值