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

news2024/10/5 17:20:30

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: person
  1: 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:
        break

    cv2.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 = 0
	for 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 += 1
	return count % 2 ==1
		
point = (1, 1)
polygon =[(0, 0), (0, 2), (2, 2), (2, 0)]
if ray_casting(point, polygon):
	print("点在多边形内部")
else:
	print("点在多边形外部")

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

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

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

相关文章

构建STM32MP133的Buildroot环境

意法半导体ST在坚持用 Yocto构建他们的OpenSTLinux MP1系列MCU&#xff0c;编译费劲&#xff0c;而且我们的应用不需要Yocto的环境&#xff0c;所以基于Buildroot的最小Linux系统更适合我们。 STM32MP133微处理器基于单Arm Cortex-A7内核&#xff0c;运行频率可达1 GHz&#x…

PACS医学影像采集传输与存储管理、影像诊断查询与报告管理系统,MPR多平面重建

按照国际标准IHE规范&#xff0c;以高性能服务器、网络及存储设备构成硬件支持平台&#xff0c;以大型关系型数据库作为数据和图像的存储管理工具&#xff0c;以医疗影像的采集、传输、存储和诊断为核心&#xff0c;集影像采集传输与存储管理、影像诊断查询与报告管理、综合信息…

使用JFLASH实现文件程序自动化合并及下载功能

主要总结下使用 SEGGER 工具集的 JFLASH 软件实现hex/bin文件合并以及程序的自动下载使用方法。 起因是最近使用到LVGL字库文件的制作&#xff0c;每次都要将分散的bin文件按既定分配的偏移作合并处理&#xff0c;刚开始使用的是二进制文件合并工具,文件少的时候还行&#xff…

C#使用DateTime.Now静态属性动态获得系统当前日期和时间

目录 一、实例 1.源码 2.生成效果 二、相关知识点 1.Thread类 &#xff08;1&#xff09;Thread.Sleep()方法 &#xff08;2&#xff09;Thread(ThreadStart) &#xff08;3&#xff09;IsBackground &#xff08;4&#xff09;Invoke( &#xff09; 2.CreateGrap…

【c++函数重载】

文章目录 一. 命名空间二 .全缺省参数和半缺省参数三 . 函数重载 一. 命名空间 1.不指定域&#xff1a;先在局部找&#xff0c;再全局。 2. 指定域&#xff1a;到指定的命名空间去找。 3. 当把指定命名空间放开时&#xff0c;即using namespace std&#xff1b;例如放开标准c库…

分布式 session

分布式 session 种 session 的时候需要注意范围&#xff0c;也就是 cookie.domain。 比如两个域名&#xff1a;a.heo.com&#xff0c;b.heo.com。如果要共享 cookie&#xff0c;可以种一个更高层的公共域名&#xff0c;比如 heo.com。 当服务器 A &#xff08;localhost:808…

大数据平台的硬件规划、网络调优、架构设计、节点规划

1.大数据平台硬件选型 要对Hadoop大数据平台进行硬件选型,首先需要了解Hadoop的运行架构以及每个角色的功能。在一个典型的Hadoop架构中,通常有5个角色,分别是NameNode、Standby NameNode、ResourceManager、NodeManager、DataNode以及外围机。 其中 NameNode 负责协调集群…

OneNote使用总结

试一下OneNote表格复制到CSDN的编辑器 用表格整理内容挺方便的&#xff0c;不过复制过来格式还是有些变化 目录 常用快捷键 高级应用 常用快捷键 文字编辑与排版 字号增加减小 Ctrl Shift 大于小于号 整行上下移动 左右缩进 Alt Shift方向 插入或转为公式 Alt 等于…

软件需求规格说明书-word

软件需求规格说明书编写规范 1.项目背景 2.项目目标 3.系统架构 4.总体流程 5.名称解释 6.功能模块 软件开发全文档获取&#xff1a;软件项目开发全套文档下载_软件项目文档-CSDN博客

Python笔记10-数据可视化练习折线图

