7 个版本

0.1.5 2024年7月10日
0.1.4 2024年6月28日
0.1.3 2024年4月3日
0.1.2 2024年3月17日
0.0.1 2024年1月27日

#21 in 机器人学

自定义许可证

185KB
3.5K SLoC

kornia-rs:Rust的低级计算机视觉库

Crates.io Version PyPI version Documentation License Slack

kornia-rs 是一个用 Rust 编写的低级计算机视觉库 🦀

使用此库以线程安全和高效的方式在您的机器学习和数据科学项目中执行图像 I/O、可视化和其他低级操作。

入门指南

cargorun --examplehello_world

use kornia_rs::image::Image;
use kornia_rs::io::functional as F;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // read the image
    let image_path = std::path::Path::new("tests/data/dog.jpeg");
    let image: Image<u8, 3> = F::read_image_jpeg(image_path)?;

    println!("Hello, world!");
    println!("Loaded Image size: {:?}", image.size());
    println!("\nGoodbyte!");

    Ok(())
}
Hello, world!
Loaded Image size: ImageSize { width: 258, height: 195 }

Goodbyte!

功能

  • 🦀该库主要用 Rust 编写。
  • 🚀 多线程且高效的图像 I/O、图像处理和高级计算机视觉操作。
  • 🔢 n 维后端基于 ndarray 包。
  • 🐍 使用 PyO3/Maturin 创建 Python 绑定。
  • 📦 我们支持 Linux amd64/arm64、Macos 和 Windows。
  • 支持的 Python 版本是 3.7/3.8/3.9/3.10/3.11

支持的图像格式

  • 从 AVIF、BMP、DDS、Farbeld、GIF、HDR、ICO、JPEG (libjpeg-turbo)、OpenEXR、PNG、PNM、TGA、TIFF、WebP 读取图像。

图像处理

  • 将图像转换为灰度,调整大小,裁剪,旋转,翻转,填充,归一化,反归一化,以及其他图像处理操作。

视频处理

  • 从相机捕获视频帧。

🛠️ 安装

>_ 系统依赖

根据您想使用的功能,您可能需要在您的系统中安装以下依赖项

turbojpeg

sudo apt-get install nasm

gstreamer

sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev

** 检查 gstreamer 安装指南:https://docs.rs/gstreamer/latest/gstreamer/#installation

🦀 Rust

将以下内容添加到您的 Cargo.toml

[dependencies]
kornia-rs = { version = "0.1.2", features = ["gstreamer"] }

或者,您可以使用 cargo 命令添加依赖项

cargo add kornia-rs

🐍 Python

pip install kornia-rs

示例:图像处理

以下示例展示了如何读取图像,将其转换为灰度并调整大小。然后,将图像记录到rerun录制流中。

查看examples目录中的所有示例,以了解更多用例。

use kornia_rs::image::Image;
use kornia_rs::io::functional as F;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // read the image
    let image_path = std::path::Path::new("tests/data/dog.jpeg");
    let image: Image<u8, 3> = F::read_image_jpeg(image_path)?;
    let image_viz = image.clone();

    let image_f32: Image<f32, 3> = image.cast_and_scale::<f32>(1.0 / 255.0)?;

    // convert the image to grayscale
    let gray: Image<f32, 1> = kornia_rs::color::gray_from_rgb(&image_f32)?;

    let gray_resize: Image<f32, 1> = kornia_rs::resize::resize_native(
        &gray,
        kornia_rs::image::ImageSize {
            width: 128,
            height: 128,
        },
        kornia_rs::resize::InterpolationMode::Bilinear,
    )?;

    println!("gray_resize: {:?}", gray_resize.size());

    // create a Rerun recording stream
    let rec = rerun::RecordingStreamBuilder::new("Kornia App").connect()?;

    // log the images
    let _ = rec.log("image", &rerun::Image::try_from(image_viz.data)?);
    let _ = rec.log("gray", &rerun::Image::try_from(gray.data)?);
    let _ = rec.log("gray_resize", &rerun::Image::try_from(gray_resize.data)?);

    Ok(())
}

Screenshot from 2024-03-09 14-31-41

Python使用

加载图像,直接将其转换为numpy数组,以便与其他库集成。

    import kornia_rs as K
    import numpy as np

    # load an image with using libjpeg-turbo
    img: np.ndarray = K.read_image_jpeg("dog.jpeg")

    # alternatively, load other formats
    # img: np.ndarray = K.read_image_any("dog.png")

    assert img.shape == (195, 258, 3)

    # convert to dlpack to import to torch
    img_t = torch.from_dlpack(img)
    assert img_t.shape == (195, 258, 3)

将图像写入磁盘

    import kornia_rs as K
    import numpy as np

    # load an image with using libjpeg-turbo
    img: np.ndarray = K.read_image_jpeg("dog.jpeg")

    # write the image to disk
    K.write_image_jpeg("dog_copy.jpeg", img)

使用turbojpeg后端编码或解码图像流

import kornia_rs as K

# load image with kornia-rs
img = K.read_image_jpeg("dog.jpeg")

# encode the image with jpeg
image_encoder = K.ImageEncoder()
image_encoder.set_quality(95)  # set the encoding quality

# get the encoded stream
img_encoded: list[int] = image_encoder.encode(img)

# decode back the image
image_decoder = K.ImageDecoder()

decoded_img: np.ndarray = image_decoder.decode(bytes(image_encoded))

使用具有SIMD加速的kornia-rs后端调整图像大小

import kornia_rs as K

# load image with kornia-rs
img = K.read_image_jpeg("dog.jpeg")

# resize the image
resized_img = K.resize(img, (128, 128), interpolation="bilinear")

assert resized_img.shape == (128, 128, 3)

🧑‍💻 开发

先决条件:在您的系统中安装rustpython3

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

在本地目录中克隆仓库

git clone https://github.com/kornia/kornia-rs.git

🦀 Rust

编译项目并运行测试

cargo test

对于特定测试,您可以运行以下命令

cargo test image

🐍 Python

为了构建Python轮文件,我们使用maturin包。使用以下命令构建轮文件

make build-python

要运行测试,请使用以下命令

make test-python

💜 贡献

这是Kornia的子项目。加入社区以与我们取得联系,或者只需赞助项目:https://opencollective.com/kornia

依赖项

~6–17MB
~235K SLoC