新闻详情

新闻详情

首页 / 资讯中心 / 详情

COCO JSON轨道缺陷数据集转YOLO训练全流程与避坑指南

发布时间:2026/9/28 1:49:06来源:尧图网络
COCO JSON轨道缺陷数据集转YOLO训练全流程与避坑指南
简介这份铁路轨道缺陷数据集面向计算机视觉算法工程师、科研人员及轨道巡检智能化项目团队提供4278张原始轨道图像及配套COCO格式标注可用于训练裂缝、间隙等缺陷识别模型解决真实轨道场景下缺陷样本匮乏、标注不统一等问题。压缩包约272MB共2000个文件以1997张JPG图像为主另含3个JSON标注文件标注严格遵循COCO格式可直接对接YOLO、MMDetection、Detectron2等主流检测与分割框架省去格式转换步骤。文件组织有序便于按需划分训练集与验证集。目前已有1366人学习浏览。读者可获得完整的图像与标注配套数据图片涵盖不同光照、角度与轨道类型既可用于目标检测、实例分割等模型训练也适合进行缺陷定位、分类与严重度评估等算法验证为轨道交通运维智能化提供高质量数据支撑。1. 铁路轨道缺陷数据集4278张COCO JSON标注图能支撑起什么样的缺陷检测拿到一份标注好的铁路轨道缺陷数据集4278张原始图片COCO JSON格式的标注可识别裂缝和间隙缺陷看起来下一步就该直接丢进目标检测模型里训练了。真正做过缺陷检测工程的人心里都清楚数据集的价值不在张数而在标注质量框是否贴边、坐标是否越界、类别是否均衡、JSON 能不能被标准库一次读进来。这几个关口只要有一个出问题后面所有训练都是白费。这篇笔记就用一线实操的角度从打开 COCO JSON 开始把数据读取、可视化验证、格式转换、训练前的避坑排查和最小训练闭环完整走一遍。适合正在做裂缝检测、钢轨表面缺陷检测、工业质检的工程师参考也适合刚接触 COCO 标注的新手照着落地。2. 用COCO规范读轨道缺陷数据images、annotations、categories三段怎么拆2.1 为什么缺陷检测数据集普遍用COCO JSON而不是VOC或YOLO txt工业缺陷检测的数据集标注格式业内基本绕不开三种PASCAL VOC 的 XML、YOLO 的 txt、COCO 的 JSON。这三个格式都能描述目标框但 COCO JSON 有一个明显优势它用单个 JSON 文件同时装下图片元信息、多类别映射、目标框和分割多边形不像 VOC 那样一张图对应一个 XML也不像 YOLO txt 那样丢了图片尺寸信息。轨道缺陷数据集的裂缝和间隙缺陷本质上就是“两个类别、若干个框”的事COCO 的 bbox 字段足够表达如果后续想从检测升级到实例分割同一个 JSON 里的 segmentation 多边形也能直接复用不需要重新标一遍。另一个原因是工具链兼容性。拿到一个陌生数据集团队第一件做的事往往是打开标注可视化看一眼。用 CVAT 或 LabelImg 这类标注工具打开 COCO JSON 都有现成入口也可以用脚本十几行读出来。相比之下YOLO txt 缺少图片元数据VOC XML 要逐个文件解析在“先验数据质量”这个环节都显得别扭。所以数据集就算原生不是 COCO很多人也会先转成 COCO JSON 再做检查转换后再分发到检测或分割训练流程。2.2 读懂标注文件bbox、area、segmentation哪些先读哪些可以先放着COCO JSON 的顶层结构是一个字典包含 info、licenses、images、annotations、categories 五个键。缺陷检测项目里真正要关心的是后面三个。images 数组里每个元素描述一张原始图片核心字段是 id、file_name、width、height。轨道图片通常拍出来分辨率较大动辄两三千像素以上训练时基本不会整图直接喂要么缩放要么切片所以 images 里的宽高是后续坐标换算的唯一依据。很多格式转换脚本跑出越界框就是因为把数组长度或别的字段当成了图片尺寸。annotations 数组里每个元素描述一个目标框核心字段有三个image_id 用来关联到 images 里的某张图category_id 用来关联到 categoriesbbox 则是 [x, y, width, height] 格式的列表。除此之外还有 area、iscrowd、segmentation。这里有个实操判断标准如果最终模型是 YOLO 这类检测器只需要 bbox 和 category_idarea 与 segmentation 可以直接忽略如果后面要跑分割模型再去解析 segmentation 多边形也不迟。iscrowd 字段在缺陷数据里通常都是 0若某个标注把成片裂缝区域标成 crowd转换时要单独处理。categories 数组通常只有两条每条包含 id、name、supercategory。裂缝和间隙各占一个 id。注意 id 不一定从 0 开始常见的是从 1 开始而 YOLO 要求类别从 0 开始转换时要做一次偏移。2.3 用Python把COCO JSON读进内存类别分布、图片尺寸、孤立标注一次查清刚开始接触这套数据时第一件事不是训练而是把标注文件读进内存做基础体检。脚本如下import json from collections import Counter with open(annotations/instances_train.json, r, encodingutf-8) as f: coco json.load(f) print(images 数量:, len(coco[images])) print(annotations 数量:, len(coco[annotations])) print(categories 数量:, len(coco[categories])) # 建立类别 id 到名称的映射方便看输出 cat_id2name {c[id]: c[name] for c in coco[categories]} # 统计每个类别有多少个标注框 cat_cnt Counter(a[category_id] for a in coco[annotations]) for cid, cnt in sorted(cat_cnt.items(), keylambda x: -x[1]): print(f类别 {cat_id2name.get(cid, unknown)} (id{cid}): {cnt} 个框) # 统计图片尺寸是否一致不一致时后续resize策略不同 img_size_cnt Counter((im[width], im[height]) for im in coco[images]) print(图片尺寸分布(前5):, img_size_cnt.most_common(5)) # 检查标注是否指向不存在的图片 img_ids {im[id] for im in coco[images]} ann_img_ids {a[image_id] for a in coco[annotations]} print(标注指向不存在的图片数量:, len(ann_img_ids - img_ids)) # 检查哪些图片没有任何标注 empty_img_ids [im[id] for im in coco[images] if im[id] not in ann_img_ids] print(有图但无标注的图片数:, len(empty_img_ids))逻辑说明json.load 一次读入整个文件4278 张图的标注文件通常在几 MB 到几十 MB内存没有压力。如果以后遇到上百 MB 的超大标注 JSON再考虑 ijson 流式解析。Counter 统计每个类别的框数能立刻看出两类缺陷样本是否严重失衡。图片尺寸分布这一步很多人跳过但轨道图片若来源不同宽高可能不一致归一化坐标虽然不受影响resize 策略却要明确。最后两个检查用来找孤立标注和空标注图片。参数说明open 使用 encodingutf-8 是常规操作若文件带 UTF-8 BOMjson.load 会直接报错需要改成 utf-8-sig。Counter 来自 collections 标准库不需要额外安装。这里输出的类别框数只是初步印象具体是否平衡还要结合每类缺陷的难易程度判断不能单看数量。3. 把标注框画回原图验证裂缝和间隙标得准不准3.1 坐标换算COCO 的 xywh 转画框用的 xyxyCOCO 的 bbox 是 [x, y, width, height]x、y 是目标框左上角坐标width、height 是框的宽高。OpenCV 画矩形需要左上角和右下角两个点也就是 xyxy 格式换算公式很简单x1 xy1 yx2 x width - 1y2 y height - 1这里减 1 是因为像素坐标是闭区间。width 为 10 的框最后一个像素下标是 x 9不是 x 10。画图时差 1 像素看不出问题但后面转 YOLO 归一化坐标时如果分母用 width 而不是 width - 1框会有轻微偏移对裂缝这种只有几个像素宽的小目标影响明显。归一化到 0 到 1 的换算也要同时掌握YOLO 训练脚本用的是这个cx (x width / 2) / img_widthcy (y height / 2) / img_heightw width / img_widthh height / img_height分子必须是中心坐标而不是左上角坐标这是最容易写错的地方。3.2 批量可视化标注用OpenCV把框画回到轨道原图统计数字不能代替眼睛判断。画框可视化是数据检查里最有价值的一步特别是轨道裂缝这类细长缺陷一个框是贴着裂缝边缘还是把整个枕木框进去只有肉眼能判断。脚本如下import json import cv2 JSON_PATH annotations/instances_train.json IMG_DIR images with open(JSON_PATH, r, encodingutf-8) as f: coco json.load(f) img_map {im[id]: im for im in coco[images]} cat_name {c[id]: c[name] for c in coco[categories]} # 每个类别一种颜色裂缝和间隙用不同颜色区分 cat_color {c[id]: (0, 255, 0) for c in coco[categories]} def draw_bboxes_on_image(imgid: int, save_path: str vis.jpg): im img_map[imgid] img_path f{IMG_DIR}/{im[file_name]} img cv2.imread(img_path) if img is None: print(f图片读取失败: {img_path}) return anns [a for a in coco[annotations] if a[image_id] imgid] for a in anns: x, y, w, h a[bbox] x, y, w, h int(x), int(y), int(w), int(h) x2, y2 x w - 1, y h - 1 cv2.rectangle(img, (x, y), (x2, y2), cat_color[a[category_id]], 2) cv2.putText(img, cat_name[a[category_id]], (x, max(0, y - 5)), cv2.FONT_HERSHEY_SIMPLEX, 0.6, cat_color[a[category_id]], 1) cv2.imwrite(save_path, img) # 随机挑几张有标注的图做可视化前5张即可 ann_imgids sorted({a[image_id] for a in coco[annotations]}) for i, imgid in enumerate(ann_imgids[:5]): draw_bboxes_on_image(imgid, fvis_{i}.jpg)逻辑说明先把 image_id 映射到图片对象再把标注按 image_id 分组避免每张图遍历整个 annotations 列表。这里对 bbox 做了 int 强转是为了满足 OpenCV 画图函数的参数类型。如果 JSON 里 bbox 是浮点且宽度小于 1int 之后变成 0框画不出来这种标注要记录下来。参数说明cv2.rectangle 的第三个参数是颜色OpenCV 默认 BGR 通道顺序绿色是 (0, 255, 0)。线宽 2 在 1920 分辨率下够用如果原图是 4000 像素级别的大图建议把线宽和字体调大。putText 的字体大小 0.6 也是针对常见分辨率设置的可视化的目的是挑错不是出版级效果清晰即可。3.3 三个快查量化指标空标注比例、小目标占比、宽高比分布画框只能看局部整体质量还要靠统计指标来兜底。下面这段代码补三个最常用的检查import numpy as np boxes [] for a in coco[annotations]: x, y, w, h a[bbox] boxes.append([w, h, a[category_id]]) boxes np.array(boxes, dtypefloat) total len(boxes) print(标注框总数:, total) # 1) 空标注图片 ann_img_ids {a[image_id] for a in coco[annotations]} empty_cnt len([im for im in coco[images] if im[id] not in ann_img_ids]) print(空标注图片数:, empty_cnt, 占比:, f{empty_cnt / len(coco[images]):.2%}) # 2) 小目标占比最短边小于20像素的框 min_side np.minimum(boxes[:, 0], boxes[:, 1]) if len(boxes) else np.array([]) if len(min_side): small_ratio (min_side 20).mean() print(最短边小于20像素的框占比:, f{small_ratio:.2%}) # 3) 宽高比大于5的比例反映细长目标占比 if len(boxes): wh_ratio np.maximum(boxes[:, 0], boxes[:, 1]) / np.maximum(np.minimum(boxes[:, 0], boxes[:, 1]), 1) thin_ratio (wh_ratio 5).mean() print(宽高比超过5:1的框占比:, f{thin_ratio:.2%})逻辑说明min_side 能快速判断小目标占比裂缝和间隙都属于表面缺陷往往框不大如果最短边小于 20 像素的框比例很高训练时就需要提高输入分辨率。宽高比指标针对裂缝的特殊形态正常裂缝框通常是窄长条宽高比很容易超过 5这个值太低反而说明标注框可能框大了、把旁边无关区域包了进来。数据集中若有大量空标注图片要看是拍摄背景还是严重漏标前者可以当负样本后者必须返工。这个体检做完对数据集能不能用就有了基本判断。如果空标注比例过高或者细长目标占比异常就不用急着进入训练先回到标注环节再说。4. 转成YOLO能吃的格式COCO JSON转txt脚本与train/val划分逻辑4.1 归一化坐标换算把COCO bbox变成YOLO的class cx cy w hYOLO 训练要的标注是 txt 文件每行一个目标格式为 class_id cx cy w h全部归一化到 0 到 1。COCO 的 bbox 是左上角加宽高转换时先求中心坐标再除图片宽高最后按图片 id 写同名 txt 文件。完整脚本如下import os import json with open(annotations/instances_train.json, r, encodingutf-8) as f: coco json.load(f) img_map {im[id]: im for im in coco[images]} # 按 image_id 聚合标注避免逐张图全表扫描 ann_map {} for a in coco[annotations]: ann_map.setdefault(a[image_id], []).append(a) def convert_coco_to_yolo(coco, output_dir): os.makedirs(output_dir, exist_okTrue) for img in coco[images]: img_id img[id] stem os.path.splitext(img[file_name])[0] txt_path os.path.join(output_dir, stem .txt) lines [] for a in ann_map.get(img_id, []): x, y, w, h a[bbox] img_w, img_h img[width], img[height] # 先处理越界框夹紧后过滤掉宽高无效的 x max(0, x) y max(0, y) w min(w, img_w - x) h min(h, img_h - y) if w 0 or h 0: print(f过滤无效框: image_id{img_id}, bbox{a[bbox]}) continue cx x w / 2.0 cy y h / 2.0 cls_id a[category_id] - 1 # COCO类别id转YOLO从0开始 lines.append(f{cls_id} {cx / img_w:.6f} {cy / img_h:.6f} {w / img_w:.6f} {h / img_h:.6f}) with open(txt_path, w, encodingutf-8) as f: f.write(\n.join(lines)) convert_coco_to_yolo(coco, labels/train)逻辑说明脚本里先建 ann_map 聚合标注不然每张图都要把整个 annotations 列表跑一遍4278 张图的规模虽然能扛住但后面做二次处理会越来越慢。归一化坐标保留 6 位小数足够表达 4000 像素图片上的亚像素精度。类别 id 做 -1 偏移是因为 COCO 的 categories id 通常从 1 开始而 YOLO 强制从 0 开始如果数据集里 id 本身从 0 开始这一步就不要减。参数说明越界框的夹紧逻辑很关键x 不能小于 0x w 不能大于 img_w。这部分代码不处理图片为空的情况若图片本身宽高为 0说明 images 字段有问题应回到第 2 章的体检脚本排错。运行完转换后建议抽查几个 txt 文件确认 class_id 只有 0 和 1且所有坐标都在 0 到 1 范围内。4.2 train/val切分别把同一段钢轨的图片拆进两个集合数据划分是训练前最容易被忽略的坑。4278 张轨道图片往往包含同一条线路的连续拍摄帧如果全局随机切分同一个钢轨断面的裂缝可能同时出现在训练集和验证集里验证指标虚高测出来的 mAP 不代表真实泛化能力。正确做法是按采集段落或文件名前缀分组。假设文件名包含拍摄段编码比如段 A 的图片叫 sec1_0001.jpg段 B 的叫 sec2_0001.jpg划分时按前缀聚合后再切分import os import random from collections import defaultdict train_ratio 0.85 random.seed(42) # 按文件名前缀分组 groups defaultdict(list) for im in coco[images]: prefix os.path.basename(im[file_name]).split(_)[0] groups[prefix].append(im[id]) group_keys list(groups.keys()) random.shuffle(group_keys) split_idx int(len(group_keys) * train_ratio) train_groups group_keys[:split_idx] val_groups group_keys[split_idx:] train_img_ids [] for g in train_groups: train_img_ids.extend(groups[g]) val_img_ids [] for g in val_groups: val_img_ids.extend(groups[g]) print(f分组切分: 训练组{len(train_groups)}个, 验证组{len(val_groups)}个) print(f训练图片数: {len(train_img_ids)}, 验证图片数: {len(val_img_ids)})逻辑说明按前缀分组后再洗牌保证任何一条线路段落的图片不会横跨两块数据。如果数据集没有明显文件名前缀就要看原始目录结构通常采集车会按线路或里程分目录直接用目录名分组即可。分组切分会牺牲一部分样本数量但换来的是验证结果更可信。参数说明随机种子固定为 42 是为了复现train_ratio 用 0.85 是缺陷数据集里的常见选择如果某个分组数量特别少可以手动把该分组整组划入训练集避免验证集只有几张图。切分完成后记得把 train_img_ids 对应的 txt 放进 labels/trainval_img_ids 对应的 txt 放进 labels/val目录别混。4.3 增强策略细长裂缝和间隙缺陷的增强参数怎么调数据增强是训练自己的检测模型时最影响结果的部分但增强不是越猛越好。裂缝是细长形目标间隙通常是块状目标二者形态差异大增强策略要分情况。颜色类增强一般可以保留轨道图片的裂缝和间隙在灰度上差异明显HSV 扰动有助于抵御光照变化。几何增强要留意翻转方向轨道表面缺陷沿钢轨方向拉长横向翻转通常安全但上下翻转会让枕木和钢轨的上下文关系颠倒这类场景不一定适用建议 flipud 保持默认 0。马赛克增强对缺陷检测是一把双刃剑。马赛克把四张小图拼成一张大图小目标的标注框在拼接时容易被裁剪掉导致训练时真实目标缺失。我的做法是保留马赛克但降低概率到 0.5 左右同时打开 close_mosaic让最后若干个 epoch 关闭马赛克让模型在真实完整目标上收尾。输入分辨率优先拉高到 1280 而不是堆叠增强轨道裂缝原始标注经常只有几十像素宽低分辨率下这些目标在下采样几轮后直接消失。5. 轨道缺陷数据集避坑排查手册越界坐标、空标注、小目标漏检逐个拆5.1 JSON解析失败截断文件、UTF-8 BOM和非法转义现象是 json.load 抛出 JSONDecodeError报错信息类似 Expecting , delimiter 或 Expecting value行号和字符位置指向文件中间。这类问题在下载数据集时很常见压缩包没完整解压或者有人用文本编辑器手动改过标注文件。原因是多方面的。最常见的是文件截断标注文件没下载全JSON 末尾缺少闭合括号其次是编码问题Windows 下记事本保存成带 BOM 的 UTF-8标准 json.load 不认 BOM 头还有一种是标注工具导出时对路径或类别名里的特殊字符没有正确转义。解决分两步。先用命令行工具做语法检查python -m json.tool annotations/instances_train.json /dev/null如果报错了再看具体位置。带 BOM 的文件open 时改用 encodingutf-8-sig截断文件只能重新下载或用压缩包内的同名文件替换。千万不要手动在报错位置补逗号或括号这种修补通常越补越乱。我的习惯是拿到数据集后先跑一遍语法检查再做任何处理这个习惯帮我避开了很多次“训练到一半才发现标注文件坏了”的返工。5.2 标注越界框的边界超出图片宽度和高度训练loss异常现象是可视化时部分框画到了图外或者转成 YOLO 格式后归一化坐标出现大于 1 的值。训练时 loss 可能一开始就显示 nan尤其在使用自动锚框时越界框会带来病态样本。原因是标注时有版本差异标注人员用的是原图分辨率和尺寸后续处理时图片被压缩或裁剪但标注坐标没有跟着缩放另一种情况是标注框紧贴图片边缘坐标加宽高后刚好超过边界一个像素这类弱越界最隐蔽。解决方式是在转换脚本里做夹紧处理前面 4.1 节的脚本已经包含这段逻辑。夹紧后再用校验脚本排查一遍凡是归一化坐标不在 0 到 1 范围内的行要么修正要么删除。我建议把修正和校验做成两个独立步骤不要只靠转换脚本里的 print 输出训练前专门跑一次全量表检查import os bad_count 0 for txt_file in [labels/train, labels/val]: for root, _, files in os.walk(txt_file): for fn in files: with open(os.path.join(root, fn), r) as f: for line in f: parts line.strip().split() if len(parts) ! 5: bad_count 1 continue vals list(map(float, parts[1:])) if any(v 0 or v 1 for v in vals): bad_count 1 print(异常标注行数:, bad_count)这种现象可能直接导致 val 阶段 mAP 波动明显修完越界框和受污染的标注行之后模型的损失曲线经常明显平稳下来。5.3 空标注图片有图无框的样本该怎么处理现象是数据里有些图片没有任何标注框统计下来占比可能达到 5% 到 15%。很多人第一反应是删除但空标注图片不全是坏数据。轨道巡检过程中拍到大量无缺陷的钢轨表面是正常情况这些图片对模型抑制误检有帮助可以作为负样本继续参与训练。原因是漏标注和真实负样本两种情况混合存在。漏标注意味着明明有裂缝却没框这种图片放进训练集会教会模型对这些区域视而不见真实负样本则是钢轨完好没有框才是正确标注。解决方式取决于数据来源如果空标注图片集中出现在某几个连续目录大概率是漏标建议抽出来人工复查如果分散在数据集中保留并放入训练集即可。验证集里空标注图片要慎重pascal 风格 mAP 对空背景图的预测会产生误报惩罚保留少量看看模型的虚警率是合理的太多会把验证集指标压得很难看。5.4 类别不平衡裂缝框和间隙框数量差距过大时怎么调现象是训练完成后裂缝类 mAP 很高间隙类 mAP 始终上不去。检查标注文件发现两类框数量差距 5 倍以上这在轨道缺陷数据里很常见毕竟裂缝出现频率远高于间隙缺陷。原因是数据本身分布不均衡模型把多数类的特征学得更充分少数类在损失中占比太小。解决方向有几个按优先级排序第一检查标注质量看少数类是否存在大量漏标漏标比类别不平衡更伤模型第二对少数类使用过采样或复制增强常见做法是把包含间隙缺陷的图片复制几份并配不同的颜色扰动、轻微翻转重新写入训练集第三调整损失权重让间隙类的分类损失在总损失里占更高比例具体权重值一般从 1.5 到 3 之间试。切忌用极端复制一个类别的重复样本占比太高训练集等同于被污染模型会对复制样本过拟合。5.5 细长小目标漏检裂缝在低分辨率下直接消失现象是模型在验证集上对裂缝的召回率偏低尤其对细小的发丝状裂缝完全没有输出。这类目标只有十几个像素宽经过检测器的主干网络下采样四到五轮之后特征图上有用的线索所剩无几。原因是分辨率不够而不是模型能力不行。把输入分辨率从 640 提升到 1280 通常能立刻提升裂缝召回代价是显存占用和训练时间成倍增加。解决方式除了拉高分辨率还有两个实用手段。一是切片推理预测时把大图切成 1280 见方、带重叠的块逐块检测后拼回原图坐标裂缝这种小目标在切片里保留的细节远比压缩整图多二是针对细长形态做增强在训练集里对裂缝框做轻微旋转和尺度抖动模拟不同拍摄角度下的形态模型对方向变化的适应性会更好。看起来像玄学实际上是分辨率、增强、推理方式三个变量的综合结果挨个调参记录不要只加 epochs。6. 用YOLOv8做最小可行验证一条命令看数据集值不值得继续投入数据检查和格式转换都做完后用一个最小的 YOLOv8 训练闭环来验证数据集的可用性。常见做法是准备一个 rail_track.yaml 配置文件path: /path/to/rail_track_dataset train: images/train val: images/val names: 0: crack 1: gap注意 names 里的类别顺序必须和前面转换 txt 时的 class_id 一致数字是 0 和 1名称只是显示用。之后跑 YOLOv8 命令行yolo detect train datarail_track.yaml modelyolov8n.pt epochs50 imgsz1280 batch8第一次验证不必追求精度跑 20 到 30 个 epoch 看 loss 是否正常下降、val 指标是否在提升即可。参数上我一般这样配imgsz 优先 1280因为轨道缺陷是小目标密集场景mosaic 从默认值下调到 0.5并打开 close_mosaicbatch 按显存实际调8 到 16 之间看卡的情况。如果跑 20 个 epoch 后 mAP50 完全不动先不要急着堆数据增强回头检查第 3 章的可视化结果——大概率是标注框本身有问题模型没法学。验证完成后还要做一个工作把 val 集上的预测框画回原图挑几类典型错误看。裂缝漏检看是不是框太小间隙误检看是不是把钢轨接缝阴影当成了缺陷。这个步骤是决定数据集是否值得继续投入的关键依据比任何指标都直观。我现在的习惯是拿到任何标注数据集第一件事就是可视化质检确认标注靠谱再谈训练参数。这个习惯帮我挡过很多次无效训练和返工希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

