香橙派 Kunpeng Pro:基于ncnn的深度学习模型量化与部署实践

香橙派Kunpeng Pro开箱测评:入门体验使用与基础测试 阅读详情

一 引言

近10年里以深度学习为代表的机器学习技术在图像处理,语音识别,自然语言处理等领域里取得了非常多的突破,其背后的核心算法是深度学习为代表的AI基础模型。

一般来讲,我们进行AI项目研发时,遵循三个步骤。

第一步,我们需要针对目标任务选定一个合适的模型架构,然后训练出满足精度的模型,这就是模型设计;

第二步,我们需要基于第一步训练好的模型,在不显著降低其精度的前提下,对模型的冗余参数进行精简,对高精度计算进行低精度近似,这就是模型压缩;

第三步,将模型运用于实际的生产环境,即面向用户的产品,这就是模型部署。

深度学习模型必须要部署到实际的生产环境中才能产生真正的应用价值。在各类落地场景中,有的是服务端应用,它需要模型有更高的精度、更复杂的功能;有的是嵌入式平台应用,诸如手机等各类移动端设备与车载设备,它需要模型具有体积小、低延迟特性。因此我们在进行模型设计与部署的时候,需要根据应用场景选择不同的模型和工具。当前模型优化和部署的工具非常多,常见的包括TensorRT、NCNN等;当前的硬件计算平台也非常多,包括CPU、GPU,NPU、FPGA等。

现在市面上有各种算力的嵌入式设备,强劲一点的如NVIDIA Jetson,弱一点的如树莓派,本次我们从优快云社区收到了一块OrangePi Kunpeng Pro(香橙派开发板),正好来试一试这块板子的使用与性能。

下面是这块板子的实拍图与开机界面。

 

二 熟悉板子

拿到板子后当然首先要熟悉一下基本情况,包括软硬件相关信息。

第一步:使用/etc/os-release命令查看系统信息。

该板子的操作系统是openeuler 22.03(LTS-SP3),前身是华为自主研发的服务器操作系统EulerOS,其名字来自于1752年数学家欧拉所发现的欧拉公式。后来华为将其捐赠给开放原子开源基金会(OpenAtom Foundation)孵化及运营,项目地址为https://gitee.com/openeuler。

openEuler本质上也是一个Linux系统,每两年推出一个LTS版本,每半年发布一次创新版,支持鲲鹏及其他多种处理器,许多系统底层命令与一般Linux系统无异,一般的文件与目录操作等命令,即ls,cd,cp等均不变,软件安装则与centos一样使用yum或者dnf管理。

第二步:修改一些相关配置

一个全新的Linux系统,总有一些东西需要先改一改,比如默认的软件源。直接打开/etc/yum.repos.d/openEuler.repo,将其内容替换为以下内容。

[OS]

name=OS

baseurl=https://mirrors.aliyun.com/openeuler/openEuler-22.03-LTS-SP2/OS/$basearch/

enabled=1

gpgcheck=1

gpgkey=https://mirrors.aliyun.com/openeuler/openEuler-22.03-LTS-SP2/OS/$basearch/RPM-GPG-KEY-openEuler



[everything]

name=everything

baseurl=https://mirrors.aliyun.com/openeuler/openEuler-22.03-LTS-SP2/everything/$basearch/

enabled=1

gpgcheck=1

gpgkey=https://mirrors.aliyun.com/openeuler/openEuler-22.03-LTS-SP2/everything/$basearch/RPM-GPG-KEY-openEuler



[EPOL]

name=EPOL

baseurl=https://mirrors.aliyun.com/openeuler/openEuler-22.03-LTS-SP2/EPOL/main/$basearch/

enabled=1

gpgcheck=1

gpgkey=https://mirrors.aliyun.com/openeuler/openEuler-22.03-LTS-SP2/OS/$basearch/RPM-GPG-KEY-openEuler



[debuginfo]

name=debuginfo

baseurl=https://mirrors.aliyun.com/openeuler/openEuler-22.03-LTS-SP2/debuginfo/$basearch/

enabled=1

gpgcheck=1

gpgkey=https://mirrors.aliyun.com/openeuler/openEuler-22.03-LTS-SP2/debuginfo/$basearch/RPM-GPG-KEY-openEuler



