mirror of
https://github.com/THU-MIG/yolov10.git
synced 2025-05-23 13:34:23 +08:00
ultralytics 8.0.204
Segment ONNX Runtime example (#6088)
Signed-off-by: Glenn Jocher <glenn.jocher@ultralytics.com> Co-authored-by: Kapil Raj <103250862+raj-kapil@users.noreply.github.com> Co-authored-by: jamjamjon <51357717+jamjamjon@users.noreply.github.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: snyk-bot <snyk-bot@snyk.io>
This commit is contained in:
parent
465df3024f
commit
ff0aba10c5
@ -12,7 +12,7 @@ ADD https://ultralytics.com/assets/Arial.ttf https://ultralytics.com/assets/Aria
|
||||
# Install linux packages
|
||||
# g++ required to build 'tflite_support' and 'lap' packages, libusb-1.0-0 required for 'tflite_support' package
|
||||
RUN apt update \
|
||||
&& apt install --no-install-recommends -y gcc git zip curl htop libgl1-mesa-glx libglib2.0-0 libpython3-dev gnupg g++ libusb-1.0-0
|
||||
&& apt install --no-install-recommends -y gcc git zip curl htop libgl1 libglib2.0-0 libpython3-dev gnupg g++ libusb-1.0-0
|
||||
|
||||
# Security updates
|
||||
# https://security.snyk.io/vuln/SNYK-UBUNTU1804-OPENSSL-3314796
|
||||
|
@ -11,7 +11,7 @@ ADD https://ultralytics.com/assets/Arial.ttf https://ultralytics.com/assets/Aria
|
||||
# Install linux packages
|
||||
# g++ required to build 'tflite_support' and 'lap' packages, libusb-1.0-0 required for 'tflite_support' package
|
||||
RUN apt update \
|
||||
&& apt install --no-install-recommends -y python3-pip git zip curl htop gcc libgl1-mesa-glx libglib2.0-0 libpython3-dev gnupg g++ libusb-1.0-0
|
||||
&& apt install --no-install-recommends -y python3-pip git zip curl htop gcc libgl1 libglib2.0-0 libpython3-dev gnupg g++ libusb-1.0-0
|
||||
|
||||
# Create working directory
|
||||
WORKDIR /usr/src/ultralytics
|
||||
|
@ -10,7 +10,7 @@ ADD https://ultralytics.com/assets/Arial.ttf https://ultralytics.com/assets/Aria
|
||||
|
||||
# Install linux packages
|
||||
RUN apt update \
|
||||
&& apt install --no-install-recommends -y libgl1-mesa-glx
|
||||
&& apt install --no-install-recommends -y libgl1
|
||||
|
||||
# Copy contents
|
||||
ADD https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8n.pt .
|
||||
|
@ -3,7 +3,7 @@
|
||||
# Image is CPU-optimized for ONNX, OpenVINO and PyTorch YOLOv8 deployments
|
||||
|
||||
# Start FROM Ubuntu image https://hub.docker.com/_/ubuntu
|
||||
FROM ubuntu:23.04
|
||||
FROM ubuntu:mantic-20231011
|
||||
|
||||
# Downloads to user config dir
|
||||
ADD https://ultralytics.com/assets/Arial.ttf https://ultralytics.com/assets/Arial.Unicode.ttf /root/.config/Ultralytics/
|
||||
@ -11,7 +11,7 @@ ADD https://ultralytics.com/assets/Arial.ttf https://ultralytics.com/assets/Aria
|
||||
# Install linux packages
|
||||
# g++ required to build 'tflite_support' and 'lap' packages, libusb-1.0-0 required for 'tflite_support' package
|
||||
RUN apt update \
|
||||
&& apt install --no-install-recommends -y python3-pip git zip curl htop libgl1-mesa-glx libglib2.0-0 libpython3-dev gnupg g++ libusb-1.0-0
|
||||
&& apt install --no-install-recommends -y python3-pip git zip curl htop libgl1 libglib2.0-0 libpython3-dev gnupg g++ libusb-1.0-0
|
||||
|
||||
# Create working directory
|
||||
WORKDIR /usr/src/ultralytics
|
||||
|
@ -11,7 +11,7 @@ ADD https://ultralytics.com/assets/Arial.ttf https://ultralytics.com/assets/Aria
|
||||
# Install linux packages
|
||||
# g++ required to build 'tflite_support' and 'lap' packages, libusb-1.0-0 required for 'tflite_support' package
|
||||
RUN apt update \
|
||||
&& apt install --no-install-recommends -y gcc git zip curl htop libgl1-mesa-glx libglib2.0-0 libpython3-dev gnupg g++ libusb-1.0-0
|
||||
&& apt install --no-install-recommends -y gcc git zip curl htop libgl1 libglib2.0-0 libpython3-dev gnupg g++ libusb-1.0-0
|
||||
|
||||
# Create working directory
|
||||
WORKDIR /usr/src/ultralytics
|
||||
|
@ -11,7 +11,7 @@ ADD https://ultralytics.com/assets/Arial.ttf https://ultralytics.com/assets/Aria
|
||||
# Install linux packages
|
||||
# g++ required to build 'tflite_support' and 'lap' packages, libusb-1.0-0 required for 'tflite_support' package
|
||||
RUN apt update \
|
||||
&& apt install --no-install-recommends -y python3-pip git zip curl htop libgl1-mesa-glx libglib2.0-0 libpython3-dev gnupg g++ libusb-1.0-0
|
||||
&& apt install --no-install-recommends -y python3-pip git zip curl htop libgl1 libglib2.0-0 libpython3-dev gnupg g++ libusb-1.0-0
|
||||
|
||||
# Create working directory
|
||||
WORKDIR /usr/src/ultralytics
|
||||
|
@ -146,7 +146,7 @@ Tapping into a community of enthusiasts and experts can amplify your journey wit
|
||||
|
||||
### Engage with the Broader Community
|
||||
|
||||
- **GitHub Issues:** The YOLOv8 repository on GitHub has an [Issues tab](https://github.com/ultralytics/yolov8/issues) where you can ask questions, report bugs, and suggest new features. The community and maintainers are active here, and it’s a great place to get help with specific problems.
|
||||
- **GitHub Issues:** The YOLOv8 repository on GitHub has an [Issues tab](https://github.com/ultralytics/ultralytics/issues) where you can ask questions, report bugs, and suggest new features. The community and maintainers are active here, and it’s a great place to get help with specific problems.
|
||||
|
||||
- **Ultralytics Discord Server:** Ultralytics has a [Discord server](https://ultralytics.com/discord/) where you can interact with other users and the developers.
|
||||
|
||||
|
@ -1,18 +1,19 @@
|
||||
---
|
||||
comments: true
|
||||
description: Find comprehensive guides and documents on Ultralytics YOLO tasks. Includes FAQs, contributing guides, CI guide, CLA, MRE guide, code of conduct & more.
|
||||
keywords: Ultralytics, YOLO, guides, documents, FAQ, contributing, CI guide, CLA, MRE guide, code of conduct, EHS policy, security policy
|
||||
keywords: Ultralytics, YOLO, guides, documents, FAQ, contributing, CI guide, CLA, MRE guide, code of conduct, EHS policy, security policy, privacy policy
|
||||
---
|
||||
|
||||
Welcome to the Ultralytics Help page! We are committed to providing you with comprehensive resources to make your experience with Ultralytics YOLO repositories as smooth and enjoyable as possible. On this page, you'll find essential links to guides and documents that will help you navigate through common tasks and address any questions you might have while using our repositories.
|
||||
Welcome to the Ultralytics Help page! We are dedicated to providing you with detailed resources to enhance your experience with the Ultralytics YOLO models and repositories. This page serves as your portal to guides and documentation designed to assist you with various tasks and answer questions you may encounter while engaging with our repositories.
|
||||
|
||||
- [Frequently Asked Questions (FAQ)](FAQ.md): Find answers to common questions and issues faced by users and contributors of Ultralytics YOLO repositories.
|
||||
- [Contributing Guide](contributing.md): Learn the best practices for submitting pull requests, reporting bugs, and contributing to the development of our repositories.
|
||||
- [Continuous Integration (CI) Guide](CI.md): Understand the CI tests we perform for each Ultralytics repository and see their current statuses.
|
||||
- [Contributor License Agreement (CLA)](CLA.md): Familiarize yourself with our CLA to understand the terms and conditions for contributing to Ultralytics projects.
|
||||
- [Minimum Reproducible Example (MRE) Guide](minimum_reproducible_example.md): Understand how to create an MRE when submitting bug reports to ensure that our team can quickly and efficiently address the issue.
|
||||
- [Code of Conduct](code_of_conduct.md): Learn about our community guidelines and expectations to ensure a welcoming and inclusive environment for all participants.
|
||||
- [Environmental, Health and Safety (EHS) Policy](environmental-health-safety.md): Explore Ultralytics' dedicated approach towards maintaining a sustainable, safe, and healthy work environment for all our stakeholders.
|
||||
- [Security Policy](../SECURITY.md): Understand our security practices and how to report security vulnerabilities responsibly.
|
||||
- [Frequently Asked Questions (FAQ)](FAQ.md): Find answers to common questions and issues encountered by the community of Ultralytics YOLO users and contributors.
|
||||
- [Contributing Guide](contributing.md): Discover the protocols for making contributions, including how to submit pull requests, report bugs, and more.
|
||||
- [Continuous Integration (CI) Guide](CI.md): Gain insights into the CI processes we employ, complete with status reports for each Ultralytics repository.
|
||||
- [Contributor License Agreement (CLA)](CLA.md): Review the CLA to understand the rights and responsibilities associated with contributing to Ultralytics projects.
|
||||
- [Minimum Reproducible Example (MRE) Guide](minimum_reproducible_example.md): Learn the process for creating an MRE, which is crucial for the timely and effective resolution of bug reports.
|
||||
- [Code of Conduct](code_of_conduct.md): Our community guidelines support a respectful and open atmosphere for all collaborators.
|
||||
- [Environmental, Health and Safety (EHS) Policy](environmental-health-safety.md): Delve into our commitment to sustainability and the well-being of all our stakeholders.
|
||||
- [Security Policy](../SECURITY.md): Familiarize yourself with our security protocols and the procedure for reporting vulnerabilities.
|
||||
- [Privacy Policy](privacy.md): Read our privacy policy to understand how we protect your data and respect your privacy in all our services and operations.
|
||||
|
||||
We highly recommend going through these guides to make the most of your collaboration with the Ultralytics community. Our goal is to maintain a welcoming and supportive environment for all users and contributors. If you need further assistance, don't hesitate to reach out to us through GitHub Issues or the official discussion forum. Happy coding!
|
||||
We encourage you to review these resources for a seamless and productive experience. Our aim is to foster a helpful and friendly environment for everyone in the Ultralytics community. Should you require additional support, please feel free to reach out via GitHub Issues or our official discussion forums. Happy coding!
|
||||
|
131
docs/help/privacy.md
Normal file
131
docs/help/privacy.md
Normal file
@ -0,0 +1,131 @@
|
||||
---
|
||||
description: Learn about how Ultralytics collects and uses data to improve user experience, ensure software stability, and address privacy concerns, with options to opt-out.
|
||||
keywords: Ultralytics, Data Collection, User Privacy, Google Analytics, Snyk, Crash Reporting, Anonymized Data, Privacy Settings, Opt-Out
|
||||
---
|
||||
|
||||
# Data Collection for Ultralytics Python Package
|
||||
|
||||
## Overview
|
||||
|
||||
Ultralytics is dedicated to the continuous enhancement of the user experience and the capabilities of our Python package, including the advanced YOLO models we develop. Our approach involves the gathering of anonymized usage statistics and crash reports, helping us identify opportunities for improvement and ensuring the reliability of our software. This transparency document outlines what data we collect, its purpose, and the choice you have regarding this data collection.
|
||||
|
||||
## Anonymized Google Analytics
|
||||
|
||||
[Google Analytics](https://developers.google.com/analytics) is a web analytics service offered by Google that tracks and reports website traffic. It allows us to collect data about how our Python package is used, which is crucial for making informed decisions about design and functionality.
|
||||
|
||||
### What We Collect
|
||||
|
||||
- **Usage Metrics**: These metrics help us understand how frequently and in what ways the package is utilized, what features are favored, and the typical command-line arguments that are used.
|
||||
- **System Information**: We collect general non-identifiable information about your computing environment to ensure our package performs well across various systems.
|
||||
- **Performance Data**: Understanding the performance of our models during training, validation, and inference helps us in identifying optimization opportunities.
|
||||
|
||||
For more information about Google Analytics and data privacy, visit [Google Analytics Privacy](https://support.google.com/analytics/answer/6004245).
|
||||
|
||||
### How We Use This Data
|
||||
|
||||
- **Feature Improvement**: Insights from usage metrics guide us in enhancing user satisfaction and interface design.
|
||||
- **Optimization**: Performance data assist us in fine-tuning our models for better efficiency and speed across diverse hardware and software configurations.
|
||||
- **Trend Analysis**: By studying usage trends, we can predict and respond to the evolving needs of our community.
|
||||
|
||||
### Privacy Considerations
|
||||
|
||||
We take several measures to ensure the privacy and security of the data you entrust to us:
|
||||
|
||||
- **Anonymization**: We configure Google Analytics to anonymize the data collected, which means no personally identifiable information (PII) is gathered. You can use our services with the assurance that your personal details remain private.
|
||||
- **Aggregation**: Data is analyzed only in aggregate form. This practice ensures that patterns can be observed without revealing any individual user's activity.
|
||||
- **No Image Data Collection**: Ultralytics does not collect, process, or view any training or inference images.
|
||||
|
||||
## Snyk Crash Reporting
|
||||
|
||||
[Snyk](https://snyk.io/) is a developer-first security software that helps to identify, fix, and monitor known vulnerabilities in open-source dependencies. In the context of our package, it assists us by reporting crashes, which is vital for maintaining the stability and security of our software.
|
||||
|
||||
### What We Collect
|
||||
|
||||
- **Crash Logs**: Detailed reports on the application's condition at the time of a crash, which are vital for our debugging efforts.
|
||||
- **Error Messages**: We record error messages generated during the operation of our package to understand and resolve potential issues quickly.
|
||||
|
||||
To learn more about how Snyk handles data, please visit [Snyk's Privacy Policy](https://snyk.io/privacy/).
|
||||
|
||||
### How We Use This Data
|
||||
|
||||
- **Debugging**: Analyzing crash logs and error messages enables us to swiftly identify and correct software bugs.
|
||||
- **Stability Metrics**: By constantly monitoring for crashes, we aim to improve the stability and reliability of our package.
|
||||
|
||||
### Privacy Considerations
|
||||
|
||||
- **Sensitive Information**: We ensure that crash logs are scrubbed of any personally identifiable or sensitive user data, safeguarding the confidentiality of your information.
|
||||
- **Controlled Collection**: Our crash reporting mechanism is meticulously calibrated to gather only what is essential for troubleshooting while respecting user privacy.
|
||||
|
||||
By detailing the tools used for data collection and offering additional background information with URLs to their respective privacy pages, users are provided with a comprehensive view of our practices, emphasizing transparency and respect for user privacy.
|
||||
|
||||
## Disabling Data Collection
|
||||
|
||||
We believe in providing our users with full control over their data. By default, our package is configured to collect analytics and crash reports to help improve the experience for all users. However, we respect that some users may prefer to opt out of this data collection.
|
||||
|
||||
To opt out of sending analytics and crash reports, you can simply set `sync=False` in your YOLO settings. This ensures that no data is transmitted from your machine to our analytics tools.
|
||||
|
||||
### Inspecting Settings
|
||||
|
||||
To gain insight into the current configuration of your settings, you can view them directly:
|
||||
|
||||
!!! example "View settings"
|
||||
|
||||
=== "Python"
|
||||
You can use Python to view your settings. Start by importing the `settings` object from the `ultralytics` module. Print and return settings using the following commands:
|
||||
```python
|
||||
from ultralytics import settings
|
||||
|
||||
# View all settings
|
||||
print(settings)
|
||||
|
||||
# Return a specific setting
|
||||
value = settings['runs_dir']
|
||||
```
|
||||
|
||||
=== "CLI"
|
||||
Alternatively, the command-line interface allows you to check your settings with a simple command:
|
||||
```bash
|
||||
yolo settings
|
||||
```
|
||||
|
||||
### Modifying Settings
|
||||
|
||||
Ultralytics allows users to easily modify their settings. Changes can be performed in the following ways:
|
||||
|
||||
!!! example "Update settings"
|
||||
|
||||
=== "Python"
|
||||
Within the Python environment, call the `update` method on the `settings` object to change your settings:
|
||||
```python
|
||||
from ultralytics import settings
|
||||
|
||||
# Disable analytics and crash reporting
|
||||
settings.update({'sync': False})
|
||||
|
||||
# Reset settings to default values
|
||||
settings.reset()
|
||||
```
|
||||
|
||||
=== "CLI"
|
||||
If you prefer using the command-line interface, the following commands will allow you to modify your settings:
|
||||
```bash
|
||||
# Update a setting
|
||||
yolo settings sync=false
|
||||
|
||||
# Reset settings to default values
|
||||
yolo settings reset
|
||||
```
|
||||
|
||||
This will prevent any data from being sent to Google Analytics or Snyk. Your settings will be respected across all sessions using the Ultralytics package.
|
||||
|
||||
## Commitment to Privacy
|
||||
|
||||
Ultralytics takes user privacy seriously. We design our data collection practices with the following principles:
|
||||
|
||||
- **Transparency**: We are open about the data we collect and how it is used.
|
||||
- **Control**: We give users full control over their data.
|
||||
- **Security**: We employ industry-standard security measures to protect the data we collect.
|
||||
|
||||
## Questions or Concerns
|
||||
|
||||
If you have any questions or concerns about our data collection practices, please reach out to us via our [contact form](https://ultralytics.com/contact) or via [support@ultralytics.com](mailto:support@ultralytics.com). We are dedicated to ensuring our users feel informed and confident in their privacy when using our package.
|
@ -117,7 +117,7 @@ print(pipeline_outputs)
|
||||
If you are running in the cloud, you may get an error that open-cv cannot find `libGL.so.1`. Running the following on Ubuntu installs it:
|
||||
|
||||
```
|
||||
apt-get install libgl1-mesa-glx
|
||||
apt-get install libgl1
|
||||
```
|
||||
|
||||
#### HTTP Server
|
||||
|
@ -16,16 +16,19 @@ This repository features a collection of real-world applications and walkthrough
|
||||
| [RTDETR ONNXRuntime C#](https://github.com/Kayzwer/yolo-cs/blob/master/RTDETR.cs) | C#/ONNX | [Kayzwer](https://github.com/Kayzwer) |
|
||||
| [YOLOv8 SAHI Video Inference](https://github.com/RizwanMunawar/ultralytics/blob/main/examples/YOLOv8-SAHI-Inference-Video/yolov8_sahi.py) | Python | [Muhammad Rizwan Munawar](https://github.com/RizwanMunawar) |
|
||||
| [YOLOv8 Region Counter](https://github.com/RizwanMunawar/ultralytics/blob/main/examples/YOLOv8-Region-Counter/yolov8_region_counter.py) | Python | [Muhammad Rizwan Munawar](https://github.com/RizwanMunawar) |
|
||||
| [YOLOv8 Segmentation ONNXRuntime Python](./YOLOv8-Segmentation-ONNXRuntime-Python) | Python/ONNXRuntime | [jamjamjon](https://github.com/jamjamjon) |
|
||||
|
||||
### How to Contribute
|
||||
|
||||
We welcome contributions from the community in the form of examples, applications, and guides. To contribute, please follow these steps:
|
||||
We greatly appreciate contributions from the community, including examples, applications, and guides. If you'd like to contribute, please follow these guidelines:
|
||||
|
||||
1. Create a pull request (PR) with the `[Example]` prefix in the title, adding your project folder to the `examples/` directory in the repository.
|
||||
1. Ensure that your project meets the following criteria:
|
||||
- Utilizes the `ultralytics` package.
|
||||
- Includes a `README.md` file with instructions on how to run the project.
|
||||
- Avoids adding large assets or dependencies unless absolutely necessary.
|
||||
- The contributor is expected to provide support for issues related to their examples.
|
||||
1. Create a pull request (PR) with the title prefix `[Example]`, adding your new example folder to the `examples/` directory within the repository.
|
||||
1. Make sure your project adheres to the following standards:
|
||||
- Makes use of the `ultralytics` package.
|
||||
- Includes a `README.md` with clear instructions for setting up and running the example.
|
||||
- Refrains from adding large files or dependencies unless they are absolutely necessary for the example.
|
||||
- Contributors should be willing to provide support for their examples and address related issues.
|
||||
|
||||
If you have any questions or concerns about these requirements, please submit a PR, and we will be more than happy to guide you.
|
||||
For more detailed information and guidance on contributing, please visit our [contribution documentation](https://docs.ultralytics.com/help/contributing).
|
||||
|
||||
If you encounter any questions or concerns regarding these guidelines, feel free to open a PR or an issue in the repository, and we will assist you in the contribution process.
|
||||
|
63
examples/YOLOv8-Segmentation-ONNXRuntime-Python/README.md
Normal file
63
examples/YOLOv8-Segmentation-ONNXRuntime-Python/README.md
Normal file
@ -0,0 +1,63 @@
|
||||
# YOLOv8-Segmentation-ONNXRuntime-Python Demo
|
||||
|
||||
This repository provides a Python demo for performing segmentation with YOLOv8 using ONNX Runtime, highlighting the interoperability of YOLOv8 models without the need for the full PyTorch stack.
|
||||
|
||||
## Features
|
||||
|
||||
- **Framework Agnostic**: Runs segmentation inference purely on ONNX Runtime without importing PyTorch.
|
||||
- **Efficient Inference**: Supports both FP32 and FP16 precision for ONNX models, catering to different computational needs.
|
||||
- **Ease of Use**: Utilizes simple command-line arguments for model execution.
|
||||
- **Broad Compatibility**: Leverages Numpy and OpenCV for image processing, ensuring broad compatibility with various environments.
|
||||
|
||||
## Installation
|
||||
|
||||
Install the required packages using pip. You will need `ultralytics` for exporting YOLOv8-seg ONNX model and using some utility functions, `onnxruntime-gpu` for GPU-accelerated inference, and `opencv-python` for image processing.
|
||||
|
||||
```bash
|
||||
pip install ultralytics
|
||||
pip install onnxruntime-gpu # For GPU support
|
||||
# pip install onnxruntime # Use this instead if you don't have an NVIDIA GPU
|
||||
pip install numpy
|
||||
pip install opencv-python
|
||||
```
|
||||
|
||||
## Getting Started
|
||||
|
||||
### 1. Export the YOLOv8 ONNX Model
|
||||
|
||||
Export the YOLOv8 segmentation model to ONNX format using the provided `ultralytics` package.
|
||||
|
||||
```bash
|
||||
yolo export model=yolov8s-seg.pt imgsz=640 format=onnx opset=12 simplify
|
||||
```
|
||||
|
||||
### 2. Run Inference
|
||||
|
||||
Perform inference with the exported ONNX model on your images.
|
||||
|
||||
```bash
|
||||
python main.py --model-path <MODEL_PATH> --source <IMAGE_PATH>
|
||||
```
|
||||
|
||||
### Example Output
|
||||
|
||||
After running the command, you should see segmentation results similar to this:
|
||||
|
||||
<img src="https://user-images.githubusercontent.com/51357717/279988626-eb74823f-1563-4d58-a8e4-0494025b7c9a.jpg" alt="Segmentation Demo" width="800"/>
|
||||
|
||||
## Advanced Usage
|
||||
|
||||
For more advanced usage, including real-time video processing, please refer to the `main.py` script's command-line arguments.
|
||||
|
||||
## Contributing
|
||||
|
||||
We welcome contributions to improve this demo! Please submit issues and pull requests for bug reports, feature requests, or submitting a new algorithm enhancement.
|
||||
|
||||
## License
|
||||
|
||||
This project is licensed under the AGPL-3.0 License - see the [LICENSE](https://github.com/ultralytics/ultralytics/blob/main/LICENSE) file for details.
|
||||
|
||||
## Acknowledgments
|
||||
|
||||
- The YOLOv8-Segmentation-ONNXRuntime-Python demo is contributed by GitHub user [jamjamjon](https://github.com/jamjamjon).
|
||||
- Thanks to the ONNX Runtime community for providing a robust and efficient inference engine.
|
321
examples/YOLOv8-Segmentation-ONNXRuntime-Python/main.py
Normal file
321
examples/YOLOv8-Segmentation-ONNXRuntime-Python/main.py
Normal file
@ -0,0 +1,321 @@
|
||||
import argparse
|
||||
|
||||
import cv2
|
||||
import numpy as np
|
||||
import onnxruntime as ort
|
||||
|
||||
from ultralytics.utils import ASSETS, yaml_load
|
||||
from ultralytics.utils.checks import check_yaml
|
||||
from ultralytics.utils.plotting import Colors
|
||||
|
||||
|
||||
class YOLOv8Seg:
|
||||
"""YOLOv8 segmentation model."""
|
||||
|
||||
def __init__(self, onnx_model):
|
||||
"""
|
||||
Initialization.
|
||||
|
||||
Args:
|
||||
onnx_model (str): Path to the ONNX model.
|
||||
"""
|
||||
|
||||
# Build Ort session
|
||||
self.session = ort.InferenceSession(onnx_model,
|
||||
providers=['CUDAExecutionProvider', 'CPUExecutionProvider']
|
||||
if ort.get_device() == 'GPU' else ['CPUExecutionProvider'])
|
||||
|
||||
# Numpy dtype: support both FP32 and FP16 onnx model
|
||||
self.ndtype = np.half if self.session.get_inputs()[0].type == 'tensor(float16)' else np.single
|
||||
|
||||
# Get model width and height(YOLOv8-seg only has one input)
|
||||
self.model_height, self.model_width = [x.shape for x in self.session.get_inputs()][0][-2:]
|
||||
|
||||
# Load COCO class names
|
||||
self.classes = yaml_load(check_yaml('coco128.yaml'))['names']
|
||||
|
||||
# Create color palette
|
||||
self.color_palette = Colors()
|
||||
|
||||
def __call__(self, im0, conf_threshold=0.4, iou_threshold=0.45, nm=32):
|
||||
"""
|
||||
The whole pipeline: pre-process -> inference -> post-process.
|
||||
|
||||
Args:
|
||||
im0 (Numpy.ndarray): original input image.
|
||||
conf_threshold (float): confidence threshold for filtering predictions.
|
||||
iou_threshold (float): iou threshold for NMS.
|
||||
nm (int): the number of masks.
|
||||
|
||||
Returns:
|
||||
boxes (List): list of bounding boxes.
|
||||
segments (List): list of segments.
|
||||
masks (np.ndarray): [N, H, W], output masks.
|
||||
"""
|
||||
|
||||
# Pre-process
|
||||
im, ratio, (pad_w, pad_h) = self.preprocess(im0)
|
||||
|
||||
# Ort inference
|
||||
preds = self.session.run(None, {self.session.get_inputs()[0].name: im})
|
||||
|
||||
# Post-process
|
||||
boxes, segments, masks = self.postprocess(preds,
|
||||
im0=im0,
|
||||
ratio=ratio,
|
||||
pad_w=pad_w,
|
||||
pad_h=pad_h,
|
||||
conf_threshold=conf_threshold,
|
||||
iou_threshold=iou_threshold,
|
||||
nm=nm)
|
||||
return boxes, segments, masks
|
||||
|
||||
def preprocess(self, img):
|
||||
"""
|
||||
Pre-processes the input image.
|
||||
|
||||
Args:
|
||||
img (Numpy.ndarray): image about to be processed.
|
||||
|
||||
Returns:
|
||||
img_process (Numpy.ndarray): image preprocessed for inference.
|
||||
ratio (tuple): width, height ratios in letterbox.
|
||||
pad_w (float): width padding in letterbox.
|
||||
pad_h (float): height padding in letterbox.
|
||||
"""
|
||||
|
||||
# Resize and pad input image using letterbox() (Borrowed from Ultralytics)
|
||||
shape = img.shape[:2] # original image shape
|
||||
new_shape = (self.model_height, self.model_width)
|
||||
r = min(new_shape[0] / shape[0], new_shape[1] / shape[1])
|
||||
ratio = r, r
|
||||
new_unpad = int(round(shape[1] * r)), int(round(shape[0] * r))
|
||||
pad_w, pad_h = (new_shape[1] - new_unpad[0]) / 2, (new_shape[0] - new_unpad[1]) / 2 # wh padding
|
||||
if shape[::-1] != new_unpad: # resize
|
||||
img = cv2.resize(img, new_unpad, interpolation=cv2.INTER_LINEAR)
|
||||
top, bottom = int(round(pad_h - 0.1)), int(round(pad_h + 0.1))
|
||||
left, right = int(round(pad_w - 0.1)), int(round(pad_w + 0.1))
|
||||
img = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_CONSTANT, value=(114, 114, 114))
|
||||
|
||||
# Transforms: HWC to CHW -> BGR to RGB -> div(255) -> contiguous -> add axis(optional)
|
||||
img = np.ascontiguousarray(np.einsum('HWC->CHW', img)[::-1], dtype=self.ndtype) / 255.0
|
||||
img_process = img[None] if len(img.shape) == 3 else img
|
||||
return img_process, ratio, (pad_w, pad_h)
|
||||
|
||||
def postprocess(self, preds, im0, ratio, pad_w, pad_h, conf_threshold, iou_threshold, nm=32):
|
||||
"""
|
||||
Post-process the prediction.
|
||||
|
||||
Args:
|
||||
preds (Numpy.ndarray): predictions come from ort.session.run().
|
||||
im0 (Numpy.ndarray): [h, w, c] original input image.
|
||||
ratio (tuple): width, height ratios in letterbox.
|
||||
pad_w (float): width padding in letterbox.
|
||||
pad_h (float): height padding in letterbox.
|
||||
conf_threshold (float): conf threshold.
|
||||
iou_threshold (float): iou threshold.
|
||||
nm (int): the number of masks.
|
||||
|
||||
Returns:
|
||||
boxes (List): list of bounding boxes.
|
||||
segments (List): list of segments.
|
||||
masks (np.ndarray): [N, H, W], output masks.
|
||||
"""
|
||||
x, protos = preds[0], preds[1] # Two outputs: predictions and protos
|
||||
|
||||
# Transpose the first output: (Batch_size, xywh_conf_cls_nm, Num_anchors) -> (Batch_size, Num_anchors, xywh_conf_cls_nm)
|
||||
x = np.einsum('bcn->bnc', x)
|
||||
|
||||
# Predictions filtering by conf-threshold
|
||||
x = x[np.amax(x[..., 4:-nm], axis=-1) > conf_threshold]
|
||||
|
||||
# Create a new matrix which merge these(box, score, cls, nm) into one
|
||||
# For more details about `numpy.c_()`: https://numpy.org/doc/1.26/reference/generated/numpy.c_.html
|
||||
x = np.c_[x[..., :4], np.amax(x[..., 4:-nm], axis=-1), np.argmax(x[..., 4:-nm], axis=-1), x[..., -nm:]]
|
||||
|
||||
# NMS filtering
|
||||
x = x[cv2.dnn.NMSBoxes(x[:, :4], x[:, 4], conf_threshold, iou_threshold)]
|
||||
|
||||
# Decode and return
|
||||
if len(x) > 0:
|
||||
|
||||
# Bounding boxes format change: cxcywh -> xyxy
|
||||
x[..., [0, 1]] -= x[..., [2, 3]] / 2
|
||||
x[..., [2, 3]] += x[..., [0, 1]]
|
||||
|
||||
# Rescales bounding boxes from model shape(model_height, model_width) to the shape of original image
|
||||
x[..., :4] -= [pad_w, pad_h, pad_w, pad_h]
|
||||
x[..., :4] /= min(ratio)
|
||||
|
||||
# Bounding boxes boundary clamp
|
||||
x[..., [0, 2]] = x[:, [0, 2]].clip(0, im0.shape[1])
|
||||
x[..., [1, 3]] = x[:, [1, 3]].clip(0, im0.shape[0])
|
||||
|
||||
# Process masks
|
||||
masks = self.process_mask(protos[0], x[:, 6:], x[:, :4], im0.shape)
|
||||
|
||||
# Masks -> Segments(contours)
|
||||
segments = self.masks2segments(masks)
|
||||
return x[..., :6], segments, masks # boxes, segments, masks
|
||||
else:
|
||||
return [], [], []
|
||||
|
||||
@staticmethod
|
||||
def masks2segments(masks):
|
||||
"""
|
||||
It takes a list of masks(n,h,w) and returns a list of segments(n,xy) (Borrowed from
|
||||
https://github.com/ultralytics/ultralytics/blob/465df3024f44fa97d4fad9986530d5a13cdabdca/ultralytics/utils/ops.py#L750)
|
||||
|
||||
Args:
|
||||
masks (numpy.ndarray): the output of the model, which is a tensor of shape (batch_size, 160, 160).
|
||||
|
||||
Returns:
|
||||
segments (List): list of segment masks.
|
||||
"""
|
||||
segments = []
|
||||
for x in masks.astype('uint8'):
|
||||
c = cv2.findContours(x, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[0] # CHAIN_APPROX_SIMPLE
|
||||
if c:
|
||||
c = np.array(c[np.array([len(x) for x in c]).argmax()]).reshape(-1, 2)
|
||||
else:
|
||||
c = np.zeros((0, 2)) # no segments found
|
||||
segments.append(c.astype('float32'))
|
||||
return segments
|
||||
|
||||
@staticmethod
|
||||
def crop_mask(masks, boxes):
|
||||
"""
|
||||
It takes a mask and a bounding box, and returns a mask that is cropped to the bounding box. (Borrowed from
|
||||
https://github.com/ultralytics/ultralytics/blob/465df3024f44fa97d4fad9986530d5a13cdabdca/ultralytics/utils/ops.py#L599)
|
||||
|
||||
Args:
|
||||
masks (Numpy.ndarray): [n, h, w] tensor of masks.
|
||||
boxes (Numpy.ndarray): [n, 4] tensor of bbox coordinates in relative point form.
|
||||
|
||||
Returns:
|
||||
(Numpy.ndarray): The masks are being cropped to the bounding box.
|
||||
"""
|
||||
n, h, w = masks.shape
|
||||
x1, y1, x2, y2 = np.split(boxes[:, :, None], 4, 1)
|
||||
r = np.arange(w, dtype=x1.dtype)[None, None, :]
|
||||
c = np.arange(h, dtype=x1.dtype)[None, :, None]
|
||||
return masks * ((r >= x1) * (r < x2) * (c >= y1) * (c < y2))
|
||||
|
||||
def process_mask(self, protos, masks_in, bboxes, im0_shape):
|
||||
"""
|
||||
Takes the output of the mask head, and applies the mask to the bounding boxes. This produces masks of higher quality
|
||||
but is slower. (Borrowed from https://github.com/ultralytics/ultralytics/blob/465df3024f44fa97d4fad9986530d5a13cdabdca/ultralytics/utils/ops.py#L618)
|
||||
|
||||
Args:
|
||||
protos (numpy.ndarray): [mask_dim, mask_h, mask_w].
|
||||
masks_in (numpy.ndarray): [n, mask_dim], n is number of masks after nms.
|
||||
bboxes (numpy.ndarray): bboxes re-scaled to original image shape.
|
||||
im0_shape (tuple): the size of the input image (h,w,c).
|
||||
|
||||
Returns:
|
||||
(numpy.ndarray): The upsampled masks.
|
||||
"""
|
||||
c, mh, mw = protos.shape
|
||||
masks = np.matmul(masks_in, protos.reshape((c, -1))).reshape((-1, mh, mw)).transpose(1, 2, 0) # HWN
|
||||
masks = np.ascontiguousarray(masks)
|
||||
masks = self.scale_mask(masks, im0_shape) # re-scale mask from P3 shape to original input image shape
|
||||
masks = np.einsum('HWN -> NHW', masks) # HWN -> NHW
|
||||
masks = self.crop_mask(masks, bboxes)
|
||||
return np.greater(masks, 0.5)
|
||||
|
||||
@staticmethod
|
||||
def scale_mask(masks, im0_shape, ratio_pad=None):
|
||||
"""
|
||||
Takes a mask, and resizes it to the original image size. (Borrowed from
|
||||
https://github.com/ultralytics/ultralytics/blob/465df3024f44fa97d4fad9986530d5a13cdabdca/ultralytics/utils/ops.py#L305)
|
||||
|
||||
Args:
|
||||
masks (np.ndarray): resized and padded masks/images, [h, w, num]/[h, w, 3].
|
||||
im0_shape (tuple): the original image shape.
|
||||
ratio_pad (tuple): the ratio of the padding to the original image.
|
||||
|
||||
Returns:
|
||||
masks (np.ndarray): The masks that are being returned.
|
||||
"""
|
||||
im1_shape = masks.shape[:2]
|
||||
if ratio_pad is None: # calculate from im0_shape
|
||||
gain = min(im1_shape[0] / im0_shape[0], im1_shape[1] / im0_shape[1]) # gain = old / new
|
||||
pad = (im1_shape[1] - im0_shape[1] * gain) / 2, (im1_shape[0] - im0_shape[0] * gain) / 2 # wh padding
|
||||
else:
|
||||
pad = ratio_pad[1]
|
||||
|
||||
# Calculate tlbr of mask
|
||||
top, left = int(round(pad[1] - 0.1)), int(round(pad[0] - 0.1)) # y, x
|
||||
bottom, right = int(round(im1_shape[0] - pad[1] + 0.1)), int(round(im1_shape[1] - pad[0] + 0.1))
|
||||
if len(masks.shape) < 2:
|
||||
raise ValueError(f'"len of masks shape" should be 2 or 3, but got {len(masks.shape)}')
|
||||
masks = masks[top:bottom, left:right]
|
||||
masks = cv2.resize(masks, (im0_shape[1], im0_shape[0]),
|
||||
interpolation=cv2.INTER_LINEAR) # INTER_CUBIC would be better
|
||||
if len(masks.shape) == 2:
|
||||
masks = masks[:, :, None]
|
||||
return masks
|
||||
|
||||
def draw_and_visualize(self, im, bboxes, segments, vis=False, save=True):
|
||||
"""
|
||||
Draw and visualize results.
|
||||
|
||||
Args:
|
||||
im (np.ndarray): original image, shape [h, w, c].
|
||||
bboxes (numpy.ndarray): [n, 4], n is number of bboxes.
|
||||
segments (List): list of segment masks.
|
||||
vis (bool): imshow using OpenCV.
|
||||
save (bool): save image annotated.
|
||||
|
||||
Returns:
|
||||
None
|
||||
"""
|
||||
|
||||
# Draw rectangles and polygons
|
||||
im_canvas = im.copy()
|
||||
for (*box, conf, cls_), segment in zip(bboxes, segments):
|
||||
# draw contour and fill mask
|
||||
cv2.polylines(im, np.int32([segment]), True, (255, 255, 255), 2) # white borderline
|
||||
cv2.fillPoly(im_canvas, np.int32([segment]), self.color_palette(int(cls_), bgr=True))
|
||||
|
||||
# draw bbox rectangle
|
||||
cv2.rectangle(im, (int(box[0]), int(box[1])), (int(box[2]), int(box[3])),
|
||||
self.color_palette(int(cls_), bgr=True), 1, cv2.LINE_AA)
|
||||
cv2.putText(im, f'{self.classes[cls_]}: {conf:.3f}', (int(box[0]), int(box[1] - 9)),
|
||||
cv2.FONT_HERSHEY_SIMPLEX, 0.7, self.color_palette(int(cls_), bgr=True), 2, cv2.LINE_AA)
|
||||
|
||||
# Mix image
|
||||
im = cv2.addWeighted(im_canvas, 0.3, im, 0.7, 0)
|
||||
|
||||
# Show image
|
||||
if vis:
|
||||
cv2.imshow('demo', im)
|
||||
cv2.waitKey(0)
|
||||
cv2.destroyAllWindows()
|
||||
|
||||
# Save image
|
||||
if save:
|
||||
cv2.imwrite('demo.jpg', im)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
# Create an argument parser to handle command-line arguments
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument('--model', type=str, required=True, help='Path to ONNX model')
|
||||
parser.add_argument('--source', type=str, default=str(ASSETS / 'bus.jpg'), help='Path to input image')
|
||||
parser.add_argument('--conf', type=float, default=0.25, help='Confidence threshold')
|
||||
parser.add_argument('--iou', type=float, default=0.45, help='NMS IoU threshold')
|
||||
args = parser.parse_args()
|
||||
|
||||
# Build model
|
||||
model = YOLOv8Seg(args.model)
|
||||
|
||||
# Read image by OpenCV
|
||||
img = cv2.imread(args.source)
|
||||
|
||||
# Inference
|
||||
boxes, segments, _ = model(img, conf_threshold=args.conf, iou_threshold=args.iou)
|
||||
|
||||
# Draw bboxes and polygons
|
||||
if len(boxes) > 0:
|
||||
model.draw_and_visualize(img, boxes, segments, vis=False, save=True)
|
@ -405,6 +405,7 @@ nav:
|
||||
- Code of Conduct: help/code_of_conduct.md
|
||||
- Environmental, Health and Safety (EHS) Policy: help/environmental-health-safety.md
|
||||
- Security Policy: SECURITY.md
|
||||
- Privacy Policy: help/privacy.md
|
||||
|
||||
# Plugins including 301 redirects navigation ---------------------------------------------------------------------------
|
||||
plugins:
|
||||
|
2
setup.py
2
setup.py
@ -75,7 +75,7 @@ setup(
|
||||
'mkdocs-material',
|
||||
'mkdocstrings[python]',
|
||||
'mkdocs-redirects', # for 301 redirects
|
||||
'mkdocs-ultralytics-plugin>=0.0.30', # for meta descriptions and images, dates and authors
|
||||
'mkdocs-ultralytics-plugin>=0.0.32', # for meta descriptions and images, dates and authors
|
||||
],
|
||||
'export': [
|
||||
'coremltools>=7.0',
|
||||
|
@ -1,4 +1,5 @@
|
||||
# Ultralytics YOLO 🚀, AGPL-3.0 license
|
||||
|
||||
import contextlib
|
||||
from pathlib import Path
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
# Ultralytics YOLO 🚀, AGPL-3.0 license
|
||||
|
||||
__version__ = '8.0.203'
|
||||
__version__ = '8.0.204'
|
||||
|
||||
from ultralytics.models import RTDETR, SAM, YOLO
|
||||
from ultralytics.models.fastsam import FastSAM
|
||||
|
@ -198,7 +198,7 @@ def convert_dota_to_yolo_obb(dota_root_path: str):
|
||||
'small-vehicle': 10,
|
||||
'helicopter': 11,
|
||||
'roundabout': 12,
|
||||
'soccer ball-field': 13,
|
||||
'soccer-ball-field': 13,
|
||||
'swimming-pool': 14,
|
||||
'container-crane': 15,
|
||||
'airport': 16,
|
||||
|
@ -34,7 +34,7 @@ def autobatch(model, imgsz=640, fraction=0.60, batch_size=DEFAULT_CFG.batch):
|
||||
Args:
|
||||
model (torch.nn.module): YOLO model to compute batch size for.
|
||||
imgsz (int, optional): The image size used as input for the YOLO model. Defaults to 640.
|
||||
fraction (float, optional): The fraction of available CUDA memory to use. Defaults to 0.67.
|
||||
fraction (float, optional): The fraction of available CUDA memory to use. Defaults to 0.60.
|
||||
batch_size (int, optional): The default batch size to use if an error is detected. Defaults to 16.
|
||||
|
||||
Returns:
|
||||
|
@ -262,6 +262,14 @@ def safe_download(url,
|
||||
min_bytes (float, optional): The minimum number of bytes that the downloaded file should have, to be considered
|
||||
a successful download. Default: 1E0.
|
||||
progress (bool, optional): Whether to display a progress bar during the download. Default: True.
|
||||
|
||||
Example:
|
||||
```python
|
||||
from ultralytics.utils.downloads import safe_download
|
||||
|
||||
link = "https://ultralytics.com/assets/bus.jpg"
|
||||
path = safe_download(link)
|
||||
```
|
||||
"""
|
||||
|
||||
# Check if the URL is a Google Drive link
|
||||
@ -269,11 +277,8 @@ def safe_download(url,
|
||||
if gdrive:
|
||||
url, file = get_google_drive_file_info(url)
|
||||
|
||||
f = dir / (file if gdrive else url2file(url)) if dir else Path(file) # URL converted to filename
|
||||
if '://' not in str(url) and Path(url).is_file(): # URL exists ('://' check required in Windows Python<3.10)
|
||||
f = Path(url) # filename
|
||||
elif not f.is_file(): # URL and file do not exist
|
||||
assert dir or file, 'dir or file required for download'
|
||||
f = Path(dir or '.') / (file or url2file(url)) # URL converted to filename
|
||||
if not f.is_file(): # URL and file do not exist
|
||||
desc = f"Downloading {url if gdrive else clean_url(url)} to '{f}'"
|
||||
LOGGER.info(f'{desc}...')
|
||||
f.parent.mkdir(parents=True, exist_ok=True) # make directory if missing
|
||||
|
Loading…
x
Reference in New Issue
Block a user