Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >深度学习-最简代码实现目标检测模型

深度学习-最简代码实现目标检测模型

作者头像
汤青松
发布于 2024-02-12 01:11:05
发布于 2024-02-12 01:11:05
20100
代码可运行
举报
文章被收录于专栏:PHP技术大全PHP技术大全
运行总次数:0
代码可运行

一、项目介绍

深度学习领域中,目标检测一直是一个备受关注的研究方向。为了更深入地理解深度学习目标检测的原理和实现,我写了一个简单的单目标检测项目。在这个项目中, 我用最简单的方式实现了数据迭代器、网络模型、预测脚本和训练模型脚本,以及一些辅助脚本,通过这个过程提高对目标检测的认识和实践能力。 项目地址:https://github.com/78778443/QingNet

1.1 项目概要

要实现目标检测系统,离不开数据加载器,网络模型,训练脚本,预测脚本这四大项;

  1. 数据加载器的作用是将数据集加载出来,并将数据集的标注数据给格式化,便于后续训练;
  2. 网络模型的主要作用是提取网络特征,比如你给一张图,他把图里面的特征信息提取并返回给你;
  3. 训练脚本的主要作用是桥接数据集和网络模型,通常是给模型一个图片,模型返回特征结果后,对结果进行偏差(损失)计算;
  4. 预测脚本的主要作用是训练好一个模型(权重)后,将模型(权重)文件用于实际生产;

1.2 项目结构

这个项目的结构相对简单,主要涉及以下几个文件:

  • data.py: 数据迭代器,负责加载和处理训练和测试数据。
  • net.py: 网络模型的定义,包括卷积层、激活函数以及输出标签、位置、排序和置信度的信息。
  • train.py: 训练模型的脚本,包括数据加载、模型训练、损失函数计算、优化器更新等过程。
  • predict.py: 预测脚本,用训练好的模型进行单张图像的预测。
  • tools.py: 辅助脚本,用于可视化预测结果。

1.3 项目运行

在运行项目时,只需执行python train.py命令即可。 如果缺少相关依赖包,可以通过使用pip进行安装。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python train.py 
train_loss 0===>> 0.8435055017471313
train_loss 10===>> 0.8142958283424377
train_loss 40===>> 0.8188565373420715
test_loss 0===>> 0.8148629665374756
test_loss 10===>> 0.8028237223625183
sort_acc 14==>> tensor(0.0397)
train_loss 0===>> 0.8068220615386963

二、数据集处理

在做这个项目之前,要准备一批数据集,我将数据集文件放在data文件夹下,文件名里面包含图片序号,是否有目标,目标的四个坐标点,并用逗号隔开

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(base) ➜ tree data 
data
├── test
    ├── 1.0.0.0.0.0.0.jpg
    ├── 1.1.163.54.290.181.6.jpg
    ├── ....过长省略......
└── train
    ├── 1000.0.0.0.0.0.0.jpg
    ├── 1000.1.64.90.229.255.8.jpg
    ├── ....过长省略......

2.1 数据加载

在项目里我写了一个自定义的QingDataset类来加载和处理训练和测试数据。首先,在初始化方法中,我遍历了指定目录下的所有文件名,并将它们拼接到数据集列表中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def __init__(self, root):
    self.dataset = []
    for filename in os.listdir(root):
        self.dataset.append(os.path.join(root, filename))

这样,self.dataset中存储了所有图像文件的路径。

2.2 数据处理

__getitem__方法中,我通过读取图像数据,对其进行归一化处理,并转换为PyTorch张量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def __getitem__(self, index):
    img_path = self.dataset[index]
    img = cv2.imread(img_path)
    img = img / 255
    img = torch.tensor(img).permute(2, 0, 1)
    data_list = img_path.split('.')
    label = int(data_list[1])
    position = [int(i) / 300 for i in data_list[2:6]]
    sort = int(data_list[6]) - 1

    return np.float32(img), np.float32(label), np.float32(position), sort, img_path

这里我将图像进行了归一化处理,并从文件名中提取了标签、位置和排序信息。最后,返回了处理后的图像数据以及相应的标签、位置、排序和图像路径。

三、神经网络模型

