简介

AI双目视觉识别传感器采用Al主芯片,搭载两个200万像素的高清摄像头。摄像头分别采用彩色和红外摄像头,在黑暗环境下也可以正常识别。模块使用LINUX 快启操作系统,实现快速启动。本地内嵌人脸双目3D活体检测算法、基于大数据训练的深度神经网络识别算法、二维码识别算法、掌纹掌静脉算法,实现了人脸、二维码、静脉掌纹识别功能,并通过UART输出识别结果,同时可通过USB传输彩色摄像头UVC视频(可扩展为UAC音视频功能),用于本地音视频显示播放或远程视频音频传输功能。

AI双目视觉识别传感器启动速度快,同时支持断电低功耗和常供电双模式。在常供电模式下,将模组设置为低功耗自动探测模式时,可实现人脸、静脉掌纹及二维码的自动探测识别,方便第三方产品的对接,实现多种身份认证功能。

提供UART协议,支持第三方集成对接,实现身份识别功能的音视频传输对接。AI双目视觉识别传感器对第三方设备没有算力要求,即插即用,通用性强,对各种需要人脸、二维码、静脉掌纹等多种身份认证的新老产品都可以做进行升级。

特性

  • 支持双目3D活体检测,防止照片、视频等伪造人脸攻击
  • 支持神经网络深度学习人脸识别算法、静脉掌纹算法、二维码算法
  • 本地1000人脸+1000掌纹掌静脉
  • 支持完全黑暗和室外非阳光直射下识别
  • 对第三方设备无算力要求,无需增加算法SDK,Al视觉算法模组本地离线识别

应用场景

  • 智能家居
  • 智能门锁
  • 自助零售支付终端
  • 3D人脸掌纹支付系统
  • 静脉掌纹识别系统

技术规格

  • 硬件参数
    • SOC:CPU:Arm900M,NPU:0.5T,RISCV:600M
    • DDR2:64MB
    • Flash:32MB
    • 摄像头:2个,1/5”COMS,200万像素,双MIPI接口
    • LENS:FOV:对角83°,理想焦距:60cm
    • LED:IR:850波长,RGB:650波长,90°
    • USB接口:支持USB传输视频(UVC)功能可扩展支持音视频(UAC)功能,支持MJPG (可扩展支持H.264、YUY2)编码图像输出
    • 通信方式:UART
    • 波特率:115200
  • 电源参数
    • 供电电压:5-12V
    • 工作电流:320~330mA@8V
    • 待机电流:120-130mA(自动检测模式时)
    • 关断电流:0uA(非自动检测模式时,不使用识别时断电)
  • 其它参数
    • 工作温度:-20°C~60°C
    • 存储温度:-30°C~70°C
    • 相对湿度:10%~93%(不凝结)
    • 喇叭/麦克风:可扩展支持
    • 启动时间:900ms~2.5s(用户存储数量不同,启动速度不同)
    • 用户数量:人脸1-1000,掌纹1001-2000
    • 支持算法:双目活体检测算法,深度学习人脸识别算法,静脉掌纹算法,二维码识别算法
    • 人脸活体检测错误接受率(LDAFAR):≤1%
    • 人脸活体检测错误拒绝率(LPFRR):≤1%
    • 人脸通过识别率:98.85%
    • 人脸误识率:0.001%
    • 人脸识别角度:左右上下约20度,同时支持多角度人脸录入,扩大识别范围
    • 识别距离:人脸30-120cm,静脉掌纹15cm,二维码15cm
    • 尺寸:57.8x20x10.12mm

功能示意图

1.主板
算法主板采用了AI主芯片,采用了linux 快启操作系统,移植了人脸识别、掌纹常静脉、二维码算法,并开发了运用固件,主要实现注册与识别、并输出识别结果的功能。

2.双摄像头
包括了彩色和红外摄像头,采用200万像素的CMOS芯片搭配850镜头和650镜头组成。

