深度學(xué)習(xí)入門教程:分類貓和狗
點(diǎn)擊上方“小白學(xué)視覺(jué)”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時(shí)間送達(dá)

想建立和訓(xùn)練一個(gè)深度學(xué)習(xí)模型,以達(dá)到分類貓和狗嗎?你來(lái)對(duì)地方了!
你不需要任何數(shù)學(xué)知識(shí)就可以跟著我。只要高中數(shù)學(xué)和一點(diǎn)python編程經(jīng)驗(yàn)就足夠了!我會(huì)帶你走過(guò)每一步,制作和訓(xùn)練你的第一個(gè)模型。
1.安裝程序
為了簡(jiǎn)單起見(jiàn),我們將在云GPU(什么是GPU)上運(yùn)行我們的模型。你可以看看下面的博客,了解GPU在深度學(xué)習(xí)中的重要性。
https://towardsdatascience.com/what-is-a-gpu-and-do-you-need-one-in-deep-learning-718b9597aa0d
有很多服務(wù)提供免費(fèi)和付費(fèi)的云GPU實(shí)例。我們將使用Gradient,它提供免費(fèi)的GPU和CPU實(shí)例層。我們也將使用fast.ai的vision庫(kù)來(lái)創(chuàng)建我們的模型。
首先,點(diǎn)擊這里創(chuàng)建一個(gè)Gradient帳戶:https://console.paperspace.com/signup?gradient=true
登錄你的帳戶并選擇“Gradient”
單擊“Notebook”
為實(shí)例命名(可選)
選擇Paperspace + Fast.AI基本容器

選擇任意一個(gè)免費(fèi)的GPU實(shí)例

單擊“Create Notebook”

你的Notebook 將從掛起→設(shè)置→運(yùn)行!
單擊“OPEN V1(CLASSIC)”按鈕
對(duì)于這個(gè)模型,我們將從Bing和DuckDuckGo上獲取圖像,它們將作為我們的數(shù)據(jù)集。我們將安裝Joe Dockrill編寫的jmd_imagescraper庫(kù),這將為我們完成任務(wù)。
單擊 New →Terminal.

鍵入并單擊enter:
!pip install -q jmd_imagescraper
有關(guān)庫(kù)的更多信息,請(qǐng)?jiān)L問(wèn)其官方頁(yè)面::https://joedockrill.github.io/blog/2020/09/18/jmd-imagescraper-library/
這就把我們帶到了設(shè)置的最后。關(guān)閉終端,再次打開(kāi)Notebook。編碼時(shí)間到了!
Jupyter Notebook
Jupyter Notebook是一個(gè)web應(yīng)用程序,允許你創(chuàng)建包含實(shí)時(shí)代碼、公式和文本的文檔。你可以做任何事情,從編寫代碼到發(fā)布,以及使用Voilá構(gòu)建獨(dú)立的web應(yīng)用程序!我們將在Gradient提供的Jupyter Notebook上編寫和執(zhí)行我們的代碼。
Jupyter Notebook由許多單元組成。你可以通過(guò)確定執(zhí)行單元格的順序來(lái)控制工作流。
單擊New→Python3打開(kāi)一個(gè)新的Notebook。

你可以編寫文本(在標(biāo)記單元格中)或編寫python代碼(在代碼單元格中)并按如下方式執(zhí)行:

一直玩到你覺(jué)得舒服為止。使用Run和add cells選項(xiàng)分別執(zhí)行代碼和添加更多單元格。


