news 2026/9/13 15:56:47

SmartMediaKit+YOLO:从单帧检测到实时视频AI流水线实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SmartMediaKit+YOLO:从单帧检测到实时视频AI流水线实战

做视频 AI 项目多了,我发现一个挺典型的断层:同样是搞 YOLO 的人,单张图检测跑得飞起,一到真实摄像头实时流就抓瞎。不是模型不行,是“视频”这两个字带来的工作量被严重低估了。YOLO 只是一个图像检测器,真正落地到实时视频 AI 场景,你得先解决视频从哪来、帧怎么取、结果怎么回显、断了怎么重连这一堆脏活。我这次用 SmartMediaKit 把 YOLO 从单帧检测演进成一套可落地的实时视频 AI 流水线,折腾了小半个月,踩了不少坑,这套集成思路和技术实践,今天整理出来,给准备把模型搬上视频流的同学一个可抄的作业。

这个方案能做什么?简单说就是:摄像头 RTSP 流拉进来,SmartMediaKit 负责视频接入和分发,YOLO 推理服务负责消费视频帧,检测结果再通过回调推给业务平台,同时预览画面也能低延迟回显。适合这几类人看:一是 YOLO 已经跑通但不知道怎么接视频流的算法同学,二是要做安防、明厨亮灶、工业质检这类实时检测项目的前后端工程师,三是正在评估是自研媒体链路还是直接用现成套件的技术负责人。

1. 项目背景与核心问题:从单帧检测到实时视频 AI,卡点到底在哪

1.1 从“看图说话”到“流水线作业”的思维转换

YOLO 本质上是图像检测器,输入一张图,输出几个框、几个类别和置信度。它不关心你这张图是手机拍的还是摄像头截的,也不关心前后帧有什么关系。但实时视频 AI 完全不是一个维度的东西,它是一条流水线:摄像头持续产生画面,拉流模块不停接收,解码之后按策略抽帧,每一帧送进 YOLO 推理,推理完的结果要么叠加在画面上回推,要么推送给业务系统。这条路任何一个环节断了,整个实时检测就废了。

我习惯打一个比方:YOLO 像是一个视力极好的看图专家,你给他一张照片,他几毫秒就能告诉你图里有什么。但实时视频 AI 是一条工厂流水线,传送带不断把照片送到专家面前,专家看完得把结论写进台账,还得在规定时间内处理完,不能堆积。你光有一个厉害的专家不够,得把传送带、工作台、台账系统全搭好。SmartMediaKit 在这条流水线里扮演的就是传送带和台账管理员的角色。

1.2 直接拿 YOLO 跑视频流的三个现实痛点

先说第一个痛点:性能账根本算不过来。网上很多教程教你打开一个 mp4 文件逐帧读取送入 YOLO,那叫离线处理,不算实时。真正的实时场景是 RTSP 流以 25 帧或 30 帧往你这边推,如果你每帧都做完整检测,YOLOv8s 在普通 GPU 上单帧推理确实只要 8 到 15 毫秒,但加上视频解码、图像预处理、后处理 NMS、画框、编码推流之后,单路延迟轻松超过 30 毫秒,多路并发时显存和 CPU 直接被打满。实测下来,对大部分业务场景根本不需要 30 帧全检,每秒钟抽 5 到 10 帧做推理,检测效果已经接近“实时”感知了。

第二个痛点:视频接入的脏活没人管。摄像头断线、网络抖动、掉帧、流格式不统一,这些在 demo 里完全不存在,但在生产环境里是日常。你不可能自己写一个支持 RTSP 断线重连、按需转发、多路并发的媒体模块,工作量太大了,而且容易写出各种暗坑。

第三个痛点:检测结果没有出口。模型把目标框出来了,然后呢?你是要把框画在画面上回推给监控大屏,还是要把检测事件写入数据库,或者要触发报警?这需要一套成熟的通知和回调机制。YOLO 本身不提供,自己写又容易和业务系统强耦合。SmartMediaKit 这类的媒体接入层正好把这些问题统一收口。

2. SmartMediaKit 在架构里的真实定位:媒体链路和推理链路如何解耦

2.1 SmartMediaKit 的核心职责拆解

先说清楚我理解的 SmartMediaKit:它是一套媒体接入与分发套件,核心任务是解决视频流的接入、转发、帧消费、结果回传这四个问题。你可以把它理解成一个“视频总线”,上游是各种不同的视频源,下游是播放器和 AI 推理模块。

