回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

智能考场验证系统 简单

头像 风悠扬0539 2025.12.17 24 3

一、项目背景
近年来,公务员和事业单位编制等考试中作弊现象日益严重,作弊手段不断升级,给考试公平性带来严峻挑战。根据搜索结果,当前考试作弊主要呈现以下特点:

‌ 组织化、专业化作弊‌:作弊已从个体行为演变为组织化、专业化的黑色产业,形成"枪手"团队和完整的作弊产业链。犯罪团伙通过计算机合成兼具考生和"枪手"面部特征的照片,制作虚假身份证件和准考证,由"枪手"持假证件混入考场。

‌ 高科技作弊手段‌:包括使用无线耳机传答案、考前获取真题、篡改报名信息等。部分团伙甚至建立了"枪手人才库",根据考生性别、面部特征、报考岗位类别精准匹配替考者。

‌ 传统身份验证手段的不足‌:现有考场身份核验系统存在致命漏洞——静态照片识别缺陷、动态捕捉失效和人工核验形同虚设。测试显示,部分考场的人脸闸机对戴眼镜考生的识别错误率高达34%。

二、传统人脸识别系统的不足
当前考试场景中使用的人脸识别主要存在以下技术瓶颈:

‌ 识别准确性受多种因素影响‌:考生面部变化(熬夜、感冒、体重改变)影响识别;长相大众化的考生识别困难;光线条件、角度问题影响识别准确性。
‌ 实施层面的挑战‌:监考人员仅用肉眼扫视证件照与真人"轮廓相似"就放行;全国仍有68%的考场在使用单一人脸识别设备
三、方案意义
本方案采用行空板K10和二哈视觉传感器构建新一代考试防作弊人脸识别系统,具有以下‌社会价值‌:维护考试公平,保障人才选拔的公信力;打击考试作弊黑色产业链;推动国产自主可控AI技术在教育考试领域的应用。本系统通过技术创新解决了传统人脸识别在考试场景中的诸多不足,为考试组织部门提供了高效、可靠的身份验证和作弊行为检测解决方案。

四、系统架构设计

本系统采用边缘计算架构,由以下核心组件构成:

行空板K10‌:作为主控单元,负责系统调度、数据处理和实时显示检测结果。

‌ 二哈视觉传感器‌:用于采集考生人脸,作为AI视觉处理单元,负责人脸检测识别。

‌‌ 可视化大屏:用于显示考生检查结果,清晰的看到考生到场情况。

五、实现原理

通过二哈学习考生的人脸特征,建立考生人脸数据库。考生进入考场​,正对摄像头​,系统自动识别人脸​​,在K10屏幕上显示验证信息,同时可视化大屏显示考生检查结果。

材料清单

  • 行空板K10 X1 链接
  • 二哈识图2 X1 链接
  • 行空板多功能扩展板 - K10专用 X1 链接
  • Type-C数据线 X1 链接
  • PH2.0-4P白色硅胶绞线 X1 链接

软件:Mind+ V1.81 RC3.0

软硬件图示:

image.png

步骤1 外观结构

设计并制作

外壳设计.png

步骤2 二哈采集人脸数据

1.给HUSKYLENS 2供电,启动成功后,找到“人脸识别”功能。

Interface Diagram

2.对准要学习的某个人脸,人脸被白框框住后,调整HUSKYLENS 2“看”的角度,使屏幕中间的“十”字位于白色框内,然后按下HUSKYLENS 2右上角A键,学习该人脸。

Interface Diagram

3.学习完成后,如识别到已学习的人脸,屏幕将以彩色方框框出人脸,并在人脸上方显示人名、ID号及置信度,例如“人脸:ID1 97%”。其中人名默认为“人脸”,设置人名请看本功能“参数设置”;"ID1"即学习的第一个人的脸;“97%”是指置信度为97%。 在机器学习中,置信度指的是模型对自己预测结果的“确定程度”,比如这里人脸ID197%的意思是模型“认为当前画面中的已学习的ID1人脸的可能性是 97%”

Interface Diagram

4.给学习过的人脸设置名字,中英文均可。
设置步骤:点击“设置名字”,上下滑动左上角的数字,选择为哪个ID设置名字;点击屏幕上的键盘可设置名字,如左图;设置完毕需点击右下角√键保存,保存成功则右上角会显示绿色对勾标志。

Interface Diagram

控制识别到人脸时,是否显示名字,默认为显示。
设置步骤:点击“显示名字”,其上方开关为蓝色,即打开状态,识别到人脸时,会显示其名字,效果如左图;点击开关,开关颜色变为白色,即关闭状态,识别到人脸时,不会显示名字,效果如右图。

Interface Diagram

训练一下十个模型,用真人麻烦,就在网上找了几张照片来测试

