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

OpenCV学堂 2022-05-13 23:26

点击上方↑↑↑OpenCV学堂”关注我

来源:公众号 小白学视觉 授权


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


将其与 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 parseplay = 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 cv2stream = cv2.VideoCapture(0) # 0 means read from local camera.


六、读取IP摄像头


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

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


七、加载模型


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


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

from torch import hub # Hub contains other models like FasterRCNNmodel = 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 = results    n = 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:             continue        x1 = 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 box        classes = self.model.names # Get the name of label index        label_font = cv2.FONT_HERSHEY_SIMPLEX #Font for the label.        cv2.rectangle(frame, \                      (x1, y1), (x2, y2), \                       bgr, 2) #Plot the boxes        cv2.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 codex    out = 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 frames        start_time = time() # We would like to measure the FPS.        results = self.score_frame(frame) # Score the Frame        frame = 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

OpenCV学堂 专注计算机视觉开发技术分享,技术框架使用,包括OpenCV,Tensorflow,Pytorch教程与案例,相关算法详解,最新CV方向论文,硬核代码干货与代码案例详解!作者在CV工程化方面深度耕耘15年,感谢您的关注!
评论 (0)
  • 多功能电锅长什么样子,主视图如下图所示。侧视图如下图所示。型号JZ-18A,额定功率600W,额定电压220V,产自潮州市潮安区彩塘镇精致电子配件厂,铭牌如下图所示。有两颗螺丝固定底盖,找到合适的工具,拆开底盖如下图所示。可见和大部分市场的加热锅一样的工作原理,手绘原理图,根据原理图进一步理解和分析。F1为保险,250V/10A,185℃,CPGXLD 250V10A TF185℃ RY 是一款温度保险丝,额定电压是250V,额定电流是10A,动作温度是185℃。CPGXLD是温度保险丝电器元件
    liweicheng 2025-05-05 18:36 301浏览
  • 某国产固态电解的2次和3次谐波失真相当好,值得一试。(仅供参考)现在国产固态电解的性能跟上来了,值得一试。当然不是随便搞低端的那种。电容器对音质的影响_电子基础-面包板社区  https://mbb.eet-china.com/forum/topic/150182_1_1.html (右键复制链接打开)电容器对音质的影响相当大。电容器在音频系统中的角色不可忽视,它们能够调整系统增益、提供合适的偏置、抑制电源噪声并隔离直流成分。然而,在便携式设备中,由于空间、成本的限
    bruce小肥羊 2025-05-04 18:14 248浏览
  • 文/郭楚妤编辑/cc孙聪颖‍相较于一众措辞谨慎、毫无掌舵者个人风格的上市公司财报,利亚德的财报显得尤为另类。利亚德光电集团成立于1995年,是一家以LED显示、液晶显示产品设计、生产、销售及服务为主业的高新技术企业。自2016年年报起,无论业绩优劣,董事长李军每年都会在财报末尾附上一首七言打油诗,抒发其对公司当年业绩的感悟。从“三年翻番顺大势”“智能显示我第一”“披荆斩棘幸从容”等词句中,不难窥见李军的雄心壮志。2012年,利亚德(300296.SZ)在深交所创业板上市。成立以来,该公司在细分领
    华尔街科技眼 2025-05-07 19:25 199浏览
  • ‌一、高斯计的正确选择‌1、‌明确测量需求‌‌磁场类型‌:区分直流或交流磁场,选择对应仪器(如交流高斯计需支持交变磁场测量)。‌量程范围‌:根据被测磁场强度选择覆盖范围,例如地球磁场(0.3–0.5 G)或工业磁体(数百至数千高斯)。‌精度与分辨率‌:高精度场景(如科研)需选择误差低于1%的仪器,分辨率需匹配微小磁场变化检测需求。2、‌仪器类型选择‌‌手持式‌:便携性强,适合现场快速检测;‌台式‌:精度更高,适用于实验室或工业环境。‌探头类型‌:‌横向/轴向探头‌:根据磁场方向选择,轴向探头适合
    锦正茂科技 2025-05-06 11:36 405浏览
  • 后摄像头是长这个样子,如下图。5孔(D-,D+,5V,12V,GND),说的是连接线的个数,如下图。4LED,+12V驱动4颗LED灯珠,给摄像头补光用的,如下图。打开后盖,发现里面有透明白胶(防水)和白色硬胶(固定),用合适的工具,清理其中的胶状物。BOT层,AN3860,Panasonic Semiconductor (松下电器)制造的,Cylinder Motor Driver IC for Video Camera,如下图。TOP层,感光芯片和广角聚焦镜头组合,如下图。感光芯片,看着是玻
    liweicheng 2025-05-07 23:55 133浏览
  • UNISOC Miracle Gaming奇迹手游引擎亮点:• 高帧稳帧:支持《王者荣耀》等主流手游90帧高画质模式,连续丢帧率最高降低85%;• 丝滑操控:游戏冷启动速度提升50%,《和平精英》开镜开枪操作延迟降低80%;• 极速网络:专属游戏网络引擎,使《王者荣耀》平均延迟降低80%;• 智感语音:与腾讯GVoice联合,弱网环境仍能保持清晰通话;• 超高画质:游戏画质增强、超级HDR画质、游戏超分技术,优化游戏视效。全球手游市场规模日益壮大,游戏玩家对极致体验的追求愈发苛刻。紫光展锐全新U
    紫光展锐 2025-05-07 17:07 223浏览
  • 2024年初,OpenAI公布的Sora AI视频生成模型,震撼了国产大模型行业。随后国产厂商集体发力视频大模型,快手发布视频生成大模型可灵,字节跳动发布豆包视频生成模型,正式打响了国内AI视频生成领域第一枪。众多企业匆忙入局,只为在这片新兴市场中抢占先机,却往往忽视了技术成熟度与应用规范的打磨。以社交平台上泛滥的 AI 伪造视频为例,全红婵家人被恶意仿冒博流量卖货,明星们也纷纷中招,刘晓庆、张馨予等均曾反馈有人在视频号上通过AI生成视频假冒她。这些伪造视频不仅严重侵犯他人权
    用户1742991715177 2025-05-05 23:08 94浏览
  • 二位半 5线数码管的驱动方法这个2位半的7段数码管只用5个管脚驱动。如果用常规的7段+共阳/阴则需要用10个管脚。如果把每个段看成独立的灯。5个管脚来点亮,任选其中一个作为COM端时,另外4条线可以单独各控制一个灯。所以实际上最多能驱动5*4 = 20个段。但是这里会有一个小问题。如果想点亮B1,可以让第3条线(P3)置高,P4 置低,其它阳极连P3的灯对应阴极P2 P1都应置高,此时会发现C1也会点亮。实际操作时,可以把COM端线P3设置为PP输出,其它线为OD输出。就可以单独控制了。实际的驱
    southcreek 2025-05-07 15:06 257浏览
  • Matter协议是一个由Amazon Alexa、Apple HomeKit、Google Home和Samsung SmartThings等全球科技巨头与CSA联盟共同制定的开放性标准,它就像一份“共生契约”,能让原本相互独立的家居生态在应用层上握手共存,同时它并非另起炉灶,而是以IP(互联网协议)为基础框架,将不同通信协议下的家居设备统一到同一套“语义规则”之下。作为应用层上的互通标准,Matter协议正在重新定义智能家居行业的运行逻辑,它不仅能向下屏蔽家居设备制造商的生态和系统,让设备、平
    华普微HOPERF 2025-05-08 11:40 116浏览
  • 随着智能驾驶时代到来,汽车正转变为移动计算平台。车载AI技术对存储器提出新挑战:既要高性能,又需低功耗和车规级可靠性。贞光科技代理的紫光国芯车规级LPDDR4存储器,以其卓越性能成为国产芯片产业链中的关键一环,为智能汽车提供坚实的"记忆力"支持。作为官方授权代理商,贞光科技通过专业技术团队和完善供应链,让这款国产存储器更好地服务国内汽车厂商。本文将探讨车载AI算力需求现状及贞光科技如何通过紫光国芯LPDDR4产品满足市场需求。 车载AI算力需求激增的背景与挑战智能驾驶推动算力需求爆发式
    贞光科技 2025-05-07 16:54 154浏览
  • 这款无线入耳式蓝牙耳机是长这个样子的,如下图。侧面特写,如下图。充电接口来个特写,用的是卡座卡在PCB板子上的,上下夹紧PCB的正负极,如下图。撬开耳机喇叭盖子,如下图。精致的喇叭(HY),如下图。喇叭是由电学产生声学的,具体结构如下图。电池包(AFS 451012  21 12),用黄色耐高温胶带进行包裹(安规需求),加强隔离绝缘的,如下图。451012是电池包的型号,聚合物锂电池+3.7V 35mAh,详细如下图。电路板是怎么拿出来的呢,剪断喇叭和电池包的连接线,底部抽出PCB板子
    liweicheng 2025-05-06 22:58 394浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