#image #transformer #clip # #png #clip-image-processor #clip。

clip_img

transformers.CLIPImageProcessor 的 Rust 版本实现。用于将图片转换为向量(通常是 224x224),然后传递给 clip。

4 个版本

0.1.3 2023 年 6 月 6 日
0.1.2 2023 年 6 月 6 日
0.1.1 2023 年 6 月 6 日
0.1.0 2023 年 6 月 5 日

4#的

每月 33 次下载
用于 clip_runtime

SSPL-1.0

175KB
143

clip_img

transformers.CLIPImageProcessor 的 Rust 实现。用于将图片转换为向量(通常是 224x224),然后传递给 clip。

cat.jpg.json 是由 CLIPImageProcessor 生成的图片数组导出 (导出代码)。

cargo test -p clip_img 会生成数值,并导出到 cat.jpg.png

最后,我看到两张图效果相同,如下图。

本来打算照搬 anansi 的 embedds/src/embedd/image_processor.rs

但是发现它的代码又冗长又糟糕(居然中间还把图片压了一遍 jpg),而且还引入了 libvips 这个 C 库的依赖,导致编译很麻烦。

于是果断决定全部自己重写,在重写的过程中参考了 clip-as-service 的逻辑。

这里吐槽一下搞机器学习的人,居然都是 CenterCrop,居中裁剪图片为正方形。

这样的话,再加上我以前在互联网公司工作的经验,按照手机拍照的高宽比,居中裁剪,很容易就把人脸裁掉一半。

基于这种 clip 做搜索,肯定会效果不理想。

所以我定义的 processor 函数接口如下,裁剪函数是可以传入的,我先按居中裁剪来实现,这样方便评估 Rust 实现是否与 Python 版本一致。

pub fn processor(
  crop: impl Fn(&RgbImage, (u32, u32), u32) -> RgbImage,
  dim: u32,
  img: &RgbImage,
) -> Array3<f32>

我个人建议加上人脸识别再进行裁剪。

以后再考虑人脸/主体识别+裁剪。

不多说了,空谈误国,实干兴邦 (talk is cheap, show you the code)。

代码见 : ./src/lib.rs

最后,感谢 ChatGPT,它写了主要代码测试代码,我只是负责调试、改 bug 和 code review。

依赖

~37MB
~531K SLoC