news 2026/9/19 1:45:35

目标检测评价指标从Acc到mAP实战解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
目标检测评价指标从Acc到mAP实战解析

1. 为什么目标检测模型的评价指标不能只看准确率?——从Acc到mAP的实战认知升级

刚入行做目标检测时,我犯过一个典型错误:把分类任务那套思维直接搬过来,盯着Accuracy猛看。模型在验证集上Acc达到92%,我兴冲冲交差,结果上线后漏检了30%的行人,误报一堆电线杆当车辆——客户当场打电话质问:“你们的‘准确率’到底准在哪?”这件事让我彻底明白:目标检测不是分类,它解决的是“哪里有、是什么、有多准”三个嵌套问题。Acc(准确率)在这里几乎失效,因为它把图像级正确/错误粗暴二分,完全无视定位偏差、类别混淆和漏检误检的结构性差异。真正决定模型能否落地的,是Precision(查准率)、Recall(查全率)、AP(平均精度)、mAP(各类别AP均值)这一整套指标体系,而RoI(Region of Interest)则是所有这些指标计算的物理基础——没有RoI框的坐标和置信度,后面所有指标都无从谈起。本文不讲教科书定义,而是以一个真实工业质检场景为例:用YOLOv8检测PCB板上的焊点缺陷(虚焊、短路、漏焊三类),从数据标注、预测输出、指标计算到结果解读,手把手拆解每个指标背后的数学逻辑、工程陷阱和业务含义。你会看到,为什么Recall=0.85意味着每100个真实缺陷里漏掉15个,为什么AP曲线下的面积比单点Precision更有说服力,为什么mAP@0.5和mAP@0.5:0.95相差12个百分点就足以决定产线是否停机。这些不是理论游戏,而是每天在模型迭代日志里跳动的数字,直接关联着良品率、返工成本和客户投诉率。

2. 核心指标逐层解构:从单点统计到分布评估的范式转移

2.1 Acc为何在目标检测中成为“危险的幻觉”?

Accuracy的计算公式是(TP+TN)/(TP+TN+FP+FN),表面看很直观。但在目标检测中,TN(真负样本)的定义极其模糊——一张图里没出现目标的区域成千上万,难道每个背景像素都要算作TN?实际工程中,我们根本不会去统计背景像素数,因为这会导致Acc虚高。举个极端例子:一张1024×1024的图,只有左上角10×10像素有个缺陷,其余全是背景。模型预测全图无缺陷,Acc会接近99.99%,但业务价值为零。更致命的是,Acc无法区分定位错误和分类错误。比如真实框在(100,100,120,120),模型预测(150,150,170,170),IoU=0.02,这属于严重定位失败,但Acc只关心“是否预测为正类”,完全忽略空间偏差。我在某汽车零部件厂部署时,发现模型Acc稳定在89%,但现场抽检发现漏检率高达22%——因为Acc把大量低置信度的背景预测当作TN计入分母,掩盖了关键缺陷的漏检。所以,目标检测的第一条铁律是:永远不要用Acc作为核心评估指标,它只适合二分类或单目标定位的极简场景。当你看到报告里只提Acc,就要立刻追问:它的TN是怎么定义的?是否包含背景区域采样?否则这个数字毫无意义。

2.2 Precision与Recall:业务需求驱动的双刃剑平衡

Precision(查准率)= TP / (TP + FP),回答“我预测出来的目标里,有多少是真的?”;Recall(查全率)= TP / (TP + FN),回答“所有真实目标里,我找到了多少?”这两个指标天然矛盾:提高阈值减少FP会提升Precision但降低Recall;降低阈值增加召回会提升Recall但引入FP拉低Precision。在PCB质检场景中,业务方明确要求:漏检(FN)比误报(FP)更不可接受——漏检一个虚焊可能导致整块电路板失效,而误报只是多花10秒人工复核。因此Recall权重更高,我们设定Recall≥0.95为硬性门槛,再在此基础上优化Precision。计算时需注意:TP/FP/FN的判定依赖IoU阈值。COCO标准用IoU≥0.5,但工业场景常需更严苛标准。比如芯片引脚检测,要求IoU≥0.7才计为TP,因为0.5的偏移可能覆盖相邻引脚导致误判。实测发现,同一模型在IoU=0.5时Recall=0.92,在IoU=0.7时骤降至0.76——这意味着近四分之一的真实缺陷因定位不够精准被判定为FN。所以,Precision和Recall不是固定值,而是IoU阈值的函数。你在报告里看到的P/R值,必须注明对应的IoU阈值,否则不具备可比性。另外,单点P/R容易误导。比如模型在高置信度区间Precision=0.98但Recall=0.4,低置信度区间Precision=0.6但Recall=0.95,单纯取某个阈值的结果无法反映整体能力。这就引出了AP——对整个置信度范围的综合评估。

