深度学习课程---室内小物体目标检测
(具体实现代码见附件)
思路:
我选择使用 Faster R-CNN 完成本次的目标检测任务。
一、整体思路
自定义Dataset来加载数据集;选取Resnet_FPN作为backbone,并编写Resnet_FPN用来提取特征,加载提前下载的预训练模型权重;定义RPN组件用于生成候选目标框;实现 ROI Align 模块,对候选目标框进行裁剪和缩放操作,以获取固定大小的特征图块;实现Box Head 用于目标分类和边界框回归的全连接网络;定义 Box Predictor 组件,用于最终预测和筛选过程;利用上述组件定义FasterRCNN框架;构建模型;编写训练代码;编写预测代码以及对预测结果进行可视化。
(鉴于有些代码比较复杂且本人能力有限,所有没有复现,直接调用的库函数)
二、具体而言
2.1 Dataset:
CustomDataset :用于加载和处理训练数据集
transform() :用于对图像和标注信息进行转换
collate_fn() :用于将输入的图像调整为相同的尺寸
convert_bbox_to_model_format() :用于将边界框的格式从转换为模型所需格式。
2.2 Resnet_FPN_backbone:
ResNet50:定义卷积神经网络模型
FPN:用于处理多尺度特征的网络结构。
LastLevelMaxPool:定义一个将输入特征图进行最大池化的模块
Bottleneck:定义残差块
overwrite_eps():定义函数用于设置FrozenBatchNorm层的eps值
resnet50_fpn_backbone:定义模型,并加载预训练权重
2.3 RPN:
AnchorsGenerator(): 用于生成锚框(anchors)
RegionProposalNetwork(): RPN 的主要函数或模块。
RPNhead: 用于生成候选框。
permute_and_flatten(): 将输入的 layer tensor 进行维度的转换和展平操作
smooth_l1_loss(): 这个函数计算 Smooth L1 损失。
concat_box_prediction_layers(): 这个函数将多个预测特征层的分类和回归结果进行拼接。
2.4 定义FasterRCNN框架:
FasterRCNNBase:整个Faster R-CNN的基础模块,包含了backbone(用于提取图像特征)、rpn(区域生成网络)和roi_heads(ROI头部网络)。
TwoMLPHead:是ROI头部网络的一部分,负责将特征图转换为固定大小的特征向量。
FastRCNNPredictor:也是ROI头部网络的一部分,负责对特征向量进行分类和边界框回归。
FasterRCNN:定义模型
2.5 构建模型:
Backbone:选择骨干网络,我采用的是Resnet_FPN,使用预训练的 ResNet-50 FPN 模型作为骨干网络。
创建 AnchorGenerator 对象来定义锚框生成器
定义 ROI 池化器
创建FasterRCNN模型实例
2.6 训练部分:
train_one_epoch :用于训练一个 epoch
train:使用 SGD 优化算法进行参数更新,通过循环训练多个 epochs,调用 train_one_epoch 函数进行训练,并在每个 epoch 结束后调用学习率调整器进行学习率的更新
2.7 预测部分:
将模型设为评估模式,通过循环遍历测试数据加载器中的每张图片,对图像进行预测,得到预测框的位置、置信度和标签,并根据指定的置信度阈值筛选出置信度较高的预测框。然后,将对应图片的预测框的位置、置信度和标签转换为字符串表示,并保存到CSV文件中。
2.8 预测可视化部分:
参照示例代码的可视化代码来对预测结果进行可视化。
(对于FasterRCNN整体的实现,主要参考B站UP主:霹雳吧啦Wz 的讲解视频,讲解十分透彻,但也是反反复复的看:https://www.bilibili.com/video/BV1of4y1m7nj/?p=1&vd_source=e2ec89a030ac300f1a6b187ed57bf4f5
UP主在GitHub上也有源码https://github.com/WZMIAOMIAO/deep-learning-for-image-processing
)
心得体会:
完成 Faster R-CNN 模型的过程中,我深刻理解了目标检测任务的复杂性和挑战性。通过长时间的学习,对FasterRCNN算是有了浅显的认知。再次感谢B站UP主的良心之作,让我对模型的原理和每个组件的功能都有了自己的理解。从自定义数据集、到模型构建以及训练和预测的代码,都进行了实践。在整个过程中遇到了各种各样的bug,有时候一个小bug可能要排上一上午。加上训练过程也是非常久,就算用华为云也得训练一到两个小时。可以说是搞得精疲力竭,不过最终也算是勉勉强强把模型复现出来了。我也深深切切地感受到了深度学习模型开发过程中的困难和重要性。不过总算最终能够完整地把结果跑出来,虽然结果不是很理想,但是依然有很大的成就感。
通过平时作业、实验以及大作业,任务的新鲜感和完成任务后的成就感让我对深度学习产生了浓厚的兴趣。加上这学期通过知识工程和深度学习基础这两门课程的学习,我的编程能力、数据分析能力和问题解决能力都得到了很大的提升,对人工智能和数据科学领域也有了更深刻的认知。以后的课余时间,我想多学习学习一些新的模型方法,尝试深度学习更高级的应用。
- 点赞
- 收藏
- 关注作者
评论(0)