GLM-OCR Python API详解:predict接口返回结构、置信度阈值设置与后处理

news2026/3/29 4:39:21
GLM-OCR Python API详解predict接口返回结构、置信度阈值设置与后处理1. 项目概述与环境准备GLM-OCR 是一个基于先进多模态架构的高性能OCR识别模型专门针对复杂文档理解场景设计。它不仅能识别常规文本还支持表格识别、公式识别等高级功能为文档数字化处理提供了强大工具。1.1 核心特性与技术优势GLM-OCR 采用了多项创新技术来提升识别效果多令牌预测机制通过同时预测多个文本令牌大幅提升训练效率和识别准确率稳定的强化学习引入全任务强化学习机制增强模型在各种文档场景下的泛化能力高效视觉编码器集成在大规模图文数据上预训练的CogViT视觉编码器提供强大的图像理解能力轻量级跨模态连接采用高效的令牌下采样机制实现视觉与语言信息的有效融合1.2 环境配置与依赖安装在开始使用GLM-OCR的Python API之前需要确保环境正确配置# 激活conda环境 conda activate py310 # 安装必要依赖 /opt/miniconda3/envs/py310/bin/pip install \ githttps://github.com/huggingface/transformers.git \ gradio \ gradio_client \ torch2.9.1确保Python版本为3.10.19这是模型稳定运行的基础要求。2. API基础连接与调用2.1 建立客户端连接使用Gradio Client库可以轻松连接到GLM-OCR服务from gradio_client import Client import time def connect_to_glm_ocr(hostlocalhost, port7860, max_retries5): 连接到GLM-OCR服务支持重试机制 Args: host: 服务主机地址 port: 服务端口号 max_retries: 最大重试次数 Returns: Client: 连接成功的客户端实例 client None for attempt in range(max_retries): try: client Client(fhttp://{host}:{port}) print(连接GLM-OCR服务成功) return client except Exception as e: print(f连接尝试 {attempt1}/{max_retries} 失败: {str(e)}) if attempt max_retries - 1: time.sleep(2) # 等待2秒后重试 else: raise ConnectionError(f无法连接到GLM-OCR服务: {str(e)}) # 使用示例 try: client connect_to_glm_ocr() except ConnectionError as e: print(f连接失败: {e}) # 这里可以添加服务启动逻辑2.2 基础预测调用最基本的predict调用只需要提供图片路径和任务类型def basic_ocr_prediction(client, image_path, task_typeText Recognition): 基础OCR预测调用 Args: client: 已连接的客户端实例 image_path: 图片文件路径 task_type: 任务类型支持Text Recognition、Table Recognition、Formula Recognition Returns: dict: 预测结果 # 构建对应的prompt prompt_map { Text Recognition: Text Recognition:, Table Recognition: Table Recognition:, Formula Recognition: Formula Recognition: } prompt prompt_map.get(task_type, Text Recognition:) try: result client.predict( image_pathimage_path, promptprompt, api_name/predict ) return result except Exception as e: print(f预测调用失败: {str(e)}) return None # 使用示例 result basic_ocr_prediction(client, /path/to/document.png, Text Recognition) if result: print(识别结果:, result)3. predict接口返回结构解析3.1 文本识别返回结构文本识别任务的返回结果是一个结构化的字典包含丰富的识别信息def analyze_text_recognition_result(result): 分析文本识别结果的详细结构 Args: result: predict接口返回的结果 Returns: dict: 结构化解析结果 if not result or not isinstance(result, dict): return {error: 无效的结果格式} analysis { raw_result: result, detected_text_blocks: [], confidence_scores: [], bounding_boxes: [], overall_analysis: {} } # 提取文本块信息 if text_blocks in result: for i, block in enumerate(result[text_blocks]): text_info { block_id: i, text: block.get(text, ), confidence: block.get(confidence, 0.0), coordinates: block.get(bbox, {}), language: block.get(language, unknown), font_info: block.get(font, {}) } analysis[detected_text_blocks].append(text_info) analysis[confidence_scores].append(text_info[confidence]) # 统计信息 if analysis[detected_text_blocks]: analysis[overall_analysis] { total_blocks: len(analysis[detected_text_blocks]), avg_confidence: sum(analysis[confidence_scores]) / len(analysis[confidence_scores]), min_confidence: min(analysis[confidence_scores]), max_confidence: max(analysis[confidence_scores]), high_confidence_blocks: sum(1 for c in analysis[confidence_scores] if c 0.8), low_confidence_blocks: sum(1 for c in analysis[confidence_scores] if c 0.5) } return analysis # 使用示例 detailed_analysis analyze_text_recognition_result(result) print(f总共检测到 {detailed_analysis[overall_analysis][total_blocks]} 个文本块) print(f平均置信度: {detailed_analysis[overall_analysis][avg_confidence]:.3f})3.2 表格识别返回结构表格识别返回更复杂的分层结构def parse_table_structure(table_result): 解析表格识别结果的结构 Args: table_result: 表格识别返回结果 Returns: dict: 结构化的表格信息 table_data { table_count: 0, tables: [], total_cells: 0, detection_quality: {} } if tables in table_result: table_data[table_count] len(table_result[tables]) for table_idx, table in enumerate(table_result[tables]): table_info { table_id: table_idx, rows: table.get(rows, 0), columns: table.get(columns, 0), cells: [], confidence: table.get(confidence, 0.0), bounding_box: table.get(bbox, {}) } # 解析单元格 for cell in table.get(cells, []): cell_info { row: cell.get(row, 0), col: cell.get(col, 0), text: cell.get(text, ), confidence: cell.get(confidence, 0.0), row_span: cell.get(row_span, 1), col_span: cell.get(col_span, 1) } table_info[cells].append(cell_info) table_info[cell_count] len(table_info[cells]) table_data[tables].append(table_info) table_data[total_cells] table_info[cell_count] return table_data3.3 公式识别返回结构公式识别返回特殊的数学表达式结构def analyze_formula_result(formula_result): 分析公式识别结果 Args: formula_result: 公式识别返回结果 Returns: dict: 公式分析结果 analysis { formulas: [], latex_expressions: [], confidence_analysis: {} } if formulas in formula_result: confidences [] for formula in formula_result[formulas]: formula_info { expression: formula.get(expression, ), latex: formula.get(latex, ), confidence: formula.get(confidence, 0.0), position: formula.get(position, {}) } analysis[formulas].append(formula_info) analysis[latex_expressions].append(formula_info[latex]) confidences.append(formula_info[confidence]) if confidences: analysis[confidence_analysis] { average: sum(confidences) / len(confidences), min: min(confidences), max: max(confidences) } return analysis4. 置信度阈值设置与过滤策略4.1 基础置信度过滤通过设置置信度阈值来过滤低质量识别结果def filter_by_confidence(result, min_confidence0.6, task_typetext): 根据置信度阈值过滤识别结果 Args: result: 原始识别结果 min_confidence: 最小置信度阈值 task_type: 任务类型 Returns: dict: 过滤后的结果 filtered_result result.copy() if task_type text and text_blocks in result: filtered_blocks [ block for block in result[text_blocks] if block.get(confidence, 0) min_confidence ] filtered_result[text_blocks] filtered_blocks filtered_result[filtered_count] len(filtered_blocks) filtered_result[original_count] len(result[text_blocks]) elif task_type table and tables in result: filtered_tables [] for table in result[tables]: if table.get(confidence, 0) min_confidence: # 同时过滤表格内的低置信度单元格 if cells in table: table[cells] [ cell for cell in table[cells] if cell.get(confidence, 0) min_confidence ] filtered_tables.append(table) filtered_result[tables] filtered_tables elif task_type formula and formulas in result: filtered_result[formulas] [ formula for formula in result[formulas] if formula.get(confidence, 0) min_confidence ] return filtered_result # 使用示例只保留置信度高于0.7的结果 high_confidence_result filter_by_confidence(result, min_confidence0.7, task_typetext)4.2 自适应阈值策略根据不同场景动态调整置信度阈值def adaptive_confidence_threshold(result, task_typetext): 根据识别结果质量自适应调整置信度阈值 Args: result: 识别结果 task_type: 任务类型 Returns: float: 自适应阈值 if task_type text and text_blocks in result: confidences [block.get(confidence, 0) for block in result[text_blocks]] if not confidences: return 0.5 # 默认阈值 avg_confidence sum(confidences) / len(confidences) std_confidence (sum((c - avg_confidence) ** 2 for c in confidences) / len(confidences)) ** 0.5 # 根据平均值和标准差动态调整阈值 if std_confidence 0.2: # 置信度分布分散 return max(0.4, avg_confidence - 0.1) else: # 置信度集中 return max(0.5, avg_confidence - 0.05) elif task_type table and tables in result: # 表格识别通常需要更高阈值 return 0.65 elif task_type formula and formulas in result: # 公式识别可以接受稍低阈值 return 0.55 return 0.6 # 默认阈值 # 使用自适应阈值进行过滤 adaptive_threshold adaptive_confidence_threshold(result, text) filtered_result filter_by_confidence(result, adaptive_threshold, text)4.3 多层级置信度过滤实现不同严格程度的过滤策略class ConfidenceFilter: 多层级置信度过滤器 def __init__(self): self.presets { strict: 0.8, # 严格模式只保留高置信度结果 moderate: 0.6, # 适中模式平衡准确率和召回率 lenient: 0.4, # 宽松模式尽可能保留更多结果 adaptive: None # 自适应模式 } def filter_result(self, result, modemoderate, task_typetext): 根据预设模式过滤结果 Args: result: 识别结果 mode: 过滤模式 task_type: 任务类型 Returns: dict: 过滤后的结果 if mode adaptive: threshold adaptive_confidence_threshold(result, task_type) else: threshold self.presets.get(mode, 0.6) return filter_by_confidence(result, threshold, task_type) def analyze_confidence_distribution(self, result, task_typetext): 分析置信度分布情况 Returns: dict: 分布分析结果 analysis { total_items: 0, confidence_ranges: { 0.9-1.0: 0, 0.8-0.9: 0, 0.7-0.8: 0, 0.6-0.7: 0, 0.5-0.6: 0, 0.0-0.5: 0 }, recommended_mode: moderate } confidences [] if task_type text and text_blocks in result: confidences [block.get(confidence, 0) for block in result[text_blocks]] elif task_type table and tables in result: confidences [table.get(confidence, 0) for table in result[tables]] elif task_type formula and formulas in result: confidences [formula.get(confidence, 0) for formula in result[formulas]] analysis[total_items] len(confidences) for conf in confidences: if conf 0.9: analysis[confidence_ranges][0.9-1.0] 1 elif conf 0.8: analysis[confidence_ranges][0.8-0.9] 1 elif conf 0.7: analysis[confidence_ranges][0.7-0.8] 1 elif conf 0.6: analysis[confidence_ranges][0.6-0.7] 1 elif conf 0.5: analysis[confidence_ranges][0.5-0.6] 1 else: analysis[confidence_ranges][0.0-0.5] 1 # 根据分布推荐过滤模式 high_confidence_ratio (analysis[confidence_ranges][0.8-0.9] analysis[confidence_ranges][0.9-1.0]) / max(1, analysis[total_items]) if high_confidence_ratio 0.7: analysis[recommended_mode] strict elif high_confidence_ratio 0.3: analysis[recommended_mode] lenient return analysis # 使用示例 filter ConfidenceFilter() distribution filter.analyze_confidence_distribution(result, text) print(f推荐使用 {distribution[recommended_mode]} 模式进行过滤) filtered_result filter.filter_result(result, distribution[recommended_mode], text)5. 高级后处理技术与实践5.1 文本后处理与校正对识别文本进行智能校正和格式化import re from typing import List, Dict class TextPostProcessor: 文本后处理器 def __init__(self): # 常见OCR错误映射 self.common_ocr_errors { 0: O, 1: I, 5: S, 8: B, |: I, \\: , /: , [: (, ]: ), ¢: c, €: E, £: E } # 专业术语词典可根据领域扩展 self.domain_terms { techn0l0gy: technology, c0mputer: computer, algorithrn: algorithm, neuralnet: neural network } def correct_common_errors(self, text: str) - str: 校正常见OCR识别错误 corrected text for error, correction in self.common_ocr_errors.items(): corrected corrected.replace(error, correction) return corrected def correct_domain_terms(self, text: str) - str: 校正领域特定术语 corrected text for error, correction in self.domain_terms.items(): corrected corrected.replace(error, correction) return corrected def normalize_text(self, text: str) - str: 文本标准化处理 # 去除多余空格 text re.sub(r\s, , text.strip()) # 校正常见错误 text self.correct_common_errors(text) # 校正领域术语 text self.correct_domain_terms(text) # 确保首字母大写如果看起来像句子开头 if text and text[0].islower() and len(text) 1: text text[0].upper() text[1:] return text def process_text_blocks(self, text_blocks: List[Dict]) - List[Dict]: 处理文本块列表 processed_blocks [] for block in text_blocks: processed_block block.copy() if text in processed_block: processed_block[original_text] processed_block[text] processed_block[text] self.normalize_text(processed_block[text]) processed_blocks.append(processed_block) return processed_blocks # 使用示例 processor TextPostProcessor() processed_result result.copy() if text_blocks in processed_result: processed_result[text_blocks] processor.process_text_blocks(processed_result[text_blocks])5.2 表格结构后处理对识别出的表格进行结构优化和格式化class TablePostProcessor: 表格后处理器 def reconstruct_table(self, table_data: Dict) - Dict: 重建规整的表格结构 Args: table_data: 原始表格数据 Returns: Dict: 重建后的表格 if not table_data.get(cells): return table_data # 确定表格行列数 max_row max((cell.get(row, 0) for cell in table_data[cells]), default0) max_col max((cell.get(col, 0) for cell in table_data[cells]), default0) # 创建二维表格结构 reconstructed [] for row in range(max_row 1): table_row [] for col in range(max_col 1): # 查找对应位置的单元格 cell next((c for c in table_data[cells] if c.get(row) row and c.get(col) col), None) table_row.append(cell.get(text, ) if cell else ) reconstructed.append(table_row) table_data[reconstructed_table] reconstructed table_data[dimensions] {rows: max_row 1, columns: max_col 1} return table_data def merge_split_cells(self, table_data: Dict) - Dict: 合并被错误分割的单元格 Args: table_data: 表格数据 Returns: Dict: 合并后的表格 # 实现单元格合并逻辑 # 这里可以根据单元格内容相似度、位置关系等进行智能合并 return table_data def format_table_output(self, table_data: Dict, format_type: str markdown) - str: 格式化表格输出 Args: table_data: 表格数据 format_type: 输出格式 Returns: str: 格式化后的表格 if reconstructed_table not in table_data: table_data self.reconstruct_table(table_data) table table_data[reconstructed_table] if format_type markdown: return self._format_markdown_table(table) elif format_type csv: return self._format_csv_table(table) else: return str(table) def _format_markdown_table(self, table: List[List[str]]) - str: 格式化为Markdown表格 if not table: return # 创建表头分隔线 header_separator [---] * len(table[0]) lines [] for i, row in enumerate(table): if i 1: # 在表头后添加分隔行 lines.append(| |.join(header_separator) |) lines.append(| |.join(str(cell) for cell in row) |) return \n.join(lines) def _format_csv_table(self, table: List[List[str]]) - str: 格式化为CSV表格 return \n.join(,.join(f{cell} for cell in row) for row in table) # 使用示例 table_processor TablePostProcessor() processed_tables [] for table in result.get(tables, []): processed_table table_processor.reconstruct_table(table) markdown_output table_processor.format_table_output(processed_table, markdown) processed_table[markdown_output] markdown_output processed_tables.append(processed_table) result[processed_tables] processed_tables5.3 公式后处理与LaTeX优化对识别出的数学公式进行格式校正class FormulaPostProcessor: 公式后处理器 def __init__(self): self.latex_corrections { r\\left\(([^)])\\\right\): r(\1), # 简化不必要的\left\right r\\cdot: *, # 点乘转换为星号 r\\frac\{([^}])\}\{([^}])\}: r\1/\2, # 分数简化为除法 } def simplify_latex(self, latex_str: str) - str: 简化LaTeX表达式 Args: latex_str: 原始LaTeX字符串 Returns: str: 简化后的LaTeX simplified latex_str for pattern, replacement in self.latex_corrections.items(): simplified re.sub(pattern, replacement, simplified) return simplified def validate_formula(self, formula: str) - bool: 验证公式的合理性 Args: formula: 数学公式 Returns: bool: 是否合理 # 检查括号匹配 stack [] for char in formula: if char in ([{: stack.append(char) elif char in )]}: if not stack: return False top stack.pop() if (top ( and char ! )) or \ (top [ and char ! ]) or \ (top { and char ! }): return False if stack: return False # 检查基本数学结构 if re.search(r[0-9][a-zA-Z], formula): # 数字直接接字母可能缺少运算符 return False return True def process_formulas(self, formulas: List[Dict]) - List[Dict]: 处理公式列表 Args: formulas: 原始公式列表 Returns: List[Dict]: 处理后的公式列表 processed [] for formula in formulas: processed_formula formula.copy() if latex in processed_formula: original_latex processed_formula[latex] processed_formula[original_latex] original_latex processed_formula[latex] self.simplify_latex(original_latex) processed_formula[is_valid] self.validate_formula(processed_formula[latex]) processed.append(processed_formula) return processed # 使用示例 formula_processor FormulaPostProcessor() if formulas in result: result[formulas] formula_processor.process_formulas(result[formulas])6. 完整应用示例与最佳实践6.1 端到端的OCR处理流水线整合所有组件的完整处理流程class GLMOCRProcessor: GLM-OCR完整处理器 def __init__(self, hostlocalhost, port7860): self.client None self.host host self.port port self.text_processor TextPostProcessor() self.table_processor TablePostProcessor() self.formula_processor FormulaPostProcessor() self.confidence_filter ConfidenceFilter() def initialize(self): 初始化连接 self.client connect_to_glm_ocr(self.host, self.port) return self.client is not None def process_document(self, image_path, task_typeText Recognition, confidence_modeadaptive, post_processTrue): 完整文档处理流程 Args: image_path: 图片路径 task_type: 任务类型 confidence_mode: 置信度过滤模式 post_process: 是否进行后处理 Returns: dict: 处理结果 if not self.client: if not self.initialize(): raise ConnectionError(无法连接到GLM-OCR服务) # 1. 调用预测接口 raw_result basic_ocr_prediction(self.client, image_path, task_type) if not raw_result: return {error: 预测调用失败} # 2. 置信度过滤 filtered_result self.confidence_filter.filter_result( raw_result, confidence_mode, task_type.lower().split()[0] ) # 3. 后处理 if post_process: filtered_result self._apply_post_processing(filtered_result, task_type) # 4. 添加处理元数据 filtered_result[processing_metadata] { task_type: task_type, confidence_mode: confidence_mode, post_processed: post_process, processing_time: time.strftime(%Y-%m-%d %H:%M:%S) } return filtered_result def _apply_post_processing(self, result, task_type): 应用后处理 processed_result result.copy() if task_type Text Recognition and text_blocks in result: processed_result[text_blocks] self.text_processor.process_text_blocks( result[text_blocks] ) elif task_type Table Recognition and tables in result: processed_tables [] for table in result[tables]: processed_table self.table_processor.reconstruct_table(table) processed_table[markdown_output] self.table_processor.format_table_output( processed_table, markdown ) processed_tables.append(processed_table) processed_result[tables] processed_tables elif task_type Formula Recognition and formulas in result: processed_result[formulas] self.formula_processor.process_formulas( result[formulas] ) return processed_result def export_results(self, result, export_formatjson, output_pathNone): 导出处理结果 Args: result: 处理结果 export_format: 导出格式 output_path: 输出路径 Returns: str: 导出内容或文件路径 if export_format json: output json.dumps(result, ensure_asciiFalse, indent2) elif export_format text: output self._export_text_format(result) else: output str(result) if output_path: with open(output_path, w, encodingutf-8) as f: f.write(output) return output_path else: return output def _export_text_format(self, result): 导出为文本格式 lines [] if text_blocks in result: lines.append( 文本识别结果 ) for block in result[text_blocks]: lines.append(f[置信度: {block.get(confidence, 0):.3f}] {block.get(text, )}) if tables in result: lines.append(\n 表格识别结果 ) for i, table in enumerate(result[tables]): if markdown_output in table: lines.append(f\n表格 {i1}:) lines.append(table[markdown_output]) if formulas in result: lines.append(\n 公式识别结果 ) for formula in result[formulas]: lines.append(f{formula.get(latex, )} (置信度: {formula.get(confidence, 0):.3f})) return \n.join(lines) # 使用示例 def main(): processor GLMOCRProcessor() # 处理文档 result processor.process_document( /path/to/technical_document.png, task_typeText Recognition, confidence_modeadaptive, post_processTrue ) # 导出结果 output_text processor.export_results(result, text) print(output_text) # 保存详细结果 processor.export_results(result, json, /path/to/output/results.json) if __name__ __main__: main()6.2 批量处理与性能优化处理大量文档时的优化策略class BatchOCRProcessor: 批量OCR处理器 def __init__(self, max_workers4): self.processor GLMOCRProcessor() self.max_workers max_workers self.processor.initialize() def process_batch(self, image_paths, task_typeText Recognition, output_dirNone, callbackNone): 批量处理多张图片 Args: image_paths: 图片路径列表 task_type: 任务类型 output_dir: 输出目录 callback: 进度回调函数 Returns: List[dict]: 处理结果列表 results [] total len(image_paths) with ThreadPoolExecutor(max_workersself.max_workers) as executor: future_to_path { executor.submit(self._process_single, path, task_type, output_dir): path for path in image_paths } for i, future in enumerate(as_completed(future_to_path), 1): try: result future.result() results.append(result) if callback: callback(i, total, result) except Exception as e: print(f处理失败 {future_to_path[future]}: {str(e)}) results.append({error: str(e), file: future_to_path[future]}) return results def _process_single(self, image_path, task_type, output_dir): 处理单张图片 result self.processor.process_document(image_path, task_type) if output_dir and not result.get(error): filename os.path.basename(image_path) output_path os.path.join(output_dir, f{os.path.splitext(filename)[0]}.json) self.processor.export_results(result, json, output_path) return result # 使用示例 def progress_callback(current, total, result): print(f处理进度: {current}/{total} - {result.get(processing_metadata, {}).get(task_type, )}) batch_processor BatchOCRProcessor(max_workers2) image_files [doc1.png, doc2.png, doc3.jpg] results batch_processor.process_batch( image_files, task_typeText Recognition, output_dir./output, callbackprogress_callback )7. 总结通过本文的详细讲解你应该已经全面掌握了GLM-OCR Python API的使用方法特别是predict接口的返回结构解析、置信度阈值设置策略以及各种后处理技术。7.1 关键要点回顾接口返回结构GLM-OCR返回结构化的识别结果包含文本块、表格、公式等丰富信息每项都有置信度评分置信度管理提供了从基础阈值过滤到自适应策略的多层级置信度管理方案可根据不同需求调整识别严格程度后处理技术包含文本校正、表格重构、公式优化等高级后处理功能显著提升识别结果的质量和可用性完整工作流提供了从单张图片处理到批量处理的完整解决方案满足各种实际应用场景7.2 最佳实践建议在实际项目中应用GLM-OCR时建议起始设置开始时使用适中置信度模式0.6根据结果质量再调整后处理启用始终开启后处理功能能显著改善识别结果批量处理处理大量文档时使用BatchOCRProcessor合理设置并发数结果验证对重要文档建议人工抽样验证识别结果性能监控监控处理时间和资源使用优化配置参数7.3 扩展应用方向基于GLM-OCR的强大能力还可以进一步开发文档数字化系统构建完整的文档扫描、识别、存储系统智能表单处理专门处理各种表格和表单文档多语言支持扩展支持更多语言的文档识别领域定制化针对特定领域医疗、法律、金融等优化识别效果GLM-OCR作为一个强大的多模态OCR模型为文档处理和理解提供了强有力的技术基础结合恰当的API使用策略和后处理技术能够满足大多数实际应用场景的需求。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2460292.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;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…