<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
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

    文章

    11022

    瀏覽量

    207054
  • 相機
    +關注

    關注

    4

    文章

    1266

    瀏覽量

    52716
  • 開發板
    +關注

    關注

    25

    文章

    4560

    瀏覽量

    94886
  • OpenCV
    +關注

    關注

    29

    文章

    612

    瀏覽量

    40871

原文標題:用39塊錢的視覺開發板做了個小相機,還可以物品識別、自動追焦!

文章出處:【微信號:gh_79acfa3aa3e3,微信公眾號:全志在線】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    如何使用TinyVision去手動構建Linux 6.1+Debian 12鏡像呢?

    SyterKit是一個純裸機框架,可以用于TinyVision或者v851se/v851s/v853等芯片的開發板,SyterKit使用CMake作為構建系統構建,支持多種應用與多種外設驅動。
    的頭像 發表于 03-15 18:16 ?1568次閱讀
    如何使用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

    在全志V851SE開發板TinyVision上 使用 SyterKit 啟動 Linux 6.7 主線內核

    s/v851s3/v853 等芯片的開發板,SyterKit 使用 CMake 作為構建系統構建,支持多種應用與多種外設驅動。同時 SyterKit 也具有啟動引導的功能,可以替代 U-Boot 實現
    發表于 05-20 09:35

    全志V851SETinyVision異構視覺AI開發套件源碼工具文檔手冊

    s/v851s3/v853 等芯片的開發板,SyterKit 使用 CMake 作為構建系統構建,支持多種應用與多種外設驅動。同時 SyterKit 也具有啟動引導的功能,可以替代 U-Boot 實現
    發表于 05-27 10:23

    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

    超低成本寬帶中間阻抗轉換器

    超低成本寬帶中間阻抗轉換器 本文介紹的低成本射頻阻抗轉換探頭的制作材料在實驗室很容易得到。在處理低阻抗電路的問題時,阻抗
    發表于 12-14 14:12 ?738次閱讀
    <b class='flag-5'>超低成本</b>寬帶中間阻抗轉換器

    低成本 MiniZed Zynq SoC 開發板

    MiniZed Zynq SoC 開發板基于全新 Xilinx Zynq Z-7007S 器件,現可通過安富利訂購,僅需 89 美元。該開發板為單核 ARM Cortex-A9 開發人員提供了一個
    的頭像 發表于 09-22 18:02 ?7144次閱讀

    用于原型的小型低成本電路開發板

    電子發燒友網站提供《用于原型的小型低成本電路開發板.zip》資料免費下載
    發表于 08-15 14:26 ?1次下載
    用于原型的小型<b class='flag-5'>低成本</b>電路<b class='flag-5'>開發板</b>
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>