news 2026/6/2 17:23:36

5364张真实通话场景VOC数据集,精准标注手机贴近耳朵时的phone+head联合目标

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
5364张真实通话场景VOC数据集,精准标注手机贴近耳朵时的phone+head联合目标

本文还有配套的精品资源,点击获取

简介:专为检测真实打电话动作构建的数据集,包含5364张JPG图像,每张配一个标准Pascal VOC格式XML标注文件。只定义两个类别:phone(手机)和head(头部),全部由labelImg人工绘制矩形框,共5045个phone框、415个head框。标注严格遵循行为逻辑——仅当手机紧贴耳部处于语音通话状态时才触发联合标注,此时需将手机、耳部所在头部区域及部分持机手部统一纳入同一目标框内;手持未贴耳、刷屏、自拍、视频通话等非通话行为一律不标。不提供YOLO格式txt、分割掩码或预训练模型,也不含权重文件,纯原始标注资源,开箱即可用于YOLOv5/v8/v10等系列模型训练。所有标注经过人工校验,结构规范、可复现,适用于安防监控、车载驾驶行为识别、课堂纪律管理等需要区分‘通话’与‘玩手机’的细分场景。授权说明文档已内置,使用前须阅读确认合规性。

1. 项目概述:为什么“打电话检测”不能只靠识别手机或人脸?

在安防监控、车载DMS(驾驶员状态监测)、智慧课堂等实际落地场景中,一个看似简单的问题长期困扰算法工程师:如何准确区分“正在打电话”和“只是在玩手机”?

我做过三年车载行为识别项目,也参与过两个省级校园智能督导系统的算法支撑。最常被客户指着误报截图问的一句话是:“这人明明在刷微信,怎么系统就报警说他在打电话?”——背后暴露的,不是模型不够深,而是数据定义出了根本性偏差。

传统做法往往走两条路:一是用单目标检测器分别识别“手机”和“人脸”,再靠规则判断距离;二是直接训练一个“打电话”二分类模型,用大量截图做正负样本。前者问题在于,手机离脸30cm可能是看导航,离5cm可能是自拍,规则阈值极难泛化;后者则陷入“正样本污染”——你标注的所谓“打电话”图里,混进了太多低头刷短视频、回消息、甚至戴蓝牙耳机的样本,模型学到的其实是“低头+有手机”,而非“语音通话动作”。

这个5364张图的数据集,恰恰卡在了这个痛点上。它不叫“手机检测数据集”,也不叫“头部姿态数据集”,而明确命名为“真实通话场景VOC数据集”——关键词里的“真实”二字,是它的灵魂。它用最朴素但最硬核的方式定义行为:只有当手机物理接触耳廓区域、声学通道处于激活状态(即人在说话/听筒收音)时,才构成有效标注事件。这个定义绕开了所有中间推理环节,直击行为本质。

更关键的是,它拒绝“拆解式标注”。你不允许单独标一个手机框、再单独标一个头框,然后让模型去学空间关系;它强制要求:phone + head 必须合并为一个联合目标框(joint bounding box),且该框必须覆盖手机本体、耳部所在头部区域、以及部分持机手部(只要手部出现在画面中且与手机有明显接触)。这个设计不是为了增加标注难度,而是为了告诉模型:“打电话”是一个不可分割的动作单元,它的视觉表征天然具有空间耦合性——手机不会悬浮在耳朵旁边,耳朵也不会脱离持机手部独立存在。

所以当你看到数据集中 phone 框有5045个、head 框仅415个时,别惊讶。这不是标注疏漏,而是行为逻辑的自然结果:绝大多数有效通话帧里,手机和头部是重叠/紧邻的,因此被合并标注为一个目标;只有极少数特殊角度(比如侧后方拍摄,手机遮挡了大部分头部,但耳廓仍可见)才会出现独立 head 框。这种极度不平衡的类别分布,恰恰是真实场景的镜像——它逼着模型去学习“耦合结构”的判别能力,而不是泛泛地认手机或认脸。

我实测过,用这个数据集微调YOLOv8s,在某车企DMS实车路测中,“打电话”误报率从原先的23.7%降到5.1%,而召回率反而提升2.3个百分点。原因很简单:模型不再被“手机在手里”这个弱信号干扰,它真正学会了识别“手机-耳部-手部”三者构成的紧凑拓扑结构。这种提升不是靠堆算力,而是靠数据定义的精准性。

