基于 Transformers.js 实现前端图片对象检测
本文介绍了如何利用 Transformers.js 库在前端浏览器中实现图片对象检测功能。通过导入 Xenova/detr-resnet-50 模型,用户可以上传本地图片,在客户端完成推理并渲染检测框。文章涵盖了从环境准备、代码实现到性能优化的完整流程,重点解决了模型加载、坐标计算及错误处理等关键问题,展示了边缘 AI 在 Web 开发中的应用潜力。

本文介绍了如何利用 Transformers.js 库在前端浏览器中实现图片对象检测功能。通过导入 Xenova/detr-resnet-50 模型,用户可以上传本地图片,在客户端完成推理并渲染检测框。文章涵盖了从环境准备、代码实现到性能优化的完整流程,重点解决了模型加载、坐标计算及错误处理等关键问题,展示了边缘 AI 在 Web 开发中的应用潜力。

在当今的技术环境中,人工智能(AI)与前端开发的融合越来越普遍。其中一个显著的应用是在图像识别中,AI 算法可以检测和标记图像中的对象,增强用户体验,并在网站或应用程序上实现创新功能。传统的图像识别通常依赖后端服务器进行计算,但这会带来延迟和带宽压力。随着 WebAssembly 和 ONNX Runtime 的发展,现在可以在浏览器端直接运行 AI 模型。
本文将详细介绍如何使用 @xenova/transformers 库在前端实现图片对象检测功能。通过这一方案,用户上传图片后,模型将在本地浏览器中完成推理,无需将图片上传至服务器,从而保护隐私并降低服务器成本。
在继续之前,请确保您对 HTML、CSS 和 JavaScript 有基本的了解。另外,熟悉与 AI 和图像处理相关的概念将会有所帮助。您需要一个现代浏览器环境(推荐 Chrome、Edge 或 Firefox),因为这些浏览器对 WebAssembly 的支持最为完善。
本方案核心依赖于 Hugging Face 推出的 Transformers.js 库。这是一个允许在浏览器中运行机器学习模型的 JavaScript 库。它支持多种任务,包括自然语言处理、图像分类、目标检测等。
Xenova/detr-resnet-50。该模型擅长识别图像中的物体及其位置。首先,我们需要从 CDN 引入 transformers 库。使用 ES Module 语法可以直接在浏览器中运行。
import { pipeline, env } from "https://cdn.jsdelivr.net/npm/@xenova/[email protected]"
// 设置环境变量,禁止加载本地模型,强制使用 CDN 资源
env.allowLocalModels = false;
pipeline 用于初始化模型,env 用于配置运行时行为。env.allowLocalModels = false; 将环境变量设置为 false,表示不允许使用本地文件系统中的模型,这有助于确保模型版本的统一性和安全性。我们需要创建一个文件上传输入框和一个容器来显示图片和检测结果。
<input type="file" accept="image/*" id="file-upload">
<div id="image-container"></div>
<p id="status"></p>
在 JavaScript 中,获取这些元素并添加事件监听器:
const fileUpload = document.getElementById('file-upload');
const imageContainer = document.getElementById('image-container');
const status = document.getElementById('status');
fileUpload.addEventListener('change', function (e) {
// 当选择文件时触发的事件监听器
});
使用 FileReader API 将用户上传的文件读取为 Data URL,以便浏览器渲染。
const reader = new FileReader();
reader.onload = function (e2) {
// 文件读取完成时执行的函数
};
reader.readAsDataURL(file);
FileReader 对象。onload 事件监听器被附加到读取器上,当文件读取完成时执行回调。readAsDataURL 方法将所选文件的内容读取为 Base64 编码的数据 URL。在读取完成后,动态创建 <img> 元素并将其添加到容器中。
const image = document.createElement('img');
image.src = e2.target.result;
imageContainer.appendChild(image);
onload 函数内部,创建了一个 <img> 元素。src 属性设置为读取文件作为数据 URL 的结果。在图像显示后,调用检测函数。注意,模型加载是异步的,首次加载可能需要几秒。
await detect(image);
detect 函数。await 确保模型加载和推理完成后再继续后续操作。这是核心部分。我们实例化一个对象检测管道。
const detector = await pipeline("object-detection", "Xenova/detr-resnet-50");
const output = await detector(image.src, {
threshold: 0.1,
percentage: true
});
pipeline 函数从指定的模型("Xenova/detr-resnet-50")实例化一个对象检测模型。threshold 参数控制置信度阈值,低于此值的检测将被忽略。percentage: true 表示返回的坐标是相对于图像尺寸的百分比,方便定位。output 包含对象检测任务的结果数组。遍历检测结果,逐个渲染边界框。
output.forEach(renderBox);
renderBox 函数以渲染边界框。根据坐标计算 CSS 样式,绘制矩形框和标签。
function renderBox({ 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);
}
renderBox 函数接受一个具有 box(边界框的坐标)和 label(检测到的对象的标签)的对象。<div> 元素来表示边界框。<span> 元素来在边界框内显示检测到的对象的标签。以下是整合后的完整 HTML 文件代码,包含了样式、结构和逻辑。请注意,实际使用时建议将模型加载逻辑优化为全局单例,避免重复加载。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>前端图片对象检测</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;
: relative;
: ;
: dashed ;
}
> {
: ;
: block;
}
{
: absolute;
: border-box;
: none;
}
{
: absolute;
: white;
: ;
: ;
: ;
: (, , , );
}
上传图片
等待上传...
initDetector 中使用 localStorage 或 Service Worker 缓存模型文件,避免重复下载。try-catch 块捕获异常,并提供友好的用户提示。image.onload 或 await 图片加载后再调用检测函数。threshold 参数,或尝试更换其他预训练模型。本文详细介绍了将 AI 对象检测与前端 Web 开发无缝集成的方法。通过按照所述步骤并利用现成的 AI 库(Transformers.js),开发人员可以为其 Web 应用程序增加强大的图像识别功能。这种 AI 和前端技术的融合为在 Web 上创建智能和交互式用户体验开启了广阔的可能性。相比传统后端方案,前端推理具有更低的延迟和更好的用户隐私保护能力,是未来边缘计算的重要方向之一。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online