脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - yolov5调用usb摄像头及本地摄像头的方法实例

yolov5调用usb摄像头及本地摄像头的方法实例

2022-11-04 10:34weixin_50518868 Python

YOLOV5模型从发布到现在都是炙手可热的目标检测模型,被广泛运用于各大场景之中,下面这篇文章主要给大家介绍了关于yolov5调用usb摄像头及本地摄像头的相关资料,需要的朋友可以参考下

yolov5 调用 usb 摄像头

文章是在yolov5 v5.0版本的detect.py所修改编写

其他v1.0-v4.0没有试过,你们可以试试。

具体用法已经写在代码里面了。

import time
import cv2
import numpy as np
import torch
from models.experimental import attempt_load
from utils.datasets import letterbox
from utils.general import check_img_size, non_max_suppression,scale_coords, xyxy2xywh,set_logging,check_requirements
from utils.plots import colors, plot_one_box
from utils.torch_utils import select_device,time_synchronized

@torch.no_grad()
def detect(
      #--------------------这里更改配置--------------------
      #---------------------------------------------------
         weights='runs/train/exp25/weights/best.pt',   #训练好的模型路径   (必改)
         imgsz=512,           #训练模型设置的尺寸 (必改)
         cap = 0,             #摄像头
         conf_thres=0.25,     #置信度
         iou_thres=0.45,      #NMS IOU 阈值
         max_det=1000,        #最大侦测的目标数
         device='',           #设备
         crop=True,           #显示预测框
         classes=None,        #种类
         agnostic_nms=False,  #class-agnostic NMS
         augment=False,       #是否扩充推理
         half=False,          #使用FP16半精度推理
         hide_labels=False,   #是否隐藏标签
         hide_conf=False,     #是否隐藏置信度
         line_thickness=3     #预测框的线宽
         ):
      # #--------------------这里更改配置--------------------
      #-----------------------------------------------------
  #打开摄像头
  cap = cv2.VideoCapture(cap)

  #-----初始化-----
  set_logging()
  #设置设备
  device = select_device(device)
  #CUDA仅支持半精度
  half &= device.type != 'cpu'  

  #-----加载模型-----
  #加载FP32模型
  model = attempt_load(weights, map_location=device)  
  #模型步幅
  stride = int(model.stride.max())  
  #检查图像大小
  imgsz = check_img_size(imgsz, s=stride)  
  #获取类名
  names = model.module.names if hasattr(model, 'module') else model.names  
  #toFP16
  if half:
      model.half()  

  #------运行推理------
  if device.type != 'cpu':
      model(torch.zeros(1, 3, imgsz, imgsz).to(device).type_as(next(model.parameters())))  # 跑一次
  
  #-----进入循环:ESC退出-----
  while(True):
      #设置labels--记录标签/概率/位置
      labels = []
      #计时
      t0 = time.time()
      ref,img0=cap.read()
      #填充调整大小
      img = letterbox(img0, imgsz, stride=stride)[0] 
      # 转换
      img = img[:, :, ::-1].transpose(2, 0, 1)  #BGR to RGB, to 3x416x416
      img = np.ascontiguousarray(img)

      img = torch.from_numpy(img).to(device)
      #uint8 to fp16/32
      img = img.half() if half else img.float()  
      #0 - 255 to 0.0 - 1.0
      img /= 255.0  
      if img.ndimension() == 3:
          img = img.unsqueeze(0)

      # 推断
      t1 = time_synchronized()
      pred = model(img, augment=augment)[0]

      # 添加 NMS
      pred = non_max_suppression(pred, conf_thres, iou_thres, classes, agnostic_nms, max_det=max_det)
      t2 = time_synchronized()

      #目标进程
      for i, det in enumerate(pred):  # 每幅图像的检测率
          s, im0 = '', img0.copy()
          #输出字符串
          s += '%gx%g ' % img.shape[2:]  
          #归一化增益
          gn = torch.tensor(im0.shape)[[1, 0, 1, 0]]  
          if len(det):
              # 将框从img_大小重新缩放为im0大小
              det[:, :4] = scale_coords(img.shape[2:], det[:, :4], im0.shape).round()
              # 输出结果
              for c in det[:, -1].unique():
                  #每类检测数
                  n = (det[:, -1] == c).sum()
                  #添加到字符串  
                  s += f"{n} {names[int(c)]}{'s' * (n > 1)}, "  
              # 结果输出
              for *xyxy, conf, cls in reversed(det):
                  #归一化xywh
                  xywh = (xyxy2xywh(torch.tensor(xyxy).view(1, 4)) / gn).view(-1).tolist()  
                  #标签格式
                  line = (cls, *xywh, conf)  
                  #整数类
                  c = int(cls)  
                  #建立标签
                  label = None if hide_labels else (names[c] if hide_conf else f'{names[c]} {conf:.2f}')
                  #绘画预测框
                  if crop:    
                      plot_one_box(xyxy, im0, label=label, color=colors(c, True), line_thickness=line_thickness)
                  #记录标签/概率/位置
                  labels.append([names[c],conf,xyxy])

      #--------------------这里写/修改代码--------------------
      #-------------------------------------------------
      '''
      labels里面有该图片的标签/概率/坐标(列表)
      labels = [ [列表0] , [列表1] , [列表3] ,......]
          其中 列表 = [标签,概率,坐标]
      例如获取第一个预测框的概率值:print( float( labels[0][1])  )
      '''
      # 显示图片
      cv2.imshow("666",im0)
      #输出计算时间
      print(f'消耗时间: ({time.time() - t0:.3f}s)')


      key = cv2.waitKey(20)  

      #这里设置ESC退出
      if key == 27:
          break
      #--------------------END--------------------
      #-------------------------------------------------
  cv2.destroyAllWindows()

