Web + Ai 实现图像识别(JS)

引言

在本教程中,我们将使用 JavaScript 和 Transformers 库来实现图像对象检测的功能。图像对象检测是计算机视觉领域中的重要任务,它可以识别图像中的不同对象并标注它们的位置。我们将使用一个预训练的对象检测模型,将其集成到网页中,通过上传图片来进行对象检测,并在图片上绘制边界框以标识检测到的对象。

一. 准备工作

首先,我们需要引入 Transformers 库,这是一个用于自然语言处理和计算机视觉任务的强大工具。我们将使用其中的对象检测模块来完成我们的任务。在代码中,我们通过 import {pipeline, env} from "https://cdn.jsdelivr.net/npm/@xenova/transformers@2.6.0"; 引入了所需的模块,pipeline和env模块来自于@xenova/transformers软件包的版本2.6.0。(注意:在导入pipeline和env模块时需要确保网络成功连接上了魔法)

二. HTML 结构

我们的 HTML 结构非常简单,只有一个文件上传 input 元素和一个用于显示图片和边界框的容器。文件上传 input 元素用于选择要检测的图片,而图片和边界框则会显示在 imageContainer 容器中,p标签将会显示交互信息提示用户图片读取状态。代码如下:

<main class="container">
        <label for="file-upload" class="custom-file-upload">
            上传图片
            <input type="file"  accept="image/*" id="file-upload">
        </label>
        <!-- #image-container div 标签不需要加前缀-->
        <div id="image-container"></div>
        <!-- p#status -->
        <p id="status"></p>    
    </main>

三. JavaScript 实现

我们通过 JavaScript 实现了以下功能:

  • 当用户选择了要检测的图片后,我们使用 FileReader 对象读取图片文件,将图片解析成base64编码的字符串形式,并将该字符串赋值给img元素的src属性,这样读取到的文件就能显示在页面上。
  • 然后,我们调用 detect 函数,这个函数会启动 AI 任务,使用预训练的对象检测模型来检测图片中的对象。
  • 在 detect 函数中,我们使用 pipeline 函数初始化了一个对象检测器,并传入了我们选择的模型 xenova/detr-resnet-50。其中,threshold 参数设置了对象检测的置信度阈值,低于该阈值的检测结果将被忽略;percentage 参数设置为 true 表示输出的边界框的坐标将以百分比形式返回。
  • 检测完成后,我们会得到一个包含边界框和标签的输出,然后通过 renderBox 函数将边界框绘制在图片上,并显示对象的标签。首先,它从传入的参数中获取边界框的坐标信息,并创建相应的 <div><span> 元素来表示边界框和标签。然后,它动态计算并设置边界框元素的样式,包括边框颜色、宽度、位置和尺寸等属性。最后,它将标签元素作为子元素添加到边界框元素中,并将边界框元素添加到页面上用于显示。
  • 代码如下:
 <script type="module">
        // transformers nlp 任务
        import {pipeline,env} from "https://cdn.jsdelivr.net/npm/@xenova/transformers@2.6.0";
        env.allowLocalModels = false;
        const fileUpload = document.getElementById('file-upload');
        const imageContainer = document.getElementById('image-container')
        fileUpload.addEventListener('change',function(e){
            console.log(e.target.files[0]);
            const file = e.target.files[0];
            // 新建一个FileReader 对象 01 序列
            // 图片比较大
            const reader = new FileReader();
            reader.onload = function(e2){
                // 读完了 , 加载完成
                const image = document.createElement('img'); // 图片对象
                console.log(e2.target.result);
                image.src = e2.target.result;
                imageContainer.appendChild(image);
                detect(image); // 启动ai任务 功能模块化,封装出去

            }
            reader.readAsDataURL(file);
        })
        const status = document.getElementById('status');
        // 检测图片的AI任务
        
        const detect = async (image) => {
            status.textContent = "分析中...";
            const detector = await pipeline("object-detection",
            "xenova/detr-resnet-50"); // model 实例化了detector对象
            const output = await detector(image.src,{
                threshold : 0.1,
                percentage : true
            })
            console.log(output);
            output.forEach(renderBox);
        }

        function renderBox({box,label}){
            console.log(box,label);
            const {xmax,xmin,ymax,ymin} = box;
            const boxElement = document.createElement("div");
            boxElement.className = "bounding-box";
            Object.assign(boxElement.style,{
                borderColor : '#123123',
                borderWidth : '1px',
                borderStyle : 'solid',
                left : 100 * xmin + '%',
                top : 100 * ymin + '%',
                width : 100 * (xmax - xmin) + '%',
                height : 100 * (ymax - ymin) + '%'
            })

            const labelElement = document.createElement('span');
            labelElement.textContent = label;
            labelElement.className = "bounding-box-label";
            labelElement.style.backgroundColor = '#000000';
            boxElement.appendChild(labelElement);
            imageContainer.appendChild(boxElement);
        }

