[AI開發]Python+Tensorflow打造本身的計算機視覺API服務

"與其停留在概念理論層面,不如動手去實現一個簡單demo 。"       ——魯迅html

沒有源碼都是耍流氓githubpython

前言git

目前提供AI開發相關API接口的公司有不少,國外如微軟、谷歌,國內的百度、騰訊等都有開放API接口。開發者只須要調用相關接口,幾步就能開發出一個「智能APP」。一般狀況AI接口有如下幾類:程序員

  • 計算機視覺

      圖像分類、圖像目標檢測以及視頻檢測跟蹤等等。這類API主要用於處理圖像和視頻,可以給圖像打tag,並分析視頻圖片中的物體及其對應座標軌跡等。github

  • 語言

      包括天然語言處理,分析天然語言含義,評估情緒等,例如機器翻譯等。web

  • 語音

      將語言音頻轉換爲文本,使用聲音進行驗證,或嚮應用添加說話人識別。 算法

  • 知識

      經過映射覆雜信息和數據來解決任務,例如智能建議和語義搜索。編程

基於Web Service的智能API接口讓咱們不須要了解複雜的機器學習以及數學知識就能輕鬆開發出智能APP。可是,本文將介紹如何徹底本身動手去實現一個智能API接口服務,因爲涉及到的東西很是多,本文僅以我比較熟悉的「計算機視覺」爲例,包含「圖像分類(image classification)」和「目標檢測(target detect)」,以後若是有機會,我會介紹「視頻軌跡跟蹤」相關的東西,大概就是圖像處理的升級版。在開始正文以前,先解釋幾個名詞。AI的概念近一兩年尤爲火熱,「機器學習」以及「深度學習」的技術介紹處處都是,這裏再簡單介紹一下我對它們的理解:json

人工智能:api

又名AI,概念出現得特別早,上世紀五六十年代就有。人工智能大概能夠分爲兩大類,一類「強人工智能」,你能夠理解爲徹底具有跟人類同樣的思惟和意識的計算機程序;第二類「弱人工智能」,大概就是指計算機可以完成大部分相對較高級的行爲,好比前面提到的理解圖片含義,理解語言含義以及理解語音等等。咱們平常提到的人工智能一般指第二類,常見的有計算機視覺、語音識別、機器翻譯、推薦系統、搜索引擎甚至一些智能美圖的APP,這些均可以說使用了人工智能技術,由於它們內部都使用了相關機器學習或者深度學習的算法。

機器學習:

這個概念也出現得很早,大概上世界八九十年代(?)。之前的概念中,計算機必須按照人編寫的程序去執行任務,對於程序中沒有的邏輯,計算機是不可能去作的。機器學習出現後,計算機具有人類「掌握經驗」的能力,在經過大量學習/總結規律以後,計算機可以預測它以前並無見過的事物。

深度學習:

深度學習的概念近幾年纔出現,你能夠理解爲它是機器學習的升級。之因此近幾年忽然流行,是由於一些傳統機器學習算法(好比神經網絡)要想取得很是好的性能,神經網絡必須足夠複雜,同時須要大量的學習數據,這時計算能力遇到了瓶頸。而近幾年隨着硬件性能廣泛提高,再加上互聯網時代爆炸式的數據存儲,訓練出足夠複雜的模型已經再也不是高不可攀。所以,能夠將深度學習理解爲更復雜的機器學習方式。

好了,基本概念理清楚以後,開始進入正題了。此次我須要實現計算機視覺中的兩大智能API接口:圖片分類和目標檢測。

 

技術和開發環境

下面是用到的技術和環境:

1)Python 3.5.2 (PIL、numpy、opencv、matplotlib等一些常見的庫)

2)Tensorflow 1.8.0(GPU版本)

3)Keras 2.2.0 (backend是tensorflow)

4)Yolo v3(目標檢測算法)

5)Windows 10 + Navida GTX 1080 顯卡(須要安裝cuda 和 cudnn)

6)VS Code 1.19.3

關於以上技術的介紹以及初次使用時的安裝步驟,我這裏再也不多說了,網上教程不少,提示一下,初次安裝環境,會有不少坑。必定要使用gpu版本的tensorflow,若是僅僅是本身搞着練練手,熟悉熟悉流程,安裝cpu版本也行。

 

接口定義

好了,技術環境介紹完了以後,再把接口肯定下來:

名稱

接口

參數

返回

在線圖片檢測

/detect/online

Method=POST

online_image_url=url[string]

{

  「image」:」result_url」,

  「results」:[

  {

       「box」:[left, top, right, bottom],

       「score」:score,

       「class」:class

  },

  {

       「box」:[left, top, right, bottom],

       「score」:score,

       「class」:class

  }

  ...

  ],

  「time」:create_time,

  「type」:」online」

}

本地圖片檢測

/detect/local

Method=POST

local_image=file data[byte]

 

multipart/form-data