2.3 AP:从单点到曲线的精度分布量化

AP(Average Precision)的本质是Precision-Recall曲线下的面积。计算步骤如下:

  1. 将所有预测框按置信度降序排列;
  2. 对每个预测框,计算当前累计TP、FP,得到对应Recall和Precision;
  3. 绘制P-R曲线(Recall为横轴,Precision为纵轴);
  4. 计算曲线下面积,即AP。

关键细节在于插值处理。COCO采用11点插值法:在Recall∈[0,0.1,0.2,...,1.0]共11个点,取每个点右侧所有Precision的最大值作为该点Precision,再求平均。而PASCAL VOC用所有Recall点插值。我推荐用COCO标准,因其更鲁棒。以焊点检测为例,某次训练后,模型在“虚焊”类别上的P-R曲线显示:Recall=0.8时Precision=0.91,Recall=0.9时Precision=0.73,Recall=1.0时Precision=0.45。若只看Recall=0.8的单点,会误判模型很强;但AP=0.78(曲线下面积)揭示了高召回时精度断崖式下跌的问题——这提示我们需要加强小目标或模糊缺陷的特征学习。AP的优势在于:它压缩了整个置信度维度的信息,一个数值就能反映模型在不同严格程度下的综合表现。但AP仍局限于单类别,而真实场景总有多个缺陷类型,这就需要mAP。

2.4 mAP:跨类别公平比较的黄金标尺

mAP(mean Average Precision)是所有类别AP的算术平均值。COCO标准定义了mAP@0.5(IoU阈值0.5)、mAP@0.75(IoU阈值0.75)和mAP@0.5:0.95(IoU从0.5到0.95步长0.05的10个阈值下AP的平均值)。这三个指标意义迥异:

  • mAP@0.5:宽松定位要求,适合大目标或初步筛选;
  • mAP@0.75:中等严格度,反映主流业务需求;
  • mAP@0.5:0.95:严苛定位要求,体现模型对边界精度的掌控力。

在PCB项目中,mAP@0.5=0.82,mAP@0.75=0.65,mAP@0.5:0.95=0.58。差距达24个百分点,说明模型在高精度定位上存在明显短板。进一步分析发现,“短路”缺陷因形态细长,预测框易偏移,其AP@0.75仅0.41,拖累整体mAP。这直接指导我们调整损失函数:增加GIoU Loss权重,并在数据增强中加入更多旋转和形变,迫使模型学习更鲁棒的定位能力。值得注意的是,mAP不是简单平均,而是先算各类别AP再平均,避免样本不均衡影响。比如“漏焊”样本占70%,若直接用宏平均(macro-average)会过度偏向该类,而mAP的类别平均保证了每类缺陷的评估权重相同——这对质量管控至关重要,毕竟漏检一个稀有缺陷可能比漏检十个常见缺陷更致命。

2.5 RoI:所有指标的物理锚点与计算基石

