news 2026/10/3 14:14:49

OpenCV人脸识别从入门到实战:检测、LBPH训练与调优

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenCV人脸识别从入门到实战:检测、LBPH训练与调优

朋友的工作室最近要做一个刷脸签到的小系统,问我OpenCV能不能搞定人脸识别。我说能,而且用Python写起来比你想象中快——检测、训练、识别,核心代码加起来不用一百行。但我自己把这套流程完整做完一遍才明白,网上大部分教程只给一个能跑通的demo,没人告诉你为什么换个光线就认不出人、为什么训练三张照片和三十张照片效果差这么多、为什么摄像头里你自己的正脸经常框不住。这篇文章就把这套流程从头到尾拆开讲,包含环境搭建、检测与识别原理、完整可复现的代码,以及我在实测中踩过的坑和调优方法。

1. 先搞清楚:人脸检测和人脸识别是两件事

很多人刚开始接触这个领域,会把人脸检测和人脸识别混为一谈,实际上这是两个前后衔接的独立模块。搞清楚它们的区别,后面调起参来才不会懵。

1.1 检测输出的是一堆坐标,识别输出的才是身份

人脸检测做的事情是“找出图里有没有人脸、人脸在哪”,它返回的是一组矩形坐标,也就是左上角的x、y和宽度、高度。你可以理解为它在画框,告诉你“画面上大概第120像素到350像素这个区域有一张脸”。人脸识别做的事情是“这张脸是谁”,它需要先拿到检测出来的那块脸部区域,再做特征比较,最后输出一个人的ID和相似度分数。

我见过不少初学者,拿着一张照片想直接调“识别”接口,结果发现返回的东西乱七八糟,就是因为检测这一步还没做。反过来,有人只做了检测,发现程序只会画框,根本分不清谁是谁,也是因为第二步根本没有实现。整个流程应该是:检测 -> 提取人脸区域 -> 预处理 -> 特征提取 -> 身份匹配。这篇文章后面的代码也是按这个链路组织的。

1.2 OpenCV这条路适合谁、不适合谁

选OpenCV做人脸识别,最大的优势是三个:免费、开源、离线。它不需要联网,不需要付费SDK,也不会把用户的照片传到外部服务,这对很多本地应用场景来说特别重要。其次它足够轻,CPU上就能跑,不需要GPU,一张树莓派也能撑起来。

但它也有清晰的天花板。OpenCV传统的人脸识别方案用的是Haar特征和LBP特征,这是2010年前后的经典方法,不是深度学习。它的优势是快、简单、可解释,缺点是遇到角度偏转、强烈光照变化、遮挡等情况,鲁棒性明显不如现在的神经网络方案。如果你想做人脸考勤、班级点名、相册分类这种“一般够用”的诉求,OpenCV完全没问题。如果你要做刷脸支付、金融级身份认证这种场景,那就得去用ArcFace、FaceNet或者商业SDK了。

另外提一句,工业视觉里有人拿Halcon和OpenCV做对比。Halcon是做高精度测量、定位的工业视觉软件,收费、闭源;OpenCV是通用开源视觉库,定位完全不同。做人脸识别这种偏向模式识别的任务,OpenCV生态更合适,工业场景里那种毫米级测量则不是它的强项。

2. 环境搭建:装好OpenCV是第一步,也是踩坑最多的第一步

从热搜词里就能看出来,“安装opencv”“opencv安装成功却找不到cv2”“ModuleNotFoundError”这些问题是绝大多数新手的第一道坎。其实安装本身只有一条命令,坑全出在环境错乱上。

2.1 用pip安装OpenCV时最容易踩的两个坑

OpenCV的Python包有两个:opencv-python和opencv-contrib-python。前者只包含主模块,做基本图像处理、人脸检测都够用;后者额外包含cv2.face、cv2.xfeatures2d等扩展模块。我们做人脸识别要用的LBPHFaceRecognizer就在cv2.face里,所以直接装opencv-contrib-python。

python -m pip install opencv-contrib-python

