1.调试的关键就是仔细研究报错信息。
根据报错信息回溯到关键代码:train_images = datasets.ImageFolder(train_options.train_folder, data_transforms['train'])分析报错原因就是train_folder找不到数据集入口路径:datasets.ImageFolder
函数无法在指定的路径../autodl-fs/COCO2017/
中找到任何类别文件夹。这意味着该路径下缺少所需的文件夹结构。
2.了解datasets.ImageFolder的功能发现自己提供的路径下直接就是图片而不是图片所在的分类文件夹。
datasets.ImageFolder
函数要求数据集的文件夹结构按照类别进行组织,每个类别在数据集文件夹中应该有一个单独的子文件夹,并且每个子文件夹中存放该类别的图像样本。因此要解决这个问题,你需要确保在../autodl-fs/COCO2017/
路径下存在正确的类别文件夹结构。例如,假设你的数据集包含两个类别,命名为"cat"和"dog",那么你的文件夹结构应该类似于:
../autodl-fs/COCO2017/ ├── cat │ ├── cat_image1.jpg │ ├── cat_image2.jpg │ └── ... └── dog ├── dog_image1.jpg ├── dog_image2.jpg └── ...
3.新建分类图片的脚本class.py来对COCO2017数据集根据annotations文件夹中的标签来对数据集进行分类以达到步骤2所示的结构层次。(需注意,代码中的annotations_path和train_folder都是基于我自己的相对路径,大家需要根据自己的运行路径来修改 )
import os
import json
import shutil
annotations_path = "annotations/instances_train2017.json"
train_folder = "COCO2017/train"
# 读取注释文件
with open(annotations_path, "r") as f:
annotations = json.load(f)
# 遍历每个图像的注释信息
for image in annotations["images"]:
image_id = image["id"]
file_name = image["file_name"]
# 根据图像ID查找对应的注释信息
image_annotations = [ann for ann in annotations["annotations"] if ann["image_id"] == image_id]
# 获取标签信息
labels = [ann["category_id"] for ann in image_annotations]
# 根据标签创建对应的子文件夹
for label in labels:
label_folder = os.path.join(train_folder, str(label))
os.makedirs(label_folder, exist_ok=True)
# 移动图像到对应的子文件夹
src_path = os.path.join(train_folder, file_name)
dst_path = os.path.join(label_folder, file_name)
shutil.move(src_path, dst_path)
4.成功根据COCO数据集的类别标签分为90个子文件夹,然后代码成功找到数据集入口!