如何基於飛槳打造智能眼鏡視覺輔助系統

目前中國視障人士數量多達700萬,佔全世界視障人士總數的18%。此外,全國還有約1200萬弱視人羣,二者總和約佔全國總人口的1.5%。嚴重的視覺障礙給他們平常生活帶來了巨大困難。視障人羣須要專人陪同,或藉助輔助工具例如導盲杖、導盲犬等才能正常生活。這些傳統解決方案,始終存在普及率低、成本高以及使用困難等問題。如何有效助力視障人士平常生活與出行,改善他們的生活質量,是當下全社會亟待解決的問題。ios

圖 1 視障人士的困境(圖片來自網絡)git

 

幸運的是,當前普遍使用的手機芯片,不只具有高效能、超低功耗、開發設計彈性,也知足特殊行業應用的定製系統整合設計需求,所以很是適合用來開發智能出行類產品應用。例如,手機搭配百度端側推理引擎Paddle Lite,不只可以加速設備開發,同時能提供設備持續維護、優化的設計彈性,加上目前手機完善的生態鏈和自身高可靠度表現,可大大下降智能眼鏡設備開發過程的風險。此外,經過設計出合理的並行運算機制,能夠對人工智能算法進一步優化,特別是那些利用深度學習技術進行訓練或推理的場合。百度飛槳支持並行計算,能夠很容易設計出符合要求的系統結構;其豐富的程序資源和硬件支持,能夠知足更普遍的市場需求。github

 

所以,咱們基於人工智能技術,開發出一套視覺輔助智能眼鏡系統。該系統首先經過百度深度學習平臺飛槳進行大規模平常生活環境圖像的訓練,造成服務於視障人士生活與出行的深度神經網絡。接着配合智能眼鏡,採用安卓智能手機做爲運算核心,使用Paddle  Lite做爲智能手機上的人工智能圖像推理平臺,並導入前述網絡配置參數,從而在智能眼鏡系統中實現對視障人士的生活和出行提供輔助。算法

 

用戶佩戴上眼鏡後,語音告訴眼鏡相應的指令,例如,進行物體尋找,經過交互模塊,手機端首先將會處理用戶的語音信號,並執行相應的指令,與此同時,智能眼鏡經過眼鏡鏡架處的攝像頭捕捉周圍的環境,經過通訊模塊傳入手機端,手機採用飛槳生成的深度卷積神經網絡SSD做爲核心算法單元完成畫面中的物體檢測與識別。得到結果之後,將結果經過交互模塊再反饋給用戶。數組

 

01 這個系統是如何實現的?

 

智能眼鏡系統的基本流程以下:網絡

圖2 系統基本流程ide

本系統基於深度學習技術中的深度卷積神經網絡(Deep Convolution Neural Network),以目前通用的平常生活環境圖像爲訓練數據集,開發出一套應用於視障人士的智能服務導航系統。本系統的軟件核心算法經過飛槳進行卷積神經網絡搭建,硬件部分採用安卓智能手機以及配有攝像頭的眼鏡,利用 Paddle  Lite 進行安卓手機端的開發,完成了以下兩方面的設計工做:函數

 

1. 飛槳深度學習算法設計,即經過飛槳生成用於輔助視障人士平常生活和出行的深度神經網絡。工具

 

2. 安卓程序開發,即讀取攝像頭圖像,使用 Paddle Lite在智能手機上進行神經網絡推理等功能開發,最後進行系統測試。性能

 

圖3 利用飛槳和智能眼鏡幫助視障人士進行智能導航

 

02 數據圖像訓練樣本

 

如圖4所示,系統中用於訓練的樣本選用平時經常使用的生活用品,如水杯,瓶子,自行車,汽車等 20 類圖片,其中包含 9963 張標註過的圖片,由訓練集、測試集、驗證集三部分組成,共標註出 24,640 個物體。對於非視覺障礙的人而言,從圖中能夠直觀地分類出這些內容。圖像通過初步的預處理,根據數據集中提供的標記信息,傳入深度卷積神經網絡進行訓練。

 

