RK3588 linux RGA初探

在这里插入图片描述

概述

RGA (Raster Graphic Acceleration Unit)是一个独立的2D硬件加速器,可用于加速点/线绘制,执行图像缩放、旋转、bitBlt、alpha混合等常见的2D图形操作。

本文基于以下版本编写:
commit fb5f019ea0191ec1c34f49ac8be447ac8921aadd (HEAD -> main, origin/main, origin/HEAD)
Author: Yu Qiaowei cerf.yu@rock-chips.com
Date: Wed Apr 3 18:24:42 2024 +0800

fix network disk link cannot be opened

Signed-off-by: Yu Qiaowei cerf.yu@rock-chips.com
Change-Id: I7dae60823917713bb1a5e64bb47c894db5c44cc8

librga/CHANGELOG.mdCOPYINGdocs/ 文档include/ 头文件libs/ so库README.md*samples/ 参考例子toolchains/ 交叉编译链tools/

基本使用

参考文档: docs/Rockchip_Developer_Guide_RGA_CN.md
软件支持库提供以下API,异步模式仅支持C++实现。

  • querystring: 查询获取当前芯片平台RGA硬件版本与功能支持信息,以字符串的形式返回。
  • imcheckHeader: 校验当前使用头文件版本与librga版本差异。
  • importbuffer_T: 将外部内存(dma_fd、虚拟地址、物理地址)导入RGA驱动内部,实现硬件快速访问物理连续/非物理连续的内存。
  • releasebuffer_handle: 将外部buffer从RGA驱动内部解除引用与映射。
  • wrapbuffer_handle: 快速封装图像缓冲区结构(rga_buffer_t)。
  • imbeginJob:创建RGA图像处理任务。
  • imendJob: 提交并执行RGA图像处理任务。
  • imcancelJob: 取消并删除RGA图像处理任务。
  • imcopy: 调用RGA实现快速图像拷贝操作。
  • imcopyTask: 向RGA图像任务中添加快速图像拷贝操作。
  • imresize: 调用RGA实现快速图像缩放操作。
  • imresizeTask: 向RGA图像任务中添加快速图像缩放操作。
  • impyramind: 调用RGA实现快速图像金字塔操作。
  • imcrop: 调用RGA实现快速图像裁剪操作。
  • imcropTask: 向RGA图像任务中添加快速图像裁剪操作。
  • imtranslate: 调用RGA实现快速图像平移操作。
  • imtranslateTask: 向RGA图像任务中添加快速图像平移操作。
  • imcvtcolor: 调用RGA实现快速图像格式转换。
  • imcvtcolorTask: 向RGA图像任务中添加快速图像格式转换。
  • imrotate: 调用RGA实现快速图像旋转操作。
  • imrotateTask: 向RGA图像任务中添加快速图像旋转操作。
  • imflip: 调用RGA实现快速图像翻转操作。
  • imflipTask: 向RGA图像任务中添加快速图像翻转操作。
  • imblend: 调用RGA实现双通道快速图像合成操作。
  • imblendTask: 向RGA图像任务中添加双通道快速图像合成操作。
  • imcomposite: 调用RGA实现三通道快速图像合成操作。
  • imcompositeTask: 向RGA图像任务中添加三通道快速图像合成操作。
  • imcolorkey: 调用RGA实现快速图像颜色键操作。
  • imcolorkeyTask: 向RGA图像任务中添加快速图像颜色键操作。
  • imosd:调用RGA实现快速图像OSD字幕叠加。
  • imosdTask:向RGA图像任务中添加快速图像OSD字幕叠加。
  • imquantize: 调用RGA实现快速图像运算点前处理(量化)操作。
  • imquantizeTask: 向RGA图像任务中添加快速图像运算点前处理(量化)操作。
  • imrop: 调用RGA实现快速图像光栅操作。
  • imropTask: 向RGA图像任务中添加快速图像光栅操作。
  • imfill: 调用RGA实现快速图像填充操作。
  • imfillArray: 调用RGA实现多组快速图像填充操作。
  • imfillTask: 向RGA图像任务中添加快速图像填充操作。
  • imfillTaskArray: 向RGA图像任务中添加多组快速图像填充操作。
  • imrectangle: 调用RGA实现等距矩形边框快速绘制操作。
  • imrectangleArray: 调用RGA实现多组等距矩形边框快速绘制操作。
  • imrectangleTask: 向RGA图像任务中添加等距矩形边框快速绘制操作。
  • imrectangleTaskArray: 向RGA图像任务中添加多组等距矩形边框快速绘制操作。
  • immakeBorder: 调用RGA实现矩形边框快速绘制操作。
  • immosaic:调用RGA实现快速图像马赛克遮盖。
  • immosaicArray:调用RGA实现快速图像马赛克遮盖。
  • immosaicTask:向RGA图像任务中添加快速图像马赛克遮盖。
  • immosaicTaskArray:向RGA图像任务中添加快速图像马赛克遮盖。
  • improcess: 调用RGA实现快速图像复合处理操作。
  • improcessTask: 向RGA图像任务中添加快速图像复合处理操作。
  • imcheck: 校验参数是否合法,以及当前硬件是否支持该操作。
  • imsync: 用于异步模式时,同步任务完成状态。
  • imconfig: 向当前线程上下文添加默认配置。

