对于计算机视觉爱好者来说,YOLO (You Only Look Once)是一个非常流行的实时目标检测算法,因为它非常快,同时性能非常好。

在本文中,我将共享一个视频处理的代码,以获取视频中每个对象目标的边框。我们将不讨论YOLO的概念或架构,因为很多好的文章已经在媒体中详细阐述了这些知识点。这里我们只讨论函数代码。

开始

谷歌Colab地址:https://colab.research.google.com/github/vindruid/yolov3-in-colab/blob/master/yolov3_video.ipynb。

yolo的git仓库:https://github.com/ultralytics/yolov3。尽管仓库已经包含如何使用YOLOv3的教程,教程只需要运行python detect.py --source file.mp4,但是我简化了代码,具体在谷歌Colab / Jupyter笔记本中。

准备YoloV3和LoadModel

首先克隆YoloV3仓库,然后导入通用包和repo函数

!git clone https://github.com/ultralytics/yolov3import timeimport globimport torchimport os
import argparsefrom sys import platform%cd yolov3from models import *from utils.datasets import *from utils.utils import *
from IPython.display import HTMLfrom base64 import b64encode

设置参数解析器,初始化设备(CPU / CUDA),初始化YOLO模型,然后加载权重。

parser = argparse.ArgumentParser()parser.add_argument('--cfg', type=str, default='cfg/yolov3-spp.cfg', help='*.cfg path')parser.add_argument('--names', type=str, default='data/coco.names', help='*.names path')parser.add_argument('--weights', type=str, default='weights/yolov3-spp-ultralytics.pt', help='weights path')parser.add_argument('--img-size', type=int, default=416, help='inference size (pixels)')parser.add_argument('--conf-thres', type=float, default=0.3, help='object confidence threshold')parser.add_argument('--iou-thres', type=float, default=0.6, help='IOU threshold for NMS')parser.add_argument('--device', default='', help='device id (i.e. 0 or 0,1) or cpu')parser.add_argument('--classes', nargs='+', type=int, help='filter by class')parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS')opt = parser.parse_args(args = [])
weights = opt.weightsimg_size =  opt.img_size
# 初始化设备device = torch_utils.select_device(opt.device)
# 初始化模型model = Darknet(opt.cfg, img_size)
# 加载权重attempt_download(weights)if weights.endswith('.pt'):  # pytorch格式    model.load_state_dict(torch.load(weights, map_location=device)['model'])else:  # darknet 格式    load_darknet_weights(model, weights)
model.to(device).eval();# 获取名字和颜色names = load_classes(opt.names)colors = [[random.randint(0, 255) for _ in range(3)] for _ in range(len(names))]
%cd ..

我们正在使用YOLOv3-sp-ultralytics权值,该算法称其在平均精度上远远优于其他YOLOv3模型

functiontorch_utils.select_device()将自动找到可用的GPU,除非输入是“cpu”

对象Darknet在PyTorch上使用预训练的权重来初始化了YOLOv3架构(此时我们不希望训练模型)

预测视频中的目标检测

接下来,我们将读取视频文件并使用矩阵框重写视频。

def predict_one_video(path_video):    cap  = cv2.VideoCapture(path_video)    _, img0 = cap.read()save_path = os.path.join(output_dir, os.path.split(path_video)[-1])     fps = cap.get(cv2.CAP_PROP_FPS)    w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))    h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))    vid_writer = cv2.VideoWriter(save_path, cv2.VideoWriter_fourcc(*'MP4V'), fps, (w, h))

我们使用MP4格式写入新的视频,变量为vid_writer,而宽度和高度则根据原始视频来设置。

开始对视频中的每一帧进行循环以获得预测。

while img0 is not None:img = letterbox(img0, new_shape=opt.img_size)[0]# 转换        img = img[:, :, ::-1].transpose(2, 0, 1)  # BGR 到 RGB, 到 3xHxW        img = np.ascontiguousarray(img)        img = torch.from_numpy(img).to(device)        img = img.float()  # uint8 到 fp16/32        img /= 255.0  # 0 - 255 到 0.0 - 1.0        if img.ndimension() == 3:            img = img.unsqueeze(0)pred = model(img)[0]        # 应用 NMS        pred = non_max_suppression(pred, opt.conf_thres, opt.iou_thres, classes=opt.classes, agnostic=opt.agnostic_nms)

这个模型的图像大小是416,letterbox函数调整了图像的大小,并给图像进行填充,使得图像可以被32整除。

