cnn-for-image-retrieval
cnn-for-image-retrieval 是一个基于卷积神经网络(CNN)的开源图像检索工具,旨在帮助开发者快速构建“以图搜图”应用。它利用预训练的 ImageNet 模型提取图像深层特征,通过计算特征相似度在数据库中查找相似图片,有效解决了传统方法难以理解图像语义内容的痛点。
该项目最初基于 MatConvNet 框架,现已扩展支持 Caffe 和 Keras 等主流深度学习平台,并提供了完整的 Web 演示代码,非常适合计算机视觉领域的研究人员、算法工程师以及希望搭建自定义图像搜索系统的开发者使用。其独特的技术亮点在于验证了降维的有效性:研究发现将高维 CNN 特征(如 4096 维)通过 PCA 降至 128 维后,不仅能大幅节省存储空间,甚至能因去除信息冗余而提升检索精度。此外,项目还包含了计算平均检索精度(mAP)的标准脚本和对比基准框架,为用户评估和优化检索效果提供了便利。无论是用于学术研究还是工程落地,cnn-for-image-retrieval 都提供了一套成熟且易于复现的解决方案。
使用场景
某数字博物馆正在构建内部文物图像管理系统,策展人需要快速从数十万张藏品照片中找出风格或构图相似的文物,以辅助展览策划。
没有 cnn-for-image-retrieval 时
- 检索效率低下:依赖人工打标签或简单的文件名搜索,无法通过图片内容(如纹理、形状)直接查找相似图,耗时耗力。
- 查准率不足:传统基于颜色直方图的算法难以理解深层语义,常将“红色花瓶”错误匹配到“红色衣服”,无法满足专业策展需求。
- 存储与计算负担重:直接使用原始高维 CNN 特征(如 4096 维)导致数据库体积庞大,检索响应缓慢,且未进行降维优化。
- 技术门槛高:团队缺乏从头训练深度模型的算力与数据,难以在有限资源下搭建可用的图像检索原型。
使用 cnn-for-image-retrieval 后
- 实现以图搜图:利用预训练的 ImageNet 模型提取深层特征,策展人上传一张参考图,系统即可秒级返回视觉上高度相似的文物列表。
- 语义理解精准:基于卷积神经网络的特征表达能捕捉高级语义信息,准确匹配具有相同艺术风格或结构的藏品,大幅提升相关性。
- 性能显著优化:应用工具推荐的 PCA 降维策略,将特征从 4096 维压缩至 128 维,不仅减少了存储空间,还因去除冗余信息提升了检索精度。
- 快速落地部署:直接复用成熟的 MatConvNet 或 Python (Keras/Caffe) 代码框架,无需重新训练模型,几天内即可搭建起可演示的检索系统。
cnn-for-image-retrieval 通过引入预训练深度学习模型与科学的降维策略,让非 AI 专家团队也能低成本构建高精度的专业图像检索系统。
运行环境要求
- Windows
- Linux
- macOS
- 未说明(MatConvNet 支持 GPU 加速,但具体型号和 CUDA 版本未在文中指定
- Python 版本依赖后端框架)
未说明

快速开始
用于图像检索的卷积神经网络
博文:使用MatconvNet和预训练的ImageNet模型进行图像检索,对应的网页演示主页为picSearch。
2017/10/08:构建了CBIR检索对比框架cnn-cbir-benchmark,包括Fisher Vector、VLAD、FC、RMAC、CROW。
2017/08/15更新:增加了Python版本,Caffe版本,Keras版本。
2015/12/31更新:添加对MatConvNet最新版version 1.0-beta17的支持,预训练的模型请到Matconvnet官网下载最新的模型。
2015/12/31更新:添加对MatConvNet最新版version 1.0-beta17的支持,预训练的模型请到Matconvnet官网下载最新的模型。
2015/10/20更新:Web演示部分代码公开CNN-Web-Demo-for-Image-Retrieval。
2015/09/24更新:添加对MatConvNet最新版version 1.0-beta14的支持。
2015/12/31更新:添加对MatConvNet最新版version 1.0-beta17的支持,删掉原来的版本(预训练的模型请到matconvnet官网下载最新的模型)。
2015/06/29更新:添加对MatConvNet最新版version 1.0-beta12的支持。
注意:其中文件夹matconvnet-1.0-beta17是已经编译好了的,鉴于MatConvNet只能在Matlab 2014及其以上以及系统必须是64位,所以在使用此工具箱之前得满足这两个条件。如果是Pythoner,推荐使用flask-keras-cnn-image-retrieval,纯Python,非常易于写成在线图像搜索应用。
Caltech-256图像数据库上搜索结果

