任務簡介:
圖像分類是計算機視覺的重要領域,它的目標是將圖像分類到預定義的標籤。近期,許多研究者提出很多不同種類的神經網絡,並且極大的提升了分類算法的性能。本文以自己創建的數據集:青春有你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%,有待提高,不過也不錯了!
♥ 喜 歡 請 點 贊 喲 ♥ |
(●ˇ∀ˇ●) |