[source]

name=source

baseurl=https://mirrors.aliyun.com/openeuler/openEuler-22.03-LTS-SP2/source/

enabled=1

gpgcheck=1

gpgkey=https://mirrors.aliyun.com/openeuler/openEuler-22.03-LTS-SP2/source/RPM-GPG-KEY-openEuler



[update]

name=update

baseurl=https://mirrors.aliyun.com/openeuler/openEuler-22.03-LTS-SP2/update/$basearch/

enabled=1

gpgcheck=1

gpgkey=https://mirrors.aliyun.com/openeuler/openEuler-22.03-LTS-SP2/OS/$basearch/RPM-GPG-KEY-openEuler



[update-source]

name=update-source

baseurl=https://mirrors.aliyun.com/openeuler/openEuler-22.03-LTS-SP2/update/source/

enabled=1

gpgcheck=1

gpgkey=https://mirrors.aliyun.com/openeuler/openEuler-22.03-LTS-SP2/source/RPM-GPG-KEY-openEuler

再运行命令更新

sudo dnf clean all
sudo dnf makecache

第三步:查看硬件配置

由于接下来我们要测试AI项目,因此对于板子的硬件能力心里还是要有底。

 

 可以看到是64bit系统,6个CPU,8GB内存,算力暂时不详。

第四步:安装一些必要的库,包括opencv-cv,protobuf等。

sudo dnf install protobuf-compiler protobuf # 文件格式库
sudo dnf install gtk2-devel gtk2-devel-docs # 桌面显示库
sudo dnf install pkg-config # 编译器的辅助工具,可以帮助 GCC 找到所需要的头文件与库文件路径
sudo dnf install mlocate # 文件查找库
sudo dnf install opencv opencv-devel
sudo pip install opencv-python # opencv库
sudo pip install torch # torch库
sudo pip install torchvision # torchvision库
sudo pip install onnxruntime # onnx库

系统已经预装了python3.9,后续使用如果还缺什么就用pip装就是。

 

三 模型部署

接下来我们使用移动端NCNN框架,以及香橙派,来体验典型的移动端模型部署流程,包括模型的格式转换、模型量化、基于C++的模型推理部署。

框架介绍

本次我们选择的部署框架是NCNN,它是一个在工业界被广为使用的框架,具有非常好的性能。

NCNN是一个纯C++实现的框架,无任何第三方库依赖,不依赖 BLAS/NNPACK 等计算框架,提供了ARM NEON 汇编级良心优化,计算速度极快。NCNN提供了对所有主流操作系统的支持,如图所示;

标题NCNN支持的操作系统 

 

NCNN支持PaddlePaddle/PyTorch/TensorFlow/Caffe/MXNet/DarkNet/OneFlow/ONNX等深度学习框架文件格式,支持CNN、GAN等常用网络模型结构;

NCNN支持Intel架构的CPU与GPU,AMD架构的CPU与GPU,Arm架构的CPU与GPU,高通架构的CPU与GPU,Apple架构的CPU与GPU,其中对高通公司的CPU,ARM公司的CPU以及Apple公司的CPU提供了非常高效率地优化加速;

NCNN支持FP32/FP16/INT8/UINT8等多种运算精度;

NCNN支持C/C++/Python API;

NCNN支持直接内存零拷贝引用加载网络模型,可注册自定义层实现并扩展;

要使用NCNN,首先需要下载源码进行编译安装,相关代码命令如下:

git clone https://github.com/Tencent/ncnn
cd ncnn
mkdir build && cd build
cmake ..
make -j
make install

 

 

 

安装完之后,就可以在build/install目录下看到生成的一系列可执行文件和需要的库文件,它们分别存储于bin子目录和include子目录。如果github访问不了,就换gitee地址。

模型转换与量化

在进行部署之前,需要对模型格式进行转换,相关工具在ncnn根目录/build/install/bin目录下,包括   

caffe2ncnn:caffe模型转换工具
darknet2ncnn: mxnet模型转换工具
mxnet2ncnn: mxnet模型转换工具
onnx2ncnn: onnx模型转换工具
ncnn2table, ncnn2int8: 模型量化工具
ncnn2mem:模型加密可执行文件:
ncnnoptimize:模型优化可执行文件
ncnnmerge:模型合并可执行文件