这里我用的是python -m pip而不是裸写pip,因为很多人电脑上同时存在多个Python环境,比如系统自带的Python、Anaconda的Python、虚拟环境的Python。直接敲pip,装到哪个环境全看运气;用python -m pip,则保证装到当前这个python命令对应的环境里。这一步能避免大量“明明装了却找不到cv2”的迷惑问题。

第二个坑是不要把opencv-python和opencv-contrib-python同时装。这两个包会互相覆盖同名文件,装完经常出现某些模块import失败,或者版本错乱。如果你之前装过其中一个,先卸掉再装另一个:

python -m pip uninstall opencv-python opencv-contrib-python python -m pip install opencv-contrib-python

国内网络环境下载慢的话,可以换国内镜像源:

python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-contrib-python

2.2 验证安装与获取Haar级联分类器文件

安装完成后,验证一下版本:

python -c "import cv2; print(cv2.__version__)"

如果能看到4.x或3.x的版本号,说明安装成功。如果报ModuleNotFoundError: No module named 'cv2',先别急着重装,用下面三行命令排查:

which python python --version python -m pip --version

确认这三条命令指向的是同一个环境。如果你用的是PyCharm、VS Code这类IDE,还要看编辑器右下角选择的解释器是不是命令行里同一个Python。很多时候模块明明装好了,但IDE里用的却是另一个解释器,这属于环境错位,不是OpenCV的问题。

Haar级联分类器检测人脸需要一个训练好的模型文件。OpenCV安装包里自带了一些,不用单独下载,直接用cv2.data.haarcascades这个路径即可:

import cv2 face_cascade = cv2.CascadeClassifier( cv2.data.haarcascades + "haarcascade_frontalface_default.xml" ) print(cv2.data.haarcascades)

打印出来就是安装包内部的XML路径。如果你用的是嵌入式设备或者精简安装,找不到这个路径,也可以去OpenCV官方仓库手动下载这个XML文件,然后用绝对路径加载。我建议养成用cv2.data.haarcascades加文件名的习惯,代码放在哪台机器上都不会因为路径问题报错。

3. 人脸检测:Haar级联分类器的工作原理与参数逐项解读

检测是整个识别流程的前置条件,检测不准,后面识别全是空谈。这里把Haar级联分类器的工作逻辑说清楚,你才能明白detectMultiScale里那一堆参数到底该怎么调。

3.1 Haar特征与级联思想

Haar特征本质上是一些矩形模板,用来衡量图像局部区域的灰度差异。比如眼睛区域通常比它正下方的脸颊区域颜色深,那么在眼睛那条带子上,水平方向的Haar特征值就会特别明显。Viola-Jones在2001年提出的这个方法,核心是把大量这样的简单特征组织成多个弱分类器,再级联成强分类器。

我习惯用一个比喻来解释“级联”:就像公司门口安检,先有一道最宽松的检查,看一眼包的外形就觉得可疑的直接拦下,剩下的人进入第二道更细致的检查,逐级过滤。检测一张图时,OpenCV用不同尺寸的窗口在整张图上滑动,每个窗口先经过第一层粗筛,大多数不是人脸的窗口在这里就被刷掉了,只有真正像脸的窗口才能走到后面的层级。这样设计的好处是计算量被大幅压缩,CPU上也能跑到实时。

这套方法是机器学习时代的经典方案,不是深度学习,所以它对光照、角度的容忍度有限。明白这一点,后面遇到检测失灵你就不会太意外。

3.2 detectMultiScale的参数到底怎么调

看一段最基础的检测代码:

import cv2 face_cascade = cv2.CascadeClassifier( cv2.data.haarcascades + "haarcascade_frontalface_default.xml" ) img = cv2.imread("face.jpg") gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale( gray, scaleFactor=1.1, minNeighbors=5, minSize=(50, 50) ) for (x, y, w, h) in faces: cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.imshow("result", img) cv2.waitKey(0) cv2.destroyAllWindows()

三个参数逐项说:

scaleFactor是每次扫描时图像缩放的步长。数值越接近1,说明扫描的尺度越精细,小脸越不容易漏,但计算量成倍上涨,1.05到1.1适合离线处理单张高清图片;实时视频流里为了帧率,常用1.2到1.3。这个参数的本质是“多久检查一次不同尺寸的人脸”。