直接上手demo

图片缩放

samples/resize_demo/
├── cmake-android.sh
├── cmake-linux.sh
├── CMakeLists.txt
└── src├── CMakeLists.txt├── rga_resize_config_interpolation_demo.cpp├── rga_resize_demo.cpp├── rga_resize_rect_demo.cpp└── rga_resize_uv_downsampling_demo.cpp

samples/resize_demo$ ./cmake-linux.sh

/work/devEnv/librga/samples/resize_demo/build/build_linux /work/devEnv/librga/samples/resize_demo
load /work/devEnv/librga/samples/resize_demo/../../toolchains/toolchain_linux.cmake
load /work/devEnv/librga/samples/resize_demo/../../libs/Linux/gcc-aarch64/librga.so
-- The C compiler identification is unknown
-- The CXX compiler identification is unknown
CMake Error at CMakeLists.txt:16 (project):The CMAKE_C_COMPILER:/home/yqw/workspace/linux/common/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-rockchip1031-linux-gnu-gccis not a full path to an existing compiler tool.Tell CMake where to find the compiler by setting either the environmentvariable "CC" or the CMake cache entry CMAKE_C_COMPILER to the full path tothe compiler, or to the compiler name if it is in the PATH.CMake Error at CMakeLists.txt:16 (project):The CMAKE_CXX_COMPILER:/home/yqw/workspace/linux/common/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-rockchip1031-linux-gnu-g++is not a full path to an existing compiler tool.Tell CMake where to find the compiler by setting either the environmentvariable "CXX" or the CMake cache entry CMAKE_CXX_COMPILER to the full pathto the compiler, or to the compiler name if it is in the PATH.-- Configuring incomplete, errors occurred!
See also "/work/devEnv/librga/samples/resize_demo/build/build_linux/CMakeFiles/CMakeOutput.log".
See also "/work/devEnv/librga/samples/resize_demo/build/build_linux/CMakeFiles/CMakeError.log".
make: *** No targets specified and no makefile found.  Stop.
make: *** No rule to make target 'install'.  Stop.

原始的代码编译不过… 真坎坷! /home/yqw/workspace/ 这个路径应该是写这个demo的工程师的
修改下交叉编译链

git diff ../../toolchains/
diff --git a/toolchains/toolchain_linux.cmake b/toolchains/toolchain_linux.cmake
index f446557..aa5f9b3 100644
--- a/toolchains/toolchain_linux.cmake
+++ b/toolchains/toolchain_linux.cmake
@@ -1,5 +1,5 @@
-SET(TOOLCHAIN_HOME "/home/yqw/workspace/linux/common/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu")
-SET(TOOLCHAIN_NAME "aarch64-rockchip1031-linux-gnu")
+SET(TOOLCHAIN_HOME "/usr")
+SET(TOOLCHAIN_NAME "aarch64-linux-gnu")# this is required#SET(CMAKE_SYSTEM_NAME Linux)