圖4 訓練樣本圖片示例

 

03 系統實現

 

整個系統由三個交互的主題構成:眼鏡、手機以及用戶,而在具體實現過程當中,咱們將系統分爲以下幾個部分:

一、通訊模塊

二、分析模塊

三、交互模塊

 

其中,通訊模塊負責鏈接眼鏡上的攝像頭進行傳輸,將視頻數據傳給手機端,而交互模塊則完成實時播報和語音交互。而最核心的則爲分析模塊,包含SSD深度神經網絡,用於完成物體檢測與識別,其基本網絡結構如圖所示:

 

圖5 SSD深度神經網絡結構

 

SSD算法的特色在於Single Shot,也就是說只要觀察一次圖片,就可以進行目標檢測和識別,所以算法的效率很是高。SSD網絡屬於典型的迴歸目標檢測算法,具體分爲四個步驟:

 

1. 經過深度神經網絡提取整個圖片的特徵。

2. 對於不一樣尺度的深度特徵圖設計不一樣大小的特徵抓取盒。

3. 經過提取這些特徵抓取盒對應的深度特徵圖的特徵進行目標識別。

4. 在這些識別的結果中經過非極大值抑制選擇最佳的目標識別結果。

 

這裏的多個特徵抓取盒就是多尺度的,換言之,SSD算法的核心思想就是從深度神經網絡的不一樣層來提取特徵,並分別利用這些特徵進行迴歸預測。

 

本系統中,涉及到的SSD算法的代碼部分以下所示:

def ssd_net(self, scale=1.0):
    # 300x300
    tmp = self.conv_bn(self.img, 3, int(32 * scale), 2, 1)
    # 150x150
    tmp = self.depthwise_separable(tmp, 32, 64, 32, 1, scale)
    tmp = self.depthwise_separable(tmp, 64, 128, 64, 2, scale)
    # 75x75
    tmp = self.depthwise_separable(tmp, 128, 128, 128, 1, scale)
    tmp = self.depthwise_separable(tmp, 128, 256, 128, 2, scale)
    # 38x38
    tmp = self.depthwise_separable(tmp, 256, 256, 256, 1, scale)
    tmp = self.depthwise_separable(tmp, 256, 512, 256, 2, scale)




    # 19x19
    for i in range(5):
        tmp = self.depthwise_separable(tmp, 512, 512, 512, 1, scale)
    module11 = tmp
    tmp = self.depthwise_separable(tmp, 512, 1024, 512, 2, scale)




    # 10x10
    module13 = self.depthwise_separable(tmp, 1024, 1024, 1024, 1, scale)
    module14 = self.extra_block(module13, 256, 512, 1, 2)
    # 5x5
    module15 = self.extra_block(module14, 128, 256, 1, 2)
    # 3x3
    module16 = self.extra_block(module15, 128, 256, 1, 2)
    # 2x2
    module17 = self.extra_block(module16, 64, 128, 1, 2)




    mbox_locs, mbox_confs, box, box_var = fluid.layers.multi_box_head(
        inputs=[
            module11, module13, module14, module15, module16, module17
        ],
        image=self.img,
        num_classes=self.num_classes,
        min_ratio=20,
        max_ratio=90,
        min_sizes=[60.0, 105.0, 150.0, 195.0, 240.0, 285.0],
        max_sizes=[[], 150.0, 195.0, 240.0, 285.0, 300.0],
        aspect_ratios=[[2.], [2., 3.], [2., 3.], [2., 3.], [2., 3.],
                       [2., 3.]],
        base_size=self.img_shape[2],
        offset=0.5,
        flip=True)


    return mbox_locs, mbox_confs, box, box_var

 

爲了提高模型性能和加快訓練速度,咱們在主模型中插入了mobileNet預訓練模型,mobileNet模型結構以下:

 

 

