news 2026/5/15 7:25:42

海思SS928/SD3403边缘AI芯片开发实战:从环境搭建到AI推理全流程解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
海思SS928/SD3403边缘AI芯片开发实战:从环境搭建到AI推理全流程解析

1. 项目概述:从零上手SS928/SD3403

最近在折腾一个边缘计算的项目,选型时看中了海思的SS928(也叫SD3403)这颗芯片。说实话,对于刚接触海思平台,特别是从通用Linux开发转向这种带NPU的SoC的开发者来说,上手过程确实有点“劝退”。网上的资料要么是零散的官方文档片段,要么就是过于陈旧的社区帖子,很难找到一个从环境搭建到跑通第一个例子的完整路径。我花了差不多一周时间,踩了无数坑,才把整个开发环境理顺,成功点亮了板子并运行了基础的视频编解码和AI推理demo。这篇文章,我就把自己趟出来的这条路,从芯片认知、环境搭建、镜像制作到程序烧录与调试,完整地梳理一遍,目标是让一个有一定Linux和嵌入式基础的开发者,能在1-2天内快速上手SS928/SD3403,把开发板跑起来。

SS928/SD3403是海思面向边缘AI视觉应用推出的一款高性能SoC。它集成了4核A55 CPU、一个算力达4Tops的神经网络处理单元(NPU)、强大的视频编解码能力(支持4K@60fps的H.265/H.264编解码)以及丰富的接口(如PCIe、USB3.0、千兆网口等)。这颗芯片的核心价值在于,它把AI推理、视频处理和通用计算高度集成,非常适合智能摄像头、边缘计算盒子、机器人主控等场景。我们快速入门的目标,就是建立起一套可复现的开发环境,并理解其基本的软件架构和开发流程。

2. 开发环境搭建与SDK获取

2.1 硬件与软件准备清单

工欲善其事,必先利其器。在开始之前,你需要准备好以下东西:

  1. 开发板:一块基于SS928/SD3403的开发板或核心板。这是必须的硬件基础。
  2. 宿主机:一台运行Ubuntu 18.04或20.04的x86_64电脑。这是官方的编译服务器,强烈建议使用纯净的系统,避免因系统版本或依赖库问题带来不必要的麻烦。我使用的是Ubuntu 20.04.6 LTS。
  3. 交叉编译工具链:用于在x86主机上编译生成能在ARM A55核心上运行的程序。海思通常会提供定制化的工具链。
  4. 官方SDK:这是最重要的软件资源,包含了内核、uboot、根文件系统、驱动、媒体处理平台(MPP)库、AI推理引擎(NNIE)库等所有基础软件。通常需要从芯片代理商或方案商处获取。
  5. 烧录工具:用于将编译好的系统镜像烧录到开发板的存储设备(通常是eMMC或SPI NAND Flash)中。海思常用的是Hitool工具。
  6. 串口调试工具:一根USB转TTL串口线,用于连接开发板的调试串口,这是你与板子进行命令行交互、查看内核启动信息的最重要窗口。

注意:海思的SDK和工具链对系统环境有比较严格的要求。例如,某些版本的SDK可能要求特定的gcc或make版本。在搭建环境前,最好先阅读SDK包内的《ReleaseDoc》或《环境搭建说明》文档。

2.2 SDK目录结构解析

拿到SDK包(通常是一个名为HiSilicon_SDK_Version.tgz的压缩包)后,解压开来,你会看到一个结构清晰的目录树。理解这个结构对后续操作至关重要:

SS928_SDK/ ├── osdrv/ # 操作系统驱动层 │ ├── opensource/ # 开源软件包(如busybox, kernel, uboot源码) │ └── pub/ # 编译好的镜像、工具链等 ├── mpp/ # 媒体处理平台(Media Process Platform) │ ├── sample/ # 丰富的参考样例(视频采集、编码、解码、AI推理等) │ └── component/ # 各功能组件源码 ├── nnie/ # 神经网络推理引擎(NNIE)相关代码和样例 ├── tools/ # 各类工具,如烧录工具、镜像打包工具等 └── document/ # 开发文档(API参考,芯片手册等)
  • osdrv:这是构建整个系统基础运行环境的核心。我们会在这里编译出U-Boot(启动引导程序)、Linux内核以及根文件系统。
  • mpp:这是进行音视频应用开发的宝藏库。它提供了从视频输入(VI)、视频处理(VPSS)、编码(VENC)、解码(VDEC)到输出(VO)等一系列功能的API和样例。你的大部分业务逻辑代码都会基于MPP库进行开发。
  • nnie:如果你要做AI模型推理,就需要深入研究这个目录。它包含了将Caffe/TensorFlow模型转换成海思NNIE专用格式的工具链,以及模型加载、推理的样例代码。

