点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

一、引言

自动驾驶汽车可能仍然难以理解人类和垃圾桶之间的区别,但这并没有使最先进的物体检测模型在过去十年中取得的惊人进步相去甚远。

将其与 OpenCV 等库的图像处理能力相结合,如今在数小时内构建实时对象检测系统原型要容易得多。在本指南中,我们将尝试向您展示如何开发用于简单对象检测应用程序的子系统,以及如何将所有这些组合在一起。

二、Python与C++

我知道你们中的一些人可能会想,为什么我们要使用Python,在某种程度上,它对于实时应用程序来说不是太慢了吗。

大多数计算重操作,如预测或图像处理,都是通过PyTrand和OpenCV来执行的,它们都使用C++在场景后面实现这些操作,因此,如果我们在这里使用C++或Python,则不会有太大的差别。

三、读取视频流

输入的视频源可以是任何内容,从网络摄像头读取,或解析现有视频,或从连接到网络的外部摄像头。在此示例中,我们将展示如何从 youtube 或网络摄像头读取视频流。

四、从YouTube读取

你们可能不想出去创建新视频,而是使用许多在线可用的视频。在这种情况下,你们可以从 youtube 读取视频流。

import cv2 # opencv2 package for python.
import pafy # pafy allows us to read videos from youtube.
URL = "https://www.youtube.com/watch?v=dQw4w9WgXcQ" #URL to parse
play = pafy.new(self._URL).streams[-1] #'-1' means read the lowest quality of video.
assert play is not None # we want to make sure their is a input to read.
stream = cv2.VideoCapture(play.url) #create a opencv video stream.

五、从网络摄像头读取

import cv2
stream = cv2.VideoCapture(0) # 0 means read from local camera.

六、读取IP摄像头

如果你们正在构建将部署在服务器上的应用程序,摄像机拥有一个自己的 IP 地址,你可以从中访问视频流。

import cv2
camera_ip = "rtsp://username:password@IP/port"
stream = cv2.VideoCapture(camera_ip)

七、加载模型

有许多不错的对象检测模型,每个模型都有其优点和缺点。为了简单起见,我们将使用YoloV5,因为它为我们提供了对我们的实时应用程序至关重要的快速应用。你们还可以查看其他模型,例如 FasterRCNN。

我们可以直接从 PyTorch hub 加载模型,第一次运行代码可能需要几分钟,因为它会从互联网上下载模型,但下次它将直接从磁盘加载。

from torch import hub # Hub contains other models like FasterRCNN
model = torch.hub.load( \'ultralytics/yolov5', \'yolov5s', \pretrained=True)

八、单帧评分

我们可以说“解析一个视频流,从一帧开始”。那么让我们看看如何对单个帧进行评分和解析。我们用来执行应用的设备对我们的应用速度产生了巨大的影响,现代深度学习模型在使用 GPU 时效果最好,因此如果你们有一个带有 CUDA 内核的 GPU,它将大大提高您的性能。根据经验,即使是单个 GPU 的系统也可以达到每秒 45-60 帧,而 CPU 最多只能提供 25-30 帧。

"""
The function below identifies the device which is availabe to make the prediction and uses it to load and infer the frame. Once it has results it will extract the labels and cordinates(Along with scores) for each object detected in the frame.
"""
def score_frame(frame, model):device = 'cuda' if torch.cuda.is_available() else 'cpu'model.to(device)frame = [torch.tensor(frame)]results = self.model(frame)labels = results.xyxyn[0][:, -1].numpy()cord = results.xyxyn[0][:, :-1].numpy()return labels, cord

九、绘制试别对象及框架

一旦我们对帧进行了评分,在将帧写入输出流之前,我们需要在帧上绘制识别的对象及其框。为此,我们可以使用 OpenCV 的图像处理工具包。