演示文稿1.jpg

步骤3 SIOT设置

软件下载

  • Mind+1.8及以上版本:官网下载
  • SIoT V2版本 : 网盘下载

下载链接:

腾讯微云下载(推荐):
链接: https://share.weiyun.com/6SFhgLQj

百度云盘下载:
链接:https://pan.baidu.com/s/17clVjJXWTZh02FteKy3mcA?pwd=mind
提取码:mind

谷歌云盘下载:
链接: 点击下载

3-启动SIoT V2,在电脑上运行SIoT

在Windows上运行时容易出现网络连接问题,不推荐,优点是不依赖其他硬件。

1.下载win版本的SIoT V2解压,双击start SIoT.bat即可启动新版SIoT,启动之后会弹出小黑窗启动服务器。

注意运行的是start SIoT.bat而不是main.exe

注意:启动时需要将SIoT添加到允许应用通过防火墙,勾选专用网络和公用网络,否则外部设备可能无法访问。

运行start SIoT.bat以后显示以下界面

image.png

2.在浏览器输入 本机IP:192.168.1.9:8080 即可打开网页端口,登录账号依然为siot,密码为dfrobot,打开后可以新建Topic。如下图

siot数据管理.png

步骤4 可视化面板设置

打开Mind+,进行可视化面板设置,设置后的效果如下image.png

设置时候,选择物联网平台设置如下:服务器地址要对应

image.png

步骤5 初始化Mind+设置

运行Mind+ V1.81 RC3.0,点击设置选择主控板行空板K10加载

image.png

选择网络服务,选择MQTT和Wi-Fi模块加载

image.png

选择用户库,输入二哈识图并搜索,添加二哈识图2

image.png

添加后加载

image.png

返回到主界面

步骤6 编写程序

在函数里面自定义模块如下:

image.png

准备代码如下:

准备界面.png

显示效果:

封面.png

成功代码如下:

验证成功.png

显示效果:

成功.png

失败代码如下:

验证失败.png

显示效果:

失败图.png

人脸判断代码如下:

人脸判断.png

网络服务代码如下:

网络服务.png

主程序代码如下:

主程序.png

完整程序如下:

主程序.png

代码
/*!
 * MindPlus
 * esp32s3bit
 *
 */
#include "asr.h"
#include <DFRobot_Iot.h>
#include "unihiker_k10.h"
#include "arduino_image_cache.h"
#include "DFRobot_HuskylensV2.h"
// 函数声明
void DF_WangLuoFuWu();
void DF_RenLianPanDuan();
void DF_ChengGong();
void DF_ZhunBei();
void DF_ShiBai();
// 静态常量
const String topics[5] = {"","","","",""};
// 创建对象
DFRobot_Iot  myIot;
UNIHIKER_K10 k10;
uint8_t      screen_dir=2;
ASR          asr;
HuskylensV2  huskylens;


// 主程序开始
void setup() {
	k10.begin();
	k10.initScreen(screen_dir);
	k10.creatCanvas();
	asr.setAsrSpeed(3);
	DF_ZhunBei();
	DF_WangLuoFuWu();
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	huskylens.switchAlgorithm(ALGORITHM_FACE_RECOGNITION);
  delay(5000);
}
void loop() {
	huskylens.getResult(ALGORITHM_FACE_RECOGNITION);
	if ((huskylens.available(ALGORITHM_FACE_RECOGNITION))) {
		DF_RenLianPanDuan();
	}
	else {
		DF_ZhunBei();
	}
	delay(2000);
}


// 自定义函数
void DF_WangLuoFuWu() {
	myIot.wifiConnect("Hq123456", "Hq12345678");
	while (!myIot.wifiStatus()) {}
	myIot.init("192.168.1.9","siot","7786314711751141","dfrobot", topics, 1883);
	myIot.connect();
	while (!myIot.connected()) {}
	myIot.publish("siot/1赵七", "缺考");
	myIot.publish("siot/2李四", "缺考");
	myIot.publish("siot/3赵雪", "缺考");
	myIot.publish("siot/4张雪", "缺考");
	myIot.publish("siot/5王五", "缺考");
	myIot.publish("siot/6宋六", "缺考");
	myIot.publish("siot/7张三", "缺考");
	myIot.publish("siot/8王雪", "缺考");
	myIot.publish("siot/9宋雪", "缺考");
	myIot.publish("siot/10李雪", "缺考");
}
void DF_RenLianPanDuan() {
	if (((huskylens.getCachedResultByID(ALGORITHM_FACE_RECOGNITION, 1) != NULL))) {
		DF_ChengGong();
		k10.canvas->canvasDrawBitmap(0,0,239,319,image_data1);
		k10.canvas->updateCanvas();
		myIot.publish("siot/1赵七", "姓名:赵七  准考证号:372801001  座号:01", 1);
	}
	else if (((huskylens.getCachedResultByID(ALGORITHM_FACE_RECOGNITION, 2) != NULL))) {
		DF_ChengGong();
		k10.canvas->canvasDrawBitmap(0,0,239,319,image_data2);
		k10.canvas->updateCanvas();
		myIot.publish("siot/2李四", "姓名:李四  准考证号:372801002  座号:02");
	}
	else if (((huskylens.getCachedResultByID(ALGORITHM_FACE_RECOGNITION, 3) != NULL))) {
		DF_ChengGong();
		k10.canvas->canvasDrawBitmap(0,0,239,319,image_data3);
		k10.canvas->updateCanvas();
		myIot.publish("siot/3赵雪", "姓名:赵雪  准考证号:3728010013 座号:03");
	}
	else if (((huskylens.getCachedResultByID(ALGORITHM_FACE_RECOGNITION, 4) != NULL))) {
		DF_ChengGong();
		k10.canvas->canvasDrawBitmap(0,0,239,319,image_data4);
		k10.canvas->updateCanvas();
		myIot.publish("siot/4张雪", "姓名:张雪 准考证号:372801004 座号:04");
	}
	else if (((huskylens.getCachedResultByID(ALGORITHM_FACE_RECOGNITION, 5) != NULL))) {
		DF_ChengGong();
		k10.canvas->canvasDrawBitmap(0,0,239,319,image_data5);
		k10.canvas->updateCanvas();
		myIot.publish("siot/5王五", "姓名:王五  准考证号:372801005  座号:05");
	}
	else if (((huskylens.getCachedResultByID(ALGORITHM_FACE_RECOGNITION, 6) != NULL))) {
		DF_ChengGong();
		k10.canvas->canvasDrawBitmap(0,0,239,319,image_data6);
		k10.canvas->updateCanvas();
		myIot.publish("siot/6宋六", "姓名:宋六  准考证号:372801006  座号:06");
	}
	else if (((huskylens.getCachedResultByID(ALGORITHM_FACE_RECOGNITION, 7) != NULL))) {
		DF_ChengGong();
		k10.canvas->canvasDrawBitmap(0,0,239,319,image_data7);
		k10.canvas->updateCanvas();
		myIot.publish("siot/7张三", "姓名:张三  准考证号:372801007  座号:07");
	}
	else if (((huskylens.getCachedResultByID(ALGORITHM_FACE_RECOGNITION, 8) != NULL))) {
		DF_ChengGong();
		k10.canvas->canvasDrawBitmap(0,0,239,319,image_data8);
		k10.canvas->updateCanvas();
		myIot.publish("siot/8王雪", "姓名:王雪 准考证号:372801008  座号:08");
	}
	else if (((huskylens.getCachedResultByID(ALGORITHM_FACE_RECOGNITION, 9) != NULL))) {
		DF_ChengGong();
		k10.canvas->canvasDrawBitmap(0,0,239,319,image_data9);
		k10.canvas->updateCanvas();
		myIot.publish("siot/9宋雪", "姓名:宋雪  准考证号:372801009  座号:09");
	}
	else if (((huskylens.getCachedResultByID(ALGORITHM_FACE_RECOGNITION, 10) != NULL))) {
		DF_ChengGong();
		k10.canvas->canvasDrawBitmap(0,0,239,319,image_data10);
		k10.canvas->updateCanvas();
		myIot.publish("siot/10李雪", "姓名:李雪 准考证号:372801010  座号:10");
	}
	else {
		DF_ShiBai();
		delay(1000);
	}
	delay(1000);
}
void DF_ChengGong() {
	k10.rgb->brightness(round(9));
	k10.rgb->write(-1, 0x00FF00);
	asr.speak("验证成功!");
}
void DF_ZhunBei() {
	k10.canvas->canvasDrawBitmap(0,0,239,319,image_data11);
	k10.canvas->updateCanvas();
	k10.rgb->brightness(round(9));
	k10.rgb->write(-1, 0xFFFF00);
}
void DF_ShiBai() {
	k10.canvas->canvasDrawBitmap(0,0,239,319,image_data12);
	k10.canvas->updateCanvas();
	k10.rgb->brightness(round(9));
	k10.rgb->write(-1, 0xFF0000);
	asr.speak("验证失败,请重新验证!");
}

评论

user-avatar
  • 云天

    云天2025.12.18

    视频中展示的是二哈1代?

    2
    • 风悠扬0539

      风悠扬05392025.12.18

      二哈二代

    • 风悠扬0539

      风悠扬05392025.12.18

      我拆开了,让摄像头和屏幕在同一侧