Demo en línea
(Disfruta de la verificación por reconocimiento facial)
Esta guía utiliza la plataforma de reconocimiento facial de ArcSoft. Se explica la tecnología de detección de vida RGB para seguimiento facial, que ofrece numerosas funciones gratuitas y configurables. El objetivo es que obtenags conocimientos útiles tras revisar este contenido.
El SDK offline ArcFace incluye capacidades de detección facial, detección de género, detección de edad, reconocimiento facial, evaluación de calidad de imagen, detección de vida RGB y detección de vida IR. Requiere activación en línea la primera vez; una vez activado, funciona sin conexión. Permite el desarrollo flexible de la capa de aplicación según los requisitos específicos del negocio.
Funcionalidades
1. Detección facial
Analiza los datos de imagen de antrada para detectar rostros, devolviendo los cuadros delimitadores y la orientación. Útil para operaciones posteriores como reconocimiento facial, extracción de características y detección de vida.
- Soporta modos de detección IMAGE y VIDEO.
- Soporta detección de un rostro o múltiples rostros, con un máximo de 50 rostros detectables.
2. Seguimiento facial
Realiza detección facial en datos de imagen de flujo de video y realiza un seguimiento continuo de los rostros detectados. (Para aplicaciones en tiempo real, se recomienda el uso de soluciones de terceros.)
3. Extracción de características faciales
Extrae la información de características de un rostro para su comparación.
4. Detección de atributos faciales
Detecta atributos como edad, género y ángulos 3D. Los ángulos faciales 3D incluyen: inclinación (pitch), balanceo (roll) y guiño (yaw).
5. Detección de vida
Detección de vida offline y silenciosa. Determina si el usuario es una persona real durante el proceso de reconocimiento, defendiendo contra ataques con fotos, videos o papel. Mejora la seguridad. Soporta detección de vida RGB monocular y detección de vida binocular (IR/RGB).
Configuración del proyecto
Accede a https://ai.arcsoft.com.cn/technology/faceTracking.html para registrarte como desarrollador.
- En "Mis aplicaciones", crea una nueva aplicación.
- Rellena la información y haz clic en "Añadir SDK".li>
- Selecciona la versión gratuita del SDK de reconocimiento facial.
- Rellena la información de la clave de autorización. Selecciona la plataforma Windows (64 o 32 bits) y el lenguaje Java.
Configuración de dependencias Maven
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
<druid-spring-boot-starter.version>1.2.6</druid-spring-boot-starter.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.arcsoft.face</groupId>
<artifactId>arcsoft-sdk-face</artifactId>
<scope>system</scope>
<systemPath>${project.basedir}/lib/arcsoft-sdk-face-3.0.0.0.jar</systemPath>
<version>3.0.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>27.0.1-jre</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid-spring-boot-starter.version}</version>
</dependency>
</dependencies>
Archivo de configuración principal (application.yml)
server:
port: 8080
spring:
profiles:
active: druid
mvc:
date-format: yyyy-MM-dd HH:mm:ss
mybatis-plus:
typeAliasesPackage: com.example.domain
mapperLocations: classpath*:mapper/*Mapper.xml
config:
sdk-lib-path: /ruta/a/libreria/SDK
app-id: TU_APP_ID
sdk-key: TU_SDK_KEY
thread-pool-size: 5
Configuración del datasource (application-druid.yml)
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
druid:
url: jdbc:mysql://localhost:3306/facedb?useSSL=false
username: usuario
password: contraseña
initial-size: 5
max-active: 20
Código de implementación
Fábrica del motor de reconocimiento facial
import com.arcsoft.face.EngineConfiguration;
import com.arcsoft.face.FaceEngine;
import org.apache.commons.pool2.BasePooledObjectFactory;
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.impl.DefaultPooledObject;
public class FaceEngineFactory extends BasePooledObjectFactory<FaceEngine> {
private final String appId;
private final String sdkKey;
private final String libPath;
public FaceEngineFactory(String libPath, String appId, String sdkKey) {
this.appId = appId;
this.sdkKey = sdkKey;
this.libPath = libPath;
}
@Override
public FaceEngine create() {
FaceEngine engine = new FaceEngine(libPath);
engine.activeOnline(appId, sdkKey);
engine.init(getEngineConfig());
return engine;
}
private EngineConfiguration getEngineConfig() {
EngineConfiguration config = new EngineConfiguration();
// Configuración de modos de detección y funciones
return config;
}
@Override
public PooledObject<FaceEngine> wrap(FaceEngine engine) {
return new DefaultPooledObject<>(engine);
}
}
Servicio de reconocimiento facial
import com.arcsoft.face.FaceFeature;
import com.arcsoft.face.FaceInfo;
import com.arcsoft.face.FaceSimilar;
import com.arcsoft.face.toolkit.ImageInfo;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class FacialRecognitionService {
private final GenericObjectPool<FaceEngine> enginePool;
public FacialRecognitionService(GenericObjectPool<FaceEngine> enginePool) {
this.enginePool = enginePool;
}
public byte[] extractFacialFeature(ImageInfo image) throws Exception {
FaceEngine engine = enginePool.borrowObject();
try {
List<FaceInfo> faces = new ArrayList<>();
engine.detectFaces(image.getImageData(), image.getWidth(),
image.getHeight(), image.getImageFormat(), faces);
if (!faces.isEmpty()) {
FaceFeature feature = new FaceFeature();
engine.extractFaceFeature(image.getImageData(), image.getWidth(),
image.getHeight(), image.getImageFormat(),
faces.get(0), feature);
return feature.getFeatureData();
}
} finally {
enginePool.returnObject(engine);
}
return null;
}
public boolean compareFaces(byte[] storedFeature, byte[] inputFeature) throws Exception {
FaceEngine engine = enginePool.borrowObject();
try {
FaceFeature source = new FaceFeature();
source.setFeatureData(storedFeature);
FaceFeature target = new FaceFeature();
target.setFeatureData(inputFeature);
FaceSimilar similarity = new FaceSimilar();
engine.compareFaceFeature(source, target, similarity);
return similarity.getScore() > 0.85f; // Umbral de similitud
} finally {
enginePool.returnObject(engine);
}
}
}
Controlador REST
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@RestController
@RequestMapping("/api/facial")
public class FacialRecognitionController {
private final FacialRecognitionService facialService;
public FacialRecognitionController(FacialRecognitionService facialService) {
this.facialService = facialService;
}
@PostMapping("/register")
public ResponseEntity<String> registerFace(@RequestParam("image") MultipartFile imageFile,
@RequestParam String userId) {
// Lógica para extraer y almacenar la característica facial
return ResponseEntity.ok("Rostro registrado exitosamente");
}
@PostMapping("/verify")
public ResponseEntity<Boolean> verifyFace(@RequestParam("image") MultipartFile imageFile,
@RequestParam String userId) {
// Lógica para comparar la característica facial con la almacenada
return ResponseEntity.ok(true);
}
}
Flujo de uso
1. Registrar un rostro enviando una imagen junto con el identificador de usuario.
2. Verificar la identidad enviando una nueva imagen para comparación.
El sistema devuelve true si la similitud facial supera el umbral configurado.