第二部分是将图像转换为RGB格式,并将通道设置到第一维,即(C,H,W),然后将图像数据放入设备(GPU或CPU)中,将像素从0-255缩放到0-1。在我们将图像放入模型之前,我们需要使用img.unsqeeze(0)函数,因为我们必须将图像重新格式化为4维(N,C,H,W), N是图像的数量,在本例中为1。

对图像进行预处理后,将其放入模型中得到预测框,但是预测有很多的框,所以我们需要非最大抑制方法来过滤和合并框。


画边界框和标签,然后写入视频

我们在NMS之后循环所有的预测(pred)来绘制边界框,但是图像已经被调整为416像素大小了,我们需要使用scale_coords函数将其缩放为原始大小,然后使用plot_one_box函数来绘制框

 # 检测        for i, det in enumerate(pred):  #检测每个图片            im0 = img0if det is not None and len(det):                # 更改框的大小                det[:, :4] = scale_coords(img.shape[2:], det[:, :4], im0.shape).round()# 写入结果                for *xyxy, conf, cls in det:                    label = '%s %.2f' % (names[int(cls)], conf)                    plot_one_box(xyxy, im0, label=label, color=colors[int(cls)])        vid_writer.write(im0)        _, img0 = cap.read()

播放Colab的视频

视频在函数predict_one_video被写入为Mp4格式,我们压缩成h264格式,所以视频可以在谷歌Colab / Jupyter上直接播放。

显示原始视频

我们使用IPython.display.HTML来显示视频,其宽度为400像素,视频是用二进制读取的。

path_video = os.path.join("input_video","opera_house.mp4")save_path = predict_one_video(path_video)
# 显示视频mp4 = open(path_video,'rb').read()data_url = "data:video/mp4;base64," + b64encode(mp4).decode()HTML("""<video width=400 controls>      <source src="%s" type="video/mp4"></video>""" % data_url)

压缩和显示处理过的视频

OpenCV视频写入器的输出是一个比原始视频大3倍的Mp4视频,它不能在谷歌Colab上显示,解决方案之一是我们对视频进行压缩。

我们使用ffmpeg -i {save_path} -vcodec libx264 {compressed_path}

path_video = os.path.join("input_video","opera_house.mp4")save_path = predict_one_video(path_video)# 压缩视频compressed_path = os.path.join("output_compressed", os.path.split(save_path)[-1])os.system(f"ffmpeg -i {save_path} -vcodec libx264 {compressed_path}")
#显示视频mp4 = open(compressed_path,'rb').read()data_url = "data:video/mp4;base64," + b64encode(mp4).decode()HTML("""<video width=400 controls>      <source src="%s" type="video/mp4"></video>""" % data_url)

结果

左边是原始视频,右边是使用代码处理过的视频

