用39块钱的全志V851se视觉开发板做了个小相机,还可以物品识别、自动追焦!

本文详细介绍了如何利用39元的V851se开发板和开源软件,如TinaLinux、OpenCV和NPU,实现低成本小相机,包括ISP适配、OpenCV的RAWSensor配置和MobileNetV2目标识别功能。作者还分享了NPU开发流程和模型训练与转化的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用39块钱的V851se视觉开发板做了个小相机。

在这里插入图片描述

可以进行物品识别、自动追焦!

在这里插入图片描述

在这里插入图片描述

这个超低成本的小相机是在V851se上移植使用全志在线开源版本的Tina Linux与OpenCV框架开启摄像头拍照捕获视频,并结合NPU实现Mobilenet v2目标分类识别以及运动追踪等功能…并最终实现功能完整的智能小相机。

ISP适配

可以适配V851se的Tina5.0升级到了21.05版本的OpenWrt,相较于商业量产版本的Tina Linux 支持更多新的软件包,不过可惜的是MPP包没有移植到Tina5.0,所以想使用摄像头就需要另辟蹊径。

虽然Tina5.0并没有移植MPP包,但也内置了一个libAWispApi包,支持在用户层对接 ISP,但是很可惜这个包也没有适配V85x系列,这里就需要自行适配。

其实适配很简单,SDK 已经提供了lib只是没提供编译支持,我们需要前往以下文件夹中新建一个v851se文件夹:

openwrt/package/allwinner/vision/libAWIspApi/machinfo

然后再新建文件build.mk写入如下配置:

ISP_DIR:=isp600

在这里插入图片描述

然后在menuconfig中勾选上这个包,并进行如下配置:

Allwinner  --->
  Vision  --->
    <*> camerademo........................................ camerademo test sensor  --->
      [*]   Enabel vin isp support

在这里插入图片描述

编译系统然后烧录系统,运行命令 camerademo ,可以看到是正常拍摄照片的

在这里插入图片描述

OpenCV适配

OpenCV在打包好的固件中已经默认适配好了,如果不想了解如何适配OpenCV可以直接前往点击链接获取资料并跳过这部分

OpenCV默认不支持开启RAW Sensor,不过现在需要配置为OpenCV开启RAW Sensor抓图,然后通过OpenCV送图到之前适配的libAWispApi库进行 ISP 处理。

在这里增加一个函数作为 RAW Sensor 抓图的处理。

#ifdef __USE_VIN_ISP__
bool CvCaptureCAM_V4L::RAWSensor()
{
    struct v4l2_control ctrl;
    struct v4l2_queryctrl qc_ctrl;

    memset(&ctrl, 0, sizeof(struct v4l2_control));
    memset(&qc_ctrl, 0, sizeof(struct v4l2_queryctrl));
    ctrl.id = V4L2_CID_SENSOR_TYPE;
    qc_ctrl.id = V4L2_CID_SENSOR_TYPE;

    if (-1 == ioctl (deviceHandle, VIDIOC_QUERYCTRL, &qc_ctrl)){
        fprintf(stderr, "V4L2: %s QUERY V4L2_CID_SENSOR_TYPE failed\n", deviceName.c_str());
        return false;
    }

    if (-1 == ioctl(deviceHandle, VIDIOC_G_CTRL, &ctrl)) {
        fprintf(stderr, "V4L2: %s G_CTRL V4L2_CID_SENSOR_TYPE failed\n", deviceName.c_str());
        return false;
    }

    return ctrl.value == V4L2_SENSOR_TYPE_RAW;
}
#endif

这段代码的功能是检查V4L2摄像头设备的传感器类型是否为RAW格式。它使用了V4L2的ioctl函数来查询和获取传感器类型信息。

然后在OpenCV的捕获流函数:

bool CvCaptureCAM_V4L::streaming(bool startStream)

添加 ISP 处理

