惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
博客园 - Franky
GbyAI
GbyAI
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
爱范儿
爱范儿
IT之家
IT之家
酷 壳 – CoolShell
酷 壳 – CoolShell
aimingoo的专栏
aimingoo的专栏
博客园_首页
MongoDB | Blog
MongoDB | Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recent Announcements
Recent Announcements
Scott Helme
Scott Helme
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
C
CERT Recently Published Vulnerability Notes
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Jina AI
Jina AI
F
Fortinet All Blogs
N
Netflix TechBlog - Medium
L
LangChain Blog
L
LINUX DO - 最新话题
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
H
Hacker News: Front Page
MyScale Blog
MyScale Blog
P
Palo Alto Networks Blog
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
AI
AI
T
Troy Hunt's Blog
Microsoft Azure Blog
Microsoft Azure Blog
阮一峰的网络日志
阮一峰的网络日志
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Vercel News
Vercel News
Microsoft Security Blog
Microsoft Security Blog
罗磊的独立博客
S
Secure Thoughts
大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
人人都是产品经理
人人都是产品经理
Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
S
Security @ Cisco Blogs
Cloudbric
Cloudbric
E
Exploit-DB.com RSS Feed
Attack and Defense Labs
Attack and Defense Labs

博客园 - 阿新

用 AI Vibe Coding - word-cards 自部署 TTS + Vercel 部署实践 用 GPT-5.2 Vibe Coding,做了一个可以“玩”的人脸相似度应用 用AI开发AI翻译助手:初学者也能轻松做出第一个应用 数字产品护照 (DPP) 解决方案:利用 Blazor 和区块链实现产品全生命周期追踪 使用Blazor WebAssembly整合PocketBase的基础项目模板 Blazor Server完美实现Cookie Authorization and Authentication Blazor技术开发了一个访客管理系统 分享刚出炉的基于Blazor技术的Web应用开发框架 基于PaddleOCR实现AI发票识别的Asp.net Core应用 Clean Architecture For RazorPage 实现多语言和本地化 Workflow Core + asp.net core 5.0 实现简单审批工作流 GitHub自动化部署(CD) asp.net core 5.0 项目(免费空间) CleanArchitecture Application代码生成插件-让程序员告别CURD Ctrl+C Ctrl+V 一个遵循CleanArchitecture原则的Asp.net core轻量级开源项目 分享我的CleanArchitecture for Razor Page项目模板 fastreport-使用JSON做为数据源报表 分享我的第一个RPA练习 完美解决asp.net core 3.1 两个AuthenticationScheme(cookie,jwt)共存在一个项目中 基于领域驱动设计(DDD)超轻量级快速开发架构(二)动态linq查询的实现方式
asp.net core 实现 face recognition 使用 tensorflowjs(源代码)
阿新 · 2021-06-24 · via 博客园 - 阿新

 功能描述

  1. 上传照片文件名及是系统要识别标签或是照片的名称(人物标识)
  2. 提取照片脸部特征值(调用 facemesh模型)
  3. 保存特征值添加样本(调用 knnClassifier)
  4. 测试上传的图片是否识别正确

项目依赖的库