网络模型这里的nn.Conv2d(3, 16, 3),ReLU,MaxPool2d里面的参数是我随意填写的,读者不用纠结参数的含义。

3.1 模型结构

net.py中,我定义了神经网络模型QingNet。该模型的结构采用了Sequential容器,通过堆叠卷积层、激活函数以及池化层来提取图像特征:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
self.layers = nn.Sequential(
    nn.Conv2d(3, 16, 3), nn.ReLU(), nn.MaxPool2d(3),
    nn.Conv2d(16, 22, 3), nn.ReLU(), nn.MaxPool2d(2),
    nn.Conv2d(22, 32, 5), nn.ReLU(), nn.MaxPool2d(2),
    nn.Conv2d(32, 64, 5), nn.ReLU(), nn.MaxPool2d(2),
    nn.Conv2d(64, 82, 3), nn.ReLU(),
    nn.Conv2d(82, 128, 3), nn.ReLU(),
    nn.Conv2d(128, 25, 3), nn.ReLU()
)

这些层的输出形成了模型的最后特征图。

3.2 输出信息

模型的最后几个层分别输出了标签、位置、排序和置信度的信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
self.label_layer = nn.Sequential(nn.Conv2d(25, 1, 3), nn.ReLU())
self.position_layers = nn.Sequential(nn.Conv2d(25, 4, 3), nn.ReLU())
self.sort_layers = nn.Sequential(nn.Conv2d(25, 20, 3), nn.ReLU())
self.confidence_layer = nn.Sequential(nn.Conv2d(25, 1, 3), nn.Sigmoid())

这些输出对应了单目标检测任务中所需的各个要素。

四、训练过程

训练的过程其实就是将数据集丢给网络模型,网络模型会返回目标的位置信息,我会那这个结果与数据集的正确结果进行损失计算,并告诉网络模型损失值。

随着不断训练网络模型,网络模型会越来越靠近真实值,每训练一轮我都会把权重文件保存到磁盘中,这样电脑即使重启还可以接着上次的成果接着训练。

4.1 损失计算和反向传播

train.py中,我对每个训练批次进行了循环迭代。对于每个批次,我计算了标签、位置和排序的损失,然后按照一定的权重组合得到了最终的训练损失:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
label_loss = self.label_loss(out_label, label)
position_loss = self.position_loss(out_position, position)
sort_loss = self.sort_loss(out_sort, sort)

train_loss = 0.2 * label_loss + position_loss * 0.6 + 0.2 * sort_loss

这里,我采用了BCEWithLogitsLossMSELossCrossEntropyLoss作为标签、位置和排序的损失函数。

4.2 模型保存

在每一轮训练结束后,我保存了模型的权重,方便后续的预测和部署:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
torch.save(self.net.state_dict(), f'param/{date_time}-{epoch}.pt')

这样,我们就可以在需要时加载训练好的模型进行预测。

五、预测和可视化

当我训练的效果达到满意后,我就可以把训练好的权重文件用于实际生产中了。

5.1 模型加载和预测

predict.py中,我首先加载了训练好的模型权重,并将模型设置为评估模式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
predictor = Predictor('param/' + max(os.listdir('param/')))
predictor.net.eval()

然后,通过predict方法对单张图像进行预测,获取标签、位置、排序和置信度的输出。

5.2 可视化工具

最后,通过tools.py中的view_image方法,我将原始图像与模型预测的标签、位置、排序进行可视化:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tools.view_image(img_path, label, position, sort, out_label, out_position, out_sort)

