You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS环境目标检测:YOLO/Cocossd无法检测文本字符的解决方案

问题原因

你当前使用的YOLO、COCOSSD是面向通用日常物体训练的检测模型,训练集没有将单字符、特定品牌logo标注为独立检测类别,自然无法识别图片中的文字和带文本的标识对象。
以下是两种适配JS/PHP环境、可直接落地的实现方案,都能满足单字符、整体logo分别绘制外接框的需求:

方案一:纯前端实现(适配现有p5.js+ml5.js技术栈,改造成本最低)

不需要调整现有绘制逻辑,只需要补充两类检测能力,将检测结果合并后统一绘制即可:

  • 文字检测:接入纯前端运行的Tesseract OCR能力,识别后可以直接返回每个单字符、单词、文本块的外接矩形坐标、识别内容、置信度,完全覆盖K、F、C三个单字母单独画框的需求。
  • Logo检测:如果需要识别的logo种类少,可以直接用ml5内置的迁移学习能力,收集几十张对应logo的样本做简单标注,训练轻量自定义检测模型,前端加载后就能返回logo整体的边界框;如果需要识别的logo种类多,可以直接使用预训练好的通用logo检测模型,转换为ml5支持的格式后加载调用。

核心代码修改

替换原有sketch.js的逻辑即可,原有绘制函数不需要改动:

let img;
let objectDetector;
let ocrWorker;
let allDetections = [];

async function preload(){
  img = loadImage('e.jpeg');  
  objectDetector = ml5.objectDetector('yolo');
  // 初始化OCR识别引擎
  ocrWorker = await Tesseract.createWorker('eng', 1, {
    logger: m => console.log(m)
  });
}

async function setup() {
  createCanvas(800, 800);
  image(img,0,0);
  // 执行通用物体检测
  objectDetector.detect(img, async (error, objectResults)=>{
    if(error) console.error(error);
    allDetections = [...objectResults];
    // 执行文字检测
    const ocrResult = await ocrWorker.recognize(img.canvas);
    // 提取单字符的检测结果
    ocrResult.data.symbols.forEach(symbol => {
      allDetections.push({
        label: symbol.text.trim(),
        confidence: symbol.confidence * 100,
        x: symbol.bbox.x0,
        y: symbol.bbox.y0,
        width: symbol.bbox.x1 - symbol.bbox.x0,
        height: symbol.bbox.y1 - symbol.bbox.y0
      })
    });
    // 此处可追加自定义logo模型的检测结果,合并到allDetections数组
    // 所有检测结果收集完成后统一绘制
    drawResults(allDetections);
    await ocrWorker.terminate();
  })
}

function drawResults(results) {
    results.forEach((result) => {
        const r = Math.random()*256|0;
        const g = Math.random()*256|0;
        const b = Math.random()*256|0;

        stroke(0, 0, 0);
        strokeWeight(2);
        textSize(16);
        fill(r, g, b);
        text(`${result.label} (${result.confidence.toFixed(2)}%)`, result.x, result.y - 10);

        noFill();
        strokeWeight(3);
        stroke(r, g, b);
        rect(result.x, result.y, result.width, result.height);
    });
}

在HTML的ml5依赖标签后,追加Tesseract的SDK引用即可:

<script src="tesseract.min.js"></script>

方案二:前后端协同实现(识别精度更高,适合生产环境)

如果对识别准确率、前端运行流畅度要求更高,可以用PHP做后端服务层,前端只负责上传图片、接收坐标、绘制框线:

  • 后端部署两个检测能力:一是开源OCR服务(优先选PaddleOCR,对艺术字、变形文字的识别准确率远高于Tesseract),负责返回所有单字符、文本行的边界框;二是自定义训练的YOLO检测模型,把需要识别的logo、自定义类别加入训练集,训练完成后部署为接口,负责返回logo整体的边界框。
  • 前端上传图片后,PHP同时调用两个检测接口,把所有结果合并后返回给前端,前端直接复用现有drawResults逻辑绘制即可,不需要在浏览器端加载大模型,首屏加载速度、运行流畅度都会明显提升。

优化提示

  • 如果你的场景里多是KFC这类经过设计的艺术字,默认OCR模型识别率一般,可以少量标注对应场景的文本做模型微调,识别率会提升明显。
  • 小批量自定义logo检测的训练成本很低,不需要掌握深度模型训练知识,用ml5的可视化训练工具,上传几十张标注好的样本,短时间就能得到可用的模型。

内容的提问来源于stack exchange,提问作者Muhammad Sarfraz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 17:16:17