运行步骤
1). 如果不需要计算mAP的话,那就直接把你的图像库文件夹名字命名为database,并将图片全部放在放在database文件夹下即可。如果你要在后面计算MAP(平均检索精度)的话,要确保图像数据库做成文件夹databaseClassified中的形式,然后执行下面命令:
python movefiles.py
2). 接着便可以抽取特征。运行extractCNN.m,要用parfor并行的话,直接修改注释部分即可。
3). 检索可视化。这一步运行queryInDatabaseDemo.m即可。
4). 计算mAP。不需要计算MAP的这步略过。运行compute_MAP.m,关于mAP的计算,请参阅我画的mAP计算过程示意图:信息检索评价指标,这个计算mAP的脚本是按照那个流程中定义的mAP计算方式来写的。
降维
非常的amazing, 除了验证降维到128D后损失不减外,惊奇地发现4096D的CNN降维到128D后精度还有提高,一种可能的解释:CNN特征也有一定的信息冗余,信息冗余所带来的影响比降维所带来的损失的影响要更大。结论:You should reduce the dimension of CNN when you use if.
PCA降维对CNN特征的影响

上面实验使用的是本项目代码,图像数据集使用的是Caltech101。
关于PCA对PCA降维的影响,Neural Codes for Image Retrieval中也有探讨,以及曾跟Adrian Rosebrock也有过这方面的交流:
ANN is really fantastic, it makes such much easier. You could also try something like PCA on your 4096-d vector and try to get it down to 128-d. It would save some space and (ideally) not hurt accuracy.
所以,如果采用了CNN特征的话,推荐将其降维到128D。
CNN资源列表
C++
conv-net-version-3,对应博客Convolutional Neural Networks III
Python
Keras,强力推荐
Keras资源列表:
DeepLearning教程(6)易用的深度学习框架Keras简介
DeepLearning教程(7)深度学习框架Keras的使用-进阶
Keras VGG-16模型 VGG16 model for Keras
PDNN,对应主页PDNN: A Python Toolkit for Deep Learning
Matlab
GoogLeNet, A GPU Implementation of GoogLeNet.
常见问题
相似工具推荐
openclaw
OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
LLMs-from-scratch
LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目,旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型(LLM)。它不仅是同名技术著作的官方代码库,更提供了一套完整的实践方案,涵盖模型开发、预训练及微调的全过程。 该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型,却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码,用户能够透彻掌握 Transformer 架构、注意力机制等关键原理,从而真正理解大模型是如何“思考”的。此外,项目还包含了加载大型预训练权重进行微调的代码,帮助用户将理论知识延伸至实际应用。 LLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API,而是渴望探究模型构建细节的技术人员而言,这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计:将复杂的系统工程拆解为清晰的步骤,配合详细的图表与示例,让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础,还是为未来研发更大规模的模型做准备
Deep-Live-Cam
Deep-Live-Cam 是一款专注于实时换脸与视频生成的开源工具,用户仅需一张静态照片,即可通过“一键操作”实现摄像头画面的即时变脸或制作深度伪造视频。它有效解决了传统换脸技术流程繁琐、对硬件配置要求极高以及难以实时预览的痛点,让高质量的数字内容创作变得触手可及。 这款工具不仅适合开发者和技术研究人员探索算法边界,更因其极简的操作逻辑(仅需三步:选脸、选摄像头、启动),广泛适用于普通用户、内容创作者、设计师及直播主播。无论是为了动画角色定制、服装展示模特替换,还是制作趣味短视频和直播互动,Deep-Live-Cam 都能提供流畅的支持。 其核心技术亮点在于强大的实时处理能力,支持口型遮罩(Mouth Mask)以保留使用者原始的嘴部动作,确保表情自然精准;同时具备“人脸映射”功能,可同时对画面中的多个主体应用不同面孔。此外,项目内置了严格的内容安全过滤机制,自动拦截涉及裸露、暴力等不当素材,并倡导用户在获得授权及明确标注的前提下合规使用,体现了技术发展与伦理责任的平衡。
opencv
OpenCV 是一个功能强大的开源计算机视觉库,被誉为机器视觉领域的“瑞士军刀”。它主要解决让计算机“看懂”图像和视频的核心难题,提供了从基础的图像读取、色彩转换、边缘检测,到复杂的人脸识别、物体追踪、3D 重建及深度学习模型部署等全方位算法支持。无论是处理静态图片还是分析实时视频流,OpenCV 都能高效完成特征提取与模式识别任务。 这款工具特别适合计算机视觉开发者、人工智能研究人员以及机器人工程师使用。对于希望将视觉感知能力集成到应用中的软件工程师,或是需要快速验证算法原型的学术研究者,OpenCV 都是不可或缺的基础设施。虽然普通用户通常不会直接操作代码,但日常生活中使用的扫码支付、美颜相机和自动驾驶系统,背后往往都有它的身影。 OpenCV 的独特亮点在于其卓越的性能与广泛的兼容性。它采用 C++ 编写以确保高速运算,同时提供 Python、Java 等多种语言接口,极大降低了开发门槛。库中内置了数千种优化算法,并支持跨平台运行,能够无缝对接各类硬件加速器。作为社区驱动的项目,OpenCV 拥有活跃的生态系统和丰富的学习资源,持续推动着视觉技术的前沿发展。