完整的模型量化流程可以分为3步,以ONNX格式为例:

第一步,将ONNX格式的模型转换为NCNN格式的模型,所使用的模型是一个训练好的图像分类模型。

其模型配置如下:

## 简单模型定义
class simpleconv5(nn.Module):
    def __init__(self,nclass):
        super(simpleconv5,self).__init__()
        self.conv1 = nn.Conv2d(3, 32, 3, 2, 1, bias=False)
        self.bn1 = nn.BatchNorm2d(32)
        self.conv2 = nn.Conv2d(32, 64, 3, 2, 1, bias=False)
        self.bn2 = nn.BatchNorm2d(64)
        self.conv3 = nn.Conv2d(64, 128, 3, 2, 1, bias=False)
        self.bn3 = nn.BatchNorm2d(128)
        self.conv4 = nn.Conv2d(128, 256, 3, 2, 1, bias=False)
        self.bn4 = nn.BatchNorm2d(256)
        self.conv5 = nn.Conv2d(256, 512, 3, 2, 1, bias=False)
        self.bn5 = nn.BatchNorm2d(512)
        self.fc = nn.Linear(512, nclass)

    def forward(self , x):
        x = F.relu(self.bn1(self.conv1(x)))
        x = F.relu(self.bn2(self.conv2(x)))
        x = F.relu(self.bn3(self.conv3(x)))
        x = F.relu(self.bn4(self.conv4(x)))
        x = F.relu(self.bn5(self.conv5(x)))
        x = nn.AvgPool2d(7)(x)
        x = x.view(x.size(0), -1) 
        x = self.fc(x)
        return x
onnx2ncnn simpleconv5.onnx simpleconv5.param simpleconv5.bin

生成的ncnn格式的模型包括两个文件,simpleconv5.param是网络的配置文件,simpleconv5.bin是网络的权重文件。

第二步,生成int8量化所需要的校准表。

ncnn2table models/simpleconv5.param models/simpleconv5.bin images.txt simpleconv5.table mean=[127.5,127.5,127.5] norm=[0.00784,0.00784,0.00784] shape=[48,48,3] pixel=RGB

 其中ncnn2table工具默认使用基于KL散度的8bit量化算法,它输入模型文件simpleconv5.param和simpleconv5.bin,校准表图片路径images.txt,预处理均值mean与标准化norm值,输入图片尺寸,RGB图片的格式,输出simpleconv5.table,即校准表。pixel=RGB表示输入网络的图片是RGB格式,当我们使用OpenCV进行图片读取后是BGR格式,两者需要进行区分。由于ncnn框架读取的图片数据像素值范围是0到127,而模型训练时采用的预处理操作包括除以255进行归一化,再减去均值向量[0.5,0.5,0.5],除以方差向量[0.5,0.5,0.5],因此这里对应的预处理操作需要将归一化操作合并到减均值操作和除以方差操作中,mean=255×[0.5,0.5,0.5]=[127.5,127.5,127.5], norm=1/255/[0.5,0.5,0.5]=[0.00784,0.00784,0.00784]

第三步,基于校准表进行量化。

量化前模型大小为6.4MB,量化后模型大小为1.6MB,8bit模型大小为float32模型大小的1/4,减少了存储空间。

模型部署测试

接下来我们使用C++接口对模型进行部署测试,并比较量化前后的模型精度是否受到严重影响,测试的核心C++功能函数代码如下:

#include "net.h"

