基于Aidlux的图片相似度对比

简介: 利用深度神经网络,提取印章深度特征,同时学习印章之间的相似度,自己与自己相似,自己与其它不相似。

1.Siamese网络
Siamese网络是一种常用的深度学习相似性度量方法,它包含两个共享权重的CNN网络(说白了这两个网络其实就是一个网络,在代码中就构建一个网络就行了),将两个输入映射到同一特征空间,然后计算它们的距离或相似度一一使用共享的卷积层和全连接层,输出特征向量表示,然后计算相似度。
image.png
2.Triplet Loss网络
TripletLoss网络是一种通过比较三个样本之间的相似度来训练网络的方法。它包含三个共享权重的CNN网络,分别处理anchor、 positive和negative样本,其中positive样本与anchor相似与negative样本则不相似。通过三元组训练方法学习将同类别样本映射到相邻区域,不同类别样本映射到较远的区域。
image.png
3.本文方法
本文利用李生网络,把真章、假章同时输入进行学习,真与真相似度为1;真与假相似度为0,设计损失函数(结合BCELoss和Contrastive Loss) 进行模型训练。
image.png
训练步骤:
1.按上述格式放置数据集,放在dataset文件夹下。
2.将train.py当中的train_own_data设置成True。
3.运行train.py开始训练,可以观察对应step训练集和验证集的准确率。
将训练得到的.pth文件转换为onnx模型,再通过AIMO将onnx转换为tflite与dlc模型。
image.png
Aidlux平台部署
1.tfilte部署

import aidlite_gpu
import cv2
from cvs import *
import numpy as np
import os
import time
from PIL import Image
from contrast_utils.utils import letterbox_image, preprocess_input, cvtColor

def sigmoid(x):
    return 1 / (1+np.exp(-x))

if __name__ == "__main__":

    # 1.初始化aidlite类并创建aidlite对象
    aidlite = aidlite_gpu.aidlite()
    print("ok")

    # 2.加载模型
    w = h = 112
    input_shape = [w, h]
    in_shape = [ 1 * w * h * 3 * 4, 1 * w * h * 3 * 4]
    out_shape = [ 1 * 1 * 1 * 4]

    model_path = "/home/aidlux/model/tflite/vgg16_fixed_fp32.tflite"
    value = aidlite.ANNModel(model_path, in_shape, out_shape, 4, 0)
    print("gpu:", value)

    img1_pth = "/home/aidlux/test_imgs/test/false/beijing_2019-11-21_10406_200_200_seal.jpg"
    img2_pth = "/home/aidlux/test_imgs/test/true/beijing_0905_61269575.jpg"
    out = "result"
    os.makedirs(out, exist_ok=True)

    img10 = cv2.imread(img1_pth)
    img20 = cv2.imread(img2_pth)

    img1 = Image.fromarray(cv2.cvtColor(img10, cv2.COLOR_BGR2RGB))
    img2 = Image.fromarray(cv2.cvtColor(img20, cv2.COLOR_BGR2RGB))

    image_1 = letterbox_image(img1, [input_shape[1], input_shape[0]], False)
    image_2 = letterbox_image(img2, [input_shape[1], input_shape[0]], False)

    photo_1  = preprocess_input(np.array(image_1, np.float32))
    photo_2  = preprocess_input(np.array(image_2, np.float32))

    photo_1 = np.expand_dims(np.transpose(photo_1, (2, 0, 1)), 0)
    photo_2 = np.expand_dims(np.transpose(photo_2, (2, 0, 1)), 0)

    # 3.传入模型输入数据
    # input_data = np.array([photo_1, photo_2])
    aidlite.setInput_Float32(photo_1, index=0)
    aidlite.setInput_Float32(photo_2, index=1)

    # 4.执行推理
    start = time.time()
    aidlite.invoke()
    end = time.time()
    timerValue = (end - start) * 1000
    print("infer time(ms):{}".format(timerValue))

    # 5.获取输出
    pred = aidlite.getOutput_Float32(0)[0]
    print(pred)
    outs = round(sigmoid(pred), 9)
    print(outs)

    img_pair = np.hstack((cv2.resize(img10, (112,112)), cv2.resize(img20, (112,112))))
    h, w = img_pair.shape[:2]
    print('--+++', img_pair.shape)
    h, w = img_pair.shape[:2]
    cv2.putText(img_pair, 'sim:{}'.format(str(outs)), (0, h), cv2.FONT_ITALIC, 1, (255,255,0), 2)

    # from cvs import *
    cvs.imshow(img_pair)
    cv2.imwrite("/home/aidlux/res/adilux_tflite_img_pair.jpg", img_pair)