2.3 交叉编译工具链安装与配置

SDK的osdrv/pub/目录下通常已经提供了预编译好的交叉编译工具链,例如arm-himix200-linux.tar.gz。我们的任务就是把它解压并配置到系统环境变量中。

# 1. 解压工具链到/opt目录(习惯位置,你也可以选择其他路径) sudo tar -zxf osdrv/pub/arm-himix200-linux.tar.gz -C /opt/ # 2. 将工具链的bin目录添加到系统的PATH环境变量中 # 编辑当前用户的bash配置文件 vim ~/.bashrc # 在文件末尾添加以下行 export PATH=/opt/arm-himix200-linux/bin:$PATH # 3. 使配置生效 source ~/.bashrc # 4. 验证工具链是否安装成功 arm-himix200-linux-gcc -v

如果命令成功执行并输出了gcc的版本信息,说明工具链已经就绪。这个arm-himix200-linux-gcc就是后续我们编译应用程序时要使用的编译器。

3. 系统镜像构建:U-Boot、内核与根文件系统

有了SDK和工具链,下一步就是构建系统运行的三大件:Bootloader(U-Boot)、Linux内核和根文件系统。这个过程主要在osdrv目录下完成。

3.1 U-Boot的配置与编译

U-Boot负责初始化最基本的硬件(如DDR、时钟、存储),并引导加载Linux内核。海思对U-Boot进行了深度定制,以支持其特有的启动流程和硬件。

# 进入U-Boot源码目录 cd osdrv/opensource/uboot/u-boot-2020.01/ # 导入默认配置文件(针对SS928开发板) make ss928_xxx_defconfig # 这里的`xxx`需要替换为你的具体板型名称,例如`v100`或`demo` # 启动图形化配置界面(可选,用于微调) make menuconfig # 在图形界面中,你可以配置如网络、USB支持等选项。对于初次上手,使用默认配置通常即可。 # 开始编译 make -j$(nproc) CROSS_COMPILE=arm-himix200-linux-

编译成功后,会在当前目录下生成u-boot.bin文件。这个文件就是我们要烧录的U-Boot镜像。

实操心得make menuconfig时如果遇到ncurses库缺失的错误,可以通过sudo apt-get install libncurses5-dev来安装。编译时指定CROSS_COMPILE至关重要,它告诉make系统使用我们刚刚安装的交叉编译器。

3.2 Linux内核的配置与编译

Linux内核提供了系统的核心功能,包括进程管理、内存管理、设备驱动等。海思内核集成了所有必要的驱动,如VPSS、VENC、VDEC、IVE(智能视觉引擎)等。

# 进入内核源码目录 cd ../../kernel/linux-4.19.y/ # 同样,导入针对SS928的默认配置 make ARCH=arm CROSS_COMPILE=arm-himix200-linux- ss928_xxx_defconfig # 启动内核配置(可选,但建议浏览一下) make ARCH=arm CROSS_COMPILE=arm-himix200-linux- menuconfig # 在这里,你可以根据需求裁剪或增加内核模块。例如,确保所需的文件系统(如ext4, squashfs)、网络协议、USB设备支持等被编译进内核或作为模块。 # 编译内核镜像和设备树二进制文件 make ARCH=arm CROSS_COMPILE=arm-himix200-linux- uImage dtbs -j$(nproc)

编译完成后,在arch/arm/boot/目录下会生成uImage(内核镜像),在arch/arm/boot/dts/目录下会生成ss928-xxx.dtb(设备树二进制文件)。设备树文件描述了板级的硬件资源,是内核识别硬件的关键。

3.3 根文件系统的制作

根文件系统包含了系统运行所需的所有库、工具、配置文件和应用程序。我们使用BusyBox来制作一个基础的根文件系统。

# 回到osdrv根目录 cd ../../../ # 执行根文件系统构建脚本(通常SDK会提供) # 这个脚本会编译BusyBox,并创建一个基本的根文件系统目录树 make rootfs