#include <algorithm>
#if defined(USE_NCNN_SIMPLEOCV)
#include "simpleocv.h"
#else
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#endif
#include <stdio.h>
#include <vector>
#include <cmath>
//推理函数
static int detect_simpleconv5net(const ncnn::Net &simpleconv5net,const cv::Mat& bgr, std::vector<float>& cls_scores)
{
    ncnn::Mat in = ncnn::Mat::from_pixels_resize(bgr.data, ncnn::Mat::PIXEL_BGR2RGB, bgr.cols, bgr.rows, 224, 224);//读取图片数据
    const float mean_vals[3] = {0.5f*255.f, 0.5f*255.f, 0.5f*255.f};
    const float norm_vals[3] = {1/0.5f/255.f, 1/0.5f/255.f, 1/0.5f/255.f};

    in.substract_mean_normalize(mean_vals, norm_vals); //预处理

    ncnn::Extractor ex = simpleconv5net.create_extractor();//创建推理引擎

    ex.input("input.1", in); //填充数据

    ncnn::Mat out;
    float start_time = cv::getTickCount(); //计算模型推理时间
    ex.extract("59", out); //获得模型推理结果
    float end_time = cv::getTickCount();
    fprintf(stderr, "%s = %f %s\n", "inference time = ", (end_time-start_time)/cv::getTickFrequency()*1000, " ms");
 
    cls_scores.resize(out.w); //取softmax分类概率结果,指数减去固定值防止溢出处理
    float maxscore = 0.0;
    for (int j = 0; j < out.w; j++)
    {
        if(out[j] >= maxscore) maxscore = out[j]; 
        cls_scores[j] = out[j];
    }
    float sum = 0.0;

    for (int j = 0; j < out.w; j++)
    {
        cls_scores[j] = std::exp(cls_scores[j]-maxscore);
        sum += cls_scores[j]; 
    }
    for (int j = 0; j < out.w; j++)
    {
        cls_scores[j] = cls_scores[j] / sum;
    }
    return 0;
}

int main(int argc, char** argv)
{
    if (argc != 5)
    {
        fprintf(stderr, "Usage: %s%s%s [modelparam modelbin imagepath resultpath]\n", argv[0], argv[1], argv[2], argv[3]);
        return -1;
    }

    const char* modelparam = argv[1];
    const char* modelbin = argv[2];
    const char* imagepath = argv[3];
    const char* resultpath = argv[4];

    //初始化模型
    ncnn::Net simpleconv5net;
    simpleconv5net.opt.use_vulkan_compute = true;
    simpleconv5net.load_param(modelparam);
    simpleconv5net.load_model(modelbin);

    cv::Mat image = cv::imread(imagepath, 1);

    if (image.empty())
    {
        fprintf(stderr, "cv::imread %s failed\n", imagepath);
        return -1;
    }

    //获得topk的分类概率
    std::vector<float> cls_scores;
    detect_simpleconv5net(simpleconv5net, image, cls_scores);
    int topk = 1;
    int size = cls_scores.size();
    std::vector<std::pair<float, int> > vec;
    vec.resize(size);
    for (int i = 0; i < size; i++)
    {
        vec[i] = std::make_pair(cls_scores[i], i);
    }

    std::partial_sort(vec.begin(), vec.begin() + topk, vec.end(),
                      std::greater<std::pair<float, int> >());

    for (int i = 0; i < topk; i++)
    {
        float score = vec[i].first;
        int index = vec[i].second;
        fprintf(stderr, "%d = %f\n", index, score);
    }

    //绘制结果
    std::string text;
    std::string label = "c="+std::to_string(vec[0].second);
    std::string prob = "prob="+std::to_string(vec[0].first);
    text.assign(label+"   ");
    text.append(prob);

    int font_face = cv::FONT_HERSHEY_COMPLEX; 
    double font_scale = 0.75;
    int thickness = 2;

    //将文本框居中绘制
    cv::Mat showimage = image.clone();
    cv::resize(showimage,showimage,cv::Size(256,256));
    cv::Point origin; 
    origin.x = showimage.cols / 20;
    origin.y = showimage.rows / 2;
    cv::putText(showimage, text, origin, font_face, font_scale, cv::Scalar(0, 255, 255), thickness, 8, 0);
    cv::namedWindow("image",0);
    cv::imshow("image",showimage);
    //cv::waitKey(0);
    cv::imwrite(resultpath,showimage);

    return 0;
}

NCNN中每一层的数据被保存为自定义的Mat类型数据,它使用from_pixels_resize函数将OpenCV读取的Mat矩阵数据进行转换,由于计算使用了汇编,非常高效。网络定义为一个ncnn::Net类,格式与Caffe中的Net类非常相似,包含了layers和blobs成员变量,其中layers储存了每一层的信息,blobs储存了网络的中间数据。

在进行推理时,首先根据net实例化一个ncnn::Extractor类,extractor中的net会被转为const类。我们可以给extractor的任意一层送入数据,如extractor.input("data", in)就是给输入数据层赋值。通过extractor.extract函数可以取出任意层的数据,在extract方法中,它会调用forward_layer方法递归地遍历网络。