2.dlc部署


import aidlite_gpu
import cv2
from cvs import *
import numpy as np
import os
import time
from PIL import Image
from contrast_utils.utils import letterbox_image, preprocess_input, cvtColor

def sigmoid(x):
    return 1 / (1+np.exp(-x))

if __name__ == "__main__":

    # 1.初始化aidlite类并创建aidlite对象
    aidlite = aidlite_gpu.aidlite()
    print("ok")

    # 2.加载模型
    w = h = 112
    input_shape = [w, h]
    #rgb3通道 1个float是32位也就是4字节,每个数据4个字节, 4代表4个字节
    in_shape = [ 1 * w * h * 3 * 4,  1 * w * h * 3 * 4]
    out_shape = [1 * 1 * 1 * 4]

    model_path = "/home/aidlux/model/dlc/vgg16_fixed.dlc"
    # value = aidlite.ANNModel(model_path, in_shape, out_shape, numberOfThreads, enableNNAPI)
    #numberOfThreads- int类型。加载数据和模型所需要的核数,可选的数值为1,2,3,4
    # enableNNAPI -  int类型。选择模型的推理的方式,默认可选值为-1:在cpu上推理,0:在GPU上推理,1:混合模式推理,2:dsp推理模式

    value = aidlite.ANNModel(model_path, in_shape, out_shape, 4, 0) #不支持多输入
    # value = aidlite.FAST_ANNModel(model_path, in_shape, out_shape, 4, 0)
    print("gpu:", value)

    img1_pth = "/home/aidlux/test_imgs/test/false/beijing_2019-11-21_10406_200_200_seal.jpg"
    img2_pth = "/home/aidlux/test_imgs/test/true/beijing_0905_61269575.jpg"
    out = "result"
    os.makedirs(out, exist_ok=True)

    img10 = cv2.imread(img1_pth)
    img20 = cv2.imread(img2_pth)

    img1 = Image.fromarray(cv2.cvtColor(img10, cv2.COLOR_BGR2RGB))
    img2 = Image.fromarray(cv2.cvtColor(img20, cv2.COLOR_BGR2RGB))

    image_1 = letterbox_image(img1, [input_shape[1], input_shape[0]], False)
    image_2 = letterbox_image(img2, [input_shape[1], input_shape[0]], False)

    photo_1  = preprocess_input(np.array(image_1, np.float32))
    photo_2  = preprocess_input(np.array(image_2, np.float32))

    photo_1 = np.expand_dims(np.transpose(photo_1, (2, 0, 1)), 0)
    photo_2 = np.expand_dims(np.transpose(photo_2, (2, 0, 1)), 0)

    # 3.传入模型输入数据
    aidlite.setInput_Float32(photo_1, index=0)
    aidlite.setInput_Float32(photo_2, index=1)

    # 4.执行推理
    start = time.time()
    aidlite.invoke()
    end = time.time()
    timerValue = (end - start) * 1000
    print("infer time(ms):{}".format(timerValue))

    # 5.获取输出
    pred = aidlite.getOutput_Float32(0)[0]
    print(pred)
    outs = round(sigmoid(float(pred)), 9)
    print(outs)

    img_pair = np.hstack((cv2.resize(img10, (112,112)), cv2.resize(img20, (112,112))))
    h, w = img_pair.shape[:2]
    print('--+++', img_pair.shape)
    h, w = img_pair.shape[:2]
    cv2.putText(img_pair, 'sim:{}'.format(str(outs)), (0, h), cv2.FONT_ITALIC, 1, (0,0,255), 2)

    # from cvs import *
    cvs.imshow(img_pair)
    cv2.imwrite("/home/aidlux/res/adilux_dlc_img_pair.jpg", img_pair)