执行后,会在osdrv/pub/目录下生成一个根文件系统镜像,例如rootfs_ss928_xxx.ext4rootfs_ss928_xxx.jffs2。具体格式取决于你在配置中的选择。ext4格式通用性更好。

3.4 使用SDK脚本一键编译

对于新手,更推荐使用SDK提供的顶层编译脚本,它可以自动化完成上述所有步骤。

# 在osdrv目录下,通常有一个`Makefile`或`build.sh` # 查看帮助 make help # 常见的一键编译命令(清理并编译所有) make clean make all

这个make all命令会依次编译U-Boot、内核和根文件系统,并将生成的镜像文件统一输出到osdrv/pub/目录下,非常方便。这是我最常用的方式。

4. 镜像烧录与系统启动

镜像编译好后,就需要把它们“灌入”开发板的存储中。烧录通常通过串口和网口,使用海思的专用工具Hitool进行。

4.1 连接硬件与进入烧录模式

  1. 硬件连接
    • 用USB转TTL线连接开发板的调试串口(通常是UART0)到电脑。在电脑上使用串口终端软件(如minicom,picocom或Windows下的MobaXtermSecureCRT)连接对应的串口设备(如/dev/ttyUSB0),波特率设置为115200
    • 用网线连接开发板的网口(通常是ETH0)到你的局域网,或者直接连接到电脑网口。
    • 给开发板上电。
  2. 进入烧录模式:开发板上电后,在串口终端里迅速按下任意键(如空格),中断U-Boot的自动启动,进入U-Boot命令行。在U-Boot命令行中输入fastbootupdate命令(具体命令请参考板子手册),此时板子会进入等待烧录的状态。

4.2 使用Hitool进行烧录

  1. 在Windows宿主机上打开Hitool工具。
  2. 选择芯片型号为SS928SD3403
  3. 选择传输方式为“串口”或“网口”。网口传输速度远快于串口,强烈推荐。你需要设置好PC的IP地址(如192.168.1.10),并确保与板子在同一个网段。
  4. 在“烧写eMMC”标签页下,配置需要烧写的分区和镜像文件:
    • boot分区:对应U-Boot镜像 (u-boot.bin)。
    • kernel分区:对应内核镜像 (uImage)。
    • rootfs分区:对应根文件系统镜像 (rootfs_xxx.ext4)。
    • dtb分区:对应设备树文件 (ss928-xxx.dtb)。
  5. 点击“烧写”按钮,工具会开始擦除、编程、校验。整个过程在网口模式下几分钟即可完成。

4.3 首次启动与基础配置

烧录完成后,重启开发板。在串口终端中,你应该能看到U-Boot的启动信息,紧接着是Linux内核的启动日志。如果一切顺利,最终会进入根文件系统的登录提示符。

# 典型的启动成功日志结尾 ... [ 12.345678] VFS: Mounted root (ext4 filesystem) on device 179:2. [ 12.350000] Freeing unused kernel memory: 1024K Starting syslogd: OK Starting klogd: OK Running sysctl: OK Initializing random number generator: OK Starting network: OK Welcome to HiLinux ss928 login:

首次登录,用户名通常是root,密码可能为空或root。登录成功后,你就拥有了一个运行在SS928上的最小Linux系统。你可以使用ifconfig配置网络,使用mount查看挂载,为后续部署MPP样例程序做好准备。

踩坑记录:烧录后无法启动?首先检查串口日志。如果卡在U-Boot,可能是U-Boot镜像不对或DDR参数配置错误。如果内核panic,可能是内核镜像或设备树文件不匹配。最稳妥的方法是,第一次烧录时,严格按照开发板供应商提供的《烧录指南》中指定的镜像文件名和分区表进行操作。

5. MPP媒体处理平台入门实战

系统跑起来后,真正的乐趣开始了——使用MPP库。MPP封装了海思芯片的硬件加速单元,让我们可以用C代码轻松调用强大的编解码和图像处理能力。

5.1 MPP样例程序编译与部署

SDK的mpp/sample目录下提供了数十个样例,从最简单的hello world到复杂的多路视频AI分析。

