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

【多模态文档智能】OCR-free感知多模态大模型技术链路及训练数据细节

目前的一些多模态大模型的工作倾向于使用MLLM进行推理任务,然而,纯OCR任务偏向于模型的感知能力,对于文档场景,由于文字密度较高,现有方法往往通过增加图像token的数量来提升性能。这种策略在增加新的语言时,需要重新进行训练,计算开销较大,成本较高。因此,本文再来看看vary和got这两个衔接工作,看看其完整的技术链路。

Vary

传统的vlm做法和vary

技术点

  • 新视觉词汇表的生成:设计了一个词汇网络和一个小型解码器Transformer,通过自回归生成所需的词汇表。具体使用SAM预训练的ViTDet(base scale)作为新词汇网络的主要部分,并在其最后一层后添加两个卷积层,以将特征形状转换为与CLIP-L输出匹配的形状。

    添加了两个卷积层,以使输出与CLIP相似

  • 数据:在生成阶段,使用手动文档和图表数据作为正样本,自然图像作为负样本,通过自回归方式训练词汇网络。文档数据包括从arXiv和CC-MAIN-2021-31-PDF-UNTRUNCATED收集的英文和中文字档,图表数据包括使用matplotlib和pyecharts渲染的图表。

  • 词汇表融合:在生成新词汇表后,将其添加到原始LVLMs中,引入新特征。在这个过程中,冻结新旧词汇网络的权重,解冻其他模块的权重。新词汇表与原始CLIP-VIT并行,各自拥有独立的输入嵌入层,在LLM之前集成。

训练方法

整体分为两个阶段:Vary-tiny和Vary-base

  1. Vary-tiny

    首先构建了一个具有新视觉词汇表(vision vocabulary)的视觉Transformer(ViT),命名为Vary-tiny。采用了SAM预训练的ViTDet作为Vary-tiny的主要组成部分,并在其后添加了两个卷积层,以便将特征形状调整为与CLIP-VIT的输出相匹配。接下来,将一个全连接层和一个文本解码器OPT-125M(这里也可以使用更大的大型语言模型(LLM)来替代OPT-125M。)连接到Vary-tiny上。

    为了训练Vary-tiny,需要构造正负样本的图像-文本对。正样本包括需要进行OCR处理的图像及其OCR结果(如密集文本和Python字典风格的图表结果)。负样本则来自COCO数据集,包含自然图像以及与之对应的文本“This is an natural image”。

  2. Vary-base

    Vary-base 是基于 Vary-tiny 的改进版本,它将 Vary-tiny 与原始的 CLIP-L ViT 并行运行。这两个视觉变换器(ViT)的输出嵌入首先分别输入到它们各自的线性层,然后将这两个线性层的输出连接起来,最后输入到LLM中。在 Vary-base 中,Vary-tiny 的输入图片分辨率为 1024×1024,而其最后一层输出的特征图尺寸为 64×64×256。这与 CLIP-L 的输出尺寸不匹配,因此在 Vary-tiny 中添加了两个卷积层来进行特征转换,以确保尺寸的一致性。在训练 Vary-base 的过程中,会冻结两个 ViT 的权重,只更新线性投影层和 LLM 的参数。训练数据包括自然场景和 OCR 场景的视觉问答(VQA),以便让模型能够在这些场景下表现出更好的性能。