具体到一次实用流程中,它的职责包括:统一接入 RTSP 摄像头、RTMP 推流、GB28181 平台或者本地文件;对非标准或不稳定的流做适配,比如断线重连、超时拉流、UDP 转 TCP 这些底层媒体协议的处理;把解码后的视频帧以可编程的方式交给 AI 模块,而不是把帧数据直接画到屏幕上就完了;最后还要把 AI 模块返回的检测框、识别结果通过 HTTP 回调、WebSocket 或者消息队列推给业务后端,同时能把这些结果动态合流到原始视频帧上,形成一路带标注的预览流。

把公式写出来就是:SmartMediaKit = 视频接入 + 媒体分发 + 帧消费接口 + 结果回传。它是连接摄像头和 AI 模型的中间层,但这条中间层本身就能省掉你三分之二的联调时间。

2.2 为什么不把拉流和推理写在一个进程里

我最早做原型时图省事,把 RTSP 拉流、OpenCV 解码、YOLO 推理、画框、推流全部写在一个 Python 进程里。单路跑通了很开心,压测到第四路的时候直接崩了:一路卡顿会拖垮所有路的推理,一个模型更新要重启整个服务,业务稍微有点问题就得六路一起断流。这个教训非常深刻。

后来我彻底拆成两个独立模块:SmartMediaKit 单独部署在宿主机的媒体服务里,负责所有流的接入和分发;YOLO 推理服务独立起一个进程或者容器,专门消费帧做推理。两个模块之间通过帧回调接口和信令接口通信。这样做的收益是肉眼可见的:模型要升级,推理服务单独滚动更新,视频流不会断;某一路摄像头掉线,媒体模块自动重连,推理服务等下一帧就行,不会因为一个视频源的问题影响其他路;如果需要扩容,推理服务可以水平多开几个实例,媒体模块把帧按负载均衡策略投递过去就行。

2.3 部署形态怎么选择

我这次项目同时试了嵌入式设备和 x86 GPU 服务器两种部署方式,最终线上环境跑的是 x86 GPU。两种方式各有各的路子,整理成一张表给大家参考:

部署形态典型硬件适合场景需要注意的点
嵌入式一体机RK3588 等 SoC 平台单点摄像头少、边缘场景、机房环境简陋模型要转 RKNN 格式,INT8 量化精度损失要实测
单机 GPU 服务器一块 RTX 系列或 Tesla 卡中小规模项目,几路到几十路并发显存和带宽是瓶颈,多路要靠跳帧和 batch 推理
集群式部署多台 GPU 服务器上百路甚至更多摄像头需要负载均衡和动态调度,复杂度指数级上升

我个人的建议:第一版千万别上集群,单机 GPU + SmartMediaKit + 推理服务就能撑住绝大多数实际项目,后面确实不够了再往中间加一层消息队列,把帧投递从直连改成异步。

2.4 视频协议选型:RTSP 为主、GB28181 配合、WebRTC 做预览

协议选型这一节很容易被忽略,但它决定了项目的推进速度。我的做法是:摄像头接入优先走 RTSP,这是绝大多数 IPC 摄像头的原生协议,兼容性最好;如果项目是政府园区或者平安城市类,需要对接统一平台,就要保留 GB28181 接入能力;前端预览要低延迟,就用 WebRTC,这比 RTMP 加上 HLS 的延迟低很多。

选择这套组合的逻辑是:RTSP 适合后端拉流做 AI 分析,因为你可以自由控制取帧频率和解码参数;GB28181 适合向上级平台级联,属于合规能力;WebRTC 适合给用户看实时画面和检测结果回显,延迟能压到 1 秒以内。SmartMediaKit 在这里的价值就是把这些协议统一管理,不让业务上层关心底层是 RTSP 还是 GB28181。

3. YOLO 模型侧的准备:数据标注、训练、导出与格式转换

3.1 训练数据标注的核心要点

标题的热搜词里始终围绕着“YOLO数据标注”“KITTI标注转YOLO”“TACO数据集YOLO格式”,说明大家都卡在数据准备这一步。我做项目时也踩过不少坑,简单分享几条硬经验。

标注格式上,YOLO 用的是 txt 格式,每行记录一个目标:类别 id 和归一化后的中心点 x、中心点 y、宽 w、高 h。像我项目里如果要用到公开的 KITTI 数据集,就得把 KITTI 的 KITTI 格式转换为 YOLO 格式。转换本身不复杂,核心是要把 KITTI 里的 3D 框投影信息过滤掉,只保留 2D 框部分,同时注意坐标归一化的计算方式,是按整张图的宽高归一化还是按裁剪区域归一化,搞错了模型训练直接乱套。

