python基于DETR(DEtection TRansformer)开发构建人员手持物品检测识别分析系统

PyTorch训练代码和DETR(DEDetection-TRansformer)的预训练模型。我们用Transformer替换了完全复杂的手工制作的对象检测管道,并将Faster R-CNN与ResNet-50匹配,使用一半的计算能力(FLOP)和相同数量的参数在COCO上获得42个AP。

官方项目地址在这里,如下所示:
 

可以看到目前已经收获了超过1.2w的star量,还是很不错的了。

DETR整体数据流程示意图如下所示:

官方也提供了对应的预训练模型,可以自行使用:

首先按照README基础操作按照配置环境,如下所示:

相关的预处理内容在我前面的博文中都有涉及,这里就不再展开介绍了。

DETR (DEtection TRansformer) 是一种基于Transformer架构的端到端目标检测模型。与传统的基于区域提议的目标检测方法(如Faster R-CNN)不同,DETR采用了全新的思路,将目标检测问题转化为一个序列到序列的问题,通过Transformer模型实现目标检测和目标分类的联合训练。

DETR的工作流程如下:

  1. 输入图像通过卷积神经网络(CNN)提取特征图。
  2. 特征图作为编码器输入,经过一系列的编码器层得到图像特征的表示。
  3. 目标检测问题被建模为一个序列到序列的转换任务,其中编码器的输出作为解码器的输入。
  4. 解码器使用自注意力机制(self-attention)对编码器的输出进行处理,以获取目标的位置和类别信息。
  5. 最终,DETR通过一个线性层和softmax函数对解码器的输出进行分类,并通过一个线性层预测目标框的坐标。

DETR的优点包括:

  1. 端到端训练:DETR模型能够直接从原始图像到目标检测结果进行端到端训练,避免了传统目标检测方法中复杂的区域提议生成和特征对齐的过程,简化了模型的设计和训练流程。
  2. 不受固定数量的目标限制:DETR可以处理变长的输入序列,因此不受固定数量目标的限制。这使得DETR能够同时检测图像中的多个目标,并且不需要设置预先确定的目标数量。
  3. 全局上下文信息:DETR通过Transformer的自注意力机制,能够捕捉到图像中不同位置的目标之间的关系,提供了更大范围的上下文信息。这有助于提高目标检测的准确性和鲁棒性。

然而,DETR也存在一些缺点:

  1. 计算复杂度高:由于DETR采用了Transformer模型,它在处理大尺寸图像时需要大量的计算资源,导致其训练和推理速度相对较慢。
  2. 对小目标的检测性能较差:DETR模型在处理小目标时容易出现性能下降的情况。这是因为Transformer模型在处理小尺寸目标时可能会丢失细节信息,导致难以准确地定位和分类小目标。

现在我们来对比一下DETR和YOLO系列以及SSD等知名目标检测模型的优劣:

YOLO系列(包括YOLOv1、YOLOv2、YOLOv3和YOLOv4)和SSD是基于锚框的目标检测方法。它们的优点包括:

  1. 实时性能较好:YOLO系列和SSD通过使用锚框和特征金字塔网络,能够在保持较高检测准确性的同时,实现实时目标检测。
  2. 对小目标的检测效果较好:锚框的使用使得YOLO系列和SSD对小目标的检测能力相对较强。
  3. 计算效率高:相对于DETR的Transformer模型,YOLO系列和SSD的计算复杂度较低,因此训练和推理速度更快。

然而,YOLO系列和SSD也存在一些缺点:

  1. 定位精度相对较低:由于采用了固定数量的锚框,YOLO系列和SSD在目标定位方面的精度相对较低。特别是对于小尺寸目标,容易出现边界框偏移或不完整的情况。
  2. 对密集目标的处理困难:由于锚框的固定尺寸和位置,YOLO系列和SSD在处理密集目标(多个目标在空间上重叠)时可能存在困难,容易发生目标漏检或重叠框的问题。

