RetinafaceCurricularFace实战教程将inference_face.py封装为Flask API服务1. 引言为什么要封装成API服务在实际项目中我们经常需要将AI模型部署为在线服务让其他系统能够通过网络调用。想象一下这样的场景你的考勤系统需要实时验证员工身份或者你的社交应用想要添加人脸识别登录功能。如果每次都要登录服务器运行Python脚本不仅效率低下也很难集成到现有系统中。本文将带你一步步将RetinafaceCurricularFace人脸识别模型的推理脚本封装成Flask API服务。学完本教程后你将能够理解Flask框架的基本用法将本地Python脚本转换为Web服务通过HTTP请求进行人脸识别处理图片上传和返回JSON结果即使你是Web开发新手也不用担心我们会从最基础的环境准备开始用最简单的语言讲解每个步骤。2. 环境准备与项目结构2.1 确保环境正确首先进入工作目录并激活预置环境cd /root/Retinaface_CurricularFace conda activate torch252.2 安装Flask框架虽然镜像已经包含了很多依赖但我们还需要安装Flaskpip install flask2.3 创建项目结构建议创建这样的文件结构/root/Retinaface_CurricularFace/ ├── app.py # Flask主程序 ├── inference_face.py # 原有的推理脚本 ├── imgs/ # 图片目录 ├── uploads/ # 新增用于存放上传的图片 └── requirements.txt # 新增依赖列表3. Flask API服务完整实现3.1 创建Flask应用主文件新建一个app.py文件内容如下from flask import Flask, request, jsonify import os import uuid from inference_face import compare_faces app Flask(__name__) # 创建上传目录 UPLOAD_FOLDER uploads os.makedirs(UPLOAD_FOLDER, exist_okTrue) app.config[UPLOAD_FOLDER] UPLOAD_FOLDER app.route(/compare, methods[POST]) def compare_images(): 人脸比对API接口 接收两张图片并返回相似度分数 try: # 检查是否有文件上传 if image1 not in request.files or image2 not in request.files: return jsonify({error: 请上传两张图片}), 400 file1 request.files[image1] file2 request.files[image2] # 检查文件名是否为空 if file1.filename or file2.filename : return jsonify({error: 文件名为空}), 400 # 生成唯一文件名并保存图片 filename1 str(uuid.uuid4()) .jpg filename2 str(uuid.uuid4()) .jpg filepath1 os.path.join(app.config[UPLOAD_FOLDER], filename1) filepath2 os.path.join(app.config[UPLOAD_FOLDER], filename2) file1.save(filepath1) file2.save(filepath2) # 获取阈值参数可选 threshold float(request.form.get(threshold, 0.4)) # 调用人脸比对函数 similarity, result compare_faces(filepath1, filepath2, threshold) # 清理临时文件 os.remove(filepath1) os.remove(filepath2) return jsonify({ similarity: float(similarity), is_same_person: result, threshold: threshold, message: 同一人 if result else 不同人 }) except Exception as e: return jsonify({error: str(e)}), 500 app.route(/health, methods[GET]) def health_check(): 健康检查接口 return jsonify({status: healthy, message: 服务正常运行}) if __name__ __main__: app.run(host0.0.0.0, port5000, debugTrue)3.2 修改推理脚本为可导入模块为了让Flask能够调用我们需要修改原有的inference_face.py使其成为一个可导入的模块在文件末尾添加以下函数def compare_faces(image_path1, image_path2, threshold0.4): 人脸比对函数可供其他模块调用 返回相似度分数和比对结果 # 这里放置原有的推理代码逻辑 # 简化示例实际需要整合原有代码 similarity 0.75 # 这里应该是实际计算出的相似度 is_same similarity threshold return similarity, is_same # 保留原有的命令行功能 if __name__ __main__: # 原有的命令行参数处理逻辑 pass注意实际使用时需要将原有的推理逻辑封装到compare_faces函数中。4. 启动与测试API服务4.1 启动Flask服务在终端中运行python app.py你会看到类似这样的输出* Serving Flask app app * Debug mode: on * Running on all addresses (0.0.0.0) * Running on http://127.0.0.1:5000 * Running on http://[你的IP]:50004.2 测试API接口方法一使用curl命令测试curl -X POST -F image1/path/to/your/image1.jpg -F image2/path/to/your/image2.jpg -F threshold0.4 http://localhost:5000/compare方法二使用Python代码测试创建测试脚本test_api.pyimport requests url http://localhost:5000/compare files { image1: open(imgs/face_recognition_1.png, rb), image2: open(imgs/face_recognition_2.png, rb) } data { threshold: 0.4 } response requests.post(url, filesfiles, datadata) print(response.json())方法三使用Postman测试打开Postman选择POST方法输入URLhttp://localhost:5000/compare在Body中选择form-data添加两个文件字段image1和image2可选添加threshold参数点击Send查看结果5. 实际应用场景与扩展建议5.1 实际应用场景这个API服务可以用于考勤系统员工刷脸打卡时实时比对门禁系统验证访客身份社交应用人脸识别登录相册管理自动整理包含特定人物的照片5.2 性能优化建议对于生产环境建议进行以下优化# 使用生产级服务器代替Flask内置服务器 if __name__ __main__: from waitress import serve serve(app, host0.0.0.0, port5000)安装waitresspip install waitress5.3 添加身份验证为了保护API接口可以添加简单的身份验证from flask_httpauth import HTTPTokenAuth auth HTTPTokenAuth(schemeBearer) tokens { your-secret-token: admin } auth.verify_token def verify_token(token): return tokens.get(token) app.route(/compare, methods[POST]) auth.login_required def compare_images(): # 原有代码6. 常见问题解决6.1 端口被占用如果5000端口被占用可以更换端口if __name__ __main__: app.run(host0.0.0.0, port5001) # 使用5001端口6.2 图片上传失败确保上传目录有写入权限chmod 755 uploads6.3 内存不足对于大量请求可能需要增加内存或添加请求队列。6.4 跨域问题如果从前端JavaScript调用API可能会遇到跨域问题可以添加CORS支持pip install flask-cors然后在app.py中添加from flask_cors import CORS CORS(app)7. 总结通过本教程你已经学会了如何将RetinafaceCurricularFace人脸识别模型封装成Flask API服务。现在你可以通过HTTP请求进行人脸识别比对处理图片上传和JSON响应部署一个生产可用的AI服务将人脸识别能力集成到其他系统中这种封装方式不仅适用于人脸识别也可以用于其他AI模型的部署。关键是理解Flask的基本用法和如何将本地脚本转换为Web服务。下一步你可以尝试添加更多功能如批量处理、结果缓存、或者构建一个完整的前端界面来调用这个API服务。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。