源代码(neozhu/smartadmin.core.urf: Domain Driven Design (DDD) ultra-lightweight rapid development architecture(support .net 5.0) (github.com)

tensorflowjs,在该项目中我使用了ml5js这个封装过的机器学习JavaScript类库, 使用起来更简单

Demo

http://106.52.105.140:6200/photos/index

demo/123456

代码实现

上传照片功能

 asp.net core 参考CleanArchitecture 结构实现后台代码, 

 参考代码如下(具体请看源代码):

namespace SmartAdmin.Application.Photos.Commands
{
  public partial class AddPhotoCommand : IRequest<Result<int>>
  {
    public Stream Stream { get; set; }
    public string FileName { get; set; }
    public decimal Size { get; set; }
    public string Path { get; set; }

  }
  internal class AddPhotoCommandHandler : IRequestHandler<AddPhotoCommand, Result<int>>
  {
    private readonly IUnitOfWork unitOfWork;
    private readonly IPhotoService photoService;

    public AddPhotoCommandHandler(IUnitOfWork unitOfWork,
      IPhotoService photoService)
    {
      this.unitOfWork = unitOfWork;
      this.photoService = photoService;
    }
    public async Task<Result<int>> Handle(AddPhotoCommand request, CancellationToken cancellationToken)
    {
      var info = new DirectoryInfo(request.Path);
      if (!info.Exists)
      {
        info.Create();
      }
      using (FileStream outputFileStream = new FileStream(Path.Combine(request.Path,request.FileName), FileMode.Create))
      {
        request.Stream.CopyTo(outputFileStream);
        outputFileStream.Close();
      }
      var photo = new Photo()
      {
        Name = Path.GetFileNameWithoutExtension(request.FileName),
        Size = request.Size,
        Path = $"/photos/{request.FileName}",
      };
      this.photoService.Insert(photo);
      await this.unitOfWork.SaveChangesAsync();
      return await Result<int>.SuccessAsync(0, "保存成功");
    }

  }
}

facemesh模型提取照片中脸部特特信息

扫描图片获取图片中脸部的特征信息以一个多维数组的形式保存到数据库中,这些特征值将用与下一步的KNN分类识别使用

 完成每一张照片中脸部信息的数字转化

参考代码如下:

 function predict() {
      const img = document.getElementById('photo-canvas');
      facemesh.predict(img).then(faces => {
        console.log(faces)
        if (faces) {
          const canvas = document.getElementById("photo-canvas");
          const photoId=canvas.getAttribute("photo-id");
          const photoName=canvas.getAttribute("photo-name");
          console.log(canvas)
          var draw = canvas.getContext("2d");
          var mesh = faces[0].scaledMesh;
          console.log(mesh);
          /* highlight facial landmark points on canvas board */
          draw.fillStyle = "#00FF00";
          for (i = 0; i < mesh.length; i++) {
            var [x, y, z] = mesh[i];
            draw.fillRect(Math.round(x), Math.round(y), 2, 2);
          }
          updateLandmarks(photoId,JSON.stringify(mesh));
          knnClassifier.addExample(mesh, photoName);
          canvas.setAttribute("photo-mesh", JSON.stringify(mesh));
          $('#testbutton').attr('disabled', false);
        }
      });
    }

   function updateLandmarks(id,landmarks){
     $.post('/Photos/Update',{Id:id,Landmarks:landmarks}).done(res=>{
      console.log(res);
      reload();
     }).fail(res=>{
      $.messager.alert('更新失败', res, 'error');
     })
    } 

 添加分类识别样本数据

facemesh模型只负责把照片中面部特征转换成一个数组,如果需要对每一张照片的数据再进行分类就需要用到KNN模型,添加的样本数据越多,识别的就越正确。

参考代码:

let knnClassifier =ml5.KNNClassifier();
    function training(){
       $.messager.progress({msg:'training....'});
       $.get('/Photos/GetAll').done(res=>{
        for(let i=0;i<50;i++){
        res.map(item=>{
        if(item.Landmarks){
        knnClassifier.addExample(JSON.parse(item.Landmarks), item.Name);
        }
        });
        }
        $.messager.progress('close')
           if(knnClassifier.getNumLabels()>0){
           knnClassifier.classify(JSON.parse(res[2].Landmarks),(err,result)=>{
             console.log(result);
         })
       $('#testbutton').attr('disabled', false);
       }
       })
    }

测试照片识别结果

上传一张照片匹配维护的照片库中照片名称是否正确

 参考代码:

function testPredict(){
      const img = document.getElementById('testphoto_img');
      facemesh.predict(img).then(faces => {
        console.log(faces)
        if (faces) {
          knnClassifier.classify(faces[0].scaledMesh,(err,result)=>{
          console.log(result);
          $.messager.alert('Result:',result.label);
          $('#testresult').text(result.label);
         })
        }
      });
    }

到这里就全部完成了,对tensorflow感兴趣的朋友可以留言,下面有时间会继续更新,实现利用摄像头来识别人脸。

对asp.net core CleanArchitecture 感兴趣的朋友可以从github下载,也可以留言交流,这个项目我也会继续更新,如果喜欢,请给个星星。