minNeighbors是候选框保留的阈值,它表示一个区域至少要有多少个重叠的检测框确认,才被认为是最终的人脸。数值调大,误检减少,但可能把角度偏的脸漏掉;调小,容易把纹理复杂的背景当成脸。一般从5开始试,发现误检多就往上加,发现漏检多就往下减。

minSize是检测窗口的最小尺寸。小于这个尺寸的候选框会被直接忽略。设置(50, 50)能排掉远处的小目标,加快速度。如果你要检测的是近景单张脸,直接设(100, 100)都不为过。

3.3 从单张图片切入视频流

图片检测跑通之后,改成视频流只需要加一个循环。这里有个很实用的优化技巧:先把帧缩小到640像素以内再送入检测器。人脸检测对输入分辨率没那么敏感,但计算量会随着像素数直线下降,帧率能明显提升。

import cv2 face_cascade = cv2.CascadeClassifier( cv2.data.haarcascades + "haarcascade_frontalface_default.xml" ) cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() if not ret: break frame = cv2.resize(frame, (640, int(frame.shape[0] * 640 / frame.shape[1]))) gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale( gray, scaleFactor=1.3, minNeighbors=5, minSize=(60, 60) ) for (x, y, w, h) in faces: cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.imshow("detect", frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()

这一步跑通后,你已经完成了“人脸检测”,下一步才是真正的人脸识别。

4. 人脸识别实战:从采集训练集到LBPH模型上线完整代码

识别部分我用的是OpenCV内置的LBPH算法,全称是Local Binary Patterns Histograms,局部二值模式直方图。它不像EigenFaces、FisherFaces那样依赖像素矩阵的全局统计,而是先把每个像素和它周围的邻域比较,生成二值编码,再统计整张图的直方图特征。这样的好处是对局部光照变化更鲁棒,而且不需要所有训练图片的像素数完全一致,对入门场景很友好。

整个识别流程分三步:采集人脸样本、训练模型、实时预测。

4.1 数据采集:为自己和测试者建立人脸样本库

数据是一切的起点。每训练一个用户,就在摄像头前采集几十张正脸照片,检测到人脸后把脸部区域裁剪出来,统一缩放到200x200的灰度图,再按用户ID存到对应文件夹。

import cv2 import os face_cascade = cv2.CascadeClassifier( cv2.data.haarcascades + "haarcascade_frontalface_default.xml" ) user_id = input("请输入用户ID编号,例如:1、2、3...:") save_dir = f"dataset/user_{user_id}" os.makedirs(save_dir, exist_ok=True) cap = cv2.VideoCapture(0) count = 0 while True: ret, frame = cap.read() if not ret: break frame = cv2.resize(frame, (640, int(frame.shape[0] * 640 / frame.shape[1]))) gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale( gray, scaleFactor=1.3, minNeighbors=5, minSize=(100, 100) ) for (x, y, w, h) in faces: cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2) face_roi = gray[y:y + h, x:x + w] face_resized = cv2.resize(face_roi, (200, 200)) count += 1 cv2.imwrite(f"{save_dir}/{count}.jpg", face_resized) cv2.imshow("collect", frame) if cv2.waitKey(1) & 0xFF == ord('q') or count >= 50: break cap.release() cv2.destroyAllWindows() print(f"采集完成,共保存{count}张样本到{save_dir}")

这里有几个细节要注意。第一,保存的是灰度图,因为训练和识别都在灰度空间做,颜色信息不但没用,反而会引入干扰。第二,把脸部区域先resize成固定尺寸,是为了减少后续训练时直方图统计的偏差。第三,采集时不要一直保持同一个表情同一个角度,转一点头、换个位置、开关一次灯,让样本覆盖更多变化,模型的泛化能力完全由数据集质量决定。

4.2 训练LBPH识别器

采集完成后,遍历所有user_*文件夹,把图片路径里的用户ID解析出来作为标签,然后交给LBPHFaceRecognizer训练。

