利用pytorch框架设计基于DPN模型的图像检测与分类输出坐标、大小和种类的完整程序,并给出相应训练代码和测试代码

时间: 2023-06-10 17:07:38 浏览: 61
这里提供一个基于DPN模型的图像分类与检测的完整程序,包括训练和测试代码。这个程序使用的是PyTorch框架。 首先,我们需要安装PyTorch和其他必要的Python库。可以使用以下命令来安装: ``` pip install torch torchvision opencv-python ``` 接下来,我们需要准备数据集。这里我们使用COCO数据集进行训练和测试。可以从COCO官网下载数据集。 接下来,我们需要定义模型。这里我们使用DPN模型,并在其基础上添加一个检测头,以输出坐标、大小和种类等信息。以下是模型的代码: ```python import torch.nn as nn import torch.nn.functional as F import math class DPN(nn.Module): def __init__(self, num_classes=1000, seg=False, dpn_type='dpn92', small_inputs=False, num_init_features=64, k_r=96, groups=32, b=True, c=None, k_sec=(3, 4, 20, 3), inc_sec=(16, 32, 24, 128), test_time_pool=False): super(DPN, self).__init__() self.test_time_pool = test_time_pool blocks = OrderedDict() if dpn_type == 'dpn68': blocks['conv1_1'] = nn.Conv2d(3, num_init_features, kernel_size=3, stride=1, padding=1, bias=False) blocks['bn1_1'] = nn.BatchNorm2d(num_init_features) blocks['conv1_2'] = nn.Conv2d(num_init_features, num_init_features, kernel_size=3, stride=1, padding=1, bias=False) blocks['bn1_2'] = nn.BatchNorm2d(num_init_features) blocks['conv1_3'] = nn.Conv2d(num_init_features, num_init_features*2, kernel_size=3, stride=2, padding=1, bias=False) blocks['bn1_3'] = nn.BatchNorm2d(num_init_features*2) blocks['conv2_1'] = DualPathBlock(num_init_features*2, k_r, groups, b, c, 1, inc_sec[0], 'proj', True, 0.2) for i in range(k_sec[0]): blocks['conv2_{}'.format(i+2)] = DualPathBlock(inc_sec[0], k_r, groups, b, c, 1, inc_sec[0], 'normal', False, 0.2) blocks['conv3_1'] = DualPathBlock(inc_sec[0], k_r, groups, b, c, 2, inc_sec[1], 'down', True, 0.2) for i in range(k_sec[1]): blocks['conv3_{}'.format(i+2)] = DualPathBlock(inc_sec[1], k_r, groups, b, c, 1, inc_sec[1], 'normal', False, 0.2) blocks['conv4_1'] = DualPathBlock(inc_sec[1], k_r, groups, b, c, 2, inc_sec[2], 'down', True, 0.2) for i in range(k_sec[2]): blocks['conv4_{}'.format(i+2)] = DualPathBlock(inc_sec[2], k_r, groups, b, c, 1, inc_sec[2], 'normal', False, 0.2) blocks['conv5_1'] = DualPathBlock(inc_sec[2], k_r, groups, b, c, 2, inc_sec[3], 'down', True, 0.2) for i in range(k_sec[3]): blocks['conv5_{}'.format(i+2)] = DualPathBlock(inc_sec[3], k_r, groups, b, c, 1, inc_sec[3], 'normal', False, 0.2) blocks['bn5'] = nn.BatchNorm2d(inc_sec[3]+inc_sec[2]) blocks['relu5'] = nn.ReLU(inplace=True) if small_inputs: blocks['pool5'] = nn.AvgPool2d(kernel_size=7, stride=1, padding=0) else: blocks['pool5'] = nn.AvgPool2d(kernel_size=7, stride=2, padding=0) self.features = nn.Sequential(blocks) self.last_linear = nn.Linear(inc_sec[3]+inc_sec[2], num_classes) elif dpn_type == 'dpn92': blocks['conv1_1'] = nn.Conv2d(3, num_init_features, kernel_size=7, stride=2, padding=3, bias=False) blocks['bn1_1'] = nn.BatchNorm2d(num_init_features) blocks['relu1_1'] = nn.ReLU(inplace=True) blocks['pool1'] = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) blocks['conv2_1'] = DualPathBlock(num_init_features, k_r, groups, b, c, 1, inc_sec[0], 'proj', True, 0.0) for i in range(k_sec[0]): blocks['conv2_{}'.format(i+2)] = DualPathBlock(inc_sec[0], k_r, groups, b, c, 1, inc_sec[0], 'normal', False, 0.0) blocks['conv3_1'] = DualPathBlock(inc_sec[0], k_r, groups, b, c, 2, inc_sec[1], 'down', True, 0.0) for i in range(k_sec[1]): blocks['conv3_{}'.format(i+2)] = DualPathBlock(inc_sec[1], k_r, groups, b, c, 1, inc_sec[1], 'normal', False, 0.0) blocks['conv4_1'] = DualPathBlock(inc_sec[1], k_r, groups, b, c, 2, inc_sec[2], 'down', True, 0.0) for i in range(k_sec[2]): blocks['conv4_{}'.format(i+2)] = DualPathBlock(inc_sec[2], k_r, groups, b, c, 1, inc_sec[2], 'normal', False, 0.0) blocks['conv5_1'] = DualPathBlock(inc_sec[2], k_r, groups, b, c, 2, inc_sec[3], 'down', True, 0.0) for i in range(k_sec[3]): blocks['conv5_{}'.format(i+2)] = DualPathBlock(inc_sec[3], k_r, groups, b, c, 1, inc_sec[3], 'normal', False, 0.0) blocks['bn5'] = nn.BatchNorm2d(inc_sec[3]+inc_sec[2]) blocks['relu5'] = nn.ReLU(inplace=True) blocks['pool5'] = nn.AvgPool2d(kernel_size=7, stride=1, padding=0) self.features = nn.Sequential(blocks) self.last_linear = nn.Linear(inc_sec[3]+inc_sec[2], num_classes) else: raise ValueError('Unsupported DPNet version with number of layers {}'.format(dpn_type)) self.seg = seg if seg: self.final_conv = nn.Conv2d(inc_sec[3]+inc_sec[2], num_classes, kernel_size=1, stride=1, padding=0, bias=True) self.linear_up = nn.ConvTranspose2d(num_classes, num_classes, kernel_size=32, stride=16, padding=8, output_padding=0, groups=num_classes, bias=False) else: self.final_conv = nn.Conv2d(inc_sec[3]+inc_sec[2], 4, kernel_size=1, stride=1, padding=0, bias=True) def forward(self, x): x = self.features(x) if self.test_time_pool: x = F.avg_pool2d(x, kernel_size=x.size()[2:]) else: x = self.pool(x) if self.seg: x = self.final_conv(x) x = self.linear_up(x) return x else: x = self.final_conv(x) x = x.permute(0,2,3,1) return x ``` 其中,`DPN`类定义了DPN模型,包括DPN-68和DPN-92两个版本。`DualPathBlock`类是DPN的基本模块。`num_classes`指定分类的类别数;`seg`指定是否进行语义分割;`dpn_type`指定DPN模型的版本;`small_inputs`指定输入图像的大小;`num_init_features`指定初始卷积层输出的通道数;`k_r`和`groups`指定DualPathBlock中的参数;`b`和`c`指定是否使用bottleneck和是否使用SE模块;`k_sec`和`inc_sec`指定每个阶段的参数;`test_time_pool`指定是否在测试时使用平均池化。`forward`方法定义了前向传播过程。 接下来,我们需要定义训练和测试代码。以下是训练代码: ```python import torch import torch.nn as nn import torch.optim as optim import torchvision.transforms as transforms import torchvision.datasets as datasets import numpy as np import argparse import os from dpn import DPN def train(train_loader, model, criterion, optimizer, epoch): model.train() running_loss = 0.0 for batch_idx, (data, target) in enumerate(train_loader): data, target = data.cuda(), target.cuda() optimizer.zero_grad() output = model(data) loss = criterion(output, target) loss.backward() optimizer.step() running_loss += loss.item() if batch_idx % 100 == 0: print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format( epoch, batch_idx * len(data), len(train_loader.dataset), 100. * batch_idx / len(train_loader), running_loss / 100)) running_loss = 0.0 def test(test_loader, model, criterion): model.eval() test_loss = 0.0 correct = 0 with torch.no_grad(): for data, target in test_loader: data, target = data.cuda(), target.cuda() output = model(data) test_loss += criterion(output, target).item() pred = output.argmax(dim=1, keepdim=True) # get the index of the max log-probability correct += pred.eq(target.view_as(pred)).sum().item() test_loss /= len(test_loader.dataset) print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format( test_loss, correct, len(test_loader.dataset), 100. * correct / len(test_loader.dataset))) def main(): parser = argparse.ArgumentParser(description='DPN Example') parser.add_argument('--batch-size', type=int, default=64, metavar='N', help='input batch size for training (default: 64)') parser.add_argument('--test-batch-size', type=int, default=1000, metavar='N', help='input batch size for testing (default: 1000)') parser.add_argument('--epochs', type=int, default=10, metavar='N', help='number of epochs to train (default: 10)') parser.add_argument('--lr', type=float, default=0.001, metavar='LR', help='learning rate (default: 0.001)') parser.add_argument('--momentum', type=float, default=0.9, metavar='M', help='SGD momentum (default: 0.9)') parser.add_argument('--no-cuda', action='store_true', default=False, help='disables CUDA training') parser.add_argument('--seed', type=int, default=1, metavar='S', help='random seed (default: 1)') parser.add_argument('--log-interval', type=int, default=10, metavar='N', help='how many batches to wait before logging training status') parser.add_argument('--save-model', action='store_true', default=False, help='For Saving the current Model') args = parser.parse_args() use_cuda = not args.no_cuda and torch.cuda.is_available() torch.manual_seed(args.seed) device = torch.device("cuda" if use_cuda else "cpu") train_dataset = datasets.CocoDetection(root='path/to/coco', annFile='path/to/annotations', transform=transforms.ToTensor()) train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=args.batch_size, shuffle=True) test_dataset = datasets.CocoDetection(root='path/to/coco', annFile='path/to/annotations', transform=transforms.ToTensor()) test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=args.test_batch_size, shuffle=True) model = DPN(num_classes=81).to(device) optimizer = optim.SGD(model.parameters(), lr=args.lr, momentum=args.momentum) criterion = nn.CrossEntropyLoss() for epoch in range(1, args.epochs + 1): train(train_loader, model, criterion, optimizer, epoch) test(test_loader, model, criterion) if args.save_model: torch.save(model.state_dict(), "dpn_coco.pt") if __name__ == '__main__': main() ``` 其中,`train`和`test`函数分别用于训练和测试。`main`函数定义了训练过程,包括数据准备、模型定义、优化器和损失函数定义,以及训练和测试循环。 最后,以下是测试代码: ```python import torch import torchvision.transforms as transforms import torchvision.datasets as datasets import numpy as np import argparse import os from dpn import DPN def test(test_loader, model): model.eval() with torch.no_grad(): for data, target in test_loader: data = data.cuda() output = model(data) print(output) def main(): parser = argparse.ArgumentParser(description='DPN Example') parser.add_argument('--test-batch-size', type=int, default=1, metavar='N', help='input batch size for testing (default: 1)') parser.add_argument('--no-cuda', action='store_true', default=False, help='disables CUDA training') parser.add_argument('--seed', type=int, default=1, metavar='S', help='random seed (default: 1)') args = parser.parse_args() use_cuda = not args.no_cuda and torch.cuda.is_available() torch.manual_seed(args.seed) device = torch.device("cuda" if use_cuda else "cpu") test_dataset = datasets.CocoDetection(root='path/to/coco', annFile='path/to/annotations', transform=transforms.ToTensor()) test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=args.test_batch_size, shuffle=False) model = DPN(num_classes=81).to(device) model.load_state_dict(torch.load("dpn_coco.pt")) test(test_loader, model) if __name__ == '__main__': main() ``` 其中,`test`函数用于测试模型。`main`函数定义了测试过程,包括数据准备、模型定义和测试循环。

相关推荐

import torch import torch.nn as nn import torch.nn.functional as F from torch.autograd import Variable class Bottleneck(nn.Module): def init(self, last_planes, in_planes, out_planes, dense_depth, stride, first_layer): super(Bottleneck, self).init() self.out_planes = out_planes self.dense_depth = dense_depth self.conv1 = nn.Conv2d(last_planes, in_planes, kernel_size=1, bias=False) self.bn1 = nn.BatchNorm2d(in_planes) self.conv2 = nn.Conv2d(in_planes, in_planes, kernel_size=3, stride=stride, padding=1, groups=32, bias=False) self.bn2 = nn.BatchNorm2d(in_planes) self.conv3 = nn.Conv2d(in_planes, out_planes+dense_depth, kernel_size=1, bias=False) self.bn3 = nn.BatchNorm2d(out_planes+dense_depth) self.shortcut = nn.Sequential() if first_layer: self.shortcut = nn.Sequential( nn.Conv2d(last_planes, out_planes+dense_depth, kernel_size=1, stride=stride, bias=False), nn.BatchNorm2d(out_planes+dense_depth) ) def forward(self, x): out = F.relu(self.bn1(self.conv1(x))) out = F.relu(self.bn2(self.conv2(out))) out = self.bn3(self.conv3(out)) x = self.shortcut(x) d = self.out_planes out = torch.cat([x[:,:d,:,:]+out[:,:d,:,:], x[:,d:,:,:], out[:,d:,:,:]], 1) out = F.relu(out) return out class DPN(nn.Module): def init(self, cfg): super(DPN, self).init() in_planes, out_planes = cfg['in_planes'], cfg['out_planes'] num_blocks, dense_depth = cfg['num_blocks'], cfg['dense_depth'] self.conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1, bias=False) self.bn1 = nn.BatchNorm2d(64) self.last_planes = 64 self.layer1 = self._make_layer(in_planes[0], out_planes[0], num_blocks[0], dense_depth[0], stride=1) self.layer2 = self._make_layer(in_planes[1], out_planes[1], num_blocks[1], dense_depth[1], stride=2) self.layer3 = self._make_layer(in_planes[2], out_planes[2], num_blocks[2], dense_depth[2], stride=2) self.layer4 = self._make_layer(in_planes[3], out_planes[3], num_blocks[3], dense_depth[3], stride=2) self.linear = nn.Linear(out_planes[3]+(num_blocks[3]+1)dense_depth[3], 10) def _make_layer(self, in_planes, out_planes, num_blocks, dense_depth, stride): strides = [stride] + 1 layers = [] for i,stride in (strides): layers.append(Bottleneck(self.last_planes, in_planes, out_planes, dense_depth, stride, i==0)) self.last_planes = out_planes + (i+2) * dense_depth return nn.Sequential(*layers) def forward(self, x): out = F.relu(self.bn1(self.conv1(x))) out = self.layer1(out) out = self.layer2(out) out = self.layer3(out) out = self.layer4(out) out = F.avg_pool2d(out, 4) out = out.view(out.size(0), -1) out = self.linear(out) return out def DPN92(): cfg = { 'in_planes': (96,192,384,768), 'out_planes': (256,512,1024,2048), 'num_blocks': (3,4,20,3), 'dense_depth': (16,32,24,128) } return DPN(cfg)基于这个程序利用pytorch框架修改成对摄像头采集的图像检测与分类输出坐标、大小和种类

最新推荐

recommend-type

使用PyTorch训练一个图像分类器实例

今天小编就为大家分享一篇使用PyTorch训练一个图像分类器实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

PyTorch上搭建简单神经网络实现回归和分类的示例

本篇文章主要介绍了PyTorch上搭建简单神经网络实现回归和分类的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
recommend-type

Pytorch加载部分预训练模型的参数实例

今天小编就为大家分享一篇Pytorch加载部分预训练模型的参数实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

Pytorch 使用CNN图像分类的实现

在4*4的图片中,比较外围黑色像素点和内圈黑色像素点个数的大小将图片分类 如上图图片外围黑色像素点5个大于内圈黑色像素点1个分为0类反之1类 想法 通过numpy、PIL构造4*4的图像数据集 构造自己的数据集类 读取...
recommend-type

使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)

本文介绍了如何在pytorch下搭建AlexNet,使用了两种方法,一种是直接加载预训练模型,并根据自己的需要微调(将最后一层全连接层输出由1000改为10),另一种是手动搭建。 构建模型类的时候需要继承自torch.nn.Module...
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

机器学习怎么将excel转为csv文件

机器学习是一种利用计算机算法和统计数据的方法来训练计算机来进行自动学习的科学,无法直接将excel文件转为csv文件。但是可以使用Python编程语言来读取Excel文件内容并将其保存为CSV文件。您可以使用Pandas库来读取Excel文件,并使用to_csv()函数将其保存为CSV格式。以下是代码示例: ```python import pandas as pd # 读取 Excel 文件 excel_data = pd.read_excel('example.xlsx') # 将数据保存为 CSV 文件 excel_data.to_csv('example.csv', index=
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。