基于Faster R-CNN的安全帽目標檢測項目通常旨在解決工作場所,特別是建筑工地的安全監管問題。這類項目使用計算機視覺技術,特別是深度學習中的Faster R-CNN算法,來自動檢測工人是否正確佩戴了安全帽,從而確保遵守安全規定并減少事故風險。
項目背景與目標: 在建筑、礦山和其他高風險作業環境中,安全帽是保護工人免受頭部傷害的基本裝備。然而,人工檢查安全帽的佩戴情況效率低下且容易出錯。因此,開發自動化檢測系統可以提高工作效率和安全性。
技術細節:
- 數據收集:?項目首先需要收集大量包含工人頭像和安全帽的圖像數據,這些數據可能來自于監控攝像頭或專門拍攝的照片。
- 數據標注:?對于每一張圖片,需要手動標注安全帽的位置,這通常涉及劃定邊界框并標記類別(例如,有安全帽、無安全帽)。
- 模型訓練:?使用標注過的數據集來訓練Faster R-CNN模型。Faster R-CNN是一個兩階段的目標檢測模型,它包括一個區域提議網絡(RPN)用于生成候選區域,以及一個用于分類和定位的后續網絡。
- 模型評估:?在測試集上評估模型的性能,調整超參數以優化準確性和召回率。
- 部署:?將訓練好的模型部署到實際環境中,如連接到現場的攝像頭,實時分析視頻流,識別未戴安全帽的人員。
應用與優勢:
- 實時監控:系統能夠連續地分析視頻流,及時發現未佩戴安全帽的情況。
- 減少人力成本:自動化檢測減少了對人工監督的需求,節省了人力資源。
- 提高安全性:通過及時提醒未遵守安全規定的工人,降低潛在的事故風險。
- 數據分析:收集的數據可用于進一步分析安全行為模式,幫助改善安全管理策略。
挑戰與限制:
- 光照條件變化:室外環境光照變化大,可能影響檢測效果。
- 遮擋問題:工人的姿勢、其他物體或人群的遮擋會增加檢測難度。
- 計算資源:實時視頻處理需要強大的計算能力,尤其是在邊緣設備上。
總之,基于Faster R-CNN的安全帽目標檢測項目是一個綜合了數據科學、計算機視覺和深度學習技術的解決方案,旨在提高工作場所的安全性。
?
1. 🔥 訓練模型前的準備
- A.數據準備
數據的標注仍然采用VOC格式的數據標注形式,如果是其他的標注形式比如COCO請自行實現相關代碼。將數據最終轉化為如下形式:
# 單行數據的結構: (path_filename, x1, y1, x2, y2, class_name)# Note:# 一個path_filename 可能對應多個類別(class_name),每個類別占用一行數據# x1, y1, x2, y2 是原圖像的坐標, 而不是ratio后圖像上的坐標# (x1, y1) 標注框的左上坐標; (x2, y2) 標注框的右下坐標# x1,y1-------------------# | |# | |# | |# | |# ---------------------x2,y2
可以運行如下代碼實現數據集的準備工作:
python3 ./data/data_pro.py
將在./data
文件夾下生成annotation.txt
文件,這樣訓練數據的準備工作即完成。
# path_filename, x1, y1, x2, y2, class_name
/home/myuser/xujing/Faster-R-CNN_hat/data/JPEGImages/000605.jpg,37,12,151,154,hat
/home/myuser/xujing/Faster-R-CNN_hat/data/JPEGImages/000605.jpg,243,1,393,176,hat
/home/myuser/xujing/Faster-R-CNN_hat/data/JPEGImages/PartB_02176.jpg,92,593,180,684,person
/home/myuser/xujing/Faster-R-CNN_hat/data/JPEGImages/PartB_02176.jpg,229,648,357,777,person
- B.配置文件準備
根據自己的訓練集和訓練任務修改./keras_frcnn/config.py
的配置文件,相關參數的解釋和配置如下:
self.verbose = True # 顯示訓練過程
self.network = 'vgg' # backbone 目前支持vgg(VGG16),resnet50,xception,inception_resnet_v2# 數據增強策略
self.use_horizontal_flips = False # 水平隨機裁剪
self.use_vertical_flips = False # 垂直隨機裁剪
self.rot_90 = False # 隨機90度旋轉# Anchor Box的scale
# 根據具體的情況去修改,一般是圖像或目標的大小做調整!!!!
# self.anchor_box_scales = [128,256,512]
self.anchor_box_scales = [4,8,16,64,128,256,512,1024]# Anchor Box的ratio
self.anchor_box_ratios = [[1, 1], [1, 2], [2, 1]]
# self.anchor_box_ratios = [[1, 1]]# 圖像最小變填充后的尺寸
self.im_size = 600# 圖像channel-wise上的mean和std,這個值是根據ImageNet數據集得到的
# 可以根據自己訓練集調整
self.img_channel_mean = [103.939, 116.779, 123.68]
self.img_scaling_factor = 1.0# 一次得到的ROI的個數
self.num_rois = 32# RPN網絡特征圖的縮小倍數(VGG16的是16,其他網絡請自行修改該參數)
# 換網絡時 要換的!!!
self.rpn_stride = 16
# 訓練時是否做類別blance
self.balanced_classes = False# Regression時的scaling the stdev
self.std_scaling = 4.0
self.classifier_regr_std = [8.0, 8.0, 4.0, 4.0]# 訓練集制作過程中的正負樣本的劃分策略,詳細才考faster R-CNN原論文
# overlaps for RPN
self.rpn_min_overlap = 0.3
self.rpn_max_overlap = 0.7# overlaps for classifier ROIs
self.classifier_min_overlap = 0.1
self.classifier_max_overlap = 0.5# class類別映射
self.class_mapping = None# base network的預訓練模型的存放位置
# keras預訓練模型可以在這里下載: https://github.com/fchollet/deep-learning-modelsself.model_path = './pre_train/vgg16_weights_tf_kernels_notop.h5' # 我們使用VGG16
2. 🐎 訓練模型
預訓練模型:Shell下運行
python3 train_frcnn.py --path="./data/annotation.txt" --network="vgg" --input_weight_path="./pre_train/vgg16_weights_tf_kernels_notop.h5"
windows下直接運行我們寫好的批處理文件:
run_train.bat
3. 🚀 模型推斷
將需要測試的圖像和視頻拷貝到./new_test
文件夾
- A.單張圖像推斷
Shell下運行:
python3 test_frcnn.py --path="./new_test"
windows下直接運行我們寫好的批處理文件:
run_inference.bat
- B.視頻推斷
Shell下運行:
python3 test_frcnn_video.py --path="./new_test/test_video.mp4"
windows下直接運行我們寫好的批處理文件:
test_video.bat
4. 🎉 DEMO
?