基于YOLOv8的目标识别、计数、电子围栏的项目开发过程

0 前言

用于生产环境中物体检测、识别、跟踪,人、车流量统计,越界安全识别

1 YOLOv8概述

YOLOv8 是Ultralytics的YOLO的最新版本。作为一种前沿、最先进(SOTA)的模型,YOLOv8在之前版本的成功基础上引入了新功能和改进,以提高性能、灵活性和效率。YOLOv8支持全范围的视觉AI任务,包括检测、分割,、姿态估计、跟踪和分类。这种多功能性使用户能够利用YOLOv8的功能应对多种应用和领域的需求。

2 环境搭建

2.1 NIVIDA、PyTorch、CUDA、CUDNN安装-GPU训练开发

  • NIVIDA显卡驱动下载链接
    在这里插入图片描述

CUDA与驱动对应版本链接
在这里插入图片描述

  • PyTorch安装 主页链接
    使用GPU训练,选择相应CUDA版本
    在这里插入图片描述

  • CUDA CUDNN 版本对应链接
    在这里插入图片描述

  • CUDA下载链接
    在这里插入图片描述

  • CUDNN下载链接
    将bin,include,lib中的文件夹复制粘贴到cuda的根文件夹下
    在这里插入图片描述

2.2 yolov8 pip安装(推荐)

# pip 安装
pip install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple
# 已安装可进行升级
pip install -U ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple
# 安装依赖(推荐在虚拟环境中安装)
# 虚拟环境安装
pip install virtualenv
# 安装依赖
pip install -r requirements.txt

2.3 GitHub下载

git clone https://github.com/ultralytics/ultralytics

2.4 依赖包

