基于神经网络的安全帽佩戴检测 (一)

选题目的及意义

作为个人防护用具安全帽是生活中最常见也是最实用的,对于外来的危险对头部的伤害可以做到有效地防止和减轻。在出入一些基础的工地时,安检人员会逐一检查工人是否有佩戴安全帽,可仅仅是这样的检查并不能保证工作人员在施工期间一直带着安全帽,而且原始的检查督促方法耗时又耗力

在这样的环境的驱使和科学技术的不断发展下,为了保证员工都能在作业中带上安全帽,急需一套安全帽佩戴检测系统来24小时监督

本系统基于神经网络的高度复杂性,来对各种复杂信息进行迭代分析,使得安全帽佩戴检测成为现实。当系统成熟后,能够有效地判断出没有佩戴安全帽的工人,并发出预警。从而能够确保工人们不会因为疏忽大意而置自身于危险之中

项目架构图

架构图

环境搭建

下载 Python 解释器,传送门

最好下载个IDE(推荐Pycharm)

版本

Python —— 3.7.0

Tensorflow —— 1.14.0

Keras —— 2.2.5

数据下载与准备

百度网盘

数据集

把下载后的三个数据集目录(Annotations、ImageSets、JPEGImages)放在根目录的 data 目录下的data目录下(两个data目录)

数据的标注仍然采用VOC格式的数据标注形式

可以运行如下代码实现数据集的准备工作

python3 ./data/data_pro.py

其中 data_pro.py 的代码如下

import os
import xml.etree.ElementTree as ET


class Data_preprocess(object):
    """
    解析xml数据
    """
    def __init__(self, data_path):
        self.data_path = data_path
        self.classes = ["hat", "person"]

    def load_data(self):
        image_names = os.listdir(os.path.join(self.data_path, "JPEGImages"))
        image_index = 0
        for image_name in image_names:
            image_index += 1
            image_path = os.path.join(self.data_path, "JPEGImages", image_name)
            anno_name = image_name.split(".")[0] + ".xml"
            filename = os.path.join(self.data_path, "Annotations", anno_name)
            tree = ET.parse(filename)
            image_size = tree.find("size")
            image_width = int(float(image_size.find("width").text))
            image_height = int(float(image_size.find("height").text))

            objects = tree.findall("object")

            for obj in objects:
                box = obj.find("bndbox")
                x1 = int(float(box.find("xmin").text))
                y1 = int(float(box.find("ymin").text))
                x2 = int(float(box.find("xmax").text))
                y2 = int(float(box.find("ymax").text))
                class_name = obj.find("name").text.lower()
                if class_name not in self.classes:
                    continue

                if x1 >= x2 or y1 >= y2:
                    continue

                with open("annotation.txt", "a", encoding="utf-8") as f:
                    # filename,x1,y1,x2,y2,class_name
                    f.write(
                        image_path
                        + ","
                        + str(x1)
                        + ","
                        + str(y1)
                        + ","
                        + str(x2)
                        + ","
                        + str(y2)
                        + ","
                        + class_name
                        + "\n"
                    )
                # f.close()

            print("[ INFO ] index:{}, path:{}".format(image_index, image_path))


if __name__ == "__main__":
    # Faster R-CNN 需要的训练集
    base_path = os.getcwd()
    data_path = os.path.join(base_path, "data")  # 绝对路径

    data_p = Data_preprocess(data_path)
    data_p.load_data()

    print("==========data pro finish===========")

注意,由于上面用到了 os.getcwd() ,因此当前目录必须是 ./data 目录下

将在 ./data/data 文件夹下生成annotation.txt文件。annotation.txt 里面每一行的数据格式都是  path_filename, x1, y1, x2, y2, class_name ,即文件名(绝对路径)、VOC标注的四个值以及分类名(帽子或者人)

这样训练数据的准备工作即完成

预训练模型下载

vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5

注意,此处的预训练模型并不是最终的模型。最终的模型需要在它的基础上进行大量的训练来得到损失函数的最小解

把下载好的预训练模型放置  ./pre_train 目录下

小结

本系列的开篇文章介绍了选题意义、环境搭建以及数据集和模型的下载与准备。后续会进一步解析代码和进行原理的探究

评论或私信站长


  1. #该文章暂时没有评论