当前位置: 首页 > news >正文

多模态大语言模型 MLLM 部署微调实践

1 MLLM

1.1 什么是 MLLM

多模态大语言模型(MultimodalLargeLanguageModel)是指能够处理和融合多种不同类型数据(如文本、图像、音频、视频等)的大型人工智能模型。这些模型通常基于深度学习技术,能够理解和生成多种模态的数据,从而在各种复杂的应用场景中表现出强大的能力。

常见 MLLM:国内 Qwen-VL、InterVL;国外GPT-4o、LLaVa……

多模态研究的重点:不同模态特征空间的对齐

对齐是多模态学习中的一个关键步骤,它涉及到如何在不同的数据模态之间发现和建立对应关系。具体来说,不同模态的数据可能包含相互补充的信息,对齐就是将这些信息关联起来,使得可以从一个模态转移到另一个模态。这一过程中,特征空间的对齐是核心环节。

对齐是多模态融合的前提和基础。只有在对齐的基础上,才能有效地将不同模态的数据融合在一起,进行统一的分析和决策

实际应用案例:

  • 图像描述生成:通过对齐图像和文本的特征空间,可以生成与图像内容相符的文本描述。
  • 视频字幕生成:将视频中的声音和画面进行时间对齐和语义对齐,可以生成与视频内容同步的字幕。
  • 跨模态检索:通过对齐不同模态的特征空间,可以实现跨模态的检索功能,如根据文本描述检索相关图像或视频。

常见的多模态架构:

1.2 Q-Former

参考 BLIP-2。BLIP-2 预训练主要分成2步:基于ViT,进行视觉和语言的表征学习;基于LLM模型,学习从图像生成文本。

1.2.1 视觉和语言表征学习

为了视觉和语言表征学习,设计了Q-Former,在视觉和语言模型之间架了一道桥,将时间特征和语言特征连接接。

在这里插入图片描述

为了进行表征学习,设计了3个任务:

1.图文匹配(ITM:Image-Text Matching)
这是一个分类任务,判断图像和文本描述是一对,是为1,否则为0。

分类需要正负样本,采样策略为在一个batch内寻找负样本,对于一个batch的每一个文本,根据计算的相似性权重,从当前batch选取一个(除自身外)作为负样本,相似性越高选取的概率越大

2.图文对比学习(ITC:Image-text Contrastive)
该部分和clip相同,图像和文本分别经过bert进行encoder,得到对应的特征,然后分别经过一个线性层,最后进行一致性loss计算

3.根据图像生成文本(ITG:Image-text Generation)
transfomer在decoder时,需要对token进行mask。text tokens解码是,输入【DEC】作为解码标记,然后逐token进行解码,还未解码的token先被mask住,此时的token可以看到query的信息(图文对比学习中的query embedding和图像交互得到的key和value值,Q-Former左半部分)和之前解码过的text token,但query看不到text tokens的信息。

即解码时文本可以看到图像信息和解码过的文本信息,但是图像看不到文本,解码时看着文本和图像一起进行解码,这样模型预测的文本可以从图像中学习到信息。

在这里插入图片描述

1.3 LLaVA

参考 Visual Instruction Tuning。

按照数据的不同,LLaVA会分开处理:

  • 文本:因为是大语言模型,文本按正常方法,给大模型处理即可
  • 图片:使用CLIP-ViT转化为向量,再通过一个线性层Projection转换到大模型的理解空间,然后输入到大模型
    在这里插入图片描述

模型的组成:

  • 视觉编码器(Vision Encoder):LLaVa 架构的视觉部分是预训练的 CLIP 视觉编码器,具体来说是 ViT-L/14 变体。该组件通过 Transformer 层处理输入图像 (Xv) 以提取特征 (Zv),使模型能够有效地理解视觉信息
  • 大语言模型 (Vicuna):LLaVa 的语言能力依赖于 Vicuna,它是大型语言模型 (LLM) 的一种。Vicuna 根据输入语言指令 (Xq) 理解并生成语言响应 (Xa),补充视觉编码器的功能
  • 线性投影(Projection):此组件充当视觉特征 (Zv) 和语言模型的嵌入空间之间的桥梁。它将视觉特征转换为视觉标记 (Hv),并将其与语言模型的词嵌入空间对齐,以促进多模态对话

