资讯动态

腾讯云图像分析实战:商品识别、图像标签与公众人物识别一次接入

发布时间:2026/10/23 5:22:46 来源:尧图企业网站定制
最近在做一个电商图片中台的需求核心就三件事给用户上传的商品图自动识别出是什么商品、给整张图打上可用的语义标签、判断图片里出现的脸是不是公众人物。单拎出任何一个需求现在的开源方案都能凑合但三个凑到一起自己训练模型就显得很不现实——光是标注数据、迭代周期、推理部署这三关就足够把一个两周上线的项目拖垮。最后我选了腾讯云图像分析把商品识别、图像标签、公众人物识别三个能力一次性接齐整个过程比预想中顺。这篇文章就把我从开通服务、配置 SDK到三个能力分别落地、再到生产环境踩坑的完整过程拆开讲一遍。适合正准备做图片识别相关功能的开发者、独立开发者以及被运营反复提“能不能自动给图打标签”这种需求的技术负责人参考。我不会只贴官方文档重点会放在接口返回怎么用、置信度阈值怎么定、哪些坑我替你们踩过了。1. 先说清楚一件事图像分析服务为什么值得接入1.1 需求场景你什么时候会需要这三个能力不是所有项目都要把三个能力全接上但如果你恰好负责的是一个内容型产品、电商后台或者素材管理平台大概率会同时遇到这三类诉求。商品识别解决的是“这张图里有什么商品”比如用户发了一张鞋子的照片系统要能返回“运动鞋”这样一个可用的商品名图像标签解决的是“整张图包含哪些语义”注意它和商品识别不是一回事商品识别只关心商品主体图像标签会把背景、场景、物体一起告诉你公众人物识别解决的是“这张图里的人是谁”它做的是人脸检测加身份匹配而不是简单的“有没有人”。这三个能力的差别在实际业务里非常明显。我拿一张“模特在商场橱窗前穿着球鞋”的图片举例商品识别大概率返回“鞋子”或“运动鞋”图像标签可能会返回“商场”“橱窗”“模特”“鞋子”“休闲”“街拍”这一堆公众人物识别则什么都不返回因为没有名人脸。所以这三个接口不是互相替代的关系而是从不同粒度解析同一张图。1.2 自研模型和调用云 API 的账怎么算很多人第一反应是“识别而已开源模型一大把自己训练不就行了”。我在这个项目里也认真算过这笔账结论是自研模型只有在一种情况下划算你把图像识别当成公司核心能力有专门的算法团队、有持续标注的数据管道、有推理服务运维能力。否则大部分团队的根本问题不是“模型能不能跑”而是“数据从哪来”。想识别“鞋靴类商品”你得有几千张带标注的商品图想识别公众人物你得维护一个不断更新的人脸库想打标签标签体系本身还得先设计出来。这些都比训练模型本身更耗时。我把两种方案的投入产出拉了一张对比表方便你判断对比维度自研模型云端图像分析 API训练数据需要自行标注大量数据冷启动周期长无需准备数据开箱即用开发周期从数据处理到部署至少一到两个月一个工作日内跑通推理成本GPU 部署成本高但边际成本可控按调用量计费无固定资源成本维护成本模型迭代、数据回流、服务运维都要人力几乎为零由服务方承担准确率取决于数据质量初期通常不如成熟大厂成熟模型常见场景准确率高灵活性可针对特定场景反复微调受接口能力边界限制如果你现在正处在一个“先把功能跑起来、验证业务是否成立”的阶段我建议直接用云 API。项目跑通了、调用量确实大了再回头评估自研也不迟。我这次就是先用云 API 跑了两个星期拿到真实数据和业务反馈之后才决定哪些场景需要降级、哪些场景必须离线处理。2. 部署前的准备账号、密钥和 SDK 的一次性配置2.1 开通服务与控制台操作腾讯云控制台里搜索“图像分析”能看到独立的图像分析产品页点进去之后确认开通商品识别、图像标签、公众人物识别这三个子能力即可。开通不需要额外审核主要是产品页里会展示每个接口的 QPS 限制和计费方式建议截个图保留后面做生产设计要用。开通之后最关键的步骤是拿到密钥对SecretId 和 SecretKey。这两串东西就是你的调用凭证和密码一样敏感。我见过不少团队把密钥直接写死在项目配置里最后泄露的案例所以在项目第一天就把密钥放到环境变量并且建了一个只有图像分析只读权限的子账号密钥而不是用主账号密钥跑业务。2.2 最小可用代码第一次调用图像标签先装官方 Python SDK然后写一个最小化的调用。下面是图像标签能力的调用示例import os import json from tencentcloud.common import credential from tencentcloud.common.profile.client_profile import ClientProfile from tencentcloud.common.profile.http_profile import HttpProfile # 图像分析相关模块的 import 路径以官方 SDK 文档为准 from tencentcloud.imageanalysis.v20200324 import imageanalysis_client, models cred credential.Credential( os.environ.get(TENCENTCLOUD_SECRET_ID), os.environ.get(TENCENTCLOUD_SECRET_KEY) ) http_profile HttpProfile() http_profile.endpoint imageanalysis.tencentcloudapi.com client_profile ClientProfile() client_profile.httpProfile http_profile client imageanalysis_client.ImageanalysisClient( cred, ap-guangzhou, client_profile ) req models.ImageTaggingRequest() req.ImageUrl https://example.com/your_image.jpg resp client.ImageTagging(req) print(json.dumps(resp.to_json_string(), ensure_asciiFalse, indent2))第一次跑这个脚本时重点不是看懂整个 SDK 结构而是确认三件事密钥能通过认证、网络能到接口、返回结构能打印出来。我在这一步浪费过半小时原因是公司网络环境把外网访问给限制了报错信息又不够直观最后换了独立网络环境运行才通过。建议先在公司网络之外试一次排除环境因素干扰。2.3 封装一个客户端工厂如果业务代码里每个地方都去初始化 client后面换 region、改端点、加日志都会非常痛苦。我的习惯是做一层工厂封装把 client 的初始化集中管理class ImageAnalysisClientFactory: _client None classmethod def get_client(cls): if cls._client is None: cred credential.Credential( os.environ.get(TENCENTCLOUD_SECRET_ID), os.environ.get(TENCENTCLOUD_SECRET_KEY) ) http_profile HttpProfile() http_profile.endpoint imageanalysis.tencentcloudapi.com client_profile ClientProfile() client_profile.httpProfile http_profile cls._client imageanalysis_client.ImageanalysisClient( cred, ap-guangzhou, client_profile ) return cls._client不要小看这个两分钟就能写完的封装。后面你会在好几个业务模块里反复调用图像分析如果每个模块都自己初始化一遍将来想加超时时间、想切换调用地域就要全局搜索替换。封装成单例之后所有改动都收敛到一个文件里。3. 商品识别从“返回商品名”到“撑起电商检索”的实战过程3.1 商品识别接口怎么用商品识别的接口输入非常直接传一张图片的 URL 或者 base64 编码接口返回识别到的商品信息。这里有个容易被忽略的点商品识别接口对图片主体要求比较高。它更适合电商场景里的白底图、橱窗图、相对干净的单主体图而不是复杂的自然场景。我试过传一张“桌子上放着手机、键盘、水杯”的照片接口返回的商品名会偏向画面中心、占比较大的物体其他商品被忽略。所以如果你要识别的是多主体场景正确的做法是先做目标检测把主体裁切出来再传给商品识别接口而不是指望接口一次把所有商品都返回。3.2 一个完整调用示例与结果解析下面以商品识别接口为例写一个完整调用req models.DetectProductRequest() req.ImageUrl https://example.com/shoes.jpg resp client.DetectProduct(req) print(resp.to_json_string())假设你传的是一张干净的白底运动鞋图类似的返回结构是{ Products: [ { Name: 运动鞋, Category: 鞋靴, Confidence: 0.93 } ], RequestId: xxxx-xxxx-xxxx }实际字段名以官方文档为准但核心要素就是这三项商品名称、类目、置信度。Name 是给人看的商品描述Category 是适合程序做归类的字段Confidence 就是你对这个识别结果的信心。这里要特别说明 Confidence 的使用方式。我测试过十几张不同质量的图片白底图置信度普遍在 0.9 以上自然场景掉到 0.7 左右模糊或者遮挡的图甚至会接近 0.5。如果你把 0.5 的结果也当真理给商品自动打标后面商品库会变得非常脏。大多数场景建议把 0.7 设为自动入库门槛0.7 到 0.9 之间可以入库但标记为待人工复核0.9 以上才自动发布。3.3 商品识别的落地姿势接入商品识别最实在的落地方式是给电商主图做自动打标。用户上传商品图后台识别出商品名称和类目回填到商品管理系统的字段里运营只需要偶尔抽查。这个流程能省掉大量人工录入成本而且识别结果可以作为搜索关键词补充用户搜“运动鞋”的时候哪怕商家标题写的是“休闲跑步鞋”也能通过商品识别标签关联出来。我测试时踩过的坑是手持商品的实拍图。模特拿着一只鞋对镜头展示结果返回的商品名竟然是“手”或者“人”鞋子反而不是主识别结果。后来我把识别流程改成先用商品抠图能力把主体区域提取出来再调用商品识别接口整体准确率立刻上了一个台阶。如果你的图片也是这种手持展示场景强烈建议走一遍抠图预处理。4. 图像标签标签不是越多越好关键是你能拿它干什么4.1 标签识别返回了哪些字段图像标签接口的返回是一个标签数组每个标签大约包含这么几个信息字段含义使用建议Name标签名称如“人”“车”“风景”直接用于展示或检索Confidence置信度0 到 1 之间的浮点数作为排序和筛选的依据FirstCategory一级分类如“人物”“物品”“场景”适合做统计和聚合SecondCategory二级分类更细的归类适合做标签体系归一这里有个重要认知标签接口返回的是“整张图所有能识别的语义”而不是“这张图是什么主题”。一张照片可能同时包含人、建筑、天空、树、椅子、手机接口会把这些全部列出来而不是只告诉你“这是街拍”。所以如果你拿它做主题分类会觉得很散拿它做检索和推荐反而很好用。4.2 用标签做图片检索一个简单可落地的方案我做的第一版图片检索非常简单把所有图片ID和对应标签存入一个本地索引用户输入关键词时遍历标签匹配按置信度排序返回。核心代码也就几十行def search_images(keyword, limit20): results [] for image_id, tags in image_tags.items(): score 0 for tag in tags: if keyword in tag[name] or tag[name] keyword: score max(score, tag[confidence]) if score 0: results.append((image_id, score)) results.sort(keylambda x: x[1], reverseTrue) return [image_id for image_id, _ in results[:limit]]这个方案粗糙但稳定适合小规模图片库。它的核心思路是把“识别结果”变成“检索字段”让运营可以按任意关键词找图。比如运营想找“穿着红色衣服站在户外的人的图片”直接搜“红色”“户外”“人”三个词把结果取交集就能筛出来。这在素材管理场景里非常实用。4.3 标签落地的两个常见误区第一个误区是不过滤低置信度标签就直接落库。图像标签接口默认会返回很多低置信度的“猜测”比如一张风景图返回置信度 0.3 的“无人机”其实画面里没有。如果这些标签全进标签库检索的时候就会出现大量驴唇不对马嘴的结果。我的做法是入库阈值设为 0.5展示阈值设为 0.7这样既保留了召回又保护了精度。第二个误区是标签体系没设计就直接用接口原文。接口可能把同一个东西在不同图片里叫“手机”和“智能手机”如果直接把这两种文本都存进标签库做统计就会分裂。正确做法是维护一份标签映射表把同义标签归一。我在项目里做了一个简单的映射规则比如“智能手机”归到“手机”“球鞋”归到“运动鞋”之后所有统计和检索都基于归一后的标签。5. 公众人物识别当人脸识别要回答“这个人是谁”的时候5.1 从“检测到人脸”到“识别出是谁”公众人物识别的整体链路分两步。第一步是人脸检测在图片里定位人脸框位置判断画面里有没有人脸第二步是把检测到的人脸跟公众人物库做比对返回最相似的人物姓名和相似度。这里一定得搞清楚一个边界公众人物识别只能回答“这张脸和库里的哪个人长得像”不能回答“这个人就是谁”。相似度 90% 不代表就是本人只代表面部特征的匹配程度。如果你拿它做身份验证或者实名认证那是用错场景了。我在项目里一直把它定位成“辅助识别”最终判断永远留给人工。5.2 调用示例与返回解析调用方式和前两个接口没有本质区别传图片 URL 或者 base64返回人脸信息和匹配结果。假设有这样一个返回{ FaceInfos: [ { X: 100, Y: 120, Width: 80, Height: 80, Name: 某某公众人物示例, Confidence: 88.5 } ] }字段基本就是人脸框坐标X、Y、Width、Height匹配到的公众人物姓名以及相似度。如果画面里有多个公众人物接口会返回多个人脸框你需要把坐标对应到原图才能知道哪个人配哪个名字。我遇到过一次特别典型的场景一张合影图片里有三个人接口只识别出其中一个公众人物另外两个人脸框返回置信度 30 以下的低分结果这时候就是“部分成功”不能把整张图标记为已识别。5.3 别踩的合规线公众人物识别最容易被忽视的是使用边界。这类能力适合用在媒体报道辅助识别、内容审核、历史资料整理这类场景。但要注意两点一是不要把它包装成“人脸验证”类功能替代身份核验流程二是如果产品面向用户收集包含人脸的图片必须提前获得用户的明确授权。在结果展示上也要小心措辞。我的产品页面上所有公众人物识别结果都标注“可能为某某”而不是“某某”这个小小的措辞差异在用户体验上完全不同。哪怕置信度高达 0.99也保留“可能”两个字这是对用户负责也是对自己的保护。6. 生产环境的现实限流、误判、成本与合规6.1 高并发下的限流与超时处理图像分析接口是有 QPS 限制的具体数值以你开通服务的控制台说明为准。这带来一个很现实的问题如果业务高峰期一个小时内要处理几万张图片直接并发调用接口一定会触发限流。我生产环境的做法是把调用链路拆成同步和异步两条。同步链路只处理用户主动触发的少数图片比如用户上传头像时的审核异步链路处理批量任务比如历史图片全量打标。异步任务用一个消息队列接收图片地址消费者按固定速率调用接口处理完把标签写入存储。这样既不会压爆接口也不会因为 QPS 拒流导致任务失败。另一个容易忽略的点是图片 URL 的抓取延迟。接口支持传 URL但这个 URL 如果是一个外部网站的地址接口要去外网抓图链路慢而且不稳定。我的经验是先把图片上传到对象存储拿到内部的稳定链接之后再传给识别接口整体耗时能下降不少。6.2 置信度阈值与误判谁来决定“识别失败”识别类接口永远不可能 100% 准确关键是你怎么设计“不确定情况下的策略”。我在项目里总结了一套双阈值策略高阈值决定自动动作低阈值决定是否保留记录中间带留给人工。比如商品识别置信度 0.9 以上自动确认商品名0.7 到 0.9 之间自动保存但标记为待审核低于 0.7 不保存。图像标签0.7 以上才作为有效标签写入索引0.5 到 0.7 之间只作为扩展标签位。公众人物识别更严格0.85 以下不在界面上展示姓名或者只展示“疑似公众人物”。千万别小看这个阈值设计。我在测试阶段发现如果把阈值设低了自动打标流程会产生大量错误数据这些错误数据又会反过来污染推荐和搜索整个系统的效果会像滚雪球一样越来越差。宁可少识别一些也不要错误识别一堆。6.3 成本控制图片压缩、缓存与批量处理的取舍云端图像分析按调用量计费成本控制的核心是“能不调就不调能少调就少调”。我的三个经验第一相同图片只调一次。给每张图算一个哈希值识别之前先查一下缓存表如果这张图已经识别过直接读缓存结果不再重复调用接口。用户重复上传、图片被多次引用这个缓存省下的费用非常可观。第二在线接口留给真正需要实时的场景。电商平台的存量图片有几十万张完全可以在空闲时段用离线批量任务跑完打标而不是等用户访问时实时识别。离线任务可以控制调用速率不会触发限流还方便失败重试。第三图片直接传本地路径或者先做压缩。如果原图超大可以先等比压缩到合理尺寸再传给识别接口图片小传输快、处理也快。但是要注意别压缩太狠分辨率过低会导致识别效果明显下降需要自己找一个平衡点。我在实际项目里最终的结构是离线任务负责全量图片打标和商品识别实时接口只处理用户主动触发的图片公众人物识别单独走一条审核链路并且配有人工复核。整个接入过程大约两个工作日后面维护成本很低。如果你也在接触类似的需求我的建议很直接把这三个能力当成“图片的解析管道”来用识别结果不是终点而是搜索、推荐、审核这些业务逻辑的输入。先跑通管道再根据真实数据迭代阈值和策略会比一开始就追求完美识别省力得多。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