2. 标注逻辑深度解析:什么是“phone+head联合框”的物理意义与工程约束?

很多人第一次看到“phone+head联合框”这个说法,下意识会想:“不就是把两个框手动拉大一点,把头和手机都包进去吗?”——这是最大的误解。联合框不是简单的尺寸扩张,而是一套有严格物理依据和工程约束的行为建模方法。下面我结合自己参与过的三次人工标注校验过程,把这套逻辑掰开揉碎讲清楚。

2.1 联合框的触发条件:三个硬性物理阈值

标注并非主观判断,而是基于可测量的物理关系设定三条红线:

  1. 接触阈值(Contact Threshold):手机外壳边缘与耳廓软骨轮廓的距离 ≤ 3mm(在图像像素空间中,按平均分辨率1920×1080换算,约为8~12像素)。注意,这里不是“手机中心到耳朵中心”,而是最短欧氏距离。我们用OpenCV的cv2.pointPolygonTest对耳廓轮廓做距离计算,确保标注员不是凭感觉估测。

  2. 角度阈值(Angle Threshold):手机长边轴线与耳垂至外耳道口连线的夹角 ≤ 15°。这个角度保证手机处于“贴耳接收”姿态,而非斜插在耳边(常见于视频通话)或横置(常见于自拍)。我们开发了一个小工具,导入labelImg后自动显示手机框的主轴方向角和耳部参考线,标注员只需确认角度读数是否达标。

  3. 声学合理性阈值(Acoustic Plausibility):该帧必须来自连续视频片段中声纹能量峰值前后±0.5秒内。这点容易被忽略,但至关重要——我们剔除了所有静音通话(如对方静音、网络延迟导致无声)或纯震动提醒场景。数据集配套提供了原始视频片段的时间戳索引表(非公开),确保每张图都有声学上下文支撑。

只有同时满足这三项,才允许启动联合框绘制。否则,哪怕手机离耳朵很近,也归为“手持未通话”类,不予标注。

2.2 联合框的边界划定:四条不可逾越的几何规则

一旦触发标注,联合框的绘制就进入精密几何阶段。我们给所有标注员发了一份《联合框绘制SOP》,核心是四条铁律:

  • Rule 1:最小包围原则(Minimal Enclosure)
    联合框必须是能同时包含手机完整轮廓、耳廓可见区域(含耳垂、耳屏、对耳轮上脚)、以及与手机有明确接触的手指/手掌区域的最小矩形。不允许为了“看起来整齐”而扩大到肩膀、头发或背景物体。我见过最典型的错误是把整个头部甚至上半身框进去——这直接破坏了模型学习局部耦合特征的能力。

  • Rule 2:耳部优先原则(Ear-First Priority)
    当手机与耳部存在遮挡时(如长发遮耳、戴眼镜架、口罩遮下半脸),联合框必须优先保证耳廓关键点(耳屏尖、耳垂最低点)在框内,手机可适当裁剪(但主体必须≥70%可见),手部可视情况舍弃。理由很实在:在驾驶舱低照度环境下,耳部纹理比手机屏幕反光更稳定,是鲁棒性更高的判别锚点。

  • Rule 3:手部截断原则(Hand Truncation Limit)
    手部仅标注与手机直接接触的部分(通常是拇指、食指、中指根部),严禁延伸至手腕或小臂。我们统计过,有效通话中手部贡献的判别信息集中在接触面5cm²范围内,超出此范围的手部姿态对行为判别无增益,反而引入噪声。标注指南里明确画出了“允许手部区域示意图”,连指甲盖大小都做了像素级标注规范。

  • Rule 4:动态一致性原则(Temporal Consistency)
    同一视频序列中相邻帧的联合框,其宽高比变化率不得超过12%/帧(按25fps计算)。这条规则是为了防止标注员在快速运动场景中“抖动式标注”。我们用Python脚本批量检查了全部5364张图的XML文件,对宽高比突变超过阈值的帧打上“需复核”标签,由资深标注组长二次确认。

提示:这些规则不是纸上谈兵。我们在标注前用200张典型样本做了AB测试——A组按常规方式自由标注,B组严格执行上述四条。最终B组训练出的YOLOv8m模型在跨场景测试集上的mAP@0.5提升了4.8%,尤其在侧脸、逆光、戴帽子等困难case上优势明显。数据质量的提升,永远比模型结构的微调来得直接。

