ultralytics的YOLOv8改为自用版本_from ultralytics.utils.plotting import annotator, -程序员宅基地

技术标签: YOLO  

由于需要用pyqt给yolov8做一个界面,而ultralytics一层嵌一层,不是很好用,所以对它的这个源码进行精简,具体代码我放到了这里,ultralytics使用的版本是8.0.54。

 具体代码如下,需要根据自己的情况来修改data的配置文件以及权值文件,在代码的49和50行

import torch
import cv2
import numpy as np

from ultralytics.yolo.data.augment import LetterBox
from ultralytics.yolo.engine.results import Results
from ultralytics.yolo.utils import ops
from ultralytics.yolo.utils.plotting import Annotator, colors, save_one_box
from ultralytics.nn.autobackend import AutoBackend


def get_annotator(img):
    return Annotator(img, line_width=3, example=str(model.names))

def preprocess(img):
    img = (img if isinstance(img, torch.Tensor) else torch.from_numpy(img)).to(model.device)
    img = img.float()
    img /= 255  # 0 - 255 to 0.0 - 1.0
    return img

def postprocess(preds, img, orig_imgs):
    preds = ops.non_max_suppression(preds,
                                    conf,
                                    iou,
                                    agnostic=False,
                                    max_det=300,
                                    classes=None)

    results = []
    for i, pred in enumerate(preds):
        orig_img = orig_imgs[i] if isinstance(orig_imgs, list) else orig_imgs # 返回的orig_img变量表示原始图像
        if not isinstance(orig_imgs, torch.Tensor):
            pred[:, :4] = ops.scale_boxes(img.shape[2:], pred[:, :4], orig_img.shape)
        path = 0
        img_path = path[i] if isinstance(path, list) else path
        results.append(Results(orig_img=orig_img, path=img_path, names=model.names, boxes=pred))
    return results


