训练一个基于 ResNet 的回归模型来预测街景图片_旨在研究人们如何通过视觉感知来评估城市的街道环境。可用于训练街景感知评分模型_街景数据集
MIT Place Pulse 2.0 是一个大型的城市街景感知数据集旨在研究人们如何通过视觉感知来评估城市的街道环境。该数据集收集了全球50多个地区的11万张街景图片并通过众包平台让参与者对这些图片在六个不同的感知维度上进行评分。这些感知维度包括美丽Beauty这条街看起来有多美安全Safety在这条街上走动感觉有多安全繁华Liveliness这条街看起来有多繁华富裕Wealth这条街看起来有多富裕独特性Unique这条街看起来有多独特无聊Boring这条街看起来有多无聊数据集结构图片数量11万张街景图片。来源全球50多个地区。格式JPEG。标签感知评分每个图片在上述六个感知维度上的评分。格式CSV文件包含图片路径和对应的感知评分。数据集下载你可以从 MIT Place Pulse 2.0 的官方网站或 GitHub 仓库下载数据集。以下是下载链接官方网站MIT Place Pulse 2.0GitHub 仓库PlacePulse数据集文件结构下载后的数据集通常会有一个类似如下的目录结构深色版本PlacePulse2.0/├── images/│ ├── 000001.jpg│ ├── 000002.jpg│ └── …├── labels/│ ├── beauty.csv│ ├── safety.csv│ ├── liveliness.csv│ ├── wealth.csv│ ├── unique.csv│ └── boring.csv└── README.mdCSV 文件格式每个感知维度的标签文件如 beauty.csv通常包含以下列image_path图片的相对路径。score该图片在特定感知维度上的评分。例如beauty.csv 可能如下所示深色版本image_path,scoreimages/000001.jpg,4.5images/000002.jpg,3.2…数据预处理在使用数据集之前通常需要进行一些预处理步骤以便于后续的模型训练和评估。以下是一个简单的预处理示例python深色版本import pandas as pdimport osfrom PIL import Imageimport torchfrom torch.utils.data import Dataset, DataLoaderfrom torchvision import transforms读取标签文件def load_labels(file_path):return pd.read_csv(file_path)自定义数据集类class StreetViewDataset(Dataset):definit(self, csv_file, root_dir, transformNone):self.labels load_labels(csv_file)self.root_dir root_dirself.transform transformdef __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, transformtransform)创建数据加载器dataloader DataLoader(dataset, batch_size32, shuffleTrue, num_workers4)检查数据for images, scores in dataloader:print(images.shape, scores.shape)break训练模型你可以使用上述数据集和数据加载器来训练一个深度学习模型例如使用ResNet进行回归任务。以下是一个简单的训练示例python深色版本import torchimport torch.nn as nnimport torch.optim as optimfrom torchvision.models import resnet50定义模型model resnet50(pretrainedTrue)model.fc nn.Linear(model.fc.in_features, 1) # 修改最后一层为回归输出将模型移到GPUdevice torch.device(“cuda” if torch.cuda.is_available() else “cpu”)model.to(device)定义损失函数和优化器criterion nn.MSELoss()optimizer optim.Adam(model.parameters(), lr0.001)训练模型num_epochs 10for epoch in range(num_epochs):model.train()running_loss 0.0for 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(fEpoch [{epoch1}/{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, transformtransform)test_dataloader DataLoader(test_dataset, batch_size32, shuffleFalse, num_workers4)评估模型model.eval()with torch.no_grad():total_mse 0.0for 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(fTest MSE: {test_mse:.4f})总结通过以上步骤你可以使用 MIT Place Pulse 2.0 数据集来训练和评估一个街景感知评分模型。这个数据集提供了丰富的街景图片和多维度的感知评分非常适合用于研究城市环境的视觉感知下面是一个详细的步骤指南以使用 MIT Place Pulse 2.0 数据集为例训练一个基于 ResNet 的回归模型来预测街景图片的感知评分。一、数据准备下载数据集首先确保你已经从 MIT Place Pulse 2.0 的官方网站或 GitHub 仓库下载了数据集。解压数据集将下载的数据集解压到指定的目录中例如 PlacePulse2.0。读取标签文件每个感知维度的标签文件如 beauty.csv包含图片路径和对应的评分。二、数据预处理自定义数据集类创建一个自定义的 PyTorch 数据集类来加载和预处理数据。python深色版本import pandas as pdimport osfrom PIL import Imageimport torchfrom torch.utils.data import Dataset, DataLoaderfrom torchvision import transforms读取标签文件def load_labels(file_path):return pd.read_csv(file_path)自定义数据集类class StreetViewDataset(Dataset):definit(self, csv_file, root_dir, transformNone):self.labels load_labels(csv_file)self.root_dir root_dirself.transform transformdef __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, transformtransform)创建数据加载器dataloader DataLoader(dataset, batch_size32, shuffleTrue, num_workers4)检查数据for images, scores in dataloader:print(images.shape, scores.shape)break三、模型选择选择一个预训练的 ResNet 模型并修改其最后一层以适应回归任务。python深色版本import torchimport torch.nn as nnfrom torchvision.models import resnet50定义模型model resnet50(pretrainedTrue)model.fc nn.Linear(model.fc.in_features, 1) # 修改最后一层为回归输出将模型移到GPUdevice torch.device(“cuda” if torch.cuda.is_available() else “cpu”)model.to(device)四、训练模型定义损失函数、优化器并进行模型训练。python深色版本定义损失函数和优化器criterion nn.MSELoss()optimizer optim.Adam(model.parameters(), lr0.001)训练模型num_epochs 10for epoch in range(num_epochs):model.train()running_loss 0.0for 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(fEpoch [{epoch1}/{num_epochs}], Loss: {epoch_loss:.4f})五、评估模型使用测试集来评估模型的性能。python深色版本加载测试数据集test_dataset StreetViewDataset(‘PlacePulse2.0/labels/beauty_test.csv’, root_dir, transformtransform)test_dataloader DataLoader(test_dataset, batch_size32, shuffleFalse, num_workers4)评估模型model.eval()with torch.no_grad():total_mse 0.0for 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(fTest MSE: {test_mse:.4f})六、保存模型训练完成后保存模型以供后续使用。python深色版本保存模型torch.save(model.state_dict(), ‘street_view_perception_model.pth’)七、完整代码将上述所有步骤整合成一个完整的脚本python深色版本import pandas as pdimport osfrom PIL import Imageimport torchfrom torch.utils.data import Dataset, DataLoaderfrom torchvision import transformsimport torch.nn as nnimport torch.optim as optimfrom torchvision.models import resnet50读取标签文件def load_labels(file_path):return pd.read_csv(file_path)自定义数据集类class StreetViewDataset(Dataset):definit(self, csv_file, root_dir, transformNone):self.labels load_labels(csv_file)self.root_dir root_dirself.transform transformdef __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, transformtransform)创建数据加载器dataloader DataLoader(dataset, batch_size32, shuffleTrue, num_workers4)定义模型model resnet50(pretrainedTrue)model.fc nn.Linear(model.fc.in_features, 1) # 修改最后一层为回归输出将模型移到GPUdevice torch.device(“cuda” if torch.cuda.is_available() else “cpu”)model.to(device)定义损失函数和优化器criterion nn.MSELoss()optimizer optim.Adam(model.parameters(), lr0.001)训练模型num_epochs 10for epoch in range(num_epochs):model.train()running_loss 0.0for 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(fEpoch [{epoch1}/{num_epochs}], Loss: {epoch_loss:.4f})加载测试数据集test_dataset StreetViewDataset(‘PlacePulse2.0/labels/beauty_test.csv’, root_dir, transformtransform)test_dataloader DataLoader(test_dataset, batch_size32, shuffleFalse, num_workers4)评估模型model.eval()with torch.no_grad():total_mse 0.0for 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(fTest 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。超参数调整根据实际情况调整学习率、批量大小等超参数以获得更好的训练效果。希望这些步骤能帮助你成功训练一个街景感知评分模型