2.3 为什么坚持VOC格式?放弃YOLO txt的深层考量

数据集明确声明“不提供YOLO格式txt”,这常被新手质疑:“现在都用YOLO,为啥不直接给txt?”——这恰恰体现了工程老手的克制。

VOC XML格式强制记录以下关键元信息:
-<xmin><ymin><xmax><ymax>的绝对像素坐标(非归一化),避免不同分辨率图像缩放时的浮点误差累积;
-<name>标签明确区分phone_head_joint类别(注意,不是两个类别!),杜绝模型误学为多标签任务;
-<difficult><truncated>字段虽未启用,但保留了扩展接口,未来加入遮挡、模糊等属性时无需重构数据流;
-<object>结构天然支持后续扩展(如添加<pose>描述手机朝向,<occluded>标记耳部遮挡程度)。

而YOLO txt格式本质是“坐标压缩协议”,它牺牲了语义丰富性来换取加载速度。当我们需要做精细化分析时(比如统计不同手机品牌在联合框中的长宽比分布,或分析耳部在框内的相对位置热力图),XML的结构化优势立刻凸显。我自己写了个解析脚本,10分钟就能生成一份《联合框几何特征分析报告》,里面包含:
- 平均宽高比:1.32 ± 0.18(说明多数通话姿态偏竖直)
- 耳部中心相对框左上角的归一化坐标:(0.42, 0.38) ± (0.07, 0.09)
- 手部区域占联合框面积比:18.3% ± 5.2%

这些洞察,是txt格式永远无法提供的。所以我的建议是:训练时用脚本一键转换为YOLO格式(我后面会给出高效转换代码),但研究、调试、分析时,永远以XML为唯一真相源。

3. 实操指南:从零开始训练YOLOv8模型,附避坑清单与性能调优技巧

拿到这个数据集,很多人的第一反应是“赶紧跑通YOLOv8训练”。但根据我带过的7个团队的经验,80%的失败不是出在模型上,而是栽在数据预处理和训练策略的细节里。下面我把完整流程拆解成可执行步骤,并标注每个环节的“死亡陷阱”。

3.1 目录结构标准化:为什么必须重建符合Ultralytics规范的目录?

Ultralytics官方要求YOLO训练数据必须是如下结构:

dataset/ ├── train/ │ ├── images/ │ └── labels/ ├── val/ │ ├── images/ │ └── labels/ └── test/ (可选) ├── images/ └── labels/

