树莓派5 yolov11 ncnn部署记录

1.部署NCNN


# 检查更新
sudo apt-get update
sudo apt-get upgrade
# 安装依赖
sudo apt-get install cmake wget
sudo apt-get install build-essential gcc g++
sudo apt-get install libprotobuf-dev protobuf-compiler
# 下载ncnn项目文件
git clone https://github.com/Tencent/ncnn.git
cd ncnn
git submodule update --init
 
# 编译ncnn
cmake -D NCNN_DISABLE_RTTI=OFF -D NCNN_BUILD_TOOLS=ON \
-D CMAKE_TOOLCHAIN_FILE=../toolchains/aarch64-linux-gnu.toolchain.cmake ..
 
make -j4 # make -j$(nproc)
make install
# 把文件移到/usr/local/目录
sudo mkdir /usr/local/lib/ncnn
sudo cp -r install/include/ncnn /usr/local/include/ncnn
sudo cp -r install/lib/libncnn.a /usr/local/lib/ncnn/libncnn.a

# 测试是否安装成功
cd ../python
python3 tests/benchmark.py

2.Yolov11模型转换&试运行


# 使用ultralytics库
yolo export model=base_yolo11s.pt format=ncnn

# 24.9.22 优化了参数显示 | 对内存占用更小
import cv2
import torch
from logger import logger
from picamera2 import Picamera2
from ultralytics import YOLO

from utils import random_color

model = YOLO("Vision/models/base_yolo11s_ncnn_model", task="detect")
logger.info("Pre-trained YOLOv11s Model loaded")

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
logger.info(f"Device using: {device}")


def Predict(model, img, classes=[], min_conf=0.5, device="cpu"):
    """
    Using Predict Model to predict objects in img.

    Input classes to choose which to output.

    eg. Predict(chosen_model, img_input, classes=[human], min_conf=0.5)
    """
    if classes:
        results = model.predict(
            img, classes=classes, conf=min_conf, device=device, stream=True
        )
    else:
        results = model.predict(img, conf=min_conf, device=device, stream=True)
    return results


def Predict_and_detect(
    model,
    img,
    classes=[],
    min_conf=0.5,
    rectangle_thickness=2,
    text_thickness=1,
    device="cpu",
):
    """
    Using Predict Model to predict objects in img and detect the objects out.

    Input classes to choose which to output.

    eg. Predict_and_detect(chosen_model, img, classes=[], conf=0.5, rectangle_thickness=2, text_thickness=1)
    """
    results = Predict(model, img, classes, min_conf=min_conf, device=device)
    for result in results:
        for box in result.boxes:
            left, top, right, bottom = (
                int(box.xyxy[0][0]),
                int(box.xyxy[0][1]),
                int(box.xyxy[0][2]),
                int(box.xyxy[0][3]),
            )
            confidence = box.conf.tolist()[0]
            label = int(box.cls[0])
            color = random_color(label)
            cv2.rectangle(
                img,
                (left, top),
                (right, bottom),
                color=color,
                thickness=rectangle_thickness,
                lineType=cv2.LINE_AA,
            )
            caption = f"{result.names[label]} {confidence:.2f}"
            w, h = cv2.getTextSize(caption, 0, 1, 2)[0]
            cv2.rectangle(
                img, (left - 3, top - 33), (left + w + 10, top), color, -1
            )
            cv2.putText(
                img,
                caption,
                (left, top - 5),
                0,
                1,
                (0, 0, 0),
                text_thickness,
                16,
            )
    return img, results


picam2 = Picamera2()
picam2.start()
while True:
    # read frame
    # ret, frame = camera.read()
    image = picam2.capture_array("main")
    image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)

    # Perform object detection on an image
    result_img, _ = Predict_and_detect(
        model, image, classes=[], min_conf=0.5, device=device
    )
    
    # Display results
    cv2.imshow("YOLOv11 Inference", result_img)
    key = cv2.waitKey(1)
    if key == 32:  # 空格
        break

picam2.close()
cv2.destroyAllWindows()

