ssd_keras

GitHub
1.9k 925 中等 1 次阅读 1个月前Apache-2.0开发框架图像
AI 解读 由 AI 自动生成,仅供参考

ssd_keras 是一个基于 Keras 实现的单次多框检测器(SSD)模型,源自 Wei Liu 等人提出的经典目标检测算法。它能够快速、准确地在图像中识别并定位多个物体,适用于如行人检测、车辆识别等常见场景。

这个工具解决了传统目标检测方法计算复杂、速度慢的问题,通过一次前向传播即可完成检测任务,显著提升了检测效率。同时,它提供了多种网络结构(如 SSD300、SSD512 和轻量级的 SSD7),满足不同精度与性能需求,并支持在自定义数据集上进行微调,便于实际应用中的迁移学习。

ssd_keras 适合有一定深度学习基础的开发者和研究人员使用,尤其适合希望深入理解 SSD 模型原理或需要在项目中集成目标检测功能的用户。其代码注释详尽、文档完善,有助于用户快速上手和二次开发。

值得一提的是,该实现与原始 Caffe 版本在性能上高度一致,甚至部分指标略有提升,且支持从零训练模型,具备良好的可扩展性与实用性。

使用场景

某智能安防公司正在开发一款用于城市道路监控的实时视频分析系统,需要快速实现对车辆、行人等目标的检测功能。

没有 ssd_keras 时

  • 需要从零开始研究 SSD 模型架构,理解其复杂的多尺度特征融合机制和默认框生成逻辑,耗费大量时间。
  • 缺乏现成的 Keras 实现,导致模型训练和部署流程复杂,难以与现有基于 Keras 的深度学习框架集成。
  • 训练模型时无法直接使用预训练权重,需手动调整网络结构并重新训练,效率低下且容易出错。
  • 对于不同分辨率的输入图像,需要自行设计适配方案,增加了开发难度和调试成本。
  • 模型性能评估缺乏明确指标参考,难以判断是否达到预期效果。

使用 ssd_keras 后

  • 提供了清晰的 Keras 实现代码和详细注释,便于快速理解模型结构和训练流程,节省了大量研究时间。
  • 直接支持多种 SSD 网络架构(如 SSD300、SSD512),可无缝集成到现有 Keras 工程中,简化了开发流程。
  • 提供了预训练权重下载链接,用户可直接加载并进行微调,显著缩短了模型训练周期。
  • 支持多种输入分辨率,适应不同场景需求,减少了额外适配工作的负担。
  • 提供了 Pascal VOC 数据集上的 mAP 性能指标,便于评估模型效果并优化参数配置。

ssd_keras 为快速构建高精度、高性能的目标检测系统提供了成熟可靠的解决方案。

运行环境要求

操作系统
  • Linux
  • macOS
  • Windows
GPU

需要 NVIDIA GPU,显存 8GB+,CUDA 6.0+(使用 cuDNN v6)

内存

16GB+

依赖
notes不支持 Theano 和 CNTK 后端;Python 2 已不再支持;首次运行需下载约 5GB 的模型权重文件
python3.x
Numpy
TensorFlow 1.x
Keras 2.x
OpenCV
Beautiful Soup 4.x
ssd_keras hero image

快速开始

SSD:Keras中的单次多框检测器实现


目录

  1. 概述
  2. 性能
  3. 示例
  4. 依赖项
  5. 使用方法
  6. 下载卷积化的VGG-16权重
  7. 下载原始训练好的模型权重
  8. 如何在自己的数据集上微调其中一个训练好的模型
  9. 待办事项
  10. 重要说明
  11. 术语

概述

这是Wei Liu等人在论文SSD:单次多框检测器中提出的SSD模型架构的Keras移植版本。

以下提供了所有原始模型的训练权重的移植版本。该实现是准确的,也就是说,无论是移植后的权重还是从头训练的模型,其mAP值都与原始Caffe实现的相应模型完全一致(详见下文的性能部分)。

本项目的首要目标是为那些希望对模型进行底层理解的人提供一个文档详尽的SSD实现。所提供的教程、文档和详细注释,希望能使深入研究代码以及基于此模型进行改编或扩展,比大多数其他实现(无论是否基于Keras)更容易一些——因为那些实现往往几乎没有任何文档和注释。

目前该仓库提供了以下几种网络架构:

  • SSD300:keras_ssd300.py
  • SSD512:keras_ssd512.py
  • SSD7:keras_ssd7.py——这是一个较小的7层版本,即使在中端GPU上也能相对快速地从头训练,同时对于较简单的目标检测任务和测试也足够胜任。当然,用它不可能获得最先进的结果,但它的速度很快。

如果您想使用提供的其中一个训练好的模型进行迁移学习(即在自己的数据集上微调其中一个训练好的模型),有一个Jupyter笔记本教程,可以帮助您对训练好的权重进行子采样,使其与您的数据集兼容,详情见下文。

如果您想使用自己的基础网络架构构建SSD,可以将keras_ssd7.py作为模板,其中提供了文档和注释以帮助您。

性能

以下是移植权重的mAP评估结果,下方则是使用本实现从头训练的模型的评估结果。所有模型均使用官方Pascal VOC测试服务器(针对2012年的test)或官方Pascal VOC Matlab评估脚本(针对2007年的test)进行评估。在所有情况下,结果都与原始Caffe模型一致(或略胜一筹)。所有移植权重的下载链接见下文。

平均精度均值
评估对象 VOC2007 test VOC2012 test
训练时
IoU规则
07+12
0.5
07+12+COCO
0.5
07++12+COCO
0.5
SSD300 77.5 81.2 79.4
SSD512 79.8 83.2 82.3

在Pascal VOC 2007 trainval和2012 trainval上从头训练SSD300直至收敛,在Pascal VOC 2007 test上的mAP与原始Caffe SSD300“07+12”模型相同。您可以在这里找到训练总结这里

平均精度均值
原始Caffe模型 移植权重 从头训练
SSD300 “07+12” 0.772 0.775 0.771

这些模型在NVIDIA GeForce GTX 1070移动版(即笔记本电脑版本)和cuDNN v6环境下,在Pascal VOC上的平均每秒帧数(FPS)如下。这里需要注意两点。首先,原始Caffe实现的基准预测速度是在TitanX GPU和cuDNN v4环境下测得的。其次,论文中提到他们是在批量大小为8的情况下测量预测速度,我认为这种测量方式并不具有实际意义。衡量检测模型速度的真正目的,是了解模型每秒能够处理多少张单独的连续图像,因此如果只以整批图像为单位来测量预测速度,再推算出每张图像所花费的时间,就违背了这一初衷。为了便于比较,下面列出了原始Caffe SSD实现的预测速度,以及本实现在此相同条件下的预测速度,即批量大小为8时的情况。此外,还列出了本实现批量大小为1时的预测速度,我认为这才是更有意义的数值。

每秒帧数
原始Caffe实现 本实现
批量大小 8 8 1
SSD300 46 49 39
SSD512 19 25 20
SSD7 216 127

示例

以下是经过完整训练的原始 SSD300 “07+12” 模型的一些预测示例(即在 Pascal VOC2007 的 trainval 数据集和 VOC2012 的 trainval 数据集上进行训练)。这些预测是在 Pascal VOC2007 的 test 数据集上生成的。

img01 img01
img01 img01

以下是一些 SSD7(即小型的 7 层版本)的预测示例,该模型部分地在由 Udacity 发布的两个道路交通数据集上进行了训练,这两个数据集共计约 2 万张图像,包含 5 类目标(更多信息请参见 ssd7_training.ipynb)。下面展示的预测是在以批量大小 32 进行 1 万次训练后生成的。诚然,汽车是比较容易检测的目标,我挑选了其中几个较好的例子,但即便如此,这样一个小型模型仅经过 1 万次训练迭代就能取得这样的效果,仍然令人印象深刻。

img01 img01
img01 img01

依赖项

  • Python 3.x
  • Numpy
  • TensorFlow 1.x
  • Keras 2.x
  • OpenCV
  • Beautiful Soup 4.x

目前尚不支持 Theano 和 CNTK 后端。

Python 2 兼容性:本实现似乎可以在 Python 2.7 上运行,但我并不提供任何相关支持。如今已是 2018 年,已经没有人应该再使用 Python 2 了。

如何使用

本仓库提供了 Jupyter Notebook 教程,用于讲解模型的训练、推理与评估;后续章节中也包含大量补充说明,以配合这些笔记本。

如何使用已训练好的模型进行推理:

如何训练模型:

如何将提供的已训练模型之一用于在您自己的数据集上进行迁移学习:

  • 请参阅下文(#如何在您自己的数据集上微调已训练模型之一)

如何评估已训练好的模型:

如何使用数据生成器:

  • 此处使用的数据生成器拥有独立的仓库,并附有详细教程 此处

训练细节

通用的训练设置已在 ssd7_training.ipynbssd300_training.ipynb 中进行了阐述与说明。两份笔记本中的设置与解释在大部分情况下相似,因此无论查看哪一份都能理解通用的训练设置;不过,[ssd300_training.ipynb](ssd300_training.ipynb) 中的参数预设为复制原始 Caffe 实现用于在 Pascal VOC 上训练的设置,而 ssd7_training.ipynb 中的参数则预设为在 Udacity 交通数据集 上进行训练。

要对原始 SSD300 模型在 Pascal VOC 上进行训练:

  1. 下载数据集:
    wget http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar
    wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
    wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
    
  2. 下载卷积化 VGG-16 的权重,或下载下方提供的其中一个已训练的原始模型的权重。
  3. ssd300_training.ipynb 中相应地设置数据集与模型权重的文件路径,并执行各单元格。

当然,SSD512 的训练流程也完全相同。如果尝试从零开始训练 SSD300 或 SSD512,务必加载预训练的 VGG-16 权重,否则训练很可能会失败。以下是 SSD300 “07+12” 模型完整训练的总结,供您与自己的训练结果对比参考:

箱体的编码与解码

ssd_encoder_decoder 子包包含了所有与箱体编码和解码相关的函数与类。所谓“编码箱体”,是指将真实标签转换为损失函数在训练时所需的输出格式。正是在这个编码过程中,会发生真实框与锚框的匹配——论文中称其为“默认框”,而在原始 C++ 代码中则称为“先验框”——其实指的都是同一回事。所谓“解码箱体”,则是将模型的原始输出转换回输入标签的格式,这涉及多种转换与过滤操作,例如非极大值抑制(NMS)。

为了训练模型,您需要创建一个 SSDInputEncoder 的实例,并将其传递给数据生成器。其余工作由数据生成器完成,因此通常无需手动调用 SSDInputEncoder 的任何方法。

模型可以以“训练”或“推理”模式创建。在“训练”模式下,模型会输出原始预测张量,该张量仍需经过坐标转换、置信度阈值筛选、非极大值抑制等后处理。decode_detections()decode_detections_fast() 这两个函数负责完成这些后处理。前者遵循原始 Caffe 实现,即按对象类别分别执行 NMS;后者则在整个对象类别范围内全局执行 NMS,因此效率更高,但行为也略有不同。有关这两个函数的详细信息,请参阅文档。如果模型以“推理”模式创建,则其最后一层为 DecodeDetections 层,该层会在 TensorFlow 中完成 decode_detections() 所做的全部后处理,这意味着模型的输出已经是经过后处理的结果。因此,若要使模型可训练,必须以“训练”模式创建;随后,可将已训练的权重加载到以“推理”模式创建的模型中。

关于模型内部使用的锚框偏移坐标的一点说明:这可能并不显而易见,但重要的是要明白,模型无法直接预测所预测边界框的绝对坐标。若要能够预测绝对框坐标,负责定位的卷积层就必须针对同一目标实例,在输入图像的不同位置产生不同的输出值。然而,这显然是不可能的:对于卷积层滤波器的某一特定输入,由于权重共享,无论滤波器在图像中的空间位置如何,都会产生相同的输出。这就是为什么模型预测的是锚框的偏移值,而非绝对坐标;同时,这也是为什么在训练过程中,绝对的真实坐标会在编码阶段被转换为锚框偏移值。而模型之所以预测锚框偏移值,反过来又导致模型中包含专门用于输出锚框坐标的锚框层,以便模型的输出张量能够包含这些信息。如果模型的输出张量不包含锚框坐标,那么将预测的偏移值转换回绝对坐标的必要信息就会缺失于模型输出之中。

使用不同的基础网络架构

如果您希望构建不同的基础网络架构,可以将 keras_ssd7.py 作为模板。该文件提供了文档与注释,帮助您将其改造成不同的基础网络。根据您的需求搭建好基础网络,并在每个您希望进行预测的网络层之上添加一个预测头。为每个预测头创建两个子预测分支:一个用于定位,另一个用于分类。为每个预测头都创建一个锚框层,并将相应定位头的输出作为锚框层的输入。所有张量重塑与拼接操作的结构保持不变,您只需确保包含所有的预测层与锚框层即可。

下载卷积化的 VGG-16 权重

为了从零开始训练 SSD300 或 SSD512,您可以在此处下载在 ImageNet 分类任务上训练至收敛的全卷积化 VGG-16 模型的权重:

VGG_ILSVRC_16_layers_fc_reduced.h5

与下方所有其他权重文件一样,此文件是原始 Caffe 实现仓库中提供的相应 .caffemodel 文件的直接移植版本。

下载原始训练好的模型权重

以下是所有原始训练模型的移植权重。文件名与其对应的 .caffemodel 文件相对应。星号和脚注参考了 原始 Caffe 实现 的 README 中的相关说明。

  1. PASCAL VOC 模型:

  2. COCO 模型:

  3. ILSVRC 模型:

如何在自己的数据集上微调其中一个训练好的模型

如果您想在自己的数据集上微调其中一个提供的训练好的模型,那么您的数据集很可能与该训练模型所使用的类别数量不同。以下教程将解释如何解决这个问题:

weight_sampling_tutorial.ipynb

待办事项

以下事项按优先级排序,列在待办事项清单上。欢迎贡献,但请先阅读 贡献指南

  1. 为基于其他基础网络(如 MobileNet、InceptionResNetV2 或 DenseNet)的 SSD 添加模型定义和训练好的权重。
  2. 添加对 Theano 和 CNTK 后端的支持。这需要将自定义层和损失函数从 TensorFlow 移植到抽象的 Keras 后端。

目前正在开发的内容:

重要说明

  • 所有在 MS COCO 上训练的模型均使用所有 Jupyter 笔记本中提供的较小锚框缩放因子。特别是,“07+12+COCO”和“07++12+COCO”模型使用的是较小的缩放因子。

术语

  • “锚框”:论文中称其为“默认框”,在原始 C++ 代码中称为“先验框”或“先验”,而 Faster R-CNN 论文中则称之为“锚框”。这些术语指的都是同一事物,但我更倾向于使用“锚框”这一名称,因为它最能准确描述这一概念。在 keras_ssd300.pykeras_ssd512.py 中,我仍沿用“先验框”或“先验”的称呼,以保持与原始 Caffe 实现的一致性;但在其他地方,我一律使用“锚框”或“锚点”这一名称。
  • “标签”:就本项目而言,数据集由“图像”和“标签”组成。属于某张图像标注的所有内容都称为该图像的“标签”:不仅包括目标类别标签,还包括边界框坐标。“标签”只是“标注”的简称。此外,在整个文档中,我也基本可以互换使用“标签”和“目标”这两个术语,尽管在训练语境下,“目标”特指标签。
  • “预测层”:所谓“预测层”或“预测器”,是指网络中的所有最后一层卷积层,即所有不向后续卷积层提供输入的卷积层。

版本历史

v0.9.02018/05/06
v0.8.02018/04/19
v0.7.02018/03/26
v0.6.02018/03/05
v0.5.02018/03/04

常见问题

相似工具推荐

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|今天
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

139k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

107.7k|★★☆☆☆|2天前
开发框架图像Agent

NextChat

NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。

87.6k|★★☆☆☆|今天
开发框架语言模型

ML-For-Beginners

ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。

85k|★★☆☆☆|今天
图像数据工具视频

ragflow

RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体(Agent)能力相结合,不仅支持从各类文档中高效提取知识,还能让模型基于这些知识进行逻辑推理和任务执行。 在大模型应用中,幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构(如表格、图表及混合排版),显著提升了信息检索的准确度,从而有效减少模型“胡编乱造”的现象,确保回答既有据可依又具备时效性。其内置的智能体机制更进一步,使系统不仅能回答问题,还能自主规划步骤解决复杂问题。 这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统,还是致力于探索大模型在垂直领域落地的创新者,都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口,既降低了非算法背景用户的上手门槛,也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目,它正成为连接通用大模型与行业专有知识之间的重要桥梁。

77.1k|★★★☆☆|2天前
Agent图像开发框架