基于深度学习的图像检索 image retrieval based on deep learning (code ,代码)

2023-11-11

本次代码分享主要是用的caffe框架,至于caffe框架的安装过程不再说明。代码修改自“cross weights”的一篇2016年的文章,但是名字忘记了,谁记得,提醒我下。

一、环境要求

        1、python

        2、gcc

        3、opencv

        4、一些图像数集合,比如holiday、oxford、paris不过这些都是标准数据集,你也可以用到自己的系统上。

        5、完整代码会之后放在github上。

二、使用说明

        1、首先将整个图库进行特征提取

            流程:图像->VGG 最后一个卷积层得到 H*W*512维度的tensor利用*.npy格式进行保存。对于每张图像都需要这么处理,存储每个图像的“特征”。

        

# Copyright 2015, Yahoo Inc.

# Licensed under the terms of the Apache License, Version 2.0. See the LICENSE file associated with the project for terms.

import _init_paths

import os

import caffe

import numpy as np

from PIL import Image

import scipy



###################################

# Feature Extraction

###################################




##################################

#这个函数用于打开图像并且转换为RGB,其中img1=·~~~~~~~这一行可以用于改变图像尺寸。

##################################



def load_img(path):

    try:

        img = Image.open(path)

        rgb_img = Image.new("RGB",img.size)

        rgb_img.paste(img)

        return rgb_img

    except:

        return None


#################################

#这个函数用于转换输入图像的数据量,转换为32位浮点数,同时减去3个通道上各自的均值,将数据进行通道转换。

#################################


def format_img_for_vgg(img):

    d = np.array(img, dtype=np.float32)

    d = d[:,:,::-1]

    # Subtract mean pixel values of VGG training set

    d -= np.array((104.00698793,116.66876762,122.67891434))

    return d.transpose((2,0,1))


#################################

#这个函数用于特征提取,net.blob中的net代表了我们初始化完成后的网络,blob代表数据块

#################################



def extract_raw_features(net, layer, d):

    """

    Extract raw features for a single image.

    """

    # Shape for input (data blob is N x C x H x W)

    net.blobs['data'].reshape(1, *d.shape)                    #这个reshape表示将网络的入口修改为适合我们图像尺寸大小的shape

    net.blobs['data'].data[...] = d                           #d就是我们数据,将数据传入网络中

    # run net and take argmax for prediction

    net.forward()                                             #这个是让网络开始计算

    return net.blobs[layer].data[0]                           #将网络的计算结果输出(定义layer就能得到对应的层的输出)





################################

#下面这两个函数先不用管

################################


def reshape(image):

    mu=np.array((104.00698793,116.66876762,122.67891434))

    transformer=caffe.io.Transformer({'data':net.blobs['data'].data.shape})

    transformer.set_transpose('data',(2,0,1))

    transformer.set_mean('data',mu)

    transformer.set_raw_scale('data',255)

    #transformer.set_channel_swap('data',(2,1,0))


    net.blobs['data'].reshape(10,

                               3,

                                224,224)


    transformed_image=transformer.preprocess('data',image)

    print transformed_image.shape

    return transformed_image


def extract_raw_features_fc6(net, layer, d):

   

    #net.blobs['data'].reshape(1, *d.shape)

    # Shape for input (data blob is N x C x H x W)

   

    net.blobs['data'].data[...]=d

    net.forward()

    return net.blobs[layer].data[0]




#################################

#这是python的主函数入口,parser.add_argument代表我们手动在控制台需要输入的参数,或者提前定义好的一些参数,我们的网络的prototxt和caffemodel的路径也在参数中定义

################################



if __name__ == '__main__':

    from argparse import ArgumentParser

    parser = ArgumentParser()

    parser.add_argument('--images', dest='images', type=str, nargs='+', required=True, help='glob pattern to image data')

    parser.add_argument('--layer', dest='layer', type=str, default='fc6', help='model layer to extract')

    parser.add_argument('--prototxt', dest='prototxt', type=str, default='vgg/VGG_ILSVRC_16_fc6.prototxt', help='path to prototxt')

    parser.add_argument('--caffemodel', dest='caffemodel', type=str, default='vgg/VGG_ILSVRC_16_layers.caffemodel', help='path to model params')

    parser.add_argument('--out', dest='out', type=str, default='', help='path to save output')

    args = parser.parse_args()

