oxford-iiit-pet 数据集


项目说明


数据集说明 oxford-iiit-pet

数据官方网站:
https://www.robots.ox.ac.uk/~vgg/data/pets/
下载 .torrent 文件,然后下载完整文件。

主要分为 images 和 annotations 文件


images 由以下类别图片构成:

Abyssinian Ragdoll boxer keeshond scottish_terrier
Bengal Russian_Blue chihuahua leonberger shiba_inu
Birman Siamese english_cocker_spaniel miniature_pinscher staffordshire_bull_terrier
Bombay Sphynx english_setter newfoundland wheaten_terrier
British_Shorthair american_bulldog german_shorthaired pomeranian yorkshire_terrier
Egyptian_Mau american_pit_bull_terrier great_pyrenees pug
Maine_Coon basset_hound havanese saint_bernard
Persian beagle japanese_chin samoyed

大写字母开头的是猫;小写字母开头的是狗。


annotations/xmls/Abyssinian_1.xml

<annotation>
    <folder>OXIIIT</folder>
    <filename>Abyssinian_1.jpg</filename>
    
    <source>
        <database>OXFORD-IIIT Pet Dataset</database>
        <annotation>OXIIIT</annotation>
        <image>flickr</image>
    </source>
    
    <size>
        <width>600</width>
        <height>400</height>
        <depth>3</depth>
    </size>
    
    <segmented>0</segmented>
    
    <object>
        <name>cat</name>
        <pose>Frontal</pose>
        <truncated>0</truncated>
        <occluded>0</occluded>
        
        <bndbox>
            <xmin>333</xmin>
            <ymin>72</ymin>
            <xmax>425</xmax>
            <ymax>158</ymax>
        </bndbox>
        <difficult>0</difficult>
    </object>
    
</annotation>


代码实现

数据处理

import os
import shutil
import random


整理原始数据-分类

将零散的数据,根据名字放到不同文件夹


def split_types(data_dir="images/",ret_dir="dataset/"):
    '''
    归类图像到不同目录中
    '''
    for file_name in os.listdir(data_dir):
        file_path = os.path.join(data_dir, file_name)
        type_dir = os.path.join(ret_dir + file_name.split('_')[0].strip())
        if not os.path.exists(type_dir):os.makedirs(type_dir)
            
        shutil.copy(file_path, type_dir+one_pic)

划分 训练集和测试集
origin_dir = '/Users/luyi/Downloads/oxford-iiit-pet/images/'
save_dir = ''

# 对原始数据集 划分 训练集和测试集 
def random2Dataset(data_dir=origin_dir,ratio=0.3):
    
    label_list = os.listdir(data_dir)

    for label in label_list:
        
        if label.startswith('.'):continue
        
        type_dir = os.path.join(data_dir, label)
        
        train_dir_type = os.path.join(save_dir, 'train', label)
        test_dir_type  = os.path.join(save_dir, 'test', label)
        if not os.path.exists(train_dir_type):os.makedirs(train_dir_type)
        if not os.path.exists(test_dir_type):os.makedirs(test_dir_type)
  
        file_names = os.listdir(type_dir)
        test_num = int(len(file_names) * ratio)
        
        print('-- ', label, test_num, )
        
        random.shuffle(file_names)

        #创建测试集 
        for file_name in file_names[:test_num]: 
            if file_name.startswith('.'):continue 
            file_path = os.path.join(type_dir, file_name)
            save_path = os.path.join(test_dir_type, file_name) 
            shutil.move(one_path, new_path)

        #创建训练集
        for file_name in file_names[test_num:]:
            if file_name.startswith('.'):continue
            file_path = os.path.join(type_dir, file_name)
            save_path = os.path.join(train_dir_type, file_name) 
            shutil.move(one_path, new_path)



2023-02-28

### 使用 Oxford-IIIT Pet Dataset 构建图像分类模型 为了构建基于Oxford-IIIT Pet Dataset的图像分类模型,可以采用TensorFlow框架来加载并处理数据集。此数据集中包含了多种不同种类的宠物图片,非常适合用于训练多类别分类器。 #### 数据准备 首先需要安装`tensorflow-datasets`库以便于获取所需的数据源: ```bash pip install tensorflow_datasets ``` 接着通过Python脚本导入必要的模块,并下载指定版本的数据集: ```python import tensorflow as tf import tensorflow_datasets as tfds dataset, info = tfds.load('oxford_iiit_pet:3.*.*', with_info=True) train_dataset = dataset['train'] test_dataset = dataset['test'] ``` 上述代码片段会自动从网络上拉取最新的可用版本(至少为3.0.0),其中不仅包含原始RGB格式的照片文件,还包括了额外的信息如标注边界框等辅助材料[^2]。 #### 预处理函数定义 由于原始尺寸不统一,在实际操作前还需对输入样本做标准化调整;这里提供了一个简单的预处理方法供参考: ```python def preprocess(image, label): image = tf.cast(image, tf.float32) image = (image / 127.5) - 1 image = tf.image.resize(image, (128, 128)) return image, label ``` 这段程序实现了将像素值范围映射到[-1, 1]区间内,并重设分辨率为固定大小的操作,有助于提高后续计算效率的同时也利于保持各批次间的一致性。 #### 创建批处理迭代器 为了让GPU能够更高效地执行批量矩阵运算,通常建议设置合理的batch size参数以平衡内存占用率与收敛速度之间的关系: ```python BATCH_SIZE = 64 BUFFER_SIZE = 1000 train_batches = train_dataset.map(preprocess).cache().shuffle(BUFFER_SIZE).batch(BATCH_SIZE).prefetch(buffer_size=tf.data.experimental.AUTOTUNE) validation_batches = test_dataset.map(preprocess).batch(BATCH_SIZE) ``` 此处采用了缓存(cache),随机打乱(shuffle),分组(batching)以及提前读取(prefetching)等一系列优化措施来加速整个流程运行时间。 #### 模型搭建 考虑到目标是解决一个多类别的识别问题,可以选择卷积神经网络(Convolutional Neural Networks,CNNs)作为基础架构来进行特征提取工作。下面给出了一种较为常见的设计方案——MobileNetV2迁移学习方案的应用实例: ```python IMG_SHAPE = (128, 128, 3) base_model = tf.keras.applications.MobileNetV2(input_shape=IMG_SHAPE, include_top=False, weights='imagenet') base_model.trainable = False global_average_layer = tf.keras.layers.GlobalAveragePooling2D() prediction_layer = tf.keras.layers.Dense(37, activation="softmax") model = tf.keras.Sequential([ base_model, global_average_layer, prediction_layer ]) ``` 在此基础上,已经预先训练好的MobileNetV2被冻结其内部权重更新权限(`trainable=False`),仅保留顶层结构部分参与反向传播过程中的梯度下降调节活动。这样做既节省了大量的计算资源开销又能在一定程度上防止过拟合现象的发生。 #### 编译和训练模型 最后一步就是配置损失函数(loss function),评估指标(evaluation metrics)等相关超参设定项,并启动正式的学习周期循环直至达到预期性能水平为止: ```python base_learning_rate = 0.0001 model.compile(optimizer=tf.keras.optimizers.Adam(lr=base_learning_rate), loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy']) initial_epochs = 10 history = model.fit(train_batches, epochs=initial_epochs, validation_data=validation_batches) ``` 经过一段时间耐心等待之后,应该就能得到一个初步具备泛化能力的预测工具啦!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程乐园

请我喝杯伯爵奶茶~!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值