这一步骤有助于直观地了解模型对于输入图像的处理效果,为进一步调优提供了参考。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-02-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深度学习-AlexNet(第一个深度卷积网络)
AlexNet是第一个深度卷积网络模型,赢得了2012年ImageNet图像分类竞赛的冠军,自98年的LeNet后再次将深度学习研究引热,创造性的提出了很多方法且影响至今,如使用GPU进行训练,使用ReLU 作为非线性激活函数,使用 Dropout 防止过拟合,使用数据增强来提高模型准确率等。
唔仄lo咚锵
2023/01/30
6380
使用深度学习进行疟疾检测 | PyTorch版
蚊子看起来很小,很脆弱,但是是非常危险的。众所周知,疟疾对所有年龄段的人来说都是一种威胁生命的疾病,它通过蚊子传播。更重要的是,在最初的阶段,这些症状很容易被误认为是发烧、流感或普通感冒。但是,在晚期,它可以通过感染和破坏细胞结构造成严重破坏,这可能危及生命。如果不及时治疗,甚至可能导致死亡。
小白学视觉
2020/11/13
8260
使用深度学习进行疟疾检测 | PyTorch版
使用关键点进行小目标检测
【GiantPandaCV导语】本文是笔者出于兴趣搞了一个小的库,主要是用于定位红外小目标。由于其具有尺度很小的特点,所以可以尝试用点的方式代表其位置。本文主要采用了回归和heatmap两种方式来回归关键点,是一个很简单基础的项目,代码量很小,可供新手学习。
BBuf
2020/09/10
9390
【动手学深度学习】卷积神经网络CNN的研究详情
启动jupyter notebook,使用新增的pytorch环境新建ipynb文件,为了检查环境配置是否合理,输入import torch以及torch.cuda.is_available() ,若返回TRUE则说明研究环境配置正确,若返回False但可以正确导入torch则说明pytorch配置成功,但研究运行是在CPU进行的,结果如下:
SarPro
2024/06/06
1800
【动手学深度学习】卷积神经网络CNN的研究详情
深度学习 | 《深度学习入门之PyTorch》阅读笔记
KDD(knowledge discovery in database),从数据中获取有意义的信息
Justlovesmile
2021/12/14
1.5K0
深度学习 | 《深度学习入门之PyTorch》阅读笔记
【机器学习实战】从零开始深度学习(通过GPU服务器进行深度学习)
0.1. 利用GPU加速深度学习   疫情期间没有办法用实验室的电脑来跑模型,用领取的腾讯云实例来弄刚刚好。发现如果没有GPU来跑的话真的是太慢了,非常推荐利用GPU加速深度学习的训练速度。     如果采用GPU的话,训练函数train_model(*)中数据的输入要改变一下,也就是需要将数据放在GPU上
汉堡888
2022/05/03
8.6K0
【机器学习实战】从零开始深度学习(通过GPU服务器进行深度学习)
深度学习:CNN之验证码识别
当想要训练处理图像的深度学习模型时,遇到了大尺寸图像,如果我们直接使用全连接层来无脑叠加,那会造成以下几个问题:
CodeGoat24
2022/04/24
1.5K4
深度学习:CNN之验证码识别
【动手学深度学习】使用块的网络(VGG)的研究详情
启动jupyter notebook,使用新增的pytorch环境新建ipynb文件,为了检查环境配置是否合理,输入import torch以及torch.cuda.is_available() ,若返回TRUE则说明研究环境配置正确,若返回False但可以正确导入torch则说明pytorch配置成功,但研究运行是在CPU进行的,结果如下:
SarPro
2024/06/14
1810
【动手学深度学习】使用块的网络(VGG)的研究详情
昇腾910-PyTorch 实现 Alexnet图像分类
本文主要介绍了如何在昇腾上,使用pytorch对经典的Alexnet小模型在公开的CIFAR10数据集进行分类训练的实战讲解。内容包括Alexnet网络模型创新点介绍 、Alexnet的网络架构剖析 与网络模型代码实战分析等等
永荣带你玩转昇腾
2025/01/23
750
昇腾910-PyTorch 实现 Alexnet图像分类
pyTorch入门(三)——GoogleNet和ResNet训练
这是Minist训练的第三篇了,本篇主要是把GoogleNet和ResNet的模型写出来做一个测试,再就是train.py里面代码加入了图例显示。
Vaccae
2022/12/29
4270
pyTorch入门(三)——GoogleNet和ResNet训练
昇腾910-PyTorch 实现 GoogleNet图像分类
本实验主要介绍了如何在昇腾上,使用pytorch对经典的GoogleNet模型在公开的CIFAR10数据集进行分类训练的实战讲解。内容包括**GoogleNet模型创新点介绍** 、**GoogleNet网络架构剖析** 与**GoogleNet网络模型代码实战分析**等等。
永荣带你玩转昇腾
2025/01/23
750
昇腾910-PyTorch 实现 GoogleNet图像分类
深度学习实战:2.AlexNet实现花图像分类
AlexNet在我之前的博客中已经做过详解,详情见:https://blog.csdn.net/muye_IT/article/details/123602605?spm=1001.2014.3001
AiCharm
2023/05/15
8870
深度学习实战:2.AlexNet实现花图像分类
详解 Pytorch 实现 MNIST[通俗易懂]
项目虽然简单,但是个人建议还是将各个模块分开创建,特别是对于新人而言,模块化的创建会让读者更加清晰、易懂。
全栈程序员站长
2022/07/23
1K0
详解 Pytorch 实现 MNIST[通俗易懂]
CNN实战(二):pytorch搭建CNN对猫狗图片进行分类
在上一篇文章:CNN实战(一):pytorch处理图像数据(Dataset和Dataloader)里,大致介绍了怎么利用pytorch把猫狗图片处理成CNN需要的数据,本篇文章主要用该数据对自己定义的CNN模型进行训练及测试。
Cyril-KI
2022/09/16
2.7K0
CNN实战(二):pytorch搭建CNN对猫狗图片进行分类
要学习的第一个现代CNN:AlexNet
来源:PyTorch研习社本文约1800字,建议阅读5分钟本文为你介绍AlexNet。 从上图可以看到相对于LeNet(左侧),AlexNet(右侧)更深了,也应用了新的技术: AlexNet有5层卷积层(Conv层) 使用Max Pool 使用了ReLU激活函数 AlexNet支持更高分辨率的彩色图像(3x224x224)。 AlexNet是为了基于ImageNet数据集的ISLVRC比赛而设计的。ImageNet是一个计算机视觉系统识别项目,是目前世界上图像识别最大的数据库,它包含了1000个类别的超
数据派THU
2023/05/11
2010
要学习的第一个现代CNN:AlexNet
卷积神经网络——中篇【深度学习】【PyTorch】
全连接层是网络里参数比重最高的地方(参数=输入通道*高*宽*输出通道*高*宽),尤其是卷积后的第一个全连接层。而卷积层参数就小得多。所以用卷积层替代全连接层,参数会更少。
来杯Sherry
2023/08/24
3000
卷积神经网络——中篇【深度学习】【PyTorch】
CNN基础 & CV基本应用
直接上代码,kaiming初始化真的猛。与LeNet相比,这里的主要变化是使用更小的学习速率训练,这是因为网络更深更广、图像分辨率更高,训练卷积神经网络就更昂贵。
Sarlren
2022/10/28
4030
CNN基础 & CV基本应用
PyTorch与深度学习
PyTorch是一个开源的Python机器学习库,基于Torch,用于自然语言处理等应用程序。PyTorch既可以看作加入了GPU支持的numpy,同时也可以看成一个拥有自动求导功能的强大的深度神经网络。除了Facebook外,它已经被Twitter、CMU和Salesforce等机构采用。
正在走向自律
2024/12/18
980
PyTorch与深度学习
【深度学习实验】卷积神经网络(六):自定义卷积神经网络模型(VGG)实现图片多分类任务
卷积神经网络在图像处理方面具有很强的优势,它能够自动学习到具有层次结构的特征表示,并且对平移、缩放和旋转等图像变换具有一定的不变性。这些特点使得卷积神经网络成为图像分类、目标检测、语义分割等任务的首选模型。除了图像处理,卷积神经网络也可以应用于其他领域,如自然语言处理和时间序列分析。通过将文本或时间序列数据转换成二维形式,可以利用卷积神经网络进行相关任务的处理。
Qomolangma
2024/07/30
2250
【深度学习实验】卷积神经网络(六):自定义卷积神经网络模型(VGG)实现图片多分类任务
torch05:CNN--MNIST识别和自己数据集
(2)定义训练数据,加餐部分是使用自己的数据集:(可参考:https://blog.csdn.net/u014365862/article/details/80506147)
MachineLP
2019/05/26
8900
推荐阅读
相关推荐
深度学习-AlexNet(第一个深度卷积网络)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验