python爬取NUS-WIDE数据库图片

下面为您介绍“python爬取NUS-WIDE数据库图片”的完整攻略,包含两条示例说明。

简介

NUS-WIDE是一个包含269,648张图片的数据库,图片来源于Flickr社交网站。这些图片被手工标注为38个不同的标签。这个数据库可以用于图像检索、多标签分类、语义注释等领域的研究。

在使用NUS-WIDE数据库进行研究时,我们通常需要把图片下载到本地。本文将介绍如何使用Python爬取NUS-WIDE数据库图片。

步骤

1. 下载NUS-WIDE数据库

首先,你需要到NUS-WIDE官网http://lms.comp.nus.edu.sg/research/NUS-WIDE.htm上下载NUS-WIDE数据库。在下载页面上,你需要填写一个表单并提交。提交成功后,你将收到一封包含下载链接的邮件。

2. 解压数据库文件

你需要将下载的压缩文件解压到本地的某个目录中。解压后的文件夹包含了10个MATLAB文件,其中每个文件对应一个图片标签。在这些MATLAB文件中,每个变量都是一个结构体,包含图片的文件名、标签等信息。

3. 安装必要的Python库

接下来,你需要安装必要的Python库:numpy、h5py、Pillow、beautifulsoup4和requests。这些库都可以通过pip安装。

pip install numpy
pip install h5py
pip install Pillow
pip install beautifulsoup4
pip install requests

4. 编写爬虫程序

为了爬取NUS-WIDE数据库的图片,我们需要编写一个Python程序。代码如下:

import h5py
import os
import requests
from PIL import Image
from io import BytesIO
from bs4 import BeautifulSoup

# 数据库文件夹路径
database_dir = './database'
# 数据库文件名称
database_file = 'NUS-WIDE-Object-Database.mat'
# 图片存放路径
img_dir = './img'

os.makedirs(img_dir, exist_ok=True)

with h5py.File(os.path.join(database_dir, database_file), 'r') as f:
    # 遍历每个MATLAB文件
    for label in f.keys():
        label_dir = os.path.join(img_dir, label)
        os.makedirs(label_dir, exist_ok=True)

        # 遍历当前标签下的所有图片,读取图片内容并保存为文件
        for img_name in f[label]['filename']:
            url = 'https://farm{}.staticflickr.com/{}/{}.jpg'.format(f[label]['farm'][0], f[label]['server'][0], img_name)

            response = requests.get(url)
            img = Image.open(BytesIO(response.content))
            img.save(os.path.join(label_dir, img_name + '.jpg'))

            print('Downloaded image ' + img_name)

这个程序遍历数据库文件夹中的每个MATLAB文件,读取其中的图片数据并保存为本地文件。

5. 运行爬虫程序

在程序执行之前,请确保你已经将NUS-WIDE数据库解压到了本地。另外,如果你需要在程序中使用代理服务器,请设置requests库的代理。

使用命令行进入Python所在的目录,并运行程序:

python nuswide_spider.py

程序会依次下载NUS-WIDE数据库中的所有图片,并将它们保存在本地的相应标签文件夹中。

示例

下面以两个示例展示如何使用NUS-WIDE数据库和爬虫程序。

示例1: 使用NUS-WIDE数据库进行多标签分类

假设我们要使用NUS-WIDE数据库进行多标签分类的研究。首先,我们需要将数据库图片下载到本地。请按照上面的步骤下载NUS-WIDE数据库,并使用爬虫程序将数据库中的图片下载到本地。

接下来,我们需要将图片分割成训练集和测试集,并使用神经网络模型训练和测试。这个过程可以使用Python的深度学习库Keras实现。另外,我们需要使用sklearn库对模型进行评估。

import os
import random
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import Adam
from sklearn.metrics import classification_report, confusion_matrix
from sklearn.model_selection import train_test_split

# 图片文件夹路径
img_dir = './img'
# 图片尺寸(像素)
img_size = 224
# 批处理大小
batch_size = 32
# 训练集比例
train_ratio = 0.8

