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 |
#17 in #clip
Used in clip_runtime
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。
Dependencies
~30MB
~537K SLoC