{

  「image」:」result_url」,

  「results」:[

  {

       「box」:[left, top, right, bottom],

       「score」:score,

       「class」:class

  },

  {

       「box」:[left, top, right, bottom],

       「score」:score,

       「class」:class

  }

  ...

  ],

  「time」:create_time,

  「type」:」local」

}

在線圖片分類

/classification/online

Method=POST

online_image_url=url[string]

還沒完成

本地圖片分類

/classification/local

Method=POST

local_image=file_data[byte]

 

multipart/form_data

還沒完成

 

寫這篇博客的時候,圖片分類的模型尚未訓練好,因此暫時放一下,下次更新。以上四個接口分兩類,一類是提交在線圖片的url便可,二類是提交本地圖片文件(表單上傳)。兩類都須要POST方式提交,返回結果是json格式,裏面包含了處理以後的圖片url(全部的結果已經繪製在上面了),還有處理的raw_data,客戶端收到這些raw_data後能夠本身用做其餘地方。

 

目標檢測

目標檢測算法使用的是YOLO V3,這裏是C語言實現的版本:http://pjreddie.com/darknet/ 。因爲我比較熟悉Python,因此我用的是另一個Python版本的實現(基於Keras),這裏是Keras版本的實現:https://github.com/qqwweee/keras-yolo3。 若是想要訓練更好的模型,須要本身準備數據集,源碼中有一個我寫的開源工具,專門用來標記這個框架所用的數據集(這個工具須要.net 4.0+)。

訓練數據集使用的是微軟的COCO數據集(https://github.com/cocodataset/cocoapi),這個也是C語言版本的默認數據集,你能夠直接從官網上下載訓練好的模型使用。

 

圖片分類

待更新...

 

Web服務器

因爲是Web API,那麼你首先必須得有一個本身的Web Server。由於這是一個demo程序,因此不必使用相似Django 、Flask這樣的框架,因而索性就本身寫一個吧。功能很簡單,提供靜態文件訪問、以及能夠處理個人API接口就行,寫完核心代碼大約200行(包含API接口處理的邏輯)。整個Web程序用到的模塊大概有:http.server、PIL、urllib、io、uuid、time、json、os以及cgi。能夠看到並不複雜。

整個Web Server的代碼:

 

處理邏輯

從調用API接口到返回處理結果的流程至關簡單,跟普通的HTTP請求同樣,客戶端發送HTTP請求,攜帶對象參數,Web Server在接收到數據後,開始調用計算模塊,並將計算結果轉換成json格式返回給客戶端:

圖中橙色部分爲關鍵部分,詳細實現請參見源碼中的vision模塊。

 

Demo效果

Demo中寫好了一個靜態html頁面,運行python server.py後,在瀏覽中訪問:http://localhost:8080/web-app/index.html便可看見測試頁面。左邊爲處理以後的圖片,右邊爲返回的json結果。

檢測在線圖片,在文本框中copy圖片url,點擊提交。

上傳本地圖片,點擊提交。

與此同時,在控制檯(或我本身的VS Code集成終端)中能夠看到以下輸出:

最開始是檢測花費的時間,接着就是檢測到的目標物體以及對應的座標、分數等等。後面是轉換以後的json字符串,最後客戶端根據json中的url加載處理以後的圖片。

視頻目標跟蹤

這裏稍微說一下跟視頻有關的處理。對於視頻來說,它跟圖片同樣,由一張張圖片組成,惟一的區別就是它具有時間的維度。咱們不只要檢測每幀中的目標,還要判斷先後幀之間各個目標之間的聯繫。而後利用目標物體的位移差來分析物體行爲,對於路上車輛來說,能夠分析「異常停車」、「壓線」、「逆行掉頭」、「車速」、「流量統計」、「拋灑物」等數據。

 

關於機器學習

AI開發離不開機器學習(深度學習),而機器學習涉及到的知識相對來說很是普遍,不只僅要求開發者掌握好編程技能,還對數學知識有較高的要求。

我認爲做爲普通程序員,若是要學習AI開發,請用一種Top Down的方式,拋開晦澀難懂的數學理論,先找個適合本身的機器學習框架(好比tensorflow或者基於它的keras),學會如何準備訓練數據集(好比本文中如何去標記圖片?),如何訓練本身的模型,而後用訓練獲得的模型去解決一些小問題(好比本文中的圖像目標檢測)。等本身對機器學習有一種具體的認識以後,通過一段時間的摸索,會天然而然地引導咱們去了解底層的數學原理,這個時候再去搞清楚這些原理是什麼。

我的認爲,不要先上來就要搞懂什麼是梯度降低優化法、什麼是目標函數、什麼是激活函數,什麼是學習率...,這些概念確實須要掌握,可是不是你學習機器學習最開始的時候。另外學習機器學習,請使用Python。

 

計劃下一篇介紹基於圖片識別的視頻自動分類,好比自動鑑黃等軟件。

相關文章
相關標籤/搜索