# 加载图片数据
X, y = [], []
for i, label in enumerate(os.listdir(img_dir)):
    for img_name in os.listdir(os.path.join(img_dir, label)):
        img_path = os.path.join(img_dir, label, img_name)
        img = Image.open(img_path).resize((img_size, img_size))
        X.append(np.array(img))
        y.append(np.zeros((38,)))
        y[-1][i] = 1

# 将数据分割成训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=train_ratio, random_state=42)

# 构建神经网络模型
model = Sequential([
    Dense(512, input_shape=(img_size, img_size, 3), activation='relu'),
    Dropout(0.2),
    Dense(512, activation='relu'),
    Dropout(0.2),
    Dense(38, activation='softmax')
])
model.compile(loss='categorical_crossentropy', optimizer=Adam(lr=0.001), metrics=['accuracy'])

# 训练模型
model.fit(np.array(X_train), np.array(y_train), batch_size=batch_size, epochs=10, validation_data=(np.array(X_test), np.array(y_test)))

# 测试模型
y_pred = model.predict(np.array(X_test))
y_pred_labels = np.argmax(y_pred, axis=1)
y_true_labels = np.argmax(y_test, axis=1)
print(classification_report(y_true_labels, y_pred_labels))
print(confusion_matrix(y_true_labels, y_pred_labels))

这个程序使用载入的图片数据构建了一个三层的神经网络,其中前两层是密集层(Dense),第三层是softmax层。模型以categorical_crossentropy损失函数、Adam优化器和准确率指标为评价标准,使用训练集训练10个epochs。训练完毕后,模型使用测试集进行评价,打印出分类报告和混淆矩阵。

示例2: 使用NUS-WIDE数据库进行图像检索

假设我们要使用NUS-WIDE数据库进行图像检索的研究。首先,我们需要将数据库图片下载到本地。请按照上面的步骤下载NUS-WIDE数据库,并使用爬虫程序将数据库中的图片下载到本地。

接下来,我们需要将每张图片的特征提取出来,并建立一个图像检索系统。这个过程可以使用Python的深度学习库Keras实现。

import os
import numpy as np
from keras.applications.vgg16 import VGG16, preprocess_input
from keras.preprocessing import image
from sklearn.neighbors import NearestNeighbors

# 图片文件夹路径
img_dir = './img'
# 图片尺寸(像素)
img_size = (224, 224)
# 特征向量维度
feat_dim = 4096
# 图像检索算法(k-近邻)
k = 5

# 构建卷积神经网络模型
model = VGG16(weights='imagenet', include_top=False, input_shape=(img_size[0], img_size[1], 3))

# 加载图片特征
X, img_paths = [], []
for i, label in enumerate(os.listdir(img_dir)):
    for img_name in os.listdir(os.path.join(img_dir, label)):
        img_path = os.path.join(img_dir, label, img_name)
        img = image.load_img(img_path, target_size=img_size)
        img = image.img_to_array(img)
        img = np.expand_dims(img, axis=0)
        img = preprocess_input(img)
        X.append(model.predict(img)[0].reshape((feat_dim,)))
        img_paths.append(img_path)

# 训练k-近邻算法
knn = NearestNeighbors(n_neighbors=k, algorithm='brute', metric='cosine')
knn.fit(X)

while True:
    # 读取输入图片
    query_path = input('Enter the path of the query image: ')
    query_img = image.load_img(query_path, target_size=img_size)
    query_img = image.img_to_array(query_img)
    query_img = np.expand_dims(query_img, axis=0)
    query_img = preprocess_input(query_img)
    query_feat = model.predict(query_img)[0].reshape((feat_dim,))

    # 进行图像检索
    dists, indices = knn.kneighbors(query_feat.reshape((1, -1)))

    # 展示检索结果
    query_url = 'file://' + os.path.abspath(query_path)
    print('\nQuery image: ' + query_url + '\n')
    for i, idx in enumerate(indices[0]):
        img_path = img_paths[idx]
        img_url = 'file://' + os.path.abspath(img_path)
        print('Rank {}: '.format(i+1) + img_url)