在輸出層,將softmax做爲分類輸出函數,損失函數使用交叉熵(cross_entropy)函數,採用在均方根傳遞算法(RMSprop)上改進的適合比較大規模的適合訓練大數據集的階梯階梯型的學習率算法,經過反向傳播來不斷更新模型中的參數,從而使得損失函數逐漸減少來不斷優化模型。

 

04 進行SSD網絡訓練

 

1. 數據準備

對於SSD網絡的訓練,咱們選擇從ImageNet官網下載PASCAL-2012的圖像數據,共計17125張圖片。依7:1:2的比例將數據集分爲訓練集train_dates、驗證集validate_date和測試集test_date, 分別放入到"train" 、 "val" 和」test」目錄中,供以後使用。

 

2. 模型訓練

首先從paddle_model中導入採用已經預訓練好的mobileNet模型,用train中的60000張圖片進行再訓練,設置類別數量class_num = 80, batch_size = 256, 在0.1的learning rate下訓練100個epoch.  而後以7e-5的decay_rate衰減learning_rate,微調模型參數,再訓練100個epoch,最終獲得參數收斂的模型,表示訓練已完成。

圖6. SSD網絡訓練損失與訓練迭代次數之間的關係

能夠看出,在訓練過程當中,儘管在短期跨度內,訓練偏差有着劇烈的波動,但在屢次的迭代下,整體呈現降低的趨勢,並最終趨於穩定。

 

MobileNet模型連接:

https://github.com/PaddlePaddle/models/tree/release/1.7/PaddleCV/image_classification

飛槳模型庫連接:

https://github.com/PaddlePaddle/models

 

3. 系統模型評估

咱們將設計好的眼鏡系統進行性能評估,用於進行測試的物體識別的數據集由 VOC07 與咱們本身拍攝的目標圖像組成。目標檢測的場景爲視障人士平常生活中會遇到的相關場景進行識別,在本系統前期進行深度學習測試的過程當中,採用飛槳所搭建的幾種 SSD 卷積神經網絡分別具備如下幾種測試結果:

 

表1. 模型性能比較

不一樣網絡的資源消耗不一樣,取得的識別結果也不盡相同。考慮到智能手機的資源狀況,咱們選擇MobileNet SSD 做爲核心,其在性能和資源消耗上能夠取得很好的平衡。

 

05 Paddle Lite手機端部署

 

1)模型轉化

 

首先,咱們須要將訓練後的神經網絡模型的格式進行轉化,使其適用於安卓端。對此,咱們採用了百度新推出的爲移動端貼身打造的Paddle Lite,不只能知足以上需求,還能對模型進行壓縮,使其更小更快。

 

咱們採用百度提供的opt對PC端的飛槳模型轉化爲移動端的Paddle  Lite模型,在命令行中輸入如下代碼運行opt進行模型轉換:

./opt \
    --model_dir=<model_param_dir> \
    --model_file=<model_path> \
    --param_file=<param_path> \
    --optimize_out_type=(protobuf|naive_buffer) \
    --optimize_out=<output_optimize_model_dir> \
    --valid_targets=(arm|opencl|x86|npu|xpu) \
    --prefer_int8_kernel=(true|false) \
    --record_tailoring_info =(true|false)

2)在安卓手機中使用Paddle Lite執行預測

 

主要流程有:

(1)導入baidu.paddle.lite Java庫。

(2)利用config.setModelFromFile從路徑中讀取移動端的神經網絡模型,而後將config設置爲預測模型predictor的參數。

(3)把一維float數組格式的輸入input送入預測模型predictor中。

(4)執行predictor.run運行神經網絡進行預測。

(5)最後,將predictor的輸出output以一維float數組格式取出。

 

具體代碼以下:

// 導入Java API
import com.baidu.paddle.lite.MobileConfig;
import com.baidu.paddle.lite.Tensor;
import com.baidu.paddle.lite.PaddlePredictor;
import com.baidu.paddle.lite.PowerMode;