1.3.1 LLaVA-1.5-HD

参考论文Improved Baselines with Visual Instruction Tuning

LLaVA-1.5 在 LLaVA 的基础上改进:

  • 使用 CLIP-ViT-L-336px 视觉编码器替换原先的 CLIP-ViT-L/14
  • 将原先的一层线性层替换为 MLP 层(两层线性层)

此外,为了支持更高的图像分辨率(可以提升模型的性能)且不影响 LLaVA-1.5 的推理效率,在 LLaVA-1.5 的基础上提出了 LLaVA-1.5-HD,它采用了创新的AnyRes策略,可以接受各种高分辨率的图像作为输入。具体步骤如下:

  • 首先高分辨率图像被智能分割成多个小块(Patch),以便单独处理每个块。例如,CLIP-ViT-L/14型号的视觉编码器能够处理的最大分辨率为224x224像素。
  • 同时,将高分辨率图像调整至视觉编码器能够处理的尺寸,并利用编码器对其进行编码。
    将上面两步的结果拼接在一起作为视觉特征,输入到LLM。

在这里插入图片描述

1.3.2 LLaVA-NeXT

参考 LLaVA-NeXT
LLaVA-NeXT 是 LLaVA-1.5-HD的升级版,采用了动态的分辨率策略,预设了多种长宽比

与LLaVA-1.5相比,LLaVA-NeXT有以下几点改进:

  • 将输入图像分辨率增加到4倍以上的像素。这使它能够掌握更多的视觉细节。它支持三种宽高比,高达672x672, 336x1344, 1344x336分辨率。

  • 更好的视觉推理和OCR能力,改进的视觉指令调优数据混合。

  • 为更多场景提供更好的可视化对话,涵盖不同的应用程序。更好的世界知识和逻辑推理能力。

  • 使用SGLang进行高效部署和推理。

Q-Former与LLaVA对比

  • 收敛速度:Q-Former的参数量较大(例如BLIP-2中的100M参数),导致其
    在训练过程中收敛速度较慢。相比之下,MLP作为connector的模型(如
    LLaVA-1.5)在相同设置下能够更快地收敛,并且取得更好的性能。

  • 性能收益:在数据量和计算资源充足的情况下,Q-Former并没有展现出
    明显的性能提升。即使通过增加数据量和计算资源,Q-Former的性能提升也并
    不显著,无法超越简单的MLP方案。

  • baseline setting:LLaVA-1.5通过改进训l练数据,在较少的数据量和计
    算资源下取得了优异的性能,成为了一个强有力的baseline。相比之下,BLIP2
    的后续工作InstructBLIP在模型结构上的改进并未带来显著的性能提升,且无法
    推广至多轮对话。

  • 模型结构的简洁性:LLaVA系列采用了最简洁的模型结构,而后续从模型结构上
    进行改进的工作并未取得明显的效果。这表明,在当前的技术和数据条件下,简
    洁的模型结构可能更为有效。

2 MLLM: InterVL

参考:InterVL、InterVL2

书生·万象多模态大模型(InternVL 2.0)。关键评测指标比肩国际顶尖商用闭源模型,支持图像、视频、文本、语音、三维、医疗多种模态支持百种下游任务,性能媲美任务专用模型。

InterVL2的模型结构包括视觉(vision)模块和语言模型(LLM)模块。其中,视觉模块是一个微调过的ViT模型,而语言模型模块则是一个InternLM的模型。
在这里插入图片描述

2.1 架构设计

InterVL采用LLaVA式架构设计(ViT-MLP-LLM):

  • 基座大模型:InternLM2.5
  • 视觉编码器:InternViT
  • 对齐模块:MLP

