2026/1/16 15:51:33
网站建设
项目流程
什么网站ppt做的好,怎么做网站的搜索栏,模板建站适屏,网站推广120Chrome插件开发#xff1a;网页内嵌图像识别功能
随着AI技术的普及#xff0c;越来越多的应用场景开始将视觉识别能力集成到前端交互中。本文将带你从零构建一个具备中文通用图像识别能力的Chrome插件#xff0c;核心识别模型采用阿里开源的「万物识别-中文-通用领域」模型…Chrome插件开发网页内嵌图像识别功能随着AI技术的普及越来越多的应用场景开始将视觉识别能力集成到前端交互中。本文将带你从零构建一个具备中文通用图像识别能力的Chrome插件核心识别模型采用阿里开源的「万物识别-中文-通用领域」模型基于PyTorch实现推理并通过浏览器插件实现在任意网页中上传图片并获取中文标签结果。本方案不仅适用于内容审核、智能搜索等业务场景也为开发者提供了一种将本地AI模型与浏览器深度集成的技术路径。技术背景为什么需要浏览器端图像识别传统图像识别多依赖服务端API调用如百度AI、阿里云视觉存在隐私泄露风险、网络延迟高、成本不可控等问题。而将轻量级模型部署在本地结合Chrome插件机制可以在不上传用户数据的前提下完成实时识别。阿里近期开源的「万物识别-中文-通用领域」模型支持超过1万类中文标签分类在常见物体、场景、动植物等方面表现优异且模型体积适中约300MB非常适合用于边缘侧或本地部署。我们的目标是在任意网页上右键选择“识别这张图”即可弹出中文识别结果。整体架构设计该Chrome插件采用前后端分离结构后端运行本地推理服务前端通过chrome.runtime与之通信[网页页面] ↓ (用户右键 → 选图) [Chrome 插件 UI] ↓ (发送图片Base64) [本地Flask服务] ←→ [PyTorch模型推理] ↓ (返回中文标签列表) [插件弹窗显示结果]关键技术点包括 - 使用Manifest V3构建现代Chrome插件 - 后端启动一个轻量级Flask HTTP服务处理推理请求 - 模型加载使用PyTorch 2.5 CPU推理优化- 图像预处理遵循官方输入规范Resize→Normalize环境准备与模型部署基础环境配置根据项目要求需先激活指定conda环境并安装依赖# 激活环境 conda activate py311wwts # 安装依赖假设依赖文件为 requirements.txt pip install -r /root/requirements.txt确保以下库已安装 -torch2.5-torchvision-flask-Pillow-numpy提示若无GPU请确认PyTorch为CPU版本避免运行时报CUDA错误。模型与推理脚本说明项目核心为/root/推理.py文件其功能包括 1. 加载预训练模型权重 2. 定义图像预处理流程 3. 执行前向推理并输出Top-K中文标签推理脚本关键代码解析# 推理.py import torch from torchvision import transforms from PIL import Image import json # 中文标签映射表需提前下载 with open(labels_zh.json, r, encodingutf-8) as f: labels_zh json.load(f) # 模型定义示例结构具体以开源实现为准 model torch.hub.load(alibaba-damo/uni-label, UniLabel, backboneresnet50, num_classes11000) model.load_state_dict(torch.load(unilabel_base_chinese.pth)) model.eval() # 预处理管道 preprocess transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]), ]) def predict(image_path: str, top_k: int 5): img Image.open(image_path).convert(RGB) input_tensor preprocess(img).unsqueeze(0) # 添加batch维度 with torch.no_grad(): outputs model(input_tensor) probabilities torch.nn.functional.softmax(outputs[0], dim0) top_probs, top_indices torch.topk(probabilities, top_k) results [] for i in range(top_k): idx top_indices[i].item() label labels_zh.get(str(idx), 未知类别) score float(top_probs[i]) results.append({label: label, score: round(score, 4)}) return results代码说明 -labels_zh.json是阿里提供的中文标签ID映射表必须与模型训练时的类别顺序一致。 - 输入尺寸为224x224使用中心裁剪保证一致性。 - 输出为Top-5最可能的中文标签及置信度。工作区迁移建议为便于调试和编辑建议将核心文件复制至工作目录cp /root/推理.py /root/workspace/ cp /root/bailing.png /root/workspace/⚠️ 注意复制后需修改推理.py中的模型路径和标签文件路径例如# 修改前 torch.load(unilabel_base_chinese.pth) # 修改后假设模型放在workspace下 torch.load(/root/workspace/unilabel_base_chinese.pth)构建Chrome插件主体Manifest V3 配置创建manifest.json文件声明权限和入口{ manifest_version: 3, name: 万物识别 - 中文图像理解, version: 1.0, description: 基于阿里开源模型的网页图片中文识别工具, permissions: [contextMenus, activeTab], host_permissions: [http://localhost:5000/*], background: { service_worker: background.js }, action: { default_popup: popup.html } }⚠️host_permissions允许插件访问本地Flask服务运行在localhost:5000右键菜单触发识别在background.js中注册右键菜单项chrome.runtime.onInstalled.addListener(() { chrome.contextMenus.create({ id: recognize-image, title: 用万物识别分析这张图, contexts: [image] }); }); chrome.contextMenus.onClicked.addListener((info, tab) { if (info.menuItemId recognize-image) { chrome.tabs.sendMessage(tab.id, { action: recognize, imageUrl: info.srcUrl }); } });当用户右键点击图片并选择“识别”时会向当前页面注入内容脚本提取图片URL并发送给后台。内容脚本捕获图片并发送至本地服务创建content.js监听消息chrome.runtime.onMessage.addListener(async (request, sender, sendResponse) { if (request.action recognize) { const imageUrl request.imageUrl; try { // 下载图片转为Blob const resp await fetch(imageUrl); const blob await resp.blob(); const reader new FileReader(); reader.onloadend async () { const base64data reader.result.split(,)[1]; // 发送到本地Flask服务 const res await fetch(http://localhost:5000/predict, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ image: base7 }) }); const result await res.json(); showResults(result); }; reader.readAsDataURL(blob); } catch (err) { console.error(识别失败:, err); alert(识别失败请检查本地服务是否运行); } } }); 跨域限制说明由于请求发往localhost:5000需在插件中明确声明host_permissionsFlask本地服务桥接模型为了让插件能调用本地模型我们编写一个简单的Flask服务作为桥梁。创建app.pyfrom flask import Flask, request, jsonify import base64 import os from io import BytesIO from PIL import Image # 导入前面定义的predict函数 from 推理 import predict app Flask(__name__) app.route(/predict, methods[POST]) def do_predict(): data request.json image_data data.get(image) # Base64解码 image_bytes base64.b64decode(image_data) image Image.open(BytesIO(image_bytes)).convert(RGB) # 临时保存以便调用原推理脚本 temp_path /tmp/latest_upload.jpg image.save(temp_path) try: results predict(temp_path, top_k5) return jsonify({ success: True, results: results }) except Exception as e: return jsonify({ success: False, error: str(e) }), 500 if __name__ __main__: app.run(hostlocalhost, port5000)启动命令python app.py✅ 此服务监听localhost:5000/predict接收Base64图片返回JSON格式的中文标签。插件UI展示识别结果创建popup.html提供简洁界面!DOCTYPE html html head style body { width: 300px; padding: 10px; font-family: sans-serif; } .result-item { margin: 8px 0; padding: 8px; border-radius: 4px; background: #f0f0f0; } .label { font-weight: bold; } .score { float: right; color: #666; } /style /head body h3识别结果/h3 div idresults点击右键图片开始识别/div script srcpopup.js/script /body /htmlpopup.js用于接收并渲染结果document.addEventListener(DOMContentLoaded, () { chrome.tabs.query({ active: true, currentWindow: true }, (tabs) { chrome.tabs.sendMessage(tabs[0].id, { action: getLatestResult }, (response) { const container document.getElementById(results); if (response response.results) { container.innerHTML ; response.results.forEach(item { const div document.createElement(div); div.className result-item; div.innerHTML span classlabel${item.label}/spanspan classscore${item.score}/span; container.appendChild(div); }); } }); }); });实际使用流程总结启动本地服务bash conda activate py311wwts python app.py加载插件到Chrome打开chrome://extensions开启“开发者模式”点击“加载已解压的扩展程序”选择项目目录测试识别访问任意含图片的网页如新闻页右键点击图片 → “用万物识别分析这张图”弹窗自动显示Top-5中文标签更换测试图片如需替换bailing.png上传新图片到/root/workspace/修改推理.py中的路径测试离线效果性能优化与工程建议| 优化方向 | 建议措施 | |--------|---------| |推理速度| 使用torch.jit.trace对模型进行脚本化编译提升CPU推理效率 | |内存占用| 启动时缓存模型实例避免重复加载 | |安全性| Flask服务仅绑定localhost防止外部访问 | |用户体验| 在插件中增加加载动画和错误提示 | |扩展性| 支持批量识别、截图识别通过chrome.tabs.captureVisibleTab |常见问题与解决方案FAQ❓Q1运行时报错ModuleNotFoundError: No module named torch 确认是否正确激活了py311wwts环境。可通过which python和pip list | grep torch验证。❓Q2插件无法连接localhost:5000 检查Flask服务是否正常运行确认manifest.json包含http://localhost:5000/*权限。❓Q3中文标签显示乱码 确保labels_zh.json以UTF-8编码保存Python脚本中显式指定encodingutf-8。❓Q4模型加载慢 初次加载约需3-5秒建议在服务启动时预加载模型而非每次请求重新加载。❓Q5能否支持视频帧识别 可扩展为监听页面中的video元素定时截取画面进行识别适合教育、安防等场景。总结打造属于你的中文视觉助手本文完整实现了从阿里开源模型部署到Chrome插件集成的全流程展示了如何将强大的本地AI能力嵌入日常浏览体验中。核心价值在于 - ✅隐私安全所有数据留在本地无需上传云端 - ✅中文友好直接输出可读性强的中文标签 - ✅即插即用一键识别任意网页图片 - ✅可扩展架构支持接入更多模型OCR、目标检测等未来可进一步升级方向 - 结合大语言模型生成图像描述 - 支持自定义关键词过滤如屏蔽敏感内容 - 将模型量化为ONNX/TensorRT格式提升性能技术的本质是服务于人——让每个人都能拥有“看得懂”的浏览器正是这个小插件的意义所在。下一步建议学习路径 1. 学习 Chrome Extensions官方文档 2. 掌握 PyTorch 模型导出为 ONNX 的方法 3. 尝试将模型封装为 WebAssembly 实现完全前端化推理立即动手让你的浏览器也“睁开眼睛”吧