四. 总结

通过本教程,我们学习了如何使用 JavaScript 和 Transformers 库来实现图像对象检测的功能。我们使用了一个预训练的对象检测模型,并将其集成到网页中,通过简单的上传图片操作就能实现对象检测,并在图片上标注检测到的对象。这个示例展示了如何利用现有的工具和库来快速实现复杂的计算机视觉任务,为开发者提供了一种简单而有效的方法来处理图像数据。

五.运行效果

image.png

image.png

image.png

image.png

六.完整代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>nlp之图片识别,两种语言</title>
    <style>
        .container {
            margin: 40px auto;
            width: max(50vw, 400px);
            display: flex;
            flex-direction: column;
            align-items: center;
        }
        .custom-file-upload {
            display: flex;
            align-items: center;
            cursor: pointer;
            gap:10px;
            border: 2px solid black;
            padding: 8px 16px;
            border-radius: 6px;
        }
        #file-upload {
            display: none;
        }
        #image-container {
            width: 100%;
            margin-top:20px;
            position: relative;
        }
        #image-container>img {
            width: 100%;
        }
        .bounding-box {
            position: absolute;
            box-sizing: border-box;
        }
        .bounding-box-label {
            position: absolute;
            color: white;
            font-size: 12px;
        }
    
    </style>
</head>
<body>
    <!-- 语义化 main就比div 更好 页面中的主体内容 -->
    <!-- css 选择器 -->

    <!-- main.container>label.custom-file-upload>input#file-upload -->
    <main class="container">
        <label for="file-upload" class="custom-file-upload">
            上传图片
            <input type="file"  accept="image/*" id="file-upload">
        </label>
        <!-- #image-container div 标签不需要加前缀-->
        <div id="image-container"></div>
        <!-- p#status -->
        <p id="status"></p>    
    </main>

    <script type="module">
        // transformers nlp 任务
        import {pipeline,env} from "https://cdn.jsdelivr.net/npm/@xenova/transformers@2.6.0";
        env.allowLocalModels = false;
        const fileUpload = document.getElementById('file-upload');
        const imageContainer = document.getElementById('image-container')
        fileUpload.addEventListener('change',function(e){
            console.log(e.target.files[0]);
            const file = e.target.files[0];
            // 新建一个FileReader 对象 01 序列
            // 图片比较大
            const reader = new FileReader();
            reader.onload = function(e2){
                // 读完了 , 加载完成
                const image = document.createElement('img'); // 图片对象
                console.log(e2.target.result);
                image.src = e2.target.result;
                imageContainer.appendChild(image);
                detect(image); // 启动ai任务 功能模块化,封装出去

            }
            reader.readAsDataURL(file);
        })
        const status = document.getElementById('status');
        // 检测图片的AI任务
        
        const detect = async (image) => {
            status.textContent = "分析中...";
            const detector = await pipeline("object-detection",
            "xenova/detr-resnet-50"); // model 实例化了detector对象
            const output = await detector(image.src,{
                threshold : 0.1,
                percentage : true
            })
            console.log(output);
            output.forEach(renderBox);
        }

        function renderBox({box,label}){
            console.log(box,label);
            const {xmax,xmin,ymax,ymin} = box;
            const boxElement = document.createElement("div");
            boxElement.className = "bounding-box";
            Object.assign(boxElement.style,{
                borderColor : '#123123',
                borderWidth : '1px',
                borderStyle : 'solid',
                left : 100 * xmin + '%',
                top : 100 * ymin + '%',
                width : 100 * (xmax - xmin) + '%',
                height : 100 * (ymax - ymin) + '%'
            })

            const labelElement = document.createElement('span');
            labelElement.textContent = label;
            labelElement.className = "bounding-box-label";
            labelElement.style.backgroundColor = '#000000';
            boxElement.appendChild(labelElement);
            imageContainer.appendChild(boxElement);
        }

    </script>