综上所述,DETR相对于YOLO系列和SSD等基于锚框的目标检测模型具有端到端训练、不受固定目标数量限制和全局上下文信息等优点。然而,DETR在计算复杂度和对小目标的检测性能方面存在一些限制。对于实时性能要求高且注重目标定位精度的场景,YOLO系列和SSD可能是更好的选择。而对于需要全局上下文信息和不受固定目标数量限制的场景,DETR可能更适合。选择适合的目标检测模型应根据具体应用场景和需求进行评估。

首先看下整体效果:

接下来看下数据集:

需要借助于脚本转化处理为coco格式的:

这块网上现成的教程自行百度即可。

默认是100次epoch的迭代计算,看下结果详情,如下所示:

训练完成截图如下所示:

整体训练过程可视化核心实现如下所示:

def plot_logs(logs, fields=('class_error', 'loss_bbox_unscaled', 'mAP'), ewm_col=0, log_name='log.txt'):
    '''
    Function to plot specific fields from training log(s). Plots both training and test results.

    :: Inputs - logs = list containing Path objects, each pointing to individual dir with a log file
              - fields = which results to plot from each log file - plots both training and test for each field.
              - ewm_col = optional, which column to use as the exponential weighted smoothing of the plots
              - log_name = optional, name of log file if different than default 'log.txt'.

    :: Outputs - matplotlib plots of results in fields, color coded for each log file.
               - solid lines are training results, dashed lines are test results.

    '''
    func_name = "plot_utils.py::plot_logs"

    # verify logs is a list of Paths (list[Paths]) or single Pathlib object Path,
    # convert single Path to list to avoid 'not iterable' error

    if not isinstance(logs, list):
        if isinstance(logs, PurePath):
            logs = [logs]
            print(f"{func_name} info: logs param expects a list argument, converted to list[Path].")
        else:
            raise ValueError(f"{func_name} - invalid argument for logs parameter.\n \
            Expect list[Path] or single Path obj, received {type(logs)}")

    # Quality checks - verify valid dir(s), that every item in list is Path object, and that log_name exists in each dir
    for i, dir in enumerate(logs):
        if not isinstance(dir, PurePath):
            raise ValueError(f"{func_name} - non-Path object in logs argument of {type(dir)}: \n{dir}")
        if not dir.exists():
            raise ValueError(f"{func_name} - invalid directory in logs argument:\n{dir}")
        # verify log_name exists
        fn = Path(dir / log_name)
        if not fn.exists():
            print(f"-> missing {log_name}.  Have you gotten to Epoch 1 in training?")
            print(f"--> full path of missing log file: {fn}")
            return

    # load log file(s) and plot
    dfs = [pd.read_json(Path(p) / log_name, lines=True) for p in logs]

    fig, axs = plt.subplots(ncols=len(fields), figsize=(16, 5))

    for df, color in zip(dfs, sns.color_palette(n_colors=len(logs))):
        for j, field in enumerate(fields):
            if field == 'mAP':
                coco_eval = pd.DataFrame(
                    np.stack(df.test_coco_eval_bbox.dropna().values)[:, 1]
                ).ewm(com=ewm_col).mean()
                axs[j].plot(coco_eval, c=color)
            else:
                df.interpolate().ewm(com=ewm_col).mean().plot(
                    y=[f'train_{field}', f'test_{field}'],
                    ax=axs[j],
                    color=[color] * 2,
                    style=['-', '--']
                )
    for ax, field in zip(axs, fields):
        ax.legend([Path(p).name for p in logs])
        ax.set_title(field)