我们从20类中每一类随机选取一张图片来进行测试,比较量化前的模型推理结果和量化后的模型推理结果,下图展示了每一张图片的预测类别及经过Softmax映射后的概率,其中奇数行为量化前的模型推理结果,偶数行为量化后的模型推理结果。

 

从图中样本的预测结果可以看出,量化前后模型的预测概率是有差异的,但是差异非常小,大多在1%以内,所选测试图片的预测结果都是正确的,说明该模型经过量化后精度没有精度损失。

下图从上到下分别展示了量化前和量化后的模型推理时间,每一张图片的推理时间是通过重复100次推理后计算出来的平均值,这是为了让推理时间的计算更加稳定。可以看出,对于大部分样本,量化前模型的推理时间约为4.4ms左右,量化后模型的推理时间约为3.7ms左右,量化后模型的推理速度提升了16%,验证了模型量化的加速效果。

量化前推理时间

 

量化后推理时间

 

 我们也用python对onnx模型以及原生pytorch模型进行了计时,计算了平均推理时间约为25ms,相关代码如下:

#coding:utf8
import torch
import torchvision
from torchsummary import summary
import time
import cv2
import sys
import onnxruntime
import numpy as np
import PIL.Image as Image
import os,glob
from simpleconv5 import simpleconv5
torch.manual_seed(0)
os.environ['CUDA_LAUNCH_BLOCKING'] = '1'

# 图像预处理函数
def process_image(img):
    input_size = [224,224]
    mean = (0.5,0.5,0.5)
    std = (0.5,0.5,0.5)
    img = np.asarray(img.resize((input_size[0],input_size[1]),resample=Image.NEAREST)).astype(np.float32) / 255.0
    img[:,:,] -= mean
    img[:,:,] /= std
    image = img.transpose((2,0,1))[np.newaxis, ...]
    return image

imgdir = "../GHIM-20"

'''
##-----------------------test pytorch------------------------##
# 加载模型
model = simpleconv5(20)
modelpath = '../models/model_best.pth.tar'
model.load_state_dict(torch.load(modelpath,map_location='cpu')['state_dict'])
model.eval()
acc = 0.0
nums = 0.0
start_Inference = time.time()
for imgpath in glob.glob(os.path.join(imgdir, "**/*.jpg"),recursive=True):
    img = Image.open(imgpath).convert('RGB')
    data_input = process_image(img)
    input_data = torch.from_numpy(data_input)
    data_output = model(input_data)
    output = data_output.squeeze().cpu().detach().numpy()
    pred1 = output.argmax()
    label = int(imgpath.split('/')[-2])
    if label == pred1:
        acc += 1.0
    nums += 1.0

end_Inference = time.time()
print('Inference use time='+str((end_Inference-start_Inference)*1000/nums)+' ms')
print("acc=",acc/nums)
'''

##-----------------------test onnx------------------------##
onnx_path = '../models/simpleconv5.onnx'
result_path = 'onnx_results'
session = onnxruntime.InferenceSession(onnx_path)
inname = [input.name for input in session.get_inputs()]
outname = [output.name for output in session.get_outputs()]
acc = 0.0
nums = 0.0
print("inputs name:",inname,"|| outputs name:",outname)
start = cv2.getTickCount()
for imgpath in glob.glob(os.path.join(imgdir, "**/*.jpg"),recursive=True):
    img = Image.open(imgpath).convert('RGB')
    data_input = process_image(img)
    data_output = session.run(outname, {inname[0]: data_input})
    output = np.squeeze(data_output[0])
    pred1 = output.argmax()
    prob = output[pred1]
    label = int(imgpath.split('/')[-2])
    if label == pred1:
        acc += 1.0
    nums += 1.0
end = cv2.getTickCount()
print('ONNX Inference Time='+str((end-start)/nums/cv2.getTickFrequency()*1000)+' ms')
print("acc=",acc/nums)

可以看出,C++推理速度相比于python推理速度,有6倍左右的提升。量化后相比于量化前的提升速度并不大,这是因为香橙派本身的硬件足够出色,笔者的MacBook Pro Apple M2上的onnx推理时间也需要8ms左右。

