1. YOLOv8介绍
YOLOv8是Ultralytics公司2023年推出的Yolo系列目标检测算法,可以用于图像分类、物体检测和实例分割等任务。YOLOv8作为YOLO系列算法的最新成员,在损失函数、Anchor机制、样本分配策略等方面进行了全面优化和创新。这些改进不仅提高了模型的检测精度和鲁棒性,还简化了训练流程并提升了模型的可扩展性。
建立在Yolo系列历史版本的基础上,并引入了新的功能和改进点,以进一步提升性能和灵活性。其核心思想是将目标检测问题转化为一个回归问题,通过一次前向传播过程即可完成目标的位置和类别预测。Yolov8借鉴了Yolov5、Yolov6、YoloX等模型的设计优点,在全面提升改进Yolov5模型结构的基础上实现,同时保持了Yolov5工程化简洁易用的优势。YOLOv8 采用五个预训练模型,包括YOLOv8n、YOLOv8s、YOLOv8m、YOLOv8l和 YOLOv8x,其如下图2-7所示是基于COCO Val 2017数据集测试并对比Yolov8和Yolov5的mAP、参数量和FLOPs结果。由此可以看出,Yolov8相比Yolov5精度提升比较多,但是n/s/m模型参数量和flops增加不少,但是相比Yolov5大部分模型推理速度变慢了。
1.1 YOLOv8网络结构
YOLOv8模型网络结构图如下图所示。从YOLOv8的网络结构可以看出,其延用了YOLOv5的网络结构思想,网络还是分为三个部分: 基于CSP(紧凑和分离)的主干网络(backbone)、特征增强网络(neck),检测头(head) 三个部分。
2. 安装 PyTorch和 torchvision
YOLOv8是基于 PyTorch框架来实现的,所以在使用之前需要安装这两个框架,首先可以去官方网站上下载两个编译好的包进行安装,官方网站为:
https://download.pytorch.org/whl/torch_stable.html
找到torch-2.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl和
torchvision-0.16.2-cp311-cp311-linux_aarch64.whl文件,复制到树莓派对应的yolov8项目目录下,然后运行如下命令进行安装:
sudo pip3 install torch-2.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
sudo pip3 install torchvision-0.16.2-cp311-cp311-linux_aarch64.whl
安装成功后,检查一下安装是否成功。
如果报错的话,说明安装有问题,一般问题是 numpy版本过低,我们可以更新一下:
sudo pip3 install numpy --upgrade --ignore-installed
3. 安装环境所需的包
例如:pandas、opencv-python、tqdm等,都需要在虚拟环境下安装,如下所示。
(在虚拟环境中安装,专栏中 树莓派使用:YOLOv8环境搭建困难--已解决 文章会提到该问题)
4. 安全帽检测
4.1 识别图片
使用 Ultralytics提供的 YOLOv8 模型对指定图像进行目标检测。
from ultralytics import YOLO # 从 Ultralytics 库中导入 YOLO 类。这个类提供了一个方便的接口,用于加载 YOLO 模型并执行目标检测
# 导入训练好的模型
model=YOLO("./runs/detect/train5/weights/best.pt",task="detect")
# 随意找一些测试数据
# 图片数据和视频数据都可以,直接将数据传入接口
model.predict(source="./ultralytics/assets/construction-safety.jpg",save=True,classes=[0,2]) # 检测图片
# 自己构造一些数据
# 在识别自己的构造的数据时,传入了classes=[0,2] 只识别部分的类别
# 代表只输出0和2,也就是安全帽是否佩戴这个类别
识别结果如下所示,可识别出图片中所有的安全帽,并保存识别结果。
4.2 识别视频
使用 Ultralytics提供的 YOLOv8 模型对指定视频进行目标检测。
from ultralytics import YOLO # 从 Ultralytics 库中导入 YOLO 类。这个类提供了一个方便的接口,用于加载 YOLO 模型并执行目标检测
# 导入训练好的模型
model=YOLO("./runs/detect/train5/weights/best.pt",task="detect")
model.predict(source="./ultralytics/assets/indianworkers.mp4",classes=[0,2],save=True) # 检测视频