Closed jjang-yu closed 4 months ago
π Hello @jjang-yu, thank you for your interest in YOLOv5 π! Please visit our βοΈ Tutorials to get started, where you can find quickstart guides for simple tasks like Custom Data Training all the way to advanced concepts like Hyperparameter Evolution.
If this is a π Bug Report, please provide a minimum reproducible example to help us debug it.
If this is a custom training β Question, please provide as much information as possible, including dataset image examples and training logs, and verify you are following our Tips for Best Training Results.
Python>=3.8.0 with all requirements.txt installed including PyTorch>=1.8. To get started:
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install
YOLOv5 may be run in any of the following up-to-date verified environments (with all dependencies including CUDA/CUDNN, Python and PyTorch preinstalled):
If this badge is green, all YOLOv5 GitHub Actions Continuous Integration (CI) tests are currently passing. CI tests verify correct operation of YOLOv5 training, validation, inference, export and benchmarks on macOS, Windows, and Ubuntu every 24 hours and on every commit.
We're excited to announce the launch of our latest state-of-the-art (SOTA) object detection model for 2023 - YOLOv8 π!
Designed to be fast, accurate, and easy to use, YOLOv8 is an ideal choice for a wide range of object detection, image segmentation and image classification tasks. With YOLOv8, you'll be able to quickly and accurately detect objects in real-time, streamline your workflows, and achieve new levels of accuracy in your projects.
Check out our YOLOv8 Docs for details and get started with:
pip install ultralytics
@jjang-yu hello there! π It sounds like you're encountering issues with detecting overlapping objects with YOLOv5. Detecting overlapping objects can be challenging, as the model might struggle to identify objects that are not clearly separated or have significant overlap.
However, there are a couple of strategies you might consider to improve detection of overlapping objects:
Adjusting the NMS IOU threshold: You mentioned configuring the iou_thres
at 0.81
. Lowering this threshold might help in improving the separation of overlapping detections. Experiment with lower values, e.g., 0.5
to 0.7
, to see if this helps in your case.
Data Augmentation: Ensuring that your dataset contains examples of overlapping objects, which would guide the model to learn to detect such cases during training. Augmenting your training data with images that simulate overlap might be beneficial.
Alternative Architectures or Models: While YOLOv5 is quite robust, sometimes testing with different models or newer versions can yield better results for specific scenarios such as overlapping objects. If possible, experiment with other architectures or even consider custom modifications to your current model.
Fine-tuning: If the overlapping objects are of classes that are already well represented in the pre-trained models but still not detected well when overlapped, consider fine-tuning your model with more annotated data of such overlapping cases.
Remember, modifying detection thresholds and retraining may require balancing between detecting overlaps vs. increasing false positives. Testing and iteration will be key to finding the optimal configuration for your specific use case.
Good luck, and I hope this helps!
Thank you!π I tried the first way but it didn't work. Can you tell me in more detail how to do the rest of the 2~4 methods?π
Hello @jjang-yu! I'm here to help. Let's dive into methods 2 to 4 with some brief guidance:
Data Augmentation: Augmenting your data is about creating additional training data from your existing dataset. Use techniques like flipping, scaling, cropping, and adding noise to images in your dataset. This can be done using data augmentation libraries or custom scripts. The key is to simulate real-world scenarios where objects overlap.
Alternative Architectures or Models: Exploring other architectures can be as simple as checking the latest releases on the YOLOv5 GitHub repository for any new models or updates. Also, consider exploring other detection models like YOLOv4 or Faster R-CNN for comparison.
Fine-tuning: Start by preparing a dataset with many examples of the overlapping objects you're interested in detecting. Then, continue training (fine-tuning) your model on this dataset. This can be initiated with a command similar to:
python train.py --img 640 --batch 16 --epochs 100 --data your_dataset.yaml --weights yolov5s.pt
Adjust the --img
, --batch
, --epochs
, --data
, and --weights
parameters as necessary for your specific scenario.
Remember, the process of improving detection, especially in challenging situations like overlapping objects, often involves trial and error. Keep experimenting and fine-tuning your approach. Good luck! π
okayπββοΈ, Thank you for your kind reply. Have a nice day :)
@jjang-yu you're welcome! π If you have further questions down the road, feel free to ask. Have a wonderful day too! π
π Hello there! We wanted to give you a friendly reminder that this issue has not had any recent activity and may be closed soon, but don't worry - you can always reopen it if needed. If you still have any questions or concerns, please feel free to let us know how we can help.
For additional resources and information, please see the links below:
Feel free to inform us of any other issues you discover or feature requests that come to mind in the future. Pull Requests (PRs) are also always welcomed!
Thank you for your contributions to YOLO π and Vision AI β
Search before asking
Question
I want to recognize overlapping objects together, but only one learned by YOLOV5's detect.py is recognized and not at the same time. How can I make the Y and R attached to the tube also be recognized? Y and R The precision-recall curve is 0.995%.
import argparse import csv import os import platform import sys from pathlib import Path
import torch
FILE = Path(file).resolve() ROOT = FILE.parents[0] # YOLOv5 root directory if str(ROOT) not in sys.path: sys.path.append(str(ROOT)) # add ROOT to PATH ROOT = Path(os.path.relpath(ROOT, Path.cwd())) # relative
from ultralytics.utils.plotting import Annotator, colors, save_one_box
from models.common import DetectMultiBackend from utils.dataloaders import IMG_FORMATS, VID_FORMATS, LoadImages, LoadScreenshots, LoadStreams from utils.general import ( LOGGER, Profile, check_file, check_img_size, check_imshow, check_requirements, colorstr, cv2, increment_path, non_max_suppression, print_args, scale_boxes, strip_optimizer, xyxy2xywh, ) from utils.torch_utils import select_device, smart_inference_mode
@smart_inference_mode() def run( weights=ROOT / "dataset/all.pt", # model path or triton URL source=ROOT / "dataset/valid/images", # file/dir/URL/glob/screen/0(webcam) data=ROOT / "dataset/all_data.yaml", # dataset.yaml path imgsz=(320, 240), # inference size (height, width) conf_thres=0.65, # confidence threshold iou_thres=0.81, # NMS IOU threshold max_det=1000, # maximum detections per image device="", # cuda device, i.e. 0 or 0,1,2,3 or cpu view_img=False, # show results save_txt=False, # save results to *.txt save_csv=False, # save results in CSV format save_conf=False, # save confidences in --save-txt labels save_crop=False, # save cropped prediction boxes nosave=False, # do not save images/videos classes=None, # filter by class: --class 0, or --class 0 2 3 agnostic_nms=True, # class-agnostic NMS augment=False, # augmented inference visualize=False, # visualize features update=False, # update all models project=ROOT / "runs/detect", # save results to project/name name="exp", # save results to project/name exist_ok=False, # existing project/name ok, do not increment line_thickness=3, # bounding box thickness (pixels) hide_labels=False, # hide labels hide_conf=False, # hide confidences half=False, # use FP16 half-precision inference dnn=False, # use OpenCV DNN for ONNX inference vid_stride=1, # video frame-rate stride ): source = str(source) save_img = not nosave and not source.endswith(".txt") # save inference images is_file = Path(source).suffix[1:] in (IMG_FORMATS + VID_FORMATS) is_url = source.lower().startswith(("rtsp://", "rtmp://", "http://", "https://")) webcam = source.isnumeric() or source.endswith(".streams") or (is_url and not is_file) screenshot = source.lower().startswith("screen") if is_url and is_file: source = check_file(source) # download
def parse_opt(): """Parses command-line arguments for YOLOv5 detection, setting inference options and model configurations.""" parser = argparse.ArgumentParser() parser.add_argument("--weights", nargs="+", type=str, default=ROOT / "dataset/all.pt", help="model path or triton URL") parser.add_argument("--source", type=str, default=ROOT / "dataset/valid/images", help="file/dir/URL/glob/screen/0(webcam)") parser.add_argument("--data", type=str, default=ROOT / "dataset/all_data.yaml", help="(optional) dataset.yaml path") parser.add_argument("--imgsz", "--img", "--img-size", nargs="+", type=int, default=[320], help="inference size h,w") parser.add_argument("--conf-thres", type=float, default=0.65, help="confidence threshold") parser.add_argument("--iou-thres", type=float, default=0.81, help="NMS IoU threshold") parser.add_argument("--max-det", type=int, default=1000, help="maximum detections per image") parser.add_argument("--device", default="", help="cuda device, i.e. 0 or 0,1,2,3 or cpu") parser.add_argument("--view-img", action="store_true", help="show results") parser.add_argument("--save-txt", action="store_true", help="save results to .txt") parser.add_argument("--save-csv", action="store_true", help="save results in CSV format") parser.add_argument("--save-conf", action="store_true", help="save confidences in --save-txt labels") parser.add_argument("--save-crop", action="store_true", help="save cropped prediction boxes") parser.add_argument("--nosave", action="store_true", help="do not save images/videos") parser.add_argument("--classes", nargs="+", type=int, help="filter by class: --classes 0, or --classes 0 2 3") parser.add_argument("--agnostic-nms", action="store_true", help="class-agnostic NMS") parser.add_argument("--augment", action="store_true", help="augmented inference") parser.add_argument("--visualize", action="store_true", help="visualize features") parser.add_argument("--update", action="store_true", help="update all models") parser.add_argument("--project", default=ROOT / "runs/detect", help="save results to project/name") parser.add_argument("--name", default="exp", help="save results to project/name") parser.add_argument("--exist-ok", action="store_true", help="existing project/name ok, do not increment") parser.add_argument("--line-thickness", default=3, type=int, help="bounding box thickness (pixels)") parser.add_argument("--hide-labels", default=False, action="store_true", help="hide labels") parser.add_argument("--hide-conf", default=False, action="store_true", help="hide confidences") parser.add_argument("--half", action="store_true", help="use FP16 half-precision inference") parser.add_argument("--dnn", action="store_true", help="use OpenCV DNN for ONNX inference") parser.add_argument("--vid-stride", type=int, default=10, help="video frame-rate stride") opt = parser.parse_args() opt.imgsz = 2 if len(opt.imgsz) == 1 else 1 # expand print_args(vars(opt)) return opt
def main(opt): """Executes YOLOv5 model inference with given options, checking requirements before running the model.""" check_requirements(ROOT / "requirements.txt", exclude=("tensorboard", "thop")) run(**vars(opt))
if name == "main": opt = parse_opt() main(opt)
Additional
No response