但原始数据集是扁平结构(5364张JPG + 5364个XML)。直接扔进YOLO会报错,因为:
- Ultralytics默认只读取labels/*.txt,不认识XML;
- 它要求images/labels/同名配对(如001.jpg001.txt),而原始XML文件名可能含路径或特殊字符;
- 缺少dataset.yaml配置文件,无法指定类别名和路径。

正确做法分三步:

Step 1:XML转YOLO txt(核心脚本)
我写了一个鲁棒性极强的转换脚本,已通过全部5364个XML校验:

# voc2yolo.py import xml.etree.ElementTree as ET import os from pathlib import Path def convert_voc_to_yolo(voc_xml_path, yolo_txt_path, img_width, img_height): tree = ET.parse(voc_xml_path) root = tree.getroot() # 注意:此处强制将所有object视为同一类别 'phone_head_joint' # 类别ID固定为0(单类别任务) with open(yolo_txt_path, 'w') as f: for obj in root.findall('object'): # 获取bbox坐标 bndbox = obj.find('bndbox') xmin = int(bndbox.find('xmin').text) ymin = int(bndbox.find('ymin').text) xmax = int(bndbox.find('xmax').text) ymax = int(bndbox.find('ymax').text) # 归一化到0~1范围(YOLO要求) x_center = ((xmin + xmax) / 2) / img_width y_center = ((ymin + ymax) / 2) / img_height width = (xmax - xmin) / img_width height = (ymax - ymin) / img_height # 写入YOLO格式:class_id x_center y_center width height # 单类别,class_id=0 f.write(f"0 {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}\n") # 批量转换(示例) voc_dir = Path("original_voc/") yolo_labels_dir = Path("dataset/labels/") yolo_images_dir = Path("dataset/images/") # 假设你已按比例划分好train/val/test的图片列表 for split in ['train', 'val']: split_img_dir = yolo_images_dir / split split_label_dir = yolo_labels_dir / split for xml_file in (voc_dir / split).glob("*.xml"): img_name = xml_file.stem + ".jpg" img_path = voc_dir / split / img_name # 获取图像实际尺寸(关键!不能假设统一尺寸) from PIL import Image with Image.open(img_path) as img: w, h = img.size yolo_txt_path = split_label_dir / f"{xml_file.stem}.txt" convert_voc_to_yolo(xml_file, yolo_txt_path, w, h)

注意:这个脚本的关键在于动态读取每张图的真实宽高。我见过太多人直接写死img_width=1920, img_height=1080,结果在手机竖屏拍摄的图(1080×1920)上产生严重坐标偏移。YOLO的归一化是刚性的,差一个像素,训练就飘。

Step 2:构建dataset.yaml
dataset/目录下创建dataset.yaml

train: ../dataset/train/images val: ../dataset/val/images test: ../dataset/test/images # 如果有测试集 nc: 1 # number of classes names: ['phone_head_joint'] # class names

Step 3:严格划分训练/验证集(8:2黄金比例)
不要用随机打乱!必须按视频序列切分,避免同一视频的帧分散在train/val中导致数据泄露。我们采用:
- 按原始视频ID分组(数据集附带video_id_mapping.csv
- 每个视频的所有帧归入同一split
- 随机选取80%的视频ID作为train,20%作为val
- 最终得到train: 4292张,val: 1072张(严格8:2)

3.2 YOLOv8训练命令与超参调优:哪些参数值得改,哪些必须锁死?

官方命令yolo train data=dataset.yaml model=yolov8s.pt epochs=100能跑通,但效果一般。以下是我在多个项目中验证有效的调优组合:

yolo detect train \ data=dataset.yaml \ model=yolov8s.pt \ epochs=150 \ imgsz=640 \ batch=32 \ name=v8s_phonehead_v1 \ patience=20 \ lr0=0.01 \ lrf=0.01 \ cos_lr \ hsv_h=0.015 \ hsv_s=0.7 \ hsv_v=0.4 \ degrees=0 \ translate=0.1 \ scale=0.5 \ shear=0 \ perspective=0.0001 \ flipud=0.0 \ fliplr=0.5 \ mosaic=1.0 \ mixup=0.1 \ copy_paste=0.1

关键参数解读与避坑:

  • imgsz=640:必须设为640。小于640(如320)会导致耳部细节丢失;大于640(如1280)显存爆炸且收益递减。我们对比过640 vs 1280,在Tesla V100上mAP@0.5仅提升0.3%,但单epoch耗时翻倍。

  • batch=32:这是V100 32G显存的甜点值。若用24G显卡,务必降为16,并同步将lr0按比例降至0.005(学习率与batch size线性相关)。

  • hsv_s=0.7, hsv_v=0.4:饱和度和明度扰动要大幅增强。原因:真实监控场景光照极不稳定(车内仪表盘反光、教室顶灯频闪、室外逆光),模型必须对颜色鲁棒。但hsv_h(色相)必须压到0.015以下,避免把手机屏幕蓝光扰动成红色,造成类别混淆。

  • mosaic=1.0, mixup=0.1, copy_paste=0.1:Mosaic必须开满(1.0),这是提升小目标(耳部)检测的关键;Mixup和Copy-Paste设低值,因为联合框是强结构化目标,过度混合会破坏phone-head的空间耦合关系。

  • degrees=0, shear=0, perspective=0.0001旋转和错切必须禁用!真实通话中手机-耳部结构是刚性的,旋转会制造出不存在的姿态(如手机倒置贴耳),让模型学到虚假特征。Perspective保留极小值(0.0001)仅用于模拟轻微镜头畸变。

实操心得:我在某次训练中误开了degrees=10,结果模型在验证集上对侧脸通话的召回率暴跌至31%。复盘发现,旋转后的联合框让模型把“手机在耳侧”学成了“手机在耳上方”,完全偏离物理规律。行为检测的第一原则:数据增强不能违背物理常识。

3.3 训练过程监控与早停策略:如何识别真正的过拟合?

YOLOv8默认的patience=100对这个数据集太宽松。我们观察到:
- val_loss通常在epoch 60~80间触底,之后缓慢爬升;
- 但mAP@0.5在epoch 100后才开始明显下降;
- 更危险的是,box_loss持续下降而cls_loss停滞——说明模型在疯狂优化定位,却放弃了对“联合结构”的语义理解。

因此,我定制了一个早停策略(集成在训练脚本中):

# 在ultralytics/utils/callbacks/base.py中修改 class EarlyStopper: def __init__(self, patience=20, min_delta=0.001): self.patience = patience self.min_delta = min_delta self.best_score = None self.counter = 0 def __call__(self, metrics): # 关键:以val/mAP50为首要指标,而非loss score = metrics.get('metrics/mAP50(B)', 0) if self.best_score is None: self.best_score = score elif score < self.best_score - self.min_delta: self.counter += 1 if self.counter >= self.patience: return True # 触发早停 else: self.best_score = score self.counter = 0 return False

监控重点看三张图:
1.results.png中的val/mAP50(B)曲线:平稳上升后持平是健康信号,若在80epoch后出现锯齿状波动,说明模型在噪声上过拟合;
2.train/box_lossvsval/box_loss:两者应平行下降,若val曲线突然上翘,立即检查该epoch的验证样本——大概率是某张侧后方视角的图被误标,需人工复核;
3.confusion_matrix.png:理想状态是几乎全白(单类别任务),若有灰色块,说明模型在混淆“phone_head_joint”和背景(如衣服纹理),需加强hsv_v扰动。

4. 场景迁移与实战部署:如何把模型嵌入车载DMS或课堂监控系统?

训练出高mAP的模型只是起点,真正在业务系统中跑起来,才是考验。我以车载DMS为例,分享一套经过量产验证的落地链路。

4.1 输入预处理:为什么不能直接喂原图给模型?

车载摄像头输出的是H.264流,分辨率通常是1280×720或1920×1080,但YOLOv8s最佳输入是640×640。粗暴resize会带来两大问题:
-耳部特征压缩失真:耳屏、耳垂等毫米级结构在resize后只剩2~3像素,CNN无法提取有效纹理;
-手机屏幕反光消失:高清图中手机屏幕的镜面反射是重要线索,降采样后变成一片灰斑。

解决方案:ROI裁剪 + 多尺度推理(Multi-Scale ROI)
我们不处理整图,而是先用轻量级人脸检测器(如BlazeFace)定位头部大致区域,然后以头部为中心,裁剪一个1.8倍头部尺寸的ROI区域(例如头部框宽200px,则ROI为360×360),再将此ROI resize到640×640送入YOLO。这样既保持耳部细节,又控制计算量。

# dms_pipeline.py import cv2 from ultralytics import YOLO face_detector = BlazeFace() # 轻量级,<1ms phone_model = YOLO("v8s_phonehead_v1.pt") def dms_inference(frame): # Step 1: 快速人脸检测(仅需定位头部中心) faces = face_detector.detect(frame) if not faces: return False # 无人脸,不检测 # Step 2: 取第一个检测框,扩展为ROI x1, y1, x2, y2 = faces[0] # BlazeFace输出xyxy cx, cy = (x1+x2)//2, (y1+y2)//2 roi_size = int(max(x2-x1, y2-y1) * 1.8) x_roi = max(0, cx - roi_size//2) y_roi = max(0, cy - roi_size//2) roi = frame[y_roi:y_roi+roi_size, x_roi:x_roi+roi_size] # Step 3: ROI resize + 推理 roi_resized = cv2.resize(roi, (640, 640)) results = phone_model(roi_resized, conf=0.5) # Step 4: 将结果坐标映射回原图 if len(results[0].boxes) > 0: box = results[0].boxes[0].xyxy[0].cpu().numpy() # 映射回原图坐标 x_orig = int(box[0] * roi_size / 640 + x_roi) y_orig = int(box[1] * roi_size / 640 + y_roi) w_orig = int((box[2]-box[0]) * roi_size / 640) h_orig = int((box[3]-box[1]) * roi_size / 640) return (x_orig, y_orig, w_orig, h_orig) return False

4.2 后处理逻辑:如何把单帧检测转化为可靠的行为事件?

单帧检测不准,这是共识。我们的方案是时空联合决策引擎

模块功能参数
帧级过滤器剔除低置信度(<0.7)、小尺寸(面积<总图0.5%)、异常长宽比(>3.0或<0.3)检测框防止瞬时噪声触发
轨迹关联器对连续5帧内IOU>0.4的检测框做ID分配,形成轨迹使用ByteTrack算法,轻量高效
行为状态机定义状态:IDLE → DETECTED → CONFIRMED → TALKING,仅当轨迹持续≥3帧且置信度均>0.85时进入TALKING避免“一闪而过”的误报

这个状态机在某车企实测中,将误报间隔(MTBF)从12分钟提升到87分钟,而首次检测延迟(TTD)控制在1.3秒内。

4.3 常见问题排查速查表

现象可能原因排查步骤解决方案
模型完全不检出1. 图像色彩空间错误(BGR/RGB颠倒)
2. XML转txt时坐标归一化出错
3. dataset.yaml路径写错
1. 用cv2.imshow检查输入图是否正常
2. 随机选3个txt,用cv2.rectangle画框验证位置
3.ls -l dataset/train/images/确认路径真实存在
1. OpenCV读图后加cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
2. 重跑voc2yolo.py,打印前10个坐标debug
3. 用绝对路径写入dataset.yaml
只检出手机,不检出联合框标注时误将phone和head分开标为两个object解析XML,检查<object>数量。正常应全部为1个object/图重新下载数据集,确认ep7KpdQtboSiXWwGXu8u-master-8b9a581fe416067c702bbeaa5940ef2a0fa50d93版本
侧脸检测率低训练时mosaic增强破坏了耳部空间关系查看train_batch0.jpg,确认侧脸样本是否被扭曲降低mosaic概率至0.7,或在mosaic中禁用侧脸样本
模型在暗光下失效HSV扰动未覆盖低照度场景cv2.convertScaleAbs(img, alpha=1.2, beta=30)增强暗部后测试在数据增强中加入brightness=0.3, contrast=0.3参数

最后分享一个血泪教训:我们在某次交付中,因未检查gitignore文件,导致.inscode被误删,结果客户环境缺少labelImg依赖,整个标注复核流程瘫痪。永远不要忽略数据包里的任何文件——它们都是生产链路上的一环。现在我拿到新数据集,第一件事就是ls -la看全所有隐藏文件,再cat .inscode确认环境依赖清单。

这个数据集的价值,不在于它有多大,而在于它用最笨拙的人工标注,守住了行为识别中最珍贵的东西:物理真实性。当算法开始学会尊重现实世界的约束,它才真正有了落地的根基。

本文还有配套的精品资源,点击获取

简介:专为检测真实打电话动作构建的数据集,包含5364张JPG图像,每张配一个标准Pascal VOC格式XML标注文件。只定义两个类别:phone(手机)和head(头部),全部由labelImg人工绘制矩形框,共5045个phone框、415个head框。标注严格遵循行为逻辑——仅当手机紧贴耳部处于语音通话状态时才触发联合标注,此时需将手机、耳部所在头部区域及部分持机手部统一纳入同一目标框内;手持未贴耳、刷屏、自拍、视频通话等非通话行为一律不标。不提供YOLO格式txt、分割掩码或预训练模型,也不含权重文件,纯原始标注资源,开箱即可用于YOLOv5/v8/v10等系列模型训练。所有标注经过人工校验,结构规范、可复现,适用于安防监控、车载驾驶行为识别、课堂纪律管理等需要区分‘通话’与‘玩手机’的细分场景。授权说明文档已内置,使用前须阅读确认合规性。


本文还有配套的精品资源,点击获取

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

Arduino Nano离线语音识别:基于IIR滤波与模板匹配的嵌入式实现

1. 项目概述与核心思路几年前&#xff0c;我在书架上翻出一份上世纪70年代末的IEEE语音识别报告&#xff0c;当时就冒出一个念头&#xff1a;那个年代需要占用整个房间的迷你计算机才能完成的工作&#xff0c;今天能不能用一块指甲盖大小的Arduino Nano来实现&#xff1f;这个想…

作者头像 李华
网站建设 2026/6/2 17:19:03

3个让Obsidian数学公式输入效率翻倍的核心技巧指南

3个让Obsidian数学公式输入效率翻倍的核心技巧指南 【免费下载链接】obsidian-latex-suite Make typesetting LaTeX as fast as handwriting through snippets, text expansion, and editor enhancements 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-latex-suite …

作者头像 李华