samples/resize_demo$ ./cmake-linux.sh

[ 81%] Linking CXX executable rga_resize_rect_demo
/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: cannot find -lrga
collect2: error: ld returned 1 exit status
[ 90%] Linking CXX executable rga_resize_uv_downsampling_demo
make[2]: *** [src/CMakeFiles/rga_resize_demo.dir/build.make:90: src/rga_resize_demo] Error 1
make[1]: *** [CMakeFiles/Makefile2:210: src/CMakeFiles/rga_resize_demo.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
[100%] Linking CXX executable rga_resize_config_interpolation_demo
/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: cannot find -lrga
collect2: error: ld returned 1 exit status
make[2]: *** [src/CMakeFiles/rga_resize_rect_demo.dir/build.make:90: src/rga_resize_rect_demo] Error 1
make[1]: *** [CMakeFiles/Makefile2:183: src/CMakeFiles/rga_resize_rect_demo.dir/all] Error 2
/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: cannot find -lrga
collect2: error: ld returned 1 exit status
make[2]: *** [src/CMakeFiles/rga_resize_uv_downsampling_demo.dir/build.make:90: src/rga_resize_uv_downsampling_demo] Error 1
make[1]: *** [CMakeFiles/Makefile2:156: src/CMakeFiles/rga_resize_uv_downsampling_demo.dir/all] Error 2
/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: cannot find -lrga
collect2: error: ld returned 1 exit status
make[2]: *** [src/CMakeFiles/rga_resize_config_interpolation_demo.dir/build.make:90: src/rga_resize_config_interpolation_demo] Error 1
make[1]: *** [CMakeFiles/Makefile2:129: src/CMakeFiles/rga_resize_config_interpolation_demo.dir/all] Error 2
make: *** [Makefile:130: all] Error 2
[ 27%] Built target utils_obj
[ 36%] Linking CXX executable rga_resize_config_interpolation_demo
/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: cannot find -lrga
collect2: error: ld returned 1 exit status
make[2]: *** [src/CMakeFiles/rga_resize_config_interpolation_demo.dir/build.make:90: src/rga_resize_config_interpolation_demo] Error 1
make[1]: *** [CMakeFiles/Makefile2:129: src/CMakeFiles/rga_resize_config_interpolation_demo.dir/all] Error 2
make: *** [Makefile:130: all] Error 2

找不到librga库, 项目的目录结构更新了, 代码还没改过来

git diff cmake-linux.sh
diff --git a/samples/resize_demo/cmake-linux.sh b/samples/resize_demo/cmake-linux.sh
index 3604521..a3f2f42 100755
--- a/samples/resize_demo/cmake-linux.sh
+++ b/samples/resize_demo/cmake-linux.sh
@@ -5,7 +5,7 @@ SAMPLES_DIR=${SCRIPT_DIR}/..# The following options require configurationTOOLCHAIN_PATH=${SAMPLES_DIR}/../toolchains/toolchain_linux.cmake
-LIBRGA_PATH=${SAMPLES_DIR}/../build/build_linux/install/lib
+LIBRGA_PATH=${SAMPLES_DIR}/../libs/Linux/gcc-aarch64BUILD_DIR=build/build_linuxBUILD_TYPE=Release

编译成功后:

build/build_linux/install/bin/
├── rga_resize_config_interpolation_demo
├── rga_resize_demo
├── rga_resize_rect_demo
└── rga_resize_uv_downsampling_demo

丢板子里测试:
代码实现了 1280x720 缩放到 1920x1080 的RGBA 格式转化, 测试文件路径: librga/samples/sample_file/in0w1280-h720-rgba8888.bin

#测试程序
adb push build/build_linux/install/bin/rga_resize_demo /rga/
#测试文件
adb push ../sample_file/in0w1280-h720-rgba8888.bin /data/

进入到主板执行

root@rk3588:/rga# ./rga_resize_demo 
rga_api version 1.10.1_[0]
rga_resize_demo running success!
open /data/out0w1920-h1080-rgba8888.bin and write okroot@rk3588:/rga# ll /data/*bin
-rwxrwxrwx 1 root root 3.6M Jul  1  2024 /data/in0w1280-h720-rgba8888.bin
-rw-r--r-- 1 root root 8.0M Jan  1 00:13 /data/out0w1920-h1080-rgba8888.bin

RGBA 转换为 BMP:

# pull 输出图片
adb pull /data/out0w1920-h1080-rgba8888.bin out0w1920-h1080-rgba8888.rgba
# 使用convert 转换
# 注意: 确保你已经安装了ImageMagick
# sudo apt-get install imagemagick
convert -depth 8 -size 1920x1080 -colors 256 -colorspace sRGB out0w1920-h1080-rgba8888.rgba -alpha off out.bmp

注意事项

  • Q1.9:为什么当搭载8G DDR时,RGA效率较于4G时性能下降严重?
    由于部分RGA1/RGA2的IOMMU仅支持最大32位的物理地址,而RGA Device Driver、RGA2 Device Driver中对于不满足硬件内存要求的调用申请,默认是通过swiotlb机制进行访问访问受限制的内存(原理上相当于通过CPU将高位内存拷贝至复合硬件要求的低位内存中,再交由硬件进行处理,处理完毕后再通过CPU将低位内存搬运回目标的高位内存上。)因此效率十分低下,通常在正常耗时的3-4倍之间浮动,并且引入受CPU负载影响。

  • “RGA_MMU unsupported Memory larger than 4G!”报错该如何解决?
    该报错通常对应HAL层报错:
    RgaBlit(1483) RGA_BLIT fail: Invalid argument
    Failed to call RockChipRga interface, please use ‘dmesg’ command to view driver error log.
    该报错标识当前配置的图像任务配置的内存无法满足当前匹配到的硬件核心对内存的要求,由于不同的硬件版本的RGA的IOMMU对内存位数的要求不同,当分配的内存超过对应硬件的限制时,则会出现该该报错,详细的不同硬件版本RGA的限制可见《Rockchip_Developer_Guide_RGA_CN》中的概述——设计指标小节。

    当出现该报错时,通常有以下几种场景以及对应的解决方案:

    在搭载多种RGA的芯片平台(例如RK3588搭载有2颗RGA3核心、1颗RGA2核心)上,没有使用importbuffer_xx接口获取handle,而是直接使用wrapbuffer_xx接口调用im2d api时:

    由于没有使用importbuffer_xx来提前映射外部内存到RGA驱动内存,因此在实际任务匹配中无法提前获知内存是否不满足对应核心的限制,因此在高负载场景下可能会出现该报错,建议使用importbuffer_xx提前将外部内存导入到RGA驱动内部,避免该问题。

    在搭载多种RGA的芯片平台(例如RK3588搭载有2颗RGA3核心、1颗RGA2核心)上,使用了importbuffer_xx接口获取handle,但是依旧存在该问题:

    可以检查一下配置的图像任务的参数,确认是否配置了仅有RGA2核心(内存访问受限制的核心)支持的功能或格式,以RK3588为例,color fill功能和YUV422/420 planar格式均是RGA2核心特有的功能和格式,因此该场景下必须分配4G以内内存空间的内存调用RGA。

    常见的分配4G内存方式可以查看以下示例代码:
    <librga_souce_path>/samples/allocator_demo/src/rga_allocator_dma32_demo.cpp
    <librga_souce_path>/samples/allocator_demo/src/rga_allocator_graphicbuffer_demo.cpp

    如果使用的其他分配器,例如mpp_buffer、v4l2_buffer、drm_buffer等,请查询对应分配器是否支持限制分配4G以内内存空间内存,并按照对应方式申请复合RGA硬件要求的内存。

    仅搭载一种RGA的芯片平台(例如仅搭载RGA2的RK3399、RK3568、Rk3566)上:

    当芯片平台上仅搭载内存访问受限制的核心时,则调用RGA时必须申请符合搭载核心对内存要求的内存,解决方案同上场景2。

    当使用DRM、malloc、new等不支持指定分配4G以内内存空间的内存的内存分配器时,也可以通过修改uboot的内存映射范围来解决。

    uboot相关修改可以参考SDK文档中 uboot开发文档->Chapter-8 调试手段->修改DDR容量 ,将内存映射范围全局限制在0~4G内存空间以内即可。

参考

  • librga github

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/41901.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器数据恢复—raid5阵列硬盘出现大量坏道的数据恢复案例

服务器存储数据恢复环境&故障&#xff1a; 一台DELL EqualLogic PS 4000存储中有一组由12块磁盘组建的raid5阵列&#xff0c;存储空间划分3个同等大小的卷&#xff0c;采用的VMFS文件系统。 两块硬盘指示灯亮黄色&#xff0c;raid5阵列崩溃&#xff0c;存储变得不可用。 服…

C语言学习记录Day2

for循环 for&#xff08;表达式1&#xff1b;表达式2&#xff1b;表达式3&#xff09; 循环语句&#xff1b; 注&#xff1a;表达式1&#xff1a;初始化部分.表达式2&#xff1a;条件判断部分 表达式3&#xff1a;调整部分 不可再for循环体内修改循环变量&#xff0c;防止f…

厂拉拉获清科文创天使轮投资

最新信息&#xff1a;源头工厂测品平台厂拉拉APP已正式获得北京清科文创千万级的天使轮投资。 本轮资金将主要用于测品师、品鉴官队伍的引流&#xff0c;及APP3.0数字供应链和用户购物行为算法技术、算力模型的建设。 厂拉拉APP的营运主体为广州智邦远见科技有限公司&#xf…

Java基础概念

1.注释和关键字 &#xff08;1&#xff09;注释 什么是注释&#xff1f;注释就是对代码进行解释说明的文字 注释的分类&#xff1f;单行注释&#xff0c;多行注释&#xff0c;文档注释 注释的使用细节&#xff1f; 注释的内容不会参与编译和运行&#xff0c;仅仅是对代码的…

【Linux】touch

我们在介绍ls这个命令时&#xff0c;提到每个文件在Linux下面都会记录许多的时间参数&#xff0c;其实是有三个主要的变动时间&#xff0c;那么三个时间的意义是什么&#xff1f; 修改时间&#xff08;modification time&#xff0c;mtime)&#xff1a;当该文件的【内容数据】…

十二、数组

1. 一维数组的创建和初始化 数组是一组相同类型元素的集合。 变长数组是不能初始化的。 数组的初始化是指&#xff0c;在创建数组的同时给数组的内容一些合理初始值&#xff08;初始化&#xff09;。 例如上图 char ch3[ ]"abc";里面方的就是 a b c \0 char ch3[ …

EDA 2023 年世界国家suicide rate排名

文章目录 前言:关于数据集列 导入模块导入数据数据预处理探索性数据分析按性别划分的自杀率 [箱线图]相关矩阵热图自杀率最高的 15 个国家变化百分比最高的 15 个国家/地区2023 年世界地图上自杀率的国家 结尾: 前言: 随着社会的不断发展和变迁&#xff0c;人们对于各种社会问…

揭秘:源代码防泄密的终极秘籍

在当今信息科技高度发达的时代&#xff0c;源代码作为企业最核心的资产之一&#xff0c;其安全性不言而喻。源代码的泄露可能导致企业技术机密被竞争对手获取&#xff0c;进而威胁到企业的市场竞争力和长远发展。因此&#xff0c;源代码防泄密成为了企业信息安全工作的重中之重…

前端JS特效第24波:jQuery轻量级响应式幻灯片插件EasyFader

jQuery轻量级响应式幻灯片插件EasyFader&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"utf-8"> <title>jQuery轻量级响应式幻灯片插件E…

C-10 凸包

凸包 数学定义 平面的一个子集S被称为是凸的&#xff0c;当且仅当对于任意两点A&#xff0c;B属于S&#xff0c;线段PS都完全属于S过于基础就不详细介绍了 凸包的计算 github上找到了别人的代码&#xff0c;用4种方式实现了凸包的计算&#xff0c;把他放在这里链接地址htt…

redis运维:sentinel模式如何查看所有从节点

1. 连接到sentinel redis-cli -h sentinel_host -p sentinel_port如&#xff1a; redis-cli -h {域名} -p 200182. 发现Redis主服务器 连接到哨兵后&#xff0c;我们可以使用SENTINEL get-master-addr-by-name命令来获取当前的Redis主服务器的地址。 SENTINEL get-master-a…

Python骨架肌体运动学数学模型

&#x1f3af;要点 &#x1f3af;运动学矢量计算 | &#x1f3af;跳远的运动学计算 | &#x1f3af;关节肢体运动最小加加速度模型 | &#x1f3af;膝关节和踝关节角度二维运动学计算 | &#x1f3af;上下肢体关节连接运动链数学模型 | &#x1f3af;刚体连接点速度加速度计算…

[python]Markdown图片引用格式批处理桌面应用程序

需求 使用python编写一个exe&#xff0c;实现批量修改图片引用&#xff0c;将修改后的文件生成为 文件名_blog.md。有一个编辑框&#xff0c;允许接收拖动过来md文件&#xff0c;拖入文件时获取文件路径&#xff0c;有一个编辑框编辑修改后的文件的输出路径&#xff0c;用户拖入…

Springboot实战:AI大模型+亮数据代理助力短视频时代

目录 前言1.如何入门亮数据1.1、注册登录1.2、注册账号1.3、登录1.4、购买静态住宅代理1.5、展示购买的代理 2. 使用Springboot、AI大模型构建系统2.1 使用Springboot、AI大模型构建爬虫2.2、在Springboot项目添加工具 3、编写代码&#xff0c;爬取视频素材3.1、代码里使用代理…

Redis核心问题总结(一)

1、为什么要使用Redis做缓存 缓存的好处 使用缓存的目的就是提升读写性能。而实际业务场景下&#xff0c;更多的是为了提升读性能&#xff0c;带来更好的性 能&#xff0c;带来更高的并发量。Redis 的读写性能比 Mysql 好的多&#xff0c;我们就可以把 Mysql 中的热点数据缓 …

提升结构安全性:应变计在现代建筑中的应用

在现代建筑领域&#xff0c;随着工程技术的不断进步&#xff0c;对结构安全性的要求也日益提高。作为一种关键的工程仪器仪表&#xff0c;应变计在提升结构安全性方面发挥着不可替代的作用。本文将深入探讨应变计在现代建筑中的应用&#xff0c;以及它如何助力工程师们实时监测…

权力之望怎么注册账号创建角色 权利之网角色账号注册教程

权力之望是一款全新的大型MMORPG游戏&#xff0c;拥有9把独特武器和56种职业组合&#xff0c;并搭配了超炫酷的战斗画面&#xff0c;全程采用低俯视角游戏&#xff0c;让玩家能体验到更强的操作感和爽快感。这款游戏主打高养成自由度玩家可以自由更换武器进行战斗&#xff0c;还…

前端面试题30(闭包和作用域链的关系)

闭包和作用域链在JavaScript中是紧密相关的两个概念&#xff0c;理解它们之间的关系对于深入掌握JavaScript的执行机制至关重要。 作用域链 作用域链是一个链接列表&#xff0c;它包含了当前执行上下文的所有父级执行上下文的变量对象。每当函数被调用时&#xff0c;JavaScri…

零基础也能成为产品册设计高手

​在当今数字化时代&#xff0c;产品册设计已成为企业营销的重要手段之一。过去&#xff0c;人们认为只有专业人士才能设计出精美的产品册&#xff0c;然而&#xff0c;随着设计工具的普及和在线学习资源的丰富&#xff0c;零基础的你也能成为产品册设计高手。本文将带你走进这…

MindsDB:一个利用企业数据构建 AI 的平台

MindsDB作为一个开源项目&#xff0c;它旨在将机器学习模型无缝集成到现有的数据库系统中&#xff0c;为用户提供实时的数据预测能力。这个项目的创新之处在于&#xff0c;它能够以简单、直观的方式让开发者和非技术人员都能够利用AI进行数据分析和预测。 它是根据企业数据库定…