if __name__ == "__main__":
  '''
  修改配置在 13-28 行
  写代码-显示输出/获取预测框位置/获取预测概率值 在121-END行
  '''
  #检测安装包--建议注释掉
  #check_requirements(exclude=('tensorboard', 'thop'))
  #运行
  detect()

经研究发现,yolov5-master有time_synchronized 和 time_sync 两种名字,所以如果time_synchronized报错,麻烦换成time_sync

 

YOLOv5调用本地摄像头

YOLOv5源码:https://github.com/ultralytics/yolov5

最近用YOLOv5做目标检测,直接调用本地摄像头会报错,需要在dataset中做一点修改。

具体如下:

yolov5调用usb摄像头及本地摄像头的方法实例

在279行的这两处改成str类型

yolov5调用usb摄像头及本地摄像头的方法实例

然后在detect里把这里的参数改为0

yolov5调用usb摄像头及本地摄像头的方法实例

然后运行detect.py即可调用本地摄像头。

总结

到此这篇关于yolov5调用usb摄像头及本地摄像头的文章就介绍到这了,更多相关yolov5调用摄像头内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_50518868/article/details/119359146

延伸 · 阅读

精彩推荐
  • Pythonpython对批量WAV音频进行等长分割的方法实现

    python对批量WAV音频进行等长分割的方法实现

    这篇文章主要介绍了python对批量WAV音频进行等长分割的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需...

    养只小刺猬吧7392020-09-26
  • Python尝试用最短的Python代码来实现服务器和代理服务器

    尝试用最短的Python代码来实现服务器和代理服务器

    "人生苦短、我用Python",Python最大的特点便是代码简洁,得益于Python自带的wsgiref包和socket模块,这里我们将尝试用最短的Python代码来实现服务器和代理服务器...

    mattkang4812020-08-29
  • PythonPython基于mediainfo批量重命名图片文件

    Python基于mediainfo批量重命名图片文件

    这篇文章主要介绍了Python基于mediainfo批量重命名图片文件的方法,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下...

    武散人11152021-08-19
  • PythonDjango中Model的使用方法教程

    Django中Model的使用方法教程

    最近学习了一下Django文档的model部分,通过学习的内容整理了这篇文章,下面这篇文章主要给大家介绍了关于Django中Model的使用方法的相关资料,文中通过示...

    Suraer5002021-01-20
  • Python利用Python编写一个记忆翻牌游戏

    利用Python编写一个记忆翻牌游戏

    本文带大家写个小游戏,不过老是用pygame也没啥意思,这次我们换点新花样,用python自带的tkinter包写一个记忆翻牌小游戏,感兴趣的可以了解一下...

    Charles的皮卡丘11532022-10-24
  • Pythonpycharm 实现显示project 选项卡的方法

    pycharm 实现显示project 选项卡的方法

    今天小编就为大家分享一篇pycharm 实现显示project 选项卡的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    小妖精Fsky12492021-05-17
  • Pythonpython安装Scrapy图文教程

    python安装Scrapy图文教程

    下面小编就为大家带来一篇python安装Scrapy图文教程。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    f0t12922020-12-02
  • Python聊聊pytorch中Optimizer与optimizer.step()的用法

    聊聊pytorch中Optimizer与optimizer.step()的用法

    这篇文章主要介绍了pytorch中Optimizer与optimizer.step()的用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...

    wang xiang5822021-11-18