树莓派4B部署YOLOv5模型:OpenVINO与NCS2加速全流程实践
1. 项目缘起与核心价值最近在折腾一个边缘计算项目核心需求是在一个功耗和算力都受限的嵌入式设备上稳定地跑一个自己训练的目标检测模型。树莓派4B这个老朋友自然成了首选平台。但直接上PyTorch跑YOLOv5即便是轻量级的nano或s模型在640x640的输入分辨率下帧率也常常是个位数实时性根本无从谈起。这时候英特尔的神经计算棒2代NCS2就进入了视野它主打的就是在边缘端为OpenVINO框架下的模型提供硬件加速。于是一个完整的链路就清晰了在自己的主力机上用PyTorch训练好YOLOv5模型然后将其转换为OpenVINO的中间表示格式最后部署到树莓派4B上并利用NCS2进行推理加速。这听起来像是一个标准的流水线但真正走一遍你会发现从环境配置、模型转换到最后的性能调优每一步都有不少细节和“坑”需要留意。这篇文章我就把自己从零开始完成这个全流程的实践记录和心得分享出来希望能帮你绕过我踩过的那些坑更顺畅地完成部署。2. 环境准备树莓派系统与基础依赖在开始任何软件操作之前硬件和系统层面的准备是基石。这一步的稳定性直接决定了后续所有步骤能否顺利进行。2.1 树莓派系统选择与初始化对于树莓派4B官方推荐的64位系统Raspberry Pi OS原Raspbian是兼容性和社区支持最好的选择。我强烈建议使用Raspberry Pi OS Lite (64-bit)这个无桌面环境的版本。原因很简单我们的核心任务是模型推理服务不需要图形界面消耗宝贵的CPU和内存资源。更精简的系统意味着更少的后台进程、更快的启动速度和更稳定的运行环境。下载系统镜像后使用 Raspberry Pi Imager 工具烧录到 microSD 卡。这里有一个关键步骤在烧录前通过 Imager 的“高级选项”齿轮图标预先启用 SSH 并设置好主机名、用户名和密码。这样烧录完成后你就能直接通过网络 SSH 连接到树莓派无需连接显示器和键盘这对于将树莓派作为无头服务器运行至关重要。首次启动并 SSH 登录后第一件事是执行系统更新和必要的区域设置sudo apt update sudo apt upgrade -y sudo raspi-config在raspi-config中我通常会做这几项设置扩展文件系统确保SD卡的所有空间都被利用。内存分配由于不使用桌面可以将GPU内存Memory Split设置为最小如16MB将更多内存留给系统。本地化选项设置正确的时区、键盘布局。性能选项可以适当超频。对于4B将Arm Freq超频到2000MHzOver Voltage设置为6在我的散热条件下可以稳定运行能带来约15%的CPU性能提升对后续的模型转换等步骤有积极影响。但超频有风险需确保散热良好。2.2 安装Python与核心编译工具树莓派OS自带了Python 3.9这已经足够。我们需要安装Python虚拟环境管理工具venv和pip以及后续编译OpenCV等库所需的构建工具。sudo apt install -y python3-venv python3-pip sudo apt install -y build-essential cmake pkg-config sudo apt install -y libjpeg-dev libtiff5-dev libjasper-dev libpng-dev sudo apt install -y libavcodec-dev libavformat-dev libswscale-dev libv4l-dev sudo apt install -y libxvidcore-dev libx264-dev sudo apt install -y libfontconfig1-dev libcairo2-dev sudo apt install -y libgdk-pixbuf2.0-dev libpango1.0-dev sudo apt install -y libgtk2.0-dev libgtk-3-dev sudo apt install -y libatlas-base-dev gfortran sudo apt install -y libhdf5-dev libhdf5-serial-dev libhdf5-103 sudo apt install -y libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5 sudo apt install -y libopenblas-dev libopenblas-base这一长串命令安装了编译OpenCV所需的大部分依赖。其中libatlas-base-dev和libopenblas-dev提供了优化的线性代数库对后续的数值计算至关重要。2.3 创建并激活Python虚拟环境始终在虚拟环境中工作是一个好习惯它能避免系统Python环境的污染。python3 -m venv ~/yolov5_openvino_env source ~/yolov5_openvino_env/bin/activate激活后命令行提示符前会出现(yolov5_openvino_env)标识。请确保在后续所有操作中该虚拟环境都处于激活状态。3. 安装与配置OpenVINO工具套件OpenVINO是英特尔推出的用于优化和部署AI推理的工具套件它包含了模型优化器和推理引擎。我们的核心任务就是用它来转换和加速YOLOv5模型。3.1 安装OpenVINO Runtime在树莓派上我们通常只安装运行时所必须的组件而非完整的开发套件。英特尔提供了针对ARM架构的预编译包。pip install --upgrade pip pip install openvino2023.0.0这里我指定了2023.0.0版本因为经过测试这个版本与后续的模型转换步骤兼容性较好。安装完成后可以验证一下python -c from openvino.runtime import Core; print(Core().available_devices)如果输出中包含MYRIAD即NCS2说明OpenVINO运行时安装成功并能识别到神经计算棒。3.2 安装OpenCV with OpenVINO支持虽然可以通过pip install opencv-python快速安装OpenCV但为了获得更好的性能以及与OpenVINO的深度集成例如使用OpenVINO作为后端进行图像预处理我选择从源码编译OpenCV。这是一个耗时的过程在树莓派4B上可能需要数小时但收益显著。首先下载OpenCV和OpenCV contrib的源码以4.8.0版本为例cd ~ wget -O opencv.zip https://github.com/opencv/opencv/archive/4.8.0.zip wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.8.0.zip unzip opencv.zip unzip opencv_contrib.zip mv opencv-4.8.0 opencv mv opencv_contrib-4.8.0 opencv_contrib然后创建构建目录并配置CMake。这是最关键的一步配置选项决定了编译出的OpenCV具备哪些功能。cd ~/opencv mkdir build cd build cmake -D CMAKE_BUILD_TYPERELEASE \ -D CMAKE_INSTALL_PREFIX/usr/local \ -D OPENCV_EXTRA_MODULES_PATH~/opencv_contrib/modules \ -D ENABLE_NEONON \ -D ENABLE_VFPV3ON \ -D BUILD_TESTSOFF \ -D BUILD_PERF_TESTSOFF \ -D BUILD_EXAMPLESOFF \ -D WITH_OPENVINOON \ -D OPENCV_DNN_OPENVINOON \ -D WITH_INF_ENGINEON \ -D BUILD_opencv_python3ON \ -D PYTHON3_EXECUTABLE$(which python3) \ -D PYTHON3_INCLUDE_DIR$(python3 -c from distutils.sysconfig import get_python_inc; print(get_python_inc())) \ -D PYTHON3_LIBRARY$(python3 -c from distutils.sysconfig import get_config_var; import os; print(os.path.join(get_config_var(LIBDIR), get_config_var(LDLIBRARY)))) \ -D PYTHON3_NUMPY_INCLUDE_DIRS$(python3 -c import numpy; print(numpy.get_include())) \ -D PYTHON3_PACKAGES_PATH$(python3 -c from distutils.sysconfig import get_python_lib; print(get_python_lib())) \ ..关键选项解析-D WITH_OPENVINOON和-D OPENCV_DNN_OPENVINOON启用OpenVINO支持允许OpenCV的DNN模块使用OpenVINO作为后端之一。-D ENABLE_NEONON启用ARM NEON SIMD指令集加速对树莓派的ARM CPU性能提升巨大。-D WITH_INF_ENGINEON启用推理引擎支持旧版名称与OPENVINO同时开启即可。一系列的PYTHON3_*参数确保编译出的OpenCV Python绑定正确安装到我们当前的虚拟环境中。配置完成后开始编译和安装make -j$(nproc) # 使用所有核心编译加快速度 sudo make install sudo ldconfig编译完成后在Python虚拟环境中测试是否成功并确认OpenVINO后端可用python -c import cv2; print(cv2.__version__); print([b for b in cv2.dnn.DNN_BACKEND_OPENVINO])4. 准备YOLOv5模型从训练到导出部署的起点是一个训练好的YOLOv5模型。这部分工作通常在性能更强的开发机如带GPU的电脑上完成。4.1 训练自定义YOLOv5模型假设你已经在自己的数据集上完成了YOLOv5模型的训练。这里有几个关键点直接影响后续部署模型尺寸选择YOLOv5提供了n、s、m、l、x等不同尺寸的模型。对于树莓派NCS2YOLOv5s是最佳平衡点。它参数量较小约7.2M在NCS2上能达到较高的帧率同时精度对于许多应用场景也足够。YOLOv5n更小但精度损失可能较大更大的模型m/l/x则可能无法在NCS2上运行内存不足或速度很慢。输入分辨率训练时指定的--img参数如640。部署时的推理分辨率必须与训练时一致。NCS2对输入尺寸固定的模型优化更好。通常使用640x640。模型输出训练完成后在runs/train/exp/weights/目录下你会得到best.pt验证集上性能最好的权重和last.pt最后一次训练的权重。我们使用best.pt进行部署。4.2 导出模型为OpenVINO格式这是连接PyTorch训练和OpenVINO部署的桥梁。我们需要使用YOLOv5官方仓库中的export.py脚本。首先在开发机上克隆YOLOv5仓库并安装依赖确保有PyTorch环境git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt然后运行导出脚本。这里有一个至关重要的参数--include。python export.py --weights path/to/your/best.pt --include onnx openvino命令详解--weights: 指定训练好的PyTorch模型权重文件路径。--include onnx openvino: 告诉脚本同时导出ONNX和OpenVINO格式的模型。脚本会先导出为ONNX然后自动调用OpenVINO的模型优化器MO将ONNX转换为OpenVINO的IR格式.xml和.bin文件。其他有用参数--img 640: 指定输入图像尺寸需与训练一致。--batch 1: 指定批处理大小。对于边缘部署通常设为1。--simplify: 对ONNX模型进行简化可能减少转换错误。--opset 12: 指定ONNX算子集版本。对于OpenVINO 2023.012或13是安全的选择。执行成功后你会在权重文件同目录下得到best.onnx: ONNX格式模型。best_openvino_model/目录内含best.xml模型结构和best.bin模型权重以及一个best.mapping文件。踩坑记录动态维度问题YOLOv5默认导出的ONNX模型输入输出可能是动态维度的batch、height、width为变量。而一些版本的OpenVINO模型优化器或运行时对动态维度的支持可能不完善尤其在NCS2上。如果遇到转换失败或推理错误可以在导出时固定维度python export.py --weights path/to/best.pt --include onnx --dynamic # 然后使用OpenVINO的mo工具单独转换并指定静态形状 mo --input_model best.onnx --input_shape [1,3,640,640] --data_type FP16但更推荐使用YOLOv5export.py直接导出OpenVINO格式它内部的封装处理了很多兼容性问题。5. 模型部署与NCS2加速推理将生成的best.xml和best.bin文件拷贝到树莓派上。接下来就是在树莓派上编写推理脚本并利用NCS2进行加速。5.1 推理脚本编写预处理、推理、后处理一个完整的推理流程包含三个步骤图像预处理、模型推理、输出后处理。下面是一个核心代码框架import cv2 import numpy as np import time from openvino.runtime import Core class YOLOv5OpenVINO: def __init__(self, model_xml, deviceMYRIAD, conf_thres0.25, iou_thres0.45): 初始化模型 :param model_xml: OpenVINO IR模型.xml文件路径 :param device: 推理设备MYRIAD为NCS2CPU为树莓派CPU :param conf_thres: 置信度阈值 :param iou_thres: NMS的IoU阈值 self.conf_threshold conf_thres self.iou_threshold iou_thres self.device device # 1. 加载模型 core Core() self.model core.read_model(modelmodel_xml) self.compiled_model core.compile_model(modelself.model, device_namedevice) self.infer_request self.compiled_model.create_infer_request() # 2. 获取输入输出信息 self.input_layer self.compiled_model.input(0) self.output_layer self.compiled_model.output(0) self.input_shape self.input_layer.shape # [1, 3, H, W] self.input_size (self.input_shape[2], self.input_shape[3]) # (H, W) self.num_classes self.output_layer.shape[2] - 5 # 根据你的模型调整 # 3. 准备颜色映射等用于画框 self.colors np.random.uniform(0, 255, size(self.num_classes, 3)) def preprocess(self, image): 将输入图像预处理为模型需要的格式 :param image: 原始BGR图像 (H, W, C) :return: 预处理后的blob (1, 3, H, W) # 调整大小并保持纵横比填充灰边 h, w image.shape[:2] scale min(self.input_size[0] / h, self.input_size[1] / w) new_h, new_w int(h * scale), int(w * scale) resized cv2.resize(image, (new_w, new_h), interpolationcv2.INTER_LINEAR) # 创建画布并填充 canvas np.full((self.input_size[0], self.input_size[1], 3), 114, dtypenp.uint8) top (self.input_size[0] - new_h) // 2 left (self.input_size[1] - new_w) // 2 canvas[top:topnew_h, left:leftnew_w, :] resized # 转换颜色通道 BGR - RGB并归一化 blob canvas[:, :, ::-1].transpose(2, 0, 1).astype(np.float32) / 255.0 blob np.expand_dims(blob, axis0) # 添加batch维度 return blob, (scale, (left, top)), (h, w) def infer(self, blob): 执行模型推理 :param blob: 预处理后的图像数据 :return: 模型原始输出 self.infer_request.infer(inputs{self.input_layer.any_name: blob}) outputs self.infer_request.get_output_tensor(self.output_layer.index).data return outputs def postprocess(self, outputs, preprocess_info, orig_shape): 对模型输出进行后处理过滤低置信度框NMS坐标转换 :param outputs: 模型原始输出 [1, num_boxes, 85] :param preprocess_info: (scale, (pad_left, pad_top)) :param orig_shape: 原始图像尺寸 (h, w) :return: 检测结果列表 [(x1, y1, x2, y2, conf, cls_id), ...] scale, pad preprocess_info pad_left, pad_top pad detections [] # 遍历所有预测框 for pred in outputs[0]: # pred: [center_x, center_y, width, height, obj_conf, class_conf_1, ..., class_conf_n] obj_conf pred[4] if obj_conf self.conf_threshold: continue # 找到最大类别置信度 class_scores pred[5:] class_id np.argmax(class_scores) cls_conf class_scores[class_id] conf obj_conf * cls_conf # 综合置信度 if conf self.conf_threshold: continue # 解码边界框坐标 (相对于输入网络图像的尺寸) cx, cy, bw, bh pred[:4] x1 (cx - bw / 2) y1 (cy - bh / 2) x2 (cx bw / 2) y2 (cy bh / 2) # 将坐标转换回原始图像尺寸 x1 int((x1 - pad_left) / scale) y1 int((y1 - pad_top) / scale) x2 int((x2 - pad_left) / scale) y2 int((y2 - pad_top) / scale) # 确保坐标在图像范围内 x1, y1 max(0, x1), max(0, y1) x2, y2 min(orig_shape[1], x2), min(orig_shape[0], y2) if x2 x1 or y2 y1: continue detections.append([x1, y1, x2, y2, conf, class_id]) # 非极大值抑制 (NMS) if len(detections) 0: boxes np.array([d[:4] for d in detections]) scores np.array([d[4] for d in detections]) indices cv2.dnn.NMSBoxes(boxes.tolist(), scores.tolist(), self.conf_threshold, self.iou_threshold) if len(indices) 0: indices indices.flatten() final_detections [detections[i] for i in indices] return final_detections return [] def draw_detections(self, image, detections): 在图像上绘制检测框和标签 for (x1, y1, x2, y2, conf, cls_id) in detections: color self.colors[cls_id] label fClass_{cls_id}: {conf:.2f} cv2.rectangle(image, (x1, y1), (x2, y2), color, 2) cv2.putText(image, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2) return image # 使用示例 if __name__ __main__: # 初始化检测器指定使用MYRIAD设备NCS2 detector YOLOv5OpenVINO(model_xmlbest.xml, deviceMYRIAD) # 读取图像 img cv2.imread(test.jpg) orig_h, orig_w img.shape[:2] # 预处理 blob, preprocess_info, orig_shape detector.preprocess(img) # 推理 start time.time() outputs detector.infer(blob) inference_time time.time() - start # 后处理 detections detector.postprocess(outputs, preprocess_info, (orig_h, orig_w)) # 绘制并显示 result_img detector.draw_detections(img, detections) print(fInference time: {inference_time*1000:.2f} ms) print(fDetected {len(detections)} objects.) cv2.imshow(Result, result_img) cv2.waitKey(0) cv2.destroyAllWindows()5.2 NCS2特定配置与性能调优将设备指定为MYRIAD只是开始要让NCS2发挥最佳性能还需要注意以下几点模型精度NCS2主要支持FP16半精度浮点数推理。在导出OpenVINO模型时默认就是FP16。确保你的模型是FP16格式可以在加载模型后检查print(self.input_layer.element_type) # 应显示 Type.f16FP16在NCS2上比FP32快得多且精度损失对于目标检测通常可接受。温度与散热NCS2在持续高负载下会发热。过热会导致设备降频甚至断开连接。确保树莓派和NCS2有良好的通风环境可以考虑加装小型散热片或风扇。在代码中可以加入温度监控通过pyusb或lsusb解析但较复杂更简单的方法是监控设备是否稳定。批处理NCS2对批处理Batch的支持有限且批处理不一定能线性提升吞吐量。对于实时视频流通常设置batch1。如果是处理图片队列可以尝试batch4或8但需要测试实际性能提升。多棒并行如果你有多个NCS2OpenVINO支持将它们作为一个设备池使用理论上可以提升吞吐量。在初始化时指定device_nameMULTI:MYRIAD.1.2-MYRIAD.1.3假设设备ID为1.2和1.3。但需要注意负载均衡和同步开销实际增益需要测试。避免频繁加载/卸载模型创建YOLOv5OpenVINO类实例即加载模型是一个相对耗时的操作。应该在程序初始化时完成一次然后在循环中重复使用infer方法。6. 实测性能分析与对比理论归理论实际性能如何才是关键。我在树莓派4B4GB内存超频至2.0GHz上使用YOLOv5s模型640x640输入对同一张测试图片进行100次连续推理取平均时间得到以下数据推理设备平均推理时间 (ms)平均FPS备注树莓派4B CPU~450 - 550 ms~1.8 - 2.2 FPS使用OpenVINO CPU插件4线程英特尔NCS2~90 - 120 ms~8.3 - 11.1 FPS模型精度为FP16NCS2 (带预处理)~110 - 140 ms~7.1 - 9.1 FPS包含图像缩放、填充等CPU操作性能解读与瓶颈分析显著加速NCS2将推理速度提升了约4-5倍从勉强可用的2FPS提升到了接近实时的10FPS左右。这对于很多需要一定实时性的边缘应用如智能监控、机器人视觉引导是一个质的飞跃。瓶颈转移在使用NCS2后图像预处理CPU操作成为了新的瓶颈。从表中可以看出纯NCS2推理约100ms但加上预处理后总时间增加了20-30ms。预处理时间取决于输入图像的分辨率。优化预处理逻辑如使用OpenCV的UMat、尝试不同的插值算法可以稍微改善。功耗考量NCS2的功耗大约为1-2W树莓派4B满载约6-8W总功耗仍在10W左右非常适合电池供电或低功耗场景。对比其他方案如果使用TensorFlow Lite配合 Coral USB AcceleratorEdge TPU在同类模型上可能获得更高的FPS15-20。但NCS2的优势在于其通过OpenVINO对多种框架模型ONNX, TensorFlow, PyTorch等的良好支持且价格通常更有竞争力。7. 常见问题排查与优化建议在实际部署过程中你几乎一定会遇到一些问题。下面是我总结的一些常见问题及其解决方法。7.1 NCS2设备无法识别或初始化失败现象运行脚本时报错提示找不到MYRIAD设备或初始化失败。检查物理连接确保NCS2牢固地插入树莓派的USB 3.0蓝色端口。USB 2.0供电可能不足且速度慢。检查USB权限将当前用户加入users组或创建udev规则。sudo usermod -a -G users $(whoami) # 然后重新登录或重启查看设备列表lsusb | grep -i myriad # 或使用OpenVINO工具 python -c from openvino.runtime import Core; print(Core().available_devices)供电问题树莓派USB口供电能力有限。如果连接了其他高功耗USB设备如硬盘可能导致NCS2供电不稳。尝试使用外接供电的USB Hub或者确保树莓派电源适配器是足额的5V/3A。7.2 模型转换或加载失败现象在导出ONNX/OpenVINO模型或树莓派上加载.xml文件时出错。版本匹配确保开发机上用于导出模型的openvino-dev或openvino版本与树莓派上安装的openvino运行时版本尽量一致。跨大版本转换和部署有时会有兼容性问题。简化模型如果从ONNX转换失败尝试在导出ONNX时加上--simplify和--opset 12参数。检查模型输入输出使用Netron工具pip install netron打开生成的.onnx或.xml文件检查输入输出层的名称和形状是否符合预期。错误信息仔细阅读错误信息。OpenVINO的错误信息有时比较晦涩但关键词如Unsupported operation、Shape mismatch能指明方向去OpenVINO的官方GitHub Issues搜索往往能找到答案。7.3 推理结果异常框不准、无检测现象模型能跑通但检测框错位、巨大、或者完全检测不到目标。预处理/后处理不匹配这是最常见的原因。确保你的预处理归一化、通道顺序、填充方式和训练时完全一致。YOLOv5默认使用RGB通道顺序和0-1的归一化。我的代码中blob canvas[:, :, ::-1].transpose(2, 0, 1).astype(np.float32) / 255.0就对应了这个操作。坐标转换错误后处理中将网络输出坐标转换回原始图像坐标时必须考虑预处理时进行的缩放和填充。代码中的scale和pad_left、pad_top就是用于这个计算。仔细核对这部分数学。置信度阈值调整conf_thres参数。训练好的模型在实际场景中可能需要不同于训练验证阶段的阈值。NMS参数调整iou_thres参数。对于密集小目标可能需要降低IoU阈值以防止漏检。7.4 性能未达预期现象FPS远低于上文提供的参考值。测量方法确保你测量的是纯推理时间infer函数内部而不是包含预处理、后处理和显示的总时间。显示cv2.imshow尤其耗时。CPU频率检查树莓派CPU是否因过热而降频。安装vcgencmd工具监控vcgencmd measure_temp vcgencmd measure_clock arm关闭无关进程关闭树莓派上不必要的后台服务如蓝牙、桌面环境如果你用的是桌面版。尝试CPU推理对比将设备改为CPU看看CPU推理时间是否正常。如果CPU推理也慢可能是预处理代码效率问题。NCS2发热触摸NCS2是否烫手过热会导致性能下降。暂停推理几分钟后再测试。7.5 内存不足OOM错误现象运行过程中树莓派卡死或报内存错误。模型太大YOLOv5m或更大的模型可能无法在NCS2上运行。NCS2的VPU内存有限。坚持使用YOLOv5s或YOLOv5n。树莓派内存分配如果你使用了桌面版系统可以尝试通过raspi-config减少分配给GPU的内存如降到16MB。监控内存使用使用htop命令监控内存和交换分区使用情况。如果交换频繁说明物理内存不足考虑关闭其他程序或优化代码。整个流程走下来从训练模型到在边缘设备上跑出效果最深的体会就是“细节决定成败”。模型转换时的一个参数、预处理时的一个通道顺序、后处理时的一个坐标计算都可能让最终结果天差地别。NCS2确实是一个性价比很高的边缘加速方案但它不是一个傻瓜式的加速棒需要你真正理解OpenVINO的流程和YOLO的工作原理才能把它调教好。建议大家在每一步都做好验证比如导出ONNX后先用ONNX Runtime在电脑上跑一下看结果是否正确再转换到OpenVINO格式最后上树莓派测试。这样分段排查能最快定位问题所在。另外这个部署框架不仅仅是针对YOLOv5和NCS2其核心思路——模型转换、OpenVINO Runtime加载、预处理/推理/后处理分离——同样适用于其他支持OpenVINO的模型和硬件如英特尔CPU、集成显卡算是一个通用的边缘AI部署模式掌握了之后可以举一反三。