在这里插入图片描述

2.1.1 视觉编码器 InternViT

在这里插入图片描述
InternViT-6B-448px-V1.2

  • 倒数第四层特征最有用,砍掉后三层,共45层
  • 分辨率从224扩展到448
  • 与LLM联合训练时,在captioning和OCR数据集上训练,获取高分辨率和OCR能力

2.1.2 Pixel shuffle

  • Why:448 * 448的图,patch大小为14 * 14,得到32 * 32=1024个patch,即视觉插入1024个token。这些信息有较大余消耗较多的计算资源,对长的多模态上下文拓展不利。
  • What:Pixelshuffle技术来自超分那边,是把不同通道的特征拿出来,拼到一个通道上,从(N,C×r²,H,W)转化为(N,C,H×r,W×r)。r是上采样因子。
  • How:这里把采样因子设为0.5,就可以把(4096 * 0.5 * 0.5,32, 32)的图像特征转化为(4096,32 * 0.5,32 * 0.5),下采样到256个token了。
    在这里插入图片描述

2.1.3 Dynamic High-Resolution

动态分辨率的设计,使得模型可以处理各种分辨率的情景。
在这里插入图片描述

2.1.4 Multitask output

  • 利用VisionLLMv2的技术,初始化了一些任务特化embedding(图像生成、分割、检测),添加了一些任务路由token
  • 训练下游任务特化embedding,生成路由token时,把任务embedding拼在路由embedding后面,送给LLM拿到hidden_state
  • 把hidden_state送给路由到的解码器中,生成图像/bounding box/masks
    在这里插入图片描述

2.2 训练

  • 第一阶段:训练MLP,用高质量预训练数据(各种视觉任务)
  • 第二阶段:视觉指令微调,ViT+MLP+LLM联合训练,用高质量视觉-文本指令任务

3 InternVL 部署微调实践

3.1 训练环境配置

新建虚拟环境并进入:

conda create --name xtuner-env python=3.10 -y
conda activate xtuner-env
"xtuner-env"为训练环境名,可以根据个人喜好设置,在本教程中后续提到训练环境均指"xtuner-env"环境。

安装与deepspeed集成的xtuner和相关包:

pip install xtuner==0.1.23 timm==1.0.9
pip install 'xtuner[deepspeed]'
pip install torch==2.4.1 torchvision==0.19.1 torchaudio==2.4.1 --index-url https://download.pytorch.org/whl/cu121
pip install transformers==4.39.0 peft==0.13.2

训练环境既为安装成功。

配置推理所需环境:

conda create -n lmdeploy python=3.10 -y
conda activate lmdeploy
pip install lmdeploy==0.6.1 gradio==4.44.1 timm==1.0.9
"lmdeploy"为推理使用环境名。

3.2 LMDeploy部署

3.2.1 LMDeploy基本用法介绍

我们主要通过pipeline.chat 接口来构造多轮对话管线,核心代码为:

## 1.导入相关依赖包
from lmdeploy import pipeline, TurbomindEngineConfig, GenerationConfig
from lmdeploy.vl import load_image## 2.使用你的模型初始化推理管线
model_path = "your_model_path"
pipe = pipeline(model_path,backend_config=TurbomindEngineConfig(session_len=8192))## 3.读取图片(此处使用PIL读取也行)
image = load_image('your_image_path')## 4.配置推理参数
gen_config = GenerationConfig(top_p=0.8, temperature=0.8)
## 5.利用 pipeline.chat 接口 进行对话,需传入生成参数
sess = pipe.chat(('describe this image', image), gen_config=gen_config)
print(sess.response.text)
## 6.之后的对话轮次需要传入之前的session,以告知模型历史上下文
sess = pipe.chat('What is the woman doing?', session=sess, gen_config=gen_config)
print(sess.response.text)

3.2.2 网页应用部署体验

我们可以使用UI界面先体验与InternVL对话:

拉取本教程的github仓库https://github.com/Control-derek/InternVL2-Tutorial.git:

git clone https://github.com/Control-derek/InternVL2-Tutorial.git
cd InternVL2-Tutorial

demo.py文件中,MODEL_PATH处传入InternVL2-2B的路径,如果使用的是InternStudio的开发机则无需修改,否则改为模型路径。

在这里插入图片描述

上述命令请在vscode下运行,因为vscode自带端口转发,可以把部署在服务器上的网页服务转发到本地。

启动后,CTRL+鼠标左键点进这个链接或者复制链接到浏览器。

会看到如下界面:

在这里插入图片描述

点击Start Chat即可开始聊天,下方食物快捷栏可以快速输入图片,输入示例可以快速输入文字。输入完毕后,按enter键即可发送。

3.3 XTuner微调实践

3.3.1 配置文件

cd /root/xtuner
conda activate xtuner-env  # 或者是你自命名的训练环境

原始internvl的微调配置文件在路径./xtuner/configs/internvl/v2下,假设上面克隆的仓库在/root/InternVL2-Tutorial,复制配置文件到目标目录下:

cp /root/InternVL2-Tutorial/xtuner_config/internvl_v2_internlm2_2b_lora_finetune_food.py /root/xtuner/xtuner/configs/internvl/v2/internvl_v2_internlm2_2b_lora_finetune_food.py

3.3.2 数据集下载

huggingface下载此数据集:FoodieQA。该数据集为了防止网络爬虫污染测评效果,需要向提交申请后下载使用。

由于原始数据集格式不符合微调需要格式,需要处理方可使用,在InternVL2-Tutorial下,运行:

python process_food.py

即可把数据处理为XTuner所需格式。注意查看input_path和output_path变量与自己下载路径的区别。

3.3.3 开始微调

运行命令,开始微调:

xtuner train /root/xtuner/xtuner/configs/internvl/v2/internvl_v2_internlm2_2b_lora_finetune_food.py --deepspeed deepspeed_zero2  --work-dir ./work_dirs/

看到有日志输出,即为启动成功:

微调后,把模型checkpoint的格式转化为便于测试的格式:

python xtuner/configs/internvl/v1_5/convert_to_official.py xtuner/configs/internvl/v2/internvl_v2_internlm2_2b_lora_finetune_food.py ./work_dirs/internvl_v2_internlm2_2b_lora_finetune_food/iter_640.pth ./work_dirs/internvl_v2_internlm2_2b_lora_finetune_food/lr35_ep10/

如果修改了超参数,iter_xxx.pth需要修改为对应的想要转的checkpoint。
./work_dirs/internvl_v2_internlm2_2b_lora_finetune_food/lr35_ep10/为转换后的模型checkpoint保存的路径。

3.3.4 使用微调后的模型

修改MODEL_PATH为刚刚转换后保存的模型路径:

cd /root/InternVL2-Tutorial
conda activate lmdeploy
python demo.py

微调前模型对锅包肉的识别:
在这里插入图片描述

微调后模型对锅包肉的识别:
在这里插入图片描述

相关文章:

多模态大语言模型 MLLM 部署微调实践

1 MLLM 1.1 什么是 MLLM 多模态大语言模型(MultimodalLargeLanguageModel)是指能够处理和融合多种不同类型数据(如文本、图像、音频、视频等)的大型人工智能模型。这些模型通常基于深度学习技术,能够理解和生成多种模…...

LNMP和Discuz论坛

文章目录 LNMP和Discuz论坛1 LNMP搭建1.1 编译安装nginx服务1.1.1 编译安装1.1.2 添加到系统服务 1.2 编译安装MySQL服务1.2.1 准备工作1.2.2 编辑配置文件1.2.3 设置路径环境变量1.2.4 数据库初始化1.2.5 添加mysqld系统服务1.2.6 修改mysql的登录密码 1.3 编译安装PHP服务1.3…...

Cadence学习笔记 2 PCB封装绘制

