【「合力抗疫,碼力全開」線上公益黑馬10號最強極客(best-geek)罩妖鏡小程序】

參賽感悟

大概是某一天的下午,忽然看到騰訊開源公衆號推送的關於抗擊疫情線上公益黑馬的文章。做爲一個技術人員,當時就以爲這是一個很不錯的爲疫情作貢獻的平臺。因而就聯繫了幾個關係比較好的同事、同窗、朋友,湊了三我的計劃一塊兒搞點事情,以後又經過微信羣結識了一個新同窗。當時的想法是作一個用AI技術識別假口罩的應用程序。由於我本身在尋找各類渠道購買口罩,也經過新聞了解到有不少假冒僞劣的口罩,又剛好本身曾經研究過用php-ml實現手寫文字識別,啓發了我要作口罩識別的想法,也很幸運與別的小夥伴達成了共識。一開始擔憂AI模型最後會失敗,也得到了小夥伴們的諒解和支持。通過三天緊張的設計、開發、測試、路演,完成了一個試用版本,很幸運地得到了二等獎的殊榮。比賽結束後,咱們還會利用業餘時間,投入到這個開源項目的後續迭代,繼續利用這個創意爲疫情和大衆健康作貢獻。php

項目背景

隨着新冠疫情的確診人數不斷增長,口罩也出現了全線脫銷的現象。不少電商賣家上架了3M口罩,微商也紛紛展現了本身的貨源。這些口罩不只價格翻倍,並且還有不少假貨、二手貨。不只欺騙了消費者,還有可能危害大衆的身體健康。爲此,咱們團隊但願藉助此次雲開發公益黑客馬拉松這個平臺,藉助小程序、人工智能等技術,幫助普通消費者識別假冒僞劣的口罩,爲抗擊疫情作出咱們的貢獻。爲了實現這個願景,咱們開發了一款名爲「罩妖鏡」的小程序,但願這款小程序能爲大衆的身體健康和生命安全保駕護航。前端

項目簡介

罩妖鏡暫時只能檢測3M的口罩,使用的時候有兩種檢測方式,最直接的方式是圖片檢測。圖片檢測的流程是先根據本身的口罩類型選擇是否帶呼吸閥。再拍照或上傳圖片,編輯截圖出呼吸閥上的字樣,就能夠知道是否經過檢測的結果。還有個方式是問卷檢測。問卷檢測的流程是根據問題和圖片提示,選擇對應的選項,而後能夠得出一個百分比的檢測數據,相比圖片檢測,問卷檢測的準確性更高。python

o6pttegfl3.jpeg

3064fsqx8h.jpeg

qstnm599z2.jpeg

SVM簡介

支持向量機(SVM)是一種監督類型的機器學習算法,可以對數據進行二元分類,在圖像識別、文本分類等模式識別問題中獲得普遍應用。該算法的基本原理是在樣本數據的數學空間上找到能使正負樣本間隔最大的超平面。算法的公式等細節太複雜,此處就再也不展開論述。mysql

咱們作的工做

架構設計

咱們的項目架構是前端UI和後端API,以及AI模型訓練,目前暫時沒有包含後臺管理系統。先後端經過http json方式交互,前端UI經過微信小程序實現,後端API基於PHP的Laravel框架微服務版本(Lumen)實現,AI模型訓練和預測基於PHP的php-ml類庫和持久化的模型文件實現。除模型和訓練樣本之外的數據存儲使用MySQL數據庫實現。redis

bbndvq9xd5.png

UI的開發過程

此次的前端工做,咱們團隊選擇以小程序做爲前端載體,結合wux-weapp進行工程化開發。使用微信小程序做爲主要載體是基於小程序的龐大用戶市場,更有利於咱們把公益項目更快進入到用戶視野中和獲得最大化的用戶體驗,同時咱們基於小程序的十分完整的開發體系,開發文檔和社區,有便於咱們極速開發。wux-weapp是一套組件化、可複用、易擴展的微信小程序 UI 組件庫,更方便前端的交互開發,測試和維護。本次UI設計採起更結合本次疫情主題的顏色:淡紅和淡藍色,藍色主要體現罩妖鏡的醫療性,紅色更能體現公益性和人文關懷。UI排版及交互主要使用交互感更好的扁平化設計風格,提示和指引也十分簡單易上手,方便不一樣的人羣使用。算法

AI模型的訓練過程

