PP-DocLayoutV3从零开始:OCR开发者如何用它构建文档结构化流水线?

news2026/3/23 8:54:28
PP-DocLayoutV3从零开始OCR开发者如何用它构建文档结构化流水线你是不是也遇到过这样的问题拿到一份扫描的合同或者论文PDF想用OCR工具把文字提取出来结果发现识别得一塌糊涂——标题和正文混在一起表格被拆得七零八落图片里的文字更是直接被忽略了。这背后的原因往往是OCR工具“看不清”文档的版面结构。它们把整页文档当作一张大图来处理自然分不清哪里是标题、哪里是正文、哪里又是表格。今天要介绍的PP-DocLayoutV3就是专门解决这个痛点的“文档版面分析专家”。它能像人眼一样看懂文档的版面布局精准划分出不同的内容区域。对于OCR开发者来说这就像是给识别引擎装上了一双“智慧的眼睛”让后续的文字提取工作事半功倍。1. 什么是PP-DocLayoutV3你的文档“结构理解器”简单来说PP-DocLayoutV3是一个文档版面分析模型。它的核心任务只有一个看懂文档的版面结构。想象一下你拿到一页文档第一眼会看到什么可能是顶部的大标题然后是几个小标题接着是正文段落中间穿插着表格和图片底部还有页脚。你的大脑会自然而然地理解这种结构关系。PP-DocLayoutV3做的就是同样的事情——只不过是用AI的方式。它会分析文档图片识别出文本区域红色框正文段落、说明文字标题区域绿色框文档标题、章节标题、段落标题表格区域紫色框数据表格、统计表图片区域橙色框插图、照片、图表页眉页脚黄色框页面顶部和底部的重复信息其他元素参考文献、公式、图注等每个识别出来的区域模型都会给出精确的像素级坐标[x1, y1, x2, y2]和一个置信度分数0.0-1.0。有了这些信息你的OCR流程就知道该“看哪里”和“怎么看”了。1.1 为什么OCR开发者需要它传统的OCR流程通常是“一刀切”的整页图片直接送入识别引擎。这种方式有几个明显的短板区域混淆标题和正文混在一起识别失去层级结构表格灾难表格被当作普通文本识别行列结构完全丢失图片忽略图片中的文字如图表标签直接被跳过效率低下对非文本区域如图片背景进行无效识别加入PP-DocLayoutV3后你的OCR流水线就变成了“先理解后识别”的智能流程原始文档图片 → PP-DocLayoutV3版面分析 → 区域划分 → 分区域OCR识别 → 结构化输出这个流程的好处是显而易见的识别更准表格单独送给表格识别模型图片单独处理结构保留标题、正文的层级关系得以保持效率提升只对文字区域进行OCR避免无用功输出更友好可以直接生成结构化的JSON、Word或HTML2. 10分钟快速上手部署你的第一个版面分析服务理论说再多不如亲手试试。下面我就带你一步步部署PP-DocLayoutV3并构建一个简单的文档处理流水线。2.1 环境准备与镜像部署PP-DocLayoutV3已经打包成了开箱即用的Docker镜像部署过程非常简单选择镜像在平台的镜像市场中搜索ins-doclayout-paddle33-v1一键部署点击“部署”按钮系统会自动创建实例等待启动大约需要1-2分钟初始化首次启动会加载模型到显存5-8秒部署完成后你会获得两个访问入口Web界面端口7860适合手动测试和可视化查看API服务端口8000适合程序化调用和集成2.2 第一次测试看看模型能做什么让我们先通过Web界面直观感受一下模型的能力打开测试页面在实例列表中找到你的实例点击“HTTP”入口按钮上传测试图片点击上传区域选择一张文档图片建议用合同、论文、书籍页面开始分析点击“ 开始分析并标注”按钮查看结果2-3秒后右侧会显示带彩色框的标注图你应该能看到类似这样的效果红色框标出了所有的正文段落绿色框标出了各级标题紫色框标出了表格区域橙色框标出了图片/图表每个框的左上角还显示了标签和置信度比如text 0.95表示这是一个正文区域模型有95%的把握。2.3 API调用让程序也能“看懂”文档对于开发者来说Web界面只是尝鲜真正的价值在于API集成。PP-DocLayoutV3提供了标准的REST API方便你集成到自己的系统中。访问http://你的实例IP:8000/docs你会看到自动生成的API文档基于Swagger。核心接口只有一个import requests # 准备文档图片 image_path your_document.jpg # 调用版面分析API response requests.post( http://实例IP:8000/analyze, files{file: open(image_path, rb)} ) # 解析结果 result response.json() print(f检测到 {result[regions_count]} 个版面区域) for region in result[regions]: label region[label] # 区域类型text, title, table等 bbox region[bbox] # 坐标[x1, y1, x2, y2] score region[score] # 置信度0.0-1.0 print(f{label}: {bbox} (置信度: {score:.2f}))这个简单的调用就能获得文档的所有版面区域信息。接下来我们就可以基于这些信息构建完整的OCR流水线了。3. 构建文档结构化流水线从图片到结构化数据现在到了最核心的部分如何利用PP-DocLayoutV3构建一个完整的文档处理流水线我将通过一个实际案例展示从原始图片到结构化JSON的全过程。3.1 流水线架构设计一个完整的文档结构化流水线通常包含以下几个步骤1. 版面分析 → 2. 区域分类 → 3. 分区域OCR → 4. 内容提取 → 5. 结构化组装让我们用代码来实现这个流程。假设我们要处理一份学术论文的扫描件import cv2 import json from typing import Dict, List, Any import requests from paddleocr import PaddleOCR class DocumentStructPipeline: def __init__(self, doclayout_host: str): 初始化文档结构化流水线 Args: doclayout_host: PP-DocLayoutV3服务地址如 http://192.168.1.100:8000 self.doclayout_host doclayout_host self.ocr_engine PaddleOCR(use_angle_clsTrue, langch) def analyze_layout(self, image_path: str) - List[Dict]: 步骤1版面分析识别文档中的各个区域 with open(image_path, rb) as f: files {file: f} response requests.post( f{self.doclayout_host}/analyze, filesfiles ) if response.status_code 200: result response.json() return result[regions] else: raise Exception(f版面分析失败: {response.text}) def crop_and_classify_regions(self, image_path: str, regions: List[Dict]) - Dict[str, List]: 步骤2根据区域类型裁剪图片并分类 # 读取原始图片 image cv2.imread(image_path) height, width image.shape[:2] # 按区域类型分类 classified_regions { text: [], # 正文区域 title: [], # 标题区域 table: [], # 表格区域 figure: [], # 图片区域 other: [] # 其他区域 } for region in regions: label region[label] bbox region[bbox] # 确保坐标在图片范围内 x1 max(0, int(bbox[0])) y1 max(0, int(bbox[1])) x2 min(width, int(bbox[2])) y2 min(height, int(bbox[3])) # 裁剪区域 region_image image[y1:y2, x1:x2] # 存储区域信息 region_info { bbox: [x1, y1, x2, y2], image: region_image, score: region[score] } # 分类存储 if label in classified_regions: classified_regions[label].append(region_info) else: classified_regions[other].append(region_info) return classified_regions这个类已经完成了前两个步骤版面分析和区域分类。接下来我们实现OCR识别和内容提取。3.2 分区域OCR识别不同类型的区域需要不同的处理策略def ocr_text_regions(self, text_regions: List[Dict]) - List[Dict]: 步骤3对文本区域进行OCR识别 text_results [] for i, region in enumerate(text_regions): region_image region[image] bbox region[bbox] # 使用PaddleOCR识别文本 ocr_result self.ocr_engine.ocr(region_image, clsTrue) if ocr_result and ocr_result[0]: # 提取识别到的文本 texts [line[1][0] for line in ocr_result[0]] full_text \n.join(texts) text_results.append({ region_id: i, bbox: bbox, text: full_text, type: paragraph, confidence: region[score] }) return text_results def process_table_regions(self, table_regions: List[Dict]) - List[Dict]: 处理表格区域这里简化处理实际可能需要专门的表格识别模型 table_results [] for i, region in enumerate(table_regions): # 在实际应用中这里应该调用专门的表格识别模型 # 比如 PaddleOCR的表格识别功能或者其他的表格识别服务 table_image region[image] # 简化只保存表格图片和位置信息 table_results.append({ region_id: i, bbox: region[bbox], type: table, has_image: True, # 标记为需要进一步处理 confidence: region[score] }) return table_results def process_figure_regions(self, figure_regions: List[Dict]) - List[Dict]: 处理图片/图表区域 figure_results [] for i, region in enumerate(figure_regions): figure_image region[image] # 在实际应用中这里可以 # 1. 调用图像描述模型生成图注 # 2. 调用图表识别模型提取数据 # 3. 或者直接保存图片 figure_results.append({ region_id: i, bbox: region[bbox], type: figure, caption: , # 可以后续填充图注 confidence: region[score] }) return figure_results3.3 结构化组装与输出最后我们把所有处理结果组装成结构化的文档def assemble_document(self, text_results: List[Dict], title_results: List[Dict], table_results: List[Dict], figure_results: List[Dict]) - Dict[str, Any]: 步骤5组装结构化的文档数据 # 按Y坐标排序从上到下 all_elements text_results title_results table_results figure_results all_elements.sort(keylambda x: x[bbox][1]) # 构建文档结构 document { metadata: { total_regions: len(all_elements), text_regions: len(text_results), title_regions: len(title_results), table_regions: len(table_results), figure_regions: len(figure_results) }, content: [], structure: { titles: [], paragraphs: [], tables: [], figures: [] } } # 填充内容 for element in all_elements: element_type element[type] if element_type title: document[structure][titles].append({ text: element.get(text, ), bbox: element[bbox], level: self._estimate_title_level(element) }) elif element_type paragraph: document[structure][paragraphs].append({ text: element.get(text, ), bbox: element[bbox] }) elif element_type table: document[structure][tables].append({ bbox: element[bbox], has_image: element.get(has_image, False) }) elif element_type figure: document[structure][figures].append({ bbox: element[bbox], caption: element.get(caption, ) }) # 添加到完整内容列表保持原始顺序 document[content].append({ type: element_type, bbox: element[bbox], data: element }) return document def _estimate_title_level(self, title_element: Dict) - int: 根据位置和字体大小估计标题级别简化版 在实际应用中可能需要更复杂的逻辑 bbox title_element[bbox] height bbox[3] - bbox[1] # 区域高度 # 简单规则位置越高、区域越大级别越高 if bbox[1] 100: # 在页面顶部 return 1 # 一级标题 elif height 50: # 字体较大 return 2 # 二级标题 else: return 3 # 三级标题 def process_document(self, image_path: str, output_json: str None): 完整的文档处理流水线 print(步骤1: 版面分析...) regions self.analyze_layout(image_path) print(步骤2: 区域分类与裁剪...) classified self.crop_and_classify_regions(image_path, regions) print(步骤3: 文本区域OCR...) text_results self.ocr_text_regions(classified[text]) print(步骤4: 标题区域处理...) title_results self.ocr_text_regions(classified[title]) # 复用文本OCR print(步骤5: 表格区域处理...) table_results self.process_table_regions(classified[table]) print(步骤6: 图片区域处理...) figure_results self.process_figure_regions(classified[figure]) print(步骤7: 结构化组装...) document self.assemble_document( text_results, title_results, table_results, figure_results ) # 输出结果 if output_json: with open(output_json, w, encodingutf-8) as f: json.dump(document, f, ensure_asciiFalse, indent2) print(f结果已保存到: {output_json}) return document # 使用示例 if __name__ __main__: # 初始化流水线 pipeline DocumentStructPipeline(http://localhost:8000) # 处理文档 result pipeline.process_document( research_paper.jpg, output_jsonstructured_document.json ) print(f处理完成共识别 {result[metadata][total_regions]} 个区域) print(f- 标题: {result[metadata][title_regions]} 个) print(f- 段落: {result[metadata][text_regions]} 个) print(f- 表格: {result[metadata][table_regions]} 个) print(f- 图片: {result[metadata][figure_regions]} 个)这个完整的流水线展示了如何将PP-DocLayoutV3集成到实际的文档处理系统中。你可以根据自己的需求调整和扩展这个框架。4. 实际应用场景让文档处理更智能了解了技术原理和实现方法我们来看看PP-DocLayoutV3在实际项目中能发挥什么作用。4.1 场景一合同文档的自动化处理假设你是一家金融公司的开发人员需要处理大量的贷款合同扫描件。传统OCR只能提取文字但合同的结构信息如甲方乙方信息、条款标题、签名区域等全部丢失了。使用PP-DocLayoutV3后你可以智能分区域自动识别合同中的不同部分关键信息提取定位“甲方”、“乙方”、“签署日期”等关键字段条款结构化将合同条款按标题组织便于后续分析签名区域检测单独处理签名和盖章区域class ContractProcessor: def extract_contract_info(self, document: Dict) - Dict: 从结构化的合同文档中提取关键信息 contract_info { parties: {}, # 合同双方 dates: [], # 重要日期 amounts: [], # 金额信息 clauses: [], # 合同条款 signatures: [] # 签名区域 } # 分析标题区域寻找关键章节 for title in document[structure][titles]: title_text title[text].lower() if 甲方 in title_text or 出让方 in title_text: # 提取甲方信息 contract_info[parties][party_a] self._extract_party_info(title) elif 乙方 in title_text or 受让方 in title_text: # 提取乙方信息 contract_info[parties][party_b] self._extract_party_info(title) elif 签署日期 in title_text or 签订日期 in title_text: # 提取日期信息 contract_info[dates].append(self._extract_date_near_title(title)) return contract_info4.2 场景二学术论文的自动解析对于学术出版机构或文献数据库需要从海量论文中提取结构化信息标题、作者、摘要、章节、参考文献等。PP-DocLayoutV3可以帮助你论文元数据提取精确定位标题、作者、摘要区域章节结构分析识别“引言”、“方法”、“结果”、“讨论”等章节参考文献解析单独提取参考文献部分图表分离将图表和正文分离便于单独处理class PaperParser: def parse_academic_paper(self, document: Dict) - Dict: 解析学术论文结构 paper_structure { metadata: { title: , authors: [], abstract: , keywords: [] }, sections: [], references: [], figures_tables: [] } # 按位置排序所有元素 all_elements sorted(document[content], keylambda x: (x[bbox][1], x[bbox][0])) # 智能识别论文各部分 current_section None for element in all_elements: elem_type element[type] elem_data element[data] if elem_type title: text elem_data.get(text, ).lower() # 识别论文标题通常在顶部 if elem_data[bbox][1] 100: # 在页面顶部 paper_structure[metadata][title] elem_data.get(text, ) # 识别章节标题 elif any(keyword in text for keyword in [abstract, 摘要]): current_section abstract elif any(keyword in text for keyword in [introduction, 引言]): current_section introduction elif any(keyword in text for keyword in [reference, 参考文献]): current_section references else: # 普通章节 paper_structure[sections].append({ title: elem_data.get(text, ), content: [], figures: [], tables: [] }) return paper_structure4.3 场景三财务报表的数字化财务报表通常包含复杂的表格和文字混合排版。传统OCR很难正确处理这种结构。使用PP-DocLayoutV3你可以表格精准定位识别所有表格区域表格内容提取将表格区域送给专门的表格识别模型文字说明关联将表格周围的文字说明与表格关联生成结构化数据输出可直接导入数据库的JSON或CSVclass FinancialStatementProcessor: def process_financial_statement(self, image_path: str) - Dict: 处理财务报表 # 使用PP-DocLayoutV3分析版面 regions self.analyze_layout(image_path) # 分离表格和文字 tables [r for r in regions if r[label] table] texts [r for r in regions if r[label] text] financial_data { statement_type: self._detect_statement_type(texts), period: self._extract_period(texts), tables: [], notes: [] } # 处理每个表格 for i, table_region in enumerate(tables): table_data { table_id: i, bbox: table_region[bbox], type: self._classify_table_type(table_region, texts), data: self._extract_table_data(table_region) } financial_data[tables].append(table_data) return financial_data5. 性能优化与最佳实践在实际生产环境中使用PP-DocLayoutV3时有几个关键点需要注意5.1 图片预处理技巧模型的识别效果很大程度上取决于输入图片的质量。以下是一些实用的预处理技巧def preprocess_document_image(image_path: str, target_dpi: int 300) - np.ndarray: 文档图片预处理流程 # 读取图片 image cv2.imread(image_path) # 1. 调整DPI如果知道原始DPI # 对于OCR和版面分析300 DPI是理想值 current_dpi get_image_dpi(image_path) # 需要额外函数获取DPI if current_dpi and current_dpi ! target_dpi: scale_factor target_dpi / current_dpi new_width int(image.shape[1] * scale_factor) new_height int(image.shape[0] * scale_factor) image cv2.resize(image, (new_width, new_height)) # 2. 转换为灰度图版面分析通常用灰度图 if len(image.shape) 3: gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) else: gray image # 3. 二值化增强文字对比度 _, binary cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU) # 4. 去噪去除扫描噪声 denoised cv2.medianBlur(binary, 3) # 5. 矫正倾斜如果文档是歪的 angle detect_skew_angle(denoised) # 需要额外函数检测倾斜角度 if abs(angle) 0.5: # 如果倾斜角度大于0.5度 rotated rotate_image(denoised, angle) else: rotated denoised return rotated def get_image_dpi(image_path: str) - Optional[int]: 获取图片的DPI信息 try: with Image.open(image_path) as img: if dpi in img.info: return img.info[dpi][0] # 返回X方向的DPI except: pass return None5.2 批量处理与性能优化当需要处理大量文档时性能就变得很重要class BatchDocumentProcessor: def __init__(self, doclayout_host: str, max_workers: int 4): self.doclayout_host doclayout_host self.max_workers max_workers def process_batch(self, image_paths: List[str], output_dir: str output) - List[Dict]: 批量处理文档 results [] # 使用线程池并行处理 with ThreadPoolExecutor(max_workersself.max_workers) as executor: # 提交所有任务 future_to_path { executor.submit(self._process_single, path, output_dir): path for path in image_paths } # 收集结果 for future in tqdm(as_completed(future_to_path), totallen(image_paths), desc处理进度): try: result future.result() results.append(result) except Exception as e: path future_to_path[future] print(f处理失败 {path}: {e}) return results def _process_single(self, image_path: str, output_dir: str) - Dict: 处理单个文档 # 生成输出文件名 basename os.path.basename(image_path) name_without_ext os.path.splitext(basename)[0] output_json os.path.join(output_dir, f{name_without_ext}.json) # 处理文档 pipeline DocumentStructPipeline(self.doclayout_host) result pipeline.process_document(image_path, output_json) return { filename: basename, success: True, result_path: output_json, metadata: result[metadata] }5.3 错误处理与容错机制在实际应用中需要考虑到各种异常情况class RobustDocumentProcessor: def safe_process_document(self, image_path: str, max_retries: int 3) - Dict: 带重试和错误处理的文档处理 for attempt in range(max_retries): try: # 尝试处理 result self._process_with_timeout(image_path, timeout30) return result except requests.exceptions.Timeout: print(f请求超时第{attempt1}次重试...) time.sleep(2 ** attempt) # 指数退避 except requests.exceptions.ConnectionError: print(f连接错误检查服务是否正常...) self._check_service_health() time.sleep(5) except Exception as e: print(f处理失败: {e}) if attempt max_retries - 1: # 最后一次尝试也失败返回错误信息 return { filename: os.path.basename(image_path), success: False, error: str(e), fallback: self._fallback_processing(image_path) } return {success: False, error: 达到最大重试次数} def _fallback_processing(self, image_path: str) - Dict: 降级处理当PP-DocLayoutV3失败时使用备用方案 # 方案1使用传统的版面分析方法 # 方案2直接进行全图OCR # 方案3返回基础信息并标记需要人工处理 return { method: fallback_direct_ocr, warning: 版面分析失败使用直接OCR, content: self._direct_ocr(image_path) }6. 总结构建智能文档处理系统的关键一步通过本文的介绍你应该已经了解了PP-DocLayoutV3的核心价值和使用方法。作为OCR开发者将这个工具集成到你的文档处理流水线中可以带来几个显著的提升1. 识别准确率大幅提升通过先分析版面结构再针对不同区域使用合适的识别策略整体准确率可以提升30%-50%。特别是对于表格、公式等特殊区域效果改善尤为明显。2. 输出结构化程度更高不再是杂乱无章的文本流而是有层次、有结构的数据。这为后续的信息提取、内容分析、知识图谱构建打下了坚实基础。3. 处理流程更加智能化你可以根据区域类型动态调整处理策略文本区域用通用OCR、表格区域用表格识别、图片区域用图像分析。这种分而治之的策略让整个系统更加智能。4. 开发效率显著提高PP-DocLayoutV3提供了开箱即用的API服务你不需要从头训练版面分析模型也不需要深入研究计算机视觉算法。只需要简单的API调用就能获得专业的版面分析能力。给开发者的实用建议从小规模开始先在一个具体的场景如合同处理中试用验证效果后再扩展到其他场景结合业务逻辑版面分析只是第一步更重要的是如何利用分析结果解决你的具体业务问题建立评估体系定义清晰的评估指标如区域检测准确率、OCR提升效果持续优化流程考虑混合方案对于特别重要的文档可以结合人工审核建立人机协作的流程文档的智能化处理是一个持续演进的过程。PP-DocLayoutV3为你提供了一个强大的起点但真正的价值在于你如何将它融入到解决实际问题的系统中。现在是时候开始构建你的智能文档处理流水线了。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…