<think>好的,用户想在树莓派上使用YOLOv5NCNN进行部署和优化,需要教程和性能优化建议。首先,我需要整理已有的引用资料,看看有哪些相关的步骤和问题需要注意。 引用1提到在树莓派下使用NCNN部署YOLOv5-lite,并提到了anchor的设置和模型配置文件的位置。这可能涉及到模型转换时的参数调整,需要特别注意模型配置文件的正确性。用户需要将PyTorch模型转换为ONNX,再转成NCNN格式,这一步是关键,转换错误可能导致性能问题,如引用3中提到的导出param文件出现字母而非数字的问题,可能是导出方法有误,需要检查转换工具版本或参数。 引用2是关于YOLOv8在树莓派5上的部署,虽然用户问的是YOLOv5,但部署步骤可能有相似之处,比如NCNN环境的搭建、模型转换和推理优化。树莓派5的性能可能比之前的版本好,但优化方法如量化、减少层融合同样适用。 引用3提到用户导出模型时遇到的问题,帧率低下,可能的原因包括模型未优化、树莓派配置不足,或者代码效率低。这里需要强调模型量化的重要性,以及使用NCNN的优化选项,比如使用多线程、降低输入分辨率等。 引用4讨论了ONNX模型在树莓派上的推理,提到了CUDA和CPU作为执行提供者,但树莓派没有GPU,所以只能依赖CPU。因此,优化重点应放在CPU效率上,比如使用NCNN的Vulkan支持(如果树莓派支持的话),或者调整线程数。 接下来,用户需要详细的部署步骤。首先确保系统依赖安装正确,如CMake、Protobuf等。然后编译NCNN,开启优化选项,如多线程和SIMD。模型转换部分需要强调使用正确的导出方法,避免出现param文件格式错误的问题。可能需要使用ONNX作为中间格式,并利用NCNN的转换工具。 在优化策略方面,模型量化是重点,将FP32转为FP16或INT8可以显著减少计算量和内存占用。调整输入分辨率也是一个有效方法,但会影响检测精度,需要平衡。代码层面的优化包括使用NCNN的多线程、内存池和缓存机制,减少不必要的计算。 性能对比方面,引用3提到帧率在3~5帧,而用户的只有0.6帧,可能问题出在模型转换或代码实现上。需要检查转换后的模型是否正确,是否应用了量化,以及代码中是否有效利用了NCNN的优化选项。 此外,用户可能需要参考具体的教程,比如引用3中的保姆级教程,但要注意导出步骤的正确性。同时,社区资源和讨论也很重要,遇到问题可以查阅相关GitHub仓库或论坛。 最后,相关问题部分需要涵盖部署步骤、优化方法、性能瓶颈、与其他框架的对比、硬件加速以及模型调整的影响。这些能帮助用户全面了解部署过程和可能的优化方向。</think>### 树莓派部署YOLOv5NCNN的步骤及优化指南 #### **1. 部署流程** 1. **环境准备** - **系统要求**: 树莓派系统建议使用Raspberry Pi OS (64-bit),并安装以下依赖: ```bash sudo apt-get install build-essential cmake libprotobuf-dev libopencv-dev ``` - **NCNN编译**: 克隆NCNN仓库并编译,启用多线程和优化选项: ```bash git clone https://github.com/Tencent/ncnn.git cd ncnn && mkdir build && cd build cmake -DCMAKE_BUILD_TYPE=Release -DNCNN_THREADS=ON -DNCNN_AVX2=OFF .. make -j4 ``` 2. **模型转换** - **YOLOv5转ONNX**: 使用Ultralytics官方脚本导出ONNX模型,注意指定动态输入或固定分辨率: ```python model = torch.hub.load('ultralytics/yolov5', 'yolov5s') torch.onnx.export(model, torch.randn(1,3,640,640), "yolov5s.onnx") ``` - **ONNX转NCNN**: 使用`onnx2ncnn`工具生成`.param`和`.bin`文件,需确保输入层名称匹配[^1]: ```bash ./onnx2ncnn yolov5s.onnx yolov5s.param yolov5s.bin ``` 3. **代码集成** - 参考NCNN的C++推理示例,重点处理后处理部分(如非极大值抑制NMS): ```cpp ncnn::Net net; net.load_param("yolov5s.param"); net.load_model("yolov5s.bin"); // 预处理、推理、后处理实现... ``` #### **2. 优化策略** 1. **模型量化** - 将FP32模型转为FP16或INT8格式,可减少计算量并提升推理速度。使用NCNN的量化工具: ```bash ./ncnn2int8 yolov5s.param yolov5s.bin yolov5s-int8.param yolov5s-int8.bin ``` - 量化后模型体积缩小约4倍,但需验证精度损失是否可接受[^3]。 2. **输入分辨率调整** - 降低输入图像分辨率(如从640x640改为320x320),可显著减少计算量。需在导出ONNX时指定: ```python torch.onnx.export(..., args=(torch.randn(1,3,320,320),)) ``` 3. **代码级优化** - **多线程**: 在NCNN推理时设置线程数(需在编译时启用`NCNN_THREADS`): ```cpp ncnn::Option opt; opt.num_threads = 4; // 根据CPU核心数调整 ``` - **内存池复用**: 减少动态内存分配开销,复用输入/输出张量内存[^2]。 #### **3. 性能对比** | 配置 | 帧率 (FPS) | 备注 | |------|-----------|------| | YOLOv5s (FP32, 640x640) | 0.6~1.2 | 未优化基线[^3] | | YOLOv5s (INT8, 320x320) | 3~5 | 量化+分辨率降低 | | YOLOv5-Lite (FP16) | 5~8 | 轻量模型优势 | #### **4. 常见问题解决** - **模型转换错误**:若`.param`文件出现非数字层名称,可能是PyTorch版本与`onnx2ncnn`工具不兼容,建议使用Ultralytics官方导出脚本[^3]。 - **低帧率问题**:检查是否启用多线程、模型是否量化、输入分辨率是否过高。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值