在这里插入图片描述
在这里插入图片描述
MIT Place Pulse 2.0 是一个大型的城市街景感知数据集,旨在研究人们如何通过视觉感知来评估城市的街道环境。该数据集收集了全球50多个地区的11万张街景图片,并通过众包平台让参与者对这些图片在六个不同的感知维度上进行评分。这些感知维度包括:

美丽(Beauty):这条街看起来有多美?
安全(Safety):在这条街上走动感觉有多安全?
繁华(Liveliness):这条街看起来有多繁华?
富裕(Wealth):这条街看起来有多富裕?
独特性(Unique):这条街看起来有多独特?
无聊(Boring):这条街看起来有多无聊?
数据集结构在这里插入图片描述

  1. 图片
    数量:11万张街景图片。
    来源:全球50多个地区。
    格式:JPEG。
  2. 标签
    感知评分:每个图片在上述六个感知维度上的评分。
    格式:CSV文件,包含图片路径和对应的感知评分。
    数据集下载
    你可以从 MIT Place Pulse 2.0 的官方网站或 GitHub 仓库下载数据集。以下是下载链接:

官方网站:MIT Place Pulse 2.0
GitHub 仓库:PlacePulse
数据集文件结构
下载后的数据集通常会有一个类似如下的目录结构:

深色版本
PlacePulse2.0/
├── images/
│ ├── 000001.jpg
│ ├── 000002.jpg
│ └── …
├── labels/
│ ├── beauty.csv
│ ├── safety.csv
│ ├── liveliness.csv
│ ├── wealth.csv
│ ├── unique.csv
│ └── boring.csv
└── README.md
CSV 文件格式
每个感知维度的标签文件(如 beauty.csv)通常包含以下列:在这里插入图片描述

image_path:图片的相对路径。
score:该图片在特定感知维度上的评分。
例如,beauty.csv 可能如下所示:

深色版本
image_path,score
images/000001.jpg,4.5
images/000002.jpg,3.2

数据预处理
在使用数据集之前,通常需要进行一些预处理步骤,以便于后续的模型训练和评估。以下是一个简单的预处理示例:

python
深色版本
import pandas as pd
import os
from PIL import Image
import torch
from torch.utils.data import Dataset, DataLoader
from torchvision import transforms

读取标签文件

def load_labels(file_path):
return pd.read_csv(file_path)

自定义数据集类

class StreetViewDataset(Dataset):
def init(self, csv_file, root_dir, transform=None):
self.labels = load_labels(csv_file)
self.root_dir = root_dir
self.transform = transform

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

def __getitem__(self, idx):
    img_name = os.path.join(self.root_dir, self.labels.iloc[idx, 0])
    image = Image.open(img_name).convert('RGB')
    score = self.labels.iloc[idx, 1]
    
    if self.transform:
        image = self.transform(image)
    
    return image, score

数据变换

transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

创建数据集实例

root_dir = ‘PlacePulse2.0/images/’
csv_file = ‘PlacePulse2.0/labels/beauty.csv’
dataset = StreetViewDataset(csv_file, root_dir, transform=transform)

创建数据加载器

dataloader = DataLoader(dataset, batch_size=32, shuffle=True, num_workers=4)

检查数据

for images, scores in dataloader:
print(images.shape, scores.shape)
break
训练模型
你可以使用上述数据集和数据加载器来训练一个深度学习模型,例如使用ResNet进行回归任务。以下是一个简单的训练示例:

python
深色版本
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision.models import resnet50

定义模型

model = resnet50(pretrained=True)
model.fc = nn.Linear(model.fc.in_features, 1) # 修改最后一层为回归输出

将模型移到GPU

device = torch.device(“cuda” if torch.cuda.is_available() else “cpu”)
model.to(device)

定义损失函数和优化器

criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

训练模型

num_epochs = 10
for epoch in range(num_epochs):
model.train()
running_loss = 0.0
for images, scores in dataloader:
images, scores = images.to(device), scores.to(device).float().unsqueeze(1)

    optimizer.zero_grad()
    outputs = model(images)
    loss = criterion(outputs, scores)
    loss.backward()
    optimizer.step()
    
    running_loss += loss.item() * images.size(0)