训练数据

  1. Vary-tiny(学习新的视觉词汇表)
  • 文档数据:从arXiv和CC-MAIN-2021-31-PDF-UNTRUNCATED收集的高分辨率文档图像文本对。英文部分:从arXiv的开放获取文章中收集PDF格式的文档。中文部分:从互联网上的电子书籍中收集。处理方式:

    • 使用PyMuPDF库提取每页PDF中的文本信息。
    • 使用pdf2image库将每页转换为PNG图像。
    • 构建了100万张中文和100万张英文的文档图像文本对用于训练。
  • 图表数据:使用matplotlib和pyecharts作为渲染工具生成图表图像文本对。matplotlib风格:构建了25万张中英文图表图像文本对。pyecharts风格:构建了50万张中英文图表图像文本对。处理方式:

    • 将图表中的文本(如标题、x轴和y轴标签)随机从互联网下载的自然语言处理(NLP)语料库中选择,并转换为Python字典格式。

  • 负样本自然图像:从COCO数据集中提取自然图像及其对应的文本。文本:随机选择以下句子:“It’s an image of nature”、“Here’s a nature picture”、“It’s a nature photo”、“This is a natural image”、“That’s a shot from nature”。目的确保新引入的词汇不会对CLIP-VIT擅长的自然图像数据造成干扰

  1. Vary-base(合并后再训练)
  • 文档数据:除了文档数据外,还需要支持公式和表格等格式的数据。
    处理方式:

    • 从arxiv收集一些.tex源文件,使用正则表达式提取表格、数学公式和纯文本。
    • 使用pdflatex重新渲染这些内容,并收集100万张英文页面和40万张中文页面。
    • 将每个文档页的文本基准转换为mathpix markdown格式,以统一格式。
  • 图表数据:使用GPT-4生成相关语料库,并利用高质量的语料库渲染20万张图表数据用于Vary-base训练。处理方式:

    • 使用GPT-4生成图表,确保图表中的文本(如标题、x轴和y轴值)具有强相关性。
  • 通用数据:使用LAION-COCO数据集随机提取自然图像文本对(400万对图像文本对)。在预训练和微调阶段使用这些数据进行训练。

格式遵循LLaVA-MPT sft格式:

<|im_start|>user: <img>"<image>"</img> "texts
input"<|im_end|> <|im_start|>assistant: "texts output" <|im_end|>

实验

GOT-OCR

GOT-OCR是Vary的后续,提出了通用OCR理论(OCR-2.0)及其模型GOT,用于解决OCR-1.0系统的局限性和LVLMs的不适用性问题。GOT模型采用统一的端到端架构,包括一个高压缩率的编码器和一个长上下文长度的解码器。编码器使用VitDet结构,具有约80M参数,能够处理1024x1024的输入图像。解码器使用Qwen模型,具有约0.5B参数,支持8K的最大长度tokens,以确保能够处理长上下文场景。

模型架构上分三部分:vision encoder + 线性层 + LLM。注意这里的encoder是一个80M的小模型(VitDet结构),并非CLIP,需要从头训练

GOT的训练分为三个阶段:

  • 预训练阶段:使用Tiny OPT-125M(为了节省GPU资源)对视觉编码器进行纯文本识别任务的预训练。输入图像被调整为1024x1024的方形,并使用自然场景和裁剪切片进行训练。

  • 联合训练阶段:将预训练的视觉编码器连接到更大的Qwen-0.5B解码器,并使用更多的通用OCR数据进行训练,如乐谱、数学公式和几何形状。

  • 后训练阶段:通过细粒度、多裁剪/页面的合成数据进一步改进GOT的泛化能力和适用性,支持区域提示OCR、超大图像OCR和批量PDF OCR特征。

下面展开看一下:

阶段一:纯文本识别任务的预训练(Pre-training of the Vision Encoder)

在第一个阶段,主要目标是预训练视觉编码器(vision encoder),以便它能够有效地处理常见的场景文本和文档级字符。

方法:为了提高训练效率和节省GPU资源,选择了一个小型的解码器(例如OPT-125M)来传递梯度给编码器。将包含场景文本的图像和包含文档级字符的手动图像输入到模型中。这样可以让编码器学习到两种最常见的字符编码能力。由于高分辨率图像的计算成本较高,选择了具有局部注意力机制的VitDet(base版本,约80M参数)作为编码器结构。该编码器可以将1024x1024x3的输入图像转换为256x1024的图像标记。最后通过一个1024x768的线性层,将这些图像标记投影到语言模型(如OPT-125M)的维度。

数据

  • 自然场景数据:英文图像:来自Laion-2B数据集。中文图像:来自Wukong数据集。使用PaddleOCR工具从这些多样化真实场景中捕获伪GT。总共获得200万(2M)数据,其中一半是中文,一半是英文。
  • 文档级数据:从Common Crawl收集开源PDF样式文件。
    使用Fitz Python包提取相应的密集文本内容。
    获得120万(1.2M)全页PDF样式图像-文本对和80万(0.8M)图像切片数据。
    切片数据包括行级和段落级,通过解析边界框从PDF图像中裁剪出来。

