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

智能推荐

mint-ui 打不开解决办法_mint 软件管理器打不开-程序员宅基地

文章浏览阅读943次。打开hosts文件:185.199.109.153 youzan.github.io185.199.111.153 mint-ui.github.io185.199.111.153 elemefe.github.io_mint 软件管理器打不开

Ubuntu 系统中通过火狐OS模拟器轻松体验 Firefox OS-程序员宅基地

文章浏览阅读128次。西班牙已经发布了基于Firefox OS的手机,但是不是任何人能体验到,很都人都在苦苦等待,现在我们有另一种方法,不需要任何命令,没有纷繁复杂的安装步骤,在该文中,会教大家在ubuntu系统中一种轻松体验 Firefox OS。只需在火狐浏览器中就可是实现:firefoxosvs4火狐OS模拟器是为开发者使用的,用来测试他们的程序的的火狐浏览..._基于ubuntu的firefox os

单元测试的重要性【转自”至简李云“博客】_单元测试有利于重构-程序员宅基地

文章浏览阅读755次。本文出自 “至简李云” 博客,http://yunli.blog.51cto.com/831344/168865,作者:李云,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明  单元测试(Unit Test, UT)是一个老生常谈的话题,在对这篇文章进行博客归类时,我还是将其归类为开发技术,尽管其带有测试两个字。如何做单元测试不是我这里想说的,而是业界对其认识的认识及重视是我想指出的。_单元测试有利于重构

SparkSQL常用聚合函数_sparksql 聚合函数-程序员宅基地

文章浏览阅读949次,点赞2次,收藏7次。聚合函数Aggregations一、简单聚合 1.1 数据准备 1.2 count 1.3 countDistinct 1._sparksql 聚合函数

Ubuntu远程连接MySQL_ubuntu 连接远程mysql-程序员宅基地

文章浏览阅读308次。Mysql 想要远程客户端链接,必须给root修改可以远程访问的权限一、在连接服务器后,操作mysql系统数据库mysql -u root -puse mysql;查询用户表命令:select User,authentication_string,Host from user这里也可以看出host默认都是localhost访问权限二、接下来就是最重要的部分了:..._ubuntu 连接远程mysql

graylog使用总结这一篇就够了-程序员宅基地

文章浏览阅读1.3w次,点赞38次,收藏70次。graylog使用 graylog报警配置 graylog接springboot graylog使用总结 graylog邮件通知_graylog

随便推点

SVN merge 三种方式-程序员宅基地

文章浏览阅读866次。SVN merge 三种方式转载1、Merge a range of revisions2、Reintegrate a branch3、Merge two different trees——————————————————————————————————————————————————————以下是转载自chunanyong的一篇关于svn分支合并类型的文章,出..._svn merge tree

lxc和android的双系统,基于LXC的Android系统虚拟化技术①.PDF-程序员宅基地

文章浏览阅读569次。基于LXC的Android系统虚拟化技术①.PDF计算机系统应用ISSN1003-3254,CODENCSAOBN E-mail:csa@ComputerSyste..._lxc容器技术运行安卓系统

那么作为一名技术er,你是如何系统的学习it技术的呢?-程序员宅基地

文章浏览阅读60次。学习IT技术需要有系统化的学习计划和良好的学习方法,需要选择合适的学习资料,保持持续学习状态,并营造良好的学习环境。大家可以结合自己的实际情况,制定适合自己的学习计划,利用各种学习工具提升自己的技术水平。IT技术是一个不断更新、不断发展的领域,学习IT技术需要保持持续的学习状态。安排休息时间 :休息时间同样很重要,适当地安排休息时间,既可以缓解学习压力,同时,对于记忆新事物和技能的帮助也是巨大的。制定学习计划表:分别制定每周、每月、与学习目的有关的计划,这可以帮助我们有效地安排时间,提升学习效率。

HTML在线文本编辑器实现原理,富文本编辑器的简单实现原理-程序员宅基地

文章浏览阅读466次。DOCTYPE html>富文本编辑器实现原理title>#edit{height:260px;width:100%;overflow:scroll;border:solid 1px black}style>head>div>居中button>左对齐button>右对齐button>添加缩进button>去掉缩进button>宋体button>大字体button>红色字体button>..._html标签在线转富文本

13个免费的开源GIS软件_开源 gis-程序员宅基地

文章浏览阅读6.7w次,点赞18次,收藏159次。GIS派文章地址:13个免费的开源GIS软件QGISQGIS是一个开放源码的地理信息系统。该项目诞生于2002年5月,并于同年6月作为SourceForge上的一个项目建立。我们一直在努力使GIS软件(传统上是昂贵的专有软件)成为任何人都可以使用个人电脑的可行前景。QGIS目前运行在大多数Unix平台、Windows和macOS上。QGIS是使用Qt工具包(https://www.qt.io)..._开源 gis

Tomcat Manager App--403 Access Denied You are not authorized to view this page_you are not authorized to view this page.-程序员宅基地

文章浏览阅读5.3k次,点赞4次,收藏8次。报错:Tomcat Manager App--403 Access Denied You are not authorized to view this page解决办法:1.关闭Tomcat(安装目录下bin文件下shutdown批处理文件)2.找到安装目录下conf文件夹tomcat-users.xml文件3.在xml文件<tomcat-users>&l..._you are not authorized to view this page.

推荐文章

热门文章

相关标签