基于多示例卷积的行人重识别

1.引言

虽然已有的基于CNN的重识别的研究可以被扩展到多帧应用中,但是这些研究一般为对一个探针或候选行人随机选择一张图片作为已知数据,求得相似度分数,然后重复随机的操作,遍历每个行人,最后将相似度分数进行平均。这实际上是种基于单帧的操作,因为相同身份的图像数据之间是相互独立地处理,多帧条件下的“相同身份”这个关键信息并没有用上。因此,对于如何利用多帧图片的互信息,克服身份模糊问题,提出了基于多示例卷积神经网的重识别方法。

2 多示例学习

2.1 概念和数学表示
在多示例学习框架中,数据由包构成,且只有包具有标签信息,而包中的示例没有标签信息。这种设定与监督学习和非监督学习不同,监督学习具有示例级标签,非监督学习没有任何标签信息,而多示例学习可以看做具有部分标记信息,所以多示例学习属于半监督学习的范畴。
2.2 多示例学习算法
2.2.1 示例级空间算法
在此类算法中,判别性信息存在于示例级。因此判别学习的一般过程为:首先,训练一个可以将正包中的示例与负包中的示例区分开的判别式示例级分类器f(x)。在训练时,给定一个新的包X,将所有示例级分数f(x),x∈X聚合在一起形成包级分类器这类范例是基于局部的示例级信息,只考虑单个示例的特性而不考虑整个包的特性。
2.2.2 包级空间算法
在包级空间范例中,认为判别信息存在于包级中。在此范例中,包X作为整体来对待,训练算法的目的是将整个包进行区分。所以,会得到一个判别式包级分类器,此分类器利用来自包X的整体信息来对X的类别做一个判别式决策。可以看出,这类范例是基于全局的包级信息,而不是将局部示例级决策进行整合。
2.2.3 嵌入空间算法
在嵌入空间范例中,每一个包X都被映射为一个包含全包X相关信息的特征向量。所以,原始的包空间映射为一个向量级的嵌入空间,在嵌入空间学习判别式分类器。这种方法巧妙地将原始的多示例分类问题转换为一个标准的监督学习问题,其中每一个特征向都有一个相关标签,任何标准的分类器都可以用来做分类。

3 多示例Siamese卷积神经网

多示例卷积神经网的网络结构图如图3.1所示。首先,探针图片和候选图片以包级的形式输入网络,并将每张图片从上到下分成3块64x64的重叠的块,然后将包级的块按照匹配对的方式输入Siamese CNN网络,最后进入两种MICNN框架:嵌入空间MICNN框架和包级空间MICNN。
                                  图3.8
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,由于行人属性识别是一个较为复杂的任务,单单训练5张片很难得到一个准确的模型。因此,我无法提供训练5张片的代码。 不过,我可以提供一般性的训练代码供您参考,您可以根据您的实际情况进行修改和调整。以下是使用PyTorch框架实现的一个行人属性识别模型的训练代码示例: ``` python import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from torchvision import transforms, datasets # 定义数据预处理方法 transforms_train = transforms.Compose([ transforms.Resize((224, 224)), # 调整像大小为224x224 transforms.RandomHorizontalFlip(), # 随机水平翻转 transforms.ToTensor(), # 转换为张量 transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5]) # 数据归一化 ]) # 加载数据集 train_set = datasets.ImageFolder('path/to/train/folder', transform=transforms_train) train_loader = DataLoader(train_set, batch_size=32, shuffle=True) # 定义模型 class PedestrianAttributeClassifier(nn.Module): def __init__(self): super().__init__() self.conv1 = nn.Conv2d(3, 64, 3, padding=1) self.bn1 = nn.BatchNorm2d(64) self.relu1 = nn.ReLU(inplace=True) self.pool1 = nn.MaxPool2d(2, stride=2) self.conv2 = nn.Conv2d(64, 128, 3, padding=1) self.bn2 = nn.BatchNorm2d(128) self.relu2 = nn.ReLU(inplace=True) self.pool2 = nn.MaxPool2d(2, stride=2) self.conv3 = nn.Conv2d(128, 256, 3, padding=1) self.bn3 = nn.BatchNorm2d(256) self.relu3 = nn.ReLU(inplace=True) self.pool3 = nn.MaxPool2d(2, stride=2) self.fc1 = nn.Linear(256 * 28 * 28, 1024) self.bn4 = nn.BatchNorm1d(1024) self.relu4 = nn.ReLU(inplace=True) self.fc2 = nn.Linear(1024, 8) def forward(self, x): x = self.conv1(x) x = self.bn1(x) x = self.relu1(x) x = self.pool1(x) x = self.conv2(x) x = self.bn2(x) x = self.relu2(x) x = self.pool2(x) x = self.conv3(x) x = self.bn3(x) x = self.relu3(x) x = self.pool3(x) x = x.view(-1, 256 * 28 * 28) x = self.fc1(x) x = self.bn4(x) x = self.relu4(x) x = self.fc2(x) return x # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) # 训练模型 for epoch in range(10): running_loss = 0.0 for i, (inputs, labels) in enumerate(train_loader): optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() print('Epoch %d loss: %.3f' % (epoch + 1, running_loss / len(train_loader))) # 保存模型 torch.save(model.state_dict(), 'path/to/save/model') ``` 这段代码中,我们使用了一个卷积神经网络来进行行人属性识别任务。我们使用了一个包含3个卷积层和2个全连接层的简单模型,可以根据实际情况进行调整。我们使用交叉熵作为损失函数,Adam优化器来进行参数优化。在训练过程中,我们将数据集分成了大小为32的批次进行训练,一共训练了10个epoch。最后,我们将训练好的模型保存到了本地文件中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值