基于Java深度学习库Deep Java Library 的图片相似度计算
使用imagenet预训练模型resnet50,提取图片512维特征,并支持图片1:1特征比对,给出置信度。
测试代码入口
@SneakyThrows
@Test
public void test1() {
ImageEncoderModel imageEncoderModel = new ImageEncoderModel();
imageEncoderModel.init("models/CLIP-ViT-B-32-IMAGE.pt", 4);
Path imageFile1 = Paths.get("models/3_3.jpg");
Image img1 = OpenCVImageFactory.getInstance().fromFile(imageFile1);
Path imageFile2 = Paths.get("models/3_5.jpg");
Image img2 = OpenCVImageFactory.getInstance().fromFile(imageFile2);
float[] feature1 = imageEncoderModel.predict(img1);
float[] feature2 = imageEncoderModel.predict(img2);
float dis = FeatureComparison.dis(feature1, feature2);
logger.info(Float.toString(dis));
float cos = FeatureComparison.cosineSim(feature1, feature2);
logger.info(Float.toString(cos));
float dot = FeatureComparison.dot(feature1, feature2);
logger.info(Float.toString(dot));
}
运行结果
[INFO ] - 3.9849436
[INFO ] - 0.918966
[INFO ] - 89.196815
说明
余弦相似度
- 接近1(如0.9及以上):表示两张图片非常相似,特征向量方向几乎一致。
- 0.7到0.9之间:表示图片有一定的相似性,可能存在一些差异,但整体特征相似。
- 0.5到0.7之间:相似度较低,图片之间有明显的不同。
- 低于0.5:通常认为图片之间的相似度很低,差异较大。
欧式距离
- 距离接近0:表示图片几乎完全相同。
- 小于10:通常认为是相似的,但具体要看图片的内容。
- 10到30之间:相似度开始降低,可能有一定的差异。
- 大于30:相似度较低,图片之间差异较大。
内积(或点积)
可以用来计算相似度,尤其是在处理向量时。内积的结果可以反映两个向量之间的相似程度。具体来说,内积的值越大,通常表示两个向量越相似。