一、项目简介
功能描述:本项目基于Java Spring Boot开发人脸识别签到系统,接入阿里云人脸比对API与OSS对象存储实现云端高精度人脸识别,同时自研多特征人脸比对算法作为离线降级方案,整合图像解析、文件读写、前后端交互等功能,实现学生信息录入、摄像头人脸采集、智能签到、签到数据统计全流程。开发过程独立完成,未直接照搬他人代码,仅参考Java图像处理、Spring Boot接口开发、阿里云OpenAPI对接相关技术文档。
个人负责任务:系统整体架构设计、后端代码开发、阿里云人脸API 与OSS对接开发、本地多特征人脸比对算法实现、文件数据持久化、RESTful接口编写、全场景异常容错处理、项目打包部署与功能测试。
二、功能架构图
系统分为前端展示层、后端服务层、数据持久层三大模块:
1.前端层:checkin.html提供页面交互、摄像头调用、图片Base64编码、请求发送;
2.后端服务层(本人全权开发):Spring Boot 服务、RESTful 接口、图像处理、阿里云人脸 API 与 OSS 云端服务对接、本地人脸比对算法、请求路由、跨域处理;
3.数据持久层:本地JSON文件students.json存储学生信息,photos文件夹存储人脸照片。
三、个人任务简述
本人独立完成整个人脸识别签到系统后端所有功能开发、算法实现、数据管理与项目调试,下表为具体任务:
序号 | 完成功能与任务 | 描述 |
1 | Spring Boot项目搭建与环境配置 | 使用Maven管理项目依赖,整合Spring Boot Web、Lombok、Jackson等组件,配置项目编译、打包、运行环境,搭建标准Java Web项目结构。 |
2 | 面向对象设计 | 定义学生实体类Student,采用面向对象思想拆分功能模块,封装图像处理、文件操作、人脸比对工具方法,代码低耦合、易维护。 |
3 | RESTful接口开发与跨域处理 | 编写新增学生、人脸签到、查询学生列表、签到状态查询、重置签到等接口,配置跨域支持,实现前后端数据正常交互。 |
4 | 本地文件数据持久化 | 不使用数据库,采用JSON文件存储学生信息,通过Jackson框架实现JSON序列化与反序列化,结合IO流完成照片文件本地保存。 |
5 | 云端人脸API对接+本地备用算法(重难点) | 对接阿里云人脸比对API、阿里云OSS对象存储,完成图片云端上传与云端身份识别;同时纯 Java实现多特征融合本地图像比对算法,作为API故障时的降级方案,保障服务可用。 |
6 | 图像预处理功能 | 实现图片Base64编解码、尺寸缩放、RGB转灰度图、图像格式统一等预处理逻辑,解决不同摄像头图片尺寸、格式不一致问题。 |
7 | 异常捕获与容错处理 | 针对文件不存在、图片解析失败、参数缺失、IO异常等场景增加异常捕获,完善日志输出,提升系统稳定性。 |
8 | 项目打包与部署测试 | 编写启动批处理脚本,完成项目编译、打包、运行测试,解决端口占用、文件路径、图片解析等线上问题。 |
四、本人负责功能详解
1. *面向对象设计
简述:
本系统采用面向对象思想进行模块化设计,划分实体类、业务控制类、工具方法。核心分为两大核心类:
1.启动与控制类CheckinServer:Spring Boot启动入口、接口接收、业务逻辑调度,整合所有功能;
2.实体内部类Student:使用Lombok简化实体代码,封装学生学号、姓名、照片路径、录入时间等属性;
3.所有图像处理、人脸比对、文件读写逻辑均封装为独立私有方法,遵循单一职责原则,代码复用性强,同时封装阿里云 API 签名、OSS 图片上传相关网络工具方法,统一处理云端服务调用逻辑。
2. *云端API对接+本地人脸比对降级方案(重难点)
简述
该模块为系统核心功能,采用云端识别为主、本地算法为辅的双方案设计。
1.主方案:对接阿里云人脸比对 API 与阿里云 OSS,将前端采集的图片上传至云端存储,调用官方接口完成人脸相似度比对,识别精度高;
2.降级方案:当网络异常、云端 API 调用失败、OSS 上传出错时,自动切换为本地多特征融合算法;纯代码实现像素相似度、SSIM 结构相似度、直方图等图像特征计算,加权融合得出匹配结果。难点:阿里云 API 签名计算、OSS 文件上传、网络请求异常捕获、主备方案自动切换、两套识别逻辑阈值适配。解决方法:按照阿里云接口规范实现 HMAC-SHA1 签名逻辑,增加多级异常捕获;分别为云端、本地算法设置独立匹配阈值,保证两种模式下识别效果稳定。
核心逻辑流程
(1)云端识别主流程(优先执行)
1.接收前端Base64人脸图片,完成解码与图像预处理;
2.将图片字节流上传至阿里云OSS,获取云端图片公网URL;
3.按照阿里云OpenAPI规范计算HMAC-SHA1接口签名,调用人脸比对API;
4.解析云端返回的人脸相似度数值,设置阈值判断签到结果;
5.若网络超时、API报错、OSS上传失败,自动触发本地降级算法。
(2)本地多特征比对降级流程
1.对Base64图片解码,转为BufferedImage图像对象;
2.统一图片尺寸、转为灰度图,完成图像预处理;
3.分别计算像素相似度、SSIM结构相似度、直方图相似度;
4.求取三者平均值作为综合相似度;
5.遍历所有学生照片,筛选最优匹配,结合阈值判断签到是否成功。
3.*文件数据读写模块(重难点)
简述
系统无MySQL等数据库,采用本地JSON文件+文件夹实现数据持久化。使用Jackson框架完成JSON与Java对象的互转,结合Java IO流实现学生照片的保存与读取。同时搭配阿里云 OSS 实现人脸图片云端持久存储,形成本地 + 云端双存储方案。
难点:JSON文件读写编码乱码、图片Base64解码异常、目录自动创建、文件缺失容错。
解决方法:统一使用UTF-8编码读写文件;提前判断目录是否存在并自动创建;增加try-catch捕获IO、解析异常。
4.数据库(文件)设计
简述
本系统未使用传统关系型数据库,采用文件型数据存储方案,分为两部分:
1.学生信息文件:students.json,JSON 格式存储所有学生基础信息、照片路径、录入时间;
2.人脸照片目录:photos/文件夹,按学号_姓名.jpg规则命名存储人脸图片。
该设计轻量、无需额外安装数据库,适合小型桌面Web系统,数据结构简单清晰。同时配套阿里云 OSS 对象存储实现人脸图片云端备份与云端识别调用,形成本地文件 + 云端对象存储双存储架构。
5.接口开发与前后端交互
简述
基于 Spring Boot @RestController 开发 RESTful 接口,接收前端 JSON 请求,处理业务后返回标准 JSON 结果;配置跨域注解解决前端跨域报错。共实现 6 个核心接口,覆盖增、查、签到、签到重置全业务。
五、课程设计感想
本次Java课程设计我选择独立完成人脸识别签到系统,从项目搭建到代码调试全程自主摸索,收获很多也遇到了不少难题。
首先最大的困难是Java原生图像处理与人脸比对算法。此前只学习过基础Java语法,没有接触过Web开发、BufferedImage图像类、像素运算相关知识,一开始完全不知道如何对比两张图片。我先查阅 Java 图像处理资料,逐个学习图片缩放、灰度转换、像素读取等基础操作,再分步实现像素相似度、SSIM算法,反复调试算法公式与特征权重,解决了人脸相似度计算偏差、图片解析失败等问题,通过打印日志一步步定位bug,最终完成算法融合。
其次是文件读写与编码问题。在读写JSON和图片文件时,频繁出现中文乱码、文件找不到、Base64解码失败的情况。我逐一规范编码格式为UTF-8,增加文件目录自动创建、参数非空校验等容错逻辑,慢慢解决了数据持久化的问题。
另外,前后端跨域、端口占用、Maven 依赖冲突也是实际开发中常见的问题。通过配置跨域注解、修改服务端口、核对pom.xml依赖版本,保证项目正常运行。
这次课程设计让我把课堂上学的面向对象、集合、IO 流、Spring Boot 等知识点真正落地应用,不再局限于书本例题;本次开发除完成 Java Web 与本地图像处理开发外,还自学掌握了第三方云 API 对接、HMAC-SHA1 接口签名、OSS 对象存储等云服务相关知识,理解了「云端识别为主、本地算法降级备用」的项目容错设计思想,拓宽了网络编程与云服务开发的视野。独立开发的过程锻炼了我的问题排查能力和自主学习能力,也明白了软件开发需要严谨的逻辑和足够的耐心。
六、展望
(一) 现有功能不足与改进方案
1.复杂场景人脸识别准确率有限:系统默认调用阿里云人脸 API 完成高精度识别,但离线降级时仅依靠本地基础图像特征比对,在复杂光线、侧脸、遮挡情况下识别效果较差。后续计划引入轻量级人脸检测算法,先定位人脸区域再比对,过滤无效背景,提升离线模式下识别准确率。
2.数据存储方式简陋:目前使用JSON文件存储,当学生数量增多后,文件读写效率会下降。后续可接入MySQL数据库,使用MyBatis实现数据操作,优化查询性能。
3.功能单一:缺少签到记录查询、历史数据统计、分页展示等功能。后续新增签到日志模块,按日期、班级查询签到记录。
4.异常提示不够友好:当前仅后台打印日志,前端报错信息简略。后续完善前端异常提示,区分参数错误、图片错误、识别失败等不同场景。
(二)后续学习与拓展计划
1.深入学习Java图像处理、计算机视觉相关知识,了解主流人脸识别开源框架,丰富算法能力;
2.学习数据库与持久层框架(MySQL、MyBatis),完善项目架构,让系统更贴合企业级开发标准;
3.学习单元测试(JUnit),为现有接口和算法编写测试用例,保证代码稳定性;
4.可优化云端API调用逻辑,增加请求缓存减少OSS重复上传;也可将阿里云API能力整合到Java后端中,实现全Java技术栈的云端人脸识别系统。