Maison  >  Article  >  interface Web  >  Comment mettre en œuvre un système de reconnaissance faciale en ligne à l'aide de WebSocket et JavaScript

Comment mettre en œuvre un système de reconnaissance faciale en ligne à l'aide de WebSocket et JavaScript

WBOY
WBOYoriginal
2023-12-18 16:27:23991parcourir

Comment mettre en œuvre un système de reconnaissance faciale en ligne à laide de WebSocket et JavaScript

Limités par les capacités innées de traitement visuel des humains, les systèmes de reconnaissance visuelle humaine ne peuvent pas être comparés aux ordinateurs à bien des égards. Par exemple, la puissance du cerveau humain n'est pas suffisante pour reconnaître un grand nombre de visages en peu de temps. Cependant, avec la technologie informatique avancée d’aujourd’hui, la technologie de reconnaissance faciale est devenue de plus en plus mature. En combinant la vision par ordinateur et l’intelligence artificielle, nous avons pu développer une variété de technologies de reconnaissance faciale, l’une des plus importantes étant les systèmes de reconnaissance faciale en ligne. Cet article vise à présenter comment utiliser WebSocket et JavaScript pour mettre en œuvre un système de reconnaissance faciale en ligne.

Vous devez d’abord comprendre ce qu’est WebSocket. WebSocket est un protocole de communication réseau basé sur le protocole TCP. Il fournit une connexion persistante entre le navigateur et le serveur, permettant une communication bidirectionnelle. Dans cet article, nous utiliserons WebSocket pour envoyer des informations d'image et de reconnaissance du client au serveur, et pour renvoyer les résultats de reconnaissance du serveur au client.

La première étape consiste à créer une connexion WebSocket. Dans le client, créez une connexion WebSocket avec l'extrait de code suivant :

let socket = new WebSocket("ws://localhost:8080/");
socket.onopen = function() {
   console.log("WebSocket连接已打开");
};
socket.onmessage = function(event) {
   console.log(event.data);
};

Cela ouvrira une connexion WebSocket sur localhost, se connectant au port 8080. Lorsque la connexion WebSocket est ouverte, le journal « La connexion WebSocket est ouverte » sera affiché. Lorsqu'un message est reçu du serveur, les données du message sont envoyées à la console.

Nous devons maintenant implémenter la fonction du client qui envoie des informations sur l'image au serveur. Il existe plusieurs méthodes pour capturer des images, notamment l'élément "" en HTML5 et l'API "getUserMedia". L'un des moyens les plus simples de capturer les données de la caméra consiste à utiliser l'API "getUserMedia":

let video = document.querySelector('video');
navigator.mediaDevices.getUserMedia({video: true})
  .then(function (stream) {
    video.srcObject = stream;
  });

Les images capturées peuvent désormais être dessinées dans un élément à l'aide de l'API HTML5 Canvas :

let canvas = document.getElementById('canvas');
let context = canvas.getContext('2d');
context.drawImage(video, 0, 0, canvas.width, canvas.height);

Les données d'image peuvent être dessinées en Base64. string Extrayez-le et envoyez-le au serveur via WebSocket :

let dataUrl = canvas.toDataURL('image/jpeg', 1.0);
socket.send(dataUrl);

Le serveur utilisera OpenCV et Python pour traiter et reconnaître l'image reçue. Ce qui suit est un simple script Python qui utilise OpenCV pour découper des visages dans des images :

import cv2

def detect_faces(image):
    face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)
    return faces

def extract_faces(image_path):
    image = cv2.imread(image_path)
    faces = detect_faces(image)
    for i, (x, y, w, h) in enumerate(faces):
        face_image = image[y:y+h, x:x+w]
        cv2.imwrite('face_{}.jpg'.format(i), face_image)

Comme vous pouvez le voir, ce script utilise le détecteur de visage d'OpenCV pour détecter les visages dans l'image et convertir les visages en Découpez-le et enregistrez-le. au fichier "face_{}.jpg".

Côté serveur, vous pouvez écrire le programme WebSocket suivant en utilisant Python.

import asyncio
import cv2
import base64
import io

from aiohttp import web

