探索Market1501——視覺監測領域的重要數據集

一、介紹Market1501

Market1501是一個用於人類重識別領域的數據集,由清華大學研究員李康等人在2015年發佈。其由1501個行人的12936張圖像組成,採集自天津市的市中心地區。每個行人都有至少2張圖像,圖像的攝像頭視角和姿態也是多樣的。Market1501提供了一個廣泛的訓練和測試的基礎,可以用於開發和評估各種人類重識別算法。

Market1501數據集除了提供標註的圖像數據外,還提供了行人身份、行人出現的日期和攝像頭信息等元數據。這對於研究員和開發者來說是十分有用的,因為他們可以使用這些元數據來構建算法,幫助解決多攝像頭和多日期的人類重識別問題。

下面是獲取Market1501數據集的代碼:

import os 
from torchvision.datasets.utils import download_url
from torchvision.datasets import VisionDataset
import pandas as pd
from PIL import Image 

class Market1501(VisionDataset):
    def __init__(self, root, transform=None, target_transform=None):
        
        super(Market1501, self).__init__(root, transform=transform,
                                         target_transform=target_transform)
        
        self.root = root
        self.img_folder_path = os.path.join(self.root, 'Market-1501', 'bounding_box_train')
        self.img_names = sorted(os.listdir(self.img_folder_path))
        self.targets = [int((img_name.split('_')[0])) for img_name in self.img_names]
        
    def __getitem__(self, index):
        
        img_name = self.img_names[index]
        img_path = os.path.join(self.img_folder_path, img_name)
        img = Image.open(img_path).convert('RGB')
        
        if self.transform is not None:
            img = self.transform(img)

        target = self.targets[index]

        if self.target_transform is not None:
            target = self.target_transform(target)

        return img, target

    def __len__(self):
        return len(self.img_names)

二、Market1501的挑戰性問題

Market1501數據集被廣泛應用於人類重識別領域,因為其中包含了多種挑戰性問題。

1.視角變化問題

由於監測攝像頭的位置和姿態是隨機的,因此行人的外觀和姿勢會隨着視角的變化而發生明顯的變化。同一個行人在不同的攝像頭下可能具有不同的行為和外觀,這是人類重識別所需要突破的問題之一。

2.遮擋問題

由於人群密集或者周圍環境等原因,行人可能會被其他物體或者人擋住。這會導致行人的可見程度降低,從而增加了人類重識別的複雜度。

3.光照變化問題

由於不同的攝像頭可能在不同的時間和地點下拍攝,因此圖像的光照情況也會有所不同,這會導致行人的外觀發生明顯的變化。這也是一個需要解決的問題。

三、Market1501以及人類重識別領域的研究趨勢

Market1501數據集和人類重識別領域的研究目前已經發展到非常成熟的階段。目前,研究者們已經提出了各種各樣的特徵提取和降維方法,比如基於卷積神經網絡的深度學習方法,以及在特徵層面或者空間層面進行注意力聚焦的注意力機制方法。

下面是一個使用ResNet50和注意力機制的人類重識別模型的示例。具體來說,該模型使用ResNet50作為特徵提取器,然後使用自適應空間注意力層來聚焦於行人圖像中的關鍵區域:

import torch.nn as nn
import torch.utils.model_zoo as model_zoo
import torch.nn.functional as F

__all__ = ['ResNet50_IBN_a', 'resnet50_ibn_a', 'init_pretrained_weights']

model_urls = {
    'resnet50_ibn_a': 'https://github.com/XingangPan/IBN-Net/releases/download/v1.0/resnet50_ibn_a-3c6afb43.pth',
}

class AdaAvgPool2d(nn.Module):
    def __init__(self):
        super(AdaAvgPool2d, self).__init__()

    def forward(self, x):
        return F.adaptive_avg_pool2d(x, 1).view(x.size(0), -1)

class Adaptive(nn.Module):
    def __init__(self, in_channels=2048, reduction_ratio=16):
        super(Adaptive, self).__init__()
        self.in_channels = in_channels
        self.reduction_ratio = reduction_ratio
        self.layers = nn.Sequential(
            nn.Conv2d(self.in_channels, self.in_channels // self.reduction_ratio, kernel_size=1, stride=1, padding=0),
            nn.ReLU(),
            nn.Conv2d(self.in_channels // self.reduction_ratio, self.in_channels, kernel_size=1, stride=1, padding=0),
            nn.Sigmoid()
        )

    def forward(self, x):
        y = F.avg_pool2d(x, kernel_size=x.size()[2:])
        y = self.layers(y)
        return x * y

class ResNet_IBN_a(nn.Module):
    def __init__(self, last_stride=2):
        self.inplanes = 64
        super(ResNet_IBN_a, self).__init__()

        self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3, bias=False)
        self.bn1 = nn.BatchNorm2d(64)
        self.relu = nn.ReLU(inplace=True)
        self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)

        self.layer1 = self._make_layer(block=Bottleneck_IBN_A, planes=64, blocks=3, stride=1, norm_layer=nn.BatchNorm2d)
        self.layer2 = self._make_layer(block=Bottleneck_IBN_A, planes=128, blocks=4, stride=2, norm_layer=nn.BatchNorm2d)
        self.layer3 = self._make_layer(block=Bottleneck_IBN_A, planes=256, blocks=6, stride=2, norm_layer=nn.BatchNorm2d)
        self.layer4 = self._make_layer(block=Bottleneck_IBN_A, planes=512, blocks=3, stride=last_stride, norm_layer=nn.BatchNorm2d)
        self.global_avgpool = AdaAvgPool2d()
        self.reid = nn.Sequential(
            nn.Linear(self.inplanes, 256),
            nn.BatchNorm1d(256),
            nn.ReLU(),
            nn.Linear(256, 256),
            nn.BatchNorm1d(256)
        )
        self.classifier = nn.Linear(256, 751)
        self.adaptive = Adaptive()

    def _make_layer(self, block, planes, blocks, stride=1, norm_layer=None):
        if norm_layer is None:
            norm_layer = nn.BatchNorm2d
        downsample = None
        if stride != 1 or self.inplanes != planes * block.expansion:
            downsample = nn.Sequential(
                conv1x1(self.inplanes, planes * block.expansion, stride),
                nn.BatchNorm2d(planes * block.expansion),
            )

        layers = []
        layers.append(block(self.inplanes, planes, stride, downsample, norm_layer))
        self.inplanes = planes * block.expansion
        for _ in range(1, blocks):
            layers.append(block(self.inplanes, planes, norm_layer=norm_layer))

        return nn.Sequential(*layers)

    def forward(self, x):
        x = self.conv1(x)
        x = self.bn1(x)
        x = self.relu(x)
        x = self.maxpool(x)
        x = self.layer1(x)
        x = self.layer2(x)
        x = self.layer3(x)
        x = self.layer4(x)
        x = self.adaptive(x)
        x = self.global_avgpool(x)
        x = self.reid(x)
        x = self.classifier(x)
        return x

def init_pretrained_weights(model, key=''):
    pretrain_dict = model_zoo.load_url(model_urls[key])
    model_dict = {}

    state_dict = model.state_dict()
    for k, v in pretrain_dict.items():
        if k in state_dict and state_dict[k].shape == v.shape:
            model_dict[k] = v
    state_dict.update(model_dict)
    model.load_state_dict(state_dict)

def resnet50_ibn_a(**kwargs):
    model = ResNet_IBN_a(**kwargs)
    init_pretrained_weights(model, 'resnet50_ibn_a')
    return model

四、Market1501的開發者社區

在人類重識別領域,Market1501已經成為了一個十分重要的數據集。因此,市面上湧現了很多以Market1501為基礎的算法和研究方向。同時,由於其開源的特性,很多開源社區也湧現出來,提供各種各樣的解決方案和創新性的想法。

下面是一個專門針對人類重識別領域的開源社區,該社區提供從數據預處理到算法實現等各個方面的支持:

https://github.com/michuanhaohao/reid-strong-baseline

五、總結

本文詳細介紹了人類重識別領域的重要數據集Market1501。通過對Market1501的介紹,我們了解了其提供的重要元數據以及其中包含的挑戰性問題。同時,我們還介紹了當前人類重識別領域中的研究趨勢和開發者社區,以及一個使用ResNet50和注意力機制的人類重識別模型實現示例。

原創文章,作者:VZRXM,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/372492.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
VZRXM的頭像VZRXM
上一篇 2025-04-24 06:40
下一篇 2025-04-24 06:40

相關推薦

  • Python讀取CSV數據畫散點圖

    本文將從以下方面詳細闡述Python讀取CSV文件並畫出散點圖的方法: 一、CSV文件介紹 CSV(Comma-Separated Values)即逗號分隔值,是一種存儲表格數據的…

    編程 2025-04-29
  • Python中讀入csv文件數據的方法用法介紹

    csv是一種常見的數據格式,通常用於存儲小型數據集。Python作為一種廣泛流行的編程語言,內置了許多操作csv文件的庫。本文將從多個方面詳細介紹Python讀入csv文件的方法。…

    編程 2025-04-29
  • 如何用Python統計列表中各數據的方差和標準差

    本文將從多個方面闡述如何使用Python統計列表中各數據的方差和標準差, 並給出詳細的代碼示例。 一、什麼是方差和標準差 方差是衡量數據變異程度的統計指標,它是每個數據值和該數據值…

    編程 2025-04-29
  • Python多線程讀取數據

    本文將詳細介紹多線程讀取數據在Python中的實現方法以及相關知識點。 一、線程和多線程 線程是操作系統調度的最小單位。單線程程序只有一個線程,按照程序從上到下的順序逐行執行。而多…

    編程 2025-04-29
  • Python兩張表數據匹配

    本篇文章將詳細闡述如何使用Python將兩張表格中的數據匹配。以下是具體的解決方法。 一、數據匹配的概念 在生活和工作中,我們常常需要對多組數據進行比對和匹配。在數據量較小的情況下…

    編程 2025-04-29
  • Python爬取公交數據

    本文將從以下幾個方面詳細闡述python爬取公交數據的方法: 一、準備工作 1、安裝相關庫 import requests from bs4 import BeautifulSou…

    編程 2025-04-29
  • Python數據標準差標準化

    本文將為大家詳細講述Python中的數據標準差標準化,以及涉及到的相關知識。 一、什麼是數據標準差標準化 數據標準差標準化是數據處理中的一種方法,通過對數據進行標準差標準化可以將不…

    編程 2025-04-29
  • 如何使用Python讀取CSV數據

    在數據分析、數據挖掘和機器學習等領域,CSV文件是一種非常常見的文件格式。Python作為一種廣泛使用的編程語言,也提供了方便易用的CSV讀取庫。本文將介紹如何使用Python讀取…

    編程 2025-04-29
  • Python根據表格數據生成折線圖

    本文將介紹如何使用Python根據表格數據生成折線圖。折線圖是一種常見的數據可視化圖表形式,可以用來展示數據的趨勢和變化。Python是一種流行的編程語言,其強大的數據分析和可視化…

    編程 2025-04-29
  • Python如何打亂數據集

    本文將從多個方面詳細闡述Python打亂數據集的方法。 一、shuffle函數原理 shuffle函數是Python中的一個內置函數,主要作用是將一個可迭代對象的元素隨機排序。 在…

    編程 2025-04-29

發表回復

登錄後才能評論