# 1. 回到SDK根目录,进入MPP样例目录 cd ../mpp/sample/ # 2. 编译整个样例目录 # 通常有一个顶层的Makefile.param文件需要先配置 cp Makefile.param.sample Makefile.param # 编辑Makefile.param,确保交叉编译工具链等路径正确 vim Makefile.param # 主要检查:CC = arm-himix200-linux-gcc,以及MPP头文件和库的路径 # 3. 进入一个具体的样例目录,例如视频编码样例 cd venc/ # 4. 编译 make clean make -j$(nproc) # 5. 编译成功后,会生成可执行文件,如`sample_venc`

将生成的可执行文件sample_venc和它可能依赖的配置文件(如sample_venc.conf)通过scptftp拷贝到开发板的文件系统中。

5.2 运行第一个视频编码样例

在开发板串口终端中,运行这个程序:

cd /path/to/sample_venc/ ./sample_venc

程序可能会从指定的摄像头(如MIPI CSI接口)采集视频,进行H.264编码,并将编码后的码流保存为文件。通过查看代码sample_venc.c,你可以清晰地看到MPP编程的基本流程:

  1. 系统初始化HI_MPI_SYS_Init(), 初始化MPP系统。
  2. 视频输入(VI)初始化:配置并启动视频输入通道,绑定到物理传感器。
  3. 视频处理(VPSS)初始化:对原始图像进行缩放、裁剪等处理。
  4. 视频编码(VENC)初始化:创建编码通道,设置编码参数(分辨率、码率、帧率、GOP等)。
  5. 绑定与数据流:将VI、VPSS、VENC通过HI_MPI_SYS_BindAPI绑定在一起,数据自动从传感器流向编码器。
  6. 获取码流:从VENC通道获取编码后的数据包,写入文件。
  7. 资源释放:程序结束时,逆序解绑、停止、去初始化各个模块。

这个流程是海思MPP编程的经典范式,几乎所有的音视频应用都遵循类似的“初始化-绑定-获取数据-释放”模式。

5.3 理解关键数据结构与API

要灵活使用MPP,必须理解几个核心数据结构:

  • VIDEO_FRAME_INFO_S:描述一帧视频图像的信息,如宽、高、像素格式(如PIXEL_FORMAT_YVU_SEMIPLANAR_420)、物理地址等。
  • VENC_STREAM_S:描述一包编码后的码流,包含数据指针和长度。
  • SAMPLE_VI_CONFIG_S,SAMPLE_VENC_CONFIG_S:样例中定义的配置结构体,封装了模块初始化所需的大量参数。

关键的API除了上面提到的系统初始化和绑定外,还有:

  • HI_MPI_VI_GetFrame/HI_MPI_VI_ReleaseFrame: 获取和释放一帧原始图像。
  • HI_MPI_VENC_GetStream/HI_MPI_VENC_ReleaseStream: 获取和释放一包编码码流。
  • HI_MPI_VPSS_SendFrame/HI_MPI_VPSS_GetChnFrame: 向VPSS发送帧或从VPSS通道获取处理后的帧。

6. NNIE神经网络推理引擎初探

SS928的NPU通过NNIE引擎来驱动。NNIE的开发流程与传统CPU编程差异较大,其核心是将通用深度学习框架(Caffe/TensorFlow)训练出的模型,转换成NNIE支持的.wk模型文件,然后加载该模型进行推理。

6.1 模型转换流程

NNIE不支持直接加载.caffemodel.pb文件。转换工具链通常位于SDK的nnie/software/tools/nnie_mapper目录下。

  1. 准备模型和图片:你需要有Caffe的模型文件(.prototxt.caffemodel)或TensorFlow的模型文件(.pb),以及一些用于校准的图片。
  2. 配置转换脚本:工具链提供了sample_mapper样例。你需要修改其配置文件,指定输入模型路径、输入图片路径、模型输入输出的节点名称、数据格式(如BGR、RGB)、量化方式(如int8)等。
  3. 执行转换:运行转换脚本,它会输出一个.wk文件。这个文件就是可以被NNIE加载的模型。

注意事项:模型转换是NNIE开发中最容易出错的环节。常见问题包括:模型层不支持(NNIE对网络层有支持列表)、输入输出节点名错误、图片预处理方式不匹配等。务必仔细阅读《NNIE开发指南》,并充分利用转换工具输出的日志信息进行调试。

6.2 运行AI推理样例

SDK的nnie/sample目录下提供了物体检测(如YOLOv3)、分类、人脸检测等样例。以sample_nnie_main为例,编译并运行:

# 在开发板上 ./sample_nnie_main 0 ./model/yolov3.wk ./data/test.jpg
  • 第一个参数0通常表示使用NPU核心0。
  • 第二个参数是转换好的.wk模型文件路径。
  • 第三个参数是待推理的图片路径。

程序会加载模型和图片,在NPU上执行推理,并将结果(如画了检测框的图片)保存下来。通过分析sample_nnie_main.c源码,你可以了解NNIE编程的基本步骤:

  1. 加载模型HI_MPI_SVP_NNIE_LoadModel, 将.wk文件加载到内存。
  2. 初始化参数:填充SVP_NNIE_PARAM_S等结构体,设置输入输出张量的信息、网络结构等。
  3. 向前推理HI_MPI_SVP_NNIE_Forward, 这是执行推理的核心函数。
  4. 获取结果:从输出张量中解析出浮点数或定点数,后处理成具体的类别、坐标等信息。
  5. 卸载模型HI_MPI_SVP_NNIE_UnloadModel, 释放资源。

6.3 NPU性能调优浅谈

要让AI应用跑得又快又稳,有几个关键点:

  • 模型量化:默认的.wk模型可能是float16或int8精度。int8模型在精度损失可接受的前提下,能大幅提升推理速度并降低内存占用。在模型转换阶段就要做好量化校准。
  • 输入数据对齐:NNIE对输入图像的宽高可能有对齐要求(如16像素对齐)。在喂数据前,需要确保图像尺寸符合要求,否则会返回错误。
  • 多模型/多任务调度:SS928的NPU算力强大,可以同时运行多个简单模型。需要合理设计任务调度,避免NPU空闲,充分发挥其并行处理能力。

7. 常见问题排查与调试技巧

在实际开发中,你一定会遇到各种问题。这里记录一些我踩过的坑和解决方法。

7.1 系统启动类问题

问题1:串口无任何输出。

  • 排查:检查电源是否正常;检查串口线连接是否正确(TX、RX是否接反);检查电脑端串口终端配置(设备号、波特率115200、8N1、无流控)。
  • 解决:确保板子已正确进入烧录模式或正常运行模式。有时需要多次重启尝试。

问题2:内核启动卡住,提示“Failed to mount /dev/root”。

  • 排查:根文件系统镜像格式错误、烧录位置不对、或者内核命令行参数(bootargs)中的root=设备指定错误。
  • 解决:在U-Boot中使用printenv命令查看bootargs。确认root=/dev/mmcblk0pX(X为分区号)是否正确指向了你的根文件系统分区。使用ext4load命令测试是否能从该分区读取文件。

7.2 MPP编程类问题

问题1:MPI调用返回错误码0xA0038003(无效设备ID)。

  • 排查:这是海思MPP最常见的错误之一。意味着你传入的模块号、通道号、设备号等ID超出了范围或未被初始化。
  • 解决:仔细检查HI_MPI_XXX_CreateChnHI_MPI_XXX_Start等初始化函数的参数。确保VI、VPSS、VENC等模块的通道号在配置文件(如sample_venc.conf)和代码中保持一致。参考SDK样例中的配置值。

问题2:编码出来的视频文件花屏或无法播放。

  • 排查:码流数据不完整或文件头信息错误。
  • 解决
    1. 确保在写文件时,不仅写了码流包(VENC_STREAM_S)中的pack数据,还写了packlen长度。
    2. 对于H.264/H.265,确保第一个写入文件的是SPS/PPS帧(通常是第一个码流包)。有些播放器需要这些头信息才能正确解码。
    3. 检查编码参数是否合理,如码率是否过低导致严重马赛克。

7.3 NNIE推理类问题

问题1:模型转换失败,提示“Unsupported layer type: XXXXX”。

  • 排查:NNIE不支持你网络中的某些层。
  • 解决:查阅《NNIE开发指南》中的支持层列表。对于不支持的层(如某些特殊的激活函数、自定义层),可以考虑修改网络结构,或用支持的操作组合来等效实现。有时需要回溯到模型训练阶段进行调整。

问题2:推理结果完全不对,精度骤降。

  • 排查:大概率是数据预处理环节出了问题。NNIE模型转换时定义了固定的预处理方式(减均值、乘系数、通道顺序)。
  • 解决:在推理代码中,必须严格按照模型转换时配置的预处理方式来准备输入数据。对比原始框架(如PyTorch)下的预处理代码和NNIE样例中的预处理代码,确保每一个步骤(缩放、裁剪、归一化、颜色通道转换)都完全一致。一个像素值或通道顺序的差异都可能导致结果天差地别。

