将Yolov5的detect.py修改为可以直接调用的函数

前几天学习了Yolov5,当我想实际将Yolov5实际运用的时候却不知道怎么办了

然后我决定对Yolov5的detect.py修改为可以直接调用的函数

因为我只需要识别图片,所以我将detect.py修改为只要传入一张图片他就可以返回坐标

ps:我这里用的是Yolov5(6.0版本)

# Copyright (c) 2022 guluC
#QQ:2509621566


#导入需要的库
import os
import sys
from pathlib import Path
import numpy as np
import cv2
import torch
import torch.backends.cudnn as cudnn

#初始化目录
FILE = Path(__file__).resolve()
ROOT = FILE.parents[0]  # 定义YOLOv5的根目录
if str(ROOT) not in sys.path:
    sys.path.append(str(ROOT))  # 将YOLOv5的根目录添加到环境变量中(程序结束后删除)
ROOT = Path(os.path.relpath(ROOT, Path.cwd()))  # relative

from models.common import DetectMultiBackend
from utils.datasets import IMG_FORMATS, VID_FORMATS, LoadImages, LoadStreams
from utils.general import (LOGGER, check_file, check_img_size, check_imshow, check_requirements, colorstr,
                           increment_path, non_max_suppression, print_args, scale_coords, strip_optimizer, xyxy2xywh)
from utils.plots import Annotator, colors, save_one_box
from utils.torch_utils import select_device, time_sync

#导入letterbox
from utils.augmentations import Albumentations, augment_hsv, copy_paste, letterbox, mixup, random_perspective



weights=ROOT / 'yolov5s.pt'  # 权重文件地址   .pt文件
source=ROOT / 'data/images'  # 测试数据文件(图片或视频)的保存路径
data=ROOT / 'data/coco128.yaml'  # 标签文件地址   .yaml文件

imgsz=(640, 640)  # 输入图片的大小 默认640(pixels)
conf_thres=0.25  # object置信度阈值 默认0.25  用在nms中
iou_thres=0.45  # 做nms的iou阈值 默认0.45   用在nms中
max_det=1000  # 每张图片最多的目标数量  用在nms中
device='0'  # 设置代码执行的设备 cuda device, i.e. 0 or 0,1,2,3 or cpu
classes=None  # 在nms中是否是只保留某些特定的类 默认是None 就是所有类只要满足条件都可以保留 --class 0, or --class 0 2 3
agnostic_nms=False  # 进行nms是否也除去不同类别之间的框 默认False
augment=False  # 预测是否也要采用数据增强 TTA 默认False
visualize=False  # 特征图可视化 默认FALSE
half=False  # 是否使用半精度 Float16 推理 可以缩短推理时间 但是默认是False
dnn=False  # 使用OpenCV DNN进行ONNX推理


# 获取设备
device = select_device(device)

# 载入模型
model = DetectMultiBackend(weights, device=device, dnn=dnn, data=data)
stride, names, pt, jit, onnx, engine = model.stride, model.names, model.pt, model.jit, model.onnx, model.engine
imgsz = check_img_size(imgsz, s=stride)  # 检查图片尺寸

# Half
# 使用半精度 Float16 推理
half &= (pt or jit or onnx or engine) and device.type != 'cpu'  # FP16 supported on limited backends with CUDA
if pt or jit:
    model.model.half() if half else model.model.float()


def detect(img):
    # Dataloader
    # 载入数据
    dataset = LoadImages(source, img_size=imgsz, stride=stride, auto=pt)

    # Run inference
    # 开始预测
    model.warmup(imgsz=(1, 3, *imgsz), half=half)  # warmup
    dt, seen = [0.0, 0.0, 0.0], 0

    #对图片进行处理
    im0 = img
    # Padded resize
    im = letterbox(im0, imgsz, stride, auto=pt)[0]
    # Convert
    im = im.transpose((2, 0, 1))[::-1]  # HWC to CHW, BGR to RGB
    im = np.ascontiguousarray(im)
    t1 = time_sync()
    im = torch.from_numpy(im).to(device)
    im = im.half() if half else im.float()  # uint8 to fp16/32
    im /= 255  # 0 - 255 to 0.0 - 1.0
    if len(im.shape) == 3:
        im = im[None]  # expand for batch dim
    t2 = time_sync()
    dt[0] += t2 - t1

    # Inference
    # 预测
    pred = model(im, augment=augment, visualize=visualize)
    t3 = time_sync()
    dt[1] += t3 - t2

    # NMS
    pred = non_max_suppression(pred, conf_thres, iou_thres, classes, agnostic_nms, max_det=max_det)
    dt[2] += time_sync() - t3

    #用于存放结果
    detections=[]

    # Process predictions
    for i, det in enumerate(pred):  # per image 每张图片
        seen += 1
        # im0 = im0s.copy()
        if len(det):
            # Rescale boxes from img_size to im0 size
            det[:, :4] = scale_coords(im.shape[2:], det[:, :4], im0.shape).round()
            # Write results
            # 写入结果
            for *xyxy, conf, cls in reversed(det):
                xywh = (xyxy2xywh(torch.tensor(xyxy).view(1, 4))).view(-1).tolist()
                xywh = [round(x) for x in xywh]
                xywh = [xywh[0] - xywh[2] // 2, xywh[1] - xywh[3] // 2, xywh[2],
                        xywh[3]]  # 检测到目标位置,格式:(left,top,w,h)

                cls = names[int(cls)]
                conf = float(conf)
                detections.append({'class': cls, 'conf': conf, 'position': xywh})
    #输出结果
    for i in detections:
        print(i)

    #推测的时间
    LOGGER.info(f'({t3 - t2:.3f}s)')
    return detections



