添加状态分类和液面分割
This commit is contained in:
@ -0,0 +1,69 @@
|
||||
# YOLOv8 with SAHI (Inference on Video)
|
||||
|
||||
[SAHI](https://docs.ultralytics.com/guides/sahi-tiled-inference/) is designed to optimize object detection algorithms for large-scale and high-resolution imagery. It partitions images into manageable slices, performs object detection on each slice, and then stitches the results back together. This tutorial will guide you through the process of running YOLOv8 inference on video files with the aid of SAHI.
|
||||
|
||||
## Table of Contents
|
||||
|
||||
- [Step 1: Install the Required Libraries](#step-1-install-the-required-libraries)
|
||||
- [Step 2: Run the Inference with SAHI using Ultralytics YOLOv8](#step-2-run-the-inference-with-sahi-using-ultralytics-yolov8)
|
||||
- [Usage Options](#usage-options)
|
||||
- [FAQ](#faq)
|
||||
|
||||
## Step 1: Install the Required Libraries
|
||||
|
||||
Clone the repository, install dependencies and `cd` to this local directory for commands in Step 2.
|
||||
|
||||
```bash
|
||||
# Clone ultralytics repo
|
||||
git clone https://github.com/ultralytics/ultralytics
|
||||
|
||||
# Install dependencies
|
||||
pip install sahi ultralytics
|
||||
|
||||
# cd to local directory
|
||||
cd ultralytics/examples/YOLOv8-SAHI-Inference-Video
|
||||
```
|
||||
|
||||
## Step 2: Run the Inference with SAHI using Ultralytics YOLOv8
|
||||
|
||||
Here are the basic commands for running the inference:
|
||||
|
||||
```bash
|
||||
#if you want to save results
|
||||
python yolov8_sahi.py --source "path/to/video.mp4" --save-img
|
||||
|
||||
#if you want to change model file
|
||||
python yolov8_sahi.py --source "path/to/video.mp4" --save-img --weights "yolov8n.pt"
|
||||
```
|
||||
|
||||
## Usage Options
|
||||
|
||||
- `--source`: Specifies the path to the video file you want to run inference on.
|
||||
- `--save-img`: Flag to save the detection results as images.
|
||||
- `--weights`: Specifies a different YOLOv8 model file (e.g., `yolov8n.pt`, `yolov8s.pt`, `yolov8m.pt`, `yolov8l.pt`, `yolov8x.pt`).
|
||||
|
||||
## FAQ
|
||||
|
||||
**1. What is SAHI?**
|
||||
|
||||
SAHI stands for Slicing Aided Hyper Inference. It is a library designed to optimize object detection algorithms for large-scale and high-resolution images. The library source code is available on [GitHub](https://github.com/obss/sahi).
|
||||
|
||||
**2. Why use SAHI with YOLOv8?**
|
||||
|
||||
SAHI can handle large-scale images by slicing them into smaller, more manageable sizes without compromising the detection quality. This makes it a great companion to YOLOv8, especially when working with high-resolution videos.
|
||||
|
||||
**3. How do I debug issues?**
|
||||
|
||||
You can add the `--debug` flag to your command to print out more information during inference:
|
||||
|
||||
```bash
|
||||
python yolov8_sahi.py --source "path to video file" --debug
|
||||
```
|
||||
|
||||
**4. Can I use other YOLO versions?**
|
||||
|
||||
Yes, you can specify different YOLO model weights using the `--weights` option.
|
||||
|
||||
**5. Where can I find more information?**
|
||||
|
||||
For a full guide to YOLOv8 with SAHI see [https://docs.ultralytics.com/guides/sahi-tiled-inference](https://docs.ultralytics.com/guides/sahi-tiled-inference/).
|
||||
@ -0,0 +1,106 @@
|
||||
# Ultralytics YOLO 🚀, AGPL-3.0 license
|
||||
|
||||
import argparse
|
||||
from pathlib import Path
|
||||
|
||||
import cv2
|
||||
from sahi import AutoDetectionModel
|
||||
from sahi.predict import get_sliced_prediction
|
||||
from sahi.utils.yolov8 import download_yolov8s_model
|
||||
|
||||
from ultralytics.utils.files import increment_path
|
||||
from ultralytics.utils.plotting import Annotator, colors
|
||||
|
||||
|
||||
class SAHIInference:
|
||||
"""Runs YOLOv8 and SAHI for object detection on video with options to view, save, and track results."""
|
||||
|
||||
def __init__(self):
|
||||
"""Initializes the SAHIInference class for performing sliced inference using SAHI with YOLOv8 models."""
|
||||
self.detection_model = None
|
||||
|
||||
def load_model(self, weights):
|
||||
"""Loads a YOLOv8 model with specified weights for object detection using SAHI."""
|
||||
yolov8_model_path = f"models/{weights}"
|
||||
download_yolov8s_model(yolov8_model_path)
|
||||
self.detection_model = AutoDetectionModel.from_pretrained(
|
||||
model_type="yolov8", model_path=yolov8_model_path, confidence_threshold=0.3, device="cpu"
|
||||
)
|
||||
|
||||
def inference(
|
||||
self, weights="yolov8n.pt", source="test.mp4", view_img=False, save_img=False, exist_ok=False, track=False
|
||||
):
|
||||
"""
|
||||
Run object detection on a video using YOLOv8 and SAHI.
|
||||
|
||||
Args:
|
||||
weights (str): Model weights path.
|
||||
source (str): Video file path.
|
||||
view_img (bool): Show results.
|
||||
save_img (bool): Save results.
|
||||
exist_ok (bool): Overwrite existing files.
|
||||
track (bool): Enable object tracking with SAHI
|
||||
"""
|
||||
# Video setup
|
||||
cap = cv2.VideoCapture(source)
|
||||
assert cap.isOpened(), "Error reading video file"
|
||||
frame_width, frame_height = int(cap.get(3)), int(cap.get(4))
|
||||
|
||||
# Output setup
|
||||
save_dir = increment_path(Path("ultralytics_results_with_sahi") / "exp", exist_ok)
|
||||
save_dir.mkdir(parents=True, exist_ok=True)
|
||||
video_writer = cv2.VideoWriter(
|
||||
str(save_dir / f"{Path(source).stem}.mp4"),
|
||||
cv2.VideoWriter_fourcc(*"mp4v"),
|
||||
int(cap.get(5)),
|
||||
(frame_width, frame_height),
|
||||
)
|
||||
|
||||
# Load model
|
||||
self.load_model(weights)
|
||||
while cap.isOpened():
|
||||
success, frame = cap.read()
|
||||
if not success:
|
||||
break
|
||||
annotator = Annotator(frame) # Initialize annotator for plotting detection and tracking results
|
||||
results = get_sliced_prediction(
|
||||
frame,
|
||||
self.detection_model,
|
||||
slice_height=512,
|
||||
slice_width=512,
|
||||
overlap_height_ratio=0.2,
|
||||
overlap_width_ratio=0.2,
|
||||
)
|
||||
detection_data = [
|
||||
(det.category.name, det.category.id, (det.bbox.minx, det.bbox.miny, det.bbox.maxx, det.bbox.maxy))
|
||||
for det in results.object_prediction_list
|
||||
]
|
||||
|
||||
for det in detection_data:
|
||||
annotator.box_label(det[2], label=str(det[0]), color=colors(int(det[1]), True))
|
||||
|
||||
if view_img:
|
||||
cv2.imshow(Path(source).stem, frame)
|
||||
if save_img:
|
||||
video_writer.write(frame)
|
||||
|
||||
if cv2.waitKey(1) & 0xFF == ord("q"):
|
||||
break
|
||||
video_writer.release()
|
||||
cap.release()
|
||||
cv2.destroyAllWindows()
|
||||
|
||||
def parse_opt(self):
|
||||
"""Parse command line arguments."""
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("--weights", type=str, default="yolov8n.pt", help="initial weights path")
|
||||
parser.add_argument("--source", type=str, required=True, help="video file path")
|
||||
parser.add_argument("--view-img", action="store_true", help="show results")
|
||||
parser.add_argument("--save-img", action="store_true", help="save results")
|
||||
parser.add_argument("--exist-ok", action="store_true", help="existing project/name ok, do not increment")
|
||||
return parser.parse_args()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
inference = SAHIInference()
|
||||
inference.inference(**vars(inference.parse_opt()))
|
||||
Reference in New Issue
Block a user