3.红外灯&白光灯
(白光灯可以选用,不使用白光灯时,黑暗下显示黑白图像)红外灯的作用是给红外摄像头进行实时补光,白光灯的作用是环境不够亮时,自动启动进行补光,以保障红外和彩色图像的清晰。

4.泡棉
用于隔离补光灯与COMS,以防光线进入COMS,导致图像炫光。

5.内置算法
1)人脸双目活体检测算法
2)深度学习人脸识别算法
3)二维码识别算法

引脚示意图

UART接口

引脚 颜色线序 功能描述
1 黑线 GND
2 黄线 UART_RX
3 绿线 UART_TX
4 红线 VCC 5~12V

USB接口

可输出视频信号,用于屏幕显示,支持标准UVC视频, MJPEG/YUY2/H.264 编码,有横屏和竖屏多种分辨率可选。可扩展实现UAC音频功能,可以实现语音对讲功能。

引脚 功能描述
1 VCC 5V
2 悬空
3 DM USB数据线D-
4 DP USB数据线D+
5 GND

咪头接口(预留)

主要用于接收声音信号,实现对讲功能

引脚 名称 功能描述
1 负极 MIC-
2 正极 MIC+

喇叭接口(预留)

主要用于语音播放

引脚 名称 功能描述
1 SPK 1W/8Ω
2 SPK 1W/8Ω

模块尺寸图

安装高度和倾斜角度

根据产品安装高度的不同,建议使用外部支架调节产品的倾斜角度,以适合不同身高的用户友好识别。各种安装高度下,推荐倾斜角度和识别身高覆盖范围如下表所示:

安装高度 推荐倾斜角度 识别距离 人身高覆盖范围
130cm 20° 30~100cm 130~200cm
140cm 12° 30~100cm 130~200cm
150cm 30~100cm 130~200cm

接入Arduino使用教程

硬件准备

软件准备

硬件连接

PC USB接口功率较低,建议使用5V USB适配器供电,识别效果更好。

注册人脸&掌纹演示代码

注册人脸或者掌纹时,需要将AI视觉传感器固定,并注意识别距离,人脸30-120cm,静脉掌纹15cm,二维码15cm,每次只注册一个人脸或掌纹,如果需要注册多个,可按UNO R3开发板复位键再次注册其他人脸或掌纹。

/*!
 * @file SingleRegisteredUser.ino
 * @brief This is an example of using the DFRobot_AI10 library to enroll a single registered user.
 * @copyright	Copyright (c) 2025 DFRobot Co.Ltd (http://www.dfrobot.com)
 * @license The MIT License (MIT)
 * @author [jiali](zhixinliu@dfrobot.com)
 * @version V1.0
 * @date 2025-07-14
 * @url https://github.com/DFRobot/DFRobot_AI10
 */
#include "DFRobot_AI10.h"

/* ---------------------------------------------------------------------------------------------------------------------
  *    board   |             MCU                | Leonardo/Mega2560/M0 |    UNO    | ESP8266 | ESP32 |  microbit  |   m0  |
  *     VCC    |            3.3V/5V             |        VCC           |    VCC    |   VCC   |  VCC  |     X      |  vcc  |
  *     GND    |              GND               |        GND           |    GND    |   GND   |  GND  |     X      |  gnd  |
  *     RX     |              TX                |     Serial1 TX1      |     5     |   5/D6  | 26/D3 |     X      |  tx1  |
  *     TX     |              RX                |     Serial1 RX1      |     4     |   4/D7  | 25/D2 |     X      |  rx1  |
  * ----------------------------------------------------------------------------------------------------------------------*/
/* Baud rate cannot be changed , it is 115200 */

  #if defined(ARDUINO_AVR_UNO) || defined(ESP8266)
    SoftwareSerial mySerial(4, 5);
    DFRobot_AI10_UART recognize(&mySerial ,115200);
  #elif defined(ESP32)
    DFRobot_AI10_UART recognize(&Serial1,/*rxD2*/25,/*txD3*/26);
  #else
    DFRobot_AI10_UART recognize(&Serial1 ,115200);
  #endif