标注工具我现在用 X-AnyLabeling 比较多,因为它支持半自动标注,可以先用一个不太准的模型预标注,再人工修正,这样一万张图的标注工作量能压缩到三千张的水平。标注的时候有几个细节大家容易忽略:一是目标边界要贴合,尤其是小目标,框大了 5 个像素,对微小的目标来说就是致命的;二是遮挡目标不要不标,YOLO 系列对部分遮挡目标其实有不错的鲁棒性,漏标了反而会让模型学会“看到一半就放弃”;三是类别不平衡问题,像“积水”“吸烟”这类监控场景,负样本远多于正样本,训练时要注意通过数据增强或者类别权重来平衡。

3.2 训练参数选择与损失函数的潜台词

很多人喜欢在网上抄训练参数,其实更值得花时间理解的是 YOLO 的损失函数在干什么。YOLO 的损失函数由三部分构成:box 损失(衡量预测框和真实框的位置差异,YOLOv8 用 CIoU 或 DFL 之类)、类别损失(分类是否准确)、置信度损失(判断有没有目标)。这三部分加起来作为梯度回传的依据。

参数方面,img size 我一般用 640,batch size 在显存允许的情况下尽量大一些,epochs 根据数据量而定,小数据集 100 到 200 就够,大一点的数据集 300 起。启动学习率 lr0 默认 0.01 左右,配合 cos 衰减效果会比较稳。真正需要重点调的是 mosaic 增强的概率,视频场景中目标往往伴随着运动模糊,建议开启 mosaic 和 mixup 来模拟画面复杂度,提高模型在实际视频帧上的泛化能力。

如果你的训练集是纯静态图片,模型部署到视频流上很容易掉点,原因就在这:视频帧本质上是时间序列上的连续图像,有运动模糊、有低码率压缩伪影,这些都是普通图片数据里很少见的。要么在训练时加入真实视频帧数据,要么在做数据增强时加入模糊、压缩噪声这类操作。

3.3 模型导出:从 PyTorch 到 ONNX 再到 TensorRT

模型训练完成后,部署到推理服务之前要先导出。最稳妥的路径是 PyTorch 模型导出为 ONNX,再根据推理后端决定是否进一步转成 TensorRT 或 RKNN。ONNX 是一个中间格式,类似“通用语言”,方便在不同框架之间切换。

# 导出 ONNX,opset 建议设为 12 或更高,simplify 可以去掉一些冗余算子 yolo export model=best.pt format=onnx opset=12 simplify=True

在 x86 GPU 部署时,ONNX Runtime 就可以直接跑,但如果追求极致性能,建议继续转 TensorRT。TensorRT 会把模型结构做层融合和精度校准,FP16 下推理速度大约能比 ONNX Runtime 快 30% 到 50%。INT8 量化更快,但需要准备校准数据集,否则精度可能掉得很惨。在嵌入式设备上部署时,就要走另一条路:RK3588 这类芯片官方只认 RKNN 格式,用 rknn-toolkit2 把 ONNX 转成 RKNN,而且转出来之后要挨个算子验证支持度,很多自定义算子会不被支持,需要回退到 CPU 执行,那性能就崩了。

这里多提醒一句:导出之后一定要用验证脚本对比 PyTorch 模型和导出模型的输出差异,特别是转 INT8 之后,建议准备一个小的验证集,把 mAP 算一遍。我遇到过转完 TensorRT 后模型精度从 0.89 掉到 0.82 的情况,排查了半天发现是某些层在 TensorRT 里被融合时空掉了边界处理,只能调整转换参数。

4. 实操:SmartMediaKit 和 YOLO 的完整集成过程

4.1 整体流程分步拆解

集成过程我把它总结成六步,每一步都对应着实际要解决的问题。

第一步,部署 SmartMediaKit 媒体服务,把基础能力盘活:将摄像头 RTSP 流接入 SmartMediaKit,通过配置拉流地址让它在后台建立稳定连接,同时开启按需拉流,避免没有客户端观看时还一直占带宽和 CPU。

第二步,验证前端预览链路。用播放器拉 WebRTC 或 HLS 流,确认画面秒开、延迟在可接受范围内,这一步不通过,后面 AI 集成再漂亮都是空中楼阁。

