基于MindSpore的实时人脸识别系统:识别未知人脸并显示 'unknown'

本项目使用MindSpore深度学习框架构建了一个实时人脸识别系统,能够识别已知人脸并显示标签,同时对于未知人脸,系统会显示 'unknown' 标签。

代码实现

def train_resnet():
    context.set_context(mode=context.GRAPH_MODE, device_target='CPU')
    train_dataset_generator = TrainDatasetGenerator('D:/pythonproject2/digital_mindspore/dataset')
    ds_train = ds.GeneratorDataset(train_dataset_generator, ['data', 'label'], shuffle=True)
    ds_train = ds_train.shuffle(buffer_size=10)
    ds_train = ds_train.batch(batch_size=4, drop_remainder=True)
    network = load_model_from_ckpt()
    net_loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction='mean')
    net_opt = nn.Momentum(network.trainable_params(), learning_rate=0.001, momentum=0.9)
    #time_cb = TimeMonitor(data_size=ds_train.get_dataset_size())
    #config_ck = CheckpointConfig(save_checkpoint_steps=10,keep_checkpoint_max=10)
    #config_ckpt_path = 'D:/pythonproject2/ckpt/'
    #ckpoint_cb = ModelCheckpoint(prefix='checkpoint_resnet', directory=config_ckpt_path, config=config_ck)

    model = Model(network, net_loss, net_opt, metrics={'Accuracy': Accuracy()})
    #epoch_size = 20
    #print('============== Starting Training =============')
    #model.train(epoch_size, ds_train, callbacks=[time_cb, ckpoint_cb, LossMonitor()])
    face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')  # 加载检测器
    threshold = 0.95  # 设置阈值

    cap = cv2.VideoCapture(0)
    stop = False
    while not stop:
        success, img = cap.read()
        subjects = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9','10']
        # 生成图像的副本,这样就能保留原始图像
        img1 = img.copy()
        # 检测人脸
        # 将测试图像转换为灰度图像,因为opencv人脸检测器需要灰度图像
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        # 检测多尺度图像,返回值是一张脸部区域信息的列表(x,y,宽,高)
        rect = face_cascade.detectMultiScale(img, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30),
                                             flags=cv2.CASCADE_SCALE_IMAGE)
        # 如果未检测到面部     
        if len(rect) == 0:
            txt = 'no face!'
            cv2.putText(img1, txt, (10, 20), cv2.FONT_HERSHEY_COMPLEX, 1, (128, 128, 0), 2)
        if not rect is None:
            for (x, y, w, h) in rect:
                face = img[y:y + w, x:x + h].astype(np.float32)  # 数值转换
                face = cv2.resize(face, (100, 100))
                face = face.transpose().astype(np.float32) / 255.
                face = np.expand_dims(face, axis=0)  # 扩展维度,变成(batch_size, channels, height, width)
                face = Tensor(face)
                cv2.rectangle(img1, (x, y), (x + w, y + h), (0, 255, 0), 2)  # 画出矩形框
                output =network(face)
                predicted_class = np.argmax(output.asnumpy(),axis=1)
                if output.asnumpy()[0][predicted_class[0]] < threshold:
                    label = 'unknown'
                else:
                    label = subjects[predicted_class[0]]
                #label = subjects[predicted_class[0]]
                cv2.putText(img1, label, (x, y), cv2.FONT_HERSHEY_COMPLEX, 1, (128, 128, 0), 2)
        cv2.imshow('img', img1)
        if (cv2.waitKey(1) & 0xFF == ord('q')):  # 按下q程序结束
                stop = True
                cv2.destroyAllWindows()  # 释放窗口

工作原理

  1. 人脸检测: 使用 OpenCV 的 haarcascade_frontalface_alt.xml 检测器进行人脸检测,并获取人脸区域的坐标。
  2. 图像预处理: 将检测到的人脸区域进行尺寸调整和归一化,并转换为 MindSpore 的 Tensor 类型。
  3. 人脸识别: 使用训练好的 ResNet 模型对预处理后的图像进行识别,并获得预测结果。
  4. 结果判断: 判断识别结果的置信度是否小于设定的阈值。如果小于阈值,则将标签设为 'unknown',表示无法识别。否则,根据预测结果获取对应的人脸标签。
  5. 显示结果: 在原始图像上绘制识别结果的矩形框,并在框内显示对应的人脸标签。

总结

本项目使用 MindSpore 深度学习框架构建了一个实时人脸识别系统,能够识别已知人脸并显示标签,同时对于未知人脸,系统会显示 'unknown' 标签。该系统具有以下特点:

  • 使用 MindSpore 框架进行模型训练和推理,具有高性能和易用性。
  • 使用 OpenCV 进行人脸检测,能够快速准确地检测人脸区域。
  • 能够识别已知人脸并显示对应标签,同时对未知人脸显示 'unknown' 标签。
  • 具有实时性,能够实时识别摄像头捕捉到的图像中的人脸。

该系统可以应用于各种人脸识别场景,例如门禁系统、考勤系统、人脸支付系统等。

注意事项

  • 需要使用 OpenCV 库进行人脸检测。
  • 需要使用 MindSpore 库进行模型训练和推理。
  • 需要准备训练好的 ResNet 模型。
  • 需要准备训练数据,用于模型训练。

未来展望

  • 可以进一步优化模型,提高识别精度。
  • 可以加入人脸属性识别功能,例如性别、年龄、表情等。
  • 可以整合到实际应用中,例如门禁系统、考勤系统、人脸支付系统等。
基于MindSpore的实时人脸识别系统:识别未知人脸并显示 'unknown'

原文地址: https://www.cveoy.top/t/topic/jri0 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录