首页 > 软件资讯 > 【AI达人特训营】多模型集成学习的艺术作品作者识别

【AI达人特训营】多模型集成学习的艺术作品作者识别

时间:2025-08-06 10:34:23

该项目采用了多模型集成学习技术来识别艺术家。使用PaddleClas对ResNetvd、VGGPPLCNetV模型进行训练,并基于一个包含艺术家和图片的Art数据集进行了数据处理,将数据分为训练集和验证集。通过硬投票集成多个模型的结果来提高识别准确率,成功识别了Edgar Degas和Rembrandt的作品。

多模型集成学习的艺术作品作者识别

0 项目背景

AI能够解读艺术品,从中提取关键元素或借助GAN技术创作新颖绘画,从而通过训练模型来辨识艺术家和鉴定名作。

比如下图是法国印象派画家Edgar Degas的作品

接下来,我们将利用PaddleClas对AI进行训练,使它能识别艺术家作品并理解他们的创作手法。

本项目利用PaddleClas训练了ResNetvd、VGGPPLCNetV型,接着对艺术品图片应用这三个不同模型进行识别。每个模型分别给出识别结果,并通过硬投票方法将它们的预测综合在一起,实现多模型集成识别。

至于为什么需要使用多模型集成学习?

在面对复杂数据集时,单一模型可能无法提供全面和准确的答案。为了解决这个问题,我们需要采用多模型集成学习方法。通过利用不同分类器的优势,即使个别模型出现错误,其他模型也能纠正这些错误,从而提高整体预测的准确性。此项目选择硬投票作为多模型集成学习的一种方式,即每个分类器的结果独立地进行加权组合以得出最终决策。

1 简介

1.1项目如何实现

采用paddleclas进行图像分类任务。 paddleclas官方文档连接如下:

https://gitee.com/paddlepaddle/PaddleClas/blob/release/2.2/docs/zh_CN/tutorials/quick_start_new_user.md

1.2 多模型集成学习

当单一模型可能产生偏差时,通过结合多个人工智能系统可以显著提升预测准确性。这种方法的核心在于将多个分类器的结果整合起来,确保整体的可靠性与稳定性。具体来说,使用的是“硬投票”策略,即每个子系统的输出直接决定最终结果,没有权重考虑。这种机制有助于在面对不确定数据时保持模型的一致性和有效性,从而提供更加精准和可靠的预测结果。

2 数据集介绍

