2024年7月

道友请了~ 最近小道在修练主修功法《嘉蛙》之余,偶然从一名散修手中得到了一本《CSS秘籍》,刚好近期有自己做微信小程序的打算,这不是瞌睡了给递枕头么。欣喜若狂,翻开第一章,拜读之后受益匪浅。韩老魔说过:好记性不如烂笔头。(韩老魔:我没说过!)遂誊抄一份,分享给各位道友。

@

弹性布局的设计理念是让容器能够根据空间的变化自动调整其
子元素
的大小和位置,从而在不同屏幕尺寸和设备上创建响应式和适应性强的界面。

Flex 布局的核心概念包括:

  1. 容器
    (Flex Container): 当一个元素的
    display
    属性被设置为
    flex

    inline-flex
    时,这个元素就变成了一个 Flex 容器。这将改变其默认的布局行为,使其遵循 Flex 布局规则。
  2. 子项
    (Flex Items): Flex 容器的所有直接子元素都自动成为 Flex 子项,它们将根据容器的 Flex 属性进行布局。
  3. 主轴
    (Main Axis): 这是 Flex 容器中默认的方向,可以是水平或垂直,取决于
    flex-direction
    属性的值。Flex 子项沿主轴排列。
  4. 交叉轴
    (Cross Axis): 这是与主轴垂直的方向。当 Flex 子项堆叠在主轴上时,交叉轴决定了子项的层叠顺序。

容器的属性

justify-content:控制主轴上的子项对齐方式

.box {
  justify-content: flex-start | flex-end | center | space-between | space-around;
}

align-items:控制交叉轴上的子项对齐方式。

.box {
  align-items: flex-start | flex-end | center | baseline | stretch;
}

flex-direction:定义主轴的方向,即子元素的主要排列方向

  • row(默认值):主轴为水平方向,起点在左端。
  • row-reverse:主轴为水平方向,起点在右端。
  • column:主轴为垂直方向,起点在上沿。
  • column-reverse:主轴为垂直方向,起点在下沿。

flex-wrap:是否换行及换行的方向

.box{
  flex-wrap: nowrap | wrap | wrap-reverse;
}
  • nowrap(默认):不换行
  • wrap:换行,第一行在上方
  • wrap-reverse:换行,第一行在下方

align-content:多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用

.box {
  align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}
  • flex-start:与交叉轴的起点对齐。
  • flex-end:与交叉轴的终点对齐。
  • center:与交叉轴的中点对齐。
  • space-between:与交叉轴两端对齐,轴线之间的间隔平均分布。
  • space-around:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
  • stretch(默认值):轴线占满整个交叉轴

flex-flow:flex-direction 和 flex-wrap 的简写形式

  • 这是
    flex-direction

    flex-wrap
    的简写形式,例如
    flex-flow: row wrap;

通过组合使用这些属性,你可以创建出复杂而灵活的布局,适应不同的屏幕尺寸和内容需求。

话不多说,上图!

下面就是对sora的具体阐释:

Sora是OpenAI推出的一款革命性的视频生成模型,能够根据文本指令、静态图像或视频生成长达60秒的完整视频。这一模型基于扩散式模型和自注意力深度学习机制,通过将视频片段转换为静态图像并去除噪音以达到清晰效果。

核心技术与功能

技术架构:

    • Sora结合了Diffusion和Transformer技术,并融合了Google的MAGViT和DeepMind的NaViT等方案,应用了OpenAI DALL-E 3图像描述方案。
    • 使用独特的CLIP模型架构,能够生成高质量的视频描述。
    • 基于Transformer架构的扩散模型,可以灵活地扩展视频内容,改变风格和背景环境。

视频生成能力:

    • 能够生成高度细致的场景、复杂的多角度镜头以及富有情感的角色。
    • 具备3D一致性、远距离相干性和物体持久性等模拟功能。
    • 可以实现对复杂物理运动和逻辑关系的准确捕捉,尽管目前仍存在一些局限性。

应用范围:

    • Sora在短视频、宣传片、动画电影等领域具有广泛的应用前景。
    • 对广告业、电影预告片和短视频行业带来巨大影响,甚至可能颠覆这些行业。
    • 在传媒领域推动智媒的发展,丰富元宇宙、长短视频和MR应用生态。

商业潜力与挑战

商业化潜力:

    • Sora展现出明确的商业化潜力与应用路线,预计到2030年,全球/中国相关市场复合增长率将达45%/87%。
    • 将进一步加深和拓宽OpenAI的护城河,少数巨头将占据底层算法和模型的主导地位。

技术缺陷与挑战:

    • 目前Sora在处理复杂物理运动或逻辑关系时可能存在局限性,例如混淆文字表达或不符合现实世界的物理关系认知等。
    • 需要更丰富的数据和更强的算力来优化其性能。
    • 存在监管难题和版权、隐私等问题,需要与各方合作确保安全使用。

行业影响与未来趋势

行业影响:

    • Sora的出现为视频领域带来了巨大的想象空间,突破了人类在专业能力上的限制,被誉为“世界模拟器”。
    • 对于没有成熟运营、设计、策划团队的中小商家来说,Sora的智能生成可以实现内容生产的低成本化。

未来趋势:

    • 随着业内追赶态势,市场上可能会出现更多类似Sora的模型和产品,促进用户采用率和需求的进一步增长。
    • Sora有望撬动AI多模态应用新热度,对传媒领域带来存量提质增效和新增应用场景。

