在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

RK3568開發板:USB攝像頭實時AI物品識別代碼實現

電子發燒友開源社區 ? 來源:未知 ? 2023-03-11 14:15 ? 次閱讀

上篇文章演示了使用飛凌OK3568-C開發板外接USB攝像頭進行AI物品識別,并進行了視頻演示,本篇來介紹下代碼實現。

01

SSD模型介紹

SSD,全稱為Single Shot MultiBox Detector,是Wei Liu在ECCV 2016上提出的一種目標檢測算法,屬于一階段One Stage方法,SSD 模型利用不同尺度的特征圖進行目標的檢測,其模型結構圖如下:

8d4b2dbe-bfd2-11ed-bfe3-dac502259ad0.png

SSD具有如下主要特點:

  • 從YOLO中繼承了將detection轉化為regression的思路,同時一次即可完成網絡訓練

  • 基于Faster RCNN中的anchor,提出了相似的prior box

  • 加入基于特征金字塔(Pyramidal Feature Hierarchy)的檢測方式,相當于半個FPN思路

SSD網絡結構圖如下:

8d6790da-bfd2-11ed-bfe3-dac502259ad0.png

其算法步驟為:

  • 將圖像輸入預訓練好的分類網絡(基于VGG16-Atrous)得到不同大小的特征映射

  • 分別提取Conv4_3、Conv7、Conv8_2、Conv9_2、Conv10_2、Conv11_2層的特征映射feature map,在每個特征映射的每個點構造6個不同大小尺度的bounding box,進行檢測和分類來生成一些列bounding box

  • 采用NMS處理不同特征映射的bounding box,刪掉部分重疊或者不正確的bounding box,得到最終的檢測框

OK3568-C開發板中自帶了已訓練好的AI模型,位于/userdata/model目錄下的ssd_inception_v2.rknn,我們直接用就可以了。

02

USB攝像頭實現物品識別代碼

先來看下整個代碼的項目結構,然后再來分別介紹各個功能模塊。

  • imageutil.h:圖像類型轉換相關函數

  • myvideosourceface.cpp/h:用于USB攝像頭圖像顯示

  • qtcamera.cpp/h:qt界面

  • rknn_ssd_process.cpp/h:用于SSD模型進行AI物品識別的接口函數

  • rknn_ssd.cpp/h:SSD模型相關函數

8d815498-bfd2-11ed-bfe3-dac502259ad0.png

03

按幀獲取USB攝像頭圖像

3.1 改為自己的Viewfinder

之前測試USB攝像頭顯示時,使用的是Qt的QCameraViewfinder用來顯示攝像頭圖像,為了能獲取到每一幀的圖像,可以自己實現一個Viewfinder,然后在m_camera->setViewfinder時設置為自己的,并添加槽函數rcvFrame,當獲取到一幀圖像時,會觸發此函數。

void qtCamera::on_cameraClick()
{
  //創建攝像頭對象
  m_camera = new QCamera(m_cameraInfo);


  m_camera->unload();
  //配置攝像頭的模式--捕獲靜止圖像
  m_camera->setCaptureMode(QCamera::CaptureStillImage);


  //設置默認攝像頭參數
  QCameraViewfinderSettings set;
  set.setResolution(640, 480);         //設置顯示分辨率
  set.setMaximumFrameRate(25);         //設置幀率


  //自己用QPainter將每一幀視頻畫出來
  myvideosurface *surface = new myvideosurface(this);


  //設置取景器顯示
  m_camera->setViewfinder(surface);
  connect(surface, SIGNAL(frameAvailable(QVideoFrame)), this, SLOT(rcvFrame(QVideoFrame)), Qt::DirectConnection);
  connect(this,SIGNAL(sendOneQImage(QImage)), this, SLOT(recvOneQImage(QImage)));


  //啟動攝像頭
  m_camera->start();
}

(左右移動查看全部內容)

接收到一幀圖像后,其原始圖像格式是QVideoFrame類型的,需要先轉為QImage類型,然后就可以進行顯示或進行圖像處理了,這里觸發一個sendOneQImage信號來通知進行圖像處理:

void qtCamera::rcvFrame(QVideoFrame m_currentFrame)
{
  m_currentFrame.map(QAbstractVideoBuffer::ReadOnly);


  QImage videoImg = QImage(m_currentFrame.bits(),
          m_currentFrame.width(),
          m_currentFrame.height(),
          QVideoFrame::imageFormatFromPixelFormat(m_currentFrame.pixelFormat())).copy(); 
  
  m_currentFrame.unmap(); 
  QWidget::update();   


  emit sendOneQImage(videoImg); //發送信號
}

(左右移動查看全部內容)

3.2 自定義Viewfinder的實現

參考網上的一些代碼實現,其主要邏輯如下:

bool myvideosurface::present(const QVideoFrame &frame)
{
  if (frame.isValid())
  {
    QVideoFrame cloneFrame(frame);        
    emit frameAvailable(cloneFrame);  
    return true;
  }
  stop();
  return false;
}


//這些虛函數,會自動被調用,start檢測圖像是否可以對等轉換,每一幀有沒有
bool myvideosurface::start(const QVideoSurfaceFormat &videoformat)
{
  if(QVideoFrame::imageFormatFromPixelFormat(videoformat.pixelFormat()) != QImage::Format_Invalid && !videoformat.frameSize().isEmpty())
  {
    QAbstractVideoSurface::start(videoformat);
    return true;
  }
  return false;
}


void myvideosurface::stop()
{
  QAbstractVideoSurface::stop();
}


//將視頻流中像素格式轉換成格式對等的圖片格式,若無對等的格式,返回QImage::Format_Invalid
bool myvideosurface::isFormatSupported(const QVideoSurfaceFormat &videoformat) const
{
  //imageFormatFromPixelFormat()-----返回與視頻幀像素格式等效的圖像格式
  //pixelFormat()-----返回視頻流中幀的像素格式
  return QVideoFrame::imageFormatFromPixelFormat(videoformat.pixelFormat()) != QImage::Format_Invalid;
}


//支持的像素格式
QListmyvideosurface::supportedPixelFormats(QAbstractVideoBuffer::HandleType handleType) const
{
  if(handleType == QAbstractVideoBuffer::NoHandle){
    return QList() << QVideoFrame::Format_RGB32
                         << QVideoFrame::Format_ARGB32
                         << QVideoFrame::Format_ARGB32_Premultiplied
                         << QVideoFrame::Format_RGB565
                         << QVideoFrame::Format_RGB555;
    qDebug() << QList() << QVideoFrame::Format_RGB32;
  }
  else
  {
    return QList();
  }
}

(左右移動查看全部內容)

對應的頭文件類定義:

class myvideosurface : public QAbstractVideoSurface
{
  Q_OBJECT


public:
  explicit myvideosurface(QObject *parent = nullptr);
  ~myvideosurface() Q_DECL_OVERRIDE;


  bool present(const QVideoFrame &) Q_DECL_OVERRIDE;  //每一幀畫面將回到這里處理
  bool start(const QVideoSurfaceFormat &) Q_DECL_OVERRIDE; //只有攝像頭開,就會調用
  void stop() Q_DECL_OVERRIDE;  //出錯就停止了
  bool isFormatSupported(const QVideoSurfaceFormat &) const Q_DECL_OVERRIDE;  
  QListsupportedPixelFormats(QAbstractVideoBuffer::HandleType type = QAbstractVideoBuffer::NoHandle) const Q_DECL_OVERRIDE;


private:
  QVideoFrame m_currentFrame;  //視頻幀


signals:
  void frameAvailable(QVideoFrame); //將捕獲的每一幀視頻通過信號槽方式發出去
};

(左右移動查看全部內容)

04

圖像類型的轉換與顯示

4.1 QImage轉Mat

Qt是QCamera創建的USB攝像頭,獲取到的圖片格式是QImage類型,而使用OpenCV進行圖像處理,需要轉換為cv::Mat類型,轉換的方式如下:

cv::Mat QImageToMat(QImage image)
{
  image = image.convertToFormat(QImage::Format_RGB888);
  cv::Mat tmp(image.height(), image.width(), CV_8UC3, (uchar *)image.bits(), image.bytesPerLine());
  cv::Mat result; // deep copy just in case (my lack of knowledge with open cv)
  cvtColor(tmp, result, CV_BGR2RGB);
  return result;
}

(左右移動查看全部內容)

4.2 Mat轉QImage

OpenCV進行圖像處理完成后,比如進行AI物品識別完成,并將識別的信息標記到圖像上后,需要再轉成QImage的類型用于在Qt中顯示出來,轉換的方式如下:

QImage MatToQImage(cv::Mat mat)
{
  cv::cvtColor(mat, mat, CV_BGR2RGB);
  QImage qim((const unsigned char *)mat.data, mat.cols, mat.rows, mat.step,
        QImage::Format_RGB888);
  return qim;
}

(左右移動查看全部內容)

4.3 QImage轉QPixmap

QImage在Qt中還不能直接顯示出來,還需要再轉為QPixmap類型,轉換的方式如下:

QImage qImage;
QPixmap tempPixmap = QPixmap::fromImage(qImage);

(左右移動查看全部內容)

4.4 圖像的顯示

這里創建一個QLabel用于顯示圖像,調用setPixmap方法即可將圖像顯示出來,最后的adjustSize用來自動調整大小。

//創建一個label用于顯示圖像
m_lableShowImg = new QLabel();
m_lableShowImg->setPixmap(tempPixmap);
m_lableShowImg->adjustSize();

(左右移動查看全部內容)

05

RKNN例程移植

飛凌OK3568-C開發板資料中,自帶了ssd模型的測試程序,代碼位置如下,ssd的測試代碼是這3個文件:

8da65f68-bfd2-11ed-bfe3-dac502259ad0.png

測試代碼,需要在執行時,輸入模型的目錄位置和測試圖片的位置,AI物品識別之后會產生一個輸出圖片,需要再使用圖片查看器查看結果。

為了方便功能的調用,這里將fltest_opencv_rknn_ssd_main.cc改寫為rknn_ssd_process.cpp,并將具體功能進行拆分,封裝為C++的形式。

5.1 按功能封裝為C++形式

自己封裝的RknnSsdModel類定義:

class RknnSsdModel
{
public:
  RknnSsdModel(){};
  ~RknnSsdModel(){};


  int RknnInit(const char *model_path);
  int RknnDeInit();
  unsigned char *LoadModel(const char *filename, int *model_size);
  int DoRknnSsd(cv::Mat &src, cv::Mat &res);


private:
  unsigned char *m_pModel = nullptr;
  rknn_context m_rknnCtx;
  rknn_input_output_num m_rknnIoNum;


};

(左右移動查看全部內容)

5.1.1 RKNN初始化

主要功能是根據傳入的rknn模型進行相關的初始化