第三步,打通帧消费接口。SmartMediaKit 提供解码帧的回调方式,你需要拿到原始视频帧,注意这里拿到的帧最好是解码后的 YUV 数据或者 RGB 数据,而不是压缩编码数据,否则 AI 模块还得自己解一遍。

第四步,实现推理服务。推理服务内部做预处理、模型推理、后处理,然后把结果封装成统一结构。

第五步,把结果回传给 SmartMediaKit 或者业务后端。如果是需要在预览画面叠加检测框,就把结果结构回传给媒体模块做视频合帧;如果是业务系统要做事件处理,就把结果通过 HTTP 回调或者消息队列推出去。

第六步,端到端压测。至少并发 6 路摄像头,跑 24 小时以上,观察延迟、内存、显存、是否断流重连正常,这一步能帮你发现大量单路验证时发现不了的问题。

4.2 帧采样策略和跳帧参数怎么定

帧采样是整个集成里最容易被忽视但影响最大的一个参数。按 25fps 的摄像头来算,每秒 25 帧,如果全部送推理,一秒钟要做 25 次推理,10 路每秒就是 250 次,再加预处理、后处理和回传,再好的 GPU 也会被拖死。

我的跳帧策略是:推理频率按时间间隔走,默认每秒 5 帧。也就是每 200 毫秒取一帧做推理,其他帧直接丢弃。为什么按时间而不是按帧数?因为摄像头帧率会有波动,按帧数跳容易在高帧率摄像头下推理过快,在低帧率摄像头下推理过慢,按时间间隔是最稳的。在做实时报警的场景下,5 fps 已经足够覆盖大多数异常事件,比如吸烟、区域入侵、积水检测等,目标从出现到离开画面至少持续几百毫秒,5 fps 是能捕捉到的。

如果目标是快速移动的小物体,比如飞鸟或者高速车辆,再把推理频率提到 10 fps 甚至 15 fps,但代价是性能成倍下降,所以需要结合业务场景平衡。帧消费端和推理端之间建议加一个带缓存的队列,队列有上限,满了就丢最老的帧,保证推演链路的实时性。

4.3 简化版代码流程参考

下面的代码是我在项目里抽象出来的一个简化流程,屏蔽了具体 SDK 的操作细节,重点展示整个数据链路是怎么走的:

import numpy as np import onnxruntime as ort # 初始化推理引擎 session = ort.InferenceSession("best.onnx", providers=["CUDAExecutionProvider"]) input_name = session.get_inputs()[0].name def on_video_frame(frame_rgb): # 1. 预处理:resize 到模型输入尺寸,归一化 resized = preprocess(frame_rgb, size=(640, 640)) input_tensor = np.expand_dims(resized, axis=0).astype(np.float32) # 2. 推理 outputs = session.run(None, {input_name: input_tensor}) # 3. 后处理:NMS 得到最终检测框 detections = postprocess(outputs[0], conf_threshold=0.25, iou_threshold=0.45) # 4. 结果回传(这里可以发到消息队列,也可以回调 SmartMediaKit 做合帧) publish_detections(detections) return detections # SmartMediaKit 在收到解码帧后调用 on_video_frame # smart_media_kit.set_frame_listener(on_video_frame)

这段流程虽然简单,但已经把链路串起来了:预处理、推理、后处理、结果回传。真正的项目中,帧数据来源是 SmartMediaKit,输出端可能是 Kafka 或者 WebSocket,但主干就是这个结构。需要小心的是,预处理时不要用 Python 循环逐像素操作,要用 OpenCV 的向量化操作或者 GPU 张量操作,否则性能会差很多。

4.4 结果回显和业务联动的小技巧

AI 检测结果怎么和业务系统联动,这是项目最终要交付的价值。第一种方式是把检测框叠加到原始视频上,输出一路带标注的 RTSP/WebRTC 流,推荐在 SmartMediaKit 侧做视频合帧,不要另外做一路编码,减少一次编码延迟。第二种方式是只推送事件数据,比如检测到吸烟行为,就把时间戳、摄像头 ID、检测框坐标、抓拍图片推给业务平台,由业务平台去弹窗、发短信、做数据留存。

两种方式不是互斥的,实际项目里经常同时用。给个小建议:事件数据结构最好标准化,比如用 JSON 定义好 camera_id、frame_ts、detections 这些字段,这样后续换算法模型时业务系统不用跟着改。