void setup() {
  Serial.begin(115200);
  while (!Serial);
  while(!recognize.begin()){
    Serial.println("NO Deivces !");
    delay(1000);
  }
  Serial.println("Device connected!");

  Serial.println("Start to enroll a user...");
  
  //User enroll result anc info
  sUserData_t udata;

  /*
  *admin permission is required to register a user. eNormal:average person ,eAdmin: administrator
  *userName registered user name, the length is 32 bytes at most
  *timeout is the time to wait for the recognition result, the range is 3-20 seconds
  */
  
  udata = recognize.enrollUser(/*admin*/eNormal,/*userName*/"User1",/*timeout*/ 5);

  //Check if the registration is successful, if successful, print the user information
  if(udata.result == eSuccess){
    Serial.println("User enrolled successfully!");
    Serial.print("UID: ");
    Serial.println(udata.UID);
    Serial.print("User name: ");
    Serial.println(udata.userName);
    Serial.print("Admin permission: ");
    Serial.println(udata.admin == eNormal ? "Normal":"Admin");
    Serial.print("User enrolled type: ");
    Serial.println(udata.type == eFace ? "Face":"Palm");
  }else if (udata.result == eFailedFaceEnrolled){
    Serial.println("Failed to enroll user, user already enrolled!");
  }else{
    Serial.println("Failed to enroll user!");
  }
}

void loop() {
  
  delay(100);
}

结果

通过UNO R3开发板复位按键进行注册,每复位一次可注册一次人脸或掌纹,每次注册时间5S,ID 1-1000为人脸,1001-2000为静脉掌纹。

连续识别人脸&掌纹&二维码演示代码

持续识别人脸&掌纹&二维码,并通过串口监视器打印相应信息,识别不到时,可以小幅度调整距离或姿势,并保持不动。

/*!
 * @file continuousRecognition.ino
 * @brief This is an example of using the DFRobot_AI10 library to recognize human faces and QR codes in real-time.
 * @copyright	Copyright (c) 2025 DFRobot Co.Ltd (http://www.dfrobot.com)
 * @license The MIT License (MIT)
 * @author [jiali](zhixinliu@dfrobot.com)
 * @version V1.0
 * @date 2025-07-14
 * @url https://github.com/DFRobot/DFRobot_AI10
 */
#include "DFRobot_AI10.h"

/* ---------------------------------------------------------------------------------------------------------------------
  *    board   |             MCU                | Leonardo/Mega2560/M0 |    UNO    | ESP8266 | ESP32 |  microbit  |   m0  |
  *     VCC    |            3.3V/5V             |        VCC           |    VCC    |   VCC   |  VCC  |     X      |  vcc  |
  *     GND    |              GND               |        GND           |    GND    |   GND   |  GND  |     X      |  gnd  |
  *     RX     |              TX                |     Serial1 TX1      |     5     |   5/D6  | 26/D3 |     X      |  tx1  |
  *     TX     |              RX                |     Serial1 RX1      |     4     |   4/D7  | 25/D2 |     X      |  rx1  |
  * ----------------------------------------------------------------------------------------------------------------------*/
/* Baud rate cannot be changed , it is 115200 */

  #if defined(ARDUINO_AVR_UNO) || defined(ESP8266)
    SoftwareSerial mySerial(4, 5);
    DFRobot_AI10_UART recognize(&mySerial ,115200);
  #elif defined(ESP32)
    DFRobot_AI10_UART recognize(&Serial1,/*rxD2*/25,/*txD3*/26);
  #else
    DFRobot_AI10_UART recognize(&Serial1 ,115200);
  #endif

void setup() {
  Serial.begin(115200);
  while (!Serial);
  while(!recognize.begin()){
    Serial.println("NO Deivces !");
    delay(1000);
  }
  Serial.println("Device connected!");

  //Enable face frame
  if(recognize.enableFaceFrame()){
    Serial.println("Face frame enabled!");
  }
}