async def index(request):
    return web.Response(text="WebSocket服务器已启动!")

async def websocket_handler(request):
    ws = web.WebSocketResponse()
    await ws.prepare(request)
    
    while True:
        data = await ws.receive()
        if data.type == web.WSMsgType.TEXT:
            await ws.send_str("接收到了一张新的图像,请稍候……")
            img_data = data.data[23:]  # 截取“data:image/jpeg;base64,”之后的数据
            try:
                img_bytes = base64.b64decode(img_data)
                img_stream = io.BytesIO(img_bytes)
                img_np = cv2.imdecode(np.frombuffer(img_stream.read(), np.uint8), cv2.IMREAD_UNCHANGED)
                
                # 图像识别代码
                # ...
                
                # 向客户端发送识别结果
                await ws.send_str("这是一个人脸。")
            except:
                await ws.send_str("出错了,无法处理该图像。")

        elif data.type == web.WSMsgType.ERROR:
            print("WebSocket连接发生错误! Code:{}".format(ws.exception()))
            break

    return ws

app = web.Application()
app.router.add_get('/', index)
app.router.add_get('/ws', websocket_handler)  # /ws是WebSocket路径,亦可为其他路径
web.run_app(app, port=8080)

Lorsque la connexion WebSocket est ouverte, la fonction websocket_handler s'exécutera automatiquement et continuera à écouter les messages du client. Lorsqu'une nouvelle image est reçue, le codage Base64 est analysé et traité à l'aide d'OpenCV. Une fois les données traitées, les résultats sont renvoyés au client.

À ce stade, nous avons mis en œuvre avec succès un système de reconnaissance faciale en ligne. Le code complet côté client et côté serveur est le suivant :

Client :

<html>
<head>
    <meta charset="UTF-8">
    <title>人脸识别</title>
</head>
<body>
    <h1>人脸识别</h1>
    <video width="320" height="240" autoplay></video>
    <canvas id="canvas" width="320" height="240"></canvas>
    <script>
        let socket = new WebSocket("ws://localhost:8080/");
        socket.onopen = function() {
            console.log("WebSocket连接已打开");
        };
        socket.onmessage = function(event) {
            console.log(event.data);
        };

        let video = document.querySelector('video');
        navigator.mediaDevices.getUserMedia({video: true})
            .then(function (stream) {
                video.srcObject = stream;
            });

        let canvas = document.getElementById('canvas');
        let context = canvas.getContext('2d');

        setInterval(function() {
            context.drawImage(video, 0, 0, canvas.width, canvas.height);
            let dataUrl = canvas.toDataURL('image/jpeg', 1.0);
            socket.send(dataUrl);
        }, 500);
    </script>
</body>
</html>

Côté serveur :

import asyncio
import cv2
import base64
import io

from aiohttp import web

async def index(request):
    return web.Response(text="WebSocket服务器已启动!")

async def websocket_handler(request):
    ws = web.WebSocketResponse()
    await ws.prepare(request)
    
    while True:
        data = await ws.receive()
        if data.type == web.WSMsgType.TEXT:
            await ws.send_str("接收到了一张新的图像,请稍候……")
            img_data = data.data[23:]  # 截取“data:image/jpeg;base64,”之后的数据
            try:
                img_bytes = base64.b64decode(img_data)
                img_stream = io.BytesIO(img_bytes)
                img_np = cv2.imdecode(np.frombuffer(img_stream.read(), np.uint8), cv2.IMREAD_UNCHANGED)
                
                # 图像识别代码
                # ...
                
                # 向客户端发送识别结果
                await ws.send_str("这是一个人脸。")
            except:
                await ws.send_str("出错了,无法处理该图像。")

        elif data.type == web.WSMsgType.ERROR:
            print("WebSocket连接发生错误! Code:{}".format(ws.exception()))
            break

    return ws

app = web.Application()
app.router.add_get('/', index)
app.router.add_get('/ws', websocket_handler)
web.run_app(app, port=8080)

J'espère que cet article pourra vous aider à comprendre comment utiliser WebSocket et JavaScript pour implémenter un système de reconnaissance faciale en ligne et construisez-le rapidement. Proposez un système réalisable.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn