JPEG图像格式加速神经网络训练--使用DCT训练CNN

JPEG图像格式加速神经网络训练

  • JPEG图像格式加速神经网络训练
    • 工作原理
      • DCT系数与JPEG
      • 直接利用DCT系数
        • 阶段 1: 数据准备
          • 步骤 1: 读取JPEG文件结构
          • 步骤 2: 提取量化表和Huffman表
          • 步骤 3: 解析图像数据
          • 步骤 4: 反量化
          • 步骤 5: 获取DCT系数
        • 阶段 2: 输入处理
          • 预处理 1: 正规化(Normalization)
          • 预处理 2: 中心化(Centering)
          • 预处理 3: 选择性剔除
          • 预处理 4: 量化系数补偿
          • 预处理 5: 重排DCT系数
          • 预处理 6: 分布调整
          • 预处理 7: 批量处理
        • 阶段 3: 网络架构适配
          • 1. 输入层调整
          • 2. 卷积核大小和卷积层设计
          • 3. 频率选择性特征映射
          • 4. 抗量化噪声能力
          • 5. 特征融合策略
          • 6. 模型深度和复杂性
          • 7. 训练策略
          • 8. 输出层和损失函数
          • 9. 软件和硬件兼容性
          • 例子
        • 阶段 4: 模型训练
        • 阶段 5: 模型评估与优化
        • 阶段 6: 部署与推理
    • 实际应用
      • 网络训练加速
      • 保留信息完整性
    • 相关开源内容
    • 相关论文

JPEG图像格式加速神经网络训练

