yoloV5目标识别以及跟踪,功能识别动物(大象,犀牛,水牛,斑马)

news2024/12/25 12:47:56

yolo目标识别以及跟踪还是很强的嘞!

一. YOLO V5我来啦

1. 前期准备

yolo V5项目下载

  • 项目的github地址
  • 项目的gitee地址
    • 使用git 克隆下来到项目目录下面就好

环境配置

  • yolov5的文件下面有一个 requirements.txt文件,这里就是环境依赖的说明。

  • 这里我以 vscode 为例(选择自己使用 conda 创建的虚拟环境)
    在这里插入图片描述

  • vscode 打开终端 输入 pip install -r requirements.txt 下载安装依赖包

创建数据集

  • 自己去找训练的图片啦

  • 接下来就是漫长的标注过程了!奥里给!

  • 我们使用的工具是labelImg

  • 继续我们在 conda终端输入以下命令进行安装

    pip install labelImg

  • 等待下载完毕后再接着输入命令

    labelImg

  • 然后我们就可以进行标注过程啦!

    在这里插入图片描述

    (1)是打开相应的图片文件
    (2)首先在这里设定好保存的路径地址,这样待会直接“save”就很方便
    (3)这里一定!!!!要记得先设好形式!!!!
    (4)创建标记框
    (5)删除标记框

    注:同时注意保存的文件夹的形式。

  • 然后在我们项目的根目录下面创建我们的数据目录用来存放我们的数据

    • african-wildlife 未分类之前的
    • african-wildlife-dataset 已经分类
      • 未分类到已分类,可执行程序 format_dataset.py
      • 命令 python format_dataset.py
        在这里插入图片描述

    其中labels中的txt文件里面代表的是:每一行代表标注的一个目标,第一个数字代表着这个数的类别,后面的四个数字是归一化后的的标注的中心点坐标(x,y)和归一化标注框的宽和高(w,h)。

    注:这里文件夹名尽量是images和labels,不然会有各种报错,懒得去找哪里的原因,先让他跑起来吧(label也会报错,加了个s后他就乖了)