Sora作为一款先进的视频生成模型,在技术架构、视频生成能力和应用范围等方面都展现了强大的潜力和优势。然而,它也面临着一些技术和监管上的挑战,需要持续优化和改进以实现更广泛的应用和更大的商业价值。

Sora视频生成模型的技术细节和原理是什么?

Sora视频生成模型是OpenAI于2024年2月16日发布的一项革命性技术,旨在通过文本提示、静态图像或现有视频生成或扩展高质量的视频内容。该模型在多个方面展现了显著的技术优势和创新。

技术细节与原理

1. 扩散模型与Transformer架构

Sora基于扩散模型(Diffusion Model),其核心机制是从一个看起来像静态噪声的视频开始,逐步去除噪声,最终生成清晰的视频。这种模型能够处理视频和图片中时空片段的潜在代码,并利用Transformer架构来捕捉前后文全局关系,从而实现每一帧图像的精确生成以及前后时空的一致性。

2. 视频补丁(Patch)

Sora使用了“视频补丁”(Patch)这一高度可扩展且有效的表示形式。视频补丁将视频数据转化为较小的数据单元,类似于GPT中的token,这使得模型能够在不同类型的视频和图像上进行训练。这些补丁作为数据的有效提示,帮助模型更好地理解和生成复杂的视觉场景。

3. 大规模训练与语言理解

Sora采用了大规模训练的方法,并结合了DALL·E 3中的重述技术和ChatGPT的大语言模型,以提高模型的语言理解能力。具体来说,Sora利用重新字幕技术生成高度描述性的字幕,并将简短的用户提示转换为详细的描述,从而生成与提示更匹配的高质量视频。

4. DiT模型与解码器

Sora的核心技术之一是DiT(Denoising Diffusion Transformer)模型。该模型将视频压缩到低维潜在空间中,并将其分解为补丁,然后在低维空间中进行训练。通过逐步添加高斯噪声并学习如何逆向去除噪声,DiT模型能够生成新数据。最后,模型通过对应的解码器,将生成的元素映射回像素空间,完成视频生成任务。

5. 功能特点

  • 长时长视频生成:Sora可以一次性生成长达60秒的高保真视频,这在当前的AI视频生成领域中是一个重大突破。
  • 复杂场景与细节:Sora能够生成包含精细复杂场景、生动角色表情以及复杂镜头运动的视频,确保三维空间中的人物和场景元素保持一致性。
  • 多模态输入:除了文本提示外,Sora还支持根据静态图像或现有视频进行扩展和生成。
  • 灵活采样与全分辨率输出:Sora具有灵活采样和全分辨率输出的功能,可以快速创建不同设备的原始宽高比内容。

总结

Sora视频生成模型通过结合扩散模型、Transformer架构、视频补丁技术、大规模训练和语言理解能力等先进技术,实现了在视频生成领域的多项突破。

Sora在处理复杂物理运动和逻辑关系时的具体局限性有哪些?

Sora在处理复杂物理运动和逻辑关系时存在以下具体局限性:

  1. 无法准确模拟复杂物理现象:尽管Sora能够理解用户指令并生成视频,但其在模拟复杂场景中的物理特性方面仍存在困难。例如,它可能难以准确模拟玻璃杯倾倒、食物咬痕等复杂的物理运动,并且无法推演时间变化。
  2. 混淆因果关系和空间细节:Sora有时会创造出不符合现实世界物理关系认知的画面,特别是在处理复杂、繁琐的物理运动时,可能无法准确模拟因果关系或推演时间变化。此外,该模型还存在混淆部分画面中文字表达的可能性,如广告牌标语不合逻辑或不成文字。
  3. 难以精确描述随时间变化的事件:Sora可能无法准确模拟复杂场景的物理原理,并且可能无法理解因果关系,混淆提示的空间细节,难以精确描述随着时间推移发生的事件。
  4. 对牛顿定律等物理规律的掌握不足:一些外部专家猜测,Sora很难将物理世界中的牛顿定律、湍流方程和量子学定理等规律一条一条在模型中显式罗列出来,这可能是由于神经网络模型的涌现之力所限。
  5. 视频时长限制:Sora生成的视频时长有限制,最长只能生成60秒的视频,对于更长的视频片段,Sora会使用预训练模型进行处理。

目前OpenAI如何解决Sora模型在数据隐私和版权方面的挑战?

目前,OpenAI在解决Sora模型在数据隐私和版权方面的挑战方面采取了多种措施。首先,尽管有报道指出Sora模型的数据集可能包括未经许可获取的大量书籍及其他版权材料,引发了关于是否遵守知识产权法和数据采集伦理标准的争议,但OpenAI声称在训练Sora时使用了“公开可用”和“已许可”的内容。

为了应对这些挑战,OpenAI采取了一系列安全措施和对抗性测试。例如,在产品中使用Sora前,OpenAI承诺将由专家对模型进行对抗性测试,以评估其危害或风险,并核查并拒绝包含极端暴力、性骚扰、歧视、恐怖主义、仇恨图像、他人IP等文本输出的内容。此外,Sora内置的文本提示过滤器可以筛选发送给模型的所有提示,阻止对暴力、色情、仇恨言论以及名人肖像等敏感或不适当内容的请求。视频内容过滤器也能检查生成的视频帧,屏蔽违反OpenAI安全政策的内容。

虽然OpenAI已经采取了一些措施来缓解数据隐私和版权方面的挑战,但仍有公众对其处理敏感数据问题上的透明度和有效性表示担忧。

Sora对广告业、电影预告片和短视频行业的具体影响有哪些实例?

