0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用V851se视觉开发板制作超低成本的小相机

全志在线 来源:全志在线 2024-02-25 10:05 次阅读

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

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

我和我的小伙伴都馋哭了!

这个超低成本的小相机是在V851se上移植使用全志在线开源版本的Tina LinuxOpenCV框架开启摄像头拍照捕获视频,并结合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

1dc100ee-d22e-11ee-a297-92fbcf53809c.png

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

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

1dcebd06-d22e-11ee-a297-92fbcf53809c.png

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

1ddcc36a-d22e-11ee-a297-92fbcf53809c.png

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
", deviceName.c_str());
    return false;
  }


  if (-1 == ioctl(deviceHandle, VIDIOC_G_CTRL, &ctrl)) {
    fprintf(stderr, "V4L2: %s G_CTRL V4L2_CID_SENSOR_TYPE failed
", 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& bboxs, std::vector& picked, float nms_threshold) {
  picked.clear();
  const int n = bboxs.size();
  
  // 创建存储每个框面积的向量
  std::vector 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 keep_index;
  nms_sorted_bboxes(BBox, keep_index, iou_threshold);


  // 创建存储框位置的向量
  std::vector 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 开发完整的流程如下图所示:

1e461112-d22e-11ee-a297-92fbcf53809c.png

模型训练

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

signal函数

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

模型导入,生成网络结构文件、网络权重文件、输入描述文件和输出描述文件。

模型量化,生成量化描述文件和熵值文件,可改用不同的量化方式。

仿真推理,可逐一对比float和其他量化精度的仿真结果的相似度,评估量化后的精度是否满足要求。

模型导出,生成端侧代码和*.nb 文件,可编辑输出描述文件的配置,配置是否添加后处理节点等。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10990

    浏览量

    206734
  • 相机
    +关注

    关注

    4

    文章

    1253

    浏览量

    52447
  • 开发板
    +关注

    关注

    25

    文章

    4429

    浏览量

    93991
  • OpenCV
    +关注

    关注

    29

    文章

    611

    浏览量

    40774

原文标题:用39块钱的视觉开发板做了个小相机,还可以物品识别、自动追焦!

文章出处:【微信号:gh_79acfa3aa3e3,微信公众号:全志在线】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何使用TinyVision去手动构建Linux 6.1+Debian 12镜像呢?

    SyterKit是一个纯裸机框架,可以用于TinyVision或者v851se/v851s/v853等芯片的开发板,SyterKit使用CMake作为构建系统构建,支持多种应用与多种外设驱动。
    的头像 发表于 03-15 18:16 1397次阅读
    如何使用TinyVision去手动构建Linux 6.1+Debian 12镜像呢?

    1月全志芯片开源项目分享合辑

    V851se,芯片内置0.5Tops算力,可用于AI视觉IPC摄像头,内置100M ephy可以支持路由设备功能。开发板在外设功能的增加上采用了硬件堆叠的方式,V851se
    发表于 01-29 10:20

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

    用39块钱的V851se视觉开发板做了个小相机。 可以进行物品识别、自动追焦! 这个超低成本的小相机
    发表于 02-26 10:21

    在基于全志V851se的TinyVision上手动构建 Linux 6.1 + Debian 12 镜像

    构建 SyterKit 作为 Bootloader SyterKit 是一个纯裸机框架,用于 TinyVision 或者其他 v851se/v851s/v851s3/v853 等芯片的
    发表于 03-18 10:49

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

    用39块钱的V851se视觉开发板做了个小相机。 可以进行物品识别、自动追焦! 我和我的小伙伴都馋哭了! 这个超低成本的小
    发表于 04-08 15:07

    全志V851se开发板TinyVision镜像制作快速启动教程

    烧录工具: PhoenixCard-V2.8 软件:TinaTF卡最小系统镜像:tina_v851se-tinyvision_uart0.img 烧录过程请参考下述步骤: 打开 已经下载好的 凤凰卡
    发表于 04-10 16:50

    mm32f031最低成本批量大概什么价格,如何申请样片和开发板

    mm32f031最低成本批量大概什么价格,如何申请样片和开发板
    发表于 08-21 16:44

    MicroPython支持的开发板:高性能、低成本,创客首选

    : TPYBoardv102:高性能、低成本的MicroPython开发板 TPYBoardv102是以遵照MIT许可的MicroPython为基础,由TurnipSmart公司制作的一款MicroPython
    发表于 04-15 14:49

    高性能低电量低成本开发板选型

    嗨,我只想知道我可以为我的应用程序选择开发板。我的申请要求: - 高性能 - 低电量 - 低成本(如果可能的话)我将感谢您的贡献。CharkoPS:抱歉我的英语不好!以上来自于谷歌翻译以下为原文
    发表于 01-10 11:15

    用于原型的小型低成本电路开发板

    描述用于原型的小型低成本电路开发板近年来,我用 Arduino 开发了许多原型。在这些创作过程中,总有一些事情困扰着我。在原型中使用 Arduino 占用了大量空间,价格昂贵,并且难
    发表于 09-05 07:18

    【开源硬件大赛】基于V851S的多媒体开发板

    1.对于1.8V,为了简化电路图 采用的内部LDO输出的1.8V2.采用MIPI高速摄像头3.采用LCD便于开发与调试4.采用核心外设独立设计,方便模块化*附件
    发表于 12-08 21:34

    【Milk-V Duo 开发板免费体验】Milk-V Duo 开发板初体验

    今天收到 ,打开快递的第一感觉就是非常精致小巧,一个黑色的小盒子及一块非常小巧但功能非常完善的开发板。 Milk-V Duo是一款基于算能 CV1800B芯片的MPU,能够运行基于LINUX
    发表于 08-18 00:26

    超低成本宽带中间阻抗转换器

    超低成本宽带中间阻抗转换器 本文介绍的低成本射频阻抗转换探头的制作材料在实验室很容易得到。在处理低阻抗电路的问题时,阻抗
    发表于 12-14 14:12 728次阅读
    <b class='flag-5'>超低成本</b>宽带中间阻抗转换器

    低成本 MiniZed Zynq SoC 开发板

    MiniZed Zynq SoC 开发板基于全新 Xilinx Zynq Z-7007S 器件,现可通过安富利订购,仅需 89 美元。该开发板为单核 ARM Cortex-A9 开发人员提供了一个
    的头像 发表于 09-22 18:02 7083次阅读

    用于原型的小型低成本电路开发板

    电子发烧友网站提供《用于原型的小型低成本电路开发板.zip》资料免费下载
    发表于 08-15 14:26 1次下载
    用于原型的小型<b class='flag-5'>低成本</b>电路<b class='flag-5'>开发板</b>