【飛槳深度學習 && 百度七日打卡 && Python小白逆襲大神】Day4:《青春有你2》選手識別

在這裏插入圖片描述

任務簡介:

圖像分類是計算機視覺的重要領域,它的目標是將圖像分類到預定義的標籤。近期,許多研究者提出很多不同種類的神經網絡,並且極大的提升了分類算法的性能。本文以自己創建的數據集:青春有你2中選手識別爲例子,介紹如何使用 PaddleHub 進行圖像分類任務

思路:

準備工作:

#CPU環境啓動請務必執行該指令
%set_env CPU_NUM=1 

#安裝paddlehub
!pip install paddlehub==1.6.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

加載數據文件:
圖片信息可以自己上傳到目錄下,進行調用,也可以爬取網上圖片直接存儲到目錄下進行調用

import paddlehub as hub

加載預訓練模型:

在PaddleHub中選擇合適的預訓練模型來Finetune,由於是圖像分類任務,因此我們使用經典的ResNet-50作爲預訓練模型。PaddleHub提供了豐富的圖像分類預訓練模型,包括了最新的神經網絡架構搜索類的PNASNet,推薦嘗試不同的預訓練模型來獲得更好的性能

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 = "dataset"
       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()

生成數據讀取器:

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=False,                              #是否使用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())  #Fine-tune優化策略;

組建Finetune Task:

有了合適的預訓練模型和準備要遷移的數據集後,我們開始組建一個Task。
由於該數據設置是一個二分類的任務,而我們下載的分類module是在ImageNet數據集上訓練的千分類模型,所以我們需要對模型進行簡單的微調,把模型改造爲一個二分類模型:
1、獲取module的上下文環境,包括輸入和輸出的變量,以及Paddle Program;
2、從輸出變量中找到特徵圖提取層feature_map;
3、在feature_map後面接入一個全連接層,生成Task;


input_dict, output_dict, program = module.context(trainable=False)
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)

開始Finetune:

run_states = task.finetune_and_eval()

使用 finetune_and_eval 接口來進行模型訓練,這個接口在finetune的過程中,會週期性的進行模型效果的評估,以便我們瞭解整個訓練過程的性能變化

預測:

之後可以使用模型來進行預測,先通過以下命令來獲取測試的圖片

import numpy as np
import matplotlib.pyplot as plt 
import matplotlib.image as mpimg

with open("dataset/test.txt","r") as f:
    filepath = f.readlines()

data = [filepath[0].split(" ")[0],filepath[1].split(" ")[0],filepath[2].split(" ")[0],filepath[3].split(" ")[0],filepath[4].split(" ")[0]]

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 += 1
        result = label_map[result]
        print("input %i is %s, and the predict result is %s" %
              (index, data[index - 1], result))

效果展示:

在這裏插入圖片描述
識別率達到80%,有待提高,不過也不錯了!

♥ 喜 歡 請 點 贊 喲 ♥
(●ˇ∀ˇ●)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章