結合目標識別小專案——軟體設計方案
結合目標識別小專案——軟體設計方案
一、專案背景
我的工程實踐專案是NLP演算法,但是這個學期主要學的還是CV,所以我用一個關於人臉口罩識別的小專案,作為例子,來學習軟體設計方案。我覺得無論是CV還是NLP,知識點都是融會貫通的,用做過的專案入手,能夠更好地把握知識點。
目標識別技術的應用已經越來越廣泛。我目前完成的是在keras版本的yolov3框架下,實現遷移學習,實現人臉是否佩戴口罩的目標識別,呼叫本地攝像頭實現實時檢測。作為一個軟體系統,我所做的東西只是冰山一角,訓練出的模型還可以部署到伺服器和移動端。所以我增加了一些細節,假設我實現的只是伺服器端應該完成的內容,相對於一個比較完善的專案——該系統採用攝像頭對現場環境實時監控,伺服器讀取攝像機採集到的視訊影象,並且對是否佩戴口罩進行人臉檢測識別,將檢測和識別結果返回到客戶端。如果識別結果符合某個判斷,系統將傳送相關資訊給工作人員。
首先,我們使用到的yolov3演算法的網路結構如下,關於網路模型這裡,不做贅述。
二、專案設計方案
軟體架構
本專案採用MVC架構,MVC即為Model-View-Controller(模型-檢視-控制器),MVC中M、V和C所代表的含義如下:
- Model(模型)代表一個存取資料的物件及其資料模型。
- View(檢視)代表模型包含的資料的表達方式,一般表達為視覺化的介面介面。
- Controller(控制器)作用於模型和檢視上,控制資料流向模型物件,並在資料變化時更新檢視。控制器可以使檢視與模型分離開解耦合。
在我的這個系統中,可以分為三個部分:
第一個部分是用過攝像頭對視訊影象進行採集,將採集到的視訊檔案傳輸給伺服器中的模型,以供伺服器對影象進行分析處理。
主伺服器:對採集模組的視訊檔案進行分析,主要是通過深度學習模型對傳過來的模型進行分析處理,將識別來的結果傳送給客戶端。
客戶端:在某一個平臺搭建人機互動介面,主要可以展示識別的結果,資訊檢索,統計和歷史資料查詢等。使用者通過介面檢視識別結果,通過介面上的按鈕,進行滑鼠操作觸發一系列動作,系統通過函式實現使用者所要求的任務。
三、軟體系統概念原型的不同檢視以及API
UML類圖:
1、分解檢視
分解是構建軟體架構模型的關鍵步驟,分解檢視也是描述軟體架構模型的關鍵檢視,一般分解檢視呈現為較為明晰的分解結構特點。分解檢視用軟體模組勾劃出系統結構,往往會通過不同抽象層級的軟體模組形成層次化的結構。
2、依賴檢視
依賴檢視展現了軟體模組之間的依賴關係。比如一個軟體模組A呼叫了另一個軟體模組B,那麼我們說軟體模組A直接依賴軟體模組B。如果一個軟體模組依賴另一個軟體模組產生的資料,那麼這兩個軟體模組也具有一定的依賴關係。
依賴檢視在專案計劃中有比較典型的應用。比如它能幫助我們找到沒有依賴關係的軟體模組或子系統,以便獨立開發和測試,同時進一步根據依賴關係確定開發和測試軟體模組的先後次序。
依賴檢視在專案的變更和維護中也很有價值。比如它能有效幫助我們理清一個軟體模組的變更對其他軟體模組帶來影響的範圍。
在本專案中,要想畫出依賴檢視,首先要明確專案有哪幾個功能模組,然後理清各個功能模組之間的依賴關係,最後只需要把這些依賴關係畫出來即可。
3、執行檢視
執行檢視展示了系統執行時的時序結構特點,比如流程圖、時序圖等。執行檢視中的每一個執行實體,一般稱為元件(Component),都是不同於其他元件的執行實體。如果有相同或相似的執行實體那麼就把它們合併成一個。
以下是訓練過程以及服務埠罩識別的的執行檢視。
服務端與客戶端的執行檢視:
4、實現檢視
實現檢視是描述軟體架構與原始檔之間的對映關係。比如軟體架構的靜態結構以包圖或設計類圖的方式來描述,但是這些包和類都是在哪些目錄的哪些原始檔中具體實現的呢?一般我們通過目錄和原始檔的命名來對應軟體架構中的包、類等靜態結構單元,這樣典型的實現檢視就可以由軟體專案的原始檔目錄樹來呈現。
這裡的伺服器埠罩識別演算法的目錄樹。
mask_Identification
├─ annotations # 標註資訊
├─ convert.py # 引數轉換指令碼
├─ ImageSets # 圖片資訊
│ ├─ mask_dataset
│ ├─ test.txt
│ ├─ train.txt
│ ├─ trainval.txt
│ └─ val.txt
├─ LOG # 訓練權重儲存
│ ├─ train.h5
│ ├─ train_mask_v1.h5
│ └─ train_mask_v2.h5
├─ makeTxt.py
├─ model_data # 模型引數
│ ├─ coco_classes80.txt
│ ├─ mask_anchors.txt
│ ├─ mask_classes.txt
│ ├─ voc_classes.txt
│ ├─ yolo.h5
│ └─ yolo_anchors.txt
├─ train.py # 載入權重進行預測
├─ yolo.py
├─ yolo3 # yolov3模型
│ ├─ model.py
│ ├─ utils.py
│ ├─ __init__.py
5、工作分配檢視
工作分配檢視將系統分解成可獨立完成的工作任務,以便分配給各專案團隊和成員。工作分配檢視有利於跟蹤不同專案團隊和成員的工作任務的進度,也有利於在各專案團隊和成員之間合理地分配和調整專案資源,甚至在專案計劃階段工作分配檢視對於進度規劃、專案評估和經費預算都能起到有益的作用。
由於這是設想的專案,所以並沒有實際的程序。以下是設想的對於一個完整系統的工作分配:
任務 | 預計週期 | 狀態 |
---|---|---|
資料預處理,資料清洗 | 0.5個月 | 已完成 |
模型的搭建和調整 | 1個月 | 已完成 |
權重訓練和微調 | 1個月 | 已完成 |
模型的部署和上線 | 1個月 | 進行中 |
後臺資料模組管理 | 1個月 | 尚未開始 |
6. 伺服器埠罩識別演算法介面:
- 模型定義:
class yolo
定義模型主體yolo_body(inputs, num_anchors, num_classes)
、
損失函式box_iou(b1, b2)
評價標準 yolo_loss(args, anchors, num_classes, ignore_thresh=.5, print_loss=False)
。
- 模型搭建:
create_model(input_shape, anchors, num_classes, load_pretrained,freeze_body,weights_path)
引數:輸入圖片大小,標註框尺寸、是否載入預訓練權重、凍結層數、預訓練權重;
-
影象預處理
class utils
將輸入的影象預處理。
-
影象生成:
data_generator(annotation_lines, batch_size, input_shape, anchors, num_classes)
- 模型預測:
class YOLO
提供模型引數的載入(模型權重、先驗框、分類)、呼叫攝像頭進行預測輸出
四、專案資料庫設計
User(客戶端使用者)
屬性 | 資料型別 | 約束 | 描述 |
---|---|---|---|
userId | String | 主鍵 | ID |
String | 郵箱 | ||
registerDate | Date | 註冊日期 |
ModelData(訓練用資料)
屬性 | 資料型別 | 約束 | 描述 |
---|---|---|---|
pictureID | int | 主鍵 | 訓練用圖片 |
addr | String | 圖片位置 | |
tag | int | 標籤值 | |
box | float | 標註框 |
Result(返回結果)
屬性 | 資料型別 | 描述 |
---|---|---|
faceID | int | 識別人臉編號 |
result | int | 返回預測結果(0,1) |
Time | TimeStamp | 時間戳 |
五、系統執行環境和技術選型說明
執行環境
TensorFlow-GPU 2.3.0
Keras 2.4.3
Python 3.7.4
opencv-python==4.4.0.46
h5py==2.10.0
Intel(R) Core(TM) i3-10100F CPU @ 3.60GHz
GeForce RTX 2080 Ti
六、概念原型的核心工作機制
本專案概念原型的核心工作機制如下,從兩方面闡述:
從服務端角度,包含了口罩識別以及後臺框架模組。其中服務端使用python編寫,結合keras、tensorflow等深度學習框架來實現。通過對資料採集模組傳輸過來的視訊檔案進行分析處理,包括視訊的預處理、口罩識別等工作,通過TCP/IP傳到客戶端。
客戶端可以獲得服務端返回的資料,以獲得口罩佩戴的資訊。主要可以查詢在時間戳下使用者佩戴口罩的資料,並且對於沒有佩戴口罩的情況做出預警。