开发专题
人工智能AI
机器学习ML
深度学习DL
关于大模型的一些基础内容
一些人工智能的架构图
使用ollama在本地启动运行大语言模型
在本地部署sd使用AI生图功能
AIGC入门教程
队列
RabbitMQ消息队列
redis+mq实现秒杀功能
非结构化存储OSS
使用minio进行数据存储
非结构化文档在线预览
使用kkfileView实现在线文档预览
OnlyOffice实现文档在线编辑
全文搜索
Elasticsearch构建全文搜索系统
windowns下使用Logstash7.6.2同步Mysql数据到ElasticSearch,并使用kibana进行检索
工作流Flowable应用
Flowable基础入门知识
Springboot+mybatisplus+flowable6.5.0 开发房产审批模块
人脸识别
虹软人脸识别应用
人脸识别基础入门知识
WebSocket在线聊天
Springboot+WebSocket+redis实现在线客服系统
WebSocket基础入门
信创产业
领域驱动DDD
定时任务quartz
流媒体
流媒体服务LALMAX的部署安装与使用
使用go2rtc+webrtc-streamer在网页上播放rtsp 的摄像头视频
RPA数字员工
使用盘匠设计器进行RPA项目的开发
RPA开发过程中的一些经验之谈
本文档使用 MrDoc 发布
-
+
首页
虹软人脸识别应用
> 使用虹软人脸识别的解决方案。 需要到官网开放平台注册一个自己的账号,然后开通人脸识别的产品,这一切都是免费的。 虹软的SDK都是免费使用的,个人可以激活100个码,认证企业可以激活5000个码,但是免费使用的sdk,每年都是 重新到官网替换一次激活码,而且第一次激活的时候,要保持设备在线。 有收费的版本,sdk 120块钱一个码,可以完成离线使用,适合于不能联网的内网机器,但是起售100个,也就是一次就是花1W多块钱,,,但是某些二手平台 有人单个码甩卖。。。 - 看一下下面这个demo: 地址:https://github.com/itboyst/ArcSoftFaceDemo 这个demo里演示了 3.0和4.1版本的详细用法,写的很好,里面的代码基本可以直接用于生产环境,可以说是开箱即用。 ### 业务需求 需要在浏览器端,通过调用webrtc进行摄像头画面的输出 ,然后把人脸的照片,转成base64发送到后台,后台拿到照片后,识别出人脸的特征值 ,然后到后台的数据库里去找这张脸。 ~~~ 1. 通过tracking.js库,在前端进行人脸识别 2. 如果识别到人脸的情况下,才往后端发送人脸照片 3. 后端拿到人脸照片后,提取人脸特性值 4. 根据特征值去数据库进行人脸比对 ~~~ #### 关键代码片断1和2: ~~~js init() { this.video = this.mediaStreamTrack = document.getElementById('video'); this.screenshotCanvas = document.getElementById('screenshotCanvas'); let canvas = document.getElementById('canvas'); let context = canvas.getContext('2d'); // 固定写法 let tracker = new window.tracking.ObjectTracker('face'); tracker.setInitialScale(4); tracker.setStepSize(2); tracker.setEdgesDensity(0.1); //摄像头初始化 this.trackerTask = window.tracking.track('#video', tracker, { camera: true }); let _this = this; tracker.on('track', function (event) { // 检测出人脸 绘画人脸位置 context.clearRect(0, 0, canvas.width, canvas.height); event.data.forEach(function (rect) { context.strokeStyle = '#0764B7'; context.strokeRect(rect.x, rect.y, rect.width, rect.height); }); // event.data.length长度为多少代表检测几张人脸 if (_this.uploadLock && event.data.length) { //上传图片 _this.screenshotAndUpload(); } }); }, ~~~ #### 关键代码片断3 ~~~java @RequestMapping(value = "/faceRecognition", method = RequestMethod.POST) @ResponseBody public Response<List<FaceRecognitionResDTO>> faceRecognition(@RequestBody FaceRecognitionReqDTO faceRecognitionReqDTO) { String image = faceRecognitionReqDTO.getImage(); List<FaceRecognitionResDTO> faceRecognitionResDTOList = Lists.newLinkedList(); byte[] bytes = Base64Util.base64ToBytes(image); ImageInfo rgbData = ImageFactory.getRGBData(bytes); List<FaceInfo> faceInfoList = faceEngineService.detectFaces(rgbData); if (CollectionUtil.isNotEmpty(faceInfoList)) { for (FaceInfo faceInfo : faceInfoList) { FaceRecognitionResDTO faceRecognitionResDTO = new FaceRecognitionResDTO(); faceRecognitionResDTO.setRect(faceInfo.getRect()); byte[] feature = faceEngineService.extractFaceFeature(rgbData, faceInfo,ExtractType.RECOGNIZE); if (feature != null) { List<UserRamCache.UserInfo> userList = userFaceService.getUserList(); if(userList.size() == 0){ return Response.newSuccessResponse(faceRecognitionResDTOList); } List<UserCompareInfo> userCompareInfos = faceEngineService.faceRecognition(feature, userList, 0.8f); if (CollectionUtil.isNotEmpty(userCompareInfos)) { faceRecognitionResDTO.setName(userCompareInfos.get(0).getName()); faceRecognitionResDTO.setSimilar(userCompareInfos.get(0).getSimilar()); } } faceRecognitionResDTOList.add(faceRecognitionResDTO); } } return Response.newSuccessResponse(faceRecognitionResDTOList); } ~~~ #### 关键代码片断4 ~~~java @Override public List<UserCompareInfo> faceRecognition(byte[] faceFeature, List<UserRamCache.UserInfo> userInfoList, float passRate) { List<UserCompareInfo> resultUserInfoList = Lists.newLinkedList();//识别到的人脸列表 FaceFeature targetFaceFeature = new FaceFeature(); targetFaceFeature.setFeatureData(faceFeature); List<List<UserRamCache.UserInfo>> faceUserInfoPartList = Lists.partition(userInfoList, 1000);//分成1000一组,多线程处理 CompletionService<List<UserCompareInfo>> completionService = new ExecutorCompletionService(compareExecutorService); for (List<UserRamCache.UserInfo> part : faceUserInfoPartList) { completionService.submit(new CompareFaceTask(part, targetFaceFeature, passRate)); } for (int i = 0; i < faceUserInfoPartList.size(); i++) { List<UserCompareInfo> faceUserInfoList = null; try { faceUserInfoList = completionService.take().get(); } catch (InterruptedException | ExecutionException e) { } if (CollectionUtil.isNotEmpty(userInfoList)) { resultUserInfoList.addAll(faceUserInfoList); } } resultUserInfoList.sort((h1, h2) -> h2.getSimilar().compareTo(h1.getSimilar()));//从大到小排序 return resultUserInfoList; } ~~~
superadmin
2023年11月22日 10:35
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码