Crates.io | clip_img |
lib.rs | clip_img |
version | 0.1.3 |
source | src |
created_at | 2023-06-05 10:33:38.676486 |
updated_at | 2023-06-06 11:08:39.452047 |
description | transformers.CLIPImageProcessor 的 rust 版本的实现。用于将图片转为向量(一般是 224x224),然后传给 clip。 |
homepage | https://github.com/xxai-art/clip-runtime/tree/main/rust/clip_txt |
repository | https://github.com/xxai-art/clip-runtime.git |
max_upload_size | |
id | 882969 |
size | 3,011,033 |
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。