总体来讲,香橙派的性能比我之前的EAIDK-310开发套件性能强多了,同样的模型EAIDK-310量化后的推理时间需要20ms以上,以后做嵌入式项目演示,就用香橙派 Kunpeng Pro了!

香橙派KunpengPro测评之使用C语言操控40pin引脚 香橙派鲲鹏Pro是一款高性能开发板,搭载4核64位鲲鹏处理器与AI加速器,提供8/16GB LPDDR4X内存及多种存储扩展选项。它配备双HDMI输出、M.2插槽、USB 3.0/Type-C接口等,支持4K视频、高速数据传输及网络连接。预装openEuler操作系统,适合AI研发、云计算、大数据处理等应用场景,凭借其强大的性能与灵活扩展性,成为教育、开发及创新项目的优选平台。 香橙派KunpengPro正面图 香橙派KunpengPro反面图 香橙派KunpengPro左侧面图 香橙派Kunpeng 阅读详情

相关推荐

ncnn多模型合并

ncnn多模型合并

jacke121的专栏 1386

使用香橙派学习 嵌入式数据库---SQLite

SQLite是一个无服务器的数据库,是自包含的。这也称为嵌入式数据库,这意味着数据库引擎作 为应用程序的一部分运行。

mjmmm的博客 768

手把手教你搭建一个属于自己的网站-适合零基础小白,文末附网站模板

手把手教你搭建一个属于自己的网站-适合零基础小白写在前面搭建需求功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 写在前面 前段时间休息想着搭一个属于自己的网站,几经尝试终于成功了,网上其实有很多教程,但很多,希望这篇文章能够帮助到

qq_46788925的博客 1万+

第一章 初识香橙派

香橙派

itt21044ZCY的博客 934

OpenBullet2 学习研究2-Conditions条件之KeyCheck的使用

上一节我们学习了如何安装Openbullet2以及如何新建一个配置,最后我们再配置里面新建一个Http的请求块,帮助我们发送了第一个请请求。这一节我们来学习check块。当我们发送请求以后,请求返回的内容是否是我们想要的,或者请求发送正确没有,这个我们怎么判断呢?这个时候就要用到check块了。

959

《Linux运维总结:Ubuntu22.04忘记root密码解决方案》

《Linux运维总结:Ubuntu22.04忘记root密码解决方案》

东城绝神 4460

香橙派Kunpeng Pro性能测评:高效能小型服务器开发板的全面体验

总体而言,香橙派 Kunpeng Pro 的首次开机体验非常顺畅,系统启动速度也很快,得益于其预装的 openEuler 桌面系统和人性化的设计。无论是通过 SSH 远程连接还是直接连接显示器,都能快速上手并开始使用。多测了几次,并根据测试结果生成表格,方便对比数据及排除只测一次出现特殊情况的可能,整体来看差异并不是很大测试类型每秒事件数(Events per Second)总事件数(Total Number of Events)总时间(Total Time)(秒)

sywdebug的博客 2494

DC/DC开关电源学习笔记(一)开关电源技术概述

开关模式电源(Switch Mode Power Supply,简称SMPS),又称交换式电源、开关变换器,是一种高频化电能转换装置,是电源供应器的一种。其功能是将一个位准的电压,透过不同形式的架构转换为用户端所需求的电压或电流。开关电源的输入多半是交流电源(例如市电)或是直流电源,而输出多半是需要直流电源的设备,例如个人电脑,而开关电源就进行两者之间电压及电流的转换。【百度百科】

小幽余生不加糖 1623

OrangePi Kunpeng Pro 开发板测评及Python开发实测

Orange Pi Kunpeng Pro 开发板是香橙派联合华为精心打造的高性能开发板,其 搭载了鲲鹏处理器,可提供 8TOPS INT8 计算能力,提供了 8GB 和 16GB 两种内存 版本。Kunpeng Pro 开发板结合了鲲鹏全栈根技术,全面使能高校计算机系统教学 和原生开发。同时支持 FPGA+ARM,从体系结构、数字逻辑设计、操作系统和编 译,再到嵌入式开发,可以基于同一套体系结构和一套开发板实现贯穿打通。顶层视图:底层视图:Orange Kunpeng Pro 开发板硬件规格处理器。

星陨阁:wxgnolux 2352