这个程序首先使用VGG16模型对每张图片提取出其特征向量。然后,程序构建了一个k-近邻模型并训练之。训练完成后,程序从命令行读取输入,查询输入的图片在数据库中最相似的k张图片。查询结果按相似度从高到低排列,然后展示查询图片和检索结果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python爬取NUS-WIDE数据库图片 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • js中值引用和地址引用实例分析

    JS中的值引用和地址引用指的是,在JS中,非基本类型数据(如对象、数组等)的赋值方式存在两种:值传递和引用传递。当使用值传递时,实际上是将变量的值(即数据内容)直接复制给接收变量;而当使用引用传递时,则是将变量的地址(指针)复制给接收变量,两者指向同一块内存空间,从而共享同一份数据。这里通过两个实例来详细讲解这两种传递方式的异同点。 实例1:值传递 假设有两…

    Flask 2023年5月16日
    00
  • Python进行Restful API开发实例详解

    下面我会详细讲解 Python 进行 Restful API 开发实例的完整攻略,并提供两个示例说明。 准备工作 在进行 Restful API 开发之前,需要安装 Flask 和 Flask-RESTful 等库。执行以下命令进行安装: pip install Flask Flask-RESTful 示例一:ToDo List 在这个示例中,我们将创建一个…

    Flask 2023年5月16日
    00
  • python中如何使用虚拟环境

    使用虚拟环境可以避免不同项目之间的依赖冲突,提高项目开发和部署的可靠性。下面是Python中使用虚拟环境的完整攻略: 步骤 1: 安装虚拟环境 要使用虚拟环境,我们需要先安装虚拟环境模块venv。通常情况下,Python3自带了venv模块,因此你不需要额外安装。如果你使用的是Python2,则可以使用virtualenv来创建虚拟环境。以下是在Linux或…

    Flask 2023年5月15日
    00
  • python 获取sqlite3数据库的表名和表字段名的实例

    接下来我将详细讲解“python 获取sqlite3数据库的表名和表字段名的实例”的完整攻略,过程中也会包含两条示例说明。 1. 获取sqlite3数据库的表名 我们可以通过sqlite_master系统表来获取sqlite3数据库中的表名。 示例代码: import sqlite3 def get_table_names(db_file_path): co…

    Flask 2023年5月16日
    00
  • Python Flask实现图片验证码与邮箱验证码流程详细讲解

    细致的Python Flask实现图片验证码与邮箱验证码流程详细讲解,以下就是教程: 1. 图片验证码的流程 1.1 安装依赖库 首先要安装依赖库,可以使用pip直接安装如下库 pip install flask flask-wtf Pillow Flask是Web框架 Flask-wtf是Flask的表单框架 Pillow是Python中的图像处理库 1.…

    Flask 2023年5月16日
    00
  • Python flask sqlalchemy的简单使用及常用操作

    本文将为大家介绍Python Flask结合SQLAlchemy的简单使用及常用操作,内容分为以下几个部分: Flask简介 SQLAlchemy简介 简单使用Flask和SQLAlchemy 常用操作 示例说明 总结 1. Flask简介 Flask是一个轻量级的Python web开发框架,它的核心思想是保持简单和灵活。Flask的特点是基于Werkze…

    Flask 2023年5月15日
    00
  • 30分钟搭建Python的Flask框架并在上面编写第一个应用

    下面我将详细讲解搭建Python Flask框架的攻略。 1. 安装Flask库 在搭建Flask框架之前,需要先安装Flask库。可以使用pip命令进行安装,命令如下: pip install Flask 2. 搭建Flask框架 在安装完Flask库之后,可以开始搭建Flask框架。具体的步骤如下: 创建一个名为myapp的文件夹,用于存放项目文件。 m…

    Flask 2023年5月15日
    00
  • python miniWeb框架搭建过程详解

    当我们要搭建自己的网站,动态web框架是不可或缺的。Python是一种非常流行的编程语言,它拥有丰富的web框架,比如Flask、Django等。而如果我们想要更深入了解web框架的原理,也可以尝试手动搭建一个miniWeb框架。下面,我们将分为以下几个步骤,详细讲解Python miniWeb框架的搭建过程: 搭建服务器 首先,我们需要一个能够运行Pyth…

    Flask 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部