在「從零開始學Flask」中學到了Flask的基礎知識,而在這個教學中我們將會應用這些知識。我學習Flask最主要的原因就是希望能夠將深度學習模型與API串接在一起,來達到更多的應用。這也是現在許多公司認為應該要有的技能,因此這個教學中我們會學習將深度學習模型串接API,來建立一個用來辨識的API。
我是根據Deploying Deep Learning Model using Flask API這篇文章進行修改。由於我習慣用pytorch,但文章內是使用tensorflow,所以我對一些部分進行修改。如果想使用tensorflow可查閱上面那篇文章。
建立一個ImageNet的辨識API,模型使用pytorch預訓練好的ResNet50,如下圖所示。
初始網頁
辨識結果
我是使用PyTorch透過ImageNet預訓練好的ResNet50,這個模型的辨識類別共有1000類,詳細的說明可查閱相關文件。由於是使用PyTorch提供的模型,所以可以直接在程式中載入。
app.py
主要API程式接下來我們會說明app.py
,再來說明home.html
與predict.html
。
app.py
是主要用來建立辨識API的檔案,其中包含一些我們會用到的methods:
read_image(): 用來讀取影像,並進行影像前處理。其中包含了torch.stack
,用來將tensor大小轉為[batch, 3, 244, 244]
allow_file(): 用來確認影像的副檔名是否為jpg, jpeg, png。
homeapge(): 用來呼叫初始頁面(home.html
),其url設定為/
predict(): 用來辨識影像的類別,並將辨識結果傳至predict.html
。
第15-19行是用來進行影像前處理的方法,包含Resize
,ToTensor
,Normalize
。
第21-22行是將imagenet-classes.txt
中的類別轉成list
,以便之後讀取類別名稱。
第62行會將classes
和file_path
傳到predict.html
,用於之後顯示於網頁上。
用來呈現我們辨識API的初始頁面,我們會接收到從user中上傳的input,也就是要辨識的影像。
第16-19行會將上傳的影像傳到app.py
中的predict()
進行處理及辨識。
這是辨識API的result page。當在初始頁面按下predict
按鈕時,會將影像傳到app.py
中的predict()
進行處理及辨識。最後將結果呈現在這個頁面。
第16-19行同樣會將上傳的影像傳到app.py
中的predict()
進行處理及辨識。
第21-25行用來接收從app.py
中的predict()
傳來的file_path
,並進行呈現。
第26-28行用來接收從app.py
中的predict()
傳來的classes
,並進行呈現。
執行app.py
之後,在terminal或cmd會得到這個output
接著複製url(http://127.0.0.1:5000),並貼上瀏覽器。接著將影像上傳至初始頁面,並按下predict
按鈕。模型就會開始進行辨識,最後將結果呈現在頁面上囉!