BoT-SORT实战:手把手教你实现BoT-SORT训练和测试

文章目录摘要1、数据准备2、配置BoT-SORT环境2.1、获取代码2.2、创建虚拟环境2.3、安装必要的包2.3.1、安装pytorch2.3.2、安装cython2.3.3、安装Cython-bbox2.3.4、安装faiss2.3.5、安装其他的包3、训练3.1、生成REID数据集3.2、预训练模型3.2.1、ByteTrack预训练模型3.2.2、REID预训练模型3.3、开始训练4、如何更改FASTREID的BackBone?5、测试5.1、测试视频5.2、测试摄像头5.3、多类别测试 摘要 Bo

m0_47867638的博客 2300

ComfyUI 局部重绘工作流示例

本文介绍了使用ComfyUI进行图像局部重绘的基础工作流程,重点讲解如何修改人物眼睛颜色和表情。主要内容包括:1.准备工作(可选下载DreamShaperv8模型);2.加载素材图片和工作流文件;3.使用遮罩编辑器绘制需要修改的区域;4.修改提示词控制生成内容;5.调整denoise参数优化效果。教程提供了详细的提示词示例(如"smile,blackeyes"等)和参数设置建议,帮助用户通过多次尝试获得理想效果。该工作流适用于修改图像局部区域而不影响整体画面。

云域A的博客 334

香橙派上手记录(orangepi pc)

文章目录1、香橙派介绍2、安装系统3、换源更新4、安装opencv 注:本人也是初次接触,并且本人在linux方面的基础很弱,因此本文也不会有太多的技术含量,本文仅记录下这个上手过程,希望之后的小白能少走点弯路就是了 1、香橙派介绍 2、安装系统 3、换源更新 4、安装opencv ......

时时总结,常常分享 2万+

UE实现贴地线(SurfaceLine)效果

UnrealEngine实现贴地线效果

专注GIS开发 4573

【香橙派】-从零开始的学习之旅

本章内容基于官方手册《OrangePi_3_LTS_H6_用户手册_v2.2》与自己实际操作撰写。

HuangB的博客 7024

高通拨号流程介绍

本文介绍了高通平台(如SDX55)中APSS(A7处理器)与ModEM(Q6处理器)间的通信机制。

四儿家的小祖宗的博客 1068

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

香橙派Kunpeng Pro初体验

我拿到的是OrangePi Kunpeng Pro套装(主板,8G,电源,散热组件,32GB存储卡),快递打开之后里面的套餐设备如下图所示,除了OrangePi Kunpeng Pro开发板之外还有一个电源插口和Type C数据线。OrangePi Kunpeng Pro开发板是用盒子保护的,打开盒子之后里面就是OrangePi Kunpeng Pro。

RickyWasYoung的博客 1837

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

ncnn之三(补充):window环境下vs2022安装ncnn+protobuf

启动VS2022 下面的 x64 Native Tools Command Prompt for VS2022。

mingo_敏 1327

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

香橙派鲲鹏Pro(orange pi kunpeng) 开箱测试,和在娱乐功能(电视盒子),深度机器学习应用方面的测试报告

Orange Pi kunpeng pro进行综合评测,特别关注其作为电视盒子的性能以及在深度学习应用中的算力和稳定性。通过一个月的测试,我们评估了其硬件性能、软件兼容性、用户体验和实际应用潜力。

AI 前沿技术实战博客:LLM / Agent / AI 制药 / 生信四大栏目日更,硬核干货 + 可复现代码,看完就能上手 3309

OrangePi Kunpeng Pro 开发板开箱体验

OrangePi Kunpeng Pro提供了多种流行的接口,确保了广泛的扩展和外设连接能力:视频输出:支持双HDMI 2.0输出和一个MIPI DSI视频输出,支持双4K高清显示。存储扩展:支持SATA/NVMe SSD 2280硬盘的M.2插槽,提供了海量数据存储空间,满足快速读写需求。网络接口:千兆以太网接口确保了高速网络连接。USB接口:两个USB 3.0接口、一个USB Type-C 3.0接口,以及一个Micro USB用于串口打印和调试。

爱折腾的博客 1715

国产开发板——香橙派Kunpeng Pro的上手初体验

