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

clip_img

transformers.CLIPImageProcessor 的 rust 版本的实现。用于将图片转为向量(一般是 224x224),然后传给 clip。

4 releases

0.1.3 Jun 6, 2023
0.1.2 Jun 6, 2023
0.1.1 Jun 6, 2023
0.1.0 Jun 5, 2023

#5 in #的


Used in clip_runtime

SSPL-1.0

175KB
143 lines

clip_img

transformers.CLIPImageProcessor 的 rust 实现。用于将图片转为向量(一般是 224x224),然后传给 clip。

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

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

最后,我看 2 张图效果一样,如下图。

本来打算照抄 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。

Dependencies

~30MB
~540K SLoC