>  기사  >  웹 프론트엔드  >  WebSocket과 JavaScript를 사용하여 온라인 얼굴 인식 시스템을 구현하는 방법

WebSocket과 JavaScript를 사용하여 온라인 얼굴 인식 시스템을 구현하는 방법

WBOY
WBOY원래의
2023-12-18 16:27:23923검색

WebSocket과 JavaScript를 사용하여 온라인 얼굴 인식 시스템을 구현하는 방법

인간의 타고난 시각 처리 능력의 한계로 인해 인간의 시각 인식 시스템은 여러 측면에서 컴퓨터와 비교할 수 없습니다. 예를 들어, 인간의 두뇌 능력은 짧은 시간에 많은 수의 얼굴을 인식하기에 충분하지 않습니다. 그러나 오늘날의 발전된 컴퓨터 기술에서 얼굴 인식 기술은 점점 더 성숙해졌습니다. 컴퓨터 비전과 인공 지능의 결합을 사용하여 우리는 다양한 얼굴 인식 기술을 개발할 수 있었으며 가장 중요한 것 중 하나는 온라인 얼굴 인식 시스템입니다. 이 기사에서는 WebSocket과 JavaScript를 사용하여 온라인 얼굴 인식 시스템을 구현하는 방법을 소개하는 것을 목표로 합니다.

먼저 WebSocket이 무엇인지 이해해야 합니다. WebSocket은 TCP 프로토콜을 기반으로 하는 네트워크 통신 프로토콜입니다. 이는 브라우저와 서버 간의 지속적인 연결을 제공하여 양방향 통신을 가능하게 합니다. 이번 글에서는 WebSocket을 사용하여 클라이언트에서 서버로 이미지 및 인식 정보를 보내고, 서버에서 인식한 결과를 다시 클라이언트로 전송해보겠습니다.

첫 번째 단계는 WebSocket 연결을 만드는 것입니다. 클라이언트에서 다음 코드 조각을 사용하여 WebSocket 연결을 생성합니다.

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

이렇게 하면 localhost에서 WebSocket 연결이 열리고 포트 8080에 연결됩니다. WebSocket 연결이 열리면 "WebSocket 연결이 열렸습니다"라는 로그가 출력됩니다. 서버로부터 메시지가 수신되면 메시지 데이터가 콘솔에 출력됩니다.

이제 클라이언트가 이미지 정보를 서버로 보내는 기능을 구현해야 합니다. HTML5의 "" 요소와 "getUserMedia" API를 포함하여 이미지를 캡처하는 방법에는 여러 가지가 있습니다. 카메라 데이터를 캡처하는 가장 쉬운 방법 중 하나는 "getUserMedia" API를 사용하는 것입니다.

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

이제 HTML5 Canvas API를 사용하여 캡처된 이미지를 요소에 그릴 수 있습니다.

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

이미지 데이터를 Base64로 그릴 수 있습니다. string 추출하여 WebSocket을 통해 서버로 보냅니다.

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

서버는 OpenCV와 Python을 사용하여 수신된 이미지를 처리하고 인식합니다. 다음은 OpenCV를 사용하여 이미지에서 얼굴을 잘라내는 간단한 Python 스크립트입니다.

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)

보시다시피 이 스크립트는 OpenCV의 얼굴 감지기를 사용하여 이미지에서 얼굴을 감지하고 해당 얼굴을 Cut it out으로 변환하여 저장합니다. "face_{}.jpg" 파일로 이동하세요.

서버 측에서는 Python을 사용하여 다음 WebSocket 프로그램을 작성할 수 있습니다.

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)

WebSocket 연결이 열리면 websocket_handler 함수가 자동으로 실행되고 클라이언트의 메시지를 계속 수신합니다. 새 이미지가 수신되면 OpenCV를 사용하여 Base64 인코딩이 구문 분석되고 처리됩니다. 데이터가 처리된 후 결과가 클라이언트에 반환됩니다.

이 시점에서 우리는 온라인 얼굴 인식 시스템을 성공적으로 구현했습니다. 전체 클라이언트 측 및 서버 측 코드는 다음과 같습니다.

클라이언트:

<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>

서버 측:

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)

이 기사가 WebSocket 및 JavaScript를 사용하여 온라인 얼굴 인식 시스템을 구현하는 방법을 이해하는 데 도움이 되기를 바랍니다. 빠르게 구축하세요. 실행 가능한 시스템을 생각해 보세요.

위 내용은 WebSocket과 JavaScript를 사용하여 온라인 얼굴 인식 시스템을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.