图像检索技术全解析
立即解锁
发布时间: 2025-08-30 00:50:19 阅读量: 7 订阅数: 14 AIGC 

### 图像检索技术全解析
#### 1. 模型导出与服务
在图像检索的流程中,首先要进行模型的导出与服务部署。分类签名借助 TensorFlow 的分类 API,输入是必需的,有预测类别和预测概率两个可选输出,且至少要有一个输出。预测签名在输入和输出数量上具有灵活性,客户端可以定义多个输出并明确查询。以下是签名定义的代码:
```python
signature_def = (
tf.saved_model.signature_def_utils.build_signature_def(
inputs={'x': tf.saved_model.utils.build_tensor_info(x_input)},
outputs={'y': tf.saved_model.utils.build_tensor_info(y_input)},
method_name="tensorflow/serving/predict"))
```
接着,将元图和变量添加到构建器中,并使用预测签名:
```python
model_path = os.path.join(work_dir, str(model_version))
saved_model_builder = tf.saved_model.builder.SavedModelBuilder(model_path)
saved_model_builder.add_meta_graph_and_variables(
session, [tf.saved_model.tag_constants.SERVING],
signature_def_map={
'prediction': signature_def
},
legacy_init_op=tf.group(tf.tables_initializer(), name='legacy_init_op'))
saved_model_builder.save()
```
导出的模型可以通过 TensorFlow Serving 进行服务,使用以下命令:
```bash
tensorflow_model_server --port=9000 --model_name=mnist --model_base_path=/tmp/mnist_model/
```
#### 2. 模型推理测试
为了测试模型服务,需要导入必要的库:
```python
from grpc.beta import implementations
import numpy
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
from tensorflow_serving.apis import predict_pb2
from tensorflow_serving.apis import prediction_service_pb2
```
设置并发数、测试数量和工作目录等常量,并定义一个用于计数预测结果的远程过程调用(RPC)回调函数:
```python
concurrency = 1
num_tests = 100
host = ''
port = 8000
work_dir = '/tmp'
def _create_rpc_callback():
def _callback(result):
response = numpy.array(
result.result().outputs['y'].float_val)
prediction = numpy.argmax(response)
print(prediction)
return _callback
```
运行推理,调用服务器进行预测:
```python
test_data_set = mnist.test
test_image = mnist.test.images[0]
predict_request = predict_pb2.PredictRequest()
predict_request.model_spec.name = 'mnist'
predict_request.model_spec.signature_name = 'prediction'
predict_channel = implementations.insecure_channel(host, int(port))
predict_stub = prediction_service_pb2.beta_create_PredictionService_stub(predict_channel)
predict_request.inputs['x'].CopyFrom(
tf.contrib.util.make_tensor_proto(test_image, shape=[1, test_image.size]))
result = predict_stub.Predict.future(predict_request, 3.0)
result.add_done_callback(
_create_rpc_callback())
```
多次调用推理可以评估模型的准确性、延迟和吞吐量,推理错误率应在 90% 左右,并发性能要好。
#### 3. 基于内容的图像检索(CBIR)
CBIR 技术以查询图像为输入,对目标图像数据库中的图像进行排序并输出结果。它是一种有特定目标的图像搜索引擎,需要一个目标图像数据库。直接使用图像进行相似度比较存在一些问题:
- 图像维度大。
- 像素存在大量冗余。
- 像素不携带语义信息。
因此,我们训练一个目标分类模型,使用模型的特征进行检索。将查询图像和目标数据库通过同一模型获取特征,这些模型也可称为编码器,应能捕获全局和局部特征。为了加快检索速度,可以采用以下方法:
| 方法 | 描述 |
| ---- | ---- |
| 局部敏感哈希(LSH) | 将特征投影到子空间,给出候选列表,后续进行精细特征排序,也是一种降维技术,有低维特征桶。 |
| 多索引哈希 | 对特征进行哈希,类似鸽巢原理,使用汉明距离加快计算,汉明距离是二进制表示下数字位置差异的数量。 |
这些方法速度快、内存需求少,但准确性会有所牺牲,且不能捕获语义差异。可以对匹配结果进行重新排序以获得更好的结果,重新排序可采用以下技术:
- 几何验证:匹配几何形状,只返回几何形状相似的目标图像。
- 查询扩展:扩展目标图像列表并进行详尽搜索。
- 相关性反馈:获取用户反馈并返回结果,根据用户输入进行重新排序。
#### 4. 构建检索管道
检索管道是为查询图像从目标图像中获取最佳匹配的一系列步骤。其流程如下:
```mermaid
graph LR
A[离线提取图像数据库特征] --> B[存储特征到数据库]
C[查询图像] --> D[提取查询图像特征]
D --> E[计算与所有目标图像的相似度]
E --> F[对图像进行排序]
F --> G[输出最终结果]
B --> E
```
特征提取步骤要快,可以使用 TensorFlow Serving。根据应用需求选择使用的特征,例如纹理匹配可使用初始层,对象级匹配可使用后续层。
#### 5. 提取图像的瓶颈特征
瓶颈特征是预分类层计算的值。下面介绍如何使用 TensorFlow 从预训练模型中提取瓶颈特征。
首先,导入必要的库:
```python
import os
import urllib.request
from tensorflow.python.platform import gfile
import tarfile
```
下载预训练模型并解压到本地文件夹:
```python
model_url = 'http://download.tensorflow.org/models/image/imagenet/inception-2015-12-05.tgz'
file_name = model_url.split('/')[-1]
file_path = os.path.join(work_dir, file_name)
if not os.path.exists(file_path):
file_path, _ = urllib.request.urlretrieve(model_url, file_path)
tarfile.open(file_path, 'r:gz').extractall(work_dir)
```
读取图定义并加载到内存:
```python
model_path = os.path.join(work_dir, 'classify_image_graph_def.pb')
with gfile.FastGFile(model_path, 'rb') as f:
graph_defnition = tf.GraphDef()
graph_defnition.P
```
0
0
复制全文
相关推荐










