BLIP 系列论文(BLIP、BLIP-2、InstructBLIP)
BLIP
BLIP 是 Salesforce 团队在多模态领域中的经典工作,影响力巨大,BLIP 系列包括:BLIP、BLIP-2、InstructBLIP。
BLIP
在多模态大模型之前,多模态领域中最流行的是视觉-语言预训练(Vision-Language Pre-training, VLP)方法,而 BLIP 是其中一个具有代表性的 VLP 框架,BLIP 在模型和数据方面进行了改进。
在模型层面,采用编码器-解码器多模态混合架构(Multimodal mixture of Encoder-Decoder, MED),根据不同应用场景,MED 可以充当一个单模态编码器、基于图像的文本编码器或基于图像的文本解码器。在数据层面,使用 BLIP 对有噪声的数据进行优化,提升预训练数据的质量,同时在优化的数据上对 BLIP 进行训练。
模型结构
BLIP 采用 MED 模型,包括一个图像编码器: Vision Transformer(ViT),以及可作为文本编码器和解码器的混合文本 Transformer。MED 模型结构如下图所示,在混合文本 Transformer 的每一个 Transformer 层中,存在三个子层,分别为:双向自注意力层/因果自注意力层、编码器-解码器注意力层、前馈神经网络层。
MED 是一个多任务模型,同时具有理解能力和生成能力,可以充当以下功能:
- 单模态编码器:对文本进行编码,与 BERT 模型一致,附加的 [CLS] token 用来对文本进行总结,代表文本的全局特征,对图片进行编码,与 ViT 模型一致,附加的 [CLS] token 用来对图像进行总结,代表图像的全局特征。
- 基于图像的文本编码器:相对于单模态编码器,在双向自注意力层和前馈神经网络层之间注入了编码器-解码器注意力层,用于注入图像的特征,附加的 [Encode] token 作为图像-文本对的特征表示。
- 基于图像的文本解码器:将基于图像的文本编码器中的每一层 Transformer 层中的双向自注意力层替换为因果自注意力层,同时通过编码器-解码器注意力层,注入图像信息,使模型能够根据图像生成相关的文本,附加的 [Decode] token 表示句子的开头。
- ViT 的核心思想是将图片切分成等大小的 patch,对这些 patch 进行 input embedding 后得到一系列的视觉 tokens,附加上一个 [CLS] token,经过若干层 Transformer 编码器层,[CLS] token 的 output embedding 用来进行图像分类,[CLS] token 用来对图片进行总结,代表图像的全局特征。
- 对于文本解码任务,为了保证自回归生成的性质,需要采用因果自注意力层,保证前面生成的 token 不能注意到后面生成的 token。
每一个 Transformer 层的结构如下:
预训练目标
为了使模型同时具备理解和生成能力,BLIP 采用了多个训练目标,包括两个基于理解的任务和一个基于生成的任务,对应着三个损失函数,分别为:图像-文本对比损失(Image-Text Contrastive Loss, ITC),图像-文本匹配损失(Image-Text Matching Loss, ITM),以及语言建模损失(Language Modeling Loss, LM)。对于一个图像-文本对,需要通过 ViT 一次前向传播,通过文本 Transformer 三次前向传播。
- 图像-文本对比损失:类似于 CLIP,基于对比学习(Contrastive Learning),其核心思想是尽可能拉近正样本对的距离,远离负样本对的距离。正样本对指的是相匹配的图像-文本对,负样本则指的是不匹配的图像-文本对。
- 图像-文本匹配损失:对应一个二分类任务,输出一个概率值,表示图像和文本匹配的概率。
- 语言建模损失:对应一个自回归生成任务,基于输入的图像和文本生成相关的文本。
学习框架
由于人工数据标注需要耗费大量的资源,因此高质量的标注数据(例如 COCO 数据集)的数量有限。许多方法采用互联网上的 image-alt 对进行训练,但这不是最优的,因为这些 image-alt 对的匹配度不一定高,因此这些数据包含噪声。
BLIP 的训练是一个迭代的过程,具体过程如下图所示。
- 模型预训练阶段:BLIP 同时在人工标注数据集和来自于互联网包含噪声的数据集上进行预训练。
- 数据集引导阶段:BLIP 利用人工标注数据集上进行微调,通过语言建模损失微调 MED 得到 Captioner,通过图像-文本对比损失和图像-文本匹配损失微调 MED 得到 Filter。Captioner 用来生成图像的文本描述,进而生成图像-文本对;Filter 用来判断图像-文本对是否匹配,进而过滤不匹配的数据。通过数据集引导阶段可以有效地优化数据集(数量更多,质量更高)。
BLIP-2
由于大模型具有强大的生成能力以及端到端的视觉-语言预训练(VLP)的代价很高,因此在 BLIP-2 中引入了预训练的视觉编码器和大模型,通过一个轻量级 Querying Transformer(Q-Former) 进行多模态对齐。Q-Former 通过视觉-语言表示学习和视觉到语言生成学习两个阶段进行模态对齐。
Q-Former
用于跨模态对齐的 Q-Former 是 BLIP-2 核心组件,其模型结构如下图所示(相同颜色代表的模块参数相同)。类似于 BLIP 模型,Q-Former 也是一个混合结构,也是通过编码器-解码器注意力(Cross Attention)注入图像特征信息,与 BLIP 模型不同之处在于:
- Q-Former 引入了一组可学习的 Query tokens,利用 Query tokens 提取抽象的图像特征。
- 通过不同的注意力掩码(Attention Mask)来控制信息流。
每一个 Transformer 层都是下图所示的结构:
视觉-语言表示学习阶段
第一个阶段的目的是引导 Q-Former 从一个预训练的图像编码器进行视觉-语言表示学习。与 BLIP 的多目标训练过程类似,Q-Former 包括三个训练目标:图像-文本对比学习,图像-文本匹配学习,以及基于图像的文本生成学习。
针对于不同的学习目标,采用的注意力掩码如下图所示:
- 图像-文本对比学习:目的是通过对比学习对齐图像和文本模态,具体而言,Q-Former 通过 Query tokens 提取图像特征,对于文本 tokens 附加一个 [CLS] token 用于表示文本的全局特征,同时采用单模态自注意力掩码避免 Query tokens 与 文本 tokens 的信息交互,本质上是避免图像和文本特征的交互。若 Query tokens 的数量不止一个,那么选择与文本的 [CLS] token 的相似度最高的 query token 作为图像的全局特征。
- 图像-文本匹配学习:目的是进行细粒度图像-文本对齐,采用双向自注意力掩码,允许 Query tokens 和文本 tokens 之间交互。经过 Q-Former 编码后输出的 Query tokens 通过一个两类分类器(匹配或不匹配),平均所有的 logits,将其作为图像和文本的匹配分数。
- 基于图像的文本生成学习:目的是使 Q-Former 具备生成能力,采用多模态因果自注意力掩码,对于文本 tokens,先生成的文本 token 不能注意到后生成的 token,保证自回归性质,同时附加一个 [DEC] token,表示生成文本的开头。
视觉到语言生成学习阶段
第二阶段的目的是引导 Q-Former 进行视觉到语言的生成学习,Q-Former 可以视为一个视觉编码器和大模型之间的信息瓶颈,通过 Query tokens 提取最有用的图像信息,Q-Former 后是一个线性投影层用于对齐特征维度。该阶段的训练目标就是语言建模,通过建模损失来进行反向传播获取梯度,进而更新 Q-Former 以及线性投影层的参数。
大模型分为编码器-解码器和纯解码器两种结构,在编码器-解码器结构中,将 ground-truth 的文本分为两个部分,前半部分作为 LLM 编码器的输入,后半部分用来作为生成的目标。
InstructBLIP
InstructBLIP 采用了预训练的 Q-Former,预训练后的具备多模态对齐的能力。相对于 BLIP-2,InstructBLIP 利用 Q-Former 来提取指令相关的视觉特征,同时在一个更大的数据集上,使用更好的训练方式训练,取得了很好的零样本泛化性能。
模型结构
InstructBLIP 的模型结构如下图所示,核心的组件是 Q-Former,Query tokens 用于提取指令相关的图像特征,通过 BLIP-2 预训练的 Q-Former 进行初始化。
指令感知特征提取:在提取图像特征时,还会输入对应的指令特征,Query tokens 和指令 tokens 通过自注意力层进行交互,通过编码器-解码器注意力层向 Query tokens 注入图像特征,通过这种指令感知的图像特征提取方式,使得 Q-Former 可以提取到指令最相关的图像特征。
训练任务和数据集
作者将 26 个数据集分类为 11 类任务,包括图像文本描述、视觉推理等任务。同时挑选出 13 个数据集进行训练,在另外的 13 个数据集上进行测试,其中有两类任务数据集完全不参与训练,用于评估任务外的零样本泛化性能。
Reference
- BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation (Feb. 15, 2022, ICML 2022)
- BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models (Jun. 15, 2023, ICML 2023)
- Visual Instruction Tuning (Dec. 11, 2023, NeurIPS 2023)
- InstructBLIP: Towards General-purpose Vision-Language Models with Instruction Tuning (May. 11, 2023, NeurIPS 2023)
- Learning Transferable Visual Models From Natural Language Supervision (Feb. 26, 2021, ICML 2021)
- BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding (May. 24, 2019, ACL 2019)
相关文章:
BLIP 系列论文(BLIP、BLIP-2、InstructBLIP)
BLIP BLIP 是 Salesforce 团队在多模态领域中的经典工作,影响力巨大,BLIP 系列包括:BLIP、BLIP-2、InstructBLIP。 BLIP 在多模态大模型之前,多模态领域中最流行的是视觉-语言预训练(Vision-Language Pre-training,…...
【玩转全栈】—— 无敌前端究极动态组件库--Inspira UI
目录 Inspira UI 介绍 配置环境 使用示例 效果: Inspira UI 学习视频: 华丽优雅 | Inspira UI快速上手_哔哩哔哩_bilibili 官网:https://inspira-ui.com/ Inspira UI 介绍 Inspira UI 是一个设计精美、功能丰富的用户界面库,专为…...
Java24新增特性
Java 24(Oracle JDK 24)作为Java生态的重要更新,聚焦AI开发支持、后量子安全、性能优化及开发者效率提升,带来20余项新特性和数千项改进。以下是核心特性的分类解析: 一、语言特性增强:简化代码与模式匹配 …...
Git多人协作与企业级开发模型
目录 1.多人协作一 2.多人协作二 3.远程分⽀删除后,本地gitbranch-a依然能看到的解决办法 4.企业级开发模型 4.1.Git的重要性 4.2.系统开发环境 4.3.Git 分⽀设计规范 1.多人协作一 ⽬前,我们所完成的⼯作如下: 基本完成Git的所有本…...
Android学习总结之扩展基础篇(一)
一、IdleHandler工作原理 1. IdleHandler 接口定义 IdleHandler 是 MessageQueue 类中的一个接口,定义如下: public static interface IdleHandler {/*** 当消息队列空闲时会调用此方法。* return 如果返回 true,则该 IdleHandler 会保留在…...
C语言教程(十六): C 语言字符串详解
一、字符串的表示 在C语言中,字符串是由一系列字符组成,并且以空字符 \0 作为结束标志。字符串通常用字符数组来表示。例如: char str[] {H, e, l, l, o, \0};也可以使用字符串字面量来初始化字符数组:char str[] "Hello&…...
Redis LFU 策略参数配置指南
一、基础配置步骤 设置内存上限 在 redis.conf 配置文件中添加以下指令,限制 Redis 最大内存使用量(例如设置为 4GB): maxmemory 4gb选择 LFU 淘汰策略 根据键的作用域选择策略: # 所有键参与淘汰 maxmemory-…...
Pikachu靶场-unsafe upfileupload
不安全的文件上传漏洞防御与对抗方式对照表 防御方式 防御实现 攻击者对抗方式 对抗原理 文件类型白名单验证 仅允许指定扩展名(如 .jpg, .png) if (!in_array($ext, [jpg, png])) { die(); } 伪造文件类型: 1. 修改文件头(…...
Python基础语法:查看数据的类型type(),数据类型转换,可变和不可变类型
目录 查看数据类型type() 使用type()语句查看数据的类型 变量无类型而数据有类型 数据类型转换 在字符串,整型,浮点数之间相互转换 可变类型和不可变类型 查看数据类型type() 使用type()语句查看数据的类型 Python中使用type(被查看数据的类型)语…...
高防IP是如何防护DDoS攻击和CC攻击的
高防IP是一种针对网络攻击(如DDoS和CC攻击)设计的防护服务,其核心原理是通过流量调度、智能清洗和分布式防护节点等技术,将恶意流量拦截在目标服务器之外。以下是其防护DDoS和CC攻击的具体机制: 一、防御DDoS攻击的机制…...
从认证到透传:用 Nginx 为 EasySearch 构建一体化认证网关
在构建本地或云端搜索引擎系统时,EasySearch 凭借其轻量、高性能、易部署等优势,逐渐成为众多开发者和技术爱好者的首选。但在实际部署过程中,如何借助 Nginx 为 EasySearch 提供高效、稳定且安全的访问入口,尤其是在身份认证方面…...
利用deepseek快速生成甘特图
一、什么是甘特图 甘特图(Gantt Chart)是一种直观的项目管理工具,广泛应用于多个领域,主要用于时间规划、任务分配和进度跟踪。 直观性:时间轴清晰展示任务重叠或延迟。 灵活性:支持…...
突破厚铜PCB阻抗控制难题:多级阻抗实现方法
随着电子技术的发展,电子设备对电路板的性能要求越来越高。其中,阻抗控制是电路板设计中的一个重要环节,尤其是对于高频、高速的电子设备。厚铜电路板由于其优良的导电性能和机械强度,被广泛应用于各种高端电子设备中。然而&#…...
JCP官方定义的Java技术体系组成部分详解
JCP官方定义的Java技术体系组成部分详解 1. Java平台规范(Java Platform Specifications) 定义:由JCP制定的Java平台核心规范,包括Java SE(标准版)、Java EE(企业版,现为Jakarta EE…...
如何在 Windows上安装 Python 3.6.5?
Windows 系统安装步骤 下载安装包 安装包下载链接:https://pan.quark.cn/s/9294ca0fd46a 运行安装程序 双击下载的 .exe 文件(如 python-3.6.5.exe)。 勾选 Add Python 3.6 to PATH(重要!这将自动配置环境变量&…...
OpenHarmony 开源鸿蒙北向开发——hdc工具使用及常用命令(持续更新)
hdc(OpenHarmony Device Connector)是为开发人员提供的用于设备连接调试的命令行工具,该工具需支持部署在 Windows/Linux/Mac 等系统上与 OpenHarmony 设备(或模拟器)进行连接调试通信。简单来讲,hdc 是 Op…...
【C语言】C语言动态内存管理
前言 在C语言编程中,内存管理一直是程序员需要重点关注的领域。动态内存管理更是如此,它不仅涉及到内存的灵活分配和释放,还隐藏着许多潜在的陷阱。本文将从动态内存分配的基础讲起,逐步深入到常见的错误、经典笔试题分析&#x…...
Java 运算符:深度解析
前言 作为Java开发者,运算符是我们每天都会接触的基础元素。然而,很多开发者对运算符的理解仅停留在表面层次。本文将全面深入地剖析Java中的各类运算符,揭示其底层原理、使用技巧和最佳实践,帮助您成为真正的Java运算符专家。 …...
健康养生小窍门
健康养生是我们对美好生活的追求,掌握一些实用的小窍门,能让我们轻松拥抱健康。 在生活起居方面,要注重环境的营造。卧室的窗帘选择遮光性好的材质,保证睡眠时的黑暗环境,有助于提高睡眠质量。在室内放置一些绿植&…...
4月24号
网络编程: //IP的对象一台电脑的对象 InetAddress address InetAddress.getByName("DESKTOP-5OJJSAM"); System.out.println(address); String name address.getHostName(); System.out.println(name);//DESKTOP-5OJJSAM String ip address.getHostAddress(); Sys…...
【RocketMq源码篇-01】环境搭建、基本使用、可视化界面
RocketMq源码核心篇整体栏目 内容链接地址【一】环境搭建、基本使用、可视化界面https://zhenghuisheng.blog.csdn.net/article/details/147481401 环境搭建、基本使用、可视化界面 一,RocketMq源码分析1. docker安装rocketMq2. rocketMq基本使用2.1,创建…...
Mysql的深度分页查询优化
一、深度分页为什么慢? 当执行 SELECT * FROM orders ORDER BY id LIMIT 1000000, 10 时: MySQL 会扫描前 1,000,010 行,丢弃前 100 万行,仅返回 10 行。偏移量(offset)越大,扫描行数越多&…...
OpenCv高阶(十一)——物体跟踪
文章目录 前言一、OpenCV 中的物体跟踪算法1、均值漂移(Mean Shift):2、CamShift:3、KCF(Kernelized Correlation Filters):4、MIL(Multiple Instance Learning)…...
第一章:Model Context Protocol (MCP)
Chapter 1: Model Context Protocol (MCP) 🌟 为什么需要MCP? 想象你正在训练一只小狗,希望它能听懂你的指令并执行任务。但如果你和小狗用不同语言交流,它可能完全不知道你的意思。类似地,大型语言模型(L…...
【SAP PP】COOIS报表分析
本文目录 一、基本查询操作 二、订单参数文件 三、COOIS报表增强BADI COOIS报表是PP模块核心报表,是系统中一个功能强大的标准报表,COOIS可查询查询生产订单的状态、进度、组件、工序、报工等信息的综合型报表,,关联了生产订单…...
2025上海车展|紫光展锐发布新一代旗舰级智能座舱芯片平台A888
4月24日,在第二十一届上海国际汽车工业展览会(以下简称“上海车展”)期间,紫光展锐重磅推出新一代旗舰级智能座舱芯片平台A8880,以强劲实力全面助力汽车座舱智能化迈向新征程。 三大核心能力,紧抓市场机遇 …...
蓝牙4.0与蓝牙5.0的区别
蓝牙4.0与蓝牙5.0的主要区别: 传输速度:蓝牙5.0的传输速度是蓝牙4.0的两倍,理论速率可达2Mbps,而蓝牙4.0为1Mbps。 传输距离:蓝牙5.0的传输距离是蓝牙4.0的四倍,在开放空间可达300米,而蓝牙4.0…...
Vue 的单文件组件(.vue 文件)script 标签的使用说明
在 Vue 的单文件组件(.vue 文件)中,最多可以编写 2 个 <script> 标签,但需要满足特定条件: 1. Vue 3 的情况(主流用法) 从 Vue 3.2 开始,官方支持以下两种形式共存࿱…...
TIM输入捕获知识部分
越往左,频率越高;越往右,频率越低。【越紧凑,相同时间,次数越多】 计算频率的方法:测评法、测周法、中界频率。 频率的定义:1s内出现了多少个重复的周期 测评法就是从频率的定义出发的&#…...
【数据可视化-30】Netflix电影和电视节目数据集可视化分析
🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...
多线程事务?拿捏!
场景:有一批1万或者10万数据,插入数据库,怎么做 事务中进行批量提交 publList<List<OrderPo>> partition Lists.partition(list, 450);StopWatch stopWatch new StopWatch();stopWatch.start();// 顺序插入for (List<OrderPo> sub…...
Spring Boot 自动配置深度解析:从源码结构到设计哲学
Spring Boot 自动配置深度解析:从源码结构到设计哲学 为什么自动配置如此重要? 在传统 Spring 开发中,开发者要手动配置大量 XML 或 JavaConfig,过程繁琐、重复且容易出错。Spring Boot 引入自动配置机制,极大地简化…...
Linux下载与安装——笔记
Linux 是一种自由和开放源代码的 操作系统(OS),其核心(Kernel)由 Linus Torvalds 于 1991 年首次发布。 1、选择适合的 Linux 发行版 根据使用场景和技术水平选择: 新手入门:Ubuntu(…...
09前端项目----分页功能
分页功能 分页器的优点实现分页功能自定义分页器先实现静态分页器调试分页器动态数据/交互 Element UI组件 分页器的优点 电商平台同时展示的数据很多,所以采用分页功能实现分页功能 Element UI已经有封装好的组件,但是也要掌握原理,以及自定…...
头歌之动手学人工智能-机器学习 --- PCA
目录 第1关:维数灾难与降维 第2关:PCA算法流程 任务描述 编程要求 测试说明 第3关:sklearn中的PCA 任务描述 编程要求 测试说明 第1关:维数灾难与降维 第2关:PCA算法流程 任务描述 本关任务:补充…...
Spring 中的循环引用问题
本章来聊聊Spring 中的循环引用问题该如何解决。这里聊的很粗糙,并没有那么细节,只是大概了解了一点。 什么是循环引用? 如下图所示: 图中有两个类,一个 Class A ,A 中又引用了 B,Class B 中又…...
SIGGRAPH投稿相关官方指导
author instruction https://www.siggraph.org/preparing-your-content/author-instructions/ 使用latex模板 https://research.siggraph.org/blog/guides/how-to-use-the-acm-siggraph-tog-latex-template/ 格式要求(字体、页面大小等) https://sa202…...
Python学习笔记(三)(程序流程控制)
文章目录 一、条件语句(if/elif/else)语法:示例: 二、循环语句1. for 循环语法:示例: 2. while 循环语法:示例: 三、循环控制语句1. break:立即终止循环2. continue&…...
onnx注册cpu版flashattention
摘要 本教程展示了如何在 ONNX Runtime 中注册一个 CPU 可执行的 FlashAttention 算子。首先,可以直接升级到 ONNX Runtime v1.16 及以上,以获得内置的 FlashAttention CPU 实现citeturn0search2;其次,演示了如何通过 ONNX Runtime 的 Custom Op 接口自定义实现并注…...
WebAssembly:开启高性能Web应用新时代
一、引言 随着互联网技术的飞速发展,Web应用的复杂度和性能要求越来越高。传统的Web开发技术,如JavaScript,虽然功能强大,但在处理复杂计算和高性能需求时仍存在一些局限性。WebAssembly(简称Wasm)作为一种…...
【前端】手写代码输出题易错点汇总
不定期补充。 目录 异步事件循环this作用域/变量提升/闭包原型/继承 异步事件循环 const promise new Promise((resolve, reject) > {console.log(1);console.log(2); }); promise.then(() > {console.log(3); }); console.log(4); //1 //2 //4promise.then 是微任务&…...
STM32F103_HAL库+寄存器学习笔记20 - CAN发送中断+ringbuffer + CAN空闲接收中断+接收所有CAN报文+ringbuffer
导言 如上所示,在[[STM32F103_HAL库寄存器学习笔记19 - CAN发送中断CAN接收中断接收所有CAN报文ringbuffer数据结构]]的基础上,为CAN发送端也引入了ringbuffer(环形缓冲区)机制。CAN发送有三个发送邮箱,为什么还另外需…...
小白自学python第二天
学习python的第二天 一、判断语句 1、布尔类型和比较运算符 1、布尔类型 表示现实生活中的逻辑,真(True,用数字1表示)和假(False,用数字0表示) 2、布尔类型变量的定义 变量的名称 布尔类…...
JavaScript 异步编程与请求取消全指南
JavaScript 异步编程与请求取消全指南 涵盖:同步/异步、Promise、async/await、AbortController、前后端协作 一、同步与异步 1. 同步(Synchronous) 定义:代码按顺序执行,前一步完成才能执行下一步。特点࿱…...
Redis 核心应用场景
高性能缓存 Redis 作为内存数据库,读写性能可达10万 QPS,适合缓存热点数据(如商品详情、用户会话),显著降低数据库压力。通过设置过期时间(TTL)自动清理非热点数据,推荐结合allkeys-…...
KMS工作原理及其安全性分析
在当今数字化时代,数据安全已经成为企业和个人最为关注的话题之一。随着云计算和大数据的快速发展,如何安全地管理密钥成为了一个重要的挑战。KMS(Key Management Service,密钥管理服务)作为一种专业的密钥管理解决方案…...
施磊老师基于muduo网络库的集群聊天服务器(六)
文章目录 客户端开发开始客户端首页面功能为何不逐行开发?客户端CMake代码搭配知识补充--有很多漏的客户端main-登录,注册,退出群组有问题测试 客户端好友添加与聊天功能表驱动设计:commandMapcommandHandlerMap为什么都是int, string添加好友和聊天功能…...
有关字体,语言,字符编码相关的基础知识,询问chatgpt所得
学习这个知识点的背景是,我需要做一个 在canvas 上书写矢量文本的功能, 使用opentype来加载字体文件,并将内容转换为 svg,导入画布。 但是有些字体文件 是不包含 一些其他语言的字符的。就可能出现 “无效字符”。 花了点时间研究…...
Obsidian和Ollama大语言模型的交互过程
之前的文章中介绍了Obsidian配合Ollama的使用案例,那么它们是如何配合起来的呢?其实这个问题并不准确,问题的准确描述应该是Obsidian的Copilot插件是如何与Ollama大语言模型交互的。因为Obsidian在这里只是一个载体,核心功能还是C…...
架构-数据库系统
数据库系统 一、数据库系统概述 (一)课程核心模块 覆盖数据库设计、关系代数、规范化理论、数据控制四大核心模块,旨在构建从理论到实践的完整知识体系至。 (二)典型应用场景 数据管理:学生信息管理&a…...