RoI(Region of Interest)是目标检测的起点和终点。它不是一个抽象概念,而是模型输出的具体坐标:[x_min, y_min, x_max, y_max, confidence, class_id]。所有指标计算都基于RoI与真实框(Ground Truth)的匹配关系。这里有两个关键陷阱:
第一,RoI的坐标系必须与标注一致。曾遇到一个案例:标注工具用(x,y,w,h)中心点格式,而模型输出是(x1,y1,x2,y2)左上右下格式,未做转换直接计算IoU,导致所有指标归零。解决方案是统一用COCO格式:[x_min, y_min, width, height],并在加载时强制归一化到[0,1]区间。
第二,RoI的置信度(confidence)不是分类概率,而是“该框包含目标且分类正确的联合概率”。YOLO系列中,confidence = Pr(Object) × Pr(Class|Object),而Faster R-CNN中,confidence来自RPN的objectness score与分类score的乘积。理解这一点才能正确排序RoI——必须按confidence降序,而非分类score。我在调试时发现,某次模型分类score很高但confidence很低,因RPN认为该区域大概率无目标,导致高置信度预测被截断。最终通过调整RPN anchor尺寸,使confidence分布更合理。RoI的质量直接决定指标可信度:坐标不准,Precision虚高;置信度失真,AP曲线变形;类别ID错位,mAP完全失效。因此,每次训练后,我必做RoI可视化检查:随机抽100张图,用不同颜色标出GT框、TP预测框、FP预测框、FN漏检框,肉眼验证定位偏差模式——这是比任何数字都可靠的诊断手段。

3. 实操全流程:从预测输出到指标生成的代码级实现

3.1 数据准备与格式标准化:避免“垃圾进,垃圾出”

指标计算的准确性始于数据格式的严格统一。我们采用COCO JSON格式,核心字段包括:

  • images: {id, file_name, width, height}
  • annotations: {id, image_id, category_id, bbox[x,y,w,h], iscrowd}
  • categories: {id, name}

关键细节:bbox必须为浮点数,且w/h>0;iscrowd=0表示单目标,=1表示分割掩码;category_id从1开始(0保留给背景)。曾因iscrowd误设为1,导致AP计算时将密集小目标当作单个实例,Recall虚高15%。预处理脚本必须包含校验:

def validate_bbox(bbox): x, y, w, h = bbox assert w > 0 and h > 0, f"Invalid bbox {bbox}: w or h <=0" assert x >= 0 and y >= 0, f"Invalid bbox {bbox}: x or y <0" assert x + w <= img_width and y + h <= img_height, f"bbox out of image"

对于自建数据集,我开发了一个自动校验工具:遍历所有标注,检查bbox是否超出图像边界、是否存在重复ID、类别名称是否匹配。运行一次耗时2分钟,却避免了后续数天的指标调试。另外,图像尺寸必须记录准确。某次用OpenCV读图后未获取原始尺寸,而是用resize后的尺寸计算IoU,导致所有指标系统性偏低——因为bbox坐标未随图像缩放同步变换。解决方案:在数据加载器中,始终保存原始宽高,并在预测前做精确缩放(保持长宽比,padding至网络输入尺寸),预测后用仿射变换矩阵将RoI坐标映射回原图。

3.2 模型预测与RoI提取:确保输出符合指标计算规范

以YOLOv8为例,预测代码需严格遵循指标计算要求:

from ultralytics import YOLO model = YOLO('yolov8n.pt') results = model.predict(source='test_images/', conf=0.001, iou=0.7, verbose=False) # 关键参数:conf=0.001(保留所有预测,避免阈值截断影响AP计算) # iou=0.7(NMS阈值,与指标IoU阈值分离,防止NMS过度抑制) for result in results: boxes = result.boxes.xyxy.cpu().numpy() # [x1,y1,x2,y2] confs = result.boxes.conf.cpu().numpy() # 置信度 classes = result.boxes.cls.cpu().numpy() # 类别ID # 转换为COCO格式bbox:[x,y,w,h] coco_boxes = [] for box in boxes: x1, y1, x2, y2 = box coco_boxes.append([x1, y1, x2-x1, y2-y1])

这里conf=0.001是关键——AP计算需要全量预测框,而非业务部署时的高阈值过滤。NMS的iou参数(非指标IoU)设为0.7,平衡去重与保留多样性。若设为0.5,小目标易被大目标抑制;设为0.9,则冗余框过多增加计算负担。实测表明0.7是多数场景最优值。另外,必须确保classes是整数ID,而非字符串名称,否则匹配GT时出错。我封装了一个predict_to_coco函数,自动完成坐标转换、ID映射、置信度提取,输出字典列表:[{'image_id':1, 'bbox':[...], 'score':0.92, 'category_id':2}, ...]。这个输出格式直接喂给COCO API,零兼容性问题。

3.3 指标计算核心:COCO API的深度定制化使用

官方COCO API(pycocotools)是行业标准,但默认配置需调整:

from pycocotools.coco import COCO from pycocotools.cocoeval import COCOeval # 加载GT和预测 coco_gt = COCO('annotations.json') coco_dt = coco_gt.loadRes('predictions.json') # predictions.json格式同COCO # 创建评估器 coco_eval = COCOeval(coco_gt, coco_dt, 'bbox') # 关键定制:设置IoU阈值范围 coco_eval.params.iouThrs = np.linspace(0.5, 0.95, int(np.round((0.95 - 0.5) / 0.05)) + 1) coco_eval.params.recThrs = np.linspace(0.0, 1.00, int(np.round((1.00 - 0.0) / 0.01)) + 1) coco_eval.params.maxDets = [1, 10, 100] # 最大检测数,影响Recall上限 coco_eval.evaluate() coco_eval.accumulate() coco_eval.summarize()

summarize()输出的标准结果中,AP即mAP@0.5:0.95,AP50是mAP@0.5,AP75是mAP@0.75。但业务需要更细粒度分析,我扩展了summarize方法:

def custom_summarize(coco_eval): # 按类别输出AP for idx, cat_id in enumerate(coco_eval.params.catIds): cat_name = coco_gt.loadCats(cat_id)[0]['name'] ap = coco_eval.eval['precision'][0, :, idx, 0, 2].mean() # IoU=0.5:0.95, area=all, maxDets=100 print(f"{cat_name}: AP={ap:.3f}") # 输出各IoU阈值下的mAP for i, iou in enumerate(coco_eval.params.iouThrs): mAP_iou = coco_eval.eval['precision'][i, :, :, 0, 2].mean() print(f"IoU={iou:.2f}: mAP={mAP_iou:.3f}") custom_summarize(coco_eval)

这样能快速定位问题类别(如“短路”AP仅0.41)和敏感IoU区间(如IoU=0.8时mAP骤降)。另外,COCO API默认忽略小目标(area<1024),但PCB缺陷常小于100像素,需修改params.areaRng

coco_eval.params.areaRng = [[0 ** 2, 1e5 ** 2]] # 取消面积限制

3.4 可视化与诊断:让指标“说话”的三重验证法

数字指标必须与视觉证据互证。我建立三重验证流程:
第一重:PR曲线动态绘制

import matplotlib.pyplot as plt precisions = coco_eval.eval['precision'][0, :, 0, 0, 2] # IoU=0.5, all areas, maxDets=100 recalls = coco_eval.params.recThrs plt.plot(recalls, precisions, label=f'AP={precisions.mean():.3f}') plt.xlabel('Recall') plt.ylabel('Precision') plt.title('Precision-Recall Curve') plt.legend() plt.grid(True) plt.show()

曲线形状暴露模型弱点:若在Recall>0.8后Precision陡降,说明高召回时噪声激增;若整体偏低但平缓,说明置信度校准不足。

第二重:FP/FN案例库构建
自动提取Top-10 FP(高置信度误报)和Top-10 FN(高置信度漏检),生成HTML报告:

<div class="case"> <h3>FP Case #1 (Conf=0.92)</h3> <img src="fp_1.jpg" width="300"> <p>预测框(红)覆盖正常焊点,GT(绿)无标注。原因:训练数据中缺乏类似纹理。</p> </div>

每周更新此库,驱动数据增强策略——针对FP案例添加对抗样本,针对FN案例补充困难样本。

第三重:RoI分布热力图
用OpenCV绘制预测框中心点热力图:

heatmap = np.zeros((height, width)) for box in rois: cx = int((box[0] + box[2]) / 2) cy = int((box[1] + box[3]) / 2) cv2.circle(heatmap, (cx, cy), 3, 1, -1) cv2.imwrite('roi_heatmap.png', heatmap * 255)

若热力图集中在图像边缘,说明模型偏好检测边缘目标,需检查数据增强中的随机裁剪比例。

4. 常见问题与避坑指南:那些文档里不会写的血泪教训

4.1 “Accuracy和Recall值相同”背后的坐标系灾难

某次客户反馈“Acc和Recall都是0.85,但漏检严重”。排查发现,标注工具导出的bbox是[y_min, x_min, y_max, x_max](TensorFlow格式),而模型输入期望[x_min, y_min, x_max, y_max](PyTorch格式)。坐标轴颠倒导致所有IoU计算错误——本应0.2的IoU被算成0.8,大量FN被误判为TP,Recall虚高。Acc巧合相同纯属偶然。解决方案:在数据加载器首行加断言