文章目录 JSON数据Python数据和Json数据的相互转化pyecharts模块构建折线图全局配置绘制疫情数据折线图 JSON数据 JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去组织和封装数据 。本质上是一个带有特定格式的字符串 主要功能&#xff1a;可以在各个编程语言中流通…

R语言的ggplot2绘制分组折线图?

R绘制分组折线图.R 首先看数据情况&#xff1a;group有3组。Time有3组&#xff0c;数据意思是在3组3个时间点测量了某指标&#xff0c;现在要绘制组1、组2、组3某指标y按时间的变化趋势 数据情况&#xff1a; 看看最终的效果图如下&#xff1a; 下面是本次使用的代码 .libPat…

合并两个有序数组(三指针法)

这道题使用三指针法&#xff0c;实际上是创建三个变量模拟下标的走势&#xff1a; 一般常规想法是先合并再排序&#xff0c;三指针则是边合并边排序&#xff1b; l1是nums1的有效数据的最后一位的下标&#xff0c;即m - 1&#xff1b; l2是num2的有效数据的最后一位的下标&a…

conda修改默认环境安装位置

conda修改默认环境安装位置 文章目录 conda修改默认环境安装位置查看conda配置信息创建.condarc&#xff08;conda runtime controlling)配置文件没有.condarc怎么办 即使创建正确放置了.condarc创建环境时还是默认指定C盘目录写权限目录修改权限 查看conda配置信息 conda con…

前端实现贪吃蛇功能

大家都玩过贪吃蛇小游戏&#xff0c;控制一条蛇去吃食物&#xff0c;然后蛇在吃到食物后会变大。本篇博客将会实现贪吃蛇小游戏的功能。 1.实现效果 2.整体布局 /*** 游戏区域样式*/ const gameBoardStyle {gridTemplateColumns: repeat(${width}, 1fr),gridTemplateRows: re…

Hive-SQL语法大全

Hive SQL 语法大全 基于语法描述说明 CREATE DATABASE [IF NOT EXISTS] db_name [LOCATION] path; SELECT expr, ... FROM tbl ORDER BY col_name [ASC | DESC] (A | B | C)如上语法&#xff0c;在语法描述中出现&#xff1a; []&#xff0c;表示可选&#xff0c;如上[LOCATI…

【51单片机】矩阵按键

0、前言 参考&#xff1a;普中 51 单片机开发攻略 1、硬件 2、软件 main.c #include <reg52.h> #include <intrins.h> #include "delayms.h"typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; #define GPIO_KEY P1 #d…

【操作系统和计网从入门到深入】(五)软硬链接和动静态库

前言 这个专栏其实是博主在复习操作系统和计算机网络时候的笔记&#xff0c;所以如果是博主比较熟悉的知识点&#xff0c;博主可能就直接跳过了&#xff0c;但是所有重要的知识点&#xff0c;在这个专栏里面都会提到&#xff01;而且我也一定会保证这个专栏知识点的完整性&…

使用RSVP进行带宽预留

使用RSVP进行带宽预留 服务质量&#xff08;QoS&#xff09;工具包括 标记&#xff0c; 管制和 整形 机制&#xff0c;主要是区分服务&#xff08;DiffServ&#xff09;工具。DiffServ机制可提供带宽保证&#xff08;在各种刚性级别上&#xff09;&#xff0c;但是它们都不提供…

Three.js 学习笔记之模型(学习中1.20更新) | 组 - 模型 - 几何体 - 材质

文章目录 模型 几何体 材质层级模型组- THREE.Group递归遍历模型树结构object3D.traverse() 模型点模型Points - 用于显示点线模型Line | LineLoop | LineSegments网格模型mesh - 三角形网格模型独有的属性与方法 几何体BufferGeometry缓冲类型几何体BufferGeometry - 基类创…

【Android】app中阻塞的looper为什么可以响应touch事件

这里&#xff0c;我们考虑一个问题&#xff0c;Android中的应用是一个looper线程&#xff0c;没有任务时就阻塞着&#xff0c;其他线程通过handler调用等方式向主线程looper发送任务&#xff0c; 如果点击应用上的按钮&#xff0c;应用是怎么及时响应的呢&#xff0c; 是专门启…