path = 'C://Users//25096//Desktop//yoloV5//yolov5//yolov5-master//data//images//zidane.jpg'
img = cv2.imread(path)
#传入一张图片
detect(img)

我这里用的是Yolov5自带的zidane.jpg

这是输出结果 

 class:标签的名称

conf:置信度

position:xywh ( 左上角x,左上角y,宽,高 )

### 回答1: 将yolov5 detect.py封装可以使用Python的模块化编程思想,将detect.py中的函数封装成一个模块,方便其他程序调用。具体步骤如下: 1. 创建一个新的Python文件,例如yolov5_detect.py。 2. 将detect.py中的函数封装成一个模块,可以使用Python的import语句将detect.py中的函数导入到yolov5_detect.py中。 3. 在yolov5_detect.py中定义一个名为detect函数,该函数调用detect.py中的函数进行目标检测。 4. 将yolov5_detect.py文件打包成一个Python模块,可以使用Python的setuptools库进行打包。 5. 将打包好的模块安装到Python环境中,可以使用Python的pip命令进行安装。 6. 在其他程序中使用import语句导入yolov5_detect模块,并调用detect函数进行目标检测。 通过封装yolov5 detect.py,可以方便地将目标检测功能集成到其他程序中,提高程序的可复用性和可维护性。 ### 回答2: 将yolov5 detect.py封装,可以使得该模型加易于使用和适用,方便用户快速完成目标检测任务。下面我将从模块化设计、封装函数调用方式等方面进行阐述。 1. 模块化设计 在设计封装后的yolov5 detect.py之前,我们需要将原模型代码进行模块化设计,将大的功能模块拆分为若干个小模块,这样可以便于分工协作、代码管理。可以将原模型的代码拆分为以下模块:模型加载、图像处理、目标检测、结果输出。通过模块化的设计,可以使得代码加清晰明了,易于理解和维护。 2. 封装函数 将各功能模块封装成函数,通过函数的方式调用,可以使得代码加简洁明了。在封装函数的时候,需要考虑各个函数之间的依赖关系,如何将参数传递给下一个函数等。可以将每个功能模块封装为一个函数,例如加载模型的函数load_model()、图像处理的函数process_image()、目标检测的函数detect()、结果输出函数output_result()。 3. 调用方式 最后,需要定义一个主函数main()来调用各个功能模块。主函数主要包含以下几个步骤: 1)加载模型,通过调用load_model()函数加载yolov5模型,获取检测所需参数。 2)处理图像,通过调用process_image()函数,将待检测的图像进行处理,包括缩放、裁剪等操作。 3)目标检测,调用detect()函数,对图像进行目标检测,并得到检测结果。 4)输出结果,调用output_result()函数,将检测结果输出,可以输出到控制台或者保存到文件中。 通过以上步骤,即可完成封装后的yolov5 detect.py调用过程,使得该模型变得加易用和适用。 ### 回答3: YOLOv5是一种先进的目标检测算法,其detect.py是该算法的核心代码。为了方便使用和扩展,有时候需要将detect.py封装成一个易于使用的库或者类供其他程序调用。下面介绍如何进行封装: 1. 将detect.py中的函数或类进行逻辑分组。例如,可以将相关的函数放在一个文件夹内,或者定义一个大的类,其中包含各个小的功能函数。 2. 对于代码中重复的部分,应该封装成可重用的函数或类。这些函数或类可供其他模块调用。 3. 对于板块与板块之间重复的代码,可以封装成单独的文件,避免重复编写代码。 4. 采用适合场景的命名和注释。 5.剔除不必要的代码,代码逻辑尽可能清晰。 随着代码的封装,在使用中不仅提高了代码的易读性和可扩展性,还方便代码的维护和新。例如,将封装的代码发布到使用的用户,他们可以方便的调用进行目标检测。封装的函数或类可以运用到任何需要目标检测的场景中,减少了重复劳动,提高了工作效率。
评论 42
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值