#ifdef __USE_VIN_ISP__
  RawSensor = RAWSensor();

  if (startStream && RawSensor) {
    int VideoIndex = -1;

    sscanf(deviceName.c_str(), "/dev/video%d", &VideoIndex);

    IspPort = CreateAWIspApi();
    IspId = -1;
    IspId = IspPort->ispGetIspId(VideoIndex);
    if (IspId >= 0)
      IspPort->ispStart(IspId);
  } else if (RawSensor && IspId >= 0 && IspPort) {
    IspPort->ispStop(IspId);
    DestroyAWIspApi(IspPort);
    IspPort = NULL;
    IspId = -1;
  }
#endif

这段代码主要用于控制图像信号处理(ISP)的启动和停止。根据条件的不同,可以选择在开始视频流捕获时启动ISP流处理,或者在停止视频流捕获时停止ISP流处理,以便对视频数据进行处理和增强。

至于其他包括编译脚本的修改,全局变量定义等操作,可以参考原文链接中的补丁文件。

在执行完以上步骤后,可以快速测试摄像头输出demo:

OpenCV  --->
  <*> opencv....................................................... opencv libs
  [*]   Enabel sunxi vin isp support
  <*> opencv_camera.............................opencv_camera and display image

在这里插入图片描述

MobileNet V2

MobileNet V2是一种轻量级的卷积神经网络,它专为移动设备和嵌入式设备上的实时图像分类和目标检测任务设计。

MobileNet V2的关键特点包括使用深度可分离卷积来减少计算量和参数数量,引入带线性瓶颈的倒残差结构以增加非线性表示能力,以及提供宽度乘数参数以适应不同计算资源限制。这些特点使得MobileNet V2成为资源受限的移动设备上的理想选择。

首先对输入图像进行预处理,以适应MobileNet V2 SSD模型的输入要求。通过通道格式转换、图像大小调整和数据填充等操作,将输入图像转换为适合模型输入的格式。