首先是選擇機器學習算法框架,目前市面上比較流行的框架有Spark、Tensorflow、PyTorch、百度飛槳等,使用的開發語言爲python或者scala。可是咱們並無選擇這些比較成熟完善的框架,主要緣由是出於對項目時間、團隊成員的技術棧、學習成本的考量。所以,咱們最終選擇了更簡單易上手的PHP機器學習類庫php-ml,剛好php-ml也支持SVM算法,徹底符合咱們的需求,很適合用於驗證咱們的算法思路。sql

選擇完算法框架,就要開始準備樣本數據和特徵處理了。數據庫

雖然咱們用手機拍攝了一些3M口罩的特徵照片,而且在網絡上收集了一些假3M口罩的照片,可是樣本的數據仍是偏少,特別是不一樣角度的照片樣本較少。所以,咱們用Imagick圖像處理庫對原始圖片進行了旋轉,增長了樣本的數量,提升了模型的準確度。編程

21fs7a2xp0.jpeg
jq3e3hagkd.jpeg
s1eqqgdqes.jpeg

因爲php的語言特性,不支持並行計算,同時考慮到咱們的服務器資源有限,減小特徵數量和算法的計算量是頗有必要的。咱們要求用戶只上傳包含3M字樣的圖片,儘可能裁減掉沒必要要的圖像細節。咱們對用戶上傳的圖片進行了縮放,保證每張圖片都有28 * 28個像素,且保留必要的圖像細節。另外咱們對每張圖片的像素進行了統計,計算出了平均像素值,把小於等於平均像素值的像素修改爲了白色,使得圖片上的特徵更加明顯,減小了須要的樣本數量和算法的計算量。最後咱們把計算完的像素輸出到csv文件中,便於算法框架訓練模型。樣本數據分紅了訓練數據和測試數據,分別用於模型的訓練和偏差評估。json

n66fmbir2x.jpeg

獲取了每張的圖片的像素數據後,咱們用php-ml提供的API訓練了模型,而且持久化爲文件,供後端API調用。

php train.php 2

Collecting samples...
Finished at: 0.1430971622467s
Processing samples...
Finished at: 0.20800399780273s
Network init...
Finished at: 0.21489810943604s
Training...
Finished at: 0.88525605201721s
Evaluating...
Score: 0.75
Finished at: 0.92413902282715s
Saving model...
Finished at: 1.1274020671844s

後端API的開發過程

本項目後端使用的編程語言爲PHP,並使用Lumen框架來搭建項目,以restful方式爲前端提供接口。

本項目數據存儲使用的是mysql;主要設計了3張數據表 attachment(附件信息)、question(問卷信息)、recognition(識別的信息及結果)

本項目緩存使用的是 redis,主要緩存不常常變更的一些信息,如:問卷信息

如下爲3個接口的詳細介紹:

  1. 題目的查詢功能:咱們將能夠判斷口罩真僞的一些題目錄入到數據庫中,該接口提供題目和選項給用戶選擇
  2. 圖片識別功能:用戶在前端選擇選擇手機中的照片或者拍照,上傳到後端,後端將保存圖片到雲存儲中,以便之後分析AI的識別能力;圖片保存好之後,將圖片交給AI識別,AI識別完成之後將識別的結果返回;再由接口返回到前端
  3. 問卷識別功能:因爲不少用戶對口罩的真僞的認知能力有限,咱們還提供了問卷識別的功能;給出一些常見的辨別口罩的問題,根據用戶的回答來判斷口罩的真僞程度

總結與展望

通過幾天緊張的開發和調試,目前已經實現了基本的口罩鑑別功能,包含基於圖像的鑑別,和更準確的基於問卷評分的鑑別。受限於咱們目前的知識儲備和研發時間的限制,圖片識別的準確率只有60%左右,魯棒性還有待提升,還須要咱們繼續努力改進。

如下是咱們團隊對於這款小程序將來的幾點展望:

  1. 支持更多類型的口罩,包括但不限於非3M品牌的N95口罩、醫用外科口罩等。
  2. 支持用戶補充假口罩圖片樣本、問卷問題的功能。
  3. 接入第三方機器學習API,與機器學習方面的專家合做,提升圖片識別的能力。
  4. 增長管理後臺,便於審覈用戶反饋的圖片樣本和問卷問題。
  5. 提升代碼質量,重構優化代碼結構,增長單元測試,使項目更穩定且易於擴展。

歡迎體驗咱們的試運行版本

sbro5u2wf1.jpeg

相關文章
相關標籤/搜索