5. 常见问题与排障记录:从延迟毛刺到长期运行稳定性

5.1 端到端延迟高,怎么快速定位瓶颈点

端到端延迟是我被问得最多的问题。延迟可以拆成好几段:网络传输延迟、解码延迟、推理延迟、编码延迟、播放缓冲延迟。最常见的锅不是推理,而是播放器缓冲。

排查办法很简单:在各个环节打时间戳,从摄像头编码后生成 PTS 开始,到拉流模块收到流、到解码完成、到推理模块收到帧、到推理输出、到合帧推流,全部打印出来,测量每段耗时。实测经验值供参考:局域网 RTSP 本身的传输延迟大约在 100 到 300 毫秒之间;解码一帧 1080p H.264 的耗时大约 5 到 10 毫秒;YOLOv8s 在 GPU 上推理单帧 8 到 15 毫秒;合帧编码再加 5 到 8 毫秒。

如果你发现总延迟达到 3 秒以上,先别盯着推理优化,去查播放器和上行服务器缓存。VLC 之类的播放器默认缓冲就有 1 到 2 秒,HLS 切片更是固定增加 2 到 3 秒延迟。低延迟场景一定要用 WebRTC,或者把播放器缓冲关掉。另外注意 I 帧间隔 GOP 大小,GOP 太大导致切片延迟增加,建议 GOP 设置为帧率的一到两秒以内。

5.2 多路并发时的性能规划

多路并发才是真实场景,单路跑通不算本事。我整理过一份经验估算表,用一块 8GB 显存的 GPU 做参考:

并发路数推理频率显存占用整体 CPU 负载经验结论
6 路5 fps约 1.5 GB中等很轻松,CPU 主要消耗在解码
12 路5 fps约 2.5 GB偏高可以跑,但要盯着延迟波动
24 路5 fps约 4 GB很高建议增加一跳帧,或上双 GPU

解码开销经常被忽视,推流和解码主要吃 CPU,GPU 反而并不忙。很多项目的瓶颈不是推理而是 CPU 解码不够。解决办法是开启硬解码,比如 NVDEC 或者 Rockchip 的硬件解码能力,这会极大降低 CPU 占用。另外在显存有限的情况下,要注意及时释放帧数据和推理结果,Python 的 GC 有时候不靠谱,可以手动把大对象置空并调用显存回收。

5.3 模型在真实视频流上精度掉点的排查思路

现象:测试图片上 mAP 0.9 的模型,接到摄像头后各种漏检误检。最典型的原因是训练数据和真实视频帧的分布差异:摄像头画面往往有运动模糊、夜间噪点、码率压缩导致的马赛克伪影。如果你用的是可见光相机,还有白平衡变化、逆光等问题。

对策一般是三条:第一,模型训练数据里加入现场采集的真实视频帧,至少占 30%,如果拿不到真实帧,就用数据增强模拟;第二,把推理时使用的图像预处理和训练时对齐,比如均值和方差策略要保持一致,否则颜色偏移会导致特征偏移;第三,检查推理时的置信度阈值,视频场景因为画面复杂,置信度阈值往往要调到 0.3 到 0.4 之间,而不是训练时默认的 0.25。

我踩过一个很隐蔽的坑:摄像头流是 BGR 顺序,训练数据是 RGB 顺序,我在 OpenCV 读帧后忘了转换颜色通道,结果模型把所有目标都误检成另一类东西。这个 bug 排查了整整一天,一看代码才发现cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)漏写了。所以提醒大家:模型输入通道顺序一定要检查,RGB 还是 BGR,在推理服务里写死并注释清楚。

5.4 长时间运行的稳定性:内存泄漏和断线重连

实时视频服务是要 7x24 小时跑的,稳定性比功能更重要。常见问题排名第一的是内存泄漏。帧数据是最大的元凶,如果你在帧处理函数里保存了过多的历史帧或者没释放的 Mat 对象,跑几个小时内存就爆了。解决方法是严格控制帧引用,处理完立刻置空,不要长期持有。

第二个高发问题是流重连。摄像头 IP 变化的场景比较少见,但摄像头死机重启很常见。SmartMediaKit 这类媒体层一般内置了自动重连机制,但有一些摄像头断流后需要发送 RTSP 的 TEARDOWN 或者重新 DESCRIBE 才能正常恢复。如果发现某路摄像头断流后重连失败,可以试试在重连前强制关闭旧的拉流会话,等待 2 到 3 秒再重新建立连接。