assert bbox[0] < bbox[2] and bbox[1] < bbox[3], "BBox coordinates swapped!"

并用cv2.rectangle在原图上画框验证:若框歪斜或位置诡异,立即停机检查坐标系。

4.2 mAP突降20%的“幽灵bug”:标签文件编码陷阱

模型迭代中mAP从0.65暴跌至0.45,所有超参未变。最终发现标注JSON文件用GBK编码保存,而Python默认UTF-8读取,导致中文类别名(如“虚焊”)解析为乱码,category_id映射错误。GT和预测的类别ID完全错位,AP计算失效。血泪教训:所有JSON文件强制UTF-8编码,并在读取时显式声明

with open('annotations.json', 'r', encoding='utf-8') as f: data = json.load(f)

同时,在类别映射字典中加入ID校验:

gt_cats = set([ann['category_id'] for ann in annotations]) pred_cats = set([pred['category_id'] for pred in predictions]) assert gt_cats == pred_cats, f"Category ID mismatch: GT{gt_cats} vs Pred{pred_cats}"

4.3 AP计算“卡死”问题:内存爆炸的终极解法

处理10万张图时,COCO API accumulate阶段内存飙升至32GB并卡死。根源在于eval['precision']数组维度为[10,101,80,4,3](IoU×Recall×Categories×Area×MaxDets),占用约15GB。高效解法:分批评估

batch_size = 1000 for i in range(0, len(image_ids), batch_size): batch_ids = image_ids[i:i+batch_size] # 过滤GT和预测中仅含batch_ids的样本 batch_gt = filter_annotations(coco_gt, batch_ids) batch_dt = filter_annotations(coco_dt, batch_ids) # 单独评估批次 batch_eval = COCOeval(batch_gt, batch_dt, 'bbox') batch_eval.evaluate() batch_eval.accumulate() # 合并结果(需自定义合并逻辑,略)

或改用轻量级实现:torchvision.ops.box_iou+ 手写AP计算,内存占用降至2GB内。

4.4 “企业AP”误区:把无线网络术语混入计算机视觉

网络热词中“企业AP”指无线接入点(Access Point),与目标检测的Average Precision(AP)完全无关。曾有客户工程师坚持要求“提升企业AP性能”,沟通半天才发现是术语混淆。专业沟通铁律:首次提及AP必须全称+括号注释:“AP(Average Precision,平均精度)”,并在文档中建立术语表。同样,“RoI”在视觉中是Region of Interest,在金融中是Return on Investment,必须根据上下文明确界定。

4.5 mAP@0.5:0.95的“虚假繁荣”:IoU阈值选择的业务真相

COCO的mAP@0.5:0.95被奉为金标准,但工业场景常不适用。某次半导体检测项目,客户要求定位误差≤5μm,而图像分辨率为1μm/pixel,即IoU阈值需≥0.9。此时mAP@0.5:0.95=0.62,但mAP@0.9=0.28,后者才是真实业务指标。务实做法:根据业务允许的最大定位误差反推IoU阈值

允许误差d像素,目标框尺寸w×h → 最小IoU = (w-d)*(h-d)/(w*h) 例:w=h=20px, d=2px → IoU_min = 18*18/(20*20) = 0.81

然后报告mAP@0.81,而非盲目追求COCO标准。这虽降低“纸面分数”,却赢得客户信任。

5. 指标之外:如何用评价体系驱动模型持续进化

5.1 从指标数字到改进路径:构建闭环优化工作流

指标不是终点,而是诊断起点。我建立“指标-根因-行动”闭环:

  • mAP@0.5下降→ 检查Recall是否同步下降 → 若是,增强数据多样性(添加新场景图像);若否,检查Precision是否下降 → 分析FP案例,针对性添加难例样本。
  • AP曲线Recall=0.9处Precision骤降→ 表明高召回时噪声多 → 增加Focal Loss权重,或调整NMS阈值。
  • 某类别AP显著低于均值→ 提取该类GT框尺寸分布 → 若多为小目标,增加PANet结构或调整anchor尺寸。

