对于计算机视觉爱好者来说,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. Linux下DNS轮询与Squid反向代理结合
  2. 从请求管道深入剖析HttpModule的实现机制,有图有真相
  3. 万亿级日志与行为数据存储查询技术剖析(续)——Tindex是改造的lucene和druid...
  4. 云信小课堂|如何实现音视频通话
  5. 【简洁代码】1053 住房空置率 (20分)_22行代码AC
  6. 2011年计算机一级考试题,2011年计算机一级考试试题及答案
  7. java中get接口示例_Java即时类| 带示例的get()方法
  8. 爬虫-在请求头中添加cookie键值对 访问登陆后可见的页面
  9. 「随机化快排」期望运行时间证明
  10. SENDMAIL引发的血案
  11. Corona Enterprise 引入第三方 jar 包
  12. linux shell通过i2cget命令获取I2C器件寄存器的值
  13. 图片如何转换为文字?这些软件可以实现
  14. 手把手带你实现QQ分享
  15. 自动驾驶系统的传感器标定方法
  16. HTML基于蔡徐坤的打飞机游戏源码
  17. 阿里云服务器为什么总是那么不稳定经常崩溃掉线?
  18. 25 Top UI Tools for User Interface Engineers
  19. 某项目RAC环境DG方式迁移到异机RAC
  20. android4 触摸屏驱动,android中如何设计触摸屏驱动touch screen driver

热门文章

  1. Lagrange 拉格朗日插值 | matlab实现
  2. Selenium ChromeDriver 截图标记指定元素的方法
  3. Android平台Gallery2应用分析(一)---背景知识
  4. android中的sign加密,[原创]某交通app的sign加密分析
  5. 参加计算机俱乐部英语作文,关于计算机的英语作文
  6. 实现船务提单资料自动生成,博为小帮软件机器人助力外贸报关录单
  7. Material Components——Shape的处理
  8. 机器学习模型评价指标+模型出错的四大原因及如何纠错
  9. 乐理普及——音乐人常说的Key到底是什么
  10. 电子元件又一话---------电容篇