Sora对广告业、电影预告片和短视频行业的具体影响主要体现在以下几个方面:

  1. 降低视频制作成本和门槛:Sora能够帮助直播卖家高效地从长达数小时的直播中剪辑出亮点,并进行混剪和配音等处理,实现内容生产的低成本化。此外,Sora降低了视频制作的门槛和成本,将颠覆广告业、电影预告片、短视频行业和游戏等领域。
  2. 提高内容创作质量和效率:Sora的出现极大地提升了短视频的内容供给和创作质量,可能使短剧重心回归高质量剧本创作。它还能快速、准确地生成生动的现场视频,提高新闻报道的时效性。
  3. 个性化广告推送:在广告推送方面,Sora可以通过收集特定用户的偏好和兴趣来定制专属广告内容,提高顾客购买欲望和品牌忠诚度。
  4. 电影预告片和社交媒体宣传视频的制作:对于即将上映的电影或电视节目,使用Sora可以简化预告片或社交媒体宣传视频的制作过程,只需输入关键情节或场景的简短描述便能渲染出精选内容汇编的短视频,缩短制作周期的同时还能节省一定的制作成本。
  5. 促进技术创新和应用想象:Sora代表了AI赋能的新阶段,将为自学发展、人才培训、科学研究、产品研发等多个领域带来技术革新和应用想象。
  6. 改变内容产业的成本结构和资源支撑体系:短期内,Sora将直接改变很多内容产业的成本结构以及资源支撑体系,长期来看,其构建的基于三维物理世界来创造数字原型的强大引擎,将给一些产业带来深远影响。
  7. 可能引发行业内的就业变化:虽然Sora的问世可能会导致设计师、摄影师和后期制作岗位需求的大量减少,但对于拥有自身风格和调性的创作者来说,Sora只能起到辅助作用。同时,也有观点认为,尽管Sora带来了效率上的提升,但并不是说不需要人了,视频行业还有很多的环节不能被替代,比如创意。

未来市场上类似Sora的视频生成模型有哪些,它们的主要区别和优势是什么?

未来市场上类似Sora的视频生成模型主要有以下几款:Runway和Pika。这些模型与Sora的主要区别和优势如下:

视频时长:

    • Sora:能够生成长达60秒的视频,这是目前市场上其他模型难以匹敌的。
    • Runway和Pika:虽然具体时长未明确提及,但它们在视频时长方面可能不如Sora长,通常只能生成5秒以内的短视频。

场景复杂度和逼真度:

    • Sora:可以生成主题精确、背景细节复杂的场景,并且视频效果逼真。此外,Sora还能够实现多角度镜头切换,保持前后一致性。
    • Runway和Pika:相比之下,它们在处理复杂场景和多角度镜头方面的能力可能较弱,无法生成如此高质量和细节丰富的视频。

物理规律的掌握:

    • Sora:在对物理规律的掌握方面表现不俗,例如在汽车行驶视频中,汽车影子与车身始终契合。
    • Runway和Pika:这方面的能力可能不如Sora强,因为它们缺乏足够的数据标注和清洗工作量,导致模型在逻辑性和连续性方面的表现不如Sora。

多模态能力:

    • Sora:不仅支持文本生成视频,还具备图像生成视频等能力,并能执行各种图像和视频编辑任务。
    • Runway和Pika:虽然也具备一定的多模态能力,但在综合应用和扩展性方面可能不如Sora全面。

技术架构:

    • Sora:采用转化器架构上的扩散模型,能够自主提取信息之间的关联并进行统一化重组,从而实现对文本信息的精准捕捉和渲染。
    • Runway和Pika:具体的技术架构未详细说明,但可能没有像Sora那样先进的技术支撑。

安全性和伦理风险:

    • Sora:尽管存在安全伦理风险,但其领先优势难以被打破,促使社交及内容平台与OpenAI更加紧密地合作。
    • Runway和Pika:同样面临安全性和伦理风险的问题,但可能在应对措施和风险管理方面不如Sora成熟。

Sora在视频时长、场景复杂度、物理规律掌握、多模态能力和技术架构等方面均具有显著优势,而Runway和Pika则在这些方面略显不足。

以上内容就是我的看法,欢迎对ai前沿感兴趣的朋友看看博主其他文章
博主的宝藏小站

database2api
意为
DataBase to API
,即只要有数据库,就可以生成开放
API

database2api
是一款强大而便捷的工具,主要功能是依据现有的数据库自动生成开放的
API
接口,能够为开发者大幅节省时间与精力,尤其适用于那些已拥有数据库且需要提供
API
接口,或者仅会构建数据库、而需要迅速实现
API
接口的场景。

一、功能介绍

database2api
能够智能地解析数据库结构,并根据用户的需求和配置,自动生成相应的
API
接口,让您无需繁琐的手动编码,即可轻松实现数据库与外部应用的交互。

在当今的软件开发中,数据库与外部应用的交互是至关重要的环节。然而,手动编写
API
接口往往是一项耗时且容易出错的工作,而且需要具备某一种后端编程语言,门槛较高。
database2api
的开发旨在解决这一痛点,让开发者能够更专注于业务逻辑的实现,而无需在接口开发上花费过多的时间和精力。

例如,在一个快速发展的项目中,数据库结构可能会频繁变动。使用
database2api
,您只需更新配置文件,即可快速重新生成适应新结构的 API 接口,极大地提高了项目的敏捷性。

无论您是个人开发者还是团队,
database2api
都将是您提升开发效率、加速项目进程的得力助手。

二、技术原理

