赞
踩
YOLOv8(You Only Look Once version 8)是一个深度学习框架,用于实现实时对象检测。它是 YOLO 系列的最新迭代,旨在提供更高的准确性和速度。YOLOv8 继承了前代模型的优点,并在此基础上进行了多项改进,包括更复杂的网络架构、更优化的训练流程和更强大的特征提取能力。这些改进共同作用,使得 YOLOv8 在多个标准数据集上达到了前所未有的检测性能。
YOLOv8 的特点:
实时性能: YOLOv8 继续保持 YOLO 系列的实时检测特性,即使在较低的硬件配置上也能达到很高的帧率(FPS)。
高准确度: 通过更深更复杂的网络结构和改进的训练技巧,YOLOv8 在保持高速度的同时,也大幅提高了检测的准确度。
多尺度预测: YOLOv8 引入了改进的多尺度预测技术,可以更好地检测不同大小的对象。
自适应锚框: 新版在自适应调整锚框方面做了优化,可以更准确地预测对象的位置和大小。
conda create -n yolov8 python=3.8
#激活环境
conda activate yolov8
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
在电脑桌面右键,打开NVIDIA的控制面板
下载地址:链接
选择自己对应的版本下载
安装时可以默认路径安装,按照提示进行安装即可
http官网地址 https://developer.nvidia.com/cudnn-downloads 点我跳转
下载cuDNN是需要登录英伟达开发者账户的,注册一个并填写问卷就行了,很简单。
注意:必须选择和你安装的CUDA匹配的版本,我这里选中12.0.1版本的。
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.0
1 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.0\bin
2 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.0\include
3 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.0\lib
4 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.0\libnvvp
-验证: win+R cmd进入安装目录下,再进入到 extras\demo_suite下,执行.\bandwidthTest.exe和.\deviceQuery.exe,得到下图。
pip install torch==1.13.1+cu116 torchvision==0.14.1+cu116 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu116
1.下载github源码
2.解压源码
3.进入解压的ultralytics-main文件夹
4.执行pip install -e . (-e . 参数必须要有,否则后续修改代码无效)
安装好之后,使用 pip list 查看
后边的后缀表示这个包的源码在哪个位置
可能会出现的问题:ERROR: Cannot uninstall ‘TBB’. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
先进入ultralytics-main目录,然后激活环境
conda activate yolov8
再执行命令
#这个命令需要下载模型,网络不稳定可能需要科学上网
yolo predict model=yolov8n.pt source=ultralytics/assets/bus.jpg
因为此前已经创建过虚拟环境了,激活环境conda activate yolov8
from ultralytics import YOLO
yolo = YOLO("./yolov8n.pt" ,task = "detect")
# result=yolo(source="./ultralytics/assets/bus.jpg")#对图片进行检测/这里也可以是视频
# result=yolo(source="screen")#对屏幕进行检测
# result=yolo(source=0)#对摄像头进行检测
# result=yolo(source="./ultralytics/assets/bus.jpg",save=True)#save=True 对检测结果保存
result=yolo(source="./ultralytics/assets/bus.jpg",save=True)
YOLOv8现在可以接受输入很多,如下表所示。包括图像、URL、PIL图像、OpenCV、NumPy数组、Torch张量、CSV文件、视频、目录、通配符、YouTube视频和视频流。表格✅指示了每个输入源是否可以在流模式下使用,并给出了每个输入源使用流模式的示例参数
预测参数
Key | Value | Description |
---|---|---|
source | ‘ultralytics/assets’ | source directory for images or videos |
conf | 0.25 | object confidence threshold for detection |
iou | 0.7 | intersection over union (IoU) threshold for NMS |
half | FALSE | use half precision (FP16) |
device | None | device to run on, i.e. cuda device=0/1/2/3 or device=cpu |
show | FALSE | show results if possible |
save | FALSE | save images with results |
save_txt | FALSE | save results as .txt file |
save_conf | FALSE | save results with confidence scores |
save_crop | FALSE | save cropped images with results |
hide_labels | FALSE | hide labels |
hide_conf | FALSE | hide confidence scores |
max_det | 300 | maximum number of detections per image |
vid_stride | FALSE | video frame-rate stride |
line_width | None | The line width of the bounding boxes. If None, it is scaled to the image size. |
visualize | FALSE | visualize model features |
augment | FALSE | apply image augmentation to prediction sources |
agnostic_nms | FALSE | class-agnostic NMS |
retina_masks | FALSE | use high-resolution segmentation masks |
classes | None | filter results by class, i.e. class=0, or class=[0,2,3] |
boxes | TRUE | Show boxes in segmentation predictions |
下面是每个参数的解释:
这里以视频为例,将视频抽帧处理
import cv2
video = cv2.VideoCapture("./001.mp4")
num=0#计数器
save_setp=30#间隔帧数
while True:
ret,frame=video.read()
if not ret:
break
num+=1
if num%save_setp==0:
cv2.imwrite("./img/"+str(num)+".jpg",frame)
环境安装:pip install labelimg
启动:labelimg
此前打标签时导入的文件夹就是训练集,输出结果就是验证集,无非是把目录结构按上述更改一下
源码下载地址: https://github.com/ultralytics/ultralytics
参数说明:
yolo task=detect mode=train model=./yolov8n.pt data="data.yaml" workers=1 epochs=50 batch=16
from ultralytics import YOLO
model = YOLO("yolov8n.pt")
model.train(data="yolo-bvn.yaml",workers=0,batch=16,epochs=50)
模型训练结果会保存至runs目录下
::: tip
模型存储在weights文件夹下
best.pt:是训练出的最好的模型
last.pt:是最后面的模型,如果需要继续训练需要使用
:::
模型测试:
yolo detect predict model=runs/detect/train/weights/best.pt source=001.mp4 show=True
其中AppData是再当前用户目录下
这里把模型检测封装了一个工具类
import os
from datetime import datetime
import cv2
import keyboard
import pyautogui
from ultralytics import YOLO
class Yolov8Util:
yolo = None
flag=True #是否可以运行
def stop(self):
'''
停止运行方法,这里仅对视频和屏幕捕捉这两种方式生效
:return:
'''
self.flag = False
def __init__(self, pt_path):
'''
创建对象
:param pt_path: 模型pt文件路径
'''
self.yolo = YOLO(pt_path, task="detect")
# 绑定crtl+q退出检测
keyboard.add_hotkey('ctrl+q', lambda: self.stop())
def read_video(self, video_path, show=False,
detection_box_color=(0, 0, 225), text_color=(0, 0, 225), font_scale=0.5,
thickness=2, conf_val=0.25, save_path=None, callback=None,
callback_args_dict={}):
'''
读取视频
:param video_path: 视频路径.可以是网络路径,如果为 video_path=0则开启设备默认摄像头
:param conf_val:置信度
:param detection_box_color:矩形边框的颜色,格式为 BGR。格式 (0, 0, 225)
:param text_color:提示文字的颜色,格式为 BGR。格式 (0, 0, 225)
:param font_scale: 字体大小
:param thickness: 线条的粗细,如果是负数,则表示填充。
:param show:是否展示到屏幕
:param save_path: 结果保存文件夹路径,不指定则不保存,只有检测到目标才会保存
:param callback: 回调函数,该回调会将计算好的 【x1,y1,x2,y2坐标与标签名和置信度、原始图片】封装为数组列表传入,回调函数必须指定另一个字典,如这样定义:def call_fun1(results,args_dict):
:param callback_args_dict: 传入回调函数的其他参数,以字典封装
:return:
'''
cap = cv2.VideoCapture(video_path)
self.flag=True
while self.flag:
# 读取一帧图像
ret, frame = cap.read()
if not ret:
break
ann = frame
results = self.yolo(source=frame, show=False, save=False, conf=conf_val)
for result in results:
# 终止程序
if self.flag == False:
return
result_list = []
for item in result:
try:
# 解析检测结果
name = item.names[item.boxes.cls.item()]
conf = item.boxes.conf[0].item()
x1 = int(item.boxes.xyxy[0][0].item())
y1 = int(item.boxes.xyxy[0][1].item())
x2 = int(item.boxes.xyxy[0][2].item())
y2 = int(item.boxes.xyxy[0][3].item())
# 构建返回结果
list_item = [x1, y1, x2, y2, name, conf, ann]
result_list.append(list_item)
# 绘制检测框
cv2.rectangle(frame, (x1, y1), (x2, y2), detection_box_color, thickness)
cv2.putText(frame, f'{name} {conf:.2f}', (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, font_scale,
text_color, thickness)
except IndexError as e:
continue
# cv2.imshow("yolo检测结果", frame)
if show:
cv2.imshow("yolo检测结果", frame)
cv2.waitKey(1) # 延迟一秒 否则不显示
# 判断是否需要保存
if save_path is not None and len(result_list) > 0:
# 获取当前时间(包含微秒)
current_time = datetime.now()
milliseconds = current_time.microsecond // 1000
formatted_time = current_time.strftime("%Y-%m-%d %H-%M-%S-") + f"{milliseconds:03}"
new_save_path = f"{save_path}\\{formatted_time}.jpg"
cv2.imwrite(new_save_path, frame)
print(f"保存检测结果到{new_save_path}")
# 判断是否有回调函数
if callback is not None:
callback(result_list, callback_args_dict)
# 释放摄像头并关闭窗口
cap.release()
cv2.destroyAllWindows()
def read_picture(self, img_path, show=False,
detection_box_color=(0, 0, 225), text_color=(0, 0, 225), font_scale=0.5,
thickness=2, conf_val=0.25, save_path=None, callback=None,
callback_args_dict={}):
'''
读取图片
:param img_path: 图片路径.可以是网络路径
:param conf_val: 置信度
:param detection_box_color:矩形边框的颜色,格式为 BGR。格式 (0, 0, 225)
:param text_color:提示文字的颜色,格式为 BGR。格式 (0, 0, 225)
:param font_scale: 字体大小
:param thickness: 线条的粗细,如果是负数,则表示填充。
:param show:是否展示到屏幕
:param save_path: 结果保存文件夹路径,不指定则不保存
:param callback: 回调函数,该回调会将计算好的 【x1,y1,x2,y2坐标与标签名和置信度、原始图片】封装为数组列表传入,回调函数必须指定另一个字典,如这样定义:def call_fun1(results,args_dict):
:param callback_args_dict: 传入回调函数的其他参数,以字典封装
:return: [x1,y1,x2,y2,检测标签、置信度,原始图像]
'''
img = cv2.imread(img_path)
results = self.yolo(source=img, show=False, save=False, conf=conf_val)
result_list = []
ann = img
for result in results:
for item in result:
try:
# 解析检测结果
name = item.names[item.boxes.cls.item()]
conf = item.boxes.conf[0].item()
x1 = int(item.boxes.xyxy[0][0].item())
y1 = int(item.boxes.xyxy[0][1].item())
x2 = int(item.boxes.xyxy[0][2].item())
y2 = int(item.boxes.xyxy[0][3].item())
# 构建返回结果
list_item = [x1, y1, x2, y2, name, conf, ann]
result_list.append(list_item)
# 绘制检测框
cv2.rectangle(img, (x1, y1), (x2, y2), detection_box_color, thickness)
cv2.putText(img, f'{name} {conf:.2f}', (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, font_scale,
text_color, thickness)
except IndexError as e:
continue
# 判断是否需要保存
if save_path is not None and len(result_list) > 0:
# 获取当前时间(包含微秒)
current_time = datetime.now()
milliseconds = current_time.microsecond // 1000
formatted_time = current_time.strftime("%Y-%m-%d %H-%M-%S-") + f"{milliseconds:03}"
new_save_path = f"{save_path}\\{formatted_time}.jpg"
cv2.imwrite(new_save_path, img)
print(f"保存检测结果到{new_save_path}")
if show:
cv2.imshow("yolo检测结果", img)
# 判断是否有回调函数
if callback is not None:
callback(result_list, callback_args_dict)
return result_list
def read_screen(self, show=False,
detection_box_color=(0, 0, 225), text_color=(0, 0, 225), font_scale=0.5,
thickness=2, conf_val=0.25, save_path=None, callback=None,
callback_args_dict={}):
'''
读取屏幕
:param conf_val: 置信度
:param detection_box_color:矩形边框的颜色,格式为 BGR。格式 (0, 0, 225)
:param text_color:提示文字的颜色,格式为 BGR。格式 (0, 0, 225)
:param font_scale: 字体大小
:param thickness: 线条的粗细,如果是负数,则表示填充。
:param show:是否展示到屏幕
:param save_path: 结果保存文件夹路径,不指定则不保存
:param callback: 回调函数,该回调会将计算好的 【x1,y1,x2,y2坐标与标签名和置信度、原始图片】封装为数组列表传入,回调函数必须指定另一个字典,如这样定义:def call_fun1(results,args_dict):
:param callback_args_dict: 传入回调函数的其他参数,以字典封装
:return: [x1,y1,x2,y2,检测标签、置信度,原始图像]
'''
self.flag = True
while self.flag:
# 截取屏幕图片
im = pyautogui.screenshot()
im.save('screen.jpg')
img = cv2.imread("screen.jpg")
os.remove("screen.jpg")
results = self.yolo(source=img, show=False, save=False, conf=conf_val)
result_list = []
ann = img
for result in results:
# 终止程序
if self.flag == False:
return
for item in result:
try:
# 解析检测结果
name = item.names[item.boxes.cls.item()]
conf = item.boxes.conf[0].item()
x1 = int(item.boxes.xyxy[0][0].item())
y1 = int(item.boxes.xyxy[0][1].item())
x2 = int(item.boxes.xyxy[0][2].item())
y2 = int(item.boxes.xyxy[0][3].item())
# 构建返回结果
list_item = [x1, y1, x2, y2, name, conf, ann]
result_list.append(list_item)
# 绘制检测框
cv2.rectangle(img, (x1, y1), (x2, y2), detection_box_color, thickness)
cv2.putText(img, f'{name} {conf:.2f}', (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, font_scale,
text_color, thickness)
except IndexError as e:
continue
# 判断是否需要保存
if save_path is not None and len(result_list) > 0:
# 获取当前时间(包含微秒)
current_time = datetime.now()
milliseconds = current_time.microsecond // 1000
formatted_time = current_time.strftime("%Y-%m-%d %H-%M-%S-") + f"{milliseconds:03}"
new_save_path = f"{save_path}\\{formatted_time}.jpg"
cv2.imwrite(new_save_path, img)
print(f"保存检测结果到{new_save_path}")
if show:
cv2.imshow("yolo检测结果", img)
cv2.waitKey(1) # 延迟一秒 否则不显示
# 判断是否有回调函数
if callback is not None:
callback(result_list, callback_args_dict)
def func1(list, dict):
print(list)
print(dict)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。