epoch_loss = running_loss / len(dataset)
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {epoch_loss:.4f}')

保存模型

torch.save(model.state_dict(), ‘street_view_perception_model.pth’)
评估模型
训练完成后,你可以使用测试集来评估模型的性能:

python
深色版本

加载测试数据集

test_dataset = StreetViewDataset(‘PlacePulse2.0/labels/beauty_test.csv’, root_dir, transform=transform)
test_dataloader = DataLoader(test_dataset, batch_size=32, shuffle=False, num_workers=4)

评估模型

model.eval()
with torch.no_grad():
total_mse = 0.0
for images, scores in test_dataloader:
images, scores = images.to(device), scores.to(device).float().unsqueeze(1)
outputs = model(images)
mse = criterion(outputs, scores)
total_mse += mse.item() * images.size(0)

test_mse = total_mse / len(test_dataset)
print(f'Test MSE: {test_mse:.4f}')

总结
通过以上步骤,你可以使用 MIT Place Pulse 2.0 数据集来训练和评估一个街景感知评分模型。这个数据集提供了丰富的街景图片和多维度的感知评分,非常适合用于研究城市环境的视觉感知

下面是一个详细的步骤指南,以使用 MIT Place Pulse 2.0 数据集为例,训练一个基于 ResNet 的回归模型来预测街景图片的感知评分。

一、数据准备

  1. 下载数据集
    首先,确保你已经从 MIT Place Pulse 2.0 的官方网站或 GitHub 仓库下载了数据集。

  2. 解压数据集
    将下载的数据集解压到指定的目录中,例如 PlacePulse2.0。

  3. 读取标签文件
    每个感知维度的标签文件(如 beauty.csv)包含图片路径和对应的评分。

二、数据预处理

  1. 自定义数据集类
    创建一个自定义的 PyTorch 数据集类来加载和预处理数据。

python
深色版本
import pandas as pd
import os
from PIL import Image
import torch
from torch.utils.data import Dataset, DataLoader
from torchvision import transforms

读取标签文件

def load_labels(file_path):
return pd.read_csv(file_path)

自定义数据集类

class StreetViewDataset(Dataset):
def init(self, csv_file, root_dir, transform=None):
self.labels = load_labels(csv_file)
self.root_dir = root_dir
self.transform = transform

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

def __getitem__(self, idx):
    img_name = os.path.join(self.root_dir, self.labels.iloc[idx, 0])
    image = Image.open(img_name).convert('RGB')
    score = self.labels.iloc[idx, 1]
    
    if self.transform:
        image = self.transform(image)
    
    return image, score

数据变换

transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

创建数据集实例

root_dir = ‘PlacePulse2.0/images/’
csv_file = ‘PlacePulse2.0/labels/beauty.csv’
dataset = StreetViewDataset(csv_file, root_dir, transform=transform)

创建数据加载器

dataloader = DataLoader(dataset, batch_size=32, shuffle=True, num_workers=4)

检查数据

for images, scores in dataloader:
print(images.shape, scores.shape)
break
三、模型选择
选择一个预训练的 ResNet 模型,并修改其最后一层以适应回归任务。

python
深色版本
import torch
import torch.nn as nn
from torchvision.models import resnet50

定义模型

model = resnet50(pretrained=True)
model.fc = nn.Linear(model.fc.in_features, 1) # 修改最后一层为回归输出

将模型移到GPU

device = torch.device(“cuda” if torch.cuda.is_available() else “cpu”)
model.to(device)
四、训练模型
定义损失函数、优化器,并进行模型训练。

python
深色版本

定义损失函数和优化器

criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

训练模型

num_epochs = 10
for epoch in range(num_epochs):
model.train()
running_loss = 0.0
for images, scores in dataloader:
images, scores = images.to(device), scores.to(device).float().unsqueeze(1)

    optimizer.zero_grad()
    outputs = model(images)
    loss = criterion(outputs, scores)
    loss.backward()
    optimizer.step()
    
    running_loss += loss.item() * images.size(0)

epoch_loss = running_loss / len(dataset)
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {epoch_loss:.4f}')

五、评估模型
使用测试集来评估模型的性能。

