一、簡介:算法
1.1 什麼是EasyDL專業版編程
EasyDL專業版是EasyDL在2019年10月下旬全新推出的針對AI初學者或者AI專業工程師的企業用戶及開發者推出的AI模型訓練與服務平臺,目前支持視覺及天然語言處理兩大技術方向,內置百度海量數據訓練的預訓練模型,可靈活腳本調參,只需少許數據可達到優模型效果。json
適用人羣windows
專業AI工程師且追求靈活、深度調參的企業或我的開發者網絡
支持定製模型類型app
支持視覺及天然語言處理兩大技術方向框架
視覺:支持圖像分類及物體檢測兩類模型訓練工具
任務類型 預置算法學習
圖像分類 Resnet(50,101)、Se_Resnext(50,101)、Mobilenet Nasnet測試
物體檢測 FasterRCNN、YoloV三、mobilenetSSD
天然語言處理:支持文本分類及短文本匹配兩類模型訓練,內置百度百億級數據所訓練出的預訓練模型ENNIE.
ERNIE(艾尼)是百度自研持續學習語義理解框架,該框架可持續學習海量數據中的知識。基於該框架的ERNIE2.0預訓練模型,已累計學習10億多知識,中英文效果全面領先,適用於各種NLP應用場景。
任務類型 預置網絡
文本分類 BOW、CNN、GRU、TextCNN、LSTM、BiLSTM
短文本匹配 SimNet(BOW、CNN、GRU、LSTM)、FC
1.2 EasyDL專業版特色
預置百度百億級數據規模的預訓練模型,包括豐富的視覺模型及天然語言處理模型ERNIE,訓練效果更突出。
對比經典版,支持代碼級調整模型參數和模型結構,封裝底層算法邏輯細節,代碼行數更少,更易有算法基礎的開發者上手。
支持從數據管理,模型訓練到模型部署一站式AI服務
若是說EasyDL經典版是倚天劍,PaddlePaddle是屠龍刀,那麼EasyDL專業版就是刀劍合璧。
1.3 評測案例
該應用爲一個特種車輛識別的應用,主要識別郵車和消防車,將來能夠擴展加入更多的車輛種類,對於特種車輛管理有很好的應用價值。
二、訓練及目標檢測:
2.0 總體說明
EasyDL專業版的工做流程以下圖所示:
EasyDL專業版的主界面以下圖所示:
業務需求:
須要對各類特種車輛進行識別,在本評測中爲郵車、消防車兩種。
2.1 上傳並標註數據
首先須要創建特種車輛數據集,在主界面上點擊「數據管理/標註」就能夠進入數據管理界面,具體步驟以下
① 設計標籤
在上傳以前肯定想要識別哪幾種物體,並上傳含有這些物體的圖片。每一個標籤對應想要在圖片中識別出的一種物體。在本例中只有2個標籤,就是郵車和消防車。例如
② 準備圖片
基於設計好的標籤準備圖片:
每種要識別的物體在全部圖片中出現的數量最好大於50
若是某些標籤的圖片具備類似性,須要增長更多圖片
一個模型的圖片總量限制4張~10萬張
圖片格式要求:
一、目前支持圖片類型爲png、jpg、bmp、jpeg,圖片大小限制在4M之內
二、圖片長寬比在3:1之內,其中最長邊小於4096px,最短邊大於30px
圖片內容要求:
一、訓練圖片和實際場景要識別的圖片拍攝環境一致,舉例:若是實際要識別的圖片是攝像頭俯拍的,那訓練圖片就不能用網上下載的目標正面圖片
二、每一個標籤的圖片須要覆蓋實際場景裏面的可能性,如拍照角度、光線明暗的變化,訓練集覆蓋的場景越多,模型的泛化能力越強
本例中從網上找了30多張不一樣角度的特種車輛圖片。(由於是測試版,因此圖片較少,實際應用的時候每種標籤的圖片不該少於50)
③上傳和標註圖片
先在【建立數據集】頁面建立數據集:
若是訓練數據須要多人分工標註,能夠建立多個數據集。將訓練數據分批上傳到這些數據集後,再將數據集"共享"給本身的小夥伴,同步進行標註。
再進入【數據標註/上傳】:
一、選擇數據集
二、上傳已準備好的圖片
三、在標註區域內進行標註
首先在標註框上方找到工具欄,點擊標註按鈕在圖片中拖動畫框,圈出要識別的目標,以下圖所示:
而後在右側的標籤欄中,增長新標籤,或選擇已有標籤
2.二、建立項目和任務
在主界面點擊「所有訓練任務」便可進入項目界面:
點擊新建項目,填寫相關信息信息,便可建立項目。
在本次評測中咱們使用物體檢測
建立項目後在新建的項目內選擇建立任務,以創建一個新的任務:
按要求輸入信息,數據集及驗證集選擇咱們上一步創建的數據集youche和youchevalid。
網絡方面,由於咱們此次主要是對位置進行確認,對BoundingBox要求不高,因此先選用YOLO。
你們看腳本編輯框裏面的內容能夠發現就是採用PaddlePaddle實現模型功能的Python代碼。點擊腳本編輯框裏面的當即編輯按鈕能夠對生成的腳本進行編輯,方便進行客戶化的定製。
選擇保存就能夠將任務保存。
2.3 訓練模型
在任務界面中點擊提交訓練任務,就能夠開始訓練模型,由於咱們此次準備的數據很少,因此有一個提示,點擊繼續訓練就好:
運行開始後能夠看到本任務的狀態爲運行中:
能夠點擊日誌,查看運行狀況:
訓練時間與數據量大小有關,1000張圖片可能須要幾個小時訓練,不過本評測案例由於只有不到40張圖,因此速度很快。運行成功有界面如圖:
2.4 校驗模型效果
可經過模型評估報告或模型校驗瞭解模型效果:
選擇一張測試圖:
感受效果還能夠,雖然BoundingBox有點誤差,不過主要是由於訓練集過小以及採用了追求速度的YOLO算法。若是增長訓練集以及採用FastRCNN會有不小的提高。
還能夠選擇「模型效果」查看模型信息:
2.5 模型部署
爲了應用模型,須要對模型進行部署,點擊「部署」按鈕進入部署界面:
本次選擇公有云部署,錄入相關的信息,發佈模型生成在線API:
發佈後的服務,能夠在「個人服務」中進行查看,修改:
2.6 接口賦權
在正式使用以前,還須要作的一項工做爲接口賦權,須要登陸EasyDL控制檯中建立一個應用,得到由一串數字組成的appid,而後就能夠參考接口文檔正式使用了
也能夠直接點擊服務界面的"當即使用"進入賦權界面:
三、測試不一樣算法:
如今物體檢測支持 FasterRCNN、YoloV三、mobilenetSSD,三種算法。咱們在第2章使用的是YoloV3,在本章咱們將對其餘兩種算法創建不一樣版本的服務,並互相進行對比。
3.1 算法簡介:
目標檢測能夠理解爲是物體識別和物體定位的綜合,不只僅要識別出物體屬於哪一個分類,更重要的是獲得物體在圖片中的具體位置。由於具體算法內容很長,在這裏只能進行一個簡單的說明。
爲了完成這兩個任務,目標檢測模型分爲兩類。一類是two-stage,將物體識別和物體定位分爲兩個步驟,分別完成,這一類的典型表明是R-CNN, fast R-CNN, faster-RCNN家族。他們識別錯誤率低,漏識別率也較低,但速度較慢,不能知足實時檢測場景。爲了解決這一問題,另外一類方式出現了,稱爲one-stage, 典型表明是Yolo, SSD, YoloV2, YoloV3等。他們識別速度很快,能夠達到實時性要求,並且準確率也基本能達到faster R-CNN的水平。
Faster R-CNN準確率mAP較高,漏檢率recall較低,但速度較慢。而yolo則相反,速度快,但準確率和漏檢率不盡人意。SSD綜合了他們的優缺點。它的貢獻在於它利用了多層網絡特徵,而不只僅是FC7。
3.2 V2版(Fast RCNN):
在任務界面選擇新建任務:
具體操做參考第2章的內容便可,區別在於網絡選擇Faster_R-CNN-ResNet50-FPN。訓練後的模型效果以下所示:
能夠發如今評測集上,FasterRCNN算法的效果很好,讓咱們驗證一下具體的效果。選擇與V1版同樣的圖片進行驗證,效果以下:
能夠看到,效果的確比YOLOV3的效果要好一些,圈取的內容更加準確。
3.2 V3版(SSD):
具體操做參考第2章的內容便可,區別在於網絡選擇SSD。訓練後的模型效果以下所示:
選擇與V1版同樣的圖片進行驗證,效果以下:
四、應用評測及結論:
4.1 評測代碼
按照服務API的說明,針對V1版(YOLOV3)的服務,編寫調用代碼(Python3)。須要注意的是與其餘圖像識別服務不一樣的是定製化圖像識別服務以json方式請求。
Body請求示例:
{
"image": ""
}
具體代碼以下:
import urllib
import base64
import json
import time
import urllib3
#獲取token
def get_token():
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + client_id + '&client_secret=' + client_secret
request = urllib.request.Request(host)
request.add_header('Content-Type', 'application/json; charset=UTF-8')
response = urllib.request.urlopen(request)
token_content = response.read()
#print (token_content)
if token_content:
token_info = json.loads(token_content)
token_key = token_info['access_token']
return token_key
#保存圖片
def save_base_image(img_str,filename):
img_data = base64.b64decode(img_str)
with open(filename, 'wb') as f:
f.write(img_data)
#畫識別結果
def draw_result(originfilename,results,resultfilename,fontsize):
from PIL import Image, ImageDraw,ImageFont
image_origin = Image.open(originfilename)
draw =ImageDraw.Draw(image_origin)
setFont = ImageFont.truetype('C:/windows/fonts/simhei.ttf', fontsize)
for result in results:
location=result['location']
draw.rectangle((location['left'],location['top'],location['left']+location['width'],location['top']+location['height']),outline = "red")
draw.text((location['left'],location['top']), result['name']+', Score:'+str(round(result['score'],3)),"blue",font=setFont)
image_origin.save(resultfilename, "JPEG")
def specialcar(filename,resultfilename,fontsize):
url = "https://aip.baidubce.com/rpc/2.0/ai_custom_pro/v1/detection/specialcar"
# 二進制方式打開圖片文件
f = open(filename, 'rb')
img = base64.b64encode(f.read())
access_token = get_token()
url=url+'?access_token='+access_token
begin = time.perf_counter()
#img參數進行一下str轉換
params={'image':''+str(img,'utf-8')+''}
#對參數params數據進行json處理
encoded_data = json.dumps(params).encode('utf-8')
request=urllib3.PoolManager().request('POST',
url,
body=encoded_data,
headers={'Content-Type':'application/json'})
#對返回的byte字節進行處理。Python3輸出位串,而不是可讀的字符串,須要進行轉換
content = str(request.data,'utf-8')
end = time.perf_counter()
print('處理時長:'+'%.2f'%(end-begin)+'秒')
if content:
#print(content)
data = json.loads(content)
#print(data)
results=data['results']
print(results)
draw_result(filename,results,resultfilename,fontsize)
4.2 測試結果:
首先是消防車及識別結果::
郵車及識別結果:
速度很是快,效果也很不錯,雖然BoundingBox有點誤差,不過主要是由於訓練集過小以及採用了追求速度的YOLO算法。若是增長訓練集以及採用FastRCNN會有不小的提高。
4.3 評測結論
EasyDL專業版是我很是喜歡的一個功能,它將EasyDL圖形開發的易用性及編程的靈活性結合在一塊兒。在提供了不少便利的同時,又將控制權交給了客戶,讓客戶能夠更加靈活的使用深度學習技術,激發無限的可能。感受很是的棒,後續我準備增長訓練集再試一下,看看能提升多少,而後再嘗試一下離線部署成Docker的效果,建議你們都試一下。
評測後有一些優化建議:
但願百度後續能增長更多的模型,好比Mask RCNN等;
但願能支持不規則形狀的BoundingBox。
但願後續支持數據導入功能,將線下已經打好標的數據直接導入。
建議在主界面的「個人數據」Tab頁面裏面增長新增功能,方便操做。