感谢 电子信息学院石雅琪同学的建议,先检测人脸再对人脸作预测可以有效避免环境干扰
本程序目前存在一个bug,在检测不到人脸时画面会卡住,理论上它应该要在画面中实时显示错误信息,单步调试时功能完好,但是运行起来却会卡住。目前尚未找到解决方法。
虽然没检测到人脸时会被卡住,但是一旦再次检测到人脸又会正常运行,所以此bug只是会影响用户体验,并不影响口罩识别的核心功能
注意:opencv的人脸检测在光照强的时候会框的很不准,因此在强光照下最好使用app_backup.py,这是加入人脸检测前的版本
这是一个人脸口罩识别的小项目
用的是经典的 mobilenetv2网络,能够调用电脑的摄像头实时判断摄像头前的人是否配套口罩
图像上方会实时显示当前摄像头的帧率、预测的结果(摄像头里的人带不带口罩)以及预测的准确率
python 3.7
tensorflow 2.1.0 (至少2以上)
opencv3.4.2
本项目使用于 win10
推荐使用 pycharm + anaconda3 配置环境
运行 app.py
在模型加载完成后(需要一点时间),程序就会开始运行
#如何换模型进行预测 本项目目前训练了两个模型,训练后的模型权重值(ckpt文件)全部位于save_weights中
resMobileNetV2.ckpt.data-0000-of-0001
resMobileNetV2.ckpt.index
resMobileNetV2.ckpt.data-0000-of-0001
resMobileNetV2.ckpt.index
除了checkpoint之外,每个模型都有两个文件,一个是XXX.ckpt.data-0000-of-0001 和 XXX.ckpt.index
如果要修改预测所需的模型:
在 predict.py 中修改 weights_path 的值
注意 修改时应该写 resMobileNetV2.ckpt 或是 resMobileNetV2.ckpt
其余后缀不用加
注意,预测时的模型搭建必须与训练时一样
feature = MobileNetV2(num_classes=num_classes, include_top=False)
model = tf.keras.Sequential([feature,
tf.keras.layers.GlobalAvgPool2D(),
tf.keras.layers.Dropout(rate=0.5),
tf.keras.layers.Dense(num_classes),
tf.keras.layers.Softmax()])
...
assert len(glob.glob(weights_path + "*")), "cannot find {}".format(weights_path)
model.load_weights(weights_path)
因为数据集太大了,因此我没有在github上放数据集
你可以参考这里的数据集 https://github.com/X-zhangyang/Real-World-Masked-Face-Dataset
如果你要训练自己的数据集,首先在工程目录下新建一个data_set文件夹
新的数据集应该放入data_set中,目录结构如下:
data_set
...
data_root
your_data_set_dir
calss_1
class_2
...
首先修改 class_indices.json 中的分类
然后,需要划分训练集和数据集,在 split_data.py 中修改 my_data_root 为上述结构中的 data_root,
修改 my_origin_face_path 为上述结构中的 your_data_set_dir
运行 split_data.py, 会多出 train 和 val 两个文件夹,得到的目录应该如下所示:
data_set
...
data_root
your_data_set_dir
calss_1
class_2
...
train
calss_1
class_2
...
val
calss_1
class_2
...
顾名思义,train 文件夹存放着训练集,val 文件夹存放着验证集
默认分10% 的数据作为验证集,如果想修改,修改 main函数中的 split_rate
接着,在train_mobilenet_v2.py中修改如下值:
- 修改 img_data_dir 为上述结构中的data_root
- 修改 save_weights_path 为你想要保存的权重文件路径
本项目基于迁移学习的方法进行训练,默认是采用tensorlfow官网提供的预训练模型,此模型位于 tf_mobilenet_weights 文件夹中,如果想要使用自己的预训练模型, 在 train_mobilenet_v2.py 的main函数中修改 pre_weights_path
![avator](./Doc Pictures/run_1.png)
![avator](./Doc Pictures/run_2.png)
-
运行程序时可能会报错 Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2
这是因为tensorflow的版本不对,但是无伤大雅,不影响程序运行 -
Doc文件夹中存放着本项目的问题日志, 如果程序运行时发生了什么问题可以去搜一下
吴黄巍
四川大学电子信息学院18级