"""
The function below takes the results and the frame as input and plots boxes over all the objects which have a score higer than our threshold.
"""
def plot_boxes(self, results, frame):labels, cord = resultsn = len(labels)x_shape, y_shape = frame.shape[1], frame.shape[0]for i in range(n):row = cord[i]# If score is less than 0.2 we avoid making a prediction.if row[4] < 0.2: continuex1 = int(row[0]*x_shape)y1 = int(row[1]*y_shape)x2 = int(row[2]*x_shape)y2 = int(row[3]*y_shape)bgr = (0, 255, 0) # color of the boxclasses = self.model.names # Get the name of label indexlabel_font = cv2.FONT_HERSHEY_SIMPLEX #Font for the label.cv2.rectangle(frame, \(x1, y1), (x2, y2), \bgr, 2) #Plot the boxescv2.putText(frame,\classes[labels[i]], \(x1, y1), \label_font, 0.9, bgr, 2) #Put a label over box.return frame

十、输出

十一、整合

现在我们将它们整合到一个调用函数中,在循环中执行整个操作,让我们回顾一下我们的主要功能必须执行以成功运行应用程序的步骤。

  1. 创建视频流输入。

  2. 加载模型。

  3. 当输入可用时,阅读下一帧。

  4. 对框架进行评分以获取标签和坐标。

  5. 在检测到的对象上绘制框。

  6. 将处理后的帧写入输出视频流。

"""
The Function below oracestrates the entire operation and performs the real-time parsing for video stream.
"""
def __call__(self):player = self.get_video_stream() #Get your video stream.assert player.isOpened() # Make sure that their is a stream. #Below code creates a new video writer object to write our#output stream.x_shape = int(player.get(cv2.CAP_PROP_FRAME_WIDTH))y_shape = int(player.get(cv2.CAP_PROP_FRAME_HEIGHT))four_cc = cv2.VideoWriter_fourcc(*"MJPG") #Using MJPEG codexout = cv2.VideoWriter(out_file, four_cc, 20, \(x_shape, y_shape)) ret, frame = player.read() # Read the first frame.while rect: # Run until stream is out of framesstart_time = time() # We would like to measure the FPS.results = self.score_frame(frame) # Score the Frameframe = self.plot_boxes(results, frame) # Plot the boxes.end_time = time()fps = 1/np.round(end_time - start_time, 3) #Measure the FPS.print(f"Frames Per Second : {fps}")out.write(frame) # Write the frame onto the output.ret, frame = player.read() # Read next frame.

你们应该将所有这些组件打包到一个类中,该类可以与你们希望将输出流写入其中的 URL 和输出文件一起调用。最终效果如下:

十二、结论

当然,生产级实时应用程序比这复杂得多,但本文并不打算教授这一点。它是为了展示 Python 的惊人力量,它使我们能够在数小时内构建如此复杂的应用程序原型。

Github代码链接:https://github.com/akash-agni

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

