Bootstrap

基于Java深度学习库Deep Java Library 的图片相似度计算

基于Java深度学习库Deep Java Library 的图片相似度计算

使用imagenet预训练模型resnet50,提取图片512维特征,并支持图片1:1特征比对,给出置信度。

3_3

3_5

测试代码入口

@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:相似度较低,图片之间差异较大。

内积(或点积)

​ 可以用来计算相似度,尤其是在处理向量时。内积的结果可以反映两个向量之间的相似程度。具体来说,内积的值越大,通常表示两个向量越相似。

;