1、项目实现流程步骤:
|--------------|-----------------------------------------------------------------------------|
| 1.训练自己的模型 | 1. 搜集数据图片(至少三大类别) 2. 自定义数据集(划分比例:8:1:1) 3. 设计模型(特征提取|分类任务) 4. 训练模型 5. 模型推理 |
| 2.特征库 | 1. 创建数据库(MySQL) |
| 3.保存图片特征到特征库 | 1. 连接数据库 2. 创建表 3. 提取图片特征(加载预训练模型) 4. 插入图片特征数据到数据库 |
| 4.检索图片 | 1. 提取带检索的图片特征(加载预训练模型) 2. 比对特征,找出相似top_k的图片 3. 展示检索的结果图片 |
2、数据准备与预处理:
收集了包含猫、狗、花三个类别的图像数据集,分别存储在dataset/train和dataset/test目录下。训练集和测试集按 8:1:1 的比例划分,确保模型具有良好的泛化能力。使用 Python 脚本检查图像的完整性,删除损坏的图像,并对图像进行重命名,确保数据的规范性。将所有图像调整为 224x224 像素,以便输入到深度学习模型中;将图像从 BGR 格式转换为 RGB 格式,符合模型输入要求;计算数据集的均值和标准差,对图像进行标准化处理,加速模型收敛。

3、模型选择与训练:
选用 ResNet34 残差网络作为基础模型。ResNet 通过引入残差块,有效解决了深度神经网络训练中的梯度消失问题,能够自动学习图像的高层语义特征,适合图像分类和检索任务。模型架构包含初始预处理层,由 7x7 卷积、批量归一化和最大池化层组成,用于提取图像的初步特征并降低数据维度;四个残差层组,每个残差层组包含多个普通残差块和特殊残差块,用于逐步提取图像的复杂特征;全局平均池化和全连接层,将特征图展平为特征向量,并通过全连接层进行分类。训练配置方面,设置批量大小为 127,平衡内存占用和训练效率;训练轮次为 500 轮,确保模型充分学习数据特征;学习率为 1e - 3,采用 Adam 优化器,结合 L2 正则化防止过拟合;损失函数选择交叉熵损失函数,用于衡量模型预测与真实标签的差异。使用 PyTorch 框架实现模型训练,每 5 轮自动保存模型 checkpoint;训练过程中实时记录损失值和准确率,通过进度条显示训练进度;训练结束后,保存最终模型和训练日志。
1)stats_loader.py文件修改如下:


3)model.py修改如下:

4)train.py文件修改如下:

运行结果如下:



4、系统实现:
使用训练好的 ResNet34 模型提取图像的特征向量。对于输入图像,首先进行预处理,然后通过模型前向传播得到特征向量,并进行 L2 归一化处理,确保特征向量的可比性。创建 MySQL 数据库img_features_db,表image_features用于存储图像路径和特征向量;使用mysql - connector - python库连接数据库,将图像特征向量以文本形式插入数据库。用户上传查询图像后,提取其特征向量;在数据库中查询所有图像的特征向量,计算与查询特征向量的余弦相似度;根据相似度排序,返回前 5 个最相似的图像结果,并显示检索结果图像。
1)创建数据库(MySQL)
CREATE DATABASE img_features_db
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
2)修改search_img_mysql.py
模型路径和数据用户及密码:

修改特征路径和检索的图片路径及开启插入特征is_insert_db=True:
插入特征值时第一次修改为True,之后为False

运行结果:

刷新表得到的结果:

5、项目效果:
分类:

以图搜图:

6、遇到的问题及解决方法:
1)在计算数据集均值和标准差时,由于数据集质量不高导致计算结果异常。
通过数据清洗(过滤无效文件、统一尺寸通道)、异常值处理(填充非法值)二重策略,有效解决因数据集质量导致的均值标准差计算错误。
2)训练时,刚开始训练了10轮,准确率不高,通过增加训练轮次至 500 轮,模型有足够迭代次数学习数据特征,解决了初始 10 轮的欠拟合问题,提升准确率。
最开始训练的准确率:

训练500轮之后的准确率:

1)在连接 MySQL 数据库时,由于用户名或密码错误导致连接失败。
通过确认数据库配置信息,修改连接参数,成功解决连接问题。
2)pycharm环境太乱,导致项目运行失败,重新配置环境。通过查看基础环境位置,创建与激活独立虚拟环境,依赖库安装与镜像加速,重新配置pycharm环境。
3)在连接 MySQL 数据库时,由于用户名或密码错误导致连接失败。
通过确认数据库配置信息,修改连接参数,成功解决连接问题。
4)pycharm环境太乱,导致项目运行失败,重新配置环境。通过查看基础环境位置,创建与激活独立虚拟环境,依赖库安装与镜像加速,重新配置pycharm环境。