本工具使用
Ktor
作为底层框架,
JDBC
作为数据库访问层,通过
java.sql.DatabaseMetaData
获取到数据库结构,再通过
Ktor
动态注册
API
路由,实现直接由数据库生成
API
接口。

三、目前已支持的数据库

目前,
database2api
已支持以下多种主流数据库:

  • ✅ Sqlite
  • ✅ MySQL
  • ✅ Postgresql
  • ✅ Microsoft SQL Server
  • ✅ MariaDb

四、优势

  1. 高效便捷:通过简单的配置文件,即可快速生成所需的 API 接口,大大提高开发效率。
  2. 广泛的数据库支持:涵盖了常见的数据库类型,满足不同项目的需求。
  3. 易于维护:生成的接口结构清晰,代码规范,便于后续的扩展和测试。

五、如何使用

  • 点击下载
    或直接克隆仓库编译为
    jar
    ,文件名为
    database2api.jar
  • 目录结构预览
│  database2api.jar  <-- 主程序(必选)
└─ data
     └─ ext          <-- 扩展 API 放置目录(可选)
     └─ web          <-- 静态文件目录(可选)
     └─ setting.ini  <-- 配置文件(必选)
  • 配置文件
    setting.ini
    样例
# API 默认端口
API_PORT=8080
# 生成API的前缀,如设置 api/v1 后,则API变为:http://localhost:{PORT}/api/v1/xxxxxx
API_PREFIX=api
# 是否启用 API 文档,地址 http://localhost:{PORT},设为 false 不会生成 API 文档
API_INDEX_ENABLED=true
# 是否启用接口授权访问功能,默认false,所有 API 无需授权认证即可访问
API_AUTH_ENABLED=false
# 接口授权访问,支持:Basic, JWT。(以后可能会支持其他的授权认证方式)
API_AUTH_TYPE=JWT
# 接口允许访问的用户名密码列表
API_AUTH_USERS=admin:123456,user:1234
# 数据库默认链接地址(主要需要这里的数据库连接字符串,其他数据库连接字符串样例在下方)
DB_URL=jdbc:sqlite://G:/database2api-test/sqlite/fqb.db
# 数据库用户名
DB_USER=
# 数据库密码
DB_PWD=
# 生成API的数据表名称,为空则所有的表都生成API,多个使用英文逗号分割
INCLUDE_TABLES=
# 需要忽略的数据表名称,如果不为空,则指定的表名被过滤,多个使用英文逗号分割
IGNORED_TABLES=
# 是否启用静态网站,启用后,则创建web目录,放入静态资源即可访问
STATIC_WEB_ENABLED=true
# 是否开启扩展API,允许用户使用JS代码使用自定义SQL查询数据库
EXT_API_ENABLED=true
  • 启动方式:
java -jar database2api.jar

启动后控制台日志如下:

2024-07-11 23:43:14.367 [main] DEBUG cn.hutool.log.LogFactory - Use [Slf4j] Logger As Default.
2024-07-11 23:43:14.369 [main] INFO  com.mrhuo.Database2Api - Database2Api: 开始初始化
2024-07-11 23:43:14.382 [main] INFO  com.mrhuo.Database2Api - Database2Api: 开始初始化 API 配置
2024-07-11 23:43:14.431 [main] DEBUG cn.hutool.setting.SettingLoader - Load setting file [D:\work\java\database2api\data\setting.ini]
2024-07-11 23:43:14.444 [main] INFO  com.mrhuo.Database2Api - Database2Api: 静态网站主页[http://127.0.0.1:8080/web/index.html]
2024-07-11 23:43:14.444 [main] INFO  com.mrhuo.Database2Api - Database2Api: 开始初始化数据库
2024-07-11 23:43:14.444 [main] INFO  com.mrhuo.Database2Api - Database2Api: 使用链接字符串[jdbc:sqlite://G:/database2api-test/sqlite/fqb.db]
2024-07-11 23:43:15.236 [main] INFO  com.mrhuo.Database2Api - Database2Api: 获取到所有数据表的表结构
2024-07-11 23:43:15.236 [main] INFO  com.mrhuo.Database2Api - Database2Api: 已保存到文件[D:\work\java\database2api\data\tables.json]
2024-07-11 23:43:15.236 [main] INFO  com.mrhuo.Database2Api - Database2Api: 初始化全部成功
2024-07-11 23:43:15.383 [main] INFO  ktor.application - Autoreload is disabled because the development mode is off.
2024-07-11 23:43:16.241 [main] INFO  ktor.application - Application started in 0.928 seconds.
2024-07-11 23:43:16.242 [main] INFO  ktor.application - Application started: io.ktor.server.application.Application@299266e2
2024-07-11 23:43:16.633 [DefaultDispatcher-worker-1] INFO  ktor.application - Responding at http://127.0.0.1:8080

启动成功后目录结构变为:

│  database2api.jar
└─ data
     │  setting.ini
     │  tables.json      <-- 这是数据库中所有的表名称,下次启动时不会从数据库重新获取,直接使用此文件。如数据库已更新,则删除此文件
     │  table_names.json <-- 这是数据库中所有表结构,下次启动时不会从数据库重新获取,直接使用此文件。如数据库已更新,则删除此文件
     └─ ext              <-- 扩展 API 放置目录(可选)
     └─ web              <-- 静态文件目录(可选)
         └─ index.html   <-- 这是静态网页默认首页

打开浏览器,访问
http://127.0.0.1:8080
,如果开启了配置
API_INDEX_ENABLED=true
,此时界面如下:

端口设置见配置文件
API_PORT=8080

如果设置
API_INDEX_ENABLED=false
,则不会显示
API
文档界面。

随便找个测试获取所有数据:
http://127.0.0.1:8080/api/DEVICE/all

这里的
DEVICE
是数据库中的表名

再测试分页显示数据:
http://127.0.0.1:8080/api/DEVICE/paged

可以看到,仅仅是配置了数据库链接,就自动生成一个完整的可用的API接口,非常方便。

六、接口安全性

现已支持 Basic、JWT 两种授权认证方式,配置如下:

# 是否启用接口授权访问功能
API_AUTH_ENABLED=false
# 接口授权访问,支持:Basic, JWT,
API_AUTH_TYPE=JWT
# 接口允许访问的用户名密码列表
API_AUTH_USERS=admin:123456,user:1234

Basic 授权

  • 需要配置
    API_AUTH_ENABLED=true
    开启API授权
  • 需要配置
    API_AUTH_TYPE=Basic
    (注意大小写)
  • 需要配置
    API_AUTH_USERS=user:pass,user1:pass1
    ,设置允许访问的用户密码对

Basic 授权失败演示

授权失败

Basic 授权成功演示

JWT 授权

  • 需要配置
    API_AUTH_ENABLED=true
    开启API授权
  • 需要配置
    API_AUTH_TYPE=JWT
    (注意大小写)
  • 需要配置
    API_AUTH_USERS=user:pass,user1:pass1
    ,设置允许访问的用户密码对

注意,JWT授权,单独提供了一个用户登录接口,路劲为
/api/api-user-login
,前面的
api
前缀,由配置
API_PREFIX
来设置

JWT 验证失败演示

JWT 验证成功演示

JWT 用户登录成功演示

JWT 用户登录失败演示

七、高级内容

扩展 API

扩展 API 简单来说就是写一个JS文件,作为API扩展接口,执行数据库访问,完成API请求的功能。

开启方式,在配置文件里设置
EXT_API_ENABLED=true
,并在
data
目录下创建
ext
目录,创建文件
get_hello.js
,内容如下:

注意:文件名格式为 {get|post}_{api_name}.js

function main() {
    var name = context.query.name || "no name";
    return "hello " + name;
}

规定函数名
main
,重新启动
database2api
后可看到控制台提示:

2024-07-14 17:26:58.380 [main] INFO  com.mrhuo.plugins.RoutingKt - Database2Api.scriptApiRoute: 创建扩展API[GET:/api/ext/hello]成功

访问该API
http://127.0.0.1:8080/api/ext/hello?name=mrhuo
时,返回结果如下:

{
  "code": 0,
  "msg": "OK",
  "data": "hello mrhuo"
}

注意
:扩展API因为用到了脚本引擎来解释执行脚本代码,性能不是太好,如非必要,请勿过度依赖此功能。

扩展API中目前支持
db
,
context
两个对象。

  • db
    对象主要用于数据库查询,提供
    db.query(sql)
    ,
    db.queryOne(sql)
    ,
    db.exec(sql)
    这三个方法
  • context
    对象主要用于当前请求参数的获取,提供
    context.uri
    ,
    context.method
    ,
    context.headers
    ,
    context.query
    ,
    context.body
    五个对象

附1:数据库连接字符串模板

注意如果数据库有密码,还需要配置 DB_USER DB_PWD

  1. Sqlite
DB_URL=jdbc:sqlite://G:/db.db
  1. MySQL
DB_URL=jdbc:mysql://127.0.0.1:3306/db?useSSL=false&serverTimezone=UTC&charset=utf8mb
  1. PostgreSQL
DB_URL=jdbc:postgresql://127.0.0.1:5432/db
  1. Microsoft SQL Server
DB_URL=jdbc:sqlserver://;serverName=rm-abc.sqlserver.rds.aliyuncs.com;port=1433;databaseName=db_cms
  1. MariaDb
jdbc:mariadb://127.0.0.1:3306/mysql?useSSL=false&serverTimezone=UTC&charset=utf8mb4

附2:开源地址

https://github.com/mrhuo/database2api

版权提示

MIT

论文将
Multiscale Vision Transformers
(
MViTv2
) 作为图像和视频分类以及对象检测的统一架构进行研究,结合分解的相对位置编码和残差池化连接提出了
MViT
的改进版本

来源:晓飞的算法工程笔记 公众号

论文: MViTv2: Improved Multiscale Vision Transformers for Classification and Detection

Introduction


为不同的视觉识别任务设计架构一直很困难,而最广泛采用的架构是结合了简单性和有效性的架构,例如
VGGNet

ResNet
。最近,
Vision Transformers
(
ViT
) 已经显示出能够与卷积神经网络 (
CNN
) 相媲美的性能,涌现出大量将其应用于不同的视觉任务中的工作来。

虽然
ViT
在图像分类中很流行,但在高分辨率目标检测和视频理解任务中的应用仍然具有挑战性。视觉信号的密度对计算和内存要求提出了严峻的挑战,主要因为基于
Transformer
的模型的自注意力块的复杂度与输入长度呈二次方增长。目前有大量的研究来解决这个问题,比较主要的两个为:

  • 使用窗口注意力,在一个窗口内进行局部注意力计算以及对象检测,主要用于目标检测任务。
  • 使用池化注意力,在计算自注意力之前先聚合局部特征的,主要用于视频任务。

后者推动了
Multiscale Vision Transformers
(
MViT
)的研究,以简单的方式扩展
ViT
的架构。整个网络不再固定分辨率,而是构造从高分辨率到低分辨率的多个阶段的特征层次结构。

MViT
专门为视频任务设计,具有最先进的性能。论文将
MViT
作为一个模型系列在图像分类、目标检测和视频分类中进行研究,从而了解它是否能够作为通用的视觉任务的主干网络。

根据研究结果,论文提出了改进的架构 (
MViTv2
),并包含以下内容:

  • 从两个方面来大幅提升池化注意力的性能:
    • 使用坐标分离的位置距离构造相对位置编码,在
      Transformer
      块中注入平移不变的位置信息。
    • 使用残差池化连接来补偿注意力计算中池化缩放带来的影响。
  • 根据标准的密集预测框架
    Mask R-CNN with Feature Pyramid Networks
    (
    FPN
    )改进
    MViT
    结构,并将其应用于目标检测和实例分割。实验表明,池化注意力比窗口注意力机制(例如
    Swin
    )更有效。另外,论文进一步开发了一种简单的混合池化注意力和窗口注意力的方案,可以实现更好的准确性/计算权衡。
  • 论文提供了五种尺寸的
    MViT2
    架构,只需很少的修改就能作为图像分类、对象检测和视频分类的通用视觉架构。实验表明,
    MViT

    ImageNet
    分类的准确率为88.8%,
    COCO
    对象检测的
    APbox
    准确率为58.7%,
    Kinetics-400
    视频分类的准确率为86.1%。其中,在视频分类任务上的准确率是非常出色的。

Revisiting Multiscale Vision Transformers


MViTv1
的关键思想是为低级和高级视觉建模构建不同的阶段,而不是像
ViT
那样全是单尺度块。
MViTv1
缓慢地扩展通道宽度
\(D\)
,同时降低网络输入到输出阶段的序列长度
\(\boldsymbol{\mathit{L}}\)
,具体可以看之前的文章
【MViT:性能杠杠的多尺度ViT | ICCV 2021】

为了在
Transformer
块内执行下采样,
MViT
引入了池化注意力(
Pooling Attention
)。具体来说,对于输入序列
\(X\in{\mathbb{R}}^{L\times D}\)
,分别对查询、键和值张量应用线性投影
\({W}_{Q}\)

\({W}_{K}\)

\({W}_{V}\in\mathbb{R}^{D\times D}\)
,以及池化运算符 (
\({\mathcal{P}}\)
):

\[Q={\mathcal P}_{Q}\left(X W_{Q}\right),\;K={\mathcal P}_{K}\left(X W_{K}\right),\;V={\mathcal P}_{V}\left(X W_{V}\right)

\quad\quad(1)
\]

其中,
\({Q}\in\mathbb{R}^{\tilde{L}\times D}\)
的长度
\(\tilde{L}\)
可减小
\({\mathcal{P}}_{Q}\)
倍,
\(K\)

\(V\)
的长度则可减少
\({\mathcal{P}}_{K}\)

\({\mathcal{P}}_{V}\)
倍。

随后,使用池化注意力计算任意长度
\({\widetilde{L}}\)
的输出序列
\(Z\in\mathbb{R}^{{\tilde{L}}\times D}\)
的输出序列:

\[Z:=\mathrm{Attn}(Q,K,V)=\mathrm{Softmax}\left(Q K^{\textsf{T}}/\sqrt{D}\right)V

\quad\quad(2)
\]

请注意,键和值张量的下采样因子
\({\mathcal{P}}_{K}\)

\({\mathcal{P}}_{V}\)
可能与应用于查询序列的
\({\cal P}_{Q}\)
不同。

池化注意力通过池化查询张量
\({Q}\)
来降低
MViT
不同阶段之间的分辨率,通过池化键
\(K\)
和值
\(V\)
张量来显着降低块内的计算和内存复杂性。

Improved Multiscale Vision Transformers


Improved Pooling Attention

  • Decomposed relative position embedding

虽然
MViT
已经显示出其在
token
之间建模交互方面的能力,但它们关注的是内容,而不是结构。完全依赖于绝对位置编码来提供位置信息的时空结构建模,导致
MViT
忽略了视觉中平移不变性的基本原理。也就是说,即使相对位置保持不变,
MViT
对两个补丁之间的交互进行建模的方式也会根据
token
在图像中的绝对位置而改变。为了解决这个问题,论文将相对位置编码加入到自注意力计算中。

论文将两个输入元素
\(i\)

\(j\)
之间的相对位置表示为位置编码
\(R_{p(i),p(j)}{\in}\mathbb{R}^{d}\)
,其中
\(p({t})\)

\(p({j})\)
表示元素
\(i\)

\(j\)
的空间位置,随后将相对位置编码嵌入到自注意力模块中:

\[\begin{array}{c}
{{\mathrm{Attn}(Q,K,V)=\mathrm{Softmax}\left((Q K^{\textsf{T}}+E^{(\operatorname{rel})})/\sqrt{d}\right)V}}
\\
{{\mathrm{where}}} \ \ \ \ E_{i j}^{\mathrm{(rel)}}=Q_{i}\cdot R_{p(i),p(j)}
\end{array}

\quad\quad(3)
\]

但是,由于
\(R_{p(i),p(j)}\)
涉及时空坐标,存在的位置编码数量为
\({\cal O}(T W H)\)
,计算起来很复杂。为了降低复杂性,论文沿时空轴对元素
\(i\)

\(j\)
之间的距离进行分解计算:

\[R_{p(i),p(i)}=R_{h(i),h(i)}^{\mathrm{h}}+R_{u\iota(i),n\iota(i)}^{\mathrm{w}}+R_{t(i),t(i)}^{\mathrm{t}}

\quad\quad(4)
\]

其中
\(R^{\mathrm{h}},R^{\mathrm{w}},R^{\mathrm{t}}\)
是沿高度、宽度和时间轴的位置编码,
\(h(i)\)

\(w(i)\)

\(t(i)\)
分别表示标记的垂直、水平和时间位置。需要注意的是,
\(R^{t}\)
是可选的,主要是为了支持视频任务中的时间维度。相比之下,论文的位置分解将学习编码的数量减少到
\(\mathcal{O}(H+W+H)\)
,这对早期的高分辨率特征图有很大的帮助。

  • Residual pooling connection

正如
MViTv1
所描述的,池化注意力对于降低注意力块中的计算复杂度和内存消耗非常有效。 一般情况下,在
\(K\)

\(V\)
张量的缩放因子要大于
\(Q\)
张量的缩放因子,而且
\(Q\)
张量仅在跨阶段的分辨率发生变化时才被下采样。为了避免特征信息因为较大的缩放因子而丢失,论文添加了与池化的
\(Q\)
张量的残差池化连接,增加信息流并促进
MViT
中池化注意力块的训练。

如图 2 所示,论文在注意力块内引入了一个新的残差池化连接。具体来说,论文将池化查询张量添加到输出序列
\(Z\)
中:

\[Z:=\operatorname{Attn}\left(Q,K,V\right)+Q

\quad\quad(5)
\]

需要注意的是,输出序列
\(Z\)
与池化张量
\(Q\)
的长度相同。

这里的残差连接和池化操作都是必须的,在非跨阶段的块中也要补一个步幅为 1 的池化操作对
\(Q\)
进行处理。由于这种改进的计算增加很少,所以仍能维持池化注意力的低计算复杂度。

MViT for Object Detection

  • FPN integration

MViT
的层次结构分四个阶段生成多尺度特征图,可以自然地对接到目标检测的特征金字塔网络(
FPN
)中,如图 3 所示。通过将
FPN

MViT
主干结合使用,论文将其应用于不同的检测架构(例如
Mask R-CNN
)。

  • Hybrid window attention

Transformer
中的自注意力对
token
数量具有二次方复杂度,这个问题在高分辨率输入的目标检测中更加严重。

池化注意力和窗口注意力都通过在计算自注意力时减少查询、键和值张量的大小来控制自注意力的复杂性,但它们的本质是不同的:

  • 池化注意力池通过局部聚合对特征进行下采样,但保持全局自注意力计算。
  • 窗口注意力保持张量的分辨率,将输入划分为非重叠窗口并在局部执行自注意力计算。

默认窗口注意力仅在窗口内执行本地自注意力,因此缺乏跨窗口的连接。与使用滑动窗口来缓解此问题的
Swin
不同,论文提出了一种简单的混合窗口注意力(
Hwin
)来添加跨窗口连接。

Hwin

FPN
的最后三个阶段的所有块输入(最后阶段的最后一个块外)计算窗口注意力得到局部特征,最后一个块则进行全局自注意力(或池化注意力)计算使得
FPN
的输入特征图包含全局信息。

  • Positional embeddings in detection

与固定分辨率输入的
ImageNet
分类不同,目标检测的训练通常包含不同大小的输入。对
MViT
中的位置编码(绝对或相对),论文首先从
ImageNet
预训练权重初始化参数,对应
\(224\times224\)
输入的位置编码,然后将其插值到相应的大小以进行目标检测训练。

MViT for Video Recognition

由于升级的池化注意力可以泛化到时空域,
MViT
可以很简单地应用于视频识别任务(例如
Kinetics
)。虽然
MViTv1
仅关注
Kinetics
数据集上的预训练,
MViTv2
也会研究从
ImageNet
数据集上预训练的效果。

应用于图像的
MViT
与应用于视频的
MViT
对比有三个不同之处:

  • 1)主干中的映射层需要将输入投影到时空立方体而不是
    2D
    图像块。
  • 2)池化运算符需要池化时空特征图。
  • 3)相对位置编码加入时空位置。

