前端与 AI 融合:图片识别技术的创新之旅

前言

信息技术飞速发展的时代,前端开发和 AI 技术正以令人惊叹的速度融合在一起。而图片识别作为两者结合的一个重要应用领域,正逐渐改变着我们的生活和工作方式。

话不多说,下面为大家展示(最后将附上完整代码,有需要的小伙伴自取学习):

主体页面部分

  • 有一个主要的容器 main,其中包含了图片上传的控件和图片显示区域。
  • input type="file" id="file - upload":创建一个文件上传输入框,用于用户选择要上传的图片。
  • #image - {insert_element_2_Y29udGFpbmVy} 是图片显示的容器。div
  • p#status 用于显示状态信息。p
javascript 复制代码
<main class="container">
        <label for="file-upload" class="custom-file-upload">
            <!-- <input type="file" id="file-upload" accept="image/*"> -->
            <input type="file" accept="image/*" id="file-upload">
            上传图片
        </label>
        <div id="image-container"></div>
        <p id="status"></p>
    </main>

脚本部分

  • 引入transformers库导入pipeline,env模块,用于执行nlp任务
  • 设置当前环境对象,禁止加载本地模型,使用远程加载。
  • cdn.jsdelivr.net 是一个内容分发网络(CDN),通过从 CDN 导入模块,可以提高模块的加载速度,特别是在网络延迟较高的情况下。
  • from后边接的那一串是一个远程地址,从该地址导入pipelineenv 两个模块。
javascript 复制代码
       // transformers库导入pipeline模块 npl 任务 
       import { pipeline, env } from "https://cdn.jsdelivr.net/npm/@xenova/transformers@2.6.0"
       // 设置当前的环境对象 不要加载本地模型,使用远程加载 transformers库
       env.allowLocalModels = false;
  • 为文件上传输入框添加 change 事件监听器。当用户选择文件时:
    • 获取上传的文件。
    • 创建一个 FileReader 对象。
    • reader.onload 回调函数中,创建一个图片元素,并设置其 src 属性为读取到的图片数据。
    • 将图片添加到图片显示容器中。
javascript 复制代码
        const fileUpload = document.getElementById('file-upload');
        const imageContainer = document.getElementById('image-container')
        // 文件输入框元素添加监听器 事件名称change 指定触发事件执行的函数
        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;
                //添加图片src获取图片展示到div中
                imageContainer.appendChild(image)
                // 启动ai任务  功能模块化,封装出去
                detect(image)
            }
            reader.readAsDataURL(file)
        })
  • 封装思想将detect函数封装到外面,将功能模块化
  • detect 函数用于启动图片检测的 AI 任务。它在获取到上传的图片后,更新状态信息,并使用 pipeline 和指定的模型进行检测。
  • renderBox 函数用于处理检测结果,根据边界框信息和标签创建相应的边界框元素和标签元素,并添加到图片显示容器中。
  • 通过pipeline指定特定模型用于物体检测,并将其实例化
  • 使用 await 等待 detector 对象,确保模型完全加载后再继续。
  • output返回检测对象结果
  • renderBox函数用于渲染边界框
ini 复制代码
const status = document.getElementById('status');
        // 通过pipeline启动一个检测图片的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);
        }
  • 详细说明都在注释

效果

结语

AI与前端可以完美融合,让我们积极拥抱创新,迎接未来的无限可能!

相关推荐
10年前端老司机3 小时前
React无限级菜单:一个项目带你突破技术瓶颈
前端·javascript·react.js
阿芯爱编程7 小时前
2025前端面试题
前端·面试
前端小趴菜058 小时前
React - createPortal
前端·vue.js·react.js
晓13139 小时前
JavaScript加强篇——第四章 日期对象与DOM节点(基础)
开发语言·前端·javascript
菜包eo9 小时前
如何设置直播间的观看门槛,让直播间安全有效地运行?
前端·安全·音视频
烛阴10 小时前
JavaScript函数参数完全指南:从基础到高级技巧,一网打尽!
前端·javascript
chao_78911 小时前
frame 与新窗口切换操作【selenium 】
前端·javascript·css·selenium·测试工具·自动化·html
天蓝色的鱼鱼11 小时前
从零实现浏览器摄像头控制与视频录制:基于原生 JavaScript 的完整指南
前端·javascript
三原11 小时前
7000块帮朋友做了2个小程序加一个后台管理系统,值不值?
前端·vue.js·微信小程序
popoxf11 小时前
在新版本的微信开发者工具中使用npm包
前端·npm·node.js