高雄捷運股份有限公司 - aiacademy.tw › event › st3 › file › technicalno03.pdf ·...
TRANSCRIPT
高雄捷運股份有限公司人工智慧學校技術領袖培訓班第三期專題簡報
捷運車廂乘客安全預警
專題製作小組成員 ET083007周家正 ET083028黃瀞萱(組長)
前言
2014年台北捷運襲擊事件,造成四死廿四傷的重大傷亡結果,引起社會動盪不安。兇
手首先攻擊睡眠中之乘客,加上其他乘客均處於放鬆滑手機的狀態,因此未在第一時
間受到警告而產生防禦之心,讓他在倒數第二到第五車廂無阻礙的砍殺多人,最後竟
逃離車廂,直到被見義勇為民眾制伏。
此次事件的兇手鄭捷僅是一位學生,卻在搭乘捷運時造成重大傷亡,最主要原因是因
為車輛行駛中,乘客並未處於警戒狀態,如果可以有影像偵測與預警系統,可協助車
上乘客在危急時刻有所警惕,並通知車站維安人員到達正確位置壓制兇手,可有效控
制危機,讓乘客安全更能得到保障。
高捷企業專題名稱
捷運車廂空間乘客安全預警系統
在不危害到隱私權益前提下,讓AI之眼關注乘客安全!
找出危險物件,緊急通報!
專題任務
Knife
Attacking
Knife
Knife
Gun
John Wick💘
error
使用絕技-瞳之術DarknetYOLOv3 Model+Darknet53 Backbone(使用為transfer learning)
YOLO使用CNN作為偵測物件原理,YOLO不只偵測物件分類,並且標示物件位置,所以YOLO可
以在一張圖片上可以多物件的方式標示,如上圖同時標示人與腳踏車。
Input(416, 416, 3)
Conv2D(416, 416, 32)
Res(104, 104, 128)
Res(52, 52, 256)
Res(26, 26, 512)
Conv2D+Up2D(26, 26, 256)
Conv2D 5L(13, 13, 1024) Res
(26, 26, 768)
Conv2D 1x1+Conv2D 3x3+Conv2D 1x1(13, 13, 255)
Conv2D 5L(26, 26, 256)
Conv2D+Up2D(52, 52, 128)
Res(52, 52, 256)
Conv2D 5L(52, 52, 128)
Conv2D 1x1+Conv2D 3x3+Conv2D 1x1(26, 26, 255)
Conv2D 1x1+Conv2D 3x3+Conv2D 1x1(52, 52, 255)(80+5)*3=255
使用 RESNet 網路 (Residual Network)新的基底網路為 Darknet-53,有 53 層,隨著網絡層數不斷加深 (數量級從 20~30 層到 ~50 層),採用了一般類神經網路加深時常用的 ResNet 結構來解決梯度問題
Adaptively Spatial Feature Fusion , ASFF
https://arxiv.org/pdf/1911.09516v1.pdf Learning Spatial Fusion for Single-Shot Object Detection
使用 FPN 網路 (Feature Pyramid Networks)使用 FPN 多層級預測架構以提升小物體預測能力,特徵層從單層 13x13 變成了多層 13x13、26x26 和 52x52。使用 FPN 的架構可以讓低層較佳的目標位置和高層較佳的語義特徵融合,並且在不同特徵層獨立進行預測,使得小物體檢測改善效果十分明顯。
8294106
416x416x3 416x416x32208x208x64 104x104x128 52x52x256 26x26x512 13x13x1024 13x13x512 13x13x1024 13x13x255
13x13x256
26x26x256
26x26x768 26x26x256 26x26x512 26x26x255
26x26x128
52x52x12852x52x384 52x52x128 52x52x256 52x52x255
YOLOv3應用在影片上
Total number of frames 269
Total amount of time 107.42672 seconds
FPS: 2.5一秒取2.5張
原始碼位址https://drive.google.com/open?id=1aFeGSbv0Nbox-uZ7c9k1bUrOnP6iThpB
YOLO COCO Dataset Classes
person、bicycle、car、motorbike、aeroplane、bus、train、truck、boat、traffic light、fire hydrant、stop sign、parking meter、bench、bird、cat、dog、horse、sheep、cow、elephant、bear、zebra、giraffe、backpack、umbrella、handbag、tie、suitcase、frisbee、skis、snowboard、sports ball、kite、baseball bat 棒球棍、baseball glove、skateboard、surfboard、tennis racket、bottle、wine glass、cup、fork、knife、spoon、bowl、banana、apple、sandwich、orange、broccoli、carrot、hot dog、pizza、donut、cake、chair、sofa、pottedplant、bed、diningtable、toilet、tvmonitor、laptop、mouse、remote、keyboard、cell phone、microwave、oven、toaster、sink、refrigerator、book、clock、vase、scissors、teddy bear、hair drier、toothbrush
YOLOv3 密技展開-使用COCO Dataset 進行影像偵測Import openCV -> 讀入影像 -> 使用Blob包覆影像(轉成四維) -> 載入YOLOv3模型 -> 紀錄偵測時間 -> 取出 bounding boxes(決定類別) -> Non-maximum suppression剔除機
率低的分類預測 -> 畫出分類與標示內容
偵測結果
原始碼位址https://drive.google.com/file/d/1z8is_lZAhODEAzSjpmvhCWnBHwo2Ytkb/view?usp=sharing
YOLOv3 密技展開-After Action Review➔ 讀刀不讀人,讀人不讀刀
➔ 水果刀變剪刀,菜刀變手機
以上皆說明識刀不清呀
無法判別被手握住的刀
下個目標
➔ 定義危險物件的classes分類。-> Knife
➔ 標定label含有手握刀以及各家名刀種類的自行製作dataset : 使用YOLO的格式標記Label。
YOLOv3 darknet測試刀子圖片-收集持刀圖片前步驟➔ 刀子如果是偏黑色就會變剪刀或是無偵測(2020-03-28建立)
未偵測出 偵測為剪刀
正確結果
免費網路圖片資源 : Open Image Dataset V6 https://storage.googleapis.com/openimages/web/visualizer/index.html?set=train&type=segmentation&r=false&c=%2Fm%2F04ctx
含各種情境
及有手握刀的圖片
第一次訓練:使用 Open Image Dataset V6 + 331張手持刀圖片
使用 OIDv4-toolkit 下載 Open Image Dataset-Knife
➔ 下載
OIDv4-toolkit➔ 使用OIDv4-toolkit
下載圖片
>conda install git>git clone https://github.com/EscVM/OIDv4_ToolKit.git>cd OIDv4_ToolKit>pip install -r requirements.txt
>cd OIDv4_ToolKit>python main.py downloader --classes Kitch_knife Knife --type_csv train --multiclasses 1 --limit 800>python main.py visualizer
Open Image “Kitchen knife” “Knife”-轉換成YOLO特徵圖片
下載資料內容
import pandas as pdimport osfull_path_to_csv = '/home/my_name/OIDv4_ToolKit/OID/csv_folder'full_path_to_images = \ '/home/my_name/OIDv4_ToolKit/OID/Dataset/train/Kitchen_knife_knife'labels = ['Kitchen knife', 'Knife']classes = pd.read_csv(full_path_to_csv + '/' + 'class-descriptions-boxable.csv', usecols=[0, 1], header=None)encrypted_strings = []for v in labels: sub_classes = classes.loc[classes[1] == v] e = sub_classes.iloc[0][0] encrypted_strings.append(e)annotations = pd.read_csv(full_path_to_csv + '/' + 'train-annotations-bbox.csv', usecols=['ImageID','LabelName','XMin','XMax','YMin','YMax'])sub_ann = annotations.loc[annotations['LabelName'].isin(encrypted_strings)].copy()sub_ann['classNumber'] = ''sub_ann['center x'] = ''sub_ann['center y'] = ''sub_ann['width'] = ''sub_ann['height'] = ''for i in range(len(encrypted_strings)): sub_ann.loc[sub_ann['LabelName'] == encrypted_strings[i], 'classNumber'] = isub_ann['center x'] = (sub_ann['XMax'] + sub_ann['XMin']) / 2sub_ann['center y'] = (sub_ann['YMax'] + sub_ann['YMin']) / 2sub_ann['width'] = sub_ann['XMax'] - sub_ann['XMin']sub_ann['height'] = sub_ann['YMax'] - sub_ann['YMin']r = sub_ann.loc[:, ['ImageID', 'classNumber', 'center x', 'center y', 'width', 'height']].copy()os.chdir(full_path_to_images)for current_dir, dirs, files in os.walk('.'): for f in files: if f.endswith('.jpg'): image_name = f[:-4] sub_r = r.loc[r['ImageID'] == image_name] resulted_frame = sub_r.loc[:, ['classNumber', 'center x', 'center y', 'width', 'height']].copy() path_to_save = full_path_to_images + '/' + image_name + '.txt' resulted_frame.to_csv(path_to_save, header=False, index=False, sep=' ')
1 0.4481 0.4915 0.6712 0.8536 0 0.4475 0.4929 0.67 0.8752類別 X軸位置 Y軸位置 寬度 高度
classes.names:Kichen KnifeKnife
新增手持刀圖片-使用 Labelimg 標記YOLO特徵圖片
https://drive.google.com/file/d/19CRHsZvky12VOz-EX6nFrLnLh3PUHZOT/view?usp=sharing YOLO格式介紹
*1.要選成YOLO格式。 *2.YOLO會產生與圖片相同檔案之標記txt檔,以及分類內容classes之txt檔。
*1
*2
下載LabelImg
至data中修改
predefined_classes.txt
收集 Darknet 訓練資料之一 劃分Train/Valid之txt資料
➔ train.txt #取得Train資料集
➔ test.txt #取得Valid資料集
C:\Users\monic\Documents\UdemyYoloV3\L4\labelled-custom2/fb4cd766c218666d.jpgC:\Users\monic\Documents\UdemyYoloV3\L4\labelled-custom2/fbb61f53681d7494.jpgC:\Users\monic\Documents\UdemyYoloV3\L4\labelled-custom2/fc225d6f6fe570ec.jpgC:\Users\monic\Documents\UdemyYoloV3\L4\labelled-custom2/fcba8f8612bc1b93.jpgC:\Users\monic\Documents\UdemyYoloV3\L4\labelled-custom2/fd17aa0e39f40ba3.jpgC:\Users\monic\Documents\UdemyYoloV3\L4\labelled-custom2/fe4a4d55f60ee669.jpgC:\Users\monic\Documents\UdemyYoloV3\L4\labelled-custom2/fe88f63459353344.jpgC:\Users\monic\Documents\UdemyYoloV3\L4\labelled-custom2/img-0001.jpgC:\Users\monic\Documents\UdemyYoloV3\L4\labelled-custom2/img-0002.jpgC:\Users\monic\Documents\UdemyYoloV3\L4\labelled-custom2/img-0003.jpgC:\Users\monic\Documents\UdemyYoloV3\L4\labelled-custom2/img-0004.jpgC:\Users\monic\Documents\UdemyYoloV3\L4\labelled-custom2/img-0005.jpgC:\Users\monic\Documents\UdemyYoloV3\L4\labelled-custom2/img-0006.jpgC:\Users\monic\Documents\UdemyYoloV3\L4\labelled-custom2/img-0007.jpgC:\Users\monic\Documents\UdemyYoloV3\L4\labelled-custom2/img-0008.jpg
收集 Darknet 訓練資料之二 .data/.names
➔ custom_data.data➔ classes.names
使用 Darknet 訓練資料: .data介紹
➔ classes = 2 #類別數量
➔ train = path/train.txt #➔ valid = path/test.txt➔ names = path/classes.names➔ backup = backup
使用 Darknet 訓練資料: .names介紹
➔ kitchen knife➔ knife
將所有Custom Data攪在一起
首先要將所有圖片放到同一個資料夾中,再使用python將文字資料加在一起
加入訓練集文字資料 JupyterNotebook檔案: train.txt/test.txt
加入data文字資料 JupyterNotebook檔案: Joined_data.data/ 新classes.names
用Darknet訓練資料 - 使用Anaconda Prompt執行
➔ 安裝 Darknet
➔ 測試是否安裝成功
➔ 將所需資料放到Darknet對應資料夾
➔ 設定參數
➔ 開始訓練
參數介紹-需要調整的參數-由yolov3.cfg修改
filters=32 #(classes + coordinates(座標值) +1)*masks #5:tx, ty, tw, th + 1for joined_dataset: (3 + 5)*3 = 24
➔ Last 3 YOLO layers[convolutional] filter=255 #需修改為24[yolo] classes=80 #需修改為3(Kitchen knife, Knife, Attack)
➔ max_batches = classes(3)*2000 (not less than 4000)=6000 訓練的iteration數➔ steps = 80% of max_batches(4800), 90%(5400) of max_batches #根據batch數調整learning rate➔ mini batch = batch/subdivisions
Parameters for training: batch = 64 / subdivision = 32Parameters for testing: batch= 1 / subdivision = 1
➔ *依照以上設定,另存 yolov3_joined_train.cfg / yolov3_joined_test.cfg
1 0.4481 0.4915 0.6712 0.8536 0 0.4475 0.4929 0.67 0.8752類別 X軸位置 Y軸位置 寬度 高度
Darknet 開始Train➔ darknet.exe detector train cfg/joined3_data.data cfg/yolov3_joined3_train.cfg weights/darknet53.conv.74 -map
#weights/darknet53.conv.74 使用darknet53.conv.74作transfer learning#-map可附贈loss/mAP方格圖
Darknet Train 時的log
Batch 完成時的 log
➔ [current iteration]: [cur loss], [avg loss] avg, [learning rate] rate, [running time] seconds, [images count] images 2775 : 0.487991, 0.434679 avg loss, 0.001000 rate, 7.249000 seconds, 177600 images
Subdivision 完成時的 log
➔ v3 (mse loss, Normalizer: (iou: 0.75, cls: 1.00) Region 82 Avg (IOU: 0.791135, GIOU: 0.785672), Class: 0.810664, Obj: 0.620445, No Obj: 0.004544, .5R: 1.000000, .75R: 1.000000, count: 3, class_loss = 0.783427, iou_loss = 0.221446, total_loss = 1.004873
➔ v3 (mse loss, Normalizer: (iou: 0.75, cls: 1.00) Region 94 Avg (IOU: 0.000000, GIOU: 0.000000), Class: 0.000000, Obj: 0.000000, No Obj: 0.000011, .5R: 0.000000, .75R: 0.000000, count: 1, class_loss = 0.000022, iou_loss = 0.000000, total_loss = 0.000022
➔ v3 (mse loss, Normalizer: (iou: 0.75, cls: 1.00) Region 106 Avg (IOU: 0.000000, GIOU: 0.000000), Class: 0.000000, Obj: 0.000000, No Obj: 0.000001, .5R: 0.000000, .75R: 0.000000, count: 1, class_loss = 0.000004, iou_loss = 0.000000, total_loss = 0.000004
第一次 Darknet 訓練結果
calculation mAP (mean average precision)...
detections_count = 438, unique_truth_count = 306class_id = 0, name = knife, ap = 43.70% (TP = 27, FP = 14)class_id = 1, name = kitchen knife, ap = 63.72% (TP = 99, FP = 22)
for conf_thresh = 0.25, precision = 0.78, recall = 0.41, F1-score = 0.54 for conf_thresh = 0.25, TP = 126, FP = 36, FN = 180, average IoU = 61.32 %
IoU threshold = 50 %, used Area-Under-Curve for each unique Recall mean average precision ([email protected]) = 0.537135, or 53.71 %
訓練結果 是有比較好一點,但是...
COCO Dataset未偵測出的項目
自定義 DatasetOpen Image Dataset V6 + 331張網路找的手持刀圖片
第二次訓練:使用 Open Image Dataset V6 + 507張網路找的手持刀圖片+1新增類別 : Attack
第二次 Darknet 訓練結果
calculation mAP (mean average precision)...
detections_count = 1059, unique_truth_count = 306class_id = 0, name = kitchen knife, ap = 48.80% (TP = 47, FP = 48)class_id = 1, name = knife, ap = 64.17% (TP = 117, FP = 55)class_id = 2, name = attack, ap = 0.00% (TP = 0, FP = 10)
for conf_thresh = 0.25, precision = 0.59, recall = 0.54, F1-score = 0.56 for conf_thresh = 0.25, TP = 164, FP = 113, FN = 142, average IoU = 45.00 %
IoU threshold = 50 %, used Area-Under-Curve for each unique Recall mean average precision ([email protected]) = 0.376566, or 37.66 %Total Detection Time: 6 Seconds
訓練效果顯著 以下為兩個分類與三個分類比較:
還是有些缺陷,可以當作下次收集Datasets目標:
背景太複雜 預測錯誤危險狀的手勢
解析度較差
解析度較差 解析度較差 背景太複雜
接下來看看影片效果吧-牛排刀
接下來看看影片效果吧-菜刀
接下來看看影片效果吧-水果刀
第三次訓練:使用 Open Image Dataset V6 + 507張網路找的手持刀圖片+478張自拍的影片+1新增類別 : Attack
第三次 Darknet 訓練結果
calculation mAP (mean average precision)...252detections_count = 1113, unique_truth_count = 454class_id = 0, name = kitchen knife, ap = 48.44% (TP = 64, FP = 56)class_id = 1, name = attack, ap = 0.00% (TP = 0, FP = 9)class_id = 2, name = knife, ap = 67.47% (TP = 197, FP = 61)
for conf_thresh = 0.25, precision = 0.67, recall = 0.57, F1-score = 0.62 for conf_thresh = 0.25, TP = 261, FP = 126, FN = 193, average IoU = 53.14 %
IoU threshold = 50 %, used Area-Under-Curve for each unique Recall mean average precision ([email protected]) = 0.386371, or 38.64 %Total Detection Time: 8 Seconds
訓練資料進化過程
未偵測出
knife: 52%attack: 65%
自定義 DatasetOpen Image Dataset V6
+ 331張手持刀圖片COCO Dataset
自定義 DatasetOpen Image Dataset V6
+ 507張手持刀圖片+1新增類別 : Attack
自定義 DatasetOpen Image Dataset V6
+ 990張手持刀圖片+1新增類別 : Attack
接下來看看影片效果吧-菜刀
試試看十大劍術電影 Sword Fighting-保證低解析
結論一-下一步
➔ 雖然是利用object偵測的方式標記動作偵測,基本上是可以針對持危險物品的動
作物件進行標記與訓練,但mAP數據說明,動作偵測FP很高,未來可以朝Pose Estimation進行下一步,針對範圍涵蓋所有攻擊行為。
結論二-由偵測到預警
➔ The Python Mega Course: Build 10 Real World Applications我們的課程已經算是將Machine Learning領域完整涵蓋,但是要落實商業化仍需
要有實質性的App建立,下一步要找出如何將偵測的log轉出到前端,達到預警的
效果。
參考資料來源
Multi-Person Pose Estimation in OpenCV using OpenPosehttps://www.learnopencv.com/multi-person-pose-estimation-in-opencv-using-openpose/
安裝drakflowhttp://www.darkflow.org/docs/installation.en/#darkflow-on-ms-windows下載位置http://www.darkflow.org/docs/download.en/
https://medium.com/@airwaves/opencv-%E5%9C%A8windows%E4%B8%AD%E5%AE%89%E8%A3%9D-opencv-python-295ae092ca57 OpenCV —在Windows中安裝 OpenCV-python
參考資料來源
YOLOv3: An Incremental Improvement 原始介紹論文https://pjreddie.com/media/files/papers/YOLOv3.pdf
https://allen108108.github.io/blog/2020/02/15/[%E8%AB%96%E6%96%87]%20YOLOv3%20_%20An%20Incremental%20Improvemen
t/ YOLOv3論文中文說明
configuration file for YOLOv3-608 model: YOLOv3參數內容https://github.com/pjreddie/darknet/blob/master/cfg/yolov3.cfg
https://www.twblogs.net/a/5b839ebd2b71777a2efcab7f
https://towardsdatascience.com/yolo-v3-object-detection-53fb7d3bfe6b 英文介紹
https://medium.com/@chih.sheng.huang821/%E6%B7%B1%E5%BA%A6%E5%AD%B8%E7%BF%92-%E7%89%A9%E4%BB%B6%
E5%81%B5%E6%B8%AC-you-only-look-once-yolo-4fb9cf49453c 中文介紹(大推)
參考資料來源
http://yy-programer.blogspot.com/2019/01/yolo-darknet.html 安裝darknet
https://medium.com/@chih.sheng.huang821/%E6%B7%B1%E5%BA%A6%E5%AD%B8%E7%BF%92-%E7%89%A9%E4%BB%B6%
E5%81%B5%E6%B8%ACyolov1-yolov2%E5%92%8Cyolov3-cfg-%E6%AA%94%E8%A7%A3%E8%AE%80-75793cd61a01 YOLOv3.cfg 參數說明
https://www.twblogs.net/a/5b8d84502b717718833e9a58 YOLOv3.cfg 參數說明
https://medium.com/@chih.sheng.huang821/%E6%B7%B1%E5%BA%A6%E5%AD%B8%E7%BF%92%E7%B3%BB%E5%88%97-%
E4%BB%80%E9%BA%BC%E6%98%AFap-map-aaf089920848 YOLO3 MAP說明
https://mropengate.blogspot.com/2018/06/yolo-yolov3.html 比較YOLO各版本
https://data-sci.info/2017/07/19/feature-pyramid-networks-object-detection/ FEATURE PYRAMID NETWORKS FOR OBJECT DETECTION
參考資料來源
Online Video Object Detection using Association LSTMhttp://openaccess.thecvf.com/content_ICCV_2017/papers/Lu__Online_Video_ICCV_2017_paper.pdf
Multiple Target Trackinghttps://mc.ai/multiple-target-tracking/
Action Recognition in Video Sequences using Deep Bi-Directional LSTM With CNN Featureshttps://ieeexplore.ieee.org/document/8121994
Order-Free RNN with Visual Attention for Multi-Label Classificationhttps://arxiv.org/pdf/1707.05495.pdf
https://www.dlology.com/blog/live-face-identification-with-pre-trained-vggface2-model/
https://paperswithcode.com/task/6d-pose-estimation