# Ultralytics YOLO 🚀, AGPL-3.0 license# Overview:
# This pyproject.toml file manages the build, packaging, and distribution of the Ultralytics library.
# It defines essential project metadata, dependencies, and settings used to develop and deploy the library.# Key Sections:
# - [build-system]: Specifies the build requirements and backend (e.g., setuptools, wheel).
# - [project]: Includes details like name, version, description, authors, dependencies and more.
# - [project.optional-dependencies]: Provides additional, optional packages for extended features.
# - [tool.*]: Configures settings for various tools (pytest, yapf, etc.) used in the project.# Installation:
# The Ultralytics library can be installed using the command: 'pip install ultralytics'
# For development purposes, you can install the package in editable mode with: 'pip install -e .'
# This approach allows for real-time code modifications without the need for re-installation.# Documentation:
# For comprehensive documentation and usage instructions, visit: https://docs.ultralytics.com[build-system]
requires = ["setuptools>=43.0.0", "wheel"]
build-backend = "setuptools.build_meta"# Project settings -----------------------------------------------------------------------------------------------------
[project]
name = "ultralytics"
dynamic = ["version"]
description = "Ultralytics YOLOv8 for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification."
readme = "README.md"
requires-python = ">=3.8"
license = { "text" = "AGPL-3.0" }
keywords = ["machine-learning", "deep-learning", "computer-vision", "ML", "DL", "AI", "YOLO", "YOLOv3", "YOLOv5", "YOLOv8", "HUB", "Ultralytics"]
authors = [{ name = "Glenn Jocher" },{ name = "Ayush Chaurasia" },{ name = "Jing Qiu" }
]
maintainers = [{ name = "Glenn Jocher" },{ name = "Ayush Chaurasia" },{ name = "Jing Qiu" }
]
classifiers = ["Development Status :: 4 - Beta","Intended Audience :: Developers","Intended Audience :: Education","Intended Audience :: Science/Research","License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)","Programming Language :: Python :: 3","Programming Language :: Python :: 3.8","Programming Language :: Python :: 3.9","Programming Language :: Python :: 3.10","Programming Language :: Python :: 3.11","Topic :: Software Development","Topic :: Scientific/Engineering","Topic :: Scientific/Engineering :: Artificial Intelligence","Topic :: Scientific/Engineering :: Image Recognition","Operating System :: POSIX :: Linux","Operating System :: MacOS","Operating System :: Microsoft :: Windows",
]# Required dependencies ------------------------------------------------------------------------------------------------
dependencies = ["matplotlib>=3.3.0","numpy>=1.22.2","opencv-python>=4.6.0","pillow>=7.1.2","pyyaml>=5.3.1","requests>=2.23.0","scipy>=1.4.1","torch>=1.8.0","torchvision>=0.9.0","tqdm>=4.64.0", # progress bars"psutil", # system utilization"py-cpuinfo", # display CPU info"thop>=0.1.1", # FLOPs computation"pandas>=1.1.4","seaborn>=0.11.0", # plotting
]# Optional dependencies ------------------------------------------------------------------------------------------------
[project.optional-dependencies]
dev = ["ipython","check-manifest","pre-commit","pytest","pytest-cov","coverage[toml]","mkdocs-material","mkdocstrings[python]","mkdocs-jupyter", # for notebooks"mkdocs-redirects", # for 301 redirects"mkdocs-ultralytics-plugin>=0.0.34", # for meta descriptions and images, dates and authors
]
export = ["onnx>=1.12.0", # ONNX export"coremltools>=7.0; platform_system != 'Windows'", # CoreML only supported on macOS and Linux"openvino-dev>=2023.0", # OpenVINO export"tensorflow<=2.13.1", # TF bug https://github.com/ultralytics/ultralytics/issues/5161"tensorflowjs>=3.9.0", # TF.js export, automatically installs tensorflow
]
explorer = ["lancedb", # vector search"duckdb", # SQL queries, supports lancedb tables"streamlit", # visualizing with GUI
]
# tensorflow>=2.4.1,<=2.13.1  # TF exports (-cpu, -aarch64, -macos)
# tflite-support  # for TFLite model metadata
# scikit-learn==0.19.2  # CoreML quantization
# nvidia-pyindex  # TensorRT export
# nvidia-tensorrt  # TensorRT export
logging = ["comet", # https://docs.ultralytics.com/integrations/comet/"tensorboard>=2.13.0","dvclive>=2.12.0",
]
extra = ["hub-sdk>=0.0.2", # Ultralytics HUB"ipython", # interactive notebook"albumentations>=1.0.3", # training augmentations"pycocotools>=2.0.6", # COCO mAP
][project.urls]
"Bug Reports" = "https://github.com/ultralytics/ultralytics/issues"
"Funding" = "https://ultralytics.com"
"Source" = "https://github.com/ultralytics/ultralytics/"[project.scripts]
yolo = "ultralytics.cfg:entrypoint"
ultralytics = "ultralytics.cfg:entrypoint"# Tools settings -------------------------------------------------------------------------------------------------------
[tool.setuptools]  # configuration specific to the `setuptools` build backend.
packages = { find = { where = ["."], include = ["ultralytics", "ultralytics.*"] } }
package-data = { "ultralytics" = ["**/*.yaml"], "ultralytics.assets" = ["*.jpg"] }[tool.setuptools.dynamic]
version = { attr = "ultralytics.__version__" }[tool.pytest]
norecursedirs = [".git", "dist", "build"]
addopts = "--doctest-modules --durations=30 --color=yes"[tool.coverage.run]
source = ["ultralytics/"]
data_file = "tests/.coverage"
omit = ["ultralytics/utils/callbacks/*"][tool.isort]
line_length = 120
multi_line_output = 0[tool.yapf]
based_on_style = "pep8"
spaces_before_comment = 2
column_limit = 120
coalesce_brackets = true
spaces_around_power_operator = true
space_between_ending_comma_and_closing_bracket = true
split_before_closing_bracket = false
split_before_first_argument = false[tool.ruff]
line-length = 120[tool.docformatter]
wrap-summaries = 120
wrap-descriptions = 120
in-place = true
pre-summary-newline = true
close-quotes-on-newline = true[tool.codespell]
ignore-words-list = "crate,nd,ned,strack,dota,ane,segway,fo,gool,winn,commend,bloc,nam,afterall"
skip = '*.pt,*.pth,*.torchscript,*.onnx,*.tflite,*.pb,*.bin,*.param,*.mlmodel,*.engine,*.npy,*.data*,*.csv,*pnnx*,*venv*,*translat*,__pycache__*,*.ico,*.jpg,*.png,*.mp4,*.mov,/runs,/.git,./docs/??/*.md,./docs/mkdocs_??.yml'

2.5 yolov8目录结构

在这里插入图片描述

2.6 命令行语法

# 语法格式
yolo TASK MODE ARGS
  • TASK 选择其中之一 (detect, segment, classify, pose)
  • MODE 选择其中之一(train, val, predict, export, track)
  • ARGS 选择其中之一 参数名=参数值 例如: imgsz=640 命令行参数将覆盖文件默认配置(默认配置文件:ultralytics-main/ultralytics/cfg/default.yaml)
    例:
yolo train data=coco128.yaml model=yolov8n.pt epochs=10 lr0=0.01
# 参数传递格式,必须为参数名=参数值,以下为示例:
yolo predict model=yolov8n.pt imgsz=640 conf=0.25 ✅
yolo predict model yolov8n.pt imgsz 640 conf 0.25(缺失 =)
yolo predict model=yolov8n.pt, imgsz=640, conf=0.25(不能使用 ,)
yolo predict --model yolov8n.pt --imgsz 640 --conf 0.25(不能使用 --)

3 使用预训练模型

3.1 模型验证

s模型验证

yolo detect val model=weights\yolov8s.pt

在这里插入图片描述

3.2 模型预测

 yolo detect predict model=weights/yolov8s.pt source=assets

在这里插入图片描述

3.3 模型导出

以导出onnx为例,model=weights/yolov8n.pt为模型存放路径

yolo export model=weights/yolov8n.pt format=onnx

在这里插入图片描述

4 使用自定义数据集

4.1 标注数据集

使用labelImg工具直接标注生成yolo所需的txt:
最简安装方式:

pip3 install labelImg -i https://pypi.tuna.tsinghua.edu.cn/simple

github labelImg标注工具 链接
在这里插入图片描述

Tip: 标注训练和验证样本时,注意类别编号保持一致,不要错乱。例如:训练样本是:0-truck,1-person,验证样本也必须相同, 不能是:1-truck,0-person

4.2 模型训练

Tip: Ultralytics YOLOv8.1.3 🚀 Python-3.9.13 torch-1.12.0+cu113 CUDA:0 (NVIDIA T600 Laptop GPU, 4096MiB) 表示已使用GPU进行高速训练。确保环境(或python虚拟环境)中安装支持CUDA的torch版本,并配置好CUDA CUDNN对应版本的环境变量
在这里插入图片描述

使用yolov8s权重, 图片批次3 ,训练50次

yolo task=detect mode=train model=weights/yolov8s.pt data=cfg/datasets/truck.yaml batch=3 epochs=50

truck.yaml文件配置详情:

path: D:\truck_person\yolo  # dataset root dir
train: images/train  # train images (relative to 'path') 118287 images
val: images/val  # val images (relative to 'path') 5000 images
#test:   # 20288 of 40670 images, submit to # Classes
names:0: person1: truck
nc: 2

训练和验证样本的图片和标注文件路径:
在这里插入图片描述
训练过程
在这里插入图片描述

4.3 模型预测

yolo detect predict model=weights/best.pt source=truck_person

在这里插入图片描述

5 目标计数

演示视频

5.1 视频检测线