def save_preds(vid_cap, im0):
    fps = int(vid_cap.get(cv2.CAP_PROP_FPS))  # integer required, floats produce error in MP4 codec
    w = int(vid_cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    h = int(vid_cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    vid_writer = cv2.VideoWriter('1.mp4', cv2.VideoWriter_fourcc(*'mp4v'), fps, (w, h))
    im0 = (im0 * 255).astype(np.uint8)  # Convert to byte type
    vid_writer.write(im0)


model = ''
data = ''
imgsz = 640
visualize = False
conf = 0.25
iou = 0.5
model = AutoBackend(model,
                     device=torch.device('cuda:0'),
                     data=data,
                     verbose=True)
device = torch.device('cuda:0')
model.eval()
cam = cv2.VideoCapture(0)

while 1:
    im0 = cam.read()[1]

    im = np.stack([LetterBox(imgsz, True, stride=32)(image=im0)])
    im = im[..., ::-1].transpose((0, 3, 1, 2))  # BGR to RGB, BHWC to BCHW
    im = np.ascontiguousarray(im)  # contiguous
    dt = (ops.Profile(), ops.Profile(), ops.Profile())

    # preprocess
    with dt[0]:
        im = preprocess(im)
        if len(im.shape) == 3:
            im = im[None]  # expand for batch dim

    # inference
    with dt[1]:
        preds = model(im, augment=False, visualize=visualize)

    # postprocess
    with dt[2]:
        results = postprocess(preds, im, im0)

    det = results[0].boxes  # TODO: make boxes inherit from tensors

    # write
    for d in reversed(det):
        cls, conf, id = d.cls.squeeze(), d.conf.squeeze(), None if d.id is None else int(d.id.item())

        c = int(cls)  # integer class
        name = ('' if id is None else f'id:{id} ') + model.names[c]
        label = f'{name} {conf:.2f}'
        p1, p2 = (int(d.xyxy.squeeze()[0]), int(d.xyxy.squeeze()[1])), (int(d.xyxy.squeeze()[2]), int(d.xyxy.squeeze()[3]))
        lw = max(round(sum(im.shape) / 2 * 0.003), 2)
        cv2.rectangle(im0, p1, p2, colors(c, True), thickness=lw, lineType=cv2.LINE_AA)
        if label:
            tf = max(lw - 1, 1)  # font thickness
            w, h = cv2.getTextSize(label, 0, fontScale=lw / 3, thickness=tf)[0]  # text width, height
            outside = p1[1] - h >= 3
            p2 = p1[0] + w, p1[1] - h - 3 if outside else p1[1] + h + 3
            # cv2.rectangle(im0, p1, p2, (128, 128, 128), -1, cv2.LINE_AA)  # filled
            cv2.putText(im0,
                        label, (p1[0], p1[1] - 2 if outside else p1[1] + h + 2),
                        0,
                        lw / 3,
                        (0, 0, 255),
                        thickness=tf,
                        lineType=cv2.LINE_AA)


    cv2.imshow("result", im0)
    # save_preds(cam, im0)
    print('preprocess:{},inference:{},postprocess:{}'.format(dt[0].dt * 1E3 ,dt[1].dt * 1E3 ,dt[2].dt * 1E3 ))
    if cv2.waitKey(1) & 0xff == ord('q'):  # 1 millisecond
        break

cam.release()
cv2.destroyAllWindows()

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/w1036427372/article/details/130784437

智能推荐

HikariPool-1 - Connection is not available, request timed out after,springboot如何设置连接池大小-程序员宅基地

文章浏览阅读2.6k次。问题描述项目压测的时候一直报错HikariPool-1 - Connection is not available, request timed out after解决方案在yml中配置如下参数hikari: connection-timeout: 60000 idle-timeout: 60000 login-timeout: 5 max-lifetime: 60000 maximum-pool-size: 400 mi

java怎么调用其他包里的类_java怎么调用另一个包中的类-程序员宅基地

文章浏览阅读5.2k次。比如现在有以下两个包:现在想在Boss类里面实现对Employee的调用,怎么做呢?(视频教程推荐:java视频)Employee.java:package payroll2;public class Employee {public void move(){System.out.print("this is employee");}}如果想实现对包的调用,可使用import关键字,然后再用调用类..._java调用其他包的静态类

Linux相关知识-程序员宅基地

文章浏览阅读76次。运行级别 0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动运行运行级别 1:单用户工作状态,root权限,用于系统维护,找回丢失root密码,禁止远程登陆运行级别 2:多用户状态没有网络服务(没有NFS)运行级别 3:多用户状态有网络服务(有NFS),登陆后进入控制台命令行模式运行级别 4:系统未使用保留给用户运行级别 5:图形界面运行级别 6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动常用运行级别是3和5,工作中一般用3,也可以指定默认运行级别。_linux相关

使用S32DS集成S32K的MCAL_s32ds教程-程序员宅基地

文章浏览阅读4.7k次,点赞9次,收藏67次。一、软件准备前往恩智浦官网下载MCAL软件包、EB Tresos 、以及S32DS IDE:以下软件均有NXP免费提供,但需注册账号获取S32DS IDE下载EB Tresos以及MCAL下载S32DS版本为:S32 Design Studio 3.2其中EB Tresos版本为:24.0MCAL版本为:S32K14X_MCAL4_2_RTM_1_0_0​NXP MCAL软件包后缀说明:HF为补丁版本 RTMC为发布版本软件安装请参考:NXP_AUT.._s32ds教程

欧拉法、改进的欧拉法、龙格-库塔法求解初值问题_欧拉法计算初值问题csdn-程序员宅基地

文章浏览阅读1.9w次,点赞37次,收藏202次。求解初值问题简介前期准备欧拉法改进的欧拉法龙格-库塔法三级三阶显式Kutta公式三级四阶显式Heun公式四级四阶显式Kutta公式四级四阶显式Gill公式简介通过求解简单的初值问题:{dudx=f(x,u)(1)u(x0)=u0(2)\begin{cases}\dfrac{du}{dx}=f(x,u)&&&&&&(1)\\u(x_0)=u..._欧拉法计算初值问题csdn

Git取消add 、 commit、push的命令_git 取消add-程序员宅基地

文章浏览阅读2w次,点赞284次,收藏328次。撤销已经add,但是没有commit的问题git reset HEAD撤销已经commit,但是没有push到远端的文件(仅撤销commit 保留add操作)git reset --soft HEAD^查看状态查看没有git add的文件git checkout 查看当前提交状态git status......_git 取消add

随便推点

mac下idea tomcat不能debug、不能进断点_mac idea2023.2.4不能一步步debug-程序员宅基地

文章浏览阅读1.9k次。一开始发现mac的idea点debug一直没有反应,以为卡了后来发现在tomcat的配置里面有一个变量,在run的里面是没有的。 debug的位置有一个socket的,可能连不上,尝试把他的变量删了,然后居然可以运行了。。。但是发现了新的问题,不能进入断点。= =之后在网上探索,只找到了一个类似的,还是tomcat5代的时候。。。惊了答案在不经意间解决了。。新建了一个tomcat8 就好..._mac idea2023.2.4不能一步步debug

Android小游戏开发:简单的合金弹头游戏(一)游戏框架_android 小游戏开发-程序员宅基地

文章浏览阅读4.9k次,点赞3次,收藏29次。本篇博客适合给初学安卓,熟悉基本的JAVA语法,并希望用安卓写个小游戏的初学者参考,因为博主也因大学课程需要,是在2个星期内自学的JAVA和安卓开发,可能会有一些错误和需要优化的地方,望指出 我在这2个星期内看的书为《JAVA核心技术卷I》和李华明写的《Android游戏编程之从零开始》,有些内容是借鉴书上而来。 《Android游戏编程之从零开始》的电子版 链接:ht_android 小游戏开发

【企业架构工具】2023 年 18 大企业架构工具_国内ea系统工具-程序员宅基地

文章浏览阅读369次。这些流行和新兴的 EA 工具为企业提供了支持企业架构和数字化转型所需的一切。企业架构系统并不总是必不可少的。据推测,在 1940 年代,国际商业机器公司的一位领导人小托马斯·沃森 (Thomas Watson Jr.) 曾说过:“我认为大约有 5 台计算机的全球市场。” 没有人需要定制软件来跟踪这么短的列表。然而,现代企业则大不相同。一些员工仅在他们的办公桌上就有超过五台计算机。即使是小型组织也可..._国内ea系统工具

计算机专业求职信英语,计算机科学专业毕业生英文求职信范文-程序员宅基地

文章浏览阅读166次。计算机科学专业毕业生英文求职信范文英文求职信范文就求职者是向外企hr介绍自己想要的职位时所写的关于自己的求职信例文。下面小编就为大家推荐计算机科学专业毕业生英文求职信范文。dear mr. ××,i would like to be considered as a candidate for the assistant computer programmer position advertised..._假设你是李华是一所中等职业学校计算机专业的毕业生,你想要一份计算机销售经

Ubuntu18.04中LXC安装配置以及简单使用_lxc-create 离线文件ubuntu-程序员宅基地

文章浏览阅读1.2k次。LXC的安装配置以及简单使用_lxc-create 离线文件ubuntu

Springboot——mybatis配置_springboot配置mybatis-程序员宅基地

文章浏览阅读7.5k次,点赞2次,收藏2次。serverTimezone=Asia/Shanghai:可以实现北京时间入库。_springboot配置mybatis