void loop() {
  //Continuous recognition result

  sRecognitionData_t recDat;

  /* When a human face is detected,  the system automatically starts the recognition process.After the person moves away for
  x seconds, the recognition stops and the module continues with low-power face detection.the range is 3-20s. 
   */
  recDat = recognize.startContinuousFaceRecognition(/*timeout*/5);

  //Print the recognition result
  if(recDat.result == eSuccess){
    Serial.println("Recognition successful!");
    Serial.print("Recognition type: ");
  
    if(recDat.type == eQR){
      Serial.println("QR code");
      Serial.print("QR code data: ");
      Serial.println(recDat.QRDdata);
    }else{
      Serial.println(recDat.type == eFace ? "Face" : "Palm");
      Serial.print("User ID: ");
      Serial.println(recDat.userData.UID);
      Serial.print("User Name: ");
      Serial.println(recDat.userData.userName);
      Serial.print("Admin Permission: ");
      Serial.println(recDat.userData.admin == eAdmin ? "Admin" : "Normal");
    }
    
  }else{
    Serial.println("Recognize...");
  }

}

结果

持续识别检测到的人脸&掌纹&二维码,串口打印相应信息。

用户数量统计&用户删除演示代码

输入指令:AT+GETUSERS,查询所有用户数量和ID
输入指令:AT+DELUSER=1,删除指定用户ID1,1可替换为其它用户ID
输入指令:AT+DELALLUSERS,删除所有已注册的用户

/*!
 * @file operateUserData.ino
 * @brief This is an example of how to use the DFRobot_AI10 library to operate user data
 * @copyright	Copyright (c) 2025 DFRobot Co.Ltd (http://www.dfrobot.com)
 * @license The MIT License (MIT)
 * @author [jiali](zhixinliu@dfrobot.com)
 * @version V1.0
 * @date 2025-07-14
 * @url https://github.com/DFRobot/DFRobot_AI10
 */
#include "DFRobot_AI10.h"

/* ---------------------------------------------------------------------------------------------------------------------
  *    board   |             MCU                | Leonardo/Mega2560/M0 |    UNO    | ESP8266 | ESP32 |  microbit  |   m0  |
  *     VCC    |            3.3V/5V             |        VCC           |    VCC    |   VCC   |  VCC  |     X      |  vcc  |
  *     GND    |              GND               |        GND           |    GND    |   GND   |  GND  |     X      |  gnd  |
  *     RX     |              TX                |     Serial1 TX1      |     5     |   5/D6  | 26/D3 |     X      |  tx1  |
  *     TX     |              RX                |     Serial1 RX1      |     4     |   4/D7  | 25/D2 |     X      |  rx1  |
  * ----------------------------------------------------------------------------------------------------------------------*/
/* Baud rate cannot be changed , it is 115200 */

  #if defined(ARDUINO_AVR_UNO) || defined(ESP8266)
    SoftwareSerial mySerial(4, 5);
    DFRobot_AI10_UART recognize(&mySerial ,115200);
  #elif defined(ESP32)
    DFRobot_AI10_UART recognize(&Serial1,/*rxD2*/25,/*txD3*/26);
  #else
    DFRobot_AI10_UART recognize(&Serial1 ,115200);
  #endif


void setup() {
  Serial.begin(115200);
  while (!Serial);
  while(!recognize.begin()){
    Serial.println("NO Deivces !");
    delay(1000);
  }
  Serial.println("Device connected!");

  Serial.println("AI10 An example of AT command control");
  Serial.println("-----------------------------");
  Serial.println("Available commands:");
  Serial.println("AT+GETUSERS       # Get all user information");
  Serial.println("AT+DELUSER=ID     # Delete the specified user (e.g. AT+DELUSER=0x1001)");
  Serial.println("AT+DELALLUSERS    # Delete all users");
  Serial.println("-----------------------------");
  Serial.println("Note: When sending, end with \'\\n\'. Please pay attention to line breaks!");
  Serial.println("-----------------------------");
}