def plot_precision_recall(files, naming_scheme='iter'):
    if naming_scheme == 'exp_id':
        # name becomes exp_id
        names = [f.parts[-3] for f in files]
    elif naming_scheme == 'iter':
        names = [f.stem for f in files]
    else:
        raise ValueError(f'not supported {naming_scheme}')
    fig, axs = plt.subplots(ncols=2, figsize=(16, 5))
    for f, color, name in zip(files, sns.color_palette("Blues", n_colors=len(files)), names):
        data = torch.load(f)
        # precision is n_iou, n_points, n_cat, n_area, max_det
        precision = data['precision']
        recall = data['params'].recThrs
        scores = data['scores']
        # take precision for all classes, all areas and 100 detections
        precision = precision[0, :, :, 0, -1].mean(1)
        scores = scores[0, :, :, 0, -1].mean(1)
        prec = precision.mean()
        rec = data['recall'][0, :, 0, -1].mean()
        print(f'{naming_scheme} {name}: mAP@50={prec * 100: 05.1f}, ' +
              f'score={scores.mean():0.3f}, ' +
              f'f1={2 * prec * rec / (prec + rec + 1e-8):0.3f}'
              )
        axs[0].plot(recall, precision, c=color)
        axs[1].plot(recall, scores, c=color)

    axs[0].set_title('Precision / Recall')
    axs[0].legend(names)
    axs[1].set_title('Scores / Recall')
    axs[1].legend(names)
    return fig, axs

结果如下所示:

对应模型评估指标如下所示:

感兴趣的话可以自行动手实践尝试下!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/155547.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue3路由

vue3路由总结 vue3路由安装和引入:路由配置、创建 Router 实例:导航守卫 使用路由返回上一个页面没有跳转指定页 vue3路由 Vue3 路由是 Vue.js 3.x 版本中用于管理页面跳转和导航的模块。它基于 Vue Router 4.x,相较于 Vue2 的路由机制&…

来讲解一手事务隔离级别

简介 在数据库管理系统中,事务是一组被视为单一工作单元的操作,这些操作要么全部执行成功,要么全部回滚。为了确保在多用户并发访问数据库时数据的一致性和可靠性,引入了事务隔离级别的概念。事务隔离级别定义了一个事务对于其他…

餐厅订座预约小程序的效果如何

市场中无论哪种城市,餐厅非常多,一条不长的商业街,汇聚着数家餐饮品牌,且相互间竞争激烈,并且各个商家都希望用成本低高效率的方法引流及转化。 随着互联网深入各个行业,传统餐饮行业经营痛点不少。 传统餐…

(Matalb回归预测)WOA-BP鲸鱼算法优化BP神经网络的多维回归预测

目录 一、程序及算法内容介绍: 基本内容: 亮点与优势: 二、实际运行效果: 三、部分代码: 一、程序及算法内容介绍: 基本内容: 本代码基于Matalb平台编译,将WOA(鲸鱼算法)与BP神…

代码随想录算法训练营第五十五天 | LeetCode 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结

代码随想录算法训练营第五十五天 | LeetCode 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结 文章链接:两个字符串的删除操作、编辑距离、编辑距离总结 视频链接:两个字符串的删除操作、编辑距离 1. LeetCode 583. 两个字符串的删除操作 1.1 思…

YOLOv8环境搭建

YOLOv8环境搭建 torch环境安装requestment.txt文件中的包安装ultralytics调用 torch环境 使用的是python3.9版本 pip install torch-2.1.0cu118-cp39-cp39-linux_x86_64.whl torchvision0.16.0 torchaudio2.1.0 --index-url https://download.pytorch.org/whl/cu118安装reques…

GUI编程--PyQt5--QTreeWidget

文章目录 树型控件展示数据修改节点数据获取所有节点的数据 Qt模组参考 QWidgets QTreeWidget 树型控件展示数据 展示数据的同时,每个节点标注数据类型。 class MyWindow(QWidget):def __init__(self, title):super(MyWindow, self).__init__()self.setWindowTitl…

【SpringBoot篇】分页查询 | 扩展SpringMvc的消息转换器

文章目录 🛸什么是分页查询🌹代码实现⭐问题🎄解决方法 做了几个项目,发现在这几个项目里面,都实现了分页查询效果,所以就总结一下,方便学习 我们基于黑马程序员的苍穹外卖来讲解分页查询的要点…