##################################

#这个net=~~~~~~表示将我们的网络进行提前初始化,方便后面调用

####################################

    net = caffe.Net(args.prototxt, args.caffemodel, caffe.TEST)


    if not os.path.exists(args.out):

        os.makedirs(args.out)                         #这里是检测我们的数据来源的路径是否正确


    for path in args.images:

        #img = load_img(path)

        img=image=caffe.io.load_image(path)           #加载图像


        # Skip if the image failed to load

        if img is None:

            print path

            continue


        d = format_img_for_vgg(img)                   #对图像加载并且网络继续提取特征

        #d=reshape(img)                              

        X = extract_raw_features_fc6(net, args.layer, d)      #这后面的两句,是我采用的另外的方式进行  ,修改层名,就会从不同的层抽取特征


        filename = os.path.splitext(os.path.basename(path))[0]

        np.save(os.path.join(args.out, filename), X)            #将得到的结果采用*.npy的数据格式保存下来W*H*C,每一个图片对应一个*.npy

        2、特征进一步计算,这里有很多的文章可以参考,但是我们介绍一种最简单的,就是把H*W*512 变成1*1*512,也就是对于每个H*W进行了sum-pooling也就是求和,这里也可以有别的一些加权方法,很多论文,主要就在这一步做文章。

        这里就一句话:

        def sum-pooling(X): #这里的X就是刚才512*W*H

                return X.sum(axis=1,2)

        3、最后,就是采用欧式距离,和我们求平面中两个点的距离一样。

        distance=(X1-X2)**2

        这里的X需要在计算距离之前进行normlzation。然后才可以计算距离。这样的化,距离排个倒叙就能得到了我们最后的检索结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于深度学习的图像检索 image retrieval based on deep learning (code ,代码) 的相关文章