int RknnSsdModel::RknnInit(const char *model_path)
{
  int ret = 0;
  int model_len = 0;


  // Load RKNN Model
  printf("Loading model ...
");
  m_pModel = LoadModel(model_path, &model_len);


  printf("rknn_init ...
");
  ret = rknn_init(&m_rknnCtx, m_pModel, model_len, 0, NULL);
  if (ret < 0)
  {
    printf("rknn_init fail! ret=%d
", ret);
    return -1;
  }


  // Get Model Input Output Info
  ret = rknn_query(m_rknnCtx, RKNN_QUERY_IN_OUT_NUM, &m_rknnIoNum, sizeof(m_rknnIoNum));
  if (ret != RKNN_SUCC)
  {
    printf("rknn_query fail! ret=%d
", ret);
    return -1;
  }
  printf("model input num: %d, output num: %d
", m_rknnIoNum.n_input, m_rknnIoNum.n_output);


  printf("input tensors:
");
  rknn_tensor_attr input_attrs[m_rknnIoNum.n_input];
  memset(input_attrs, 0, sizeof(input_attrs));
  for (int i = 0; i < m_rknnIoNum.n_input; i++)
  {
    input_attrs[i].index = i;
    ret = rknn_query(m_rknnCtx, RKNN_QUERY_INPUT_ATTR, &(input_attrs[i]), sizeof(rknn_tensor_attr));
    if (ret != RKNN_SUCC)
    {
      printf("rknn_query fail! ret=%d
", ret);
      return -1;
    }
    printRKNNTensor(&(input_attrs[i]));
  }


  printf("output tensors:
");
  rknn_tensor_attr output_attrs[m_rknnIoNum.n_output];
  memset(output_attrs, 0, sizeof(output_attrs));
  for (int i = 0; i < m_rknnIoNum.n_output; i++)
  {
    output_attrs[i].index = i;
    ret = rknn_query(m_rknnCtx, RKNN_QUERY_OUTPUT_ATTR, &(output_attrs[i]), sizeof(rknn_tensor_attr));
    if (ret != RKNN_SUCC)
    {
      printf("rknn_query fail! ret=%d
", ret);
      return -1;
    }
    printRKNNTensor(&(output_attrs[i]));
  }


  return ret;
}

(左右移動查看全部內容)

5.1.2 RKNN運行

傳入一張Mat格式的圖片(一幀視頻圖像),經過AI識別,并將識別的信息標注到圖片上后,將識別結果也以Mat格式傳出:

int RknnSsdModel::DoRknnSsd(cv::Mat &src, cv::Mat &res)
{
  const int img_width = 300;
  const int img_height = 300;
  const int img_channels = 3;
  int ret = 0;


  cv::Mat img = src.clone();
  if (src.cols != img_width || src.rows != img_height)
  {
    printf("resize %d %d to %d %d
", src.cols, src.rows, img_width, img_height);
    cv::resize(src, img, cv::Size(img_width, img_height), (0, 0), (0, 0), cv::INTER_LINEAR);
  }


  // Set Input Data
  rknn_input inputs[1];
  memset(inputs, 0, sizeof(inputs));
  inputs[0].index = 0;
  inputs[0].type = RKNN_TENSOR_UINT8;
  inputs[0].size = img.cols * img.rows * img.channels();
  inputs[0].fmt = RKNN_TENSOR_NHWC;
  inputs[0].buf = img.data;


  ret = rknn_inputs_set(m_rknnCtx, m_rknnIoNum.n_input, inputs);
  if (ret < 0)
  {
    printf("rknn_input_set fail! ret=%d
", ret);
    return -1;
  }


  // Run
  printf("rknn_run
");
  ret = rknn_run(m_rknnCtx, nullptr);
  if (ret < 0)
  {
    printf("rknn_run fail! ret=%d
", ret);
    return -1;
  }


  // Get Output
  rknn_output outputs[2];
  memset(outputs, 0, sizeof(outputs));
  outputs[0].want_float = 1;
  outputs[1].want_float = 1;
  ret = rknn_outputs_get(m_rknnCtx, m_rknnIoNum.n_output, outputs, NULL);
  if (ret < 0)
  {
    printf("rknn_outputs_get fail! ret=%d
", ret);
    return -1;
  }


  // Post Process
  detect_result_group_t detect_result_group;
  postProcessSSD((float *)(outputs[0].buf), (float *)(outputs[1].buf), src.cols, src.rows, &detect_result_group);
  // Release rknn_outputs
  rknn_outputs_release(m_rknnCtx, 2, outputs);


  // Draw Objects
  for (int i = 0; i < detect_result_group.count; i++)
  {
    detect_result_t *det_result = &(detect_result_group.results[i]);
    printf("%s @ (%d %d %d %d) %f
",
        det_result->name,
        det_result->box.left, det_result->box.top, det_result->box.right, det_result->box.bottom,
        det_result->prop);
    int x1 = det_result->box.left;
    int y1 = det_result->box.top;
    int x2 = det_result->box.right;
    int y2 = det_result->box.bottom;
    rectangle(src, Point(x1, y1), Point(x2, y2), Scalar(255, 0, 0, 255), 3);
    putText(src, det_result->name, Point(x1, y1 - 12), 1, 4, Scalar(0, 255, 0, 255), 4);
  }


  res = src;
  return 0;
}

(左右移動查看全部內容)

5.2 AI識別調用

OK3568-C開發板中自帶了已訓練好的AI模型,位于/userdata/model目錄下的ssd_inception_v2.rknn,在程序初始化時需要用到。

8dbb9a40-bfd2-11ed-bfe3-dac502259ad0.png

AI識別的代碼邏輯為:先在qtCamera初始化時調用RKNN的初始化,然后打開USB攝像頭,USB獲取到每幀圖像后, 調用DoRknnSsd進行AI物品識別,最后將識別的結果通過setPixmap方法展示出來

//先在qtCamera初始化時調用RKNN的初始化
std::string ssd_model = "/userdata/model/ssd_inception_v2.rknn";
m_rknnModel.RknnInit(ssd_model.c_str());


//USB獲取到每幀圖像后, 調用DoRknnSsd進行AI物品識別
void qtCamera::recvOneQImage(QImage qImage)
{
  cv::Mat srcImg = ImageUtil::QImageToMat(qImage);
  cv::Mat dstImg;
  m_rknnModel.DoRknnSsd(srcImg, dstImg);
  QImage qDstImage = ImageUtil::MatToQImage(dstImg);
  QPixmap tempPixmap = QPixmap::fromImage(qDstImage);


  m_lableShowImg->setPixmap(tempPixmap);
  m_lableShowImg->adjustSize();
}

(左右移動查看全部內容)

5.3 編譯

需要注意下Qt工程的配置文件,要把opencv的一些庫鏈接進去

qcamera.pri

INCLUDEPATH     += $$PWD/src


HEADERS += 
  $$PWD/src/qtcamera.h 
  $$PWD/src/myvideosurface.h 
  $$PWD/src/rknn_ssd.h 
  $$PWD/src/rknn_ssd_process.h 
  $$PWD/src/imageutil.h


SOURCES += 
  $$PWD/src/qtcamera.cpp 
  $$PWD/src/myvideosurface.cpp 
  $$PWD/src/rknn_ssd.cpp 
  $$PWD/src/rknn_ssd_process.cpp

(左右移動查看全部內容)

qcamera.pro

TARGET = USBCameraSSD
TEMPLATE = app


QT += widgets multimedia multimediawidgets


SOURCES += main.cpp


include($$PWD/qcamera.pri)


LIBS+=-lopencv_core -lopencv_objdetect -lopencv_highgui -lopencv_videoio -lopencv_imgproc -lopencv_imgcodecs -lrknn_api -lOpenCL -lpthread


#temp file
DESTDIR     = $$PWD/app_bin
MOC_DIR     = $$PWD/build/qcamera
OBJECTS_DIR   = $$PWD/build/qcamera

(左右移動查看全部內容)

最后的編譯腳本還和之前的一樣:

#! /bin/bash


mkdir -p build
cd build


export PATH=/home/xxpcb/myTest/OK3568/sourcecode/OK3568-linux-source/buildroot/output/OK3568/host/bin:$PATH


qmake .. && make

(左右移動查看全部內容)

06

總結

本篇介紹了在飛凌OK3568-C開發板中,外接USB攝像頭,利用Qt和RKNN進行AI物品識別,通過已訓練好的SSD模型,進行攝像頭畫面的實時AI物品檢查的代碼實現原理。

8dc969c2-bfd2-11ed-bfe3-dac502259ad0.png


更多熱點文章閱讀
  • OS內核及視窗分論壇詳解之OpenHarmony 3D顯示支持
  • 應用模型開發指南上新介紹
  • 技術構筑萬物智聯,第一屆OpenHarmony技術峰會圓滿舉行
  • OpenHarmony L1(3.0)串口功能開發
  • 小白指南:手把手教你用低代碼開發一個應用頁面

提示:本文由電子發燒友論壇發布,轉載請注明來源。如需社區合作及入群交流,請添加微信EEFans0806,或者發郵箱liuyong@huaqiu.com。


原文標題:RK3568開發板:USB攝像頭實時AI物品識別代碼實現

文章出處:【微信公眾號:電子發燒友開源社區】歡迎添加關注!文章轉載請注明出處。


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 電子發燒友
    +關注

    關注

    33

    文章

    556

    瀏覽量

    33120
  • 開源社區
    +關注

    關注

    0

    文章

    95

    瀏覽量

    487

原文標題:RK3568開發板:USB攝像頭實時AI物品識別代碼實現

文章出處:【微信號:HarmonyOS_Community,微信公眾號:電子發燒友開源社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    迅為RK3568開發板驅動指南Linux中通用SPI設備驅動

    迅為RK3568開發板驅動指南Linux中通用SPI設備驅動
    的頭像 發表于 01-23 11:02 ?1881次閱讀
    迅為<b class='flag-5'>RK3568</b><b class='flag-5'>開發板</b>驅動指南Linux中通用SPI設備驅動

    [迅為RK3568開發板]非科班也能玩轉Android應用,體驗QT跨平臺能力

    [迅為RK3568開發板]非科班也能玩轉Android應用,體驗QT跨平臺能力
    的頭像 發表于 12-18 16:41 ?459次閱讀
    [迅為<b class='flag-5'>RK3568</b><b class='flag-5'>開發板</b>]非科班也能玩轉Android應用,體驗QT跨平臺能力

    Android11修改攝像頭前后置方法,觸覺智能RK3568開發板演示

    本文介紹在Android11系統下,修改攝像頭前后置屬性的方法。使用觸覺智能EVB3568鴻蒙開發板演示,搭載瑞芯微RK3568,四核A55處理器,主頻2.0Ghz,1T算力NPU;支
    的頭像 發表于 11-28 15:25 ?71次閱讀
    Android11修改<b class='flag-5'>攝像頭</b>前后置方法,觸覺智能<b class='flag-5'>RK3568</b><b class='flag-5'>開發板</b>演示

    【迅為電子】叮!您的RK3568開發板系統鏡像備份方法請查收

    【迅為電子】叮!您的RK3568開發板系統鏡像備份方法請查收
    的頭像 發表于 11-27 14:02 ?460次閱讀
    【迅為電子】叮!您的<b class='flag-5'>RK3568</b><b class='flag-5'>開發板</b>系統鏡像備份方法請查收

    基于迅為RK3568開發板全國產平臺,快速實現APP開機自啟動技術分享

    基于迅為RK3568開發板全國產平臺,快速實現APP開機自啟動技術分享
    的頭像 發表于 11-21 13:58 ?482次閱讀
    基于迅為<b class='flag-5'>RK3568</b><b class='flag-5'>開發板</b>全國產平臺,快速<b class='flag-5'>實現</b>APP開機自啟動技術分享

    【迅為】瑞芯微RK3588開發板RK3568開發板區別及優勢

    RK3568開發板
    的頭像 發表于 11-18 14:19 ?665次閱讀
    【迅為】瑞芯微<b class='flag-5'>RK</b>3588<b class='flag-5'>開發板</b><b class='flag-5'>RK3568</b><b class='flag-5'>開發板</b>區別及優勢

    能力再次提升! 迅為RK3588/RK3568開發板&amp;amp;核心新增定制分區鏡像

    能力再次提升! 迅為RK3588/RK3568開發板&核心新增定制分區鏡像
    的頭像 發表于 11-06 15:11 ?668次閱讀
    能力再次提升! 迅為<b class='flag-5'>RK</b>3588/<b class='flag-5'>RK3568</b><b class='flag-5'>開發板</b>&amp;amp;核心<b class='flag-5'>板</b>新增定制分區鏡像

    迅為RK3568開發板支持銀河麒麟和開放麒麟系統

    迅為在RK3568開發板移植了銀河麒麟和開放麒麟系統HOT 新增RT-Thread系統 iTOP-RK3568開發板支持了Preemption和Xenomai
    發表于 11-06 14:44

    迅為iTOP-RK3568/RK3588開發板獲麒麟軟件適配認證

    迅為iTOP-RK3568/RK3588開發板獲麒麟軟件適配認證
    的頭像 發表于 10-18 14:56 ?677次閱讀
    迅為iTOP-<b class='flag-5'>RK3568</b>/<b class='flag-5'>RK</b>3588<b class='flag-5'>開發板</b>獲麒麟軟件適配認證

    迅為RK3568開發板/核心助力實時系統!

    iTOP-RK3568開發板使用手冊上新,后續資料會不斷更新,不斷完善,幫助用戶快速入門,大大提升研發速度。 iTOP-RK3568開發板支持了Preemption和Xenomai
    發表于 09-26 11:29

    國產核心全面進攻-RK3568開發板評測

    隨著端側AI應用的落地,預計集成NPU的SoC產品將迎來爆發式的增量市場。本期與非網給大家帶來一款采用國內知名SoC廠商的產品——基于瑞芯微RK3568開發板
    的頭像 發表于 08-30 11:49 ?1445次閱讀
    國產核心<b class='flag-5'>板</b>全面進攻-<b class='flag-5'>RK3568</b><b class='flag-5'>開發板</b>評測

    基于迅為RK3568/RK3588開發板AI圖像識別方案

    https://www.bilibili.com/video/BV1G54y1A7nf/?spm_id_from=333.999.0.0 迅為RK3568/RK3588開發板AI
    發表于 08-28 09:50

    RK3568開發板支持AMP雙系統

    RK3568開發板支持AMP雙系統
    的頭像 發表于 06-04 15:33 ?843次閱讀
    <b class='flag-5'>RK3568</b><b class='flag-5'>開發板</b>支持AMP雙系統

    鴻蒙OpenHarmony南向:【RK3568開發板介紹】

    RK3568開發板基于Rockchip RK3568芯片,集成雙核心架構GPU以及高效能NPU;搭載四核64位Cortex-A55處理器,采用22nm先進工藝,主頻高達2.0GHz;支持藍牙
    的頭像 發表于 05-07 10:13 ?941次閱讀
    鴻蒙OpenHarmony南向:【<b class='flag-5'>RK3568</b><b class='flag-5'>開發板</b>介紹】

    迅為RK3568開發板驅動開發指南-輸入子系統

    迅為RK3568開發板驅動開發指南-輸入子系統
    的頭像 發表于 02-23 15:11 ?1022次閱讀
    迅為<b class='flag-5'>RK3568</b><b class='flag-5'>開發板</b>驅動<b class='flag-5'>開發</b>指南-輸入子系統
    主站蜘蛛池模板: 欧美午夜性 | 伊人9999| 38pao强力打造永久免费高清视频 | 8x8x极品国产在线 | 5555kkkk香蕉在线观看 | 丝袜美腿一区 | 视频在线一区 | 欧美一级二级三级视频 | 亚洲视频一二 | 亚洲综合成人在线 | 欧美女人天堂 | 劳拉淫欲护士bd字幕 | 亚洲第一成网站 | 亚洲aⅴ久久久噜噜噜噜 | 红色一级毛片 | 在线播放国产一区 | 日本一区二区三区四区在线观看 | 亚洲欧美成人在线 | 欧美高清一级 | 三级黄网 | 在线免费国产 | 国产色司机在线视频免费观看 | 亚洲一区二区三区在线网站 | 欧美猛交xxxx乱大交 | 国产一区二区三区欧美精品 | 激情五月宗合网 | 国产三级在线看 | www.男人的天堂 | 69pao强力打造在线 | 亚洲三级视频在线观看 | 日韩免费精品视频 | 女人爽到喷水的视频大全在线观看 | 老色批午夜免费视频网站 | 激情文学综合 | 亚洲国产综合久久精品 | 在线免费看一级片 | 精品国产三级在线观看 | 亚洲福利一区二区 | 两性色午夜视频免费老司机 | 美日韩毛片| 国产一级做a爱免费视频 |