capture = cv2.VideoCapture(VIDEO_PATH)
width = int(capture.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 视频高度一半 水平显示 检测线
line_pt0 = (0, height//2)
line_pt1 = (width, height//2)  
while True:_, frame = capture.read()if frame is None:breakcv2.line(frame, line_pt0, line_pt1, (0, 0, 255), thickness=2)

5.2 计算目标中心点

# 通过yolov8获得所有指定的目标集合(detections),包含左上角和右下角坐标
for xyxy, _, _, _ in detections:x1, y1, x2, y2 = xyxy# 计算中心点center_point = ((x1 + x2)/2,(y1 + y2)/2)# 放入数组points.append(center_point)

5.3 检测目标位置算法

基于向量的外积公式,计算检测目标是在检测线的顺时针还是逆时针方向, 顺时针方向为正,逆时针方向为负,正好在检测线上为0

x1, y1 = line_pt0 # 检测线起始点坐标
x2, y2 = line_pt1 # 检测线终止点坐标
x, y = center_point # 检测目标的中心点
res = np.sign((x2 - x1) * (y - y1) - (y2 - y1) * (x - x1))

5.5 目标计数逻辑

根据顺、逆时针,分别记录目标的上一帧和当前帧的状态,如果上一帧同当前帧状态一致则未跨越检测线,反之则跨越检测线
在顺时针方向:

上一帧标识当前帧标识记数
11+0
1-1+1

在逆时针方向:

上一帧标识当前帧标识记数
-1-1+0
-11+1

6 电子围栏

演示视频

6.1 画出围栏区域

poly_points = [[810, 500],[1210, 500],[910, 700],[510, 700]]
mask = np.zeros_like(image)
mask = cv2.fillPoly(mask, [poly_points], color=(100,100,100))
cv2.polylines(image, [poly_points], isClosed=True, color=(255, 0, 0), thickness=3)

6.2 目标区域检测算法

射线交叉法(RayCasting)是一种计算机图形学中常用的算法,用于判断一个点是否在一个封闭的多边形内部。该算法通过发射一条射线从待判断的点出发,与多边形的边进行交点计数,交点数为奇数则在内部,偶数则在外部。

def ray_casting(point, polygon):count = 0for i in range(len(polygon)): j = (i + 1) % len(polygon)if (polygon[i][1] > point[1]) != (polygon[j][1] > point[1]):if point[0] < (polygon[j][0] - polygon[i][0]) * (point[1] - polygon[i][1]) / (polygon[j][1] - polygon[i][1]) + polygon[i][0]:count += 1return count % 2 ==1point = (1, 1)
polygon =[(0, 0), (0, 2), (2, 2), (2, 0)]
if ray_casting(point, polygon):print("点在多边形内部")
else:print("点在多边形外部")

请尊重别人的劳动成果 转载请务必注明出处

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

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

相关文章

cupy,一个超级实用的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超级实用的 Python 库 - cupy。 Github地址&#xff1a;https://github.com/cupy/cupy 深度学习和科学计算需要处理大规模的数据和复杂的计算任务&#xff0c;而Python是一…

tag 标签

tag 标签 在使用 Git 版本控制的过程中&#xff0c;会产生大量的版本。如果我们想对某些重要版本进行记录&#xff0c;就可以给仓库历史中的某一个commit 打上标签&#xff0c;用于标识。 在本章中&#xff0c;我们将会学习如何列出已有的标签、如何创建和删除新的标签、以及…

20240116使用Firefly的AIO-3399J的预编译的Android10固件确认RT5640声卡信息

20240116使用Firefly的AIO-3399J的预编译的Android10固件确认RT5640声卡信息 2024/1/16 17:55 百度&#xff1a;RK3399 ALC5640 RK3399 RT5640 BING&#xff1a;RK3399 ALC5640 LINE-IN接麦克风不会有声音的。 耳机只有右边有声音&#xff0c;但是偏小&#xff0c;可以通过音量…

C++ memmove 学习

memmove&#xff0c;将num字节的值从源指向的位置复制到目标指向的内存块。 允许目标和源有重叠。 当目标区域与源区域没有重叠则和memcpy函数功能相同。 宽字符版本是wmemmove&#xff0c;安全版本加_s&#xff1b; #include "stdafx.h" #include<iostream&g…

如何为不同品牌的笔记本电脑设置充电限制,这里提供详细步骤

笔记本电脑的电池健康状况至关重要。延长电池寿命可以帮你省下不少钱。对于长时间充电的Windows 11笔记本电脑用户来说,将电池电量限制在80%是很重要的。 虽然操作系统没有提供设置自定义电池充电限制的内置方法,但仍有一些方法可以在Windows 11中配置电池设置,并将其限制在…

华南理工大学数字信号处理实验实验一(薛y老师版本)matlab源码

一、实验目的 1、加深对离散信号频谱分析的理解&#xff1b; 2、分析不同加窗长度对信号频谱的影响&#xff1b; 3、理解频率分辨率的概念&#xff0c;并分析其对频谱的 影响&#xff1b; 4、窗长和补零对DFT的影响 实验源码&#xff1a; 第一题&#xff1a; % 定义离散信…

【多线程的安全问题】synchronized 和 volatile——你必须知道的妙用!

&#x1f4c4;前言&#xff1a;本文的主要内容是讨论个人在多线程编程带来的安全问题的表现、原因以及对应的解决方法。 文章目录 一. 了解多线程安全问题二. 线程不安全的现象及原因&#x1f346;1. 修改共享的数据&#xff08;根本原因&#xff09;&#x1f345;2. 原子性&am…

class_14:继承

C继承有点类似于c语言 结构体套用 #include <iostream> #include <string> using namespace std;//基类,父类 class Vehicle{ public:string type;string contry;string color;double price;int numOfWheel;void run();void stop(); };//派生类&#xff0c…

commit 历史版本记录修正

commit 历史版本记录修正 当 Bug 发生的时候&#xff0c;我们会需要去追踪特定 bug 的历史记录&#xff0c;以查出该 bug 真正发生的原因&#xff0c;这个时候就是版本控制带来最大价值的时候。 因此&#xff0c;要怎样维持一个好的版本记录是非常重要的&#xff0c;下面是一…

Rockchip linux USB 驱动开发

Linux USB 驱动架构 Linux USB 协议栈是一个分层的架构&#xff0c;如下图 5-1 所示&#xff0c;左边是 USB Device 驱动&#xff0c;右边是 USB Host 驱动&#xff0c;最底层是 Rockchip 系列芯片不同 USB 控制器和 PHY 的驱动。 Linux USB 驱动架构 USB PHY 驱动开发 USB 2…

手机也能随时随地玩红警啦!

还在为找不到红警安装包苦恼吗&#xff1f; 现在可以随时随地&#xff0c;无论手机、ipad、电脑都可以无需安装包在线玩红警啦&#xff01;&#xff01; 不仅能本地单机玩耍&#xff0c;还能联网玩耍&#xff08;可以和老外一起玩哦&#xff5e;&#xff09; 具体在线链接可…

算法第二十一天-丑数

丑数 题目要求 解题思路 首先判断数字是不是为0或者负数&#xff0c;两者均不可能成为丑数&#xff1b; 之后对n进行不断整除&#xff0c;直到无法除尽为止。 简单判断最后的数是不是1即可。 代码 class Solution:def isUgly(self, n: int) -> bool:if n<0:return Fa…

Linux启动流程梳理值得收藏

Linux启动流程总的来说可以分成三个阶段 Linux启动流程图 第一步&#xff1a;上电 在 x86 系统中&#xff0c;将 1M 空间最上面的 0xF0000 到 0xFFFFF 这 64K 映射给 ROM。 当电脑刚加电的时候&#xff0c;会做一些重置的工作&#xff0c;将 CS 设置为 0xFFFF&#xff0c;将 IP…

Docker命令---搜索镜像

介绍 使用docker命令搜索镜像。 命令 docker search 镜像命令:版本号示例 以搜索ElasticSearch镜像为例 docker search ElasticSearch

【unity】麦克风声音驱动,控制身体做出不同动作

1.在角色对象上挂在animator组件&#xff0c;并将动作控制器与其关联 2.在角色对象上挂在audio source组件。 3.新建voice control脚本&#xff0c;编写代码如下&#xff1a; using System; using System.Collections; using System.Collections.Generic; using UnityEngine;…

复现PointNet++(语义分割网络):Windows + PyTorch + S3DIS语义分割 + 代码

一、平台 Windows 10 GPU RTX 3090 CUDA 11.1 cudnn 8.9.6 Python 3.9 Torch 1.9.1 cu111 所用的原始代码&#xff1a;https://github.com/yanx27/Pointnet_Pointnet2_pytorch 二、数据 Stanford3dDataset_v1.2_Aligned_Version 三、代码 分享给有需要的人&#xf…

算法专题[递归-搜索-回溯-2-DFS]

算法专题[递归-搜索-回溯-2-DFS] 一.计算布尔二叉树的值&#xff1a;1.思路一&#xff1a;2.GIF题目解析 二.求根节点到叶子节点的数字之和1.思路一&#xff1a;2.GIF题目解析 三.二叉树剪枝1.思路一&#xff1a;2.GIF题目解析 四.验证二叉搜索树1.思路一&#xff1a;2.GIF题目…

1.2 数据模型

数据模型是对现实世界数据特征的抽象&#xff0c;是现实世界的模拟 数据模型是用来描述数据、组织数据和对数据进行操作的 数据模型应满足三方面要求&#xff1a; 1 能比较真实地模拟现实世界 2 容易为人所理解 3 便于在计算机上实现 数据模型…

08. Springboot集成webmagic实现网页爬虫

目录 1、前言 2、WebMagic 3、Springboot集成Webmagic 3.1、创建Springboot&#xff0c;并引入webmagic依赖 3.2、定义PageProcessor 3.3、元素选择 3.3.1、F12查看网页元素 3.3.2、元素选择 3.3.3、注意事项 4、小结 1、前言 在信息化的时代&#xff0c;网络爬虫已…

QT的绘图系统QPainterDevice与文件系统QIODevice

QT的绘图系统&#xff08;QPainterDevice&#xff09;与文件系统&#xff08;QIODevice&#xff09; 文章目录 1、Qt 的绘图系统1、QPainter的使用2、QPen(画笔&#xff09;及QBursh&#xff08;画刷&#xff09;3、手动更新窗口4、绘图设备1、四种绘图设备的 区别2、 QBitmap3…