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

智能推荐

Android 基于Zxing二维码扫描的光速实现_fastqrcodescannerview-程序员宅基地

文章浏览阅读1w次。Android 十分钟光速实现二维码扫描前言在项目中要使用到二维码的相关内容,我们第一时间想到的是使用大名鼎鼎的zxing或者ZBar开源框架:github-zxing官方库的地址 github-ZBar官方库的地址除了这两个有名的框架之外,还有@bingoogolapple大神的扫描库github-BGAQRCode库以及国外@dlazaro66大神的github-QRCodeReaderView_fastqrcodescannerview

影视站长必备资料合集_九草影视-程序员宅基地

文章浏览阅读4.8w次。苹果cms最新程序官方网盘:https://www.lanzous.com/u/magicblack推荐使用卧龙资源: http://wolongzy.net (速度快,稳定)共有资源30719+八戒资源站 http://zy.bajieziyuan.com (秒播)共有资源20308+麻花资源资源站http://www.mahuazy.ne..._九草影视

python语言属于什么语言,python属于什么类型语言-程序员宅基地

文章浏览阅读861次,点赞21次,收藏10次。而今以及未来的时代,将会是人工智能以及大数据的时代,在这样一个时代背景下,必然要顺应时代的发展与变化,未来新一代青少年,需要掌握人工智能此类高端技术,那么,在众多编程语言当中,最为擅长数据处理,最能够在"人工智能”方面发挥作用的,就是Python!2 通过大量招聘与应聘数据的记录(有多少招聘岗位的发布,某种类型岗位的平均薪酬是多少,每天固定时间收集并处理一次数据),通过一年数据的积累,能够得到某种岗位的发展趋势以及时间(月份)对工作的相关影响。大量的数据处理,是大数据以及人工智能技术的基础。

[附源码]PHP计算机毕业设计天津市杨柳青智慧景区信息系统(程序+LW)_php景区票系统源码-程序员宅基地

文章浏览阅读159次。附源码]PHP计算机毕业设计天津市杨柳青智慧景区信息系统(程序+LW)该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流项目运行环境配置:小皮PHPstudy。项目技术:php+ Vue等等组成,B/S模式 +Vscode管理+前后端分离等等。环境需要1.运行环境:最好是小皮phpstudy最新版,我们在这个版本上开发的。其他版本理论上也可以。2.开发环境:Vscode或HbuilderX都可以。推荐HbuilderX;3.mysql。_php景区票系统源码

SpringBoot基于微信小程序的电子书阅读管理系统的设计(小说、书城)_微信小程序 阅读管理项目-程序员宅基地

文章浏览阅读1.1k次,点赞3次,收藏21次。系统是帮助管理员方便对电子书阅读系统弄进行统一管理的功能系统,能有效提升管理效率,并且可以减少维护成本。本系统主要是分为后台和小程序端,后台是用来做数据管理和维护,小程序端主要进行的是图书的搜索、浏览以及个人用户信息的相关操作,主要功能包括了:登录、注册、小说搜索、今日推荐、广告轮播图、小说分类、小说查看、小说阅读、我的书架、关于我们、我的阅读、我的信息等功能。管理员主要实现了登录、统计分析、用户管理、广告管理、分类管理、小说管理、章节管理、评论管理、管理员管理等功能。_微信小程序 阅读管理项目

SQL Server2019配置管理器无法连接到 WMI 提供程序_sqlserver配置管理器无法连接到wmi提供程序-程序员宅基地