基于Cadence 17.4,四层板4路HDMI电路 更多Cadence学习笔记:Cadence学习笔记 1 原理图库绘制 目录 2、PCB封装绘制 2、PCB封装绘制 封装尺寸如下。 用Allegro做PCB封装前,要先做焊盘(Allegro 比AD、PADS多一个步骤:绘制…...

网络安全——防火墙

基本概念 防火墙是一个系统,通过过滤传输数据达到防止未经授权的网络传输侵入私有网络,阻止不必要流量的同时允许必要流量进入。防火墙旨在私有和共有网络间建立一道安全屏障,因为网上总有黑客和恶意攻击入侵私有网络来破坏,防火…...

【CSS in Depth 2 精译_074】第 12 章 CSS 排版与间距概述 + 12.1 间距设置(下):行内元素的间距设置

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第四部分 视觉增强技术 ✔️【第 12 章 CSS 排版与间距】 ✔️ 12.1 间距设置 12.1.1 使用 em 还是 px12.1.2 对行高的深入思考12.1.3 行内元素的间距设置 ✔️ 12.2 Web 字体12.3 谷歌字体 文章目…...

短视频矩阵抖音SEO源码OEM独立部署

短视频优化矩阵源码涉及对抖音平台上的视频内容进行筛选与排序,目的是增强其在搜索引擎中的可见度,以便更多用户能够浏览到这些视频。而抖音SEO优化系统则是通过构建一个分析框架,来解析抖音上的用户数据、视频信息及标签等元素,并…...

使用docker快速部署Nginx、Redis、MySQL、Tomcat以及制作镜像

文章目录 应用快速部署NginxRedisMySQLTomcat 制作镜像镜像原理基于已有容器创建使用 Dockerfile 创建镜像指令说明构建应用创建 Dockerfile 文件创建镜像 应用快速部署 Nginx docker run -d -p 80:80 nginx使用浏览器访问虚拟机地址 Redis docker pull redis docker run --…...

在ensp中ACL路由控制实验

一、实验目的 掌握ACL路由控制管理 二、实验要求 要求: 配置路由策略,左右两边不公开区域对方不可达,其他区域可以互相ping通 设备: 1、三台路由器 2、四台交换机 3、四台电脑 4、四台服务器 使用ensp搭建实验环境,如图所…...

μC/OS-Ⅱ源码学习(3)---事件模型

快速回顾 μC/OS-Ⅱ中的多任务 μC/OS-Ⅱ源码学习(1)---多任务系统的实现 μC/OS-Ⅱ源码学习(2)---多任务系统的实现(下) 本文开始,进入事件源码的学习。 事件模型 在一个多任务系统里,各个任务在系统的统筹下相继执行,由于执行速度极快&a…...

Jmeter进阶篇(30)深入探索 JMeter 监听器

前言 在性能测试领域里,Apache JMeter 是一款经典而强大的工具,而其中的监听器(Listeners)组件更是发挥着不可或缺的关键作用。 监听器就像敏锐的观察者,默默记录测试执行过程中的各种数据,作为系统性能分析的数据依据。 本文将带你全方位走进 JMeter 监听器的奇妙世界,…...

虚幻引擎的工程目录结构

虚幻引擎的工程目录结构如下: .idea/.vs:用于IDE(如IntelliJ IDEA或Visual Studio)的项目配置文件,包含工程设置和解决方案文件。 Binaries:存放编译后的可执行文件和相关的动态链接库(DLL&…...

深度学习中的yield

以下为例: def data_iter(batch_size, features, labels):num_examples len(features)indices list(range(num_examples))# 这些样本是随机读取的,没有特定的顺序random.shuffle(indices)for i in range(0, num_examples, batch_size):batch_indices …...

数据库数据恢复—ORACLE常见故障有哪些?如何恢复数据?

Oracle数据库常见故障表现: 1、ORACLE数据库无法启动或无法正常工作。 2、ORACLE ASM存储破坏。 3、ORACLE数据文件丢失。 4、ORACLE数据文件部分损坏。 5、ORACLE DUMP文件损坏。 Oracle数据库数据恢复方案: 1、检测存放数据库的服务器/存储设备是否存…...

使用JavaScrip和HTML搭建一个简单的博客网站系统

搭建一个简单的博客网站系统,我们需要创建几个基本的页面和功能:登录、注册、文章发布等。这里我们先实现一个基础版本,包括用户登录、注册以及文章发布的功能。由于这是一个简化版的示例,我们将所有逻辑集成在一个HTML文件中&…...

算法-字符串-76.最小覆盖子串

一、题目 二、思路解析 1.思路: 滑动窗口!!! 2.常用方法: 无 3.核心逻辑: 1.特殊情况:s或t是否为空字符串 if(snull||tnull)return ""; 2.声明一个字符数组——用于记录对应字符出现…...

Python爬虫之Selenium的应用

【1】Selenium基础介绍 1.什么是selenium? (1)Selenium是一个用于Web应用程序测试的工具。 (2)Selenium 测试直接运行在浏览器中,就像真正的用户在操作一样。 (3)支持通过各种driv…...

粉丝生产力与开源 AI 智能名片 2+1 链动模式商城小程序的融合创新与价值拓展

摘要:本文聚焦于粉丝生产力在当代文化与商业语境中的独特作用,并深入探讨其与开源 AI 智能名片 21 链动模式商城小程序的有机结合。通过剖析粉丝生产力的多元表现形式、内在驱动机制以及开源 AI 智能名片 21 链动模式商城小程序的功能特性与商业潜力&…...

红黑树(Red-Black Tree)

一、概念 红黑树(Red Black Tree)是一种自平衡的二叉搜索树,通过添加颜色信息来确保在进行插入和删除操作时,树的高度保持在对数级别,从而保证了查找、插入和删除操作的时间复杂度为 O(log n)。这种树可以很好地解决普…...

Cocos 资源加载(以Json为例)

resources 通常我们会把项目中需要动态加载的资源放在 resources 目录下,配合 resources.load 等接口动态加载。你只要传入相对 resources 的路径即可,并且路径的结尾处 不能 包含文件扩展名。 resources.load("Inf", JsonAsset, (error, ass…...

解决 IntelliJ IDEA 启动错误:插件冲突处理

引言 在使用 IntelliJ IDEA 进行开发时,我们可能会遇到各种启动错误。本文将详细介绍一种常见的错误:插件冲突,并提供解决方案。 错误背景 最近,有用户在启动 IntelliJ IDEA 时遇到了一个错误,提示信息为&#xff1a…...

SQL——DQL分组聚合

分组聚合: 格式: select 聚合函数1(聚合的列),聚合函数2(聚合的列) from 表名 group by 标识列; ###若想方便分辨聚合后数据可在聚合函数前加上标识列(以标识列进行分组) 常见的聚合函数: sum(列名):求和函数 avg(列名)…...

Ripro V5日主题 v8.3 开心授权版 wordpress主题虚拟资源下载站首选主题模板

RiPro主题全新V5版本,是一个优秀且功能强大、易于管理、现代化的WordPress虚拟资源商城主题。支持首页模块化布局和WP原生小工具模块化首页可拖拽设置,让您的网站设计体验更加舒适。同时支持了高级筛选、自带会员生态系统、超全支付接口等众多功能&#…...

分布式搜索引擎之elasticsearch基本使用2

分布式搜索引擎之elasticsearch基本使用2 在分布式搜索引擎之elasticsearch基本使用1中,我们已经导入了大量数据到elasticsearch中,实现了elasticsearch的数据存储功能。但elasticsearch最擅长的还是搜索和数据分析。 所以j接下来,我们研究下…...

java学习-第十五章-IO流(java.io包中)

一、理解 1. 简单而言:流就是内存与存储设备之间传输数据的通道、管道。 2. 分类: (1) 按方向(以JVM虚拟机为参照物)【重点】 输入流:将中的内容读入到中。 输出流:将中的内容写入到中。 (2) 按单位: 字节流&#xf…...

企业如何实现数据从源端到消费端的全链路加工逻辑可视化?

要想实现数据加工链路的可视化,血缘图谱无疑是一个有效的工具。血缘图谱能够清晰地展示数据从产生、流转、加工到最终消费的每一个环节,帮助企业直观地理解数据之间的关联和依赖关系,轻松追溯数据来源和去向,并在数据出现问题时快…...

Toxicity of the Commons: Curating Open-Source Pre-Training Data

基本信息 📝 原文链接: https://arxiv.org/abs/2410.22587👥 作者: Catherine Arnett, Eliot Jones, Ivan P. Yamshchikov, Pierre-Carl Langlais🏷️ 关键词: toxicity filtering, language models, data curation📚 分类: 机器…...

Python 单例模式工厂模式和classmethod装饰器

前言: Python作为面向对象的语言,显然支持基本的设计模式。也具备面向对象的语言的基本封装方法:属性、方法、继承、多态等。但是,做为强大的和逐渐发展的语言,python也有很多高级的变种方法,以适应更多的…...

计算机键盘简史 | 键盘按键功能和指法

注:本篇为 “计算机键盘简史 | 键盘按键功能和指法” 相关文章合辑。 英文部分机翻未校。 The Evolution of Keyboards: From Typewriters to Tech Marvels 键盘的演变:从打字机到技术奇迹 Introduction 介绍 The keyboard has journeyed from a humb…...

【数字信号处理】期末综合实验,离散时间信号与系统的时域分析,离散信号 Z 变换,IIR 滤波器的设计与信号滤波,用窗函数法设计 FIR 数字滤波器

关注作者了解更多 我的其他CSDN专栏 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 数字信号处理 光电融合集成电路…...

面试技术点之安卓篇

一、基础 二、高级 三、组件 Android中SurfaceView和TextureView有什么区别? 参考 Android中SurfaceView和TextureView有什么区别? 四、三方框架 五、系统源码 六、性能优化...

群晖wordpress 证书/seo技术经理

问题描述:巨坑!!!! 正常新建完成一个项目demo2 代码和外部库都没有任何问题,跑起来测试的时候却失败了 原因分析: java.lang.NoClassDefFoundError: com/google/common/collect/Immutable…...

建什么网站比较好/中国十大电商公司排名

1. 当点击某个按钮,后台其实进行了很多步的操作,但原型上无法体现的时候,我们需要尽可能地在原型上做好这些交互。 比如1: 点击添加按钮,添加一条信息,然后保存成功,显示这条信息。 实则后台的处…...

自己用电脑做网站服务器吗/营销推广软文

转载:https://assistant.ceping.com/qrcode?type1...

推广网站怎样做/app开发多少钱

图像梯度与轮廓Sobel算子Scharr算子laplacian算子Canny边缘检测图像金字塔图像轮廓傅里叶变换滤波Sobel算子 如果出现负数则默认为0 img cv2.imread(data/pie.png,cv2.IMREAD_GRAYSCALE) cv2.imshow("img",img) cv2.waitKey() cv2.destroyAllWindows()dst cv2.Sob…...

做火影忍者网站的格式/百度云搜索引擎入口 百度网盘

轻型目录访问协议(英文:Lightweight Directory Access Protocol,缩写:LDAP)是一个开放的,中立的,工业标准的应用协议,通过IP协议提供访问控制和维护分布式信息的目录信息。OpenLDAP是…...

在一个空间建两个网站/全球搜索引擎排名

前言 SQL 语句执行慢的原因是面试中经常会被问到的,对于服务端开发来说也是必须要关注的问题。 在生产环境中,SQL 执行慢是很严重的事件。那么如何定位慢 SQL、慢的原因及如何防患于未然。接下来带着这些问题让我们开启本期之旅! 第一部分必…...