相关新闻

STM32 FatFS文件系统实战:数据安全、性能优化与多任务访问

STM32 FatFS文件系统实战:数据安全、性能优化与多任务访问

1. 从“能用”到“好用”:FatFS实战中的性能与可靠性考量 在之前的几篇内容里,我们通过CubeMX一步步搭建了FatFS文件系统,实现了基本的文件读写。很多朋友跟着操作下来,会发现代码能跑通,SD卡也能读写,这感…

2026/7/30 14:37:04阅读更多 →
李弘扬老师,在RSS上对具身智能的最新思考。

李弘扬老师,在RSS上对具身智能的最新思考。

今年 RSS 上,香港大学助理教授、源策未来创始人李弘扬获得了 Early Career Spotlight,并在随后的演讲中,系统介绍了他对全身智能 Whole-Body Intelligence,也就是 WBI。 之前业内的叫法都是全身控制(whole-body contr…

2026/7/30 14:35:04阅读更多 →
钉钉开发者平台生成凭证,填入 OpenClaw 实现 AI 消息交互(含安装包)

钉钉开发者平台生成凭证,填入 OpenClaw 实现 AI 消息交互(含安装包)

OpenClaw 连接钉钉图文实操教程 本文完整讲解 OpenClaw v2.7.9 对接钉钉企业机器人整套操作,采用 Stream 消息接收模式,无需配置公网 IP 与 Webhook 地址,支持群聊、私聊、文件、卡片等多种消息交互形式,适合企业内部智能协作场景…

2026/7/30 14:35:04阅读更多 →
LLM集成与AI智能体开发实战:从原理到企业级应用

LLM集成与AI智能体开发实战:从原理到企业级应用

2026年伦敦DConf大会:LLM集成与AI智能体开发实战指南最近在准备参加2026年伦敦DConf大会的技术分享时,发现LLM集成与AI智能体开发已经成为开发者社区的热门话题。无论是企业级应用还是个人项目,如何高效地将大语言模型集成到现有系统中&#…

2026/7/30 17:03:39阅读更多 →
BES(恒玄) 2600X 蓝牙A2DP低延时解析

BES(恒玄) 2600X 蓝牙A2DP低延时解析

对于延时来说,一般蓝牙耳机整体延时主要分为手机端和耳机端,整个链路上延时主要集中在数据buffer区域 做低延时的方案有以下两个方向 1、一般的编解码方式,AAC跟SBC,用SBC来做低延时比较好,为什么呢?因为它需要解码的数据更少, 1 frame = 128 sample,而AAC的话,1 fr…

2026/7/30 17:03:39阅读更多 →
拓扑排序题目:最小高度树

拓扑排序题目:最小高度树

文章目录题目标题和出处难度题目描述要求示例数据范围解法思路和算法代码复杂度分析题目 标题和出处 标题:最小高度树 出处:310. 最小高度树 难度 6 级 题目描述 要求 树是一个无向图,其中任何两个结点只通过一条路径连接。换句话说&…

2026/7/30 17:03:39阅读更多 →
常州市shp矢量数据wgs84坐标系包含区划路网水系建筑poi等类型

常州市shp矢量数据wgs84坐标系包含区划路网水系建筑poi等类型

江苏省常州市shp矢量数据wgs84坐标系类型包含行政区划/行政名称/道路路网/交通设施/功能区/水系绿地/兴趣点/建筑轮廓等,具体内容以压缩包内为准,可用于制作各类地图,来源于网络授权下载,仅供学习研究参考,不可用于商业…

2026/7/30 17:03:39阅读更多 →
苏州简易注销失败,企业该如何走一般注销流程?

苏州简易注销失败,企业该如何走一般注销流程?

一条路走不通,换条路也得走完——注销这件事,拖越久代价越大 很多老板觉得简易注销被驳回了,干脆就不管了。但真相是:不注销的后果,比注销麻烦一百倍。法人被限制高消费、银行账户被冻结、甚至影响子女读书——这些都不…

2026/7/30 17:03:39阅读更多 →
零基础也能玩Switch游戏:Ryujinx模拟器5分钟上手指南

零基础也能玩Switch游戏:Ryujinx模拟器5分钟上手指南

零基础也能玩Switch游戏:Ryujinx模拟器5分钟上手指南 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx 你是不是也曾经羡慕朋友手中的Switch,却又不想花几千块买一…

2026/7/30 17:01:38阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/30 15:03:16阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/30 12:22:27阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/30 15:13:02阅读更多 →
3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 🚀 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX 你是否曾经因为iOS系统的严格…

2026/7/30 0:00:58阅读更多 →
[GESP202606 四级] 扫雷

[GESP202606 四级] 扫雷

B4557 [GESP202606 四级] 扫雷 https://www.luogu.com.cn/problem/B4557 中国计算机学会(CCF)2026年6月C四级讲解——扫雷 https://www.bilibili.com/video/BV1MCMg6AEXR/ B4557 [GESP202606 四级] 扫雷 https://www.bilibili.com/video/BV1ZKTj6ZEVh/ 2…

2026/7/30 0:00:58阅读更多 →
Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:58阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/30 0:27:26阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/30 4:47:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/30 15:43:46阅读更多 →