该项目借助多模型集成学习识别艺术作品作者。使用PaddleClas训练ResNet50_vd、VGG16和PPLCNetV2模型,基于含49位作者、7226张图片的Art数据集,经数据处理后划分训练集和验证集。通过硬投票集成模型结果,可纠正单一模型错误,提升识别效果,如成功识别Edgar Degas和Rembrandt的作品。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

AI可以去理解画作,提取关键信息或者使用GAN网络去生成新的画作,于是可以通过训练人工智能去尝试识别艺术作品,识别名画的作者。
比如下图是法国印象派画家Edgar Degas的作品
接下来我们通过使用PaddleClas来训练人工智能,使其能够认出一些艺术家的作品,也便于我们了解每位艺术家的创造风格。
本项目使用PaddleClas来分别训练ResNet50_vd模型、VGG16模型和PPLCNetV2模型,然后将艺术品图片输入进三个不同模型进行识别,每个模型都会给出一个识别结果,然后将每个模型的识别结果进行集成学习,采用硬投票这种简单的方式进行多模型集成识别。
至于为什么需要使用多模型集成学习?
多模型集成主要为了解决单一模型不够全面的问题,不能保证每一个分类器都能得到正确的答案;使用多模型集成学习,即便某一个分类器得到了错误的预测,其他的分类器也可以将错误纠正回来,本项目采用硬投票只是多模型集成学习的其中一种方式
采用paddleclas进行图像分类任务。 paddleclas官方文档连接如下:
https://gitee.com/paddlepaddle/PaddleClas/blob/release/2.2/docs/zh_CN/tutorials/quick_start_new_user.md
由于单个模型难免会产生误差,为了提高预测效果,如果某一个分类器得到了错误的预测,其他的分类器也可以将错误纠正回来,于是将多个训练模型进行集成学习。采用的集成学习方式是硬投票方式。
# 先导入所需要的库from sklearn.utils import shuffleimport osimport pandas as pdimport numpy as npfrom PIL import Imageimport paddleimport random
# 忽略(垃圾)警告信息# 在python中运行代码经常会遇到的情况是——代码可以正常运行但是会提示警告,有时特别讨厌。# 那么如何来控制警告输出呢?其实很简单,python通过调用warnings模块中定义的warn()函数来发出警告。我们可以通过警告过滤器进行控制是否发出警告消息。import warnings
warnings.filterwarnings("ignore")!unzip -qo /home/aistudio/data/data151473/Art.zip -d ./data/Art
数据集由于图片分散在tain文件和test中不是很方便,所以可以根据data/Art/train.csv文件从中读取所有的文件名filename和对应的label,生成所有图片的all_list.txt,其中每一条数据Art/img/0.jpg 0包含图片数据的路径和对应的作者id,中间有个空格,数据集大小一共是7727.
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)7227
先把数据打乱,然后按照比例划分数据集
# 把数据打乱all_list = shuffle(all_list)
allstr = ''.join(all_list)
f = open('all_list.txt','w',encoding='utf-8')
f.write(allstr)print("打乱成功,并重新写入文本")打乱成功,并重新写入文本
我们总共是7227张图片,按照经典的划分方式0.9:0.1
train_list.txt(训练集,6504张图)
val_list.txt(验证集,723张图
# 按照比例划分数据集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))
6504 723
# 运行cell,生成训练集txt train_txt = ''.join(train_list)
f_train = open('train_list.txt','w',encoding='utf-8')
f_train.write(train_txt)
f_train.close()print("train_list.txt 生成成功!")# 运行cell,生成验证集txtval_txt = ''.join(val_list)
f_val = open('val_list.txt','w',encoding='utf-8')
f_val.write(val_txt)
f_val.close()print("val_list.txt 生成成功!")train_list.txt 生成成功! val_list.txt 生成成功!
解压我放在work目录下已经修改好的PaddleClas.zip文件
!unzip -qo ./work/PaddleClas.zip -d ./PaddleClas/
# 更新一下依赖!pip install --upgrade -r PaddleClas/requirements.txt -i https://mirror.baidu.com/pypi/simple
%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
!mkdir ../data/Art/img
!mv ../data/Art/train/* ../data/Art/img !mv ../data/Art/test/* ../data/Art/img
# 移动list.txt文件到对应目录!mv ../all_list.txt ../data/Art !mv ../train_list.txt ../data/Art !mv ../val_list.txt ../data/Art/
# 移动标签文件到对应目录!cp ../data/Art/name_list.txt ../data/Art/label_list.txt
!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
若使用已经训练好的权重,可以执行这部分语言,并且跳过下面模型训练部分
!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/": 文件已存在
!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/
若使用上面已经训练好的模型,可以跳过模型训练部分
下面介绍以work/PPLCNetV2_base.yaml为例,修改对应模型的相关配置 因为是单卡训练,加入预训练模型后,对应学习率应该降为原先的1/4~1/5,而num_workers则设置为0。Art数据集一共有49个作者,所以对应class_num应该设置为49。class_id_map_file: /home/aistudio/data/Art/label_list.txt则设置为对应的标签文本。- TopkAcc则设置为对应[1,49]
# 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]默认使用已经训练好的权重,如若自己训练模型,取消下面部分代码注释
#!python3 tools/train.py -c ./ppcls/configs/quick_start/ResNet50_vd.yaml -o Global.device=gpu
#!python3 tools/train.py -c ./ppcls/configs/ImageNet/VGG/VGG16.yaml -o Global.device=gpu
#!python3 tools/train.py -c ./ppcls/configs/ImageNet/PPLCNetV2/PPLCNetV2_base.yaml -o Global.device=gpu
!python tools/eval.py \
-c ./ppcls/configs/quick_start/ResNet50_vd.yaml \
-o Global.pretrained_model=./output/ResNet50_vd/best_model最后ResNet50_vd模型在验证集的验证准确率达到了99.44%,实际情况可能有些许波动,但已经达到预期结果
!python tools/eval.py \
-c ./ppcls/configs/ImageNet/VGG/VGG16.yaml \
-o Global.pretrained_model=./output/VGG16/best_model最后VGG16模型在验证集的验证准确率达到了72.33%,实际情况可能有些许波动,识别结果在可接受范围内,有待进一步优化改进
!python tools/eval.py \
-c ./ppcls/configs/ImageNet/PPLCNetV2/PPLCNetV2_base.yaml \
-o Global.pretrained_model=./output/PPLCNetV2_base/best_model最后PPLCNetV2模型在验证集的验证准确率达到了95.57%,实际情况可能有些许波动,但已经达到预期结果
从网上上下载一副Edgar Degas的作品进行识别
分别使用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文件中分别读取每个模型对艺术作品的识别结果
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
通过多模型集成学习可以解决单一模型精度不足,识别效果欠缺的问题,这里集成学习采用硬投票方式,也可以换用其他更高效的集成学习方式
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,符合预期
# 修改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接下来测试一下从网上获取的Rembrandt的作品
在对Rembrandt作品进行识别时,ResNet50_vd模型预测结果是Rembrandt,PPLCNetV2模型预测结果是Rembrandt,而VGG16模型预测结果却是Titian,第二预测结果才是Rembrandt,显而易见VGG16模型得到了错误的预测。最终因为多模型集成效果,即使单一VGG16模型出现错误预测,其他的分类器也将错误纠正回来,得到正确的预测结果Rembrandt,可见多模型集成学习对识别效果有很大提升。
import collections
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]))
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)ResNet50_vd模型预测结果:Rembrandt,VGG16模型预测结果:Titian,PPLCNetV2模型预测结果:Rembrandt 多模型集成学习后的预测结果是:Rembrandt
以上就是【AI达人特训营】多模型集成学习的艺术作品作者识别的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号