处理过程:对于自然场景数据,进行两种类型的处理:

  1. 移除边界框并按从上到下、从左到右的顺序合并每个文本内容。
  2. 根据边界框从原始图像中裁剪文本区域并保存为图像切片。

后一种方法获得了另外100万(1M)切片类型图像-文本对。

阶段二:多任务联合训练(Joint-training of the Encoder with a New Decoder)

在第二个阶段,目标是通过连接预训练的视觉编码器到一个新的、更大的解码器来扩展GOT的知识,以处理更通用的OCR任务。

方法:将第一阶段预训练的视觉编码器连接到具有更强能力的更大语言模型(例如Qwen-0.5B,500M参数)上,构建GOT的最终架构。将连接器(即线性嵌入层)的维度调整为1024x1024,以与Qwen-0.5B的输入通道对齐(1024*1024的图像最终被压缩为256个tokens再输入到LLM)。这个过程中,准备大量更通用的OCR数据(如乐谱、数学/分子公式和几何形状),以扩展OCR-2.0知识。

数据

  • 普通OCR数据:使用前一阶段的数据,并添加手写文本识别子任务,涉及不同语言的各种手写字体。上一阶段数据的80%(300万(3M)场景文本OCR数据和200万(2M)文档OCR数据)用于这阶段,并追加手写场景的OCR,数据来自Chinese CASIA-HWDB2 [ 1], English IAM [2], and Norwegian NorHand-v3,原数据的line-level slice会被6到8个地组合在一起当作longer-text。

  • 数学公式数据:从Arxiv爬取大量LATEX源.tex文件,提取约100万(1M)公式片段。
    将公式源转换为Mathpix格式,并使用Chrome-driver调用Mathpix-markdown-it工具将其渲染为HTML格式。
    将HTML文件转换为SVG并保存为PNG图像。

  • 分子公式数据:下载ChEMBL_25文件,包含200万(2M)smile源。
    使用Mathpix-markdown-it工具和rdkit.Chem包收集约100万(1M)分子公式图像-文本对。

  • 表格数据:从爬取的.tex文件中提取约30万(0.3M)表格源,并将其渲染为图像。使用IATEX作为渲染工具,因为其对高级表格的渲染效果更好。

  • 全页数据:使用Nougat方法获得约50万(0.5M)英文markdown PDF文本对。参照Vary方法,收集另外50万(0.5M)中文markdown对,并将其内容转换为Mathpix格式。还添加了20万(0.2M)内部数据,这些数据是使用Mathpix直接标记的,包括书籍、论文和财务报告。

  • 更通用的OCR数据乐谱数据:选择GrandStaff数据集作为源进行渲染。从音乐摘录中提取Humdrum kern转录,生成约50万(0.5M)样本。几何形状数据:使用TikZ风格的点和线,构造简单的几何形状和函数曲线,生成约100万(1M)几何Tikz数据。图表数据:使用Matplotlib和Pyecharts工具渲染图表图像-文本对,生成200万(2M)图表数据,其中一半来自Matplotlib,另一半来自Pyecharts。

阶段三:解码器的进一步后训练(Further Post-training of the Decoder)

二阶段训练后GOT已经能进行多场景OCR了。现在只对解码器部分进行后训练来定制GOT以启用三个新特性,即细粒度、多页面和动态分辨率OCR。在第三个阶段,目标是进一步提高GOT的泛化能力和适用性,通过后训练解码器来定制新的OCR特征。

方法:在不修改视觉编码器的情况下,通过后训练解码器来定制GOT,以支持细粒度、多页和动态分辨率OCR等新功能。

数据:生成细粒度的交互式OCR数据、多页OCR数据和动态分辨率数据,以支持区域提示OCR、超大图像OCR和批量PDF OCR功能。

  • 细粒度数据

    • 自然细粒度OCR:数据集:RCTW、ReCTS、ShopSign和COCO-Text。这些数据集提供文本边界框,可以直接用于生成细粒度(区域/颜色提示)OCR数据。
    • 文档级细粒度OCR:从下载的PDF文件中过滤出扫描格式的文件,使用Python包(Fitz/PDFminer)解析左侧部分。记录页面级图像、每行/段落的边界框及相应文本,生成box-guided OCR子任务的GT。每个坐标值首先标准化,然后放大1000倍。选择红色、绿色和蓝色作为最常用的颜色框架,并在原始图像上绘制它们。
  • 多裁剪数据:支持1024x1024输入分辨率,适用于常见OCR任务。使用InternVL-1.5裁剪方法,最大瓷砖数为12。使用单页PDF数据合成超高分辨率图像,包括水平和垂直拼接。通过这种方法,获得50万(50万)图像-文本对。

  • 多页数据:从Mathpix格式的PDF数据中随机采样2-8页,组成单个OCR任务。每个选定的页面包含的文本少于650个标记,以确保总长度不超过8K。生成约20万(20万)多页OCR数据,大部分是中文和英文页面交替的。