在处理和利用图像数据训练神经网络的过程中,JPEG是一种广泛采用的图像格式。传统的方法需要将JPEG图像解码成RGB像素值后才能够输入给卷积神经网络(CNN)进行训练,这个解码过程不仅增加了额外的计算成本,还可能导致原始数据信息的丢失。然而,“从JPEG图像格式直接加速神经网络(Faster Neural Networks Straight from JPEG)”的研究,提出了一种新的观点:直接在JPEG图像格式的块状离散余弦变换(DCT)系数上训练CNN。
在这里插入图片描述
研究结果(https://www.uber.com/en-CA/blog/neural-networks-jpeg/):
在这里插入图片描述

我们发现速度的提升仅仅是由于输入层和后续层上的数据量较小,正如人们所期望的那样。精度的提高主要归功于 DCT 表示的具体使用,结果证明它对于图像分类非常有效。令人惊讶的是,简单地将 ResNet-50 的第一个卷积层替换为步长 8 DCT 变换会带来更好的性能。它的效果甚至比完全相同形状的学习变换还要好。换句话说,与传统观点相反,我们发现使用较大的感受野和步幅(各 8 个)比使用较小的感受野和步幅效果更好,并且对第一层进行硬编码比学习它效果更好。当Residual Networks在 2015 年确立了 ImageNet 的最新技术水平时,只需用冻结的 DCT 替换第一层就可以进一步提高现有技术水平。

工作原理

DCT系数与JPEG

JPEG图像文件使用的压缩技术基于一种称为离散余弦变换(Discrete Cosine Transform,DCT)的方法。DCT是一种将信号或图像矩阵转换到不同频率空间的技术。在JPEG压缩中,DCT用于将图像数据从其空间域(即原始像素)转换到频率域。这个转换的结果就是一组DCT系数,它们描述了图像区块的频率成分。

具体来说,JPEG压缩过程包括以下步骤:

  1. 颜色空间转换:首先,图像从RGB颜色空间转换到YCbCr颜色空间。Y代表亮度(也就是灰度),而Cb和Cr代表色差分量。

  2. 分块处理:图像被分割成8x8像素的块。

  3. 计算DCT:对每个8x8的块进行DCT,由空间域的64个像素值到频率域的64个DCT系数。这些DCT系数代表了不同频率的信息,其中的第一个系数(DC系数)代表块的平均亮度,其余的63个系数(AC系数)代表更高频率内容的细节。

  4. 量化:DCT系数接着被量化,以实现数据压缩。量化过程中高频系数通常会被大幅度缩减,因为人类视觉对这些细节的敏感度较低。

  5. 编码与压缩:量化后的DCT系数然后用不同的编码技术(如Huffman编码)进行编码,并存储为JPEG文件。

在传统的图像处理流程中,一个JPEG文件在被送入神经网络之前,需要将上述过程逆转,通过解码、逆DCT及色域转换回RGB空间。然而,“直接从JPEG的DCT系数训练神经网络”这一技术提倡跳过这些步骤,直接使用压缩后的DCT系数作为网络的输入,从而减少计算开销和加快训练速度。

直接利用DCT系数

该研究利用的关键想法是:由于DCT系数已经包含在JPEG文件中,可以直接将这些系数用作网络的输入,省去了将JPEG解码到RGB像素的步骤。这种方法降低了模型训练的前期准备工作,并且保留了图像的原始频率特征。

以下是一个基于DCT系数直接应用于机器学习的流程:

阶段 1: 数据准备

在数据准备阶段,无需将JPEG图像文件解压缩到完整的RGB像素矩阵,而是直接解析JPEG文件,提取图像的DCT系数。

将JPEG图像文件解析为DCT系数涉及到对JPEG文件格式的了解以及图像解码的相关技术。通常,这个过程涉及以下步骤:

步骤 1: 读取JPEG文件结构

JPEG文件由多个不同的段组成,如Start of Image (SOI)段、Define Quantization Tables (DQT)、Start of Frame (SOF)、Huffman Tables (DHT)、Start of Scan (SOS)和图像数据本身等。

步骤 2: 提取量化表和Huffman表

量化表和Huffman表是解码JPEG图像至关重要的部分。它们分别定义了如何量化DCT系数和如何使用Huffman编码对这些系数进行失真压缩。

步骤 3: 解析图像数据

在SOS段之后,实际的图像数据开始。这些数据是使用Huffman编码压缩过的。解码器需要使用提取的Huffman表来解码这些数据,还原成原始的DCT系数。

步骤 4: 反量化

由于在JPEG编码过程中,DCT系数被量化以减少数据大小,因此解码包括反量化步骤,这涉及到将编码的DCT系数与量化表中的值相乘,以恢复大致的原始DCT系数。

步骤 5: 获取DCT系数

完成上述步骤后,就可以获得每个8x8像素块的DCT系数。这些系数现在可以直接用于机器学习或其他图像处理任务。

为了实现以上步骤,可以使用各种编程语言的库或工具。例如,在Python中,可以使用jpeg4pyPillow库进行JPEG图像的解析与处理。下面是一个简单的代码示例,展示如何利用Pillow库获取JPEG图像的DCT系数:

from PIL import Image
import numpy as np
import jpeg4py as jp

# 使用jpeg4py库加载图片
image = jp.JPEG('path_to_your_image.jpg').decode()

# 此时,image变量包含了图像的DCT系数
# 你可以进一步处理DCT系数或者直接使用它们进行机器学习训练

需要注意的是,不同的库可能提供不同层次的解析能力。某些库可能直接提供DCT系数,而其他较低级的库则可能需要进行一些额外的步骤来手动提取这些信息。为了处理更加复杂的图像或进行大量图像的处理,可能需要深入了解JPEG文件格式。

阶段 2: 输入处理

针对从JPEG文件中提取出的DCT系数,进行必要的归一化或其他预处理操作,使其适应训练模型的输入要求。

下面是一些通常在DCT系数上执行的预处理步骤:

预处理 1: 正规化(Normalization)

由于量化过程影响了DCT系数的数值范围,所以常常需要将DCT系数进行正规化处理,以保证输入数据处于相对统一和有助于网络学习的范围内。正规化可以简单地通过将系数值缩放到一个特定的范围,比如[0, 1]或[-1, 1]。

预处理 2: 中心化(Centering)

中心化是将数据的平均值移动到原点的过程。对于DCT系数,这意味着从每个系数中减去该系数在训练集中的平均值,有助于减少不同图片间亮度差异导致的影响。

预处理 3: 选择性剔除

在JPEG压缩时,很多高频的DCT系数可能因为量化操作被设置为零或近零值,这些系数包含的信息量很少。因此,有时可以选择性剔除一些不重要的高频DCT系数,以减少输入数据的维度。

预处理 4: 量化系数补偿

考虑到JPEG的量化过程会导致图像质量的损失,可以通过对量化系数进行补偿来尝试恢复一些信息,例如通过乘以量化表中的逆量化系数。

预处理 5: 重排DCT系数

通常DCT系数是按照Zigzag顺序排序的,这种顺序是为了更好的数据压缩。但在输入到CNN之前,可能需要将这些系数重排到更适合卷积操作的顺序。

预处理 6: 分布调整

DCT系数的分布可能会由于图像内容而有很大的变化,要使用机器学习算法,一种可能的预处理步骤是转换DCT系数的分布,让其更接近于正态分布或其他有利于模型学习的分布。

预处理 7: 批量处理

在准备用于神经网络训练的批量数据时,需要确保所有数据的维度一致,可以通过填充或剪切来保证这一点。

这些预处理步骤不是全部必须执行的。实际操作中,适用哪些预处理取决于具体的应用场景、所使用的机器学习模型和期望达到的性能指标。进行适当的数据探索和实验来确定最优预处理步骤通常是实践中的一个重要环节。

阶段 3: 网络架构适配

设计适合DCT系数输入的网络架构,这可能包括改变传统用于像素输入的卷积层,使其能够处理频率域的数据。例如,可以使用适应频率特征的卷积滤波器。

设计能够接受DCT系数作为输入的网络架构,需要考虑DCT数据的特性和卷积神经网络(CNN)对输入数据的预期。DCT系数代表的是图像块的频率信息,和常规的基于像素的图像数据有所不同。这意味着网络需要能够处理和学习这种频率域的信息。以下是设计适应DCT输入的网络架构的一些关键考虑因素:

1. 输入层调整

CNN的第一个层通常是一个卷积层,用于提取输入数据的特征。对于DCT输入,网络的输入层需调整为接受单通道或多通道的DCT系数,这取决于使用的量化表的数量和种类(例如Y, Cb, Cr通道)。

2. 卷积核大小和卷积层设计

由于DCT块是8x8的大小,通常网络中第一层卷积(或前几层)的卷积核大小需要匹配这个尺寸,或者设计为能够有效处理这种尺寸的卷积核。这有助于网络学习到这些8x8块内的频率模式。

3. 频率选择性特征映射

可以设计专门针对低频和高频DCT系数的特征映射,以此分别处理图像的不同频率成分。例如,网络可以有分支或模块,专注于低频信息的广义内容和高频信息的细节特征。

4. 抗量化噪声能力

DCT系数由于经过了压缩和量化,可能包含噪声。网络设计需要具备对量化噪声的鲁棒性,通过网络层的设计和训练策略来减少这种噪声的不利影响。

5. 特征融合策略

在网络中应用特征融合的策略可以是关键,特别是对于将低频和高频信息结合起来的任务。可以使用不同级别的特征融合技术,如串联、加和或者注意力机制。

6. 模型深度和复杂性

考虑模型的深度和复杂性,以保证模型可以提取足够丰富的特征而不致过于复杂导致过拟合。DCT系数可能不需要非常深层的网络来处理,深度和复杂度需要通过实验来确定。

7. 训练策略

设计网络时应考虑训练策略,如使用预训练权重、数据增强、正则化技术,以及学习率调度,以提高训练的稳定性和模型的泛化能力。

8. 输出层和损失函数

根据任务(分类、回归、检测等)选择适当的输出层和损失函数,以确保网络输出符合期望的任务结果。

9. 软件和硬件兼容性

确保所设计的网络架构能够在目标软件框架和硬件上有效运行,以利用现有的算力资源。

在设计适应DCT输入的网络架构时,实验和迭代是非常重要的。通常需要进行多次试验来找到性能最佳的网络配置。利用现有的神经网络架构为基础,并对其进行适应性调整,是一种常见的策略。这样做的好处是可以借鉴已有架构的优点,同时为特定数据类型做出优化。

例子

构建一个接受DCT系数输入的最简单的示例神经网络通常会从一个基本的卷积神经网络(CNN)开始,其核心功能是识别图像中的模式,即使是在频率域中的模式。以下是一个简单CNN框架的实现,用于处理DCT系数输入,我们将以Python和Keras作为示例:

from keras.models import Sequential
from keras.layers import Conv2D, Flatten, Dense, MaxPooling2D

# 假设我们已经有了DCT系数的输入数据,大小为(batch_size, 8, 8, 1),
# 其中8x8代表一个DCT块的大小,1代表单通道(灰度图)。

# 创建一个Sequential模型
model = Sequential()

# 添加第一个卷积层,用于提取DCT系数的特征,使用较小的卷积核进行细粒度的特征检测
# 选择合适的卷积核大小和数量。这里使用3x3大小的卷积核,并定义了16个不同的卷积核。
model.add(Conv2D(16, (3, 3), activation='relu', input_shape=(8, 8, 1)))

# 添加最大池化层以减小特征图的维度,同时保留最重要的特征
model.add(MaxPooling2D((2, 2)))

# 展平特征图,以便可以传递给后面的全连接层
model.add(Flatten())

# 添加一个全连接层(即稠密层),这里用64个神经元
model.add(Dense(64, activation='relu'))

# 最后添加输出层,注意这里的节点数需要根据你的任务来设置
# 例如,如果是一个10类分类问题,则应该有10个节点
model.add(Dense(10, activation='softmax'))  # 适用于10类分类的输出层

# 编译模型,选择合适的损失函数和优化器。
# 对于多类分类,损失函数通常是'categorical_crossentropy'。
model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# 打印网络结构
model.summary()

# 现在模型已经定义好,接下来可以在准备好的DCT系数数据集上对其进行训练。

在这个示例中,输入假定是一批8x8大小的单通道DCT系数。网络开始于一个卷积层,随后是池化层和全连接层,最后是适合分类任务的输出层。需要根据具体的应用场景调整网络的深度、卷积层的数量、卷积核的大小、层间连接方式以及激活函数等。此示例网络假设您已经有了预处理后的DCT系数数据,并准备好用于训练。在实际应用中,您还需要写代码来加载和预处理JPEG图像以获得DCT系数。

阶段 4: 模型训练

正常训练神经网络,只是这一次输入的是处理过的DCT系数而不是完整的像素数据。依旧通过前馈、梯度下降等步骤来训练网络,优化模型参数。

阶段 5: 模型评估与优化

在验证集上评估模型的性能,并根据实际应用场景调整网络结构和参数,以进一步提升模型的准确率和效率。

阶段 6: 部署与推理

将训练好的模型部署到实际的应用环境中,直接使用DCT系数进行快速推理。

使用DCT系数的关键优点是能够减少图像从JPEG格式到输入张量转换过程中产生的计算开销。而且,由于避免了解压缩和颜色空间转换的步骤,理论上可以保留更多的原始图像信息,有助于提高模型的性能。

然而,直接使用DCT系数需要克服一些挑战,比如设计一个能够适应JPEG压缩特性的网络架构,以及适应于量化后DCT系数的范围和分布的预处理技术。此外,由于DCT系数包含大量的高频信息,可能已在JPEG压缩过程中被抑制,因此模型需要在高频信息不足的情况下进行有效学习。

实际应用

网络训练加速

采用直接从JPEG图像的DCT系数训练CNN的方法,可以显著减少数据预处理的时间,从而加速整个网络训练过程。

保留信息完整性

由于没有进行额外的解码或转换,原始的图像信息得以更好地保留,在某些情况下,这可能有助于提高模型的表现。

相关开源内容

  1. jpeg-sandbox

    • 描述:在浏览器中交互式编辑任何JPEG图像中的个别DCT块。
    • 语言:JavaScript
  2. epeg

    • 描述:使用极小的开销进行极快的JPEG/JPG缩略图缩放,它利用了libjpeg的特性,即只解码重建所需大小图像的DCT系数即可加载图像。
    • 语言:C
  3. jpeg2dct

    • 描述:直接来自 JPEG 的更快神经网络:jpeg2dct 子例程。
    • 语言:C++
  4. jpgjs

    • 描述:JPEG/DCT数据解码器。
    • 语言:JavaScript
  5. jpegio

    • 描述:一个Python包,用于访问JPEG文件格式的内部变量,如DCT系数和量化表。
    • 语言:C

相关论文

  • [1] Faster Neural Networks Straight from JPEG: 本文提出并探讨了直接在JPEG的DCT系数上训练CNN的简单理念。
  • [2] Accelerating Faster Neural Networks Straight from JPEG: 这篇文章进一步探讨了如何通过DCT系数加速卷积神经网络的训练。
  • [3] Faster Neural Networks Straight from JPEG - OpenReview: 提供了关于使用JPEG格式中可用的DCT系数作为卷积网络输入表示的有效性的评述。

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

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

相关文章

轻薄型工业平板亿道EM-T195,续航持久高达10小时

时尚而坚固的 10.1英寸EM-T195触摸屏平板电脑融合了高耐力和无与伦比的适应性,可抵御极端天气条件和多重冲击,借助强大的联发科8核处理器,它可以从容面对任何工作挑战。 其读取能力(2D 成像器)结合其坚固性&#xff0…

波奇学Linux: 文件描述符

文件和操作系统的关系 操作系统控制进程,文件的打开是在进程中进行。意味着用来控制进程的PCB必然有文件的信息,操作系统通过控制PCB的信息来控制文件的读写。 Q1:如何证明文件打开是在进程中进行? 编写c文件调用fopen来操作文件…

数据结构——单向链表和双向链表的实现(C语言版)

目录 前言 1. 链表 1.1 链表的概念及结构 1.2 链表的分类 2. 单链表接口实现 2.1 数据结构设计与接口函数声明 2.2 创建结点,打印,查找 2.3 尾插,头插,尾删,头删 2.4 插入或删除 2.4.1在指定位置后 2.4.2在…

OpenCV-34 顶帽操作和黑帽操作

一、顶帽操作(TOPHAT) 顶帽 原图 - 开运算 开运算的效果是去除图像外的噪点,因此原图 - 开运算就得到了去掉的噪点。 通过API --- morphologyEx(img, MORPH_TOPHAT, kernel) 示例代码如下&…

C++基础知识点预览

一.绪论: 1.1 C简史: 与C的关系: 被设计为C语言的继任者,C语言是一种过程型语言,程序员使用它定义执行特定操作的函数,而C是一种面向对象的语言,实现了继承、抽象、多态和封装等概念。C支持类&…

Spring Boot 笔记 004 自动配置和自定义starter

003讲到了导入jar包中的方法,但其实是个半成品,别人写的jar包中的方法我要在自己的代码中去调用,非常的不方便。原则上写给别人用的jar包,人家要能直接用,而不用写注入的方法。 在springboot中会自动扫描imports文件中…

【FFmpeg】ffplay 命令行参数 ⑤ ( 设置音频滤镜 -af 参数 | 设置统计信息 -stats 参数 | 设置同步时钟类型 -sync 参数 )

文章目录 一、ffplay 命令行参数 - 音频滤镜1、设置音频滤镜 -af 参数2、常用的 音频滤镜 参数3、音频滤镜链 示例 二、ffplay 命令行参数 - 统计信息1、设置统计信息 -stats 参数2、关闭统计信息 -nostats 参数 三、ffplay 命令行参数 - 同步时钟类型1、设置同步时钟类型 -syn…

从Socket中解析Http协议实现通信

在网络协议中,Socket是连接应用层和运输层的中间层,主要作用为了通信。Http协议是应用层上的封装协议。我们可以通过Http协议的规范解析Socket中数据,完成Http通信。 首先,我们先回顾一下Http协议的规范。主要复习一下&#xff0c…

YOLOv8改进 | 检测头篇 | 独创RFAHead检测头超分辨率重构检测头(适用Pose、分割、目标检测)

一、本文介绍 本文给大家带来的改进机制是RFAHead,该检测头为我独家全网首发,本文主要利用将空间注意力机制与卷积操作相结合的卷积RFAConv来优化检测头,其核心在于优化卷积核的工作方式,特别是在处理感受野内的空间特征时。RFAConv主要的优点就是增加模型的特征提取能力,…

【web前端开发】HTML及CSS简单页面布局练习

案例一 网页课程 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wi…

Linux中ps/kill/execl的使用

ps命令&#xff1a; ps -aus或者ps -ajx或者 ps -ef可以查看有哪些进程。加上 | grep "xxx" 可以查看名为”xxx"的进程。 ps -aus | grep "xxx" kill命令&#xff1a; kill -9 pid 杀死某个进程 kill -l 查看系统有哪些信号 execl函数&#…

在Ubuntu上部署Stable Video Diffusion动画制作

Stable Diffusion团队推出的开源模型Stable Video Diffusion&#xff0c;支持生成约3秒的视频&#xff0c;分辨率为5761024。通过测试视频展示了其令人瞩目的性能&#xff0c;SVD模型是一个生成图像到视频的扩散模型&#xff0c;通过对静止图像的条件化生成短视频。其特点主要包…

Vue源码系列讲解——虚拟DOM篇【三】(更新子节点)

1. 前言 在上一篇文章中&#xff0c;我们了解了Vue中的patch过程&#xff0c;即DOM-Diff算法。并且知道了在patch过程中基本会干三件事&#xff0c;分别是&#xff1a;创建节点&#xff0c;删除节点和更新节点。创建节点和删除节点都比较简单&#xff0c;而更新节点因为要处理…

使用cocos2d-console初始化一个项目

先下载好cocos2d-x的源码包 地址 https://www.cocos.com/cocos2dx-download 这里使用的版本是 自己的电脑要先装好python27 用python安装cocos2d-console 看到项目中有个setup.py的一个文件 python setup.py 用上面的命令执行一下。 如果执行正常的话回出现上面的图 然后…

教师如何找答案? #知识分享#职场发展

当今社会&#xff0c;随着信息技术的迅猛发展&#xff0c;大学生们在学习过程中面临着各种各样的困难和挑战。而在这些挑战中&#xff0c;面对繁重的作业和复杂的题目&#xff0c;大学生搜题软件应运而生 1.快解题 这是一个网站 是一款服务于职业考证的考试搜题软件,拥有几千…

CVE-2018-19518 漏洞复现

CVE-2018-19518 漏洞介绍 IMAP协议&#xff08;因特网消息访问协议&#xff09;它的主要作用是邮件客户端可以通过这种协议从邮件服务器上获取邮件的信息&#xff0c;下载邮件等。它运行在TCP/IP协议之上&#xff0c;使用的端口是143。在php中调用的是imap_open函数。 PHP 的…

特征工程:数据平衡

目录 一、前言 二、正文 Ⅰ.基于过采样算法 Ⅱ.基于欠采样算法 Ⅲ..基于过采样和欠采样的综合算法 三、结语 一、前言 大多数情况下&#xff0c;使用的数据集是不完美的&#xff0c;会出现各种各样的问题&#xff0c;尤其针对分类问题的时候&#xff0c;会出现类别不平衡的…

可达鸭二月月赛——基础赛第六场(周五)题解,这次四个题的题解都在这一篇文章内,满满干货,含有位运算的详细用法介绍。

姓名 王胤皓 T1 题解 T1 题面 T1 思路 样例输入就是骗人的&#xff0c;其实直接输出就可以了&#xff0c;输出 Hello 2024&#xff0c;注意&#xff0c;中间有一个空格&#xff01; T1 代码 #include<bits/stdc.h> using namespace std; #define ll long long int …

机器学习---学习与推断,近似推断、话题模型

1. 学习与推断 基于概率图模型定义的分布&#xff0c;能对目标变量的边际分布&#xff08;marginal distribution&#xff09;或某些可观测变量 为条件的条件分布进行推断。对概率图模型&#xff0c;还需确定具体分布的参数&#xff0c;称为参数估计或学习问 题&#xff0c;…

MATLAB环境下一维时间序列信号的同步压缩小波包变换

时频分析相较于目前的时域、频域信号处理方法在分析时变信号方面&#xff0c;其主要优势在于可以同时提供时域和频域等多域信号信息&#xff0c;并清晰的刻画了频率随时间的变化规律&#xff0c;已被广泛用于医学工程、地震、雷达、生物及机械等领域。 线性时频分析方法是将信…
最新文章