2.代碼
讓我們開(kāi)始有趣的事情,好嗎?你可以把每個(gè)代碼塊復(fù)制到不同的單元上,然后和我一起運(yùn)行它們。
讓我們先導(dǎo)入fast.ai的vision庫(kù)和jmd_imagescraper。
!pip install -Uqq fastbook
import fastbook # 導(dǎo)入fast.ai庫(kù)
from fastbook import * # 別擔(dān)心,它被設(shè)計(jì)成與import *一起工作
fastbook.setup_book()
from fastai.vision.widgets import *
# 導(dǎo)入圖片爬取器, website: https://joedockrill.github.io/blog/2020/09/18/jmd-imagescraper-library/
from jmd_imagescraper.core import *
from pathlib import Path
from jmd_imagescraper.imagecleaner import *
因?yàn)槲覀兊哪繕?biāo)是對(duì)貓和狗的圖像進(jìn)行分類,所以我們可以制作一個(gè)名為“animals”的文件夾,我們可以下載并保存我們的圖像。
最后一行將path變量設(shè)置為當(dāng)前工作目錄中的“animals”文件夾。
animals=['cat','dog']
path = Path().cwd()/"animals"# 指定當(dāng)前工作目錄的路徑
從jmd_imagescraper庫(kù)調(diào)用duckduckgo_search()函數(shù),該函數(shù)接受以下內(nèi)容作為輸入:
下載目錄(上面指定的路徑變量)
文件夾名稱(cat)
搜索DuckDuckGo(“貓”)的關(guān)鍵字
要下載的圖像數(shù)(100)
duckduckgo_search(path,"cat","cats",max_results=100) # 下載100張“貓”圖片并保存到path/cat中
等到它搜索圖像,下載并直接保存到“animals”中名為“cat”的文件夾中。結(jié)果應(yīng)該如下所示:

現(xiàn)在讓我們對(duì)狗的圖像做同樣的處理。
duckduckgo_search(path,"dog","dogs",max_results=100)# 下載100張“狗”圖片并保存到path/dog中
通常會(huì)有一些不相關(guān)的圖像,這會(huì)妨礙我們的訓(xùn)練,所以我們刪除個(gè)別文件。Jupyter提供了一個(gè)與刪除無(wú)關(guān)圖像的交互式GUI。
display_image_cleaner(path)

在文件夾之間切換并刪除不相關(guān)的圖像。我發(fā)現(xiàn)了一些像這樣的圖片偷偷地進(jìn)入了貓和狗。

fns=get_image_files(path)
fns
查找失敗的下載并從文件夾中取消鏈接
failed=verify_images(fns)# 尋找非圖像文件
failed
failed.map(Path.unlink);# 從文件夾中取消失敗文件的鏈接
現(xiàn)在讓我們創(chuàng)建一個(gè)Datablock對(duì)象,它將圖像發(fā)送到DataLoaders類。DataLoaders類將給定的數(shù)據(jù)轉(zhuǎn)換為學(xué)習(xí)者可以解釋的信息。
直覺(jué)上,學(xué)習(xí)者是一個(gè)觀察所有給定圖像并找到模式的人。如果遇到復(fù)雜的關(guān)鍵字,不要擔(dān)心。一旦你運(yùn)行模型,一切都會(huì)變得有意義。
animals=DataBlock(
blocks=(ImageBlock,CategoryBlock),
get_items=get_image_files,
splitter=RandomSplitter(valid_pct=0.2,seed=42),# 將數(shù)據(jù)集拆分為訓(xùn)練集和驗(yàn)證集
get_y=parent_label,
item_tfms=RandomResizedCrop(224, min_scale=0.5),
batch_tfms=aug_transforms())
需要注意的是,在第4行中,我們保留了20%的數(shù)據(jù),以便在每個(gè)稱為epoch訓(xùn)練結(jié)束時(shí)檢查我們的模型。
創(chuàng)建一個(gè)名為dls的DataLoaders對(duì)象。
dls=animals.dataloaders(path)
看看dls對(duì)象中單個(gè)批處理中的幾個(gè)圖像。
dls.valid.show_batch(max_n=4,nrows=1)

要求一個(gè)學(xué)習(xí)者在4個(gè)不同的訓(xùn)練迭代或時(shí)期中根據(jù)輸入圖像進(jìn)行學(xué)習(xí)。這需要一些時(shí)間,這取決于你的網(wǎng)絡(luò)速度。
learn = cnn_learner(dls, resnet18, metrics=error_rate)# 訓(xùn)練我們的模型
learn.fine_tune(4)