</body>
</html>
  • 15
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
要在Web端部署百度API物体识别,您需要按照以下步骤操作: 1. 在百度AI开放平台上注册并获取API Key和Secret Key。这些密钥将用于API调用身份验证。 2. 下载并安装Python SDK。您可以在以下链接中找到适用于您的操作系统的SDK:https://ai.baidu.com/sdk#python 3. 在Python中安装百度AI Python SDK。您可以在命令行中使用以下命令安装:pip install baidu-aip 4. 在您的Web应用程序中,导入Python SDK并创建一个AipImageClassify对象。这将允许您调用百度API的物体识别功能。以下是一个示例代码: ```python from aip import AipImageClassify APP_ID = 'your app id' API_KEY = 'your api key' SECRET_KEY = 'your secret key' client = AipImageClassify(APP_ID, API_KEY, SECRET_KEY) ``` 5. 使用AipImageClassify对象调用百度API的物体识别功能。以下是一个示例代码: ```python def recognize_image(image_path): with open(image_path, 'rb') as f: image = f.read() result = client.advancedGeneral(image) if 'result' in result: return result['result'] else: return None ``` 在此示例代码中,我们将图像文件的路径作为参数传递给recognize_image函数。该函数使用AipImageClassify对象调用百度API的advancedGeneral方法,该方法可以识别图像中的多个物体。如果识别成功,则返回一个包含识别结果的字典。否则返回None。 6. 将您的Web应用程序部署到Web服务器上,并确保您已经安装了必要的依赖项和Python SDK。 7. 在您的Web应用程序中添加一个Web页面,使用户可以上传图像文件并调用recognize_image函数。在Web页面中,您可以使用HTML和JavaScript创建一个文件上传表单和一个AJAX请求,以便将图像文件发送到Web服务器并接收识别结果。以下是一个示例代码: ```html <!DOCTYPE html> <html> <head> <title>Object Recognition</title> </head> <body> <form enctype="multipart/form-data" method="POST" action="/recognize"> <input type="file" name="image"> <input type="submit" value="Recognize"> </form> <div id="result"></div> <script src="//code.jquery.com/jquery-3.3.1.min.js"></script> <script> $('form').submit(function(event) { event.preventDefault(); var formData = new FormData(); formData.append('image', $('input[type=file]')[0].files[0]); $.ajax({ url: '/recognize', type: 'POST', data: formData, processData: false, contentType: false, success: function(data) { $('#result').text(JSON.stringify(data)); } }); }); </script> </body> </html> ``` 在此示例代码中,我们创建了一个文件上传表单,并在表单提交时使用AJAX请求将图像文件发送到Web服务器。成功接收识别结果后,我们将其显示在页面上的一个DIV元素中。 8. 在Web服务器上设置路由,以便在收到文件上传请求时调用recognize_image函数并返回识别结果。以下是一个示例代码: ```python from flask import Flask, request, jsonify app = Flask(__name__) @app.route('/recognize', methods=['POST']) def recognize(): if 'image' not in request.files: return jsonify({'error': 'No image file uploaded'}) image = request.files['image'].read() result = recognize_image(image) if result is not None: return jsonify({'result': result}) else: return jsonify({'error': 'Failed to recognize image'}) ``` 在此示例代码中,我们使用Flask框架创建了一个Web应用程序,并设置了一个路由,以便在收到文件上传请求时调用recognize_image函数并返回识别结果。如果没有上传图像文件,则返回一个错误消息。如果识别失败,则返回一个错误消息。 以上就是在Web端部署百度API物体识别的步骤。请注意,这只是一个示例代码,您需要根据您的具体需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小A远离BUG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值