赞
踩
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的控制面板
下载地址:链接
选择自己对应的版本下载
安装时可以默认路径安装,按照提示进行安装即可
下载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 查看
后边的后缀表示这个包的源码在哪个位置
先进入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
此前打标签时导入的文件夹就是训练集,输出结果就是验证集,无非是把目录结构按上述更改一下
参数说明:
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 版权所有,并保留所有权利。