你可能不會(huì)看到與圖像中相同的結(jié)果,但是錯(cuò)誤率應(yīng)該小于0.05。
現(xiàn)在,讓我們?yōu)轵?yàn)證集繪制一個(gè)混淆矩陣?;煜仃嚫嬖V我們驗(yàn)證集中有多少圖像被正確或錯(cuò)誤地分類。
interp = ClassificationInterpretation.from_learner(learn)
interp.plot_confusion_matrix()# 繪制混淆矩陣

混淆矩陣說(shuō)明我們的分類器有多好。深藍(lán)色對(duì)角線上顯示的數(shù)字告訴我們正確預(yù)測(cè)圖像的數(shù)量。因此我們的分類器做得很好!
我們將在下一行代碼中看到兩幅錯(cuò)誤預(yù)測(cè)的圖片。
interp.plot_top_losses(5, nrows=1)

現(xiàn)在讓我們對(duì)我們的模型進(jìn)行真正的測(cè)試,好嗎?下載你選擇的貓或狗圖像并保存在本地。
learn.export()
path = Path()
path.ls(file_exts='.pkl')
learn_inf = load_learner(path/'export.pkl')
btn_upload = widgets.FileUpload()# 顯示可用于從系統(tǒng)上傳圖像的小部件
btn_upload
這將在你的Jupyter Notebook中創(chuàng)建一個(gè)小部件,如下所示:

點(diǎn)擊上傳并選擇你的圖片。
現(xiàn)在,讓我們調(diào)整圖像大小,以便我們的模型可以預(yù)測(cè)。最后一行顯示調(diào)整大小的圖像。
img = PILImage.create(btn_upload.data[-1])
out_pl = widgets.Output()
out_pl.clear_output()
with out_pl: display(img.to_thumb(128,128))# 調(diào)整圖像的大小
out_pl

下面的代碼預(yù)測(cè)圖像中的動(dòng)物,并以我們可以理解的格式顯示它。
pred,pred_idx,probs = learn_inf.predict(img)# 要求模型預(yù)測(cè)圖像中的動(dòng)物!
lbl_pred = widgets.Label()
lbl_pred.value = f'Prediction: {pred}; Probability: {probs[pred_idx]:.04f}'# 以可讀格式顯示輸出
lbl_pred
……………….

不錯(cuò)?。。?/p>
我們只用了大約200張圖片,就可以創(chuàng)建一個(gè)可以對(duì)貓和狗進(jìn)行分類的模型?,F(xiàn)在你可以繼續(xù)進(jìn)行更改以創(chuàng)建分類器!你也可以使用三個(gè)或更多類別。
好消息!
小白學(xué)視覺(jué)知識(shí)星球
開(kāi)始面向外開(kāi)放啦??????
下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程 在「小白學(xué)視覺(jué)」公眾號(hào)后臺(tái)回復(fù):擴(kuò)展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺(jué)、目標(biāo)跟蹤、生物視覺(jué)、超分辨率處理等二十多章內(nèi)容。 下載2:Python視覺(jué)實(shí)戰(zhàn)項(xiàng)目52講 在「小白學(xué)視覺(jué)」公眾號(hào)后臺(tái)回復(fù):Python視覺(jué)實(shí)戰(zhàn)項(xiàng)目,即可下載包括圖像分割、口罩檢測(cè)、車道線檢測(cè)、車輛計(jì)數(shù)、添加眼線、車牌識(shí)別、字符識(shí)別、情緒檢測(cè)、文本內(nèi)容提取、面部識(shí)別等31個(gè)視覺(jué)實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺(jué)。 下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講 在「小白學(xué)視覺(jué)」公眾號(hào)后臺(tái)回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講,即可下載含有20個(gè)基于OpenCV實(shí)現(xiàn)20個(gè)實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。 交流群
歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺(jué)、傳感器、自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN、算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺(jué)SLAM“。請(qǐng)按照格式備注,否則不予通過(guò)。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~