import cv2 import numpy as np import os recognizer = cv2.face.LBPHFaceRecognizer_create() images = [] labels = [] for root, dirs, files in os.walk("dataset"): for file in files: if not file.endswith(".jpg"): continue img_path = os.path.join(root, file) img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) if img is None: continue images.append(img) user_id = int(os.path.basename(root).split("_")[1]) labels.append(user_id) recognizer.train(images, np.array(labels)) recognizer.save("trainer.yml") print(f"训练完成,共{len(images)}张样本")

训练不会持续很久,因为LBPH本质上是在保存每个ID的人脸直方图模型。需要注意,标签必须是整数,OpenCV不接受字符串,所以用户ID要用文件夹名解析成int。如果你有用户名,比如“张三”“李四”,可以单独维护一个ID到姓名的映射表,代码里用name_map来管理。

4.3 实时识别与姿势校准

模型训练完成后,加载trainer.yml,打开摄像头,检测到人脸后把脸部区域缩放到200x200,送入recognizer.predict()。它返回两个值:label是预测的用户ID,confidence是置信度,注意LBPH的置信度是距离值,越小表示越接近已训练的人脸。

import cv2 face_cascade = cv2.CascadeClassifier( cv2.data.haarcascades + "haarcascade_frontalface_default.xml" ) recognizer = cv2.face.LBPHFaceRecognizer_create() recognizer.read("trainer.yml") name_map = {1: "zhangsan", 2: "lisi"} cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() if not ret: break frame = cv2.resize(frame, (640, int(frame.shape[0] * 640 / frame.shape[1]))) gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale( gray, scaleFactor=1.3, minNeighbors=5, minSize=(100, 100) ) for (x, y, w, h) in faces: face_roi = gray[y:y + h, x:x + w] face_resized = cv2.resize(face_roi, (200, 200)) label, confidence = recognizer.predict(face_resized) if confidence < 100: name = name_map.get(label, "unknown") color = (0, 255, 0) else: name = "unknown" color = (0, 0, 255) cv2.rectangle(frame, (x, y), (x + w, y + h), color, 2) cv2.putText(frame, f"{name} {confidence:.1f}", (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.8, color, 2) cv2.imshow("recognition", frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()

跑起来之后,你会看到框上实时显示预测的名字和置信度。如果置信度一直很大,说明这个人不在训练集里,或者预处理链路和训练时不匹配。

4.4 训练和识别必须保持相同的预处理链路

这是很多人忽略的关键点。训练时你用的是灰度图、200x200尺寸;识别时如果你直接拿原始彩色帧、原始尺寸扔进predict,虽然程序不会报错,但结果几乎没有参考价值。这就好比你让老师看一个人的证件照来认人,结果考试时递过去一张加了滤镜的全身照,特征对不上。

所以我把预处理统一成三步:cvtColor转灰度,equalizeHist直方图均衡化,resize到200x200。均衡化的作用是增强对比度、压低光照差异,后面第5节会详细说。这里先提醒,采集、训练、识别三处代码要保持同一套预处理逻辑,数据集才是一个封闭稳定的空间。

5. 实测中的坑:光照、遮挡、侧脸与置信度调优

代码跑通只是第一步,真实环境里的问题一个接一个。我把自己实测遇到的四个典型问题整理出来,这些才是网上教程不会细讲的部分。

5.1 光照是关键变量,一个小API就能缓解

同一个人的同一张脸,在光线充足的窗边和昏暗的走廊里,采集到的图像像素值可能相差很大。LBPH虽然对局部光照有一定鲁棒性,但整体亮度变化太猛,直方图分布照样会被带偏。

实测中比较有效的做法是加一步cv2.equalizeHist直方图均衡化。它会把图像的灰度分布拉开,让暗区域的细节显现出来,同时把过亮区域压回来。我的经验是,在室内普通LED灯光下,采集和识别都做均衡化之后,识别准确率提升非常明显。

另外,采集数据时主动覆盖不同光照条件很重要。比如白天采集一轮、晚上开灯再采集一轮,样本里有了亮度差异,模型就不会把“亮度”本身当成人脸特征。不要在纯背光环境下直接用,那种情况下连Haar检测都容易把脸漏掉。

5.2 置信度阈值不是固定的,要靠实测曲线来定

网上很多教程直接写“confidence小于80就认为是同一人”,这个数字只能当参考。LBPH返回的confidence是直方图距离,没有统一量纲,不同数据集、不同预处理下,同一人的距离可能在50到120之间波动,不同人的距离可能从90到200都有。

正确做法是写一个小脚本,把识别阶段的label和confidence逐帧打印到控制台,同时记录画面里真实的身份,然后对比两组数据。对同一人的多次识别取一个距离区间,对不同人的识别取另一个区间,最后选择两个分布之间的分割点作为阈值。

我自己的项目里,通常把阈值设在同一个距离区间的上限附近,宁可多显示几次unknown,也不允许把人认错。如果识别不上的情况太多,优先补数据集而不是放宽阈值。阈值放宽到150以上,基本等于“这次认证靠猜”。

5.3 侧脸与遮挡:Haar方案的天花板

Haar级联分类器训练时主要用正脸样本,所以你对准摄像头时检测很稳,头稍微转到60度以上,检测框就开始抖动甚至直接消失。戴墨镜、口罩、粗框眼镜,也会明显影响检测。

这个问题没有太好的修复办法,只能从数据上缓解。采集样本的时候让人左右转转脸、抬点头低点头,别只收正面大头照。为了让识别更稳定,我还会让人摘下眼镜采集一组、戴上眼镜再采集一组,相当于同一个ID下分了两组特征。如果你的场景确实有大量侧脸和口罩需求,那我建议直接跳到第6节的DNN方案,传统的Haar方案在这个问题上确实有物理上限。

5.4 实时视频流的性能调优

CPU上跑实时识别,帧率是一个绕不开的问题。优化顺序我一般这样排:先把输入帧缩到640x480,这能砍掉一半以上的计算量;再把scaleFactor调到1.3,配合minSize=(80, 80),让检测器不要白费力气扫描大量小窗口;如果还是不够快,可以每隔两到三帧做一次检测,中间帧沿用上一次检测到的人脸坐标。

实测下来,在普通笔记本CPU上,Haar检测加LBPH识别跑640x480的流,配合上面这些优化,帧率完全够日常演示用。不需要上多线程,优先减少输入数据量,性价比最高。

5.5 误检与画面中多张脸的处理

还有一个常见情况是画面里出现多张脸。Haar偶尔会把背景纹理当成人脸,比如窗户格栅、书架缝隙这类高对比度横线条。处理方法是把minNeighbors往上调,5不够就试7、8,误检会明显减少。多张脸同时存在时,程序会对每张脸分别识别,这是天然支持的,不需要额外处理,但要注意性能消耗会随人脸数量翻倍。如果同时出现4张以上脸,帧率明显下降,代码里可以只处理最大的一张脸,或者限制最多处理两张,这样考勤机的体验更可控。

6. 让识别更可靠的后续升级思路

如果基础版本的识别率已经满足需求,但又想更进一步,下面这几个方向值得投入。

6.1 人脸对齐:先标准化位置再比较

Haar检测返回的人脸框虽然能框住大致区域,但人的头部姿态、脸部在框内的比例都不同。人脸对齐的思路是检测双眼、鼻尖等关键点,再用仿射变换把人脸旋转、缩放到一个标准位置,比如把两只眼睛固定到同一水平线上。经过这个操作后,LBPH提取的直方图会更加稳定,识别准确率会有可感知的提升。

OpenCV自带眼部检测的Haar模型,可以实现简单对齐。想要更精准的关键点定位,可以用dlib,它提供68个人脸关键点检测,模型文件也不大,CPU上速度尚可。这里不展开代码,但如果你做完基础版后想提升,优先做这一步。

6.2 DNN模型替代Haar:侧脸与遮挡问题的正解

如果实测下来发现Haar检测在侧脸、口罩场景下实在撑不住,直接把检测器换成OpenCV DNN模块加载YuNet或UltraFace这类轻量人脸检测模型。它们是深度神经网络模型,对角度、遮挡、光照的鲁棒性比Haar高一个量级,而且OpenCV DNN模块可以直接加载ONNX格式,不需要安装TensorFlow或PyTorch。

识别阶段也可以升级,把LBPH换成ArcFace或FaceNet,用模型提取人脸特征向量,再计算向量距离判断身份。这种方案才是目前门禁机、刷脸设备的主流做法。不过要注意,深度模型的推理速度在纯CPU上会比Haar慢一些,需要在精度和性能之间做权衡。

6.3 部署到嵌入式设备的思路

OpenCV加LBPH这套组合的优势在嵌入式设备上体现得很明显,模型文件小、算力要求低、完全离线运行。树莓派、Jetson Nano甚至一部分国产开发板都能流畅跑起来。嵌入式Linux环境下安装OpenCV,优先尝试pip安装预编译包,如果平台不支持,再考虑源码编译。我之前在一台低配开发板上跑过,640x480分辨率下保持十几帧问题不大,做一个小型门禁签到机原型完全够用。

更接近量产的人脸识别门禁机,一般用的是专用离线人脸识别模组,内置DSP或NPU,功耗更低、启动更快。但不管硬件怎么变,算法链路还是检测、对齐、特征提取、比对这几步,把OpenCV原型里的逻辑理清楚,迁移过去心里才有底。

最后说点实在的。如果你想快速做出一个能演示的样例,上面第2节到第4节的代码直接照着跑就能出结果。但如果你要做一个真实环境中持续运行的签到系统,我建议把数据采集当成工程来做:每个人至少攒30张以上样本,覆盖不同角度、不同光线、有无眼镜,甚至隔一段时间再补充几张新照片重新训练。识别阈值宁可定得严一点,多漏几次也不要乱认人,这种系统用户才敢用。跑通demo只是开始,真正让它稳定可靠,靠的还是数据质量和反复实测。

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

情感词典+机器学习:微博评论情感分析实战项目拆解

简介&#xff1a;结合情感词典与机器学习的新闻和微博评论情感分析资料包&#xff0c;面向自然语言处理入门者、舆情分析从业者及电商口碑研究者。项目通过哈工大、知网情感词典提取情感特征&#xff0c;并借助朴素贝叶斯、支持向量机、随机森林等分类器完成正面、负面与中性类…

作者头像 李华
网站建设 2026/10/3 14:12:26

LIN一致性测试实战:从ISO 17987标准到CANoe工程搭建

做车载网络这一行&#xff0c;最容易被外行低估的一个环节就是一致性测试。整车厂和Tier 1之间谈项目&#xff0c;除了功能逻辑要对&#xff0c;其次就是挂在嘴边的“过了没有”——这个“过”&#xff0c;指的正是LIN一致性测试。说到LIN一致性测试标准&#xff0c;绕不开两张…

作者头像 李华
网站建设 2026/10/3 14:12:22

关键场景辨别驱动的两阶段鲁棒微网调度与CCG实现

接手园区微网调度项目那阵子&#xff0c;光伏装机占到全园区负荷的将近一半&#xff0c;天气好的时候发电量一路冲到上限&#xff0c;云层一厚又瞬间掉下去&#xff0c;柴油发电机启动需要时间&#xff0c;储能容量又有限。最初用确定性优化模型做日前调度&#xff0c;预测曲线…

作者头像 李华
网站建设 2026/10/3 14:12:22

中文分词自建词典生成:从语料到dic文件的完整流程

开篇先交代一下背景&#xff1a;这是“幽冥大陆”系列项目的第九十七期记录&#xff0c;对应整个仙盟体系里的“练气期”阶段。所谓练气期&#xff0c;说白了就是整个系统刚起步、能跑但不追求极致的第一版。这一期主要是在做分词服务的前置训练工作&#xff0c;核心产出是分词…

作者头像 李华
网站建设 2026/10/3 14:11:54

QNN实战:从模型转换到骁龙平台部署全流程解析

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

作者头像 李华
网站建设 2026/10/3 14:11:01

9块9搞定7x24小时AI助理:DeepSeek API+调度推送全攻略

“大龙虾”这个外号&#xff0c;最近在中老年朋友圈和科技群里都挺常见&#xff0c;说的就是 DeepSeek。本来我一个搞运维的&#xff0c;平时最烦追热点&#xff0c;但这套东西我确实自己折腾了几天&#xff0c;效果超出预期&#xff1a;用接近9块9的开销&#xff0c;在公司旁边…

作者头像 李华