由于 1) 和 2) 中的投影层和池化运算符默认由卷积层实现,因此论文使用
inflation
初始化,即将预训练模型中2D卷积层的权值除以
T
再复制
T
份形成3D卷积层(文章描述的做法跟参考文献有出入)。对于 3),论文基于提出的分离相对位置编码进行计算,简单地用预训练权值初始化空间位置编码,然后将时空位置编码初始化为零。

MViT Architecture Variants

如表 1 所示,论文构建了几个不同数量参数和计算量的
MViT
变体,以便与其他
ViT
模型进行比较。每个变体主要改变基础的通道尺寸、每个阶段的块数和块中的头数,一共有五个变体(
Tiny

Small

Base

Large

Huge
)。需要注意,论文使用较少的头数量来改善运行时间,这对计算量和参数量是没有影响的。

遵循
MViT
的池化注意力设计,论文默认在所有池化注意力块中使用键和值池化,并且池化步幅在第一阶段设置为 4,并根据阶段的分辨率自适应地衰减跨阶段的步幅。

Experiments: Image Recognition


论文对
ImageNet
分类和
COCO
对象检测进行了实验。

Image Classification on ImageNet-1K

ImageNet-1K
数据集上的性能如表 2 所示,论文改进的
MViTv2
具有更高的准确性,并且计算量和参数更少。