随机推荐

  • SeetaFace C++环境搭建(详细图文)

    SeetaFace C 环境搭建 详细图文 SeetaFace开源库由FaceDetection FaceAlignment FaceIdentification三部分组成 本文综合网上其他SeetaFace环境搭建的教程 经实践后整理出一
  • vue新建一个项目

    新建一个vue项目步骤 1 在workspace中新建一个文件夹Test 2 在VScode中点击文件 将文件夹添加到工作区 若要添加到现有的工作空间 可以将文件夹直接拖入 3 右击文件夹 点击在终端中打开 4 打开后 输入vue init
  • 密码学基础(一)——哈希算法

    一 常用密码学算法分类 哈希算法 哈希算法不可逆 包括 MD4 MD5 hash1 ripeMD160 SHA256 SHA3 Keccak256 国家标准SM3 国家密码管理局 加密 解密算法 加密解密算法可逆 但是必须要有秘钥 对称加密
  • 获取单选框的值

    Jq获取单选框的值 var type id input name type id checked val html和smarty tr style display none td class d label 是否关联减项项目 td td t
  • Opencv-C++笔记 (18) : 轮廓和凸包

    文章目录 一 轮廓 findContours发现轮廓 drawContours绘制轮廓 代码 二 几何及特性概括 凸包 Convex Hull 凸包概念 凸包扫描算法介绍 Graham扫描算法 相关API介绍 程序示例 轮廓集合及特性性概括
  • 关于单片机PDR和POR应用注意事项

    关于单片机PDR和POR应用注意事项 在单片机相关项目的开发中很少有同行会关注到POR和PDR的问题 本人也是经过相关项目的一步步填坑才发现PDR和POR很容易被忽视 一旦出现问题也是比较致命的 为此我将展开阐述并将我开发中遇到的相关问题分
  • CSS内部样式、外部样式

    文章目录 为什么需要CSS样式表 一 样式表的基本语法 二 常用的样式属性 1 文本属性 2 背景属性 3 行内 嵌入 样式表 4 外部样式表文件 为什么需要CSS样式表 HTML标签的外观样式比较单一 颜色只有黑白 字体类型和大小无变化
  • 深度学习-目标检测

    应用背景 在AI视觉领域 许多高精度测量场景 需要搭配传统视觉算法 才会有更好的使用效果 例如 本项目测量被检目标的长度 需要两个步骤 框选识别被检目标 对被检目标进行分析测量 程序功能 本程序功能 通过深度学习算法框选出被检目标后 可获取
  • echarts 文本标签配置 label文字样式

    字体基本样式设置 fontStyle fontWeight fontSize fontFamily 文字颜色 color 文字描边 textBorderColor textBorderWidth 文字阴影 textShadowColor t
  • Mac的idea启动项目贼慢,但其它小伙伴启动却很快

    前言 最近开发一直觉自己的mac本idea启动项目贼慢 很影响工作效率 然而同事的mac本启动同一项目却贼快 而且我的电脑性能比他的高 这就很尴尬 然后我尝试了多个方法 终于解决了这个问题 解决办法如下 找到 系统偏好设置 打开后 找到 共
  • 打印螺旋矩阵(C语言)

    本博文主要给大家介绍的是正方形的螺旋矩阵 因为这个螺旋矩阵是最简单的 我之后再把其他类型的螺旋矩阵写成博客和大家一起交流 百度对螺旋矩阵的定义如下 螺旋矩阵是指一个呈螺旋状的矩阵 它的数字由第一行开始到右边不断变大 向下变大 向左变大 向上
  • 2018年度区块链十大安全事件

    2019年1月3日是一个特别的日子 全球的区块链从业者都在以 比特币十年 的特殊仪式 纪念比特币创世区块诞生十周年 十年风雨不由人 十年踪迹十年心 如果说过去七年 这是条少有人走的路的话 过去三年尤其是刚刚过去的2018年 这条路街景开始变
  • for循环嵌套

    写if语句的时候 if else等是可以重叠的 也可以在大的if语句里套一个小的if语句 实际上for循环也是可以嵌套的 例1 写一个脚本输出三行 每行有5个 for i 1 5 fprintf end fprintf n 第一行的5个 输
  • 微信小程序-模板消息全面解析加实例

    一 模板消息是什么 模板消息是微信为小程序提供的消息推送能力 小程序可以向用户发送重要的消息通知 类似于App的推送通知 二 限制 相对于App的推送通知 模板消息有很多限制 这是因为微信放置开发者滥用推送能力骚扰用户 限制1 固定格式 模
  • 【满分】【华为OD机试真题2023 JS】机器人活动区域

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 机器人活动区域 知识点深搜广搜 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 现有一个机器人 可放置于 M N的网格中任意位置 每个网格包含一个非负整数编号 当
  • 【Node.js】定时任务cron:

    文章目录 一 文档 Nodejs 插件 二 安装与使用 1 安装 2 使用 三 cron表达式 秒数 分钟 小时 日期 月份 星期 年份 可为空 四 案例 一 文档 说明文档 https www npmjs com package cron
  • Allegro学习笔记---3.页面设置

    1 参数设置 板层颜色设置
  • YYF login功能

    Controller package com chinasofti fwgl ctrl import java util HashMap import java util List import org springframework be
  • sql怎么把查询的几个结果求和_sql多表查询-从1到很多怎么玩

    大纲 表的加法 表的联结 联结应用案例 case表达式 一 表的加法 加法 union 不保留重复行 select 课程号 课程名称 from course union select 课程号 课程名称 from course1 保留重复行
  • 基于深度学习的图像检索 image retrieval based on deep learning (code ,代码)

    本次代码分享主要是用的caffe框架 至于caffe框架的安装过程不再说明 代码修改自 cross weights 的一篇2016年的文章 但是名字忘记了 谁记得 提醒我下 一 环境要求 1 python 2 gcc 3 opencv 4