RAG进阶-RAG的十个优化技巧 2026/9/28 4:37:17

RAG进阶-RAG的十个优化技巧

为什么RAG不是算法问题而是工程问题? RAG 进阶:10 个优化技巧RAG 的基础流程并不复杂,真正困难的是让它在真实业务中同时做到:检索准确、上下文完整、生成可信、延迟可控、成本可接受。一、为什么说 RAG 是工程问题? 一…

阅读更多 →
若依-代码学习01 2026/9/28 4:37:17

若依-代码学习01

登录问题解释一下这三行代码AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"))); LoginUser loginUser (LoginUser) authentication.getPrincipal(); recordLoginInfo(log…

阅读更多 →
IT68050深度解析:HDMI 2.0b接收芯片的工程落地关键 2026/9/28 4:37:17

IT68050深度解析:HDMI 2.0b接收芯片的工程落地关键

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Python电影推荐系统毕设实战:协同过滤算法与避坑指南 2026/9/28 4:37:10

Python电影推荐系统毕设实战:协同过滤算法与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
接管已有浏览器:调试端口方案的原理与实战 2026/9/28 4:37:10

接管已有浏览器:调试端口方案的原理与实战

在浏览器自动化、前端逆向、爬虫对抗等场景中,我们经常会遇到一个核心痛点:直接通过 Selenium、Playwright 等工具启动的全新浏览器实例,往往缺少用户登录态、本地缓存、扩展程序,且极易被反爬系统识别。而 “通过调试端口接管已有…

阅读更多 →
【架构专栏】第18章 安全架构设计 2/3 2026/9/28 4:37:10

【架构专栏】第18章 安全架构设计 2/3

架构设计 相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 系统架构设计 相关文章: 【架构专栏】架构考试介绍 【架构专栏】架构知识点 知识总览​ 共19章内容,主要包括: 1)1绪论、2计算…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