快速上手百度大腦EasyDL專業版·物體檢測模型(附代碼)

作者:才能我浪費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進行學習討論。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章