在艺术领域,我们有一个包含艺术家和艺术品图片的数据集。为了便于使用这些数据进行训练、测试和分析,我们需要将其转换为更易处理的形式。首先,需要创建一个名为author_id_to_name.txt的文件,其中包含了作者ID(与对应作者姓名之间的映射关系。此外,另一个关键文件是data/train.csv,它包含两个列:filename(图片文件名)和label(对应的艺术家ID)。通过这些信息,我们可以在训练、测试或分析模型时快速地找到每张艺术品的原始描述,并根据其艺术家ID轻松查找数据集中的相关信息。这样可以大大简化数据处理流程,提高工作效率。

友情提示:数据集仅供学习和个人使用

Data directory: ├── name_list.txt├── test │ ├── jpg│ ├── jpg │ └── ... ├── train │ ├── jpg├── train.csv├── name_list.txt└── train分布.pngAfter logging in, copy this content.

3 数据处理

In [1]

# 先导入所需要的库from sklearn.utils import shuffleimport osimport pandas as pdimport numpy as npfrom PIL import Imageimport paddleimport random登录后复制 In [2]

忽略警告信息在编程时,你可能经常遇到代码能正常运行但会提示警告的情况。有时这些警告特别让人讨厌。解决这个问题非常简单:通过调用`warnings.warn`函数来控制警告输出。首先,你需要导入`warnings`模块并调用其`filterwarnings`方法。你可以传入一个参数,指定你希望忽略的警告类型:```python import warnings# 忽略所有的警告信息 warnings.filterwarnings(ignore)# 或者忽略特定类型的警告 warnings.filterwarnings(error, category=NameError) ```通过这种方式,你可以根据需要控制警告消息是否显示,从而提高代码的可读性和效率。

3.1 解压数据集

In [3]

!unzip -qo /home/aistudio/data/data151473/Art.zip -d ./data/Art登录后复制

3.2读取数据

由于图片分散在train文件和test文件夹中,不方便统一管理,因此我将根据data/Art/train.csv文件中的所有图片名及其标签生成all_list.txt。此列表中有每张图片的路径(包括作者ID),格式为Art/img/[filename].jpg 其中对应作者的ID。数据集总共包含图片和标签。In [

import csvimport osdef get_all_txt(): with open("data/Art/train.csv") as cfile: i=0 reader = csv.DictReader(cfile) f = open("all_list.txt", "w") all_list = [] for row in reader: i=i+1 all_list.append("Art/img/"+row.get("filename")+".jpg"+" "+row.get("label") + "\n") allstr = ''.join(all_list) f = open('all_list.txt','w',encoding='utf-8') f.write(allstr) return all_list , i all_list,all_lenth = get_all_txt()print(all_lenth)登录后复制

- 录后复制

3.3 打乱数据

先把数据打乱,然后按照比例划分数据集 In [5]

# 把数据打乱all_list = shuffle(all_list) allstr = ''.join(all_list) f = open('all_list.txt','w',encoding='utf-8') f.write(allstr)print("打乱成功,并重新写入文本")登录后复制

打乱成功,并重新写入文本登录后复制

3.4划分数据集

我们总共是7227张图片,按照经典的划分方式0.9:0.1

train_list.txt(训练集,6504张图)

val_list.txt(验证集,723张图 In [6]

# 按照比例划分数据集Art的数据有7227张图片,不算大数据,一般9:1即可train_size = int(all_lenth * 0.9) train_list = all_list[:train_size] val_list = all_list[train_size:]print(len(train_list))print(len(val_list))登录后复制

- 723登录后复制

生成train_list.txt和val_list.txt文件 In [7]

- 使用Python脚本,创建训练集txt为train_list.txt并写入内容,随后验证集txt名为val_list.txt并存储。完成步骤,确保文件生成和显示信息准确。

train_list.txt 生成成功! val_list.txt 生成成功!登录后复制

4 安装环境

解压我放在work目录下已经修改好的PaddleClas.zip文件 In [8]

!unzip -qo ./work/PaddleClas.zip -d ./PaddleClas/登录后复制 In []

# 更新一下依赖!pip install --upgrade -r PaddleClas/requirements.txt -i https://mirror.baidu.com/pypi/simple登录后复制 In [10]

%cd PaddleClas !ls登录后复制

/home/aistudio/PaddleClas dataset __init__.py output ppcls result.txt tools hubconf.py MANIFEST.in paddleclas.py requirements.txt setup.py work登录后复制

5 移动数据集和修改配置文件

5.1 移动数据集

In [11]

!mkdir ../data/Art/img登录后复制 In [12]

!mv ../data/Art/train/* ../data/Art/img !mv ../data/Art/test/* ../data/Art/img登录后复制 In [13]

# 移动list.txt文件到对应目录!mv ../all_list.txt ../data/Art !mv ../train_list.txt ../data/Art !mv ../val_list.txt ../data/Art/登录后复制 In [14]

# 移动标签文件到对应目录!cp ../data/Art/name_list.txt ../data/Art/label_list.txt登录后复制

5.3 移动修改好的配置文件到对应目录

In [15]

!cp ../work/ResNet50_vd.yaml ./ppcls/configs/quick_start/ResNet50_vd.yaml !cp ../work/VGG16.yaml ./ppcls/configs/ImageNet/VGG/VGG16.yaml !cp ../work/PPLCNetV2_base.yaml ./ppcls/configs/ImageNet/PPLCNetV2/PPLCNetV2_base.yaml登录后复制

5.4 使用已经训练好的权重(可选)

若使用已经训练好的权重,可以执行这部分语言,并且跳过下面模型训练部分 In [16]

!mkdir output/ !mkdir output/ResNet50_vd/ !mkdir output/VGG16/ !mkdir output/PPLCNetV2_base/登录后复制

mkdir: 无法创建目录"output/": 文件已存在 mkdir: 无法创建目录"output/ResNet50_vd/": 文件已存在 mkdir: 无法创建目录"output/VGG16/": 文件已存在 mkdir: 无法创建目录"output/PPLCNetV2_base/": 文件已存在登录后复制 In [17]

!cp ../work/ResNet50_vd/best_model.pdparams ./output/ResNet50_vd/ !cp ../work/VGG16/best_model.pdparams ./output/VGG16/ !cp ../work/PPLCNetv2/best_model.pdparams ./output/PPLCNetV2_base/登录后复制

6 模型训练

若使用上面已经训练好的模型,可以跳过模型训练部分

以`work/PPLCNetVbase.yaml`为例,针对单卡训练场景下的模型配置调整,特别是当引入预训练模型时,学习率应降低至原值的四分之一到五分之一。与此同步,增加的线程数应设置为简化训练过程。Art数据集包含作者,因此对应类别数量应该设为标签信息应保存在`class_id_map_file: /home/aistudio/data/Art/label_list.txt`中,并确保与之匹配的标签文本配置妥当。- TopkAcc指标设置为[,这将有助于更好地评估模型性能。

# global configsGlobal: checkpoints: null pretrained_model: ../work/PPLCNetv2/PPLCNetV2_base_pretrained output_dir: ./output/ device: gpu save_interval: 1 eval_during_train: True eval_interval: 1 epochs: 480 print_batch_step: 10 use_visualdl: False # used for static mode and model export image_shape: [3, 224, 224] save_inference_dir: ./inference# model architectureArch: name: PPLCNetV2_base class_num: 49# loss function config for traing/eval processLoss: Train: - CELoss: weight: 1.0 epsilon: 0.1 Eval: - CELoss: weight: 1.0Optimizer: name: Momentum momentum: 0.9 lr: name: Cosine learning_rate: 0.016 warmup_epoch: 5 regularizer: name: 'L2' coeff: 0.00004# data loader for train and evalDataLoader: Train: dataset: name: MultiScaleDataset image_root: ../data/ cls_label_path: ../data/Art/train_list.txt transform_ops: - DecodeImage: to_rgb: True channel_first: False - RandCropImage: size: 224 - RandFlipImage: flip_code: 1 - NormalizeImage: scale: 1.0/255.0 mean: [0.485, 0.456, 0.406] std: [0.229, 0.224, 0.225] order: '' # support to specify width and height respectively: # scales: [(160,160), (192,192), (224,224) (288,288) (320,320)] sampler: name: MultiScaleSampler scales: [160, 192, 224, 288, 320] # first_bs: batch size for the first image resolution in the scales list # divide_factor: to ensure the width and height dimensions can be devided by downsampling multiple first_bs: 500 divided_factor: 32 is_training: True loader: num_workers: 0 use_shared_memory: True Eval: dataset: name: ImageNetDataset image_root: ../data/ cls_label_path: ../data/Art/val_list.txt transform_ops: - DecodeImage: to_rgb: True channel_first: False - ResizeImage: resize_short: 256 - CropImage: size: 224 - NormalizeImage: scale: 1.0/255.0 mean: [0.485, 0.456, 0.406] std: [0.229, 0.224, 0.225] order: '' sampler: name: DistributedBatchSampler batch_size: 64 drop_last: False shuffle: False loader: num_workers: 0 use_shared_memory: TrueInfer: infer_imgs: ../data/Art/img/974.jpg batch_size: 10 transforms: - DecodeImage: to_rgb: True channel_first: False - ResizeImage: resize_short: 256 - CropImage: size: 224 - NormalizeImage: scale: 1.0/255.0 mean: [0.485, 0.456, 0.406] std: [0.229, 0.224, 0.225] order: '' - ToCHWImage: PostProcess: name: Topk topk: 5 class_id_map_file: /home/aistudio/data/Art/label_list.txtMetric: Train: - TopkAcc: topk: [1, 49] Eval: - TopkAcc: topk: [1, 49]登录后复制

默认使用已经训练好的权重,如若自己训练模型,取消下面部分代码注释

6.1训练ResNet50_vd模型

In [18]

#!python3 tools/train.py -c ./ppcls/configs/quick_start/ResNet50_vd.yaml -o Global.device=gpu登录后复制

6.2练VGG16模型

In [19]

#!python3 tools/train.py -c ./ppcls/configs/ImageNet/VGG/VGG16.yaml -o Global.device=gpu登录后复制

6.3训练PPLCNetV2模型

In [20]

#!python3 tools/train.py -c ./ppcls/configs/ImageNet/PPLCNetV2/PPLCNetV2_base.yaml -o Global.device=gpu登录后复制

7 模型评估

7.1 ResNet50_vd模型评估

In []

!python tools/eval.py \ -c ./ppcls/configs/quick_start/ResNet50_vd.yaml \ -o Global.pretrained_model=./output/ResNet50_vd/best_model登录后复制

最新研究表明,ResNetvd在验证集上的准确率为,误差范围有限,接近目标值。

7.2 VGG16模型评估

In []

!python tools/eval.py \ -c ./ppcls/configs/ImageNet/VGG/VGG16.yaml \ -o Global.pretrained_model=./output/VGG16/best_model登录后复制

最新研究成果显示,VGG型在验证集上的表现优异,达到的高准确率。尽管如此,实际应用中仍需注意误差与识别精度之间的平衡,并期待未来技术的进步和完善。

7.3 PPLCNetV2模型评估

In []

!python tools/eval.py \ -c ./ppcls/configs/ImageNet/PPLCNetV2/PPLCNetV2_base.yaml \ -o Global.pretrained_model=./output/PPLCNetV2_base/best_model登录后复制

最终证明了PPLCNetV型在测试集上的表现超过了,实际效果略高于此值。

8 艺术品作者识别

从网上上下载一副Edgar Degas的作品进行识别

8.1 多模型分别进行预测

首先使用PaddleClas加载预先训练好的模型。接着,通过这三个预训练模型分别对输入图片进行特征提取。最后,将它们的预测结果整合到一起,并将其保存至名为result.txt的文件中,以便于后续的多模型集成学习。

# 修改Infer.infer_imgs为待识别艺术品图片路径file = open("result.txt", 'w').close() !python3 tools/infer.py \ -c ./ppcls/configs/quick_start/ResNet50_vd.yaml \ -o Infer.infer_imgs=../images/EdgarDegas.jpeg \ -o Global.pretrained_model=output/ResNet50_vd/best_model !python3 tools/infer.py \ -c ./ppcls/configs/ImageNet/VGG/VGG16.yaml \ -o Infer.infer_imgs=../images/EdgarDegas.jpeg \ -o Global.pretrained_model=./output/VGG16/best_model !python3 tools/infer.py \ -c ./ppcls/configs/ImageNet/PPLCNetV2/PPLCNetV2_base.yaml \ -o Infer.infer_imgs=../images/EdgarDegas.jpeg \ -o Global.pretrained_model=./output/PPLCNetV2_base/best_model登录后复制

从result.txt文件中分别读取每个模型对艺术作品的识别结果 In [25]

SaveList=[]with open("result.txt", "r", encoding='utf-8') as file: for line in file: line = line.strip('\n') SaveList.append(line) file.close() list_temp=[SaveList[0],SaveList[1],SaveList[2]]print("ResNet50_vd模型预测结果:{0},VGG16模型预测结果:{1},PPLCNetV2模型预测结果:{2}".format(SaveList[0],SaveList[1],SaveList[2]))登录后复制

ResNet50_vd模型预测结果:Edgar Degas,VGG16模型预测结果:Edgar Degas,PPLCNetV2模型预测结果:Edgar Degas登录后复制

8.2 多模型融合部分

通过多模型集成学习能够克服单个模型的局限性,实现更准确的识别效果。这种方法通常使用硬投票的方式进行决策,此外还可以尝试更高效的方法来提高集成学习的效果。例如,在[中进行了相关研究和应用。

import collections m=collections.Counter(list_temp) temp_max,key_max=0,0for k,v in m.items(): if v>temp_max: temp_max=v key_max=kprint("多模型集成学习后的预测结果是:"+key_max)登录后复制

多模型集成学习后的预测结果是:Edgar Degas登录后复制

可见三个模型都给出了一样的预测结果,最后多模型集成的预测结果也是Edgar Degas,符合预期 In []

# 修改Infer.infer_imgs为待识别艺术品图片路径file = open("result.txt", 'w').close() !python3 tools/infer.py \ -c ./ppcls/configs/quick_start/ResNet50_vd.yaml \ -o Infer.infer_imgs=../images/Rembrandt.jpeg \ -o Global.pretrained_model=output/ResNet50_vd/best_model !python3 tools/infer.py \ -c ./ppcls/configs/ImageNet/VGG/VGG16.yaml \ -o Infer.infer_imgs=../images/Rembrandt.jpeg \ -o Global.pretrained_model=./output/VGG16/best_model !python3 tools/infer.py \ -c ./ppcls/configs/ImageNet/PPLCNetV2/PPLCNetV2_base.yaml \ -o Infer.infer_imgs=../images/Rembrandt.jpeg \ -o Global.pretrained_model=./output/PPLCNetV2_base/best_model登录后复制

8.3 多模型集成学习的纠正预测

接下来测试一下从网上获取的Rembrandt的作品

当你使用ResNetvd、PPLCNetVVGG三个模型来识别作品时,它们的预测结果如下:ResNetvd模型预测是Rembrandt,PPLCNetV型也预测是Rembrandt,而VGG型则预测为Titian。然而,根据文章所述,VGG型实际上应得到的是Rembrandt的结果。这说明VGG型在预测时出现了错误。尽管VGG型单独出现错误预测的可能性,通过多模型集成学习技术(如ResNetvd和PPLCNetV可以有效纠正这些错误,从而最终得到正确的预测结果:Rembrandt。由此可见,采用多模型集成学习的方法在识别效果上具有显著提升作用。最后,为了进一步验证模型的综合性能,即使VGG型单独存在错误预测的可能性,其他模型也能通过相互补充帮助来矫正问题,保证了整体识别的准确性。注释:[ 是文章中提到的具体实验或讨论部分。

```pythonimport collections SaveList=[]with open('result.txt', 'r', encoding='utf-) as file: for line in file: line = line.strip('\n') SaveList.append(line) file.closelist_temp=[SaveList[,SaveList[,SaveList[]print(fResNetvd模型预测结果:{SaveList[},VGG型预测结果:{SaveList[},PPLCNetV型预测结果:{SaveList[})m=collections.Counter(list_temp) temp_max,key_max=or k,v in m.items: if v>temp_max: temp_max=v key_max=k print(f多模型集成学习后的预测结果是:{key_max}) ```

ResNetvd预测:Rembrandt;VGG测:Titian;PPLCNetV测:Rembrandt。集成后,预测为Rembrandt。

以上就是【AI达人特训营】多模型集成学习的艺术作品作者识别的详细内容,更多请关注其它相关文章!

热门推荐