// 1. 寫入配置:設置MobileConfig
MobileConfig config = new MobileConfig();
config.setModelFromFile(<modelPath>); // 設置Paddle Lite模型路徑
config.setPowerMode(PowerMode.LITE_POWER_NO_BIND); // 設置CPU運行模式
config.setThreads(4); // 設置工做線程數


// 2. 建立 PaddlePredictor
PaddlePredictor predictor = PaddlePredictor.createPaddlePredictor(config);


// 3. 設置輸入數據
long[] dims = {100, 100};
float[] inputBuffer = new float[10000];
for (int i = 0; i < 10000; ++i) {
    inputBuffer[i] = i;
}
Tensor input = predictor.getInput(0);
input.resize(dims);
input.setData(inputBuffer);


// 4. 執行預測
predictor.run();


// 5. 獲取輸出數據
Tensor result = predictor.getOutput(0);
float[] output = result.getFloatData();
for (int i = 0; i < 1000; ++i) {
    System.out.println(output[i]);
}

 

接下來,進行了實際場景測試。人的測試場景效果如圖7和圖8所示。

圖7. 測試人物識別(近處場景)

 

圖8. 測試人物識別(遠處場景)

圖9. 眼鏡對於物體的檢測識別結果

 

圖中的方框標識出的物體是經過非極大值抑制進行輸出的結果,也即取出SSD網絡判斷類型置信度最大的方框做爲判斷結果,實驗結果代表,咱們所設計的視覺輔助智能眼鏡系統能夠正確識別出所要檢測的物體和目標。

 

06 應用前景

 

一、社會價值

針對全國數量龐大的視障人士同數量有限、成本昂貴的輔助出行方式之間的矛盾,本做品設計並開發了一套基於飛槳的視覺輔助智能眼鏡系統。該系統不只可以幫助那些視障人士識別平常生活中使用的物體,同時還能快速得到出行指示並有效提示行人。對於提升視障人士的生活質量,下降視障人士生活成本、緩解視障人士出行壓力等方面着重要意義。

 

二、做品特色

 

另外一方面,本系統基於目前人工智能領域比較流行的深度學習技術進行物體圖像識別,做品採用飛槳 深度學習平臺進行深度卷積神經網絡的搭建,飛槳支持算法的高效設計以及深度神經網絡的快速搭建,所以能夠有效下降那些以往只能依賴人爲判斷的工做的複雜度,系統經過智能「學習」不一樣指示標識的特徵,從而使得系統對新的出行指示標識可以進行正確的識別、判斷。所以,本做品所設計的系統不只能夠用於平常生活物品識別,對於其餘一些指示標誌識別也具備必定借鑑意義。

 

三、商業價值

 

最後,本做品所設計的系統硬件部分基於安卓智能手機配合智能眼鏡,這套硬件組合體積小、功耗低,對於視障人士十分便攜。考慮到智能手機的普及程度,本做品所開發的智能眼鏡系統便於推廣,價格低廉,可以普遍深刻到我國的各個地區,特別是偏遠、經濟不發達的地區,爲提升將來視障人士生活質量,出行導航系統的小型化、便攜化奠基了良好的基礎,此外功耗低也能夠知足設備續航能力以及環保節能的需求。

 

更多的實際演示效果能夠參看本系統測試版本的視頻,網址以下:

https://www.bilibili.com/video/av56580392/

 

注:本文示例代碼和視頻所使用的是Paddle Lite早期版本,目前最新版本爲Paddle Lite v2.3,連接:

https://github.com/PaddlePaddle/Paddle-Lite

 

若是想與更多深度學習同窗交流,歡迎加入飛槳官方QQ羣:703252161

 

若是在端側部署中遇到問題,歡迎加入Paddle Lite官方QQ羣與開發人員進行技術交流及問題反饋:696965088

相關文章
相關標籤/搜索