智能界面:前端与AI的融合之美---智能识别图片

前言

当人工智能与前端技术融合时,可以创造出许多令人惊叹的应用和体验。在这样的融合中,前端技术负责用户界面的设计和交互,而人工智能则负责数据处理、分析和智能决策。以下是一些融合了AI和前端技术的介绍:

  1. 智能推荐系统:利用前端技术构建用户友好的界面,与后端的智能推荐算法结合,为用户提供个性化的推荐内容,如商品、音乐、视频等。
  2. 语音助手:通过前端技术实现语音交互界面,与后端的自然语言处理和语音识别模型结合,使用户能够通过语音与应用程序进行交互,执行各种任务和查询。
  3. 智能聊天界面:将AI技术整合到前端的聊天界面中,使得用户可以与智能机器人进行对话,并且机器人能够理解用户的意图并做出相应的回应,提供帮助和信息。
  4. 情感分析应用:结合前端的界面设计和后端的情感分析模型,实现能够识别用户情绪和情感的应用,例如在社交媒体上分析用户发帖的情绪倾向。
  5. 智能图像处理:利用前端技术展示图像处理的结果,如图像识别、物体检测、图像风格转换等,让用户能够通过界面与AI模型互动并查看处理结果。

这些是AI与前端融合的一些常见应用,它们展示了人工智能和前端技术结合所带来的创新和便利。接下来让我们来一起去探索人工智能与前端技术结合的智能图像处理吧~

步骤

  1. 先介绍一下Emmet语法 :Emmet语法是一种用于快速编写HTML和CSS代码的工具,它可以帮助开发者以更高效的方式创建和编辑代码。Emmet提供了一套简洁的语法规则,通过使用简短的缩写和表达式,可以快速生成复杂的HTML结构和CSS样式。例如,使用Emmet语法可以将简单的CSS选择器转换为HTML标记:
  • div#header 将生成 <div id="header"></div>
  • ul.nav>li*5 将生成 <ul class="nav"><li></li><li></li><li></li><li></li><li></li></ul>

此外,Emmet还支持更多高级功能,如嵌套、递增计数、文本节点插入等,使得编写和编辑HTML和CSS代码更加方便和高效。Emmet通常集成在许多流行的文本编辑器和集成开发环境中,如VS Code、Sublime Text等,使得开发者可以轻松地使用这一功能;

  1. 前端代码:此处可以直接输入 main.container>label.custom-file-upload>input#file-upload+#image-container+p#status,再按tab键;
xml 复制代码
<!-- 语义化 main就比div更好 页面中都主体内容 -->
    <!-- css选择器 -->
    <main class="container">
       <label for="file-upload" class="custom-file-upload">
        <input type="file" accept="image/*" id="file-upload">
        上传图片
       </label>
       <div id="image-container"></div>
       <p id="status"></p>
    </main>
  1. 导入pipelineenv :- pipeline 是一个函数或对象,可用于执行数据处理管道或流水线的操作。
  • env 是一个对象,可用于配置环境变量或其他相关的环境设置。
  • import {pipeline,env} from "https://cdn.jsdelivr.net/npm/@xenova/[email protected]";
  1. 通过id(document.getElementById('xxx' ))获取对应的HTML元素分别命名为为fileUpload (上传图片的输入框input)和imageContainer(显示图片的div容器);
ini 复制代码
const fileUpload=document.getElementById('file-upload');
const imageContainer=document.getElementById('image-container');

5. 给fileUpload 加一个事件监听,触发的时候就调用一个函数:定义file用于获取上传的文件,新建一个FileReader对象reader ,通过reader调用onload来读取并加载文件,再创建一个图片对象image (document.createElement('xxx') )来获取上传图片的路径,将image作为子元素节点添加到imageContainer父元素节点上(appendChild(xxx) ),通过detect(image)启动AI任务(功能模块化,封装出去) ,再通过reader调用 readAsDataURL(file) 方法,FileReader 对象开始读取 file 文件的内容,并在读取完成后将其以 Data URL 的形式传递给 onload 事件处理函数;

ini 复制代码
fileUpload.addEventListener('change',function(e){
           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);//用于向 DOM(文档对象模型)中的父元素节点添加子元素节点的方法
             detect(image);//启动AI任务 功能模块化,封装出去
           }
           reader.readAsDataURL(file);
        });
  1. 通过id获取status的HTML元素,命名为status
ini 复制代码
const status=document.getElementById('status');
  1. 定义detect,开启检测图片的AI任务;
ini 复制代码
 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);
        }
  1. 定义函数renderBox用于框出识别的物品;
php 复制代码
 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)+'%'
        })    
  1. 创建一个span 对象labelElement,用于显示AI识别出来物品的label
ini 复制代码
       const labelElement=document.createElement('span');
       labelElement.textContent=label;
       labelElement.className='bounding-box-label';
       labelElement.style.backgroundColor='#000000';  
  1. labelElement (物品名字)作为子元素节点加入boxElement (识别物品框)父节点元素,再将boxElement 作为子元素节点加入 imageContainer(图像容器)父节点元素
ini 复制代码
      boxElement.appendChild(labelElement);
      imageContainer.appendChild(boxElement);

代码

复制代码
<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+#image-container+p#status -->
    <main class="container">
       <label for="file-upload" class="custom-file-upload">
        <input type="file" accept="image/*" id="file-upload">
        上传图片
       </label>
       <div id="image-container"></div>
       <p id="status"></p>
    </main>
    <script type="module">
        //transformers npl 任务
        import {pipeline,env} from "https://cdn.jsdelivr.net/npm/@xenova/[email protected]";
        //不允许在本地运行模型,而需要依赖于远程服务器上的模型。这种设置可能是出于安全性、性能或其他管理考虑而进行的
        env.allowLocalModels=false;
        const fileUpload=document.getElementById('file-upload');
        const imageContainer=document.getElementById('image-container');
        fileUpload.addEventListener('change',function(e){
           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);//用于向 DOM(文档对象模型)中的父元素节点添加子元素节点的方法
             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>
检测图片:
效果图(执行前记得开外网):

总结

  • 编程效率 永远是大厂程序员的追求,html的时候emmet快速输入语法,刻意练习;
  • 前端素养:有不同的标签构成语义化的html结构(页面的基础),例如:main 比div 优秀, label +input=>文件输入框, p=>段落标签;
  • css选择器:label=>标签选择器, .container=>类名选择器, #file-upload=>ID选择器, > 子选择器, + 兄弟选择器 。
相关推荐
编程指北几秒前
字节 Trae 最新更新,支持 MCP 和智能体,最新一手实测!
前端·trae
Mr.Winter`几秒前
无人船 | 图解基于LQR控制的路径跟踪算法(以全驱动无人艇WAMV为例)
人工智能·算法·机器人·ros·ros2·运动规划·无人船
brzhang5 分钟前
面试官:讲讲 gRPC?别慌,老码小张带你从原理到实践彻底搞懂它!
前端·后端·架构
天天扭码7 分钟前
我使用Coze十分钟搭建了一个AI应用——创意写真馆
前端·ai编程·coze
知舟不叙7 分钟前
使用OpenCV和dlib库进行人脸关键点定位
人工智能·opencv·计算机视觉
rocksun10 分钟前
如何掌握向量数据库
人工智能
专业掘金10 分钟前
0428 手打基础丸
前端
aircrushin11 分钟前
AI创作的必备技能是提示词工程吗?
人工智能
用户2745339106812 分钟前
MCP 架构设计
人工智能
overstarry14 分钟前
Dify 学习 - 安装和初探
人工智能