void loop() {
  sAllUserID_t alluser;
  int i;

  if (Serial.available()) {
    // Read the command from the serial port
    String command = Serial.readStringUntil('\n');
    command.trim();
    
    if (command.startsWith("AT+GETUSERS")){
        /* Get all user information*/
        alluser = recognize.getAllUserIDs();
        if(alluser.result == eSuccess){
          Serial.print("User number:");
          Serial.println(alluser.userNum);
          if(alluser.userNum != 0){
            Serial.print("User IDs:");
            for(i=0;i<alluser.userNum;i++){
              Serial.print(alluser.UIDS[i]);
              Serial.print(" ");
            }
            Serial.println();
          }
        }
      Serial.println("OK");

    } else if (command.startsWith("AT+DELUSER=")) {
      uint16_t ID = command.substring(11).toInt();
      /* Delete the user with the specified ID*/
      if(recognize.deleteUser(ID)){
        Serial.println("successfully deleted!");
      }
      Serial.println("OK");

    } else if (command.endsWith("AT+DELALLUSERS")) {
      /* Delete all users */
      if(recognize.deleteAllUser()){
        Serial.println("successfully deleted!");
      }
      Serial.println("OK");

    } else {
      Serial.println("The command is incorrect!");
    }
  }
}

结果

输入对应指令进行查询用户数量、删除用户等操作。

盖板推荐与安装方式

AI视觉算法模组装配到产品内部,需要有盖板贴在Al视觉算法模组上方,以防水防尘防破坏等作用。

1.盖板与模组正贴安装

AI视觉算法模组的镜头顶部与LED灯珠顶部保持基本同一水平面,在安装AI视觉算法模组时,建议AI视觉算法模组上的镜头与盖板尽量靠近但不接触,间隙≤1mm。

镜头与盖板的接触面采用遮光泡棉(厚度:2~3mm)进行遮光(泡棉出厂已标配),遮光泡棉紧贴盖板。遮光泡棉的挖孔在摄像头的可视区域之外,避免导致可视区域被遮挡。盖板的开孔区也必须在摄像头的可视区域之外,避免导致摄像头可视区域被遮挡。

如果盖板与镜头间隙较大,则LED灯光会通过盖板反射进入摄像头,会导致图像过曝从而导致人像无法正常识别。

2.盖板视窗尺寸大小

制作盖板时,需要将摄像头的可视区域和LED灯的照射区域留出透明视窗,透明通光率达90%或以上。

根据摄像头与LED灯的可视角度区域,并考虑到开模的公差与安装公差,建议LED灯的水平开孔角度≥90°;摄像头的水平开孔角度≥60°,两者垂直的开孔角度≥78° (如下图)。推荐盖板距离灯板2.5mm,镜头开口直径6mm、LED灯孔直径6.3mm,即可满足不遮挡视野的需求。

3.盖板的选择

(1)盖板材质:钢化玻璃或亚克力
(2)盖板白光LED灯部分的视窗,建议做成长条形。如图所示,长条视窗背面可粘贴散光膜,或者在制作盖板时喷涂白色透光油墨。以防白光开启时造成的光线刺眼
(3)盖板红外灯和摄像头视窗透明处理,透明部分透光率:≥90% (850nm 波段)
(4)盖板厚度:0.55mm~1.5mm,建议1mm最佳
(5)盖板设计参考

外壳和支架的装配

算法Al视觉算法模组置于外壳或支架上时,应有定位,以免在打螺钉时发生窜动,致使摄像头中心偏离孔位,遮挡成像。

AI视觉算法模组两侧的通孔直径为2.2mm,优先选择M2螺钉。

安装完毕后,摄像头中心应与外壳或支架通孔中心对正,保证摄像头成像不被遮挡。算法AI视觉算法模组不能被其他结构碰触、挤压,以免短路或者损坏。

更多资料下载

开发手册.pdf
[上位机]

常见问题

  • 使用5V USB适配器供电,识别效果更好
  • 摄像头两边的泡棉不可取下
  • 芯片发热是正常现象

DFshopping_car1.png DFRobot商城购买链接