ImageNet-21K
数据集上的性能如表 3 所示。

Object Detection on COCO

MViTv2
作为不同检测框架的主干网络的性能如表 5 所示。默认采用
Hwin
注意力,窗口设置为
\([56, 28, 14, 7]\)
,使用
ImageNet-1k
预训练。

Ablations on ImageNet and COCO

不同注意力机制在图像分类和目标检测任务中的表现如表 4 所示。

不同位置编码方式在图像分类和目标检测任务中的表现如表 6 所示。

不同的残差池化策略在图像分类和目标检测任务中的表现如表 7 所示。

模型运行耗时在图像分类和目标检测任务中的表现如表 8 所示。

FPN对目标检测的影响如表 9 所示。

Experiments: Video Recognition


Main Results

在不同量级的
Kinetics
数据集上的视频任务性能对比。


SSv2
数据集上的视频任务性能对比。

Ablations on Kinetics


Kinetics-400
数据集上对比不同预训练模型的性能。

Conclusion


论文提出了改进的
Multiscale Vision Transformer
作为视觉识别的通用主干网络。通过实验表明,
MViT
在图像分类、目标检测、实例分割和视频识别等广泛使用的基准测试中达到了最很不错的精度。



如果本文对你有帮助,麻烦点个赞或在看呗~
更多内容请关注 微信公众号【晓飞的算法工程笔记】

