作者:才能我浪費99
1. 簡介:
1.1. 什么是EasyDL專業版
EasyDL專業版是EasyDL在2019年10月下旬全新推出的針對AI初學者或者AI專業工程師的企業用戶及開發者推出的AI模型訓練與服務平台,目前支持視覺及自然語言處理兩大技術方向,內置百度海量數據訓練的預訓練模型,可靈活腳本調參,只需少量數據可達到優模型效果。
適用人群:
專業AI工程師且追求靈活、深度調參的企業或個人開發者
支持定制模型類型。
1.2. 支持視覺及自然語言處理兩大技術方向:
視覺:支持圖像分類及物體檢測兩類模型訓練。
任務類型: 預置算法
圖像分類: Resnet(50,101)、Se_Resnext(50,101)、Mobilenet Nasnet
物體檢測: FasterRCNN、YoloV3、mobilenetSSD
自然語言處理:支持文本分類及短文本匹配兩類模型訓練,內置百度百億級數據所訓練出的預訓練模型ENNIE.
ERNIE(艾尼)是百度自研持續學習語義理解框架,該框架可持續學習海量數據中的知識。基於該框架的ERNIE2.0預訓練模型,已累計學習10億多知識,中英文效果全面領先,適用於各類NLP應用場景。
任務類型 :預置網絡
文本分類: BOW、CNN、GRU、TextCNN、LSTM、BiLSTM
短文本匹配:SimNet(BOW、CNN、GRU、LSTM)、FC
1.3. EasyDL專業版特點
預置百度百億級數據規模的預訓練模型,包括豐富的視覺模型及自然語言處理模型ERNIE,訓練效果更突出。
對比經典版,支持代碼級調整模型參數和模型結構,封裝底層算法邏輯細節,代碼行數更少,更易有算法基礎的開發者上手。
支持從數據管理,模型訓練到模型部署一站式AI服務。
如果說EasyDL經典版是倚天劍,PaddlePaddle是屠龍刀,那么EasyDL專業版就是刀劍合璧。
2. 評測案例
該應用為一個特種車輛識別的應用,主要識別郵車和消防車,未來可以擴展加入更多的車輛種類,對於特種車輛管理有很好的應用價值。
2.1. 整體說明
EasyDL專業版的工作流程如下圖所示:

EasyDL專業版的主界面如下圖所示:

2.2. 業務需求:
需要對各種特種車輛進行識別,在本評測中為郵車、消防車兩種。
2.3. 上傳並標注數據:
首先需要建立特種車輛數據集,在主界面上點擊“數據管理/標注”就可以進入數據管理界面,具體步驟如下:
1.設計標簽
在上傳之前確定想要識別哪幾種物體,並上傳含有這些物體的圖片。每個標簽對應想要在圖片中識別出的一種物體。在本例中只有2個標簽,就是郵車(標簽:youche)和消防車(標簽:xiaofang)。
例如:

2.准備圖片
基於設計好的標簽准備圖片:
每種要識別的物體在所有圖片中出現的數量最好大於50
如果某些標簽的圖片具有相似性,需要增加更多圖片
一個模型的圖片總量限制4張~10萬張
圖片格式要求:
• 目前支持圖片類型為png、jpg、bmp、jpeg,圖片大小限制在4M以內
• 圖片長寬比在3:1以內,其中最長邊小於4096px,最短邊大於30px
圖片內容要求:
• 訓練圖片和實際場景要識別的圖片拍攝環境一致,舉例:如果實際要識別的圖片是攝像頭俯拍的,那訓練圖片就不能用網上下載的目標正面圖片。
• 每個標簽的圖片需要覆蓋實際場景里面的可能性,如拍照角度、光線明暗的變化,訓練集覆蓋的場景越多,模型的泛化能力越強。
本例中從網上找了30多張不同角度的特種車輛圖片。(因為是測試版,所以圖片較少,實際應用的時候每種標簽的圖片不應少於50)

3. 上傳和標注圖片
先在【創建數據集】頁面創建數據集:
如果訓練數據需要多人分工標注,可以創建多個數據集。將訓練數據分批上傳到這些數據集后,再將數據集"共享"給自己的小伙伴,同步進行標注。
再進入【數據標注/上傳】:
1、選擇數據集
2、上傳已准備好的圖片
3、在標注區域內進行標注
首先在標注框上方找到工具欄,點擊標注按鈕在圖片中拖動畫框,圈出要識別的目標。
如下圖所示:

然后在右側的標簽欄中,增加新標簽,或選擇已有標簽
2.4. 創建項目和任務
在主界面點擊“全部訓練任務”即可進入項目界面:

點擊新建項目,填寫相關信息信息,即可創建項目。

在本次評測中我們使用物體檢測。

創建項目后在新建的項目內選擇創建任務,以建立一個新的任務:

按要求輸入信息,數據集及驗證集選擇我們上一步建立的數據集youche和youchevalid。

網絡方面,因為我們這次主要是對位置進行確認,對BoundingBox要求不高,所以先選用YOLO。

大家看腳本編輯框里面的內容可以發現就是采用PaddlePaddle實現模型功能的Python代碼。點擊腳本編輯框里面的立即編輯按鈕可以對生成的腳本進行編輯,方便進行客戶化的定制。
選擇保存就可以將任務保存。
2.5. 訓練模型
在任務界面中點擊提交訓練任務,就可以開始訓練模型,因為我們這次准備的數據不多,所以有一個提示,點擊繼續訓練就好:

運行開始后可以看到本任務的狀態為運行中:

可以點擊日志,查看運行情況:

訓練時間與數據量大小有關,1000張圖片可能需要幾個小時訓練,不過本評測案例因為只有不到40張圖,所以速度很快。運行成功有界面如圖:

2.6. 校驗模型效果
可通過模型評估報告或模型校驗了解模型效果:

選擇一張測試圖:


感覺效果還可以,雖然BoundingBox有點偏差,不過主要是因為訓練集太小以及采用了追求速度的YOLO算法。如果增加訓練集以及采用FastRCNN會有不小的提升。
還可以選擇“模型效果”查看模型信息:


2.7. 模型部署
為了應用模型,需要對模型進行部署,點擊“部署”按鈕進入部署界面:

本次選擇公有雲部署,錄入相關的信息,發布模型生成在線API:


發布后的服務,可以在“我的服務”中進行查看,修改:

2.8. 接口賦權
在正式使用之前,還需要做的一項工作為接口賦權,需要登錄EasyDL控制台中創建一個應用,獲得由一串數字組成的appid,然后就可以參考接口文檔正式使用了
也可以直接點擊服務界面的"立即使用"進入賦權界面:

3. 測試不同算法:
現在物體檢測支持 FasterRCNN、YoloV3、mobilenetSSD,三種算法。我們在第2章使用的是YoloV3,在本章我們將對其他兩種算法建立不同版本的服務,並互相進行對比。
3.1. 算法簡介:
目標檢測可以理解為是物體識別和物體定位的綜合,不僅僅要識別出物體屬於哪個分類,更重要的是得到物體在圖片中的具體位置。因為具體算法內容很長,在這里只能進行一個簡單的說明。
為了完成這兩個任務,目標檢測模型分為兩類。一類是two-stage,將物體識別和物體定位分為兩個步驟,分別完成,這一類的典型代表是R-CNN, fast R-CNN, faster-RCNN家族。他們識別錯誤率低,漏識別率也較低,但速度較慢,不能滿足實時檢測場景。為了解決這一問題,另一類方式出現了,稱為one-stage, 典型代表是Yolo, 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.3. V3版(SSD):
具體操作參考第2章的內容即可,區別在於網絡選擇SSD。訓練后的模型效果如下所示:


選擇與V1版一樣的圖片進行驗證,效果如下:


4. 應用評測及結論
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算法。如果增加訓練集以及采用FasterRCNN會有不小的提升。
4.3. 評測結論
EasyDL專業版定會是深度學習開發者非常喜歡的一個功能,它將EasyDL圖形開發的易用性及編程的靈活性結合在一起。在提供了很多便利的同時,又將控制權交給了客戶,讓客戶可以更加靈活的使用深度學習技術,激發無限可能,感覺非常棒。后續我准備增加訓練集再試一下,看看能提高多少,然后再嘗試一下離線部署成Docker的效果,建議大家都試一下。
4.4. 評測后的優化建議:
希望百度后續能增加更多的模型,比如Mask RCNN等;
希望能支持不規則形狀的BoundingBox。
希望后續增加數據導入導出功能。
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
近期《百度大腦EasyDL深度實戰營》專業版課程從3月4日至25日,每周三/四 晚8點在線直播,感興趣的同學可以加入專業版QQ群:868826008進行學習討論。

