使用PaddleHub进行图像分类

使用PaddleHub进行图像分类

图像分类是计算机视觉的重要领域,目标是将图像分类到预定义的标签。本文以Kaggle的猫狗分类数据集为例子,来做PaddleHub图像分类任务。

PaddleHub可以使用关键字进行检索模型匹配,找到自己需要的预训练模型

'''
通过关键字在服务端检索匹配的模型,以关键字resnet为例
'''
!hub search resnet

使用PaddleHub进行图像分类_第1张图片

step1 加载预训练模型

猫狗分类属于图像分类的任务,这里使用经典的ResNet-50作为预训练模型,也就是上面通过关键字搜索的第一个模型。此外还可使用别的模型,如最新的神经网络架构搜索类的PNASNet。

import paddlehub as hub#选择paddlehub中的模型
module=hub.Module(name="resnet_v2_50_imagenet")#加载paddlehub中的resnet_v2_50_imagenet模型
input_dict,outpit_dict,program=module.context(
    trainable=True)#获取模型的上下文

使用PaddleHub进行图像分类_第2张图片

step2 数据准备

模型准备好后就需要数据集,这里直接使用PaddleHub中提供的猫狗分类的数据集,随后生成一个图像分类的reader,需指定输入图片的大小。

#下载数据,直接使用paddlehub提供的数据集
dataset = hub.dataset.DogCat()
#使用ImageClassificationReader读取数据
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)

输出label map猫的标签是0,狗的标签是1

step3 配置策略

在运行paddlehub的模型值卡需要配置网络,

use_cuda:设置为False表示使用CPU进行训练。True是表示使用GPU进行训练

epoch表示Finetune的任务只遍历一次训练

#运行配置,RunConfig主要控制Fine-tune的训练
config = hub.RunConfig(
    use_cuda=False,                              #是否使用GPU训练,默认为False;
    num_epoch=1,                                #表示任务只遍历一次训练集;
    checkpoint_dir="cv_finetune_turtorial_demo",#模型checkpoint保存路径, 若用户没有指定,程序会自动生成;
    batch_size=32,                              #训练的批大小,如果使用GPU,请根据实际情况调整batch_size;
    eval_interval=50,                           #模型评估的间隔,默认每100个step,在验证集上进行一次性能评估;
    strategy=hub.finetune.strategy.DefaultFinetuneStrategy())  #Fine-tune优化策略;

 

step 4  迁移组网

有了合适的预训练模型和准备要迁移的数据集后,我们开始组建一个Task

猫狗分类属于一个二分类任务,而下载的分类module实在imagenet数据集上训练的千分类模型,所以需要对模型进行微雕,把模型改造为一个二分类的模型:

1.从输出变量中找到特征图提取层feature_map;2.在feature_map后面接入一个全连接层生成Task



#返回了resnet模型对应的feature_map,可以用于图片的特征表达
feature_map = output_dict["feature_map"]
#feed_list中的inputs参数指明了resnet模型的输入tensor的顺序,与ImageClassifierTask返回的结果一致。
feed_list = [input_dict["image"].name]

#ImageClassifierTask:通用的分类任务Task,该Task基于输入的特征,添加一个或多个全连接层来创建一个分类任务用于Fine-tune
task = hub.ImageClassifierTask(
    data_reader=data_reader, #提供数据的reader
    feed_list=feed_list,     #待feed变量的名字列表
    feature=feature_map,     #输入的特征矩阵
    num_classes=dataset.num_labels, #分类任务的类别数量
    config=config)                  #运行配置

 

step5 Fine-tune

#根据config配置进行finetune,并定期进行eval
run_states=task.finetune_and_eval

使用PaddleHub进行图像分类_第3张图片

step 6 预测

当finetune完成后,使用模型进行预测,先获取测试的图片

!wget --no-check-certificate https://paddlehub.bj.bcebos.com/resources/test_img_cat.jpg
!wget --no-check-certificate https://paddlehub.bj.bcebos.com/resources/test_img_dog.jpg
import numpy as np
 
data=["test_img_dog.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 result
  print(batch_result)
  batch_result=np.argmax(batch_result,axis=2)[0]
  print(batch_result)
     for result in batch_result:
     index += 1
     result=label_map[result]
     print("input %i is %s,and the predict result is %s" % 
           (index,data[index - 1],result))

使用PaddleHub进行图像分类_第4张图片

你可能感兴趣的:(学习记录)