work-life balance.

  1. 类型检查和转换:当你需要检查对象是否为特定类型,并且希望在同一时间内将其转换为那个类型时,模式匹配提供了一种更简洁的方式来完成这一任务,避免了使用传统的as和is操作符后还需要进行额外的null检查。

  2. 复杂条件逻辑:在处理复杂的条件逻辑时,特别是涉及到多个条件和类型的情况下,使用模式匹配可以使代码更加清晰易读。通过模式匹配,可以将复杂的if-else链或switch语句简化,使逻辑更直观。

  3. 解构复合类型:当你需要从复合类型(如元组、自定义类等)中提取值时,模式匹配允许你直接在条件检查中进行解构,这样可以避免编写额外的解构代码,使得代码更加简洁。

  4. 范围检查:对于需要进行范围检查的场景,如检查一个数是否落在某个区间内,使用C# 9.0引入的关系模式可以极大简化代码,使得范围检查逻辑一目了然。

  5. 逻辑组合:在需要对多个条件进行逻辑组合的情况下,如需要检查一个值是否满足多个条件之一或全部条件,使用逻辑模式可以直接在模式匹配表达式中使用and、or和not运算符,避免了复杂的逻辑嵌套。

  6. 数据验证:模式匹配可以用于数据验证场景,特别是当验证逻辑涉及到类型检查、值范围检查或特定属性值检查时。通过模式匹配,可以在单个表达式中完成所有这些检查,使得验证逻辑更加紧凑和易于维护。

  7. 多态行为:在处理需要根据对象类型执行不同操作的多态行为时,模式匹配提供了一种更灵活的方式来替代传统的虚方法或接口实现。这使得在不修改原有类层次结构的情况下,能够更容易地扩展或修改行为。

  8. 替代访问者模式:在实现访问者设计模式时,模式匹配可以作为一种更简洁的替代方案,特别是在处理复杂的对象结构时。通过模式匹配,可以直接在一个地方处理所有类型的情况,而不需要为每种类型创建单独的访问者方法。

模式匹配的这些用途展示了它在简化代码、提高可读性和灵活处理不同类型和条件的强大能力。随着C#语言的发展,模式匹配的功能和应用场景将会进一步扩展和深化。

下面我们看下一些经典且好用的模式匹配编码风格:

is
断言 变量s已被安全地转换为string类型

object obj = "Hello, World!";
if (obj is string s) {
    Console.WriteLine(s);
}

switch
允许使用多种模式,包括类型模式、常量模式和var模式 ,无需我们提前做转换以节省编码量

switch (obj) {
    case 0:
        Console.WriteLine("Zero");
        break;
    case var value:
        Console.WriteLine($"Value: {value}");
        break;
}

C# 8.0引入了属性模式,允许基于对象的属性进行模式匹配

public class Person {
    public string Name { get; set; }
    public int Age { get; set; }
}
Person person = new Person { Name = "John", Age = 30 };
//通俗易懂属性模式:如果person不为null,且name==john 并且age>=18的时候
if (person is { Name: "John", Age: >= 18 }) {
    Console.WriteLine("John is an adult.");
}

C# 9.0引入的逻辑模式,它允许使用逻辑运算符
and

or

not
来组合模式。

if (number is > 0 and < 10 or 100) {
    Console.WriteLine("Number is between 0 and 10 or equals 100.");
}

元组模式允许你对元组的元素进行模式匹配,这在处理元组返回值或多值情况时非常有用

var numbers = (1, "one", 18);
if (numbers is (1, string name, int age)) {
    Console.WriteLine($"The name of 1 is {name}, age {age}!");
}

列表模式
允许对数组、列表等集合进行模式匹配,可以匹配集合的长度、元素等属性。这对于处理集合数据时进行模式匹配提供了极大的便利。

int[] numbers = { 1, 2, 3 };
if (numbers is [1, 2, 3]) {
    Console.WriteLine("The array contains the numbers 1, 2, and 3 in that order.");
}

切片模式
允许你匹配集合的一部分,而不是整个集合。这在你只关心集合的某个特定部分时特别有用。

int[] numbers = { 0, 1, 2, 3, 4 };
if (numbers is [0, .., 4]) {
    Console.WriteLine("The array starts with 0 and ends with 4.");
}

当然这里只是介绍了部分好用的模式匹配,随着C#语言的逐代增强,可能会有更多的新特性和改进被引入。