CUB-200-2011 鸟类数据集的训练及应用 鸟类识别 适用于细粒度分类研究,多种计算机视觉任务
CUB-200-2011 鸟类数据集的训练及应用 鸟类识别文章目录 一、环境搭建1. 安装 Python 虚拟环境推荐使用 Conda2. 安装必要依赖 二、数据集结构与准备3. 构建 PyTorch Dataset️♂️ 三、构建模型并训练1. 使用预训练 ResNet50 进行微调2. 数据预处理与加载3. 完整训练代码 四、使用属性和关键点可选1. 加载属性标签image_attribute_labels.txt2. 加载关键点坐标part_locs.txt数据预处理使用属性进行零样本学习Zero-Shot Learning部位检测与关键点检测多任务学习结论以下文字及代码仅供参考学习使用。CUB-200-2011 数据集数据集描述基础信息包含200种鸟类11,788张图像训练集5,994张测试集5,794张。每张图都有边界框和15个关键部位坐标还有312个二进制属性1CUB-200-2011 是一个广泛用于细粒度图像分类任务的经典数据集包含 200 种鸟类共 11,788 张图像并提供边界框、关键部位标注和 312 个二进制属性。非常适合研究细粒度分类、可解释性、特征学习等任务。 一、环境搭建1. 安装 Python 虚拟环境推荐使用 Condaconda create-ncub200python3.9conda activate cub2002. 安装必要依赖pipinstalltorch torchvision torchaudio pipinstallnumpy pandas matplotlib scikit-learn tqdm pipinstalltensorboard 二、数据集结构与准备解压后数据结构如下CUB_200_2011/ ├── images/ │ └── 001.Black_footed_Albatross/ │ └── Black_footed_Albatross_0001_796111.jpg ├── images.txt # 图像ID到图像路径的映射 ├── train_test_split.txt # 训练/测试划分 ├── bounding_boxes.txt # 边界框标注 ├── parts/ │ ├── part_locs.txt # 关键点坐标 │ └── part_names.txt # 关键点名称 └── attributes/ ├── image_attribute_labels.txt # 312个二进制属性 └── attribute_names.txt # 属性名称3. 构建 PyTorch Datasetimportosimportpandasaspdimporttorchfromtorch.utils.dataimportDatasetfromPILimportImageimporttorchvision.transformsastransformsclassCUB200Dataset(Dataset):def__init__(self,root_dir,trainTrue,transformNone):self.root_dirroot_dir self.traintrain self.transformtransform img_txt_pathos.path.join(root_dir,images.txt)train_test_split_pathos.path.join(root_dir,train_test_split.txt)label_pathos.path.join(root_dir,image_class_labels.txt)self.img_namespd.read_csv(img_txt_path,sep ,headerNone,index_col0).iloc[:,1]self.train_test_splitpd.read_csv(train_test_split_path,sep ,headerNone,index_col0).iloc[:,0].astype(bool)self.labelspd.read_csv(label_path,sep ,headerNone,index_col0).iloc[:,0]self.image_idsself.train_test_split[self.train_test_splitself.train].index.tolist()def__len__(self):returnlen(self.image_ids)def__getitem__(self,idx):image_idself.image_ids[idx]image_nameself.img_names.loc[image_id]image_pathos.path.join(self.root_dir,images,image_name)imageImage.open(image_path).convert(RGB)labelself.labels.loc[image_id]-1# 从0开始的类别编号ifself.transform:imageself.transform(image)returnimage,label️♂️ 三、构建模型并训练1. 使用预训练 ResNet50 进行微调importtorch.nnasnnimporttorchvision.modelsasmodelsdefbuild_model(num_classes200):modelmodels.resnet50(pretrainedTrue)model.fcnn.Linear(model.fc.in_features,num_classes)returnmodel2. 数据预处理与加载transform_traintransforms.Compose([transforms.Resize((256,256)),transforms.CenterCrop(224),transforms.ToTensor(),transforms.Normalize(mean[0.485,0.456,0.406],std[0.229,0.224,0.225])])dataset_trainCUB200Dataset(root_dirCUB_200_2011,trainTrue,transformtransform_train)dataset_testCUB200Dataset(root_dirCUB_200_2011,trainFalse,transformtransform_train)train_loadertorch.utils.data.DataLoader(dataset_train,batch_size32,shuffleTrue,num_workers4)test_loadertorch.utils.data.DataLoader(dataset_test,batch_size32,shuffleFalse,num_workers4)3. 完整训练代码importtorch.optimasoptimfromtqdmimporttqdm devicetorch.device(cudaiftorch.cuda.is_available()elsecpu)modelbuild_model().to(device)criterionnn.CrossEntropyLoss()optimizeroptim.Adam(model.parameters(),lr1e-4)deftrain(model,epochs50):forepochinrange(epochs):model.train()running_loss0.0correct0total0forimages,labelsintqdm(train_loader):images,labelsimages.to(device),labels.to(device)optimizer.zero_grad()outputsmodel(images)losscriterion(outputs,labels)loss.backward()optimizer.step()running_lossloss.item()_,predictedoutputs.max(1)totallabels.size(0)correctpredicted.eq(labels).sum().item()acc100.*correct/totalprint(fEpoch{epoch1}/{epochs}| Loss:{running_loss:.4f}| Acc:{acc:.2f}%)# 每5个epoch验证一次if(epoch1)%50:evaluate(model)defevaluate(model):model.eval()correct0total0withtorch.no_grad():forimages,labelsintest_loader:images,labelsimages.to(device),labels.to(device)outputsmodel(images)_,predictedoutputs.max(1)totallabels.size(0)correctpredicted.eq(labels).sum().item()acc100.*correct/totalprint(fValidation Acc:{acc:.2f}%)train(model) 四、使用属性和关键点可选1. 加载属性标签image_attribute_labels.txt该文件中每行表示一个图像的 312 个二进制属性如羽毛颜色、喙形状等可用于辅助分类或可解释性分析。attr_pathos.path.join(CUB_200_2011,attributes,image_attribute_labels.txt)attributespd.read_csv(attr_path,sep ,headerNone,names[img_id,attr_id,is_present,certainty,no_anno])2. 加载关键点坐标part_locs.txt每张图像有 15 个关键点如喙尖、眼睛、翅膀等可用于姿态估计或注意力机制。parts_pathos.path.join(CUB_200_2011,parts,part_locs.txt)partspd.read_csv(parts_path,sep ,headerNone,names[img_id,part_id,x,y,visible])探讨如何使用这个数据集进行研究或开发。以下是基于上述信息的一些扩展内容数据预处理在使用该数据集之前可能需要对图像和标注信息进行一些预处理。比如可以将边界框、部位标注和属性标注的信息整合到图像数据中以便于后续的模型训练。importpandasaspd# 加载并解析各类标注文件bounding_boxespd.read_csv(path_to_bounding_boxes.txt,sep ,headerNone)parts_locpd.read_csv(path_to_parts/part_locs.txt,sep ,headerNone)attributespd.read_csv(path_to_attributes/image_attribute_labels.txt,sep ,headerNone)使用属性进行零样本学习Zero-Shot Learning由于CUB-200-2011数据集提供了312个细粒度属性这些属性可以作为语义描述来帮助实现零样本学习。以下是一个简单的示例框架classZeroShotLearningModel(nn.Module):def__init__(self,attr_dim,num_classes):super(ZeroShotLearningModel,self).__init__()# 假设我们有一个特征提取器这里简化为一个线性层self.feature_extractornn.Linear(in_features...,out_featuresattr_dim)# 属性空间到类别空间的映射self.attr_to_classnn.Parameter(torch.randn(attr_dim,num_classes))defforward(self,x):featuresself.feature_extractor(x)logitstorch.mm(features,self.attr_to_class)returnlogits部位检测与关键点检测对于关键部位检测任务可以考虑使用热图回归或者直接预测坐标位置的方法。下面给出一个简单示例defkeypoint_loss(predicted_keypoints,target_keypoints,visible):# 仅计算可见的关键点损失lossF.mse_loss(predicted_keypoints[visible],target_keypoints[visible])returnloss多任务学习结合分类、检测、属性预测等任务可以通过多任务学习框架同时优化多个目标。这通常涉及到设计共享的特征提取器以及特定任务的分支。结论CUB-200-2011数据集不仅适用于细粒度分类研究还支持多种计算机视觉任务的学习与发展包括但不限于目标检测、属性学习、部位检测、多任务学习等。通过充分利用其丰富的标注信息研究人员能够探索更复杂的模型和算法推动相关领域的发展。、
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2483403.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!