开发板(Development Board)是一种特殊的电子产品,它的主要目的是为了帮助开发者快速地设计、测试和验证电子产品的硬件和软件设计。开发板通常提供了一个完整的硬件平台,包括微控制器、存储器、接口和其他外围设备,开发者可以基于这个平台开发和测试自己的应用程序。 ...

君一席 3247

【香橙派开发板测试】:在黑科技Orange Pi AIpro部署YOLOv8深度学习纤维分割检测模型

为AI而生”深圳市迅龙软件有限公司成立于2005年,是全球领先的开源硬件、开源软件及智能产品品牌商,致力于让全世界每个极客、创客、电子爱好者享用来自中国的优质、低价的开源产品及智能产品,拓展无限可能,通过大规模的社会化协作去创建一个更加美好的信息化人类文明。目前迅龙业务遍及美国、英国、意大利、俄罗斯、日本、南非、东南亚等100多个国家和地区。香橙派的Orange Pi AIpro是一款专为人工智能(AI)应用开发设计的高性能开发板。

慕溪同学的博客 3537

基于YOLOv7的模型训练→转换RKNN→RK3588开发板部署(香橙派Orange Pi 5 Plus (8GB))

这是一个关于从电脑安装深度学习环境到实现YOLOv7车牌识别在RK3588上部署的全过程,输入源有图片和视频,边做边补充。

Original_kk的博客 1506

香橙派rk3588plus部署yolov8(npu加速)

文件,查看模型的计算图结构,RK3588 通常使用的是支持 ONNX 的推理框架,比如 TNN、MNN、NCNN 等,这些框架对 ONNX 的 opset 版本有支持要求,如果模型的 opset 版本过高,可能不被支持,导致转换或运行失败,所以需要确保 opset 版本在目标框架支持的范围内,选择老一点的版本更加稳妥,参考着使用 torch.onnx.export 的 opset_version 参数。4. 放置文件并运行。,卡和读卡器一定要有,照官方给的步骤来安装自己所需要的系统,没什么好说的。

y8_7_16的博客 3634

香橙派Kunpeng Pro深度测评:开发者的新选择

最近收到了香橙派的最新开发板Orange Pi Kunpeng Pro,在许多地方惊艳到了我,它搭载的鲲鹏处理器可以提供8TOPS INT8的计算能力的4核64位处理器并且带着AI处理功能,并且集成了GPU支持高质量图形的快速渲染。灵活的内存配置、多样化的存储选项、丰富的显示与摄像头接口以及依然拥有的40PIN拓展引脚,这些配置让此开发板在嵌入式的开发研究、人工智能和机器学习、机器视觉的研究或是构建小型的个人服务器或者专用的计算机系统都可以得到很好的应用。

qq_52836452的博客 1685

NCNN转换YOLO4网络并推理

记录基于NCNN的YOLO4网络转换并推理成功的过程。 首先按照下面两篇博客的做法安装NCNN和darknet开发环境: 腾讯神经网络推理框架NCNN试玩儿_tugouxp的专栏-优快云博客ncnn 是腾讯开源的神经网络推理框架,官方仓库有详细介绍:https://github.com/Tencent/ncnn.git下面在普通PC的ubuntu18.04环境上搭建环境,运行一把。1.下载代码:git clone https://github.com/Tencent/ncnn.git2.配置环境:cd

tugouxp的专栏 1153

昇思+昇腾开发板:DeepSeek 蒸馏模型在香橙派开发板的全流程开发实践与经验分享

2025 蛇年春节爆火的 DeepSeek 模型启发开发者关注轻量级蒸馏方案。本文以昇思 MindSpore 为框架,详解在香橙派开发板实现 DeepSeek 蒸馏模型的全流程:从基础环境搭建、模型开发微调,到推理部署与性能优化,同步分享嵌入式设备适配经验,助力开发者掌握边缘 AI 落地实践。

前端基地 1145
上一篇: 直播课程 | AIGC创作工具指南,轻松解锁5大行业10+热门工具使用教程!
下一篇: 【通知】大模型内容持续更新,有三AI知识星球618特惠活动开启!
言有三
言有三 领域专家: 人工智能技术领域 领域专家: 人工智能技术领域
博客等级 码龄15年 3635粉丝 976原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

言有三

三人行必有AI

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值