el-table中el-popover失效问题

场景:先有一个数据表格,右侧操作栏为固定列,另外有一个字段使用了el-popover来点击弹出框来修改值,发现不好用,点击后无法显示弹出框,但当没有操作栏权限时却意外的生效了。 这种问题真是不常见&#xff0…

【蓝桥杯 第十五届模拟赛 Java B组】训练题(A - I)

目录 A、求全是字母的最小十六进制数 B、Excel表格组合 C、求满足条件的日期 D、 取数字 - 二分 (1)暴力 (2)二分 E、最大连通块 - bfs F、哪一天? G、信号覆盖 - bfs (1)bfs&#xf…

指静脉采集模组之调节Sensor

修改程序中gc0308_sensor_default_regs[]的类容,0x22寄存器的值改为0x55,关闭白平衡,0xd2寄存器的值改为0x10,关闭自动曝光。目前输出的图像没有自动曝光和自动白平衡,但是帧率比之前更低了。 以下是开启曝光模式和关闭曝光模式下…

论文排版一步搞定之图表题注——(图标自动编号,引用题注)

同学们在撰写研究生毕业大论文时,一定会进行章节的多次调整,不到最后一刻很难定稿。此时,一幅插图或表格位置的变化可能会导致此章内大部分插图或表格编号的变化,插图和表格编号的改变同样会使得前文的引用发生变化。牵一发而动全…

idea中误删.iml和.idea文件,如何处理

目录 一、问题描述 二、解决方案 1、理论知识 (1).iml 文件 (2).idea文件 2、操作环境 3、操作步骤 (1)找到【Maven】工具按钮 (2)点图标,重复导入maven项目&am…

【操作系统】内存的非连续分配管理

文章目录 前言非连续分配管理基本分页存储管理方式基本地址变换机构具有快表的地址变换机构两级页表 基本分段存储管理方式段页式管理方式 前言 在了解完内存的连续分配管理的三种方式后,可以看到它们之所以称之为连续分配是因为都有一个共同特点:每个进…

设计模式-适配器-笔记

适配器模式Adapter 动机(Motivation) 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是在这些现存对象所不满足的。 如何应对这种“迁移的变化”&#xff1…

QNX Typed memory介绍

文章目录 前言一、什么是 Typed memory二、查看系统已有Typed memory 的方法三、Typed memory 的使用方法1.定义一个packet memory并从系统内存中分出它1.1 as_add()1.2 as_add_containing()2. 从 Typed memory 中申请内存2.1 POSIX method 申请内存2.2 QNX Neutrino method 申…

redis设置密码

首先到redis的下载目录下:运行 redis-cli 查看redis密码: config get requirepass 设置redis密码为123456: config set requirepass 123456

GDS 命令的使用 srvctl service TAF application continuity

文档中prim and stdy在同一台机器上,不同机器需要添加address list TAF ENABLED GLOBAL SERVICE in GDS ENVIRONMNET 12C. (Doc ID 2283193.1)​编辑To Bottom In this Document Goal Solution APPLIES TO: Oracle Database - Enterprise Edition - Version 12.1.…

Windows系统中搭建docker (ubuntu,Docker-desktop)

一、docker安装前的准备工作 1. 开启CPU虚拟化,新电脑该默认是开启的,如果没开启可以根据自己电脑型号品牌搜索如克开启CPU虚拟化。当开启成功后可在设备管理器中看到。 2.开通Hyper-V 通过 Windows 控制面板 --> 程序和功能 -->启用或关闭…

系列五、JVM的内存结构【PC寄存器】

一、位置 CPU中 二、作用 每个线程都有一个程序计数器,是线程私有的,所谓PC寄存器其实就是一个指针,指向方法区中的方法字节码(用来存储指向下一条指令的地址,也即将要执行的指令代码),由执行引…