更改配置

  1. coco128.yaml

    • 可以参考我的改一下哦

    • # COCO 2017 dataset http://cocodataset.org - first 128 training images
      # Train command: python train.py --data coco128.yaml
      # Default dataset location is next to /yolov5:
      #   /parent_folder
      #     /coco128
      #     /yolov5
      
      
      # download command/URL (optional)
      # download: https://github.com/ultralytics/yolov5/releases/download/v1.0/coco128.zip
      
      # train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
      train: ../african-wildlife-dataset/images/train/  # 128 images
      val: ../african-wildlife-dataset/images/train/  # 128 images
      
      # number of classes
      nc: 4
      
      # class names
      names: [ 'buffalo', 'elephant', 'rhino', 'zebra' ]
      
    • nc:是你要检测有多少类

    • names是这些类的名字

  2. train.py

    • if __name__ == '__main__':
          parser = argparse.ArgumentParser()
          parser.add_argument('--weights', type=str, default='yolov5s.pt', help='initial weights path')
          parser.add_argument('--cfg', type=str, default='', help='model.yaml path')
          parser.add_argument('--data', type=str, default='data/coco128.yaml', help='data.yaml path')
          parser.add_argument('--hyp', type=str, default='data/hyp.scratch.yaml', help='hyperparameters path')
          parser.add_argument('--epochs', type=int, default=300)
          parser.add_argument('--batch-size', type=int, default=16, help='total batch size for all GPUs')
          parser.add_argument('--img-size', nargs='+', type=int, default=[640, 640], help='[train, test] image sizes')
          parser.add_argument('--rect', action='store_true', help='rectangular training')
          parser.add_argument('--resume', nargs='?', const=True, default=False, help='resume most recent training')
          parser.add_argument('--nosave', action='store_true', help='only save final checkpoint')
          parser.add_argument('--notest', action='store_true', help='only test final epoch')
          parser.add_argument('--noautoanchor', action='store_true', help='disable autoanchor check')
          parser.add_argument('--evolve', action='store_true', help='evolve hyperparameters')
          parser.add_argument('--bucket', type=str, default='', help='gsutil bucket')
          parser.add_argument('--cache-images', action='store_true', help='cache images for faster training')
          parser.add_argument('--image-weights', action='store_true', help='use weighted image selection for training')
          parser.add_argument('--device', default='0', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
          parser.add_argument('--multi-scale', action='store_true', help='vary img-size +/- 50%%')
          parser.add_argument('--single-cls', action='store_true', help='train multi-class data as single-class')
          parser.add_argument('--adam', action='store_true', help='use torch.optim.Adam() optimizer')
          parser.add_argument('--sync-bn', action='store_true', help='use SyncBatchNorm, only available in DDP mode')
          parser.add_argument('--local_rank', type=int, default=-1, help='DDP parameter, do not modify')
          parser.add_argument('--log-imgs', type=int, default=16, help='number of images for W&B logging, max 100')
          parser.add_argument('--log-artifacts', action='store_true', help='log artifacts, i.e. final trained model')
          parser.add_argument('--workers', type=int, default=0, help='maximum number of dataloader workers')
          parser.add_argument('--project', default='runs/train', help='save to project/name')
          parser.add_argument('--name', default='exp', help='save to project/name')
          parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')
          parser.add_argument('--quad', action='store_true', help='quad dataloader')
          opt = parser.parse_args()
      
    • 以上代码可以根据自己的需求更改

      • weights是你选择的模型
      • data:因为我用的是coco128.yaml本身,所以我不用改~
      • epochs和batch-size你看着办吧
      • epochs是训练过程中整个数据集将被迭代多少次,显卡不行就调小些
      • batch-size:一次看完多少张图片才进行权重更新,同样的显卡不行就调小些
      • device使用显卡跑就将 default值调成和自己显卡对应的值,我的是 0

2. 是时候跑一下了

执行 python train.py --data coco128.yaml --cfg yolov5s.yaml --weights ' ' --batch-size 64

  • 此时就是漫长的训练过程了等吧!,等吧!慢慢的等吧!

  • 哇哦!成功了!看截图!
    在这里插入图片描述

    • 以上便是成功之后生成的文件图啦

3. 对结果进行验证

执行命令 python detect.py --source .\videos\elephant-rhino2.mp4 --weights runs/train/exp2/weights/best.pt

  • --source后面跟的是要识别的路径
  • --weights 就是你训练好的模型啦
  • source 0指的是电脑摄像头为源

4. 踩坑集结大部队啦!(报错是真的多啊)

output type __int64报错

  • 错误:RuntimeError: result type Float can‘t be cast to the desired output type __int64报错

  • 解决方法

    • yolov5\utils\loos.py替换如下代码

    • def build_targets(p, targets, model):
          # Build targets for compute_loss(), input targets(image,class,x,y,w,h)
          det = model.module.model[-1] if is_parallel(model) else model.model[-1]  # Detect() module
          na, nt = det.na, targets.shape[0]  # number of anchors, targets
          tcls, tbox, indices, anch = [], [], [], []
          gain = torch.ones(7, device=targets.device)  # normalized to gridspace gain
          ai = torch.arange(na, device=targets.device).float().view(na, 1).repeat(1, nt)  # same as .repeat_interleave(nt)
          targets = torch.cat((targets.repeat(na, 1, 1), ai[:, :, None]), 2)  # append anchor indices
      
          g = 0.5  # bias
          off = torch.tensor([[0, 0],
                              [1, 0], [0, 1], [-1, 0], [0, -1],  # j,k,l,m
                              # [1, 1], [1, -1], [-1, 1], [-1, -1],  # jk,jm,lk,lm
                              ], device=targets.device).float() * g  # offsets
      
          for i in range(det.nl):
              anchors, shape = det.anchors[i], p[i].shape
              gain[2:6] = torch.tensor(p[i].shape)[[3, 2, 3, 2]]  # xyxy gain
      
              # Match targets to anchors
              t = targets * gain
              if nt:
                  # Matches
                  r = t[:, :, 4:6] / anchors[:, None]  # wh ratio
                  j = torch.max(r, 1. / r).max(2)[0] < model.hyp['anchor_t']  # compare
                  # j = wh_iou(anchors, t[:, 4:6]) > model.hyp['iou_t']  # iou(3,n)=wh_iou(anchors(3,2), gwh(n,2))
                  t = t[j]  # filter
      
                  # Offsets
                  gxy = t[:, 2:4]  # grid xy
                  gxi = gain[[2, 3]] - gxy  # inverse
                  j, k = ((gxy % 1. < g) & (gxy > 1.)).T
                  l, m = ((gxi % 1. < g) & (gxi > 1.)).T
                  j = torch.stack((torch.ones_like(j), j, k, l, m))
                  t = t.repeat((5, 1, 1))[j]
                  offsets = (torch.zeros_like(gxy)[None] + off[:, None])[j]
              else:
                  t = targets[0]
                  offsets = 0
      
              # Define
              bc, gxy, gwh, a = t.chunk(4, 1)  # (image, class), grid xy, grid wh, anchors
              a, (b, c) = a.long().view(-1), bc.long().T  # anchors, image, class
              gij = (gxy - offsets).long()
              gi, gj = gij.T  # grid indices
      
              # Append
              indices.append((b, a, gj.clamp_(0, shape[2] - 1), gi.clamp_(0, shape[3] - 1)))  # image, anchor, grid
              tbox.append(torch.cat((gxy - gij, gwh), 1))  # box
              anch.append(anchors[a])  # anchors
              tcls.append(c)  # class
      

No loop matching the specified signature and casting was found for ufunc gre

  • 解决方案:
    • 将此代码 \# cum_counts = np.cumsum(np.greater(counts, 0, dtype=np.int32))
      • 在终端点击报错信息就可到需要替换的位置
    • 替换成此代码 cum_counts = np.cumsum(np.greater(counts, 0))

module ‘numpy’ has no attribute ‘int’

  • 报错信息

    • `AttributeError: module 'numpy' has no attribute 'int'.
      `np.int` was a deprecated alias for the builtin `int`. To avoid this error in existing code, use `int` by itself. Doing this will not modify any behavior and is safe. When replacing `np.int`, you may wish to use e.g. `np.int64` or `np.int32` to specify the precision. If you wish to review your current use, check the release note link for additional information.
      
  • 解决方案:

    • 点击报错跳转, 只点击包含datasets.py的错误信息,跳转按如图进行修改
      在这里插入图片描述

将device默认值改为0,使用GPU训练报错,修改方法如下

  • 报错信息:暂时找不到了 一般会出现 device 0 invalid等问题

  • 按如下输入

    在这里插入图片描述

    • 如果返回False,请在conda内连接当前虚拟环境,分别输入

      • pip uninstall torch
      • pip uninstall torchverison
    • 完成后在cmd中输入nvcc --version

      在这里插入图片描述

    • 或者参考

      • pytorch安装
    • 随后在pytorch官网查看对应的下面命令

      • 建议选择pip命令
        在这里插入图片描述

      • 等待安装完成应该就ok了,

      以上便是我遇到的所有报错,欢迎大家一起交流,指正!

wand快速生成报告

在这里插入图片描述

  • 看到这样的图就问你心动不心动,所有的图标都可以下载哦

  • 第一步在 conda终端安装

    • pip install wandb
  • 第二步 注册并获取key

    • wandb官网
      在这里插入图片描述
  • 第三步执行训练命令

    • 会弹出选择
      • 选择第二个,黏贴刚才复制的key
      • 回车大功告成
  • [外链图片转存中…(img-q1Tq0gkU-1686798863240)]

  • 看到这样的图就问你心动不心动,所有的图标都可以下载哦

  • 第一步在 conda终端安装

    • pip install wandb
  • 第二步 注册并获取key

    • wandb官网
    • [外链图片转存中…(img-z6LbDUyh-1686798863240)]
  • 第三步执行训练命令

    • 会弹出选择
      • 选择第二个,黏贴刚才复制的key
      • 回车大功告成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/649199.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DP学习之解码方法

DP学习第二篇之解码方法 91. 解码方法 - 力扣&#xff08;LeetCode&#xff09; 一. 题目解析 二. 题解 算法原理及代码 状态表示 tips: 经验题目要求。以i位置为结尾&#xff0c;。。。 dp[i]: 以i位置为结尾时&#xff0c;解码方法的总数 状态转移方程 tips: 用之前或…

5.3.2 因特网的路由协议(二)基于距离向量算法的RIP协议

5.3.2 因特网的路由协议&#xff08;二&#xff09;基于距离向量算法的RIP协议 一、RIP协议概念 RIP是Routing Information Protocol缩写&#xff0c;又称为路由信息协议&#xff0c;是最先得到应用的内部网关协议&#xff0c;RIP作为一个常在小型互联网中使用的路由信息协议…

【mmcls】mmdet中使用mmcls的网络及预训练模型

mmcls现在叫mmpretrain&#xff0c;以前叫mmclassification&#xff0c;这里为了统一称为mmcls。在基于MM框架的下游任务&#xff0c;例如检测(mmdetection)中可以使用mmcls中的backbone进行特征提取&#xff0c;但这就需要知道网络的参数以及输出特征的维度。本文简单介绍了在…

CDD诊断数据库的简单介绍

1. 什么是数据库? 数据库是以结构化方式组织的一个数据集合。 比如DBC数据库: Network nodes Display Rx Messages EngineState(0x123) 通过结构化的方式把网络节点Display里Rx报文EngineState(0x123)层层展开。这种方 式的好处是:层次清晰,结构分明,易于查找。 2. 什么…

ERROR: AddressSanitizer: heap-use-after-free on address

内存错误"heap-use-after-free"&#xff0c;这是因为在C中&#xff0c;当使用delete关键字释放对象的内存后&#xff0c;该对象仍然会保留指向已经被释放内存的指针。这个指针称为悬挂指针&#xff08;Dangling Pointer&#xff09;。如果我们试图访问已经被释放的内…

【Linux】15. 文件系统与软硬链接

1. 文件系统的引出 在之前的学习过程当中&#xff0c;我们知道当文件被打开后需要加载进内存&#xff0c;第一步为其创建struct file结构体描述其结构(操作系统需要管理被打开的文件&#xff1a;先描述再组织)&#xff0c;在通过进程当中的文件描述符指针指向文件描述符表&…

《机器学习算法竞赛实战》-chapter2问题建模

《机器学习算法竞赛实战》学习笔记&#xff0c;记录一下自己的学习过程&#xff0c;详细的内容请大家购买作者的书籍查阅。 问题建模 当参赛者拿到竞赛题目时&#xff0c;首先应该考虑的事情就是问题建模&#xff0c;同时完成基线(baseline)模型的pipeline搭建&#xff0c;从…

芯片工程师平均薪酬排第一,入行就学这几个热门专业>>>

高考已经结束&#xff0c;对于广大考生来说&#xff0c;考一个理想的分数固然重要&#xff0c;但高考志愿的填报同样事关重大&#xff0c;它决定未来几年考生的学习走向&#xff0c;也会影响到考生未来职业生涯的长远发展。目前&#xff0c;北京、江苏、河南、湖南、海南、甘肃…

Spring Boot进阶(45): Spring Boot 如何返回统一结果包装?一文教会你 | 超级详细,建议收藏

1. 前言&#x1f525; 现如今是前后端分离的时代&#xff0c;如果没有统一的返回格式&#xff0c;给前端的结果各式各样&#xff0c;估计前端小伙伴就要骂街了。我们想对自定义异常抛出指定的状态码排查错误&#xff0c;对系统的不可预知的异常抛出友好一点的异常信息。我们想让…

Java基础重点概要(部分)

为工信部第六届全国计算机信息大赛准备 &#xff0c;主要复习以下内容。 Java基础及环境&#xff1a;JDK发展历史&#xff0c;不同版本的进阶内容。Java程序的编写、编译、调试。 Java程序设计基础&#xff1a;常量和变量的概念&#xff0c;声明方式和作用域。基本数据类型的定…

基于Java学校运动会管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

C语言之指针详解(4)

目录 本章重点 1. 字符指针 2. 数组指针 3. 指针数组 4. 数组传参和指针传参 5. 函数指针 6. 函数指针数组 7. 指向函数指针数组的指针 8. 回调函数 9. 指针和数组面试题的解析 函数指针 数组指针—指向数组的指针 函数指针—指向函数的指针 函数指针 我们来看代码 #…

基于人工智能,现代数据基础架构的新兴架构

作者 Matt Bornstein、Jennifer Li和Martin Casado 摘要 现代机器学习基础设施2.0新架构&#xff1a; http://bit.ly/3AVBpV6 这个图概括了机器学习基础设施2.0的主要组成部分。它涵盖了从数据转换到模型集成的全过程。每个阶段的具体工具和技术也在括号中列出。 结构解读 …

stub实验和配置命令

拓扑 需求 将区域12设置为Stub区域&#xff0c;使区域12的路由设备不受外部链路影响(不接收4/5类LSA&#xff09;降低区域12&#xff08;末梢区域&#xff09;设备压力&#xff0c;还能让区域12的PC1与外部PC3通信 配置步骤 1&#xff09;配置接口信息 - 配置PC的IP地址 - 配置…

SpringBoot的基础配置 - yaml文件的格式以及数据读取

文章目录 SpringBoot基础配置配置文件格式yaml文件格式yaml数据读取 SpringBoot基础配置 配置文件格式 我们用修改服务器端口号来举例, 演示配置的格式 目前我们SpringBoot入门程序已经可以启动, 但是端口是使用的默认的8080 http://localhost:8080/books/1修改服务器的端口号…

CleanMyMacX4.13.4中文免费版mac电脑管家

CleanMyMac X这款软件集成清理、mac保护、速度优化维护、应用程序管理和文件管理5大功能&#xff0c;使用过程安全高效&#xff0c;用户不必担心误操作导致系统的崩溃。作为一款专业的mac电脑系统管家&#xff0c;CleanMymac X一直致力于更加智能、便捷地全方位维护我们的电脑&…

基于servlet+jsp+mysql人事工资管理系统(含实训报告)

基于servletjspmysql人事工资管理系统 一、系统介绍二、功能展示1.用户登陆2.查看个人信息3.查看个人工资、查看考勤4.查看自己所在部门5.人员信息管理6.考勤管理&#xff08;管理员&#xff09;7.工资管理&#xff08;管理员&#xff09;8.部门管理&#xff08;管理员&#xf…

批量生成,本地推理,人工智能声音克隆框架PaddleSpeech本地批量克隆实践(Python3.10)

云端炼丹固然是极好的&#xff0c;但不能否认的是&#xff0c;成本要比本地高得多&#xff0c;同时考虑到深度学习的训练相对于推理来说成本也更高&#xff0c;这主要是因为它需要大量的数据、计算资源和时间等资源&#xff0c;并且对超参数的调整也要求较高&#xff0c;更适合…

大数据处理架构Hadoop

大数据处理架构 Hadoop 概述Hadoop简介Hadoop的特性 Hadoop项目架构Hadoop的安装和使用Hadoop的安装方式Hadoop的安装配置&#xff08;单机/伪分布式&#xff09;SSH登录权限设置单机安装配置伪分布式安装配置 Hadoop集群的部署与使用Hadoop集群中有哪些节点类型集群规模要多大…

Python高级系列教程:HTTP协议与静态Web服务器开发

学习目标 1、了解HTTP协议的基本概念 2、掌握HTTP请求报文与响应报文 3、学会使用开发者工具查看HTTP协议的通信过程 4、搭建Python自带的静态Web服务器 5、掌握Python静态Web服务器开发 一、HTTP协议概述 1、网址URL 网址又称为URL&#xff0c;URL的英文全拼是(Uniform …