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
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。
依赖
~37MB
~531K SLoC