环境配置
前文
github获取yolov8
github链接
https://github.com/ultralytics/ultralytics.git
环境配置
pip install ultralytics
CUDA配置
如果没有安装英伟达驱动你需要安装nvidia驱动建议最新版
https://www.nvidia.cn/geforce/drivers/
安装好驱动后需要安装一个工具CUDA TOOLKIT
https://developer.nvidia.com/cuda-toolkit
需要用到CUDA训练所以需要下载一个CUDA的另一个工具cuDNN
这里具体引用别人的方法
数据集的准备
这里我们需要创建dataset文件夹,yolov8.yaml和dataset.yaml
其中dataset文件夹下面需要再建立2个文件一个是images和labels
dataset文件夹资源分布
├─images
│ ├─train
| | ├─ 001.jpg #用于训练的图片
| | ├─ 002.jpg
| | └─ ......
│ └─val
└─labels
├─train
| ├─ 001.txt #导出的标记数据
| ├─ 002.txt
| └─ ......
└─val
数据标记
这里运用的是X-AnyLabeling
建议是git到pycharm里面运行
命令行输入
python anylabeling/app.py
打开文件,选择视频文件
框的部分是选择获取的频率,建议越大越好,越大图片越清晰
框完后需要创建一个txt文件里面放置标签
按标记的顺序发放至置
软件会自动生成一个
labels文件
里面包含图片文件和文本文件
图片文件复制到images里面的train里面文本文件放到val文件里面
再把images文件里面的train文件和val文件复制到labels文件里面
配置yaml文件
dataset.yaml文件、# 这里的路径是相对与运行目录(一般为train.py程序)的路径,如不清楚如何填写,建议填写绝对路径,参考如下:
# train: C:/Users/your_username/PycharmProjects/yolov5/source/images/train
# val: C:/Users/your_username/PycharmProjects/yolov5/source/images/val
train: ./source/images/train
val: ./source/images/val
# nc为种类数量
nc: 1
# 名称,classes.txt,X-AnyLabeling中的群组编号顺序对应
names:
0: 'A meng'
# 1: 'other'
# 2: ......
训练
先下载你需要的预训练模型
Releases · ultralytics/assets · GitHub
在pycharm命令行输入
yolo task=detect mode=train model=yolov8.pt data=dataset.yaml epochs=1000 batch=16
以上参数解释如下:
task:选择任务类型,可选['detect', 'segment', 'classify', 'init']
mode: 选择是训练、验证还是预测的任务蕾西 可选['train', 'val', 'predict']
model: 选择yolov8不同的模型配置文件,可选yolov8s.pt、yolov8m.pt、yolov8l.pt、yolov8x.pt
data: 选择生成的数据集配置文件
epochs:指的就是训练次数,训练次数过多会过拟合,同时过多也会导致训练时间增加
batch:差不多是通道的意思,一次性加载图片的数量如果过大会导致电脑死机黑屏
使用训练好的模型
训练完成得到.pt文件这文件就是模型文件
import cv2 as cv
from ultralytics import YOLO
import time
class yzh_detect:
class __results__:
def __init__(self):
self.name = []
self.x = []
self.y = []
self.confidence = []
self.image = None
def __init__(self, model_path):
# 加载模型
self.model = YOLO(model_path)
print(f"Model loaded from: {model_path}")
self.is_detecting = False
def detect(self, image):
'''
检测图像中的物体
:param image: 输入图像
:return: 结果类结构
result.name: 物体名称列表
result.x: 物体中心点x坐标列表
result.y: 物体中心点y坐标列表
result.confidence: 物体置信度列表
result.image: 检测后的图像
'''
if self.is_detecting:
return None
self.is_detecting = True
results = self.model(image, augment=True)
# 存储检测结果的列表
result = self.__results__()
# 遍历检测结果
try:
for *xyxy, conf, cls in results[0].boxes.data:
label = f'{self.model.names[int(cls)]} {conf:.2f}'
# 画出矩形框
cv.rectangle(image, (int(xyxy[0]), int(xyxy[1])), (int(xyxy[2]), int(xyxy[3])), (0, 0, 255), 2)
cv.putText(image, label, (int(xyxy[0]), int(xyxy[1]) - 10), cv.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 255),
2)
# 计算中心点坐标
center_x = int((xyxy[0] + xyxy[2]) / 2)
center_y = int((xyxy[1] + xyxy[3]) / 2)
# 画出中心点
cv.circle(image, (center_x, center_y), 5, (255, 0, 0), -1)
# 存储中心点坐标,物体名称,置信度和图像
result.name.append(self.model.names[int(cls)])
result.x.append(center_x)
result.y.append(center_y)
result.confidence.append(float(conf))
result.image = image
except Exception as e:
print("未检测到物体或发生错误:", e)
self.is_detecting = False
return result
if __name__ == "__main__":
# 加载自定义训练的YOLOv8模型
model_path = 'best.pt'
detector = yzh_detect(model_path)
# 打开摄像头
cap = cv.VideoCapture(1) ##打开摄像头
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# 检测物体
results = detector.detect(frame)
# 显示结果图像
if results and results.image is not None:
cv.imshow('YOLOv8 Real-time Object Detection', results.image)
# 退出条件
if cv.waitKey(1) & 0xFF == ord('q'):
break
# 清理工作
cap.release()
cv.destroyAllWindows()