试试你自己的视频

  1. 转到GitHub上的谷歌Colab文件(https://colab.research.google.com/github/vindruid/yolov3-in-colab/blob/master/yolov3_video.ipynb)

  2. 上传你的视频在input_video文件夹中,只需运行最后一个单元格即可(predict & show video)

原文链接:https://towardsdatascience.com/yolov3-pytorch-on-google-colab-c4a79eeecdea

留言送书福利

感谢大家的走心留言,昨天小编忘了放留言小程序,没办法直接留言,所以只好临时决定让大家给小编微信mthler留言。感觉每个给小编留言的小伙伴都是真爱。每一条小编都认真阅读了,看的非常感动,会继续努力哒。

尽管这次还是不能100%中,但千万不要气馁~ 我们会坚持不定期推出留言送书活动,有的小伙伴都中了好几次了

恭喜下面留言的两位读者,获赠书籍《Python网络爬虫开发从入门到精通》或《Python自动化测试实战》中的任本。请联系小编:mthler

☆ END ☆

如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 mthler」,每日朋友圈更新一篇高质量博文(无广告)。

扫描二维码添加小编↓

使用Google云平台实战基于PyTorch的yolo-v3模型相关推荐

  1. 基于google云平台实现音频转文字

    一.注册账号 1. 打开https://console.cloud.google.com 2. 首先要注册google账号,有gmail就可以直接用: 3. 使用云平台服务需要填写一些信息,其中绑定信 ...

  2. 一种云平台中基于虚机和订单元信息的跨租户数据迁移实现统一纳管的方法

    一种云平台中基于虚机和订单元信息的跨租户数据迁移实现统一纳管的方法 一.发明名称 一种云平台中基于虚机和订单元信息的跨租户数据迁移实现统一纳管的方法 二.技术领域 云计算 数据迁移 统一纳管 三.现有 ...

  3. 基于Pytorch的Transformer翻译模型前期数据处理方法

    基于Pytorch的Transformer翻译模型前期数据处理方法 Google于2017年6月在arxiv上发布了一篇非常经典的文章:Attention is all you need,提出了解决s ...

  4. 基于PaaS和SaaS研发的商业云平台实战 - 精华篇

    摘要:本文是作者本人应邀参加本届全球架构师峰会中的演讲总结精华. 背景介绍 SaaS.PaaS.IaaS等云服务模式已经被大家普遍认可,在研发过程中借力一些PaaS和SaaS平台,能够提升产品的研发速 ...

  5. Tableau实战系列如何在 Google 云平台上安装 Tableau Server

    前言 在 Google 计算引擎 (GCE) 虚拟机 (VM) 上安装 Tableau 时,如果想要灵活地纵向和横向扩展,而不必购买和维护昂贵的 服务器集群,则在 GCE VM 上运行 Tableau ...

  6. 无须搭建环境,只需十分钟使用Google Colab平台,基于YOLOv4和Darknet来实现的物体检测

    @Author:Runsen YOLO 最近,了解计算机视觉的都知道YOLO 很火,从2016年的v1版本开始到现在的v5,YOLO 是一种实时目标检测算法,算法模型不需要训练,直接用就可以了.YOL ...

  7. 艾伦人工智能研究院开源AllenNLP,基于PyTorch轻松构建NLP模型

    艾伦人工智能研究院(AI2)开源AllenNLP,它是一个基于PyTorch的NLP研究库,利用深度学习来进行自然语言理解,通过处理低层次的细节.提供高质量的参考实现,能轻松快速地帮助研究员构建新的语 ...

  8. 物联网云平台实战(一)-什么是物联网?

    从五年前一直在关注着物联网行业的发展趋势和前景,先后在不同的公司中从事着物联网云端的开发工作,在工作这么多年的过程中,也发现了一些物联网公司行业的弊端,那就是在云端前两年搭建物联网平台所需要的投入成本 ...

  9. MTCNN目标检测实战—基于PyTorch的人脸检测算法实战

    目录 一.MTCNN简介: 1.什么是MTCNN 2.MTTCNN的作用 3.MTCNN的优缺点 1优点 2缺点 二.人脸检测 三.MTCN的网络模型 四.准备训练样本 1.获取原始数据集 2.准备训 ...

最新文章

  1. Android热修复升级探索——代码修复冷启动方案
  2. android响铃停止源代码,android – 如何停止当前正在播放的铃声?
  3. 斯坦福大学机器学习第一课“引言(Introduction)”
  4. php提交表单显示错误,php – 在提交注册表单时使用jQuery显示错误
  5. 《OpenGL编程指南(原书第8版)》——计算着色器
  6. 禁止ASP.NET MVC模型绑定时将空字符串绑定为null
  7. php将变量转成字符串类型
  8. bat ping 返回值_专科生可以进bat大厂吗?
  9. 【转载】spring.net 学习系列目录
  10. java 获取客户端的域用户名_使用java有没有办法提取局域网中的客户端的用户名,客户端是以域用户身份进去的...
  11. jsx后缀的是什么文件_React核心特性-从JSX到虚拟DOM
  12. sql注入------基于时间延迟benchmark函数注入脚本
  13. 各种数值积分方法总结(从梯形积分、辛普森积分到龙贝格积分、自适应积分、高斯积分等)
  14. geomtry string 转换_SQL Server数据转换【包括Geometry类型】的技巧总结
  15. CSS菜鸟教程自学2,Text文本
  16. 转载:js和as间的交互
  17. IT桔子分布式项目2
  18. [ArcPy] 代码汇总
  19. php解析手机号 归属地,PHP通过API获取手机号码归属地,api手机号码_PHP教程
  20. SQL Server 如何判断PLE (页面的预期寿命)

热门文章

  1. 阿里云oss简单的文件上传步骤
  2. 知识付费:割裂的圈子,模糊的未来
  3. 中国税务负担全球第二
  4. 被裁的38岁互联网人:10年赔偿18万、半年花光、他打算送快递
  5. access数据类型整型怎么设置_access 2010工提供了几种数据类型?
  6. 【升级win10系统报错】我们无法告知你的电脑是否有足够空间继续安装Windows10
  7. linux下wget通过代理下载(shadow-socks + privoxy)
  8. Activiti 学习笔记12:分配个人任务
  9. 【医学+深度论文:F14】2018 Joint Optic Disc and Cup Segmentation Based on Multi Label Deep Network
  10. 欧拉定理与费马小定理的证明过程