第三个问题是显存碎片。长时间推理后显存占用会慢慢上涨,但又不直接爆掉,这种情况在 TensorRT 和 ONNX Runtime 上都可能出现。经验做法是给推理服务设置一个定时重启机制,比如每天凌晨业务低峰期自动重启一次推理 worker。这个建议虽然有点“简单粗暴”,但在生产环境里非常有效,能省掉大量排查显存碎片的时间。

5.5 记录一次典型的现场事故

最后分享一个我实际遇到的事故,用来佐证上面这些注意事项。项目上线第四天,客户反馈有两路摄像头画面正常但没有任何检测结果。我远程查了一下,日志显示这两路摄像头画面一直没断过,但 AI 模块始终没有输出。

排查过程如下:先看推理服务的帧监听数,发现只有这两路没有帧数据;再看 SmartMediaKit 日志,这两路流的拉流地址在某个时间点之后变成了 401 认证失败。一查才发现是摄像头密码过期了,但媒体服务因为之前已建立连接,一直维持着旧会话没有重新认证,直观表现就是“有画面但没数据”。解决方法是给这两个摄像头改密码,同时在 SmartMediaKit 侧把认证失败的错误码接入告警,这样以后摄像头密码变化能第一时间收到通知。

这件事给我们的最大提醒是:视频 AI 项目里,问题很多时候不在 AI 本身,而在媒体链路的细节上。拉流认证、流中断、解码失败这些都属于“非 AI 问题”,但它们会直接让 AI 失效。所以做这类项目,一定要把监控报警体系做起来,特别是媒体层和推理层的日志要分开收集、单独告警。

6. 经验总结与扩展建议

这个项目做完,我最大的体会是:实时视频 AI 的复杂度并不在模型,而在工程。YOLO 本身已经很成熟了,训练也好,部署也好,都有大量现成方案可以抄。但把 YOLO 真正放进一条 7x24 小时不间断的视频流里,同时保证低延迟、高并发、稳定运行,这是需要认真设计的事情。

从方法论层面,我特别想强调一点:媒体层和推理层一定要解耦。SmartMediaKit 负责视频接入、分发、合帧、推流,YOLO 推理服务单独部署,两个模块之间通过标准化的接口通信。这样无论是换模型、换推理框架、还是扩容,都不会互相拖累。你甚至可以今天用 YOLOv8,明天无缝换成 YOLO11,只要推理服务对外输出的结果结构不变,上游业务完全无感。

如果你是从零开始做类似项目,我建议按这个顺序走:先把 SmartMediaKit 的拉流和预览链路跑通,再只接一路视频流把 AI 推理接上,端到端跑通后,再考虑多路并发、性能优化、监控报警。不要一上来就铺开几十路同时优化,否则连问题出在哪都定位不准。

最后再分享一个我觉得最值钱的经验:项目启动时,先把视频帧和 AI 结果的协议定死。我指的是每路流的帧数据怎么标识、检测结果的 JSON 结构长什么样、错误码怎么定义。这些约定好在项目早期花不了半天时间,但能避免后期反复返工。我见过太多项目,模型已经训练完了,应用方还在为“检测框坐标是基于原始分辨率还是模型输入分辨率”扯皮。提前把这些约定写进接口文档,后面换模型、换摄像头、加新算法,都只是沿着既定跑道往前跑而已。

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

RemoveWindowsAI:一条命令完整移除 Windows 11 的 AI 功能

RemoveWindowsAI:一条命令完整移除 Windows 11 的 AI 功能 【免费下载链接】RemoveWindowsAI Force Remove Copilot, Recall and More in Windows 11 项目地址: https://gitcode.com/GitHub_Trending/re/RemoveWindowsAI 更新之后,多出来的 Copil…

作者头像 李华
网站建设 2026/9/13 15:48:05

Win11搭建IIS运行ASP药店管理系统:配置步骤与答辩要点

简介:一份面向ASP课程设计或毕业设计的药店管理系统完整项目包,适合计算机相关专业学生参考并二次开发。系统采用ASP数据库的B/S架构,覆盖商品管理、库存控制、销售记录、客户管理与管理员权限等核心业务,能帮助理解动态网页与数据…

作者头像 李华
网站建设 2026/9/13 15:46:10

YOLOv8-v12农业AI落地:SpringBoot模型热插拔与端侧千问+DeepSeek实践

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

作者头像 李华