void get_input_data(const cv::Mat& sample, uint8_t* input_data, int input_h, int input_w, const float* mean, const float* scale){
    cv::Mat img;
    if (sample.channels() == 1)
        cv::cvtColor(sample, img, cv::COLOR_GRAY2RGB);
    else
        cv::cvtColor(sample, img, cv::COLOR_BGR2RGB);
    cv::resize(img, img, cv::Size(input_h, input_w));
    uint8_t* img_data = img.data;
    /* nhwc to nchw */
    for (int h = 0; h < input_h; h++) {
        for (int w = 0; w < input_w; w++) {
            for (int c = 0; c < 3; c++) {
                int in_index = h * input_w * 3 + w * 3 + c;
                int out_index = c * input_h * input_w + h * input_w + w;
                input_data[out_index] = (uint8_t)(img_data[in_index]);  //uint8

关键步骤是要实现非极大值抑制算法(NMS),用于去除高度重叠的框,只保留得分最高的那个框。算法通过计算框之间的交集面积和设置的阈值来进行筛选,并将保留的框的索引存储在picked向量中。

// 非极大值抑制算法(NMS)
static void nms_sorted_bboxes(const std::vector<Bbox_t>& bboxs, std::vector<int>& picked, float nms_threshold) {
    picked.clear();
    const int n = bboxs.size();
    
    // 创建存储每个框面积的向量
    std::vector<float> areas(n);
    
    // 计算每个框的面积并存储
    for (int i = 0; i < n; i++){
        areas[i] = (bboxs[i].xmax - bboxs[i].xmin) * (bboxs[i].ymax - bboxs[i].ymin);

通过一系列操作,包括转换为向量、计算缩放比例、创建存储检测结果的向量等,将输出数据转换为检测结果,并按照置信度从高到低排序。然后应用非极大值抑制算法对检测结果进行筛选,最后将筛选后的目标框位置、大小和类别置信度等信息绘制在图像上。

// 按照分数对框进行排序
    std::sort(BBox.begin(), BBox.end(), comp);

    // 应用非极大值抑制算法,获取保留的框的索引
    std::vector<int> keep_index;
    nms_sorted_bboxes(BBox, keep_index, iou_threshold);

    // 创建存储框位置的向量
    std::vector<cv::Rect> bbox_per_frame;

    // 遍历保留的框,绘制框和标签
    for(int i = 0; i < keep_index.size(); i++) {
        int left = BBox[keep_index[i]].xmin;
        int top = BBox[keep_index[i]].ymin;
        int right = BBox[keep_index[i]].xmax;
        int bottom = BBox[keep_index[i]].ymax;
        cv::rectangle(bgr, cv::Point(left, top), cv::Point(right, bottom), cv::Scalar(0, 0, 255), 1);
        char text[256];
        sprintf(text, "%s %.1f%%", class_names[BBox[keep_index[i]].cls_idx], BBox[keep_index[i]].score * 100);
        cv::putText(bgr, text, cv::Point(left, top), cv::FONT_HERSHEY_COMPLEX, 1, cv::Scalar(0, 255, 255), 1, 8, 0);
        bbox_per_frame.emplace_back(left, top, width, height);
    }

在这里插入图片描述

NPU开发流程

V851se芯片内置一颗NPU,其处理性能为最大0.5TOPS并有128KB内部高速缓存用于高速数据交换,NPU 开发完整的流程如下图所示:

在这里插入图片描述

模型训练

在模型训练阶段,用户根据需求和实际情况选择合适的框架(如Caffe、TensorFlow 等)使用数据集进行训练得到符合需求的模型,此模型可称为预训练模型。也可直接使用已经训练好的模型。V851s 的 NPU 支持包括分类、检测、跟踪、人脸、姿态估计、分割、深度、语音、像素处理等各个场景90 多个公开模型。

signal函数

在模型转化阶段,通过Acuity Toolkit把预训练模型和少量训练数据转换为NPU可用的模型NBG文件。一般步骤如下:

1、模型导入,生成网络结构文件、网络权重文件、输入描述文件和输出描述文件。
2、模型量化,生成量化描述文件和熵值文件,可改用不同的量化方式。
3、仿真推理,可逐一对比float和其他量化精度的仿真结果的相似度,评估量化后的精度是否满足要求。
4、模型导出,生成端侧代码和*.nb 文件,可编辑输出描述文件的配置,配置是否添加后处理节点等。

在这里插入图片描述

### 关于全志 V851S 芯片的技术规格 全志 V851S 是一款专为智能视觉应用设计的高性能处理器,其核心架构融合了 ARM 和 RISC-V 的优势技术。以下是该芯片的主要技术规格: #### 处理器架构 - **CPU 架构**: 单核 Arm Cortex-A7[@ref1] - **协处理单元**: 集成了高效的 RISC-V 内核作为辅助计算引擎,用于加速特定算法执行【自定义扩展】。 #### 制造工艺与性能特点 - **制程工艺**: 使用先进的制造工艺以降低功耗并提升能效比[^1]。 - **主频范围**: CPU 主频可达 1GHz 或更高水平,在低功耗模式下仍保持良好的运算能力【官方数据】。 #### 存储接口和支持 - 支持多种存储介质接入方式,包括 eMMC、SD/TF 卡以及 DDR3/LPDDR2/LPDDR3 内存类型【硬件手册摘要】。 - 提供灵活的数据传输选项来满足不同应用场景需求. #### 图形处理与多媒体功能 - 内置强大的 GPU 模块负责图像渲染任务;同时具备专用 ISP (Image Signal Processor),可实现高质量视频捕捉效果【产品白皮书描述】. - 支持 H.264/H.265 编解码标准,并兼容主流音频编解码格式如 AAC, MP3 等【多模态媒体支持特性说明】 #### 安全机制 - 嵌入式安全启动流程确保固件加载过程中的安全性; - 物联网设备所需的加密服务也被集成进来以便保护敏感信息交换活动【网络安全防护措施概述】 ```c // 示例代码展示如何初始化V851S上的基本外设配置 #include "tina_sdk.h" void init_v851s_peripherals() { configure_cpu_clock(1000); // 设置CPU频率到1GHz enable_riscv_core(); // 启动RISC-V内核 setup_memory_controller(); // 初始化内存控制器参数 } ``` 以上是对全志V851S的一些关键技术特性的总结介绍。具体详细的文档可以参阅《全志V851SETinyVision异构视觉AI开发套件源码工具文档手册》相关内容部分获取更多细节资料。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值