实战:使用 PyTorch 和 OpenCV 实现实时目标检测系统相关推荐

  1. 使用 PyTorch 和 OpenCV 实现实时目标检测系统

    作者 | 小白 来源 | 小白学视觉 一.引言 自动驾驶汽车可能仍然难以理解人类和垃圾桶之间的区别,但这并没有使最先进的物体检测模型在过去十年中取得的惊人进步相去甚远. 将其与 OpenCV 等库的图 ...

  2. ibm db2获取目标时间与当前时间的差值_高帧频视觉实时目标检测系统

    基于机器视觉的智能目标检测系统应用非常广泛,尤其在航天军工等领域中,经常涉及高速目标的实时检测和控制,对目标检测的智能性和实时性提出了更严格的要求.在这种应用中,视觉系统相对雷达.声纳具有信息量大.抗 ...

  3. ibm db2获取目标时间与当前时间的差值_【学术论文】高帧频视觉实时目标检测系统...

    摘要 为了实现高速场景下的智能实时目标检测,设计了一种基于ZYNQ7000系列FPGA的高速相机平台,并利用该平台进行目标检测算法实现,形成了一套高帧频实时目标检测系统样机. 该系统将高速CMOS图像 ...

  4. 基于ZYNQ实时目标检测系统

    完整工程成功上板实验! 硬件使用的是黑金ZYNQ7020+配套的AN5642黑金双目摄像头. 在vivado2017.4 下verilog实现 ZYNQ7020+AN5642双目摄像头实现实时目标检测 ...

  5. Yolov7实战,实现网页端的实时目标检测

    关注并星标 从此不迷路 计算机视觉研究院 计算机视觉研究院专栏 作者:Edison_G 今天给大家分享的是yolov7网络实践,并且可以做成web端,只要你输入图像,选择对应模型就可以输出检测结果.让 ...

  6. 基于OpenCV的实时睡意检测系统

    该系统可以检测一个人在开车时是否困倦,如果有的话,可以通过使用语音消息实时提醒他.该系统使用网络摄像头和电话摄像头进行实时数据传输. 01.研究目的 根据国家公路交通安全管理局的数据,每年均涉及疲劳驾 ...

  7. dlib疲劳检测_基于OpenCV的实时睡意检测系统

    该系统可以检测一个人在开车时是否困倦,如果有的话,可以通过使用语音消息实时提醒他.该系统使用网络摄像头和电话摄像头进行实时数据传输. 研究目的 根据国家公路交通安全管理局的数据,每年均涉及疲劳驾驶事故 ...

  8. YOLO_ Real-Time Object Detection 实时目标检测

    YOLO: Real-Time Object Detection 实时目标检测 You only look once(YOLO)是一种先进的实时目标检测系统.在Pascal Titan X上,它以每秒 ...

  9. Yolo:实时目标检测实战(上)

    Yolo:实时目标检测实战(上) YOLO:Real-Time Object Detection 你只看一次(YOLO)是一个最先进的实时物体检测系统.在帕斯卡泰坦X上,它以每秒30帧的速度处理图像, ...

最新文章

  1. No module named Crypto--转
  2. 1.1.0-简介-P11-分布式锁的解决方案
  3. android平台java编程规范_Android Java类编写规范+优化建议
  4. 说透Applet的数字签名之2——数字签名
  5. 中国冷凝管行业市场供需与战略研究报告
  6. java float round_Java Math类static int round(float f)与示例
  7. c语言提取质心坐标,求图像质心的C语言实现
  8. 架构--网络关键指标公式
  9. Echart 仪表盘 样式调整
  10. 用HTML+CSS做一个简单好看的校园社团网页
  11. 2016华为软件精英挑战赛:赛题及其答疑汇总
  12. Centos(操作系统)
  13. 服务器接收协议,协议分析-服务器接收
  14. 设置tabBarItem图片渲染
  15. SSR(服务端渲染)于CSR(客户端渲染)
  16. python指定时间倒计时软件_python倒计时
  17. 解读程序员人生的四大象限
  18. TCP/IP和网络相关知识
  19. vivo Y51A的usb调试模式在哪里,开启vivo Y51Ausb调试模式的流程
  20. Tensorflow系列 | Tensorflow实战讲解神经网络搭建详细过程

热门文章

  1. 微软全球AI总监:Azure AI是OpenAI技术商业化变现唯一、排他性合作方
  2. AI创业成功公式:数据×数据+机器学习能力+算法
  3. Linux 打包及压缩命令使用方法总结
  4. SpringBoot+SpringSecurity前后端分离+Jwt的权限认证(改造记录)
  5. 基于Java的疫情防控管理系统
  6. 为什么 ConcurrentHashMap 的读操作不需要加锁?
  7. 通俗易懂讲解梯度下降法!
  8. 优秀的数据分析师应该具备哪些技能和特质?
  9. 剑指offer_第8题_跳台阶
  10. SOTA论文也未必能被接收,谷歌科学家Eric Jang谈顶会审稿标准