🥇 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连
🎉 声明: 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️
文章目录
- 📙 Mac 电脑 配置 yolov8 环境
- 📙 代码运行
- 推理测试
- 模型训练 - 转 onnx
- 视频-目标检测
- 调用 Mac 电脑摄像头
- PersistingTracksLoop 持续目标跟踪
- Plotting Tracks 画轨迹
- Multithreaded Tracking - 多线程运行示例
- 📙 YOLO 系列实战博文汇总如下
- 🟦 YOLO 理论讲解学习篇
- 🟧 Yolov5 系列
- 🟨 YOLOX 系列
- 🟦 Yolov3 系列
- 🟨 YOLOX 系列
- 🟦 持续补充更新
- ❤️ 人生苦短, 欢迎和墨理一起学AI
📙 Mac 电脑 配置 yolov8 环境
- YOLO 推理测试、小数据集训练,基础版 Mac 即可满足
- 博主这里代码运行的 Mac 版本为 M1 Pro
conda 环境搭建步骤如下
conda create -n yolopy39 python=3.9
conda activate yolopy39pip3 install torch torchvision torchaudio# ultralytics 对 opencv-python 的版本需求如下
pip3 install opencv-python>=4.6.0
# 因此我选择安装的版本如下
pip3 install opencv-python==4.6.0.66cd Desktopmkdir molicd moligit clone https://github.com/ultralytics/ultralytics.git
pip install -e .pwd
/Users/moli/Desktop/moli/ultralytics
📙 代码运行
代码运行主要参考如下两个官方教程
- https://github.com/ultralytics/ultralytics
- https://docs.ultralytics.com/modes/track/#persisting-tracks-loop
推理测试
yolo predict model=yolov8n.pt source='https://ultralytics.com/images/bus.jpg'
yolo predict model=yolov8n.pt source='https://ultralytics.com/images/bus.jpg'
# 输出如下
Matplotlib is building the font cache; this may take a moment.
Downloading https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8n.pt to 'yolov8n.pt'...
100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 6.25M/6.25M [01:34<00:00, 69.6kB/s]
Ultralytics YOLOv8.2.77 🚀 Python-3.9.19 torch-2.2.2 CPU (Apple M1 Pro)
[W NNPACK.cpp:64] Could not initialize NNPACK! Reason: Unsupported hardware.
YOLOv8n summary (fused): 168 layers, 3,151,904 parameters, 0 gradients, 8.7 GFLOPsDownloading https://ultralytics.com/images/bus.jpg to 'bus.jpg'...
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 134k/134k [00:00<00:00, 470kB/s]
image 1/1 /Users/moli/Desktop/moli/ultralytics/bus.jpg: 640x480 4 persons, 1 bus, 1 stop sign, 221.3ms
Speed: 5.8ms preprocess, 221.3ms inference, 4.0ms postprocess per image at shape (1, 3, 640, 480)
Results saved to /Users/moli/Desktop/moli/ultralytics/runs/detect/predict
模型训练 - 转 onnx
vim train_test.py
from ultralytics import YOLO# Load a model
model = YOLO("yolov8n.yaml") # build a new model from scratch
model = YOLO("yolov8n.pt") # load a pretrained model (recommended for training)# Use the model
model.train(data="coco8.yaml", epochs=3) # train the model
metrics = model.val() # evaluate model performance on the validation set
results = model("https://ultralytics.com/images/bus.jpg") # predict on an image# 转换 onnx 也是封装好的模块,这里调用传参即可
path = model.export(format="onnx") # export the model to ONNX format
运行输出如下
python train_test.py [W NNPACK.cpp:64] Could not initialize NNPACK! Reason: Unsupported hardware.
Ultralytics YOLOv8.2.77 🚀 Python-3.9.19 torch-2.2.2 CPU (Apple M1 Pro)
engine/trainer: task=detect, mode=train, model=yolov8n.pt, data=coco8.yaml, epochs=3, time=None, patience=100, batch=16, imgsz=640, save=True, save_period=-1, cache=False, device=None, workers=8, project=None, name=train, exist_ok=False, pretrained=True, optimizer=auto, verbose=True, seed=0, deterministic=True, single_cls=False, rect=False, cos_lr=False, close_mosaic=10, resume=False, amp=True, fraction=1.0, profile=False, freeze=None, multi_scale=False, overlap_mask=True, mask_ratio=4, dropout=0.0, val=True, split=val, save_json=False, save_hybrid=False, conf=None, iou=0.7, max_det=300, half=False, dnn=False, plots=True, source=None, vid_stride=1, stream_buffer=False, visualize=False, augment=False, agnostic_nms=False, classes=None, retina_masks=False, embed=None, show=False, save_frames=False, save_txt=False, save_conf=False, save_crop=False, show_labels=True, show_conf=True, show_boxes=True, line_width=None, format=torchscript, keras=False, optimize=False, int8=False, dynamic=False, simplify=False, opset=None, workspace=4, nms=False, lr0=0.01, lrf=0.01, momentum=0.937, weight_decay=0.0005, warmup_epochs=3.0, warmup_momentum=0.8, warmup_bias_lr=0.1, box=7.5, cls=0.5, dfl=1.5, pose=12.0, kobj=1.0, label_smoothing=0.0, nbs=64, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, degrees=0.0, translate=0.1, scale=0.5, shear=0.0, perspective=0.0, flipud=0.0, fliplr=0.5, bgr=0.0, mosaic=1.0, mixup=0.0, copy_paste=0.0, auto_augment=randaugment, erasing=0.4, crop_fraction=1.0, cfg=None, tracker=botsort.yaml, save_dir=/Users/moli/Desktop/moli/ultralytics/runs/detect/trainDataset 'coco8.yaml' images not found ⚠️, missing path '/Users/moli/Desktop/moli/datasets/coco8/images/val'
Downloading https://ultralytics.com/assets/coco8.zip to '/Users/moli/Desktop/moli/datasets/coco8.zip'...
100%|███████████████████████████████████████████████████████████████████████████████████████████| 433k/433k [00:03<00:00, 135kB/s]
Unzipping /Users/moli/Desktop/moli/datasets/coco8.zip to /Users/moli/Desktop/moli/datasets/coco8...: 100%|██████████| 25/25 [00:00
Dataset download success ✅ (5.4s), saved to /Users/moli/Desktop/moli/datasets...
...Logging results to /Users/moli/Desktop/moli/ultralytics/runs/detect/train
Starting training for 3 epochs...Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size1/3 0G 1.412 2.815 1.755 22 640: 100%|██████████| 1/1 [00:01<00:00, 1.90s/it]Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 1/1 [00:00<00:00, 1.30all 4 17 0.613 0.883 0.888 0.616Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size2/3 0G 1.249 2.621 1.441 23 640: 100%|██████████| 1/1 [00:01<00:00, 1.51s/it]Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 1/1 [00:00<00:00, 2.24all 4 17 0.598 0.896 0.888 0.618Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size3/3 0G 1.142 4.221 1.495 16 640: 100%|██████████| 1/1 [00:01<00:00, 1.50s/it]Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 1/1 [00:00<00:00, 2.06all 4 17 0.58 0.833 0.874 0.6133 epochs completed in 0.002 hours.
Optimizer stripped from /Users/moli/Desktop/moli/ultralytics/runs/detect/train/weights/last.pt, 6.5MB
Optimizer stripped from /Users/moli/Desktop/moli/ultralytics/runs/detect/train/weights/best.pt, 6.5MBValidating /Users/moli/Desktop/moli/ultralytics/runs/detect/train/weights/best.pt...
Ultralytics YOLOv8.2.77 🚀 Python-3.9.19 torch-2.2.2 CPU (Apple M1 Pro)
Model summary (fused): 168 layers, 3,151,904 parameters, 0 gradients, 8.7 GFLOPsClass Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 1/1 [00:00<00:00, 1.72all 4 17 0.599 0.898 0.888 0.618person 3 10 0.647 0.5 0.52 0.29dog 1 1 0.315 1 0.995 0.597horse 1 2 0.689 1 0.995 0.598elephant 1 2 0.629 0.887 0.828 0.332umbrella 1 1 0.539 1 0.995 0.995potted plant 1 1 0.774 1 0.995 0.895
Speed: 4.2ms preprocess, 134.0ms inference, 0.0ms loss, 0.8ms postprocess per image
Results saved to /Users/moli/Desktop/moli/ultralytics/runs/detect/train
Ultralytics YOLOv8.2.77 🚀 Python-3.9.19 torch-2.2.2 CPU (Apple M1 Pro)
Model summary (fused): 168 layers, 3,151,904 parameters, 0 gradients, 8.7 GFLOPs
val: Scanning /Users/moli/Desktop/moli/datasets/coco8/labels/val.cache... 4 images, 0 backgrounds, 0 corrupt: 100%|██████████| 4/4Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 1/1 [00:00<00:00, 2.02all 4 17 0.599 0.898 0.888 0.618person 3 10 0.647 0.5 0.52 0.29dog 1 1 0.315 1 0.995 0.597horse 1 2 0.689 1 0.995 0.598elephant 1 2 0.629 0.887 0.828 0.332umbrella 1 1 0.539 1 0.995 0.995potted plant 1 1 0.774 1 0.995 0.895
Speed: 4.1ms preprocess, 113.0ms inference, 0.0ms loss, 0.7ms postprocess per image
Results saved to /Users/moli/Desktop/moli/ultralytics/runs/detect/train2image 1/1 /Users/moli/Desktop/moli/ultralytics/ultralytics/assets/bus.jpg: 640x480 4 persons, 1 bus, 188.4ms
Speed: 3.9ms preprocess, 188.4ms inference, 1.0ms postprocess per image at shape (1, 3, 640, 480)
Ultralytics YOLOv8.2.77 🚀 Python-3.9.19 torch-2.2.2 CPU (Apple M1 Pro)# 开始模型转换PyTorch: starting from '/Users/moli/Desktop/moli/ultralytics/runs/detect/train/weights/best.pt' with input shape (1, 3, 640, 640) BCHW and output shape(s) (1, 84, 8400) (6.2 MB)
requirements: Ultralytics requirement ['onnx>=1.12.0'] not found, attempting AutoUpdate...Looking in indexes: http://pypi.douban.com/simple, http://mirrors.aliyun.com/pypi/simple/, https://pypi.tuna.tsinghua.edu.cn/simple/, http://pypi.mirrors.ustc.edu.cn/simple/
Collecting onnx>=1.12.0Downloading http://mirrors.ustc.edu.cn/pypi/packages/4e/35/abbf2fa3dbb96b430f6e810e3fb7bc042ed150f371cb1aedb47052c40f8e/onnx-1.16.2-cp39-cp39-macosx_11_0_universal2.whl (16.5 MB)━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 16.5/16.5 MB 11.4 MB/s eta 0:00:00
Requirement already satisfied: numpy>=1.20 in /Users/moli/opt/anaconda3/envs/yolopy39/lib/python3.9/site-packages (from onnx>=1.12.0) (1.26.4)
Collecting protobuf>=3.20.2 (from onnx>=1.12.0)Downloading http://mirrors.ustc.edu.cn/pypi/packages/ca/bc/bceb11aa96dd0b2ae7002d2f46870fbdef7649a0c28420f0abb831ee3294/protobuf-5.27.3-cp38-abi3-macosx_10_9_universal2.whl (412 kB)
Installing collected packages: protobuf, onnx
Successfully installed onnx-1.16.2 protobuf-5.27.3requirements: AutoUpdate success ✅ 22.0s, installed 1 package: ['onnx>=1.12.0']
requirements: ⚠️ Restart runtime or rerun command for updates to take effectONNX: starting export with onnx 1.16.2 opset 17...
ONNX: export success ✅ 24.4s, saved as '/Users/moli/Desktop/moli/ultralytics/runs/detect/train/weights/best.onnx' (12.2 MB)Export complete (26.1s)
Results saved to /Users/moli/Desktop/moli/ultralytics/runs/detect/train/weights
Predict: yolo predict task=detect model=/Users/moli/Desktop/moli/ultralytics/runs/detect/train/weights/best.onnx imgsz=640
Validate: yolo val task=detect model=/Users/moli/Desktop/moli/ultralytics/runs/detect/train/weights/best.onnx imgsz=640 data=/Users/moli/Desktop/moli/ultralytics/ultralytics/cfg/datasets/coco8.yaml
Visualize: https://netron.app
可以看到运行成功、训练、转换 onnx 如下
ls runs/detect/train/ F1_curve.png R_curve.png confusion_matrix_normalized.png results.csv train_batch1.jpg val_batch0_pred.jpg
PR_curve.png args.yaml labels.jpg results.png train_batch2.jpg weights
P_curve.png confusion_matrix.png labels_correlogram.jpg train_batch0.jpg val_batch0_labels.jpg(yolopy39) moli@molideMacBook-Pro ultralytics % ls runs/detect/train/weights
best.onnx best.pt last.pt
视频-目标检测
cat yolov8_1.py
from ultralytics import YOLO# Load an official or custom model
model = YOLO("yolov8n.pt") # Load an official Detect model
#model = YOLO("yolov8n-seg.pt") # Load an official Segment model
#model = YOLO("yolov8n-pose.pt") # Load an official Pose model
#model = YOLO("path/to/best.pt") # Load a custom trained model# Perform tracking with the model
source = 'video/people.mp4'
results = model.track(source, show=True) # Tracking with default tracker
代码运行效果如下:
调用 Mac 电脑摄像头
source = 0 即可
from ultralytics import YOLO# Load an official or custom model
model = YOLO("yolov8n.pt") # Load an official Detect model#source = 'video/people.mp4'
source = 0
results = model.track(source, show=True) # Tracking with default tracker# results = model.track(source, show=True, tracker="bytetrack.yaml") # with ByteTrack
效果示例如下
PersistingTracksLoop 持续目标跟踪
- https://docs.ultralytics.com/modes/track/#tracker-selection
vim yolov8PersistingTracksLoop.py
import cv2from ultralytics import YOLO# Load the YOLOv8 model
model = YOLO("yolov8n.pt")# Open the video file
video_path = "./video/test_people.mp4"
cap = cv2.VideoCapture(video_path)# Loop through the video frames
while cap.isOpened():# Read a frame from the videosuccess, frame = cap.read()if success:# Run YOLOv8 tracking on the frame, persisting tracks between framesresults = model.track(frame, persist=True)# Visualize the results on the frameannotated_frame = results[0].plot()# Display the annotated framecv2.imshow("YOLOv8 Tracking", annotated_frame)# Break the loop if 'q' is pressedif cv2.waitKey(1) & 0xFF == ord("q"):breakelse:# Break the loop if the end of the video is reachedbreak# Release the video capture object and close the display window
cap.release()
cv2.destroyAllWindows()
python3 yolov8PersistingTracksLoop.py 运行效果如下
Plotting Tracks 画轨迹
vim yolov8PlottingTracks.py
from collections import defaultdictimport cv2
import numpy as npfrom ultralytics import YOLO# Load the YOLOv8 model
model = YOLO("yolov8n.pt")# Open the video file
video_path = "./video/test_people.mp4"
cap = cv2.VideoCapture(video_path)# Store the track history
track_history = defaultdict(lambda: [])# Loop through the video frames
while cap.isOpened():# Read a frame from the videosuccess, frame = cap.read()if success:# Run YOLOv8 tracking on the frame, persisting tracks between framesresults = model.track(frame, persist=True)# Get the boxes and track IDsboxes = results[0].boxes.xywh.cpu()track_ids = results[0].boxes.id.int().cpu().tolist()# Visualize the results on the frameannotated_frame = results[0].plot()# Plot the tracksfor box, track_id in zip(boxes, track_ids):x, y, w, h = boxtrack = track_history[track_id]track.append((float(x), float(y))) # x, y center pointif len(track) > 30: # retain 90 tracks for 90 framestrack.pop(0)# Draw the tracking linespoints = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))cv2.polylines(annotated_frame, [points], isClosed=False, color=(230, 230, 230), thickness=10)# Display the annotated framecv2.imshow("YOLOv8 Tracking", annotated_frame)# Break the loop if 'q' is pressedif cv2.waitKey(1) & 0xFF == ord("q"):breakelse:# Break the loop if the end of the video is reachedbreak# Release the video capture object and close the display window
cap.release()
cv2.destroyAllWindows()
python3 yolov8PlottingTracks.py 运行效果如下,可以看看行人后有轨迹
Multithreaded Tracking - 多线程运行示例
vim yolov8MultithreadedTracking.py
- 这里加载两个模型,运行两个线程,出现线程拥挤、导致无法弹窗,代码需要进一步修改
import threadingimport cv2from ultralytics import YOLOdef run_tracker_in_thread(filename, model, file_index):"""Runs a video file or webcam stream concurrently with the YOLOv8 model using threading.This function captures video frames from a given file or camera source and utilizes the YOLOv8 model for objecttracking. The function runs in its own thread for concurrent processing.Args:filename (str): The path to the video file or the identifier for the webcam/external camera source.model (obj): The YOLOv8 model object.file_index (int): An index to uniquely identify the file being processed, used for display purposes.Note:Press 'q' to quit the video display window."""video = cv2.VideoCapture(filename) # Read the video filewhile True:ret, frame = video.read() # Read the video frames# Exit the loop if no more frames in either videoif not ret:break# Track objects in frames if availableresults = model.track(frame, persist=True)res_plotted = results[0].plot()cv2.imshow(f"Tracking_Stream_{file_index}", res_plotted)key = cv2.waitKey(1)if key == ord("q"):break# Release video sourcesvideo.release()# Load the models
model1 = YOLO("yolov8n.pt")
model2 = YOLO("yolov8n-seg.pt")# Define the video files for the trackers
video_file1 = "video/test_people.mp4" # Path to video file, 0 for webcam
#video_file2 = 'video/test_traffic.mp4' # Path to video file, 0 for webcam, 1 for external camera
video_file2 = 0
# Create the tracker threads
tracker_thread1 = threading.Thread(target=run_tracker_in_thread, args=(video_file1, model1, 1), daemon=True)
tracker_thread2 = threading.Thread(target=run_tracker_in_thread, args=(video_file2, model2, 2), daemon=True)# Start the tracker threads
tracker_thread1.start()
tracker_thread2.start()# Wait for the tracker threads to finish
tracker_thread1.join()
tracker_thread2.join()# Clean up and close windows
cv2.destroyAllWindows()
📙 YOLO 系列实战博文汇总如下
🟦 YOLO 理论讲解学习篇
🟧 Yolov5 系列
- 💜 YOLOv5 环境搭建 | coco128 训练示例 |❤️ 详细记录❤️ |【YOLOv5】
- 💜 YOLOv5 COCO数据集 训练 | 【YOLOv5 训练】
🟨 YOLOX 系列
- 💛 YOLOX 环境搭建 | 测试 | COCO训练复现 【YOLOX 实战】
- 💛 YOLOX (pytorch)模型 ONNX export | 运行推理【YOLOX 实战二】
- 💛 YOLOX (pytorch)模型 转 ONNX 转 ncnn 之运行推理【YOLOX 实战三】
- 💛 YOLOX (pytorch)模型 转 tensorRT 之运行推理【YOLOX 实战四】
🟦 Yolov3 系列
- 💙 yolov3(darknet )训练 - 测试 - 模型转换❤️darknet 转 ncnn 之C++运行推理❤️【yolov3 实战一览】
- 💙 YOLOv3 ncnn 模型 yolov3-spp.cpp ❤️【YOLOv3之Ncnn推理实现———附代码】
🟨 YOLOX 系列
- Ubuntu 22.04 搭建 yolov8 环境 运行示例代码(轨迹跟踪、过线 人数统计、目标热力图)
🟦 持续补充更新
❤️ 人生苦短, 欢迎和墨理一起学AI
- 🎉 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️
- ❤️ 如果文章对你有些许帮助、蟹蟹各位读者大大点赞、评论鼓励博主的每一分认真创作