7.4 调试方法论

  1. 日志为王:充分利用海思MPP和NNIE的日志系统。在运行程序前,通过export HI_LOG_LEVEL=3(或更高等级)设置环境变量,打开调试日志,能获取非常详细的函数调用和错误信息。
  2. 简化复现:当遇到复杂问题时,尝试构建一个最小的、可复现的测试程序。例如,剥离业务逻辑,只测试最基本的VI采集到VENC编码的流水线是否正常。
  3. 善用样例:SDK提供的样例是经过验证的正确代码。当自己的程序出问题时,对比样例程序的代码逻辑、参数配置、API调用顺序,往往能快速定位差异点。
  4. 社区与文档:虽然海思的公开社区资料不多,但一些开发者论坛和GitHub上仍有宝贵的经验分享。同时,SDK自带的《API参考》和《开发指南》是终极权威,遇到任何API行为疑问,首先查阅官方文档。

从一块裸板到成功运行AI推理程序,这个过程涉及了嵌入式开发的多个层面。SS928/SD3403平台功能强大,但相应的软件栈也较为复杂。我的经验是,不要试图一开始就理解所有细节,而是遵循“搭建环境 -> 跑通样例 -> 修改样例 -> 整合功能 -> 深度优化”的路径,循序渐进。当你成功让摄像头画面经过NPU分析并显示在屏幕上时,那种成就感会让你觉得前面所有的折腾都是值得的。这个平台的学习曲线前期陡峭,但一旦掌握了其软件框架和调试方法,后续的开发效率会非常高。希望这篇基于我个人实践总结的指南,能帮你少走弯路,快速开启你的SS928开发之旅。

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

边缘计算中ViT模型的优化技术与医疗应用

1. 边缘计算中的ViT优化挑战与机遇Vision Transformer(ViT)模型在计算机视觉任务中展现出卓越性能,但其庞大的计算量和内存需求给边缘设备部署带来了严峻挑战。边缘计算环境通常面临三大核心约束:有限的计算资源(如移动…

作者头像 李华
网站建设 2026/5/15 7:25:03

JavaScript 的基石:彻底搞懂 8 种数据类型

🧱 JavaScript 的基石:彻底搞懂 8 种数据类型 🤔 为什么需要区分数据类型? 在 JavaScript 中,数据分为两大类:基本数据类型(Primitive) 和 引用数据类型(Reference&…

作者头像 李华
网站建设 2026/5/15 7:22:12

基于PyPortal与光传感器的物联网闭环控制:从单向指令到可靠状态反馈

1. 项目概述与核心价值如果你曾经尝试过用手机远程开关家里的台灯或者风扇,大概率会接触到“物联网”这个概念。简单来说,物联网就是让物理世界的“物”(比如电器、传感器)能够接入互联网,变得可以被远程感知和控制。听…

作者头像 李华
网站建设 2026/5/15 7:22:10

抖音万粉号出售 万粉抖音号价格表

买抖音号1w粉丝多少钱 在哪里买?→Semgood 这是一个常见的问题,但是答案并不简单。因为抖音号的价格取决于多个因素,包括粉丝数量、账号年龄、账号活跃度等等。 以下是一些可能的抖音万粉号价格范围: 1. 1w粉丝的新账号&#x…

作者头像 李华
网站建设 2026/5/15 7:21:16

如何在有/无备份的情况下恢复红米手机上已删除的联系人

您是否曾误删过红米手机上的重要联系人,并为此苦苦挣扎着想要恢复?无论是意外删除、系统更新还是恢复出厂设置,丢失联系人都会让人感到焦虑。幸运的是,现在有一些可靠的方法可以恢复红米设备上已删除的联系人。在本指南中&#xf…

作者头像 李华
网站建设 2026/5/15 7:19:05

【Python】使用YOLO8识别视频中的车与人物

文章目录 一、效果1.1、原视频1.2、效果视频1.3、静图效果 二、简介三、环境准备3.1、安装依赖3.2、YOLOv8 类别说明 四、核心解析4.1、检测目标过滤4.2、类型映射(适配你 Vue 前端)4.3、3D 坐标映射4.4、性能优化 五、使用方法六、完整源码 与我之前写的…

作者头像 李华