简介这是一份基于EasyOCR的OCR文字识别系统完整项目面向需要实现图像文字提取的开发者、机器学习入门者也适合作为课程设计参考。系统整合了图像输入、预处理、EasyOCR识别与结果输出等模块预处理环节涉及灰度化、二值化、去噪、旋转校正等操作并配备初版与最终版两套Python实现便于对比分析系统迭代的细节。压缩包内共八个文件包含Python源码、三张示例图片、requirements.txt依赖清单、README说明文件与项目汇报PPT整体大小仅1.83MB。其中需求清单列出了所有依赖包可快速搭建运行环境汇报PPT则完整梳理了开发流程和设计思路对汇报答辩或复盘学习都很有帮助。目前已有39人浏览学习这份资源侧重EasyOCR的实际应用能帮助使用者从零构建一套文字识别工具在文档数字化、信息提取、翻译等场景中直接调用。1. 基于EasyOCR的OCR文字识别系统先把需求落到一行识别命令上OCR识别需求大多长这样手里是一堆扫描件、证书照片、聊天记录截图用户要的是里面那几行关键信息能变成可检索的文本。EasyOCR 就是这套识别系统的核心组件它把文本检测和文字识别一体打包支持中文简繁体、英文、数字混排且完全本地推理适合离线环境和内网部署。它还开放了自定义模型训练入口对做工具类产品的开发者来说是一条能快速走通、并且后面能持续调优的路径。下面我按自己做这类项目的顺序来讲跑通最小环境、调参提准确率、训练自己的模型、排掉常见坑、最后封装成服务。2. 搭建EasyOCR运行环境从zip解压到跑通第一张图拿到这个“基于EasyOCR的OCR文字识别系统.zip”解压后通常是一整套工程代码主识别模块、依赖清单、示例图片和文档。真正的工作是从搭建环境开始的。我见过不少项目翻车在第一步不是识别不准而是连import easyocr都过不去。先把环境立住后面才有资格谈参数和模型。2.1 为什么选EasyOCR而不是Tesseract、PaddleOCR或云接口做本地OCR识别的可选项其实不少先摆结论如果你的场景是Python生态、数据不出内网、要快速出结果EasyOCR往往是性价比最高的那个。Tesseract是老牌开源引擎对干净印刷体的单字识别不差但它的文本检测能力很弱给定一张整页扫描件你需要自己先圈出文本区域否则会把表格线和噪声也当字符处理。PaddleOCR的中文识别效果确实好可它的依赖重PaddlePaddle框架和PyTorch经常同时出现在一个环境里互相踩版本部署到瘦客户端时体感非常明显。云接口识别率高但图片要上传到外部服务合同、身份证、医疗票据这类数据很难接受出境而且按次计费跑到后期成本并不低。EasyOCR把这些问题的答案揉成了一个包文本检测和文字识别串在一条链路上pip install就能装模型权重在本地文件系统里断网也能跑。对只想从图片里把文字提取出来的开发者这就是最直接的落点。下面的操作都围绕这个最小闭环展开。2.2 解压压缩包、建虚拟环境、装依赖解压代码包时建议放到纯英文路径下比如/workspace/ocr_system。中文路径在加载PyTorch权重时容易触发编码异常这个坑我已经踩过不止一次。解压后先看有没有requirements.txt有就用它装依赖没有再用我下面的最小集合。# 解压代码包路径保持全英文 unzip EasyOCR_OCR_system.zip -d /workspace/ocr_system cd /workspace/ocr_system # 创建独立虚拟环境避免把依赖装进系统Python python3 -m venv .venv source .venv/bin/activate # 安装核心依赖如果项目里有requirements.txt优先用它 pip install --upgrade pip pip install easyocr opencv-python pillow逻辑说明第一步解压到指定目录-d参数目标目录不存在会自动创建。第二步创建虚拟环境这是隔离依赖的关键操作。第三步安装 EasyOCR 和图像处理库opencv-python 用于预处理pillow 在合成训练数据和图像转换时会用到。参数说明Python 版本建议用 3.8 到 3.10PyTorch 对太新的 Python 版本支持会滞后3.12 以上装 torch 时经常要等很久的编译过程。如果项目自带requirements.txt直接用pip install -r requirements.txt它会把 easyocr、torch、torchvision 的版本关系固定住。手动安装时注意不要同时装两套深度学习框架容易把底层库链接搞乱。2.3 最小识别脚本一张图跑出文字环境就绪后先跑一段最简脚本验证整条链路。这里不要一上来就套预处理、调参数先确认模型能加载、图片能读入、文本能输出。import easyocr # 创建Readerch_sim是简体中文en是英文gpuFalse强制用CPU reader easyocr.Reader([ch_sim, en], gpuFalse, verboseTrue) # 识别一张图detail1表示返回坐标文本置信度 result reader.readtext(sample.jpg, detail1) # 输出三元组坐标、识别文本、置信度 for box, text, score in result: print(text, round(score, 3), box)逻辑说明Reader是EasyOCR的总入口初始化时会加载文本检测模型和识别模型两份权重。readtext是核心方法输入图片路径输出一个列表列表里每个元素是(四点坐标, 文本, 置信度)。四角坐标可以用于后续仿射变换、按位置排序和表格结构化。参数说明gpuFalse表示纯CPU运行适合没有NVIDIA显卡的机器如果机器有可用显卡改成gpuTrue会快好几倍。verboseTrue会打印模型加载日志排错时建议开着。detail1是默认值如果只想要文字不想要坐标改成detail0会更省内存但后续做版面分析就会缺依据。2.4 模型权重是黑匣子首次运行到底下载了什么第一次执行Reader创建时控制台会显示下载进度很多人不知道这些文件去了哪里。在Linux和macOS上默认权重目录是~/.EasyOCR/model/Windows 上是C:\Users\用户名\.EasyOCR\model\。里面存放的是检测器和识别器两类权重文件名形如craft_mlt_25k.pth检测模型和zh_sim_g2.pth简体中文识别模型。这些权重可以直接拷贝复制不需要现场下载。# 查看权重文件是否已下载完整 ls -lh ~/.EasyOCR/model/离线或内网部署时最稳妥的做法是先在联网机器上把权重跑一遍让文件完整下载到本地然后整体拷到目标机器的相同目录再禁掉自动下载import easyocr # 离线环境初始化不触发下载直接读本地权重 reader easyocr.Reader( [ch_sim, en], gpuTrue, model_storage_directory/data/weights/EasyOCR, download_enabledFalse )逻辑说明model_storage_directory指定权重存放目录download_enabledFalse告诉EasyOCR不要联网下载。这样部署到隔离网络时只要目录里有对应权重文件程序就会正常启动不会卡在下载环节。这个操作对应很多人在找的离线OCR方案本质就是“模型文件随程序走”。参数说明自定义目录必须是绝对路径且目录下文件命名要保持EasyOCR默认规则不能自己改名。检测器和识别器模型要配套比如简体中文识别模型和英文模型混放会导致加载失败。3. 把识别准确率调上去图像预处理和Reader参数调优最小案例跑通后真实业务图很快就会给你当头一棒扫描件倾斜、小字密密麻麻、竖排标签、印章压在文字上。这一章重点讲参数怎么设以及为什么这么设。核心技巧是把图片预处理和readtext参数分开看前者决定模型看到的图片质量后者决定模型怎么在图上寻找和识别文字。3.1 中文与英文混排语言列表是怎么起作用的Reader([ch_sim, en])里面的语言列表直接决定识别模型加载哪套字符集。ch_sim加载简体中文模型en加载英文和数字模型两者可以组合成一个识别器使用。如果图片里有繁体字需要加ch_tra日语加ja韩语加ko。语言列表不是越多越好每多一个语言候选字符集会成倍增加识别器在相似字形之间的误判率也会上升。固定场景下越窄的语言范围越准。常见的错误是图片明明是中文Reader里只写了[en]结果识别出一堆字母和乱码人都能看懂是汉字模型却完全不认识。这属于语言模型选型错误。另一个错误在中英文混排的合同里出现只加[ch_sim]结果发票号、金额里的英文字母和数字被识别成相似的中文字形比如“O”变“0”、“l”变“1”。解决方式就是把en放进去让模型同时有英文和数字的候选空间。3.2 图像预处理三板斧放大、去噪、矫正倾斜很多识别不准的问题不是模型不行而是图片质量没有送到位。EasyOCR对低分辨率文字非常敏感原图里的字只有十几个像素高时再强的模型也白搭。我的预处理顺序是三件事小图放大、轻度去噪、纠正明显倾斜。import cv2 import numpy as np def preprocess_for_easyocr(image_path): img cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) # 第一板斧小图放大让笔画变粗 h, w img.shape[:2] if min(h, w) 800: scale 1200 / max(h, w) img cv2.resize(img, None, fxscale, fyscale, interpolationcv2.INTER_CUBIC) # 第二板斧轻度去噪太强会抹掉笔画细节 denoised cv2.bilateralFilter(img, d5, sigmaColor50, sigmaSpace50) # 第三板斧转成3通道RGBEasyOCR内部按RGB处理 rgb cv2.cvtColor(denoised, cv2.COLOR_GRAY2RGB) return rgb逻辑说明OpenCV 默认读图是 BGR 顺序EasyOCR 训练时用的是 RGB色序反了会造成颜色特征错乱。尤其对彩色背景上的文字比如红底白字、印章压痕直接喂 BGR 图识别效果会明显下降。这里先读成灰度图再转成三通道 RGB彻底避开色序问题。参数说明min(h, w) 800判断是否小图1200是目标长边长度扫描件长边在1200像素左右时识别速度和质量比较平衡。bilateralFilter的三个参数d5是滤波窗口直径sigmaColor50控制颜色差异保边程度sigmaSpace50控制空间距离影响。要注意不要把去噪做得太狠噪声去除和笔画保留是一对矛盾扫描件的轻微噪点任由它去不要做开闭运算否则细笔画字体会断掉。3.3 竖排文本和印章rotation_info与paragraph的取舍竖排文字是中文场景里特别烦人的问题。姓名竖排、日期竖排、发票上竖排的“密码区”如果不做处理EasyOCR会漏得七七八八。官方参数里提供了多项式旋转识别开关rotation_info。result reader.readtext( img, detail1, paragraphFalse, canvas_size2560, mag_ratio1.5, batch_size4, rotation_info[90, 180, 270], allowlist0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz, )逻辑说明rotation_info[90, 180, 270]告诉模型检测阶段把图分别旋转三个角度再做文本检测然后把所有角度的检测框汇总。对竖排文字来说模型会在旋转90度后的图像上把它当作正常横向文本检出再映射回原坐标。这是目前处理竖排最直接的手段。参数说明canvas_size2560是模型处理图像的最长边上限超过这个长度的图会被分块处理适合超长扫描件但调太高会显著增加内存占用。mag_ratio1.5是在输入的图片基础上再做一次等比放大小字号文本密集时调到1.5到2.0准确率提升明显。paragraphTrue会把相近的文本行合并成整段文字这个开关在多数业务里不建议打开它会吞掉换行信息后续你想按字段提取时找不到行的边界。allowlist用来限制只识别哪些字符比如只识别数字和英文模型就不会把数字误判成中文这一项对验证码、订单号场景帮助特别大。3.4 让识别结果乖乖排队detail、allowlist与排序逻辑EasyOCR 返回的结果顺序在简单页面里还行但在分栏、表格、发票这种复杂版面上文本顺序经常是一通乱序。它的默认排序规则非常原始按检测框的 y 坐标模糊聚类后再按 x 排遇到从左到右、从上到下的常规段落还好遇到先列后行的字段布局输出顺序就可能变成第一列整列读完之后才轮到第二列。这一点经常让新手误以为漏识别其实文字都在只是顺序被原样吐出了。解决办法很简单拿到坐标后自己重新排序。我的习惯是按“行分组、组内按x排序再加权合并”的思路处理from collections import defaultdict def sort_boxes(result): lines defaultdict(list) for box, text, score in result: ys [point[1] for point in box] line_key int(sum(ys) / len(ys) / 20) * 20 # 按20像素分桶 lines[line_key].append((box, text, score)) sorted_result [] for key in sorted(lines.keys()): row sorted(lines[key], keylambda item: min(p[0] for p in item[0])) sorted_result.extend(row) return sorted_result逻辑说明先取每个文本框四个角点y坐标的平均值再除以20取整作为分桶编号同一桶视为同一行。行内再用文本框最左侧的x坐标排序这样输出的顺序就是从左到右、从上到下。20像素这个阈值要参考字号动态调整字号大时改成40或更大否则相邻两行之间的间距小于阈值时会被混进同一个桶里。排序完再决定要不要detail0。detail0只返回字符串列表内存占用小但丢掉坐标后就没法做二次排序所以我的建议是识别阶段保留坐标输出阶段再按业务需求转成纯文本。4. 训练自己的EasyOCR模型什么时候需要数据怎么喂很多人搜“easyocr训练自己的模型”其实是想解决“某些字识别不准”的问题。这里要泼一盆冷水默认模型对印刷体中文和英文的覆盖已经很好你遇到的模糊、倾斜、背景复杂问题多数靠预处理和参数就能解决。真正需要训练定制模型的场景只有三类识别某种专用字体、识别印章上的反字或异形字、识别业务特有的符号体系。在决定训练之前先用第五章的调优手段把默认模型榨干往往能省下几周标注时间。4.1 定制模型的适用边界先做成本判断训练一个EasyOCR自定义识别器成本不只是GPU电费而是数据标注和迭代周期。我的经验是印刷体识别不准先调mag_ratio和allowlist模糊和倾斜先做预处理只有当你明确知道默认模型的字符集里没有你想识别的字符或者同一个字符反复被错误识别成另一个字符时才考虑训练。最常见的落地场景是手写体数字或特定品牌字体。比如工业仪表读数字符集只有0到9和少量字母默认模型偶尔把7识别成1、把0识别成O。这时训练一个专用识别器把字符集限定在20个以内准确率可以从90%拉到99%以上。这种项目数据量也不需要很大几百张图、每张图几个数字就能达到可用水平。4.2 用labelme标注的文本行数据怎么整理训练识别器需要的是“文本行图片对应文本”的配对数据。我习惯先用labelme标注把图片里的每一行文字按四边形框出来文本内容作为标签。标注时有一个关键纪律按文本行标不要按段落标。段落包含多行会让识别器混淆字符宽度和上下文关系按行标注模型才能学会“一行是一组”。labelme导出的JSON包含图像路径和多边形坐标需要转成训练列表。下面的脚本把JSON转成每行一个样本的list文件import json import glob import os def labelme_to_trainlist(json_dir, output_txt): lines [] for json_path in glob.glob(os.path.join(json_dir, *.json)): with open(json_path, encodingutf-8) as f: data json.load(f) image_name data[imagePath] for shape in data[shapes]: label shape[label].strip() if not label: continue points shape[points] # 四边形的四个角点 if len(points) 4: coords .join([f{x:.1f},{y:.1f} for x, y in points]) lines.append(f{image_name}\t{coords}\t{label}\n) with open(output_txt, w, encodingutf-8) as f: f.writelines(lines)逻辑说明脚本读取labelme产物提取图片名、四边形角点坐标和文本标签输出以Tab分隔的文本文件。这个文件既可以直接用于后续裁剪文本行也可以作为训练数据索引。注意points的顺序在labelme里可能是顺时针也可能是逆时针训练框架通常不要求严格角点序但裁剪时建议先按左上、右上、右下、左下排序。4.3 合成数据与训练启动参数真实标注数据往往不够我的补救方案是合成数据用目标字体渲染大量文本图片再叠加仿真噪声。这是让识别器快速覆盖字符组合多样性最便宜的方式。一个最小合成脚本长这样from PIL import Image, ImageDraw, ImageFont import numpy as np import random def synthesize(text, font_path, out_path): font ImageFont.truetype(font_path, 64) img Image.new(RGB, (64 * len(text) 32, 96), (255, 255, 255)) draw ImageDraw.Draw(img) draw.text((16, 8), text, fill(0, 0, 0), fontfont) # 加少量椒盐噪声模拟扫描件的颗粒感 arr np.array(img) mask np.random.rand(*arr.shape[:2]) 0.01 arr[mask] 0 img Image.fromarray(arr) img.save(out_path)逻辑说明PIL渲染文字并保存np.random.rand生成随机掩膜并给一部分像素涂黑模拟扫描噪点。实际使用时要加入旋转、缩放、背景干扰等增强这里只是最小框架。训练启动时以EasyOCR官方训练工程为基线配置五个关键参数target_characters是你的字符集img_w和img_h是训练图片尺寸batch_size和learning_rate控制收敛速度。命令形式如下# 以官方训练工程为模板启动自定义模型训练 python train.py --yaml config_files/my_data.yaml参数说明字符集必须严格覆盖所有语料缺一个字符就会导致该字符永远识别不出来图片尺寸建议长边64、宽边从64到256不等和实际裁剪出来的文本行长宽比接近批量大小在GPU上给64左右学习率从1e-4起步。训练中要监控损失值如果损失在几个epoch后不下降第一反应不是调学习率而是检查数据标注有没有错。4.4 把训练好的识别器塞回Reader训练完成后产物通常是一个权重文件外加一个网络定义脚本。EasyOCR 的Reader支持通过recog_network参数指向自定义识别器reader easyocr.Reader( [en], # 自定义网络一般基于英文模型结构 recog_networkmy_recog, model_storage_directory/data/weights, user_network_directory/data/weights/network )逻辑说明recog_network是自定义网络名称user_network_directory指向包含网络定义脚本和权重文件的目录。初始化时会优先加载自定义识别器不再走默认的zh_sim_g2.pth那套。要注意自定义识别器和语言列表之间不是完全解耦的字符集由你自己定义语言列表只影响前置检测阶段的语言假设。训练这一章的代价确实不小所以放在第四层。绝大多数项目不需要走到这一步但如果你的字不在默认模型覆盖范围内这一步是绕不过去的。训练前先备份默认权重训练过程出问题还能回到原方案。5. 避坑指南EasyOCR在真实项目里最容易翻车的5个地方这一章写的是血泪经验每一条都在真实项目里出现过按“现象、原因、解决”的结构记录。5.1 CPU推理慢到没法用现象CPU机器上读一张高分辨率扫描件单张耗时10秒以上内存占用还不断上涨。原因readtext默认会把长边超过canvas_size的图分块处理原图3000像素宽时canvas_size默认2560等于把图切成两半分别检测推理次数翻倍同时在CPU上前向推理本来就是串行的batch_size又默认是1检测过程会逐个box跑识别。解决先把图缩放到长边不超过1600像素再送入识别batch_size从1调到4CPU也能受益于小批量矩阵运算canvas_size保持1600到2000即可不要盲目调大。还有一个容易忽略的点把verboseFalse关掉控制台输出能减少不少IO等待。5.2 中文识别成乱码或英文字母现象图片里明明是汉字输出结果是一串字母或乱码或者在某些机器上第一遍识别正常第二遍就乱码。原因Reader 初始化时只传了[en]没有加载ch_sim模型还有一种情况是模型下载不完整网络波动导致权重文件损坏加载时没有报错但推理结果异常。解决显式指定语言列表并检查权重目录。创建 Reader 时用easyocr.Reader([ch_sim, en])然后到~/.EasyOCR/model/看zh_sim_g2.pth文件大小是否在合理范围内不对就删掉重新下载。乱码这个问题在跨机器部署时尤其常见pre-trained模型文件和代码版本要一并打包分发。5.3 竖排文字漏识别或输出顺序错乱现象竖排的姓名、日期、发票密码区识别结果只有零星几个字甚至整行丢失。原因默认的文本检测只在水平方向上寻找文本框竖排文字在0度图像上的检测响应很弱检测框压根没有生成识别器自然什么都没拿到。解决开启rotation_info[90, 180, 270]让检测阶段在旋转后的图像上重复寻找。开启后要接受另一个代价推理时间会增加接近两倍因为每个旋转角度都要做一次完整检测。竖排结果拿到后阅读顺序不一定符合人眼习惯需要按文本框中心点的x坐标和y坐标重新组织才能真正按“从上到下、从右到左”输出。5.4 zip压缩包解压报错或者代码启动缺依赖现象收到“系统.zip”后解压提示文件损坏或者明明在同类机器上跑通的代码换一台机器就报ModuleNotFoundError。原因zip文件在传输过程中字节丢失或者压缩包带有伪加密标志——文件头把加密位标为1实际数据并未加密部分解压工具会误判为需要密码。代码层面的缺依赖本质上是没有把环境依赖固定成可复现的清单。解决先校验压缩包完整性Linux上用unzip -tWindows上用7-Zip“测试”功能。对伪加密的zip7-Zip往往能直接解出来因为它会尝试忽略加密标志位强行读取数据流。代码依赖的解法是必须有requirements.txt并用pip install -r requirements.txt装环境不要靠手动记。# 校验zip压缩包完整性的命令 unzip -t EasyOCR_OCR_system.zip5.5 识别结果顺序乱、漏行现象一张两栏排版的表格图片识别结果第一行输出左栏第二行跳到右栏来回交叉或长句被断成碎片。原因EasyOCR 的默认排序只做垂直位置聚类不做版面布局分析。两栏文本在同一水平高度时两类文本框会被合并成同一条线于是左栏第一行和右栏第一行抢同一个顺序位置。漏行则往往是文本框检测被断词合并策略吃掉paragraphTrue会把相邻的短线磨合成一段。解决默认paragraphFalse让每个文本框单独返回然后用第三章里的sort_boxes思路先按列分桶再按行排序。表格类图片我会额外按每个文本框中心点x轴的集中程度先聚类成列再逐列输出。这步处理比调模型参数更管用因为问题的根源不在识别而在输出逻辑。6. 把EasyOCR封装成本地HTTP服务接口设计与性能验收业务落地时识别逻辑通常不会直接暴露成Python脚本而是包成一个HTTP接口给前端或调用方用。Flask是最轻的选择启动快、依赖少、适合内网工具类服务。from flask import Flask, request, jsonify import easyocr import os import tempfile app Flask(__name__) reader easyocr.Reader([ch_sim, en], gpuFalse) app.route(/ocr, methods[POST]) def ocr(): f request.files[image] tmp_path os.path.join(tempfile.mkdtemp(), f.filename) f.save(tmp_path) result reader.readtext(tmp_path, detail0, paragraphFalse) return jsonify({texts: result}) if __name__ __main__: app.run(host0.0.0.0, port8000)逻辑说明Reader 在模块加载时创建一次避免每次请求都重新加载模型这是服务性能的关键。接口通过 multipart 表单接收图片返回识别文本列表。host0.0.0.0表示内网其他机器也能访问生产环境建议加一层访问控制。性能验收时我会准备20张与生产环境同源的样张分成清晰印刷体、模糊扫描件、带旋转三类分别统计单张耗时和准确率。CPU下清晰印刷体单张应该在1到2秒内模糊件不超过5秒准确率用“完全正确文本行数/总文本行数”计算90%以上是合格线。现在我接每个OCR需求都会先挑10张最脏的图跑一遍最小脚本确认语言模型和权重路径没问题再谈参数和部署细节这个小习惯帮我避开了很多交付最后一刻才发现模型加载错了的尴尬。希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
Flavia叶片分类实战:从特征工程到CAM可视化的完整教学闭环 简介:本资源是一套面向高校人工智能与计算机相关专业学生的Flavia叶片图像分类实践项目,融合传统机器学习与深度学习双路径方案,适用于课程设计、毕业设计及入门级科研实践。压缩包共12个文件,含9个Python源码(覆盖Ale… · 2026/9/26 13:17:08
还在背“用户故事”?豆包PM笔试已「超纲」!用TaoToken统一Key拆解Agent设计的真正门槛 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 13:17:08
护网行动蓝队实战手册:红蓝对抗与应急响应全攻略 1. 护网行动到底是一场什么样的“考试”先聊清楚一个基本概念:护网行动本质上是一场国家级别的实战化网络安全攻防演习,由监管方组织,邀请专业攻击团队(红队)对参与防守的企事业单位(蓝队)发起近… · 2026/9/26 13:17:08
宏翔上位机3.5实战:从CAN调试到ECU刷写完整指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 13:55:34
ESP32 NVS数据隔离四层防线:防串门、防覆盖、防崩溃 1. 为什么“多个小应用共用一块 Flash”会出事?——从 NVS 的物理本质讲起你手头有块 ESP32,上面跑着温控模块、OTA 升级服务、蓝牙配网 UI、还有个本地日志缓存器——四个独立功能模块,各自都要存点东西:温控的校准系数、OTA 的固… · 2026/9/26 13:55:21
Claude Code模板实战:从提示词工程到AI编程规范化 第一次看到 claude-code-templates 这个项目名,我的第一反应是:模板?代码生成不是现场发挥吗?等自己实际搭过一遍才发现,模板这套东西不是“把提示词存起来”这么简单。它解决的是我长期以来的一个真实痛点ÿ… · 2026/9/26 13:55:14
UWB不止定位:用SR1120构建低功耗高速短距数据链路 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 13:55:08
Playwright连接本地Chrome:CDP模式实战指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 13:55:02
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍 简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践 一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46