在PCB项目中,通过此闭环,将“短路”类别AP从0.41提升至0.79:先发现其GT框平均尺寸仅12×3像素(远小于其他类别),于是修改YOLOv8的anchor配置,新增10×3的细长anchor;再发现FP多为铜箔反光,于是数据增强中加入Specular Augmentation;最后微调分类头学习率。三次迭代,AP提升38个百分点。

5.2 业务指标对齐:让技术语言翻译成商业价值

技术指标必须映射到业务KPI。在质检场景中:

  • Recall≥0.95 → 漏检率≤5% → 年返工成本降低XX万元
  • Precision≥0.85 → 误报率≤15% → 人工复核时间减少XX小时/天
  • mAP@0.75提升0.1 → 客户投诉率下降X%

我制作“指标-业务”对照表,向非技术决策者展示:

技术指标业务影响测量方式
Recall每提升0.01每万片PCB少漏检100个缺陷产线抽检报告
Precision每提升0.01每天节省2.3小时人工复核工时记录系统

这避免了“技术人聊AP,业务人聊成本”的沟通鸿沟。

5.3 持续监控:部署后指标漂移的预警机制

模型上线后,指标会随数据分布变化而漂移。我部署轻量级监控:

  • 每日抽取100张新产线图像,用线上模型预测;
  • 计算当日mAP@0.5(快速评估);
  • 若连续3天mAP下降>0.02,触发告警;
  • 自动分析漂移根因:对比新旧数据集的bbox尺寸分布、类别比例、图像亮度直方图。

某次告警发现新图像平均亮度降低20%,导致模型对暗区缺陷检出率下降。及时加入自动白平衡模块,避免了批量漏检事故。

最后分享一个真实体会:在目标检测领域,最昂贵的不是GPU算力,而是错误指标导向下的无效迭代。我见过团队花三个月优化Acc,结果上线后召回不足;也见过执着于mAP@0.5:0.95而忽略业务IoU阈值,导致客户拒收。真正的专业,是理解每个数字背后的物理意义、业务约束和工程代价。当你能指着AP曲线说“这里陡降是因为小目标特征丢失”,能对着mAP差异解释“这0.12的差距意味着每天多检出17个致命缺陷”,你才算真正驾驭了这套评价体系。指标不是冰冷的数字,而是模型与现实世界对话的语言——听懂它,才能让AI真正解决问题。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/19 5:21:01

ERP、PLM、MES、WMS系统集成:制造企业数据主权与架构落地方案

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

作者头像 李华
网站建设 2026/9/19 5:17:35

PTA天梯赛L2“冰岛人”题解:五代祖先判定与输出逻辑详解

先说我第一次看到“冰岛人”这三个字的反应&#xff1a;这怕不是一道历史文化题&#xff1f;等我把题面读完才发现&#xff0c;这是 PTA 天梯赛里一道非常典型的 25 分 L2 题&#xff0c;考点不是冰岛历史&#xff0c;而是“你能不能把一段模糊的自然语言规则&#xff0c;翻译成…

作者头像 李华
网站建设 2026/9/19 5:10:42

数据库课程设计实战:银行管理系统表结构与CRecordSet访问解析

简介&#xff1a;《数据库课程设计报告银行管理系统》是一份面向高校学生的数据库课程设计报告&#xff0c;适合作为计算机、软件工程专业完成银行管理类题目的参考资料。文档基于 Visual C 6.0 与 SQL Server&#xff0c;围绕储户、活期存取款、定期存取款等核心数据表展开&am…

作者头像 李华
网站建设 2026/9/19 5:13:14

在 Baseten 上跑 Grounded Inference,TaoToken 端点与 Key 分开管

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

作者头像 李华
网站建设 2026/9/19 5:23:40

5代i3老本实测Windows11 26H2:CPU内存占用与任务栏自定义

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

作者头像 李华
网站建设 2026/9/19 5:24:28

期刊会议投稿

正在投稿 已完成投稿 Accept Discover Computing 中科院三区&#xff0c;CCF类C&#xff0c;Open Access&#xff0c;影响因子还没有出&#xff0c;希望今年暴涨 Formerly Information Retrieval Journal (2023 Impact Factor: 1.7), Discover Computing is expected to re…

作者头像 李华