文章浏览阅读3.3k次,点赞9次,收藏23次。SQLServer配置管理器无法连接到WMI提供程序:今天在打开sql server 的时候打不开。报了一个错误,然后我打开sql server配置管理器,就看到了如下图这个错误。然后就去网上搜了这个问题的解决方法,综合起来有以下几种:第一种:给数据库程序network service读取权限。通过上面两个大佬的方法里面得出主要是分析这两个文件的区别(在SQL server2019的数据库中包含有这几个文件(找到之后复制路径,再以管理员的身份允许cmd,执行。在这两位大佬的几个方法中我的还是没有解决!_sqlserver配置管理器无法连接到wmi提供程序

随便推点

微信小程序_sitemaplocation-程序员宅基地

文章浏览阅读257次。sitemapLocation:暴露至外部搜索的相关配置项。可滚动视图区域。一般是固定区域内,然后将图片、列表等超过尺寸的内容放进去,从而实现滚动。常用参数如下:比如:其中white-space属性用来处理元素中的空白,有几种选项:normal、nowrap、pre、pre-wrap、pre-line、break-spaces。一般scroll-view与white-space合用,此处选择nowrap表示不对超过一行的数据进行换行,如果选择normal则会换行,滚动失效。事件包括:点击tap、输入i_sitemaplocation

Python爬虫怎么学?面向招聘岗位职责学习,看看你的技术能拿多少薪资(3)-程序员宅基地

文章浏览阅读911次,点赞8次,收藏20次。Python崛起并且风靡,因为优点多、应用领域广、被大牛们认可。学习 Python 门槛很低,但它的晋级路线很多,通过它你能进入机器学习、数据挖掘、大数据,CS等更加高级的领域。Python可以做网络应用,可以做科学计算,数据分析,可以做网络爬虫,可以做机器学习、自然语言处理、可以写游戏、可以做桌面应用…Python可以做的很多,你需要学好基础,再选择明确的方向。这里给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

2021-11-14_在玩牌程序中,每一组牌用数字1 13代表。输入数字,显示相应的牌。其中2 10直-程序员宅基地

文章浏览阅读2.1k次。“21天好习惯”第二期—1经典例题:在玩牌程序中,每一组牌用数字1〜13代表。输入数字,显示相应的牌。其中2〜10直接显示数字,而数字1、11、12、13则分别用Ace、Jack、Queen、King来表示。解法:..._在玩牌程序中,每一组牌用数字1 13代表。输入数字,显示相应的牌。其中2 10直

VxWorks基本概念及常见问题及BSP 概念-程序员宅基地

文章浏览阅读5.2k次。VxWorks基本概念及常见问题 (Drew 在开发过程中对下面概念的理解) Bootrom和Boot image的区别,Boot image和VxWorks image的联系和区别bootrom 是指on-chip bootrom,在CPU芯片内部,内嵌有小的boot程序(bootloader),类似于PC机主板上的BIOS的存储区域。和boot image不是一回事。VxWorks文档中的bo_vxworks基本概念及常见问题

TypeScript & Flow的基本使用_@babel/preset-flow-程序员宅基地

文章浏览阅读484次。强类型:语言层面限制函数的实参类型必须与形参类型相同弱类型:语言层面不会限制实参的类型总结:强类型语言中不允许任意的隐式类型转换,而弱类型是允许的静态类型:一个变量声明时它的类型就是明确的,声明过后它的类型就不允许再修改动态类型:运行阶段才能够明确变量类型,而且变量的类型随时可以改变弱类型的问题 异常需要等到运行时才能发现 函数功能可能发生改变 对象索引器的错误用法强类型的优势 错误更早暴露 代码更智能,编码更准确 重构更牢靠 减少不必要的类型判.._@babel/preset-flow

idea在运用DH密钥交换算法时出现“Unsupported secret key algorithm:AES”错误的解决办法_unsupported secret key algorithm: des-程序员宅基地

文章浏览阅读897次,点赞2次,收藏7次。idea在运用DH密钥交换算法时出现“Unsupported secret key algorithm:AES”错误的解决办法Idea在使用加密算法编程中的非对称密码时,用到的DH密钥交换算法出现以下错误信息:Exception in thread "main" java.security.NoSuchAlgorithmException: Unsupported secret key algorithm: DES at com.sun.crypto.provider.DHKeyAgreement.e_unsupported secret key algorithm: des