python
深色版本

加载测试数据集

test_dataset = StreetViewDataset(‘PlacePulse2.0/labels/beauty_test.csv’, root_dir, transform=transform)
test_dataloader = DataLoader(test_dataset, batch_size=32, shuffle=False, num_workers=4)

评估模型

model.eval()
with torch.no_grad():
total_mse = 0.0
for images, scores in test_dataloader:
images, scores = images.to(device), scores.to(device).float().unsqueeze(1)
outputs = model(images)
mse = criterion(outputs, scores)
total_mse += mse.item() * images.size(0)

test_mse = total_mse / len(test_dataset)
print(f'Test MSE: {test_mse:.4f}')

六、保存模型
训练完成后,保存模型以供后续使用。

python
深色版本

保存模型

torch.save(model.state_dict(), ‘street_view_perception_model.pth’)
七、完整代码
将上述所有步骤整合成一个完整的脚本:

python
深色版本
import pandas as pd
import os
from PIL import Image
import torch
from torch.utils.data import Dataset, DataLoader
from torchvision import transforms
import torch.nn as nn
import torch.optim as optim
from torchvision.models import resnet50

读取标签文件

def load_labels(file_path):
return pd.read_csv(file_path)

自定义数据集类

class StreetViewDataset(Dataset):
def init(self, csv_file, root_dir, transform=None):
self.labels = load_labels(csv_file)
self.root_dir = root_dir
self.transform = transform

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

def __getitem__(self, idx):
    img_name = os.path.join(self.root_dir, self.labels.iloc[idx, 0])
    image = Image.open(img_name).convert('RGB')
    score = self.labels.iloc[idx, 1]
    
    if self.transform:
        image = self.transform(image)
    
    return image, score

数据变换

transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

创建数据集实例

root_dir = ‘PlacePulse2.0/images/’
csv_file = ‘PlacePulse2.0/labels/beauty.csv’
dataset = StreetViewDataset(csv_file, root_dir, transform=transform)

创建数据加载器

dataloader = DataLoader(dataset, batch_size=32, shuffle=True, num_workers=4)

定义模型

model = resnet50(pretrained=True)
model.fc = nn.Linear(model.fc.in_features, 1) # 修改最后一层为回归输出

将模型移到GPU

device = torch.device(“cuda” if torch.cuda.is_available() else “cpu”)
model.to(device)

定义损失函数和优化器

criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

训练模型

num_epochs = 10
for epoch in range(num_epochs):
model.train()
running_loss = 0.0
for images, scores in dataloader:
images, scores = images.to(device), scores.to(device).float().unsqueeze(1)

    optimizer.zero_grad()
    outputs = model(images)
    loss = criterion(outputs, scores)
    loss.backward()
    optimizer.step()
    
    running_loss += loss.item() * images.size(0)

epoch_loss = running_loss / len(dataset)
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {epoch_loss:.4f}')

加载测试数据集

test_dataset = StreetViewDataset(‘PlacePulse2.0/labels/beauty_test.csv’, root_dir, transform=transform)
test_dataloader = DataLoader(test_dataset, batch_size=32, shuffle=False, num_workers=4)

评估模型

model.eval()
with torch.no_grad():
total_mse = 0.0
for images, scores in test_dataloader:
images, scores = images.to(device), scores.to(device).float().unsqueeze(1)
outputs = model(images)
mse = criterion(outputs, scores)
total_mse += mse.item() * images.size(0)

test_mse = total_mse / len(test_dataset)
print(f'Test MSE: {test_mse:.4f}')

保存模型

torch.save(model.state_dict(), ‘street_view_perception_model.pth’)
八、运行脚本
将上述代码保存为一个 Python 脚本文件(例如 train_street_view_perception.py),然后在命令行中运行:

bash
深色版本
python train_street_view_perception.py
九、注意事项
数据集路径:确保数据集路径正确,特别是图片和标签文件的路径。
硬件资源:训练大型模型可能需要较多的计算资源,建议使用 GPU。
超参数调整:根据实际情况调整学习率、批量大小等超参数,以获得更好的训练效果。
希望这些步骤能帮助你成功训练一个街景感知评分模型

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