首页 > 其他分享 >基于Aidlux的图片相似度对比

基于Aidlux的图片相似度对比

时间:2023-10-24 20:55:52浏览次数:33  
标签:基于 Aidlux aidlite cv2 shape photo np import 对比

印章检测流程:

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

1.Siamese网络

Siamese网络是一种常用的深度学习相似性度量方法,它包含两个共享权重的CNN网络(说白了这两个网络其实就是一个网络,在代码中就构建一个网络就行了),将两个输入映射到同一特征空间,然后计算它们的距离或相似度一一使用共享的卷积层和全连接层,输出特征向量表示,然后计算相似度。

 

2.Triplet Loss网络

TripletLoss网络是一种通过比较三个样本之间的相似度来训练网络的方法。它包含三个共享权重的CNN网络,分别处理anchor、 positive和negative样本,其中positive样本与anchor相似与negative样本则不相似。通过三元组训练方法学习将同类别样本映射到相邻区域,不同类别样本映射到较远的区域。

 

 

3.本文方法

本文利用李生网络,把真章、假章同时输入进行学习,真与真相似度为1;真与假相似度为0,设计损失函数(结合BCELoss和Contrastive Loss) 进行模型训练。

 

 

 

训练步骤:

1.按上述格式放置数据集,放在dataset文件夹下。

2.将train.py当中的train_own_data设置成True。

3.运行train.py开始训练,可以观察对应step训练集和验证集的准确率。

将训练得到的.pth文件转换为onnx模型,再通过AIMO将onnx转换为tflite与dlc模型。

 

 

 

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)

 

tflite部署:https://www.bilibili.com/video/BV1ZQ4y1p7iL/

dcl部署:https://www.bilibili.com/video/BV1oC4y137t1/

 

 

 

 

标签:基于,Aidlux,aidlite,cv2,shape,photo,np,import,对比
From: https://www.cnblogs.com/curry12138/p/17785727.html

相关文章

  • 实验7:基于REST API的SDN北向应用实践
    实验7:基于RESTAPI的SDN北向应用实践一、实验目的能够编写程序调用OpenDaylightRESTAPI实现特定网络功能;能够编写程序调用RyuRESTAPI实现特定网络功能。二、实验环境Ubuntu21.10三、实验内容利用Mininet平台搭建拓扑,并连接控制器。编写Python程序,调用相应控制器(Open......
  • 基于ZCU104的PS和PL数据交互例程(三):vivado中创建IP
    基于ZCU104的PS和PL数据交互例程(三):vivado中创建IP以创建带有AXI-LITE接口的IP为例子按照下面步骤创建这里注意,这里选择的NumberofRegisters,会在后面的代码里面对应slv_reg0,slv_reg1,...,slv_reg3打开IP目录,右键刚才的IP,选择EidtinIPPackagercontroller_v1_0......
  • 安信可小安派【Analog to digital】 ADC 基于AI-M6x
    今天来分享一下我的ADC学习心得,首先说明当前的教程适用于所有的搭载AI-m61或者m62芯片的小安派。需要的库文件如库文件说明bflb_adc.hADC功能log.h用来打印日志bflb_gpio.h初始化GPIObflb_mtimer.h延时board.h初始化系统重要的方法如下:/***......
  • 简单有效!Direct Inversion: 三行代码提升基于Diffusion的图像编辑效果
    前言 本文介绍了由香港中文大学和粤港澳大湾区数字经济院联合提出的基于Diffusion的Inversion方法DirectInversion,可以在现有编辑算法上即插即用,无痛提点。本文转载自PaperWeekly作者:KK仅用于学术分享,若侵权请联系删除欢迎关注公众号CV技术指南,专注于计算机视觉的技术......
  • 安信可开发环境构建-基于Ai-WB2系列 和 Ai-M61 或 Ai-M62 (环境上下文切换)
    首先,对于Ai-WB2系列环境的构建官方文档已经讲的非常明白了,这里不做阐述如下链接所示https://blog.csdn.net/Boantong_/article/details/128480919 本人亲自测试可行,请严格follow官方的steps。另外需要注意的是,为了避免错误,尽量不要自己从GIT或者Gitee拉取项目。使用上述链接内,官......
  • 安信可小安派【IO中断】基于AI-M6X MCU
    最近在研究小安派的中断。昨晚写了一个Demo来进行测试。关于什么是中断这里已经讲的很清楚了。首先贴上引用参考。第一个是泽哥写的中断:http://ai-thinker.com/forum.php?mod=viewthread&tid=562&highlight=%E4%B8%AD%E6%96%AD&_dsign=fe47e0a0复制代码这个是我自己写......
  • 基于Android的视频资讯-计算机毕业设计源码+LW文档
    摘 要随着互联网的发展,尤其是视频互联网的发在,越来越多的人喜欢在闲暇的时候通过刷视频来度过自己的闲暇时光,为了让更多的人能够看到跟多有趣的视频,我们开发了本次的基于Android的视频资讯APP。本基于Android的视频资讯APP是根据当前的实际情况开发的,在系统语言选择上我们使用......
  • 基于Android的心理咨询信息系统-计算机毕业设计源码+LW文档
    安卓框架:uniapp安卓开发软件:HBuilderX开发模式:混合开发后台:开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9浏览器:谷歌浏览器DROPTABLEIFEXISTSconfig;/*......
  • 全志V3S嵌入式驱动开发(基于usb otg的spi-nor镜像烧入)
    全志V3S嵌入式驱动开发(基于usbotg的spi-nor镜像烧入)2023/10/2418:27:22【声明:版权所有,欢迎转载,请勿用于商业用途。联系信箱:[email protected]】     说到了用usbotg来实现spinandflash的烧入,这中间主要用到了PhoenixSuit软件。那么怎么用usbotg来实现......
  • 基于Python的子进程获取键盘输入
    一概念 众所周知,python中的获取键盘输入,input函数是没办法用在子程序的,这就限制了它的用途。想要在子程序中获取键盘输入。唯有fn=sys.stdin.fileno函数了。二实例解析在主进程中敲写代码fn=sys.stdin.fileno(),然后将获取到的文件描述符fn传入子进程,子进程敲写代码sys......