基于Faster R-CNN的安全帽目标检测项目通常旨在解决工作场所,特别是建筑工地的安全监管问题。这类项目使用计算机视觉技术,特别是深度学习中的Faster R-CNN算法,来自动检测工人是否正确佩戴了安全帽,从而确保遵守安全规定并减少事故风险。
项目背景与目标: 在建筑、矿山和其他高风险作业环境中,安全帽是保护工人免受头部伤害的基本装备。然而,人工检查安全帽的佩戴情况效率低下且容易出错。因此,开发自动化检测系统可以提高工作效率和安全性。
技术细节:
应用与优势:
挑战与限制:
总之,基于Faster R-CNN的安全帽目标检测项目是一个综合了数据科学、计算机视觉和深度学习技术的解决方案,旨在提高工作场所的安全性。
数据的标注仍然采用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
根据自己的训练集和训练任务修改./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-models
-
- self.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
将需要测试的图像和视频拷贝到./new_test
文件夹
Shell下运行:
python3 test_frcnn.py --path="./new_test"
windows下直接运行我们写好的批处理文件:
run_inference.bat
Shell下运行:
python3 test_frcnn_video.py --path="./new_test/test_video.mp4"
windows下直接运行我们写好的批处理文件:
test_video.bat