"""
数据准备在进行Finetune前,我们可以设置一些运行时的配置,例如如下代码中的配置,表示:use_cuda:设置为False表示使用CPU进行训练。如果您本机支持GPU,且安装的是GPU版本的PaddlePaddle,我们建议您将这个选项设置为True;epoch:迭代轮数;batch_size:每次训练的时候,给模型输入的每批数据大小为32,模型训练时能够并行处理批数据,因此batch_size越大,训练的效率越高,但是同时带来了内存的负荷,过大的batch_size可能导致内存不足而无法训练,因此选择一个合适的batch_size是很重要的一步;log_interval:每隔10 step打印一次训练日志;eval_interval:每隔50 step在验证集上进行一次性能评估;checkpoint_dir:将训练的参数和数据保存到cv_finetune_turtorial_demo目录中;strategy:使用DefaultFinetuneStrategy策略进行finetune
"""
import paddlehub as hub
import paddle
paddle.enable_static()from paddlehub.dataset.base_cv_dataset import BaseCVDataset
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
module=hub.Module(name="resnet_v2_50_imagenet")
import matplotlib
matplotlib.use("TkAgg")class DemoDataSet(BaseCVDataset):def __init__(self):self.dataset_dir="data"super(DemoDataSet,self).__init__(base_path=self.dataset_dir,train_list_file="train_list.txt",validate_list_file="validate_list.txt",test_list_file="test_list.txt",label_list_file="label_list.txt")
dataset = DemoDataSet()
img=mpimg.imread("data/xu/1.jpg")
img1=mpimg.imread("data/yu/1.jpg")
plt.figure(figsize=(10,10))
plt.subplot(1,2,1)
plt.imshow(img)
plt.axis("off")
plt.subplot(1,2,2)
plt.imshow(img1)
plt.axis("off")
plt.show()
"""
生成数据读取器
"""
data_reader=hub.reader.ImageClassificationReader(image_width=module.get_expected_image_width(),image_height=module.get_expected_image_height(),images_mean=module.get_pretrained_images_mean(),images_std=module.get_pretrained_images_std(),dataset=dataset
)config = hub.RunConfig(use_cuda=True, #是否使用GPU训练,默认为False;num_epoch=3, #Fine-tune的轮数;checkpoint_dir="cv_finetune_turtorial_demo",#模型checkpoint保存路径, 若用户没有指定,程序会自动生成;batch_size=3, #训练的批大小,如果使用GPU,请根据实际情况调整batch_size;eval_interval=10, #模型评估的间隔,默认每100个step评估一次验证集;strategy=hub.finetune.strategy.DefaultFinetuneStrategy())input_dict, output_dict, program = module.context(trainable=True)
img = input_dict["image"]
feature_map = output_dict["feature_map"]
feed_list = [img.name]task = hub.ImageClassifierTask(data_reader=data_reader,feed_list=feed_list,feature=feature_map,num_classes=dataset.num_labels,config=config)import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimgdata = ["data/xu/16.jpg","data/yu/16.jpg"]label_map = dataset.label_dict()
index = 0
run_states = task.predict(data=data)
results = [run_state.run_results for run_state in run_states]for batch_result in results:print(batch_result)batch_result = np.argmax(batch_result, axis=2)[0]print(batch_result)for result in batch_result:index += 1result = label_map[result]print("input %i is %s, and the predict result is %s" %(index, data[index - 1], result))img = mpimg.imread(data[0])
img1 = mpimg.imread(data[1])
plt.figure(figsize=(10,10))
plt.subplot(1,2,1)
plt.imshow(img)
plt.axis('off')
plt.subplot(1,2,2)
plt.imshow(img1)
plt.axis('off')
plt.show()
# 作者:Kerwin Wan
# 开发时间:2022/9/29 15:27"""
图像预测
"""
import paddlehub as hub
import paddle
paddle.enable_static()
# 加载预训练模型
module=hub.Module(name="resnet_v2_50_imagenet")
from paddlehub.dataset.base_cv_dataset import BaseCVDataset
class DemoDataSet(BaseCVDataset):def __init__(self):self.dataset_dir="data"super(DemoDataSet, self).__init__(base_path=self.dataset_dir,train_list_file="train_list.txt",validate_list_file="validate_list.txt",label_list_file="label_list.txt")
dataset=DemoDataSet()import matplotlib.pyplot as plt
import matplotlib.image as mpimg
img=mpimg.imread("data/xu/1.jpg")
img1=mpimg.imread("data/yu/1.jpg")
plt.figure(figsize=(10,10))
plt.subplot(1,2,1)
plt.imshow(img)
plt.axis("off")
plt.subplot(1,2,2)
plt.imshow(img1)
plt.axis("off")
plt.show()# 生成数据读取器
data_reader=hub.reader.ImageClassificationReader(image_width=module.get_expected_image_width(),image_height=module.get_expected_image_height(),images_mean=module.get_pretrained_images_mean(),images_std=module.get_pretrained_images_std(),dataset=dataset
)
# 配置策略
config=hub.RunConfig(use_cuda=True,num_epoch=3,checkpoint_dir="cv_finetune_turtorial_demo",batch_size=3,eval_interval=10,strategy=hub.finetune.strategy.DefaultFinetuneStrategy(),
)
# 组建Finetune Task
input_dict,output_dict,program=module.context(trainable=True)
img = input_dict["image"]
feature_map = output_dict["feature_map"]
feed_list = [img.name]task = hub.ImageClassifierTask(data_reader=data_reader,feed_list=feed_list,feature=feature_map,num_classes=dataset.num_labels,config=config)
run_states = task.finetune_and_eval()import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimgdata = ["data/xu/16.jpg","data/yu/16.jpg"]label_map = dataset.label_dict()
index = 0
run_states = task.predict(data=data)
results = [run_state.run_results for run_state in run_states]for batch_result in results:print(batch_result)batch_result = np.argmax(batch_result, axis=2)[0]print(batch_result)for result in batch_result:index += 1result = label_map[result]print("input %i is %s, and the predict result is %s" %(index, data[index - 1], result))img = mpimg.imread(data[0])
img1 = mpimg.imread(data[1])
plt.figure(figsize=(10,10))
plt.subplot(1,2,1)
plt.imshow(img)
plt.axis('off')
plt.subplot(1,2,2)
plt.imshow(img1)
plt.axis('off')
plt.show()
print(" input1 许佳琪 input2 虞书欣")
# 作者:Kerwin Wan
# 开发时间:2022/9/29 16:43#导入需要的包
import numpy as np
import paddle as paddle
import paddle.fluid as fluid
from PIL import Image
import matplotlib.pyplot as plt
import os
import paddle
paddle.enable_static()train_reader = paddle.batch(paddle.reader.shuffle(paddle.dataset.mnist.train(),buf_size=512),batch_size=128)
test_reader = paddle.batch(paddle.dataset.mnist.test(),batch_size=128)temp_reader = paddle.batch(paddle.dataset.mnist.train(),batch_size=1)
temp_data=next(temp_reader())
print(temp_data)def multilayer_perceptron(input):# 第一个全连接层,激活函数为ReLUhidden1 = fluid.layers.fc(input=input, size=100, act='relu')# 第二个全连接层,激活函数为ReLUhidden2 = fluid.layers.fc(input=hidden1, size=100, act='relu')# 以softmax为激活函数的全连接输出层,大小为10prediction = fluid.layers.fc(input=hidden2, size=10, act='softmax')return prediction
image = fluid.layers.data(name='image', shape=[1, 28, 28], dtype='float32') #单通道,28*28像素值
label = fluid.layers.data(name='label', shape=[1], dtype='int64') #图片标签
model = multilayer_perceptron(image)
# 获取损失函数和准确率函数
cost = fluid.layers.cross_entropy(input=model, label=label) #使用交叉熵损失函数,描述真实样本标签和预测概率之间的差值
avg_cost = fluid.layers.mean(cost)
acc = fluid.layers.accuracy(input=model, label=label)# 定义优化方法
optimizer = fluid.optimizer.AdamOptimizer(learning_rate=0.001) #使用Adam算法进行优化
opts = optimizer.minimize(avg_cost)# 定义一个使用CPU的解析器
place = fluid.CPUPlace()
exe = fluid.Executor(place)
# 进行参数初始化
exe.run(fluid.default_startup_program())# 定义输入数据维度
feeder = fluid.DataFeeder(place=place, feed_list=[image, label])# 开始训练和测试
for pass_id in range(5):# 进行训练for batch_id, data in enumerate(train_reader()): # 遍历train_readertrain_cost, train_acc = exe.run(program=fluid.default_main_program(), # 运行主程序feed=feeder.feed(data), # 给模型喂入数据fetch_list=[avg_cost, acc]) # fetch 误差、准确率# 每100个batch打印一次信息 误差、准确率if batch_id % 100 == 0:print('Pass:%d, Batch:%d, Cost:%0.5f, Accuracy:%0.5f' %(pass_id, batch_id, train_cost[0], train_acc[0]))# 进行测试test_accs = []test_costs = []# 每训练一轮 进行一次测试for batch_id, data in enumerate(test_reader()): # 遍历test_readertest_cost, test_acc = exe.run(program=fluid.default_main_program(), # 执行训练程序feed=feeder.feed(data), # 喂入数据fetch_list=[avg_cost, acc]) # fetch 误差、准确率test_accs.append(test_acc[0]) # 每个batch的准确率test_costs.append(test_cost[0]) # 每个batch的误差# 求测试结果的平均值test_cost = (sum(test_costs) / len(test_costs)) # 每轮的平均误差test_acc = (sum(test_accs) / len(test_accs)) # 每轮的平均准确率print('Test:%d, Cost:%0.5f, Accuracy:%0.5f' % (pass_id, test_cost, test_acc))# 保存模型model_save_dir = "/home/aistudio/data/hand.inference.model"# 如果保存路径不存在就创建if not os.path.exists(model_save_dir):os.makedirs(model_save_dir)print('save models to %s' % (model_save_dir))fluid.io.save_inference_model(model_save_dir, # 保存推理model的路径['image'], # 推理(inference)需要 feed 的数据[model], # 保存推理(inference)结果的 Variablesexe) # executor 保存 inference model# 对图片进行预处理def load_image(file):im = Image.open(file).convert('L') # 将RGB转化为灰度图像,L代表灰度图像,灰度图像的像素值在0~255之间im = im.resize((28, 28), Image.ANTIALIAS) # resize image with high-quality 图像大小为28*28im = np.array(im).reshape(1, 1, 28, 28).astype(np.float32) # 返回新形状的数组,把它变成一个 numpy 数组以匹配数据馈送格式。# print(im)im = im / 255.0 * 2.0 - 1.0 # 归一化到【-1~1】之间print(im)return imimg = Image.open('data/xu/6.jpg')plt.imshow(img) # 根据数组绘制图像plt.show() # 显示图像infer_exe = fluid.Executor(place)inference_scope = fluid.core.Scope()# 加载数据并开始预测with fluid.scope_guard(inference_scope):# 获取训练好的模型# 从指定目录中加载 推理model(inference model)[inference_program, # 推理Programfeed_target_names, # 是一个str列表,它包含需要在推理 Program 中提供数据的变量的名称。fetch_targets] = fluid.io.load_inference_model(model_save_dir,# fetch_targets:是一个 Variable 列表,从中我们可以得到推断结果。model_save_dir:模型保存的路径infer_exe) # infer_exe: 运行 inference model的 executorimg = load_image('data/yu/6.jpg')results = exe.run(program=inference_program, # 运行推测程序feed={feed_target_names[0]: img}, # 喂入要预测的imgfetch_list=fetch_targets) # 得到推测结果,# 获取概率最大的labellab = np.argsort(results) # argsort函数返回的是result数组值从小到大的索引值# print(lab)print("该图片的预测结果的label为: %d" % lab[0][0][-1]) # -1代表读取数组中倒数第一列