实验

总结

笔者关注vary和GOT已久,抽空做了下技术思路记录,GOT是Vary的后续,GOT通过三个阶段的训练,模型能够逐步提升其在各种OCR任务上的性能,从基础的纯文本识别到处理更复杂的格式化和通用OCR任务。每个阶段的训练都注重不同的数据类型和任务,确保模型在多样化的应用场景中都能表现出色。笔者在折腾过程中,这个链路的一阶段的数据搞起来太伤身了,可以直接在开源权重上进行post-train,二/三阶段微调后发现效果也达不到落地的效果,数据质量和数量都需要进一步的提升。目前该技术链路可以是多模态OCR-free模型打样。

参考文献

  • Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models,https://arxiv.org/abs/2312.06109
  • General OCR Theory: Towards OCR-2.0 via a Unified End-to-end Model,https://arxiv.org/abs/2409.01704

相关文章:

【多模态文档智能】OCR-free感知多模态大模型技术链路及训练数据细节

目前的一些多模态大模型的工作倾向于使用MLLM进行推理任务&#xff0c;然而&#xff0c;纯OCR任务偏向于模型的感知能力&#xff0c;对于文档场景&#xff0c;由于文字密度较高&#xff0c;现有方法往往通过增加图像token的数量来提升性能。这种策略在增加新的语言时&#xff0…...

Mybatis动态sql执行过程

动态SQL的执行原理主要涉及到在运行时根据条件动态地生成SQL语句&#xff0c;然后将其发送给数据库执行。以下是动态SQL执行原理的详细解释&#xff1a; 一、接收参数 动态SQL首先会根据用户的输入或系统的条件接收参数。这些参数可以是查询条件、更新数据等&#xff0c;它们…...

leetcode 31 Next Permutation

题意 找到下一个permutation是什么&#xff0c;对于一个数组[1&#xff0c;2&#xff0c;3]&#xff0c;下一个排列就是[1, 3, 2] 链接 https://leetcode.com/problems/next-permutation/ 思考 首先任何一个permutation满足一个性质&#xff0c;从某个位置往后一定是降序。…...

每日一练 | 华为 eSight 创建的缺省角色

01 真题题目 下列选项中&#xff0c;不属于华为 eSight 创建的缺省角色的是&#xff1a; A. Administrator B. Monitor C. Operator D. End-User 02 真题答案 D 03 答案解析 华为 eSight 是一款综合性的网络管理平台&#xff0c;提供了多种管理和监控功能。 为了确保不同用…...

PyTorch基本使用-自动微分模块

学习目的&#xff1a;掌握自动微分模块的使用 训练神经网络时&#xff0c;最常用的算法就是反向传播。在该算法中&#xff0c;参数&#xff08;模型权重&#xff09;会根据损失函数关于对应参数的梯度进行调整。为了计算这些梯度&#xff0c;PyTorch 内置了名为 torch.autogra…...

libevent-Reactor设计模式【1】

一、Libevent概述 1、简介 Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库&#xff0c;主要有以下几个亮点&#xff1a;事件驱动&#xff08; event-driven&#xff09;&#xff0c;高性能;轻量级&#xff0c;专注于网络&#xff0c;不如 ACE 那么臃肿庞大&#…...

奇奇怪怪的错误-Tag和space不兼容

报错信息如下&#xff1a; TabError: inconsistent use of tabs and spaces in indentation make: *** [Makefile:24: train] Error 1不能按Tab&#xff0c;要老老实实按space 不过可以在编辑器里面改&#xff0c;把它们调整成一致的&#xff1b;...

29.攻防世界ics-06