效果视频:
pth转onnx、onnx推理、tflite推理、转tflite以及转dlc过程:
https://www.bilibili.com/video/BV1Kz4y1N73m/?vd_source=d3b09cd0849dbba42c427a4dccbd3c54
tflite部署:https://www.bilibili.com/video/BV1ZQ4y1p7iL/
dlc部署:https://www.bilibili.com/video/BV1oC4y137t1/

相关实践学习
在云上部署ChatGLM2-6B大模型(GPU版)
ChatGLM2-6B是由智谱AI及清华KEG实验室于2023年6月发布的中英双语对话开源大模型。通过本实验,可以学习如何配置AIGC开发环境,如何部署ChatGLM2-6B大模型。
相关文章
|
监控 PyTorch 算法框架/工具
Qwen-VL怎么用自己的数据集微调
Qwen-VL怎么用自己的数据集微调
1824 0
|
3月前
|
NoSQL 数据可视化 安全
如何开发一套车辆管理系统?(附架构图+流程图+代码参考)
本文介绍了如何通过搭建车辆管理系统(VMS)帮助企业摆脱传统管理方式,实现流程化、可视化、合规化和自动化。内容涵盖系统架构、关键功能模块、数据模型、API设计、前后端实现及实施建议,提供可落地的技术方案,助力企业降低隐形成本、提升管理效率与透明度,实现数据驱动决策。
|
机器学习/深度学习 数据采集 文字识别
7大核心技术:智能OCR如何助力市政单位文档处理数字化转型
随着政务服务数字化的推进,市政单位面临复杂的文档处理需求。本文介绍了一种基于智能OCR技术的一站式文档处理方案,涵盖数据矫正、通用文字识别、表格与票据结构化提取、卡证分类、印章检测、手写文字识别及图像内容识别等核心技术,显著提升工作效率与文档解析的准确性。
367 1
|
5月前
|
机器学习/深度学习 自然语言处理 搜索推荐
SingLoRA:单矩阵架构减半参数量,让大模型微调更稳定高效
SingLoRA是一种创新的低秩适应方法,通过单矩阵对称更新策略,有效提升模型微调的训练稳定性与参数效率。相比传统LoRA,其结构更简洁,参数更少,且无需复杂超参数调整,适用于大模型高效部署。
151 3
SingLoRA:单矩阵架构减半参数量,让大模型微调更稳定高效
|
机器学习/深度学习 计算机视觉
Siamese网络和Triplet网络
【10月更文挑战第1天】
|
人工智能 算法
图像伪造照妖镜!北大发布多模态LLM图像篡改检测定位框架FakeShield
北京大学研究团队提出了一种名为FakeShield的多模态框架,旨在解决图像伪造检测与定位(IFDL)中的黑箱问题及泛化能力不足。FakeShield不仅能评估图像真实性,生成篡改区域的掩码,还能提供像素级和图像级的篡改线索及详细文本描述,增强检测的可解释性。通过使用GPT-4o增强现有数据集,创建多模态篡改描述数据集(MMTD-Set),并引入领域标签引导的可解释伪造检测模块(DTE-FDM)和多模态伪造定位模块(MFLM),FakeShield在多种篡改技术的检测与定位上表现优异,为图像真实性维护提供了有力工具。
630 14
|
JavaScript
Nodejs的模块化概述
详细解释Node.js的模块化概念,包括CommonJS规范、模块的引用、定义、标识,以及如何在Node.js中实现模块化,并通过示例代码展示了如何创建和使用模块,以及"module.exports"和"exports"的区别。
152 1
Nodejs的模块化概述
|
机器学习/深度学习 前端开发 JavaScript
前端技术探索:从基础到未来趋势的全方位解析
前端技术探索:从基础到未来趋势的全方位解析
286 1
|
机器学习/深度学习 算法 数据处理
深度学习之多模态信息检索
基于深度学习的多模态信息检索(Multimodal Information Retrieval, MMIR)是指利用深度学习技术,从包含多种模态(如文本、图像、视频、音频等)的数据集中检索出满足用户查询意图的相关信息。
496 5
|
存储 文字识别 算法
解析!文档扫描 SDK 中的高级图像处理技术
本博客讨论了图像质量在文档扫描中的重要性,解决了扫描过程中遇到的常见挑战,以及文档扫描 SDK 利用先进的图像处理技术来应对这些挑战。