HF-Net(一)基于NetVLAD的global descriptor的特征提取

参考:HF-Net git地址

0.数据准备及预训练权重

以Aachen Day-Night dataset为例,该数据集目录结构如下:aachen存放在编译HF-Net时设置的DATA_PATH下
在这里插入图片描述
基于NetVLAD的global descriptor的特征提取即对$DATA_PATH/aachen/images_upright/query下的图片生成对应的global descriptor特征(使用的是sgg中的conv3_3)
Aachen Day-Night dataset 检索的一个标准数据集
在这里插入图片描述
在这里插入图片描述
权重设置:DATA_PATH路径下创建weights文件夹,该文件夹下存放预训练好的NetVLAD权重

1.提取特征核心代码

import numpy as np
import argparse
import yaml
import logging
from pathlib import Path
from tqdm import tqdm
from pprint import pformat

logging.basicConfig(format='[%(asctime)s %(levelname)s] %(message)s',datefmt='%m/%d/%Y %H:%M:%S',level=logging.INFO)
from hfnet.models import get_model  # noqa: E402
from hfnet.datasets import get_dataset  # noqa: E402
from hfnet.utils import tools  # noqa: E402
from hfnet.settings import EXPER_PATH, DATA_PATH  # noqa: E402


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('config', type=str)
    parser.add_argument('export_name', type=str)
    parser.add_argument('--keys', type=str, default='*')
    parser.add_argument('--exper_name', type=str)
    parser.add_argument('--as_dataset', action='store_true')
    args = parser.parse_args()

    export_name = args.export_name
    exper_name = args.exper_name
    with open(args.config, 'r') as f:
        config = yaml.load(f)
    keys = '*' if args.keys == '*' else args.keys.split(',')

    if args.as_dataset:
        base_dir = Path(DATA_PATH, export_name)
    else:
        base_dir = Path(EXPER_PATH, 'exports')
        base_dir = Path(base_dir, ((exper_name+'/') if exper_name else '') + export_name)
    base_dir.mkdir(parents=True, exist_ok=True)

    if exper_name:
        # Update only the model config (not the dataset)
        with open(Path(EXPER_PATH, exper_name, 'config.yaml'), 'r') as f:
            config['model'] = tools.dict_update(
                yaml.load(f)['model'], config.get('model', {}))
        checkpoint_path = Path(EXPER_PATH, exper_name)
        if config.get('weights', None):
            checkpoint_path = Path(checkpoint_path, config['weights'])
    else:
        if config.get('weights', None):
            checkpoint_path = Path(DATA_PATH, 'weights', config['weights'])
        else:
            checkpoint_path = None
            logging.info('No weights provided.')
    logging.info(f'Starting export with configuration:\n{pformat(config)}')

    with get_model(config['model']['name'])(
            data_shape={'image': [None, None, None, config['model']['image_channels']]},
            **config['model']) as net:
        if checkpoint_path is not None:
            net.load(str(checkpoint_path))
        dataset = get_dataset(config['data']['name'])(**config['data'])
        test_set = dataset.get_test_set()

        for data in tqdm(test_set):
            predictions = net.predict(data, keys=keys)
            predictions['input_shape'] = data['image'].shape
            name = data['name'].decode('utf-8')
            Path(base_dir, Path(name).parent).mkdir(parents=True, exist_ok=True)
            np.savez(Path(base_dir, '{}.npz'.format(name)), **predictions)

如果想要使用自己的数据集进行测试,需要做如下改进:
1.1找到hfnet/hfnet/configs路径,复制一份比如netvlad_export_aachen.yaml,修改其中参数: data/name设为存放在DATA_PATH下的你的图像路径名,该文件夹设置db和query文件夹,其中db存放底库数据,query存放查询图像
设置load_db/load_queries均为true进行global descriptors生成,如果load_db设为为false,则底库图像不进行特征提取,load_queries同理类似
1.2$DATA_PATH/路径下设置一个文件夹存储图片,下面设置两个文件夹一个db一个query,与1.1中图像路径名对应起来
1.3找到hfnet/hfnet/datasets路径,复制一份aachen.py,和1.2中文件夹名一致,修改其中几个参数:首先将其中的类名改成与1.2中文件夹名一致,且首字母大写,设置dataset_folder,指向1.2中存放图片路径

2.执行特征提取

python3 hfnet/export_predictions.py hfnet/configs/netvlad_export_aachen.yaml netvlad/aachen --keys global_descriptor
#第二个文件为参数设置文件,第三个参数为保存输出结果路径
#如果自己设定待特征提取的数据集,第二个参数yaml文件指向1.1中自己复制命名的对应文件,第三个参数改为自己想要存放输出结果的路径即可

3.结果生成

db和query文件夹下每张图片对应生成一个npz压缩包:
在这里插入图片描述
每个压缩包下包含两个文件:
在这里插入图片描述

好的,我可以帮助您用 OpenCV 编写一个图像处理程序来提取 HOG(方向梯度直方图)特征。 HOG 特征是一种用于对象检测的特征描述符,它被广泛应用于人脸识别、行人检测等领域。 以下是用 OpenCV 实现 HOG 特征提取的一些步骤: 1. 加载图像并转为灰度图像 ```python import cv2 # 加载图像 image = cv2.imread("input_image.jpg") # 转为灰度图像 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) ``` 2. 计算梯度幅值和方向 ```python # 计算梯度幅值和方向 gx = cv2.Sobel(gray, cv2.CV_32F, 1, 0) gy = cv2.Sobel(gray, cv2.CV_32F, 0, 1) magnitude, angle = cv2.cartToPolar(gx, gy, angleInDegrees=True) ``` 3. 划分图像为 cell,并计算每个 cell 内的方向直方图 ```python # 划分图像为 8x8 的 cell cell_size = (8, 8) blocks_per_cell = (1, 1) cells_per_block = (2, 2) # 计算每个 cell 内的方向直方图 histogram = cv2.HOGDescriptor( _winSize=(gray.shape[1] // cell_size[1] * cell_size[1], gray.shape[0] // cell_size[0] * cell_size[0]), _blockSize=(cell_size[1] * cells_per_block[1], cell_size[0] * cells_per_block[0]), _blockStride=(cell_size[1], cell_size[0]), _cellSize=(cell_size[1], cell_size[0]), _nbins=9).compute(gray) ``` 4. 将所有 cell 的方向直方图串联起来,形成最终的 HOG 特征描述符 ```python # 将所有 cell 的方向直方图串联起来 features = [] for i in range(histogram.shape[0] - cells_per_block[0] + 1): for j in range(histogram.shape[1] - cells_per_block[1] + 1): block_feature = [] for k in range(cells_per_block[0]): for l in range(cells_per_block[1]): cell_feature = histogram[i + k, j + l, :] block_feature.extend(cell_feature) norm = np.sqrt(np.sum(np.array(block_feature)**2) + 1e-6) block_feature = [ele / norm for ele in block_feature] features.extend(block_feature) # 形成最终的 HOG 特征描述符 hog_descriptor = np.array(features) ``` 以上是用 OpenCV 编写的 HOG 特征提取程序的基本过程,您可以在此基础上进行更详细的定制。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值