ics-06 难度&#xff1a;1 方向&#xff1a;Web 题目描述: 云平台报表中心收集了设备管理基础服务的数据&#xff0c;但是数据被删除了&#xff0c;只有一处留下了入侵者的痕迹。 进入靶场 发现有一处能点动 多了个id1 我其实尝试改过id数&#xff0c;不过没什么变化&#xf…...

强化学习路径规划:基于SARSA算法的移动机器人路径规划,可以更改地图大小及起始点,可以自定义障碍物,MATLAB代码

一、SARSA算法概述 SARSA&#xff08;State-Action-Reward-State-Action&#xff09;是一种在线强化学习算法&#xff0c;用于解决决策问题&#xff0c;特别是在部分可观测的马尔可夫决策过程&#xff08;POMDPs&#xff09;中。SARSA算法的核心思想是通过与环境的交互来学习一…...

【MFC】如何读取rtf文件并进行展示

tf是微软的一个带格式的文件&#xff0c;比word简单&#xff0c;我们可以用写字板等程序打开编辑。下面以具体实例讲解如何在自己程序中展示rtf文件。 首先使用VS2022创建一个MFC的工程。 VIEW类需要选择richview类&#xff0c;用于展示&#xff0c;如下图&#xff1a; 运行效…...

Vulhub:Log4j[漏洞复现]

CVE-2017-5645(Log4j反序列化) 启动靶场环境 docker-compose up -d 靶机IPV4地址 ifconfig | grep eth0 -A 5 ┌──(root㉿kali)-[/home/kali/Desktop/temp] └─# ifconfig | grep eth0 -A 5 eth0: flags4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 in…...

面向预测性维护的TinyML技术栈全面综述

论文标题&#xff1a;A Holistic Review of the TinyML Stack for Predictive Maintenance&#xff08;面向预测性维护的TinyML技术栈全面综述&#xff09; 作者信息&#xff1a;Emil Njor, Mohammad Amin Hasanpour, Jan Madsen, Xenofon Fafoutis&#xff0c;均来自丹麦技术…...

沈阳理工大学《2024年811自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《沈阳理工大学811自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2024年真题 Part1&#xff1a;2024年完整版真题 2024年真题...

用前端html如何实现2024烟花效果

用HTML、CSS和JavaScript编写的网页&#xff0c;主要用于展示“2024新年快乐&#xff01;”的文字形式烟花效果。下面是对代码主要部分的分析&#xff1a; HTML结构 包含三个<canvas>元素&#xff0c;用于绘制动画。引入百度统计的脚本。 CSS样式 设置body的背景为黑…...

Redis应用-在用户数据里的应用

1.社区电商的业务闭环 接下来介绍的社区电商是以Redis作为主体技术、以MySQL和RocketMQ作为辅助技术实现的。 (1)社区电商运作模式 社区电商的关键点在于社区,而电商则是辅助性质(次要地位,流量变现)。社区可以分成很多种社区,比如美食社区、美妆社区、影评社区、妈妈社区…...

C++ 中面向对象编程如实现数据隐藏

在C中&#xff0c;面向对象编程&#xff08;OOP&#xff09;通过封装&#xff08;Encapsulation&#xff09;来实现数据隐藏。封装是OOP的一个核心概念&#xff0c;它允许将对象的属性和行为&#xff08;即数据和方法&#xff09;组合在一起&#xff0c;并对外隐藏对象的内部实…...

JavaEE 【知识改变命运】04 多线程(3)

文章目录 多线程带来的风险-线程安全线程不安全的举例分析产出线程安全的原因&#xff1a;1.线程是抢占式的2. 多线程修改同一个变量&#xff08;程序的要求&#xff09;3. 原子性4. 内存可见性5. 指令重排序 总结线程安全问题产生的原因解决线程安全问题1. synchronized关键字…...

gz中生成模型

生成模型 通过服务调用生成 还记得parameter_bridge 吗&#xff1f; 我们在生成桥接的时候调用了这个cpp文件。 一个 parameter_bridge 实例用于消息传递&#xff08;传感器数据&#xff09;。之前的例子 另一个 parameter_bridge 实例用于服务桥接&#xff08;动态生成模型…...

前端(Axios和Promis)

Promise 语法 <script>// 创建promise对象// 此函数需要再传入两个参数,都是函数类型let pnew Promise((resolve,reject)>{if(3>2){resolve({name:"李思蕾",age:23,地址:"河南省"});}else{reject("error");}});console.log(p);p.th…...

AI Agent:重塑业务流程自动化的未来力量(2/30)

《AI Agent&#xff1a;重塑业务流程自动化的未来力量》 摘要&#xff1a;整体思路是先介绍 AI Agent 的基本情况&#xff0c;再深入阐述其实现业务流程自动化的方法和在不同领域的应用&#xff0c;接着分析其价值和面临的挑战&#xff0c;最后得出结论&#xff0c;为读者全面…...

前端页面导出word

html-docx-js bug: vite使用html-docx.js会报错&#xff0c;点击下载上方文件替换即可 正文 npm install html-docx-js -S npm install file-saver -S<template><div id"managerReport">word内容......</div> </template><script>&l…...

【考前预习】1.计算机网络概述

往期推荐 子网掩码、网络地址、广播地址、子网划分及计算-CSDN博客 一文搞懂大数据流式计算引擎Flink【万字详解&#xff0c;史上最全】-CSDN博客 浅学React和JSX-CSDN博客 浅谈云原生--微服务、CICD、Serverless、服务网格_云原生 serverless-CSDN博客 浅谈维度建模、数据分析…...

ubuntu20.04复现 Leg-KILO

这里写目录标题 opencv版本问题下载3.2.0源代码进入解压后的目录创建构建目录运行 CMake 配置 配置时指定一个独立的安装目录&#xff0c;例如 /opt/opencv-3.2&#xff1a;出错&#xff1a; 使用多线程编译错误1&#xff1a; stdlib.h: 没有那个文件或目录错误2&#xff1a;er…...

Ensembl数据库下载参考基因组(常见模式植物)bioinfomatics 工具37

拟南芥参考基因组_拟南芥数据库-CSDN博客 1 Ensembl数据库网址 http://plants.ensembl.org/index.html #官网 如拟南芥等 那么问题来了&#xff0c;基因组fa文件和gff文件在哪里&#xff1f; 2 参考案例 拟南芥基因组fa在这里 注释gff文件在这里...

简单介绍web开发和HTML CSS_web网站开发流程

一、Web 开发&#xff1a;探索互联网世界的基石 1.1 什么是 Web 开发 Web 开发&#xff0c;简单来说&#xff0c;就是构建能够通过浏览器访问的网站的过程。Web 代表着全球广域网&#xff0c;也就是我们熟知的万维网&#xff08;www&#xff09;&#xff0c;它连接着世界各地的…...

Docker 中使用 PHP 通过 Canal 同步 Mysql 数据到 ElasticSearch

一、Mysql 的安装和配置 1.使用 docker 安装 mysql&#xff0c;并且映射端口和 root 账号的密码 # 获取镜像 docker pull mysql:8.0.40-debian# 查看镜像是否下载成功 docker images# 运行msyql镜像 docker run -d -p 3388:3306 --name super-mysql -e MYSQL_ROOT_PASSWORD12…...

数据结构之五:排序

void*类型的实现&#xff1a;排序&#xff08;void*类型&#xff09;-CSDN博客 一、插入排序 1、直接插入排序 思想&#xff1a;把待排序的数据逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。 单趟&#x…...

科研绘图系列:R语言绘制热图和散点图以及箱线图(pheatmap, scatterplot boxplot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载图1图2图3系统信息参考介绍 R语言绘制热图和散点图以及箱线图(pheatmap, scatterplot & boxplot) 加载R包 library(magrittr) library(dplyr) library(ve…...

基于 webRTC Vue 的局域网 文件传输工具

文件传输工具&#xff0c;匿名加密&#xff0c;只需访问网页&#xff0c;即可连接到其他设备&#xff0c;基于 webRTC 和 Vue.js coturn TURN 服务器 docker pull coturn/coturn docker run -d --networkhost \-v $(pwd)/my.conf:/etc/coturn/turnserver.conf \coturn/coturn…...

LeetCode 718. 最长重复子数组 java题解

https://leetcode.cn/problems/maximum-length-of-repeated-subarray/description/ 动态规划 class Solution {public int findLength(int[] nums1, int[] nums2) {int len1nums1.length,len2nums2.length;int[][] dpnew int[len11][len21];dp[0][0]0;//没有意义&#xff0c;…...