ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

深度学习实战:搭建本地鞋类图像鉴别与防伪溯源系统

深度学习实战:搭建本地鞋类图像鉴别与防伪溯源系统 这次我们来看一个和常见 AI 项目不太一样的需求球鞋开箱验货。很多人拿到新鞋的第一件事就是拍照拍鞋盒、拍鞋标、拍中底走线再和网上的实拍图逐项对比判断这双鞋到底靠不靠谱。这个过程依赖肉眼经验光线一变、角度一偏结论就容易摇摆。如果你会一点深度学习完全可以把它做成一个本地部署的“开箱鉴别辅助系统”上传照片自动完成鞋型分类、局部特征比对、防伪码 OCR 解析最后输出一个综合参考结论。这篇文章就从技术实现角度把这条链路完整拆开。需要先说明边界本文不是教大家凭肉眼去分辨某个品牌鞋的真假也不涉及任何非授权渠道的具体鉴别手法而是提供一套可本地运行的鞋类图像鉴别与防伪溯源技术方案。你拿到的是环境准备、模型选型、服务部署、接口调用和问题排查的完整流程适合做个人技术实践也适合改造成二手交易平台风控、品牌渠道核验的辅助工具。所有结论仅作参考不能替代品牌官方渠道和权威鉴定机构的判断。整个方案的核心点有三个第一用图像分类模型做鞋型和品牌识别第二用局部特征对比模型计算“待验鞋照片”和“参考实拍图”的相似度第三用 OCR 解析鞋盒防伪码和鞋标信息。三个结果汇总后再通过一个简单的规则引擎给出“可信度评分”。整个系统可以 WebUI 操作也可以走 HTTP API同时支持目录批量导入跑完一批生成 JSON 报告。下面从能力规格开始展开。1. 核心能力速览能力项说明项目类型鞋类图像鉴别与防伪溯源辅助系统视觉识别 OCR 规则引擎主要功能鞋型分类、局部特征比对、防伪码/鞋标 OCR、可信度评分、批量识别检测输入鞋身整体图、鞋标特写、鞋盒防伪码、参考实拍图输出内容分类标签、相似度分数、OCR 文本、综合判定与置信度推理设备NVIDIA GPUCUDA低配置场景可切 CPU 推理推荐显存需按实际模型测试轻量分类模型通常 2G 到 4G 可跑特征比对模型偏高一些支持平台Windows / Linux依赖 Python 环境启动方式命令行启动本地 Web 服务可通过浏览器访问接口 API支持 HTTP POST 接口返回 JSON 结果批量任务支持目录批量导入按序输出结果文件和错误日志技术栈Python、PyTorch、FastAPI、PaddleOCR、Timm、OpenCV适用场景个人验货辅助、二手交易平台风控、品牌方渠道巡检需要明确一点上表中的显存和性能参数并不能直接套用到所有机器实际占用取决于你最终选用的骨干网络、图像分辨率、批量大小和是否开启半精度推理。更稳妥的做法是先拿一张测试图跑通流程再逐步放大批量。2. 适用场景与使用边界这类系统最合适的场景是“初筛”。无论是个人用户买了一双非官方渠道的鞋还是二手平台运营方需要快速判断卖家上传图片是否存在明显异常都可以先交给模型做一轮自动分析。对于明显不符合参考特征的图片系统直接打低分人工只需要复核低分样本能省下大量时间。它适合的技术角色包括想练手图像分类、度量学习、OCR 串联的开发者。需要给电商平台搭建图片审核辅助工具的算法工程师。想要建立“参考图库 自动比对”内部工具的质检团队。不适合的场景同样要提前说清楚。第一模型结论不能作为司法鉴定或品牌官方的维权依据最终定性必须由品牌方或权威机构完成。第二这套系统解决不了“拍摄图与参考图风格差异过大”的问题比如超强滤镜、严重畸变、极度暗光下的图片特征提取会失真。第三不要试图用它去量化“某个产地制造的鞋好不好”这是典型的标签误用产地不等于质量问题也不等于真伪问题涉及地域和品牌声誉的结论不能由算法下。合规方面有三条红线一是数据来源必须合法训练用的品牌图片、鞋标图片、参考图库需要有授权或来自公开合规数据集不能爬取未经授权的商业图片二是不得将系统用于生产和销售仿冒品的任何环节技术方案只能用于正品核验、消费保护和平台风控三是涉及人脸、门店、个人卖家信息时要做脱敏处理。文章后面的所有实践内容都默认基于你拥有合法授权的测试素材。3. 系统总体设计与技术选型先看整体流程这样可以避免在部署阶段盲目装依赖。输入图片目录 - 图像预处理缩放、归一化、去噪 - 鞋型分类模型EfficientNet / ResNet - 局部特征比对模型度量学习输出相似度 - OCR 模块防伪码与鞋标文字 - 规则引擎融合结果分类置信度 特征相似度 OCR 文本校验 - 输出 JSON 报告单张图片进入系统后并不是只跑一个模型而是并行跑三条分支分类分支负责回答“这双鞋属于哪个款式”。模型在合规图库上训练输出类别和置信度。如果置信度低于阈值说明输入图可能根本不是目标品类。特征比对分支负责回答“这双鞋的细节和参考图是否一致”。这里用度量学习把每一张鞋图映射为特征向量然后计算待验图与参考图库中的余弦相似度。这一步能捕获鞋底纹路、缝线走向、鞋标排版的细微差异。OCR 分支负责读取鞋盒防伪码、二维码下方的一串数字、鞋标上的尺码和货号。文本解析结果再和品牌公开的编码规则做简单匹配比如货号格式是否合法、防伪码位数是否正常。规则引擎把三路结果转成统一的分数口径。举例来说分类置信度是 0.92特征相似度是 0.87OCR 格式校验通过那么综合评分就由加权求和得到。具体权重可以自己在配置文件中调整核心逻辑是三路结果互相印证时总分高只有一路异常时系统会提示“需要人工复核”。模型选型上分类和特征提取都用图像分类的常用骨干网络区别在于分类模型最后一层换成全连接分类头特征对比模型最后一层换成特征向量输出层。OCR 可以直接使用开源 OCR 框架来识别印刷体文字不需要自己训练识别模型重点是截取鞋标和防伪码区域裁剪准确率决定了 OCR 的上限。4. 环境准备与前置条件先列一份通用依赖清单具体版本以你本机环境和最终选择的模型为准操作系统Windows 10/11 或 Ubuntu 20.04/22.04。Python3.10 或 3.11建议使用虚拟环境。GPU 驱动NVIDIA 显卡需要安装对应版本驱动并确保nvidia-smi能正常输出。CUDA / PyTorch先安装 PyTorch再看 CUDA 是否可用。依赖库torch、torchvision、timm、fastapi、uvicorn、paddleocr、opencv-python、pillow、numpy、scikit-learn。磁盘空间训练集、预训练模型、OCR 模型合计预留 10G 以上比较稳妥。模型文件分类模型权重、特征提取模型权重、OCR 模型权重按项目实际路径放置。环境准备的第一步是创建虚拟环境避免和系统 Python 环境互相污染。python -m venv venv # Windows venv\Scripts\activate # Linux source venv/bin/activate然后安装基础依赖。如果你的显卡支持 CUDA建议先从 PyTorch 官网复制对应 CUDA 版本的安装命令再安装其余依赖。这里给的是模板命令实际版本号需要你到官网确认后填入。pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121 pip install timm fastapi uvicorn paddleocr opencv-python pillow numpy scikit-learn安装完成后可以做一次快速环境自检确认 PyTorch 能正确识别显卡python -c import torch; print(torch.__version__); print(torch.cuda.is_available())输出True表示 GPU 可用输出False表示当前运行在 CPU 模式推理速度会慢很多但流程仍然能跑通。这里建议小参数先跑通不要一上来就追求高分辨率。5. 本地部署与一键启动依赖装好之后项目目录建议按下面的结构组织后面无论是训练、推理还是维护都会省事很多。shoe-check/ ├── checkpoints/ # 模型权重目录 │ ├── classifier.pth │ └── embedding.pth ├── configs/ │ └── config.yaml # 推理参数与权重配置 ├── data/ │ ├── reference/ # 参考实拍图库 │ └── test/ # 待验图片 ├── outputs/ # 推理结果输出目录 ├── app.py # Web 服务入口 ├── batch_runner.py # 批量识别脚本 └── requirements.txt启动 Web 服务之前先确认配置文件中几个关键字段输入图片目录、输出目录、模型权重路径、端口号和分类标签列表。这是一个通用配置模板实际需要根据你的模型结构替换字段名。server: host: 127.0.0.1 port: 8080 model: classifier_path: checkpoints/classifier.pth embedding_path: checkpoints/embedding.pth device: cuda # 或 cpu batch_size: 8启动命令很简单先进入项目目录再运行 Web 服务。python app.py如果看到类似Uvicorn running on http://127.0.0.1:8080的日志说明服务启动成功。浏览器打开http://127.0.0.1:8080可以看到上传页面。这里有一个经验点如果启动时提示端口被占用优先确认是不是上一次服务进程没有退出可以换一个端口测试而不是直接杀进程。python app.py --port 8081从工程化角度看服务本身并不推荐在生产环境用python app.py常驻建议后面封装成 systemd 服务或用 Docker 做隔离。本地测试阶段先跑通功能即可。6. 功能测试与效果验证部署成功不代表功能正确建议按下面四个维度逐项测试。6.1 鞋型分类测试测试目的是确认分类模型能正确识别输入图片的鞋款类别。操作步骤准备 3 到 5 张不同款式的合规测试图放到data/test/目录。在 WebUI 上传一张鞋身整体图。等待返回分类结果和置信度。预期结果是返回的类别标签和图片实际款式一致置信度高于设定阈值。如果置信度普遍偏低优先怀疑训练数据不够或类别数定义不合理不要急着调模型结构。6.2 局部特征比对测试测试目的是确认特征向量能区分同一款式和不同款式的图片。操作步骤准备一组参考图库每张图是同一个鞋款在不同光线、不同角度下的合规实拍图。上传一张待验图。等待系统返回待验图和参考图库中每一张图的相似度分数。判断成功标准是同款图之间的相似度应显著高于不同款图。如果分数没有区分度先检查参考图库中的图片质量其次再看训练时有没有做数据增强。这个测试是整个系统最核心的环节前面几轮可以多跑几张图观察分布。6.3 防伪码 OCR 与格式校验测试测试目的是确认 OCR 能稳定读取鞋盒防伪码和鞋标货号。操作步骤准备一张鞋盒防伪码照片和一张鞋标特写照片。上传到系统。检查 OCR 返回的文本是否完整、位数是否正确。常见问题是防伪码区域反光、倾斜、码条被遮挡。如果识别结果不完整可以先对图片做透视校正再进 OCR。OCR 的识别率不需要追求百分百关键是把识别成功的那部分文本接入格式校验规则。6.4 批量识别与报告生成测试测试目的是确认系统能连续处理一批图片并且没有内存泄漏。操作步骤在项目目录下建data/test_batch/放入 10 到 20 张待验图。运行批量脚本。python batch_runner.py --input_dir data/test_batch --output_dir outputs --report_file outputs/report.json预期结果是outputs/目录下生成每一张图的单独结果文件最后汇总的report.json包含每条样本的图片路径、分类结果、相似度分数和综合判定。如果批量运行到一半卡住优先看是不是显存被占满或者是单张异常图片导致进程崩溃批量脚本最好加上 try-except 把单张失败记录进日志而不是中断整个任务。7. 接口 API 与批量任务接口能力决定了这套系统能不能嵌入到现有业务里。下面给出一套通用 API 调用模板路由名和请求字段需要按实际项目替换。启动服务后系统会注册一个推理接口接收 Base64 编码的图片返回分类结果、OCR 文本和判定分数。一个典型的响应结构如下{ image_id: test_001, class_label: sneaker_model_a, confidence: 0.92, similarity: 0.87, ocr_text: 货号 ABC123 尺码 42 1/2, score: 0.89, suggestion: pass }用curl测试接口的示例curl -X POST http://127.0.0.1:8080/api/infer \ -H Content-Type: application/json \ -d { image_id: test_001, image_base64: /9j/4AAQSkZJRgABAQEAAAAAAAD/2wBDAAg... }用 Python 请求同样可行这种方式更适合后续集成到自动化流程中import base64 import requests image_path data/test/shoe_01.jpg with open(image_path, rb) as f: image_base64 base64.b64encode(f.read()).decode(utf-8) url http://127.0.0.1:8080/api/infer payload { image_id: shoe_01, image_base64: image_base64 } response requests.post(url, jsonpayload, timeout120) print(response.status_code) print(response.json())批量任务的具体实现不需要太复杂。在batch_runner.py里核心就是遍历目录、逐张推理、按条写结果。关键在于异常处理每一张图都包一层 try-except单张失败时记录错误原因继续处理下一张每条结果写完先落盘再处理下一条避免最后统一写盘时进程崩溃丢失全部结果。import json import traceback from pathlib import Path def run_batch(input_dir: str, output_dir: str, report_path: str): input_path Path(input_dir) output_path Path(output_dir) output_path.mkdir(parentsTrue, exist_okTrue) report [] for image_file in sorted(input_path.iterdir()): if image_file.suffix.lower() not in {.jpg, .jpeg, .png, .webp}: continue try: result infer_single(image_file) result[image_path] str(image_file) item_output output_path / f{image_file.stem}.json item_output.write_text(json.dumps(result, ensure_asciiFalse, indent2), encodingutf-8) report.append(result) print(json.dumps(result, ensure_asciiFalse)) except Exception: traceback.print_exc() report.append({ image_path: str(image_file), status: failed, error: traceback.format_exc() }) Path(report_path).write_text( json.dumps(report, ensure_asciiFalse, indent2), encodingutf-8 )接口服务长期运行时还要考虑访问范围。本地测试用127.0.0.1没问题如果部署到服务器建议用防火墙或反向代理限制来源 IP不要在公网裸奔。涉及用户上传图片时图片文件也要做大小限制和格式白名单避免恶意文件打满磁盘。8. 资源占用与性能观察性能优化不能靠猜要先建立观测手段。NVIDIA 显卡可以通过nvidia-smi实时查看显存占用和 GPU 利用率也可以加一行命令每隔几秒记录一次状态nvidia-smi --query-gputimestamp,memory.used,utilization.gpu --formatcsv -l 2CPU 推理时主要看 CPU 利用率和内存占用。实测中同样的模型、同样的输入CPU 推理耗时通常比 GPU 慢一个数量级这很正常。如果只是临时跑几张图CPU 也能接受如果要做批量任务建议还是用 GPU。影响性能的因素主要有四个输入分辨率图片从 512 分辨率提到 1024卷积计算量会明显上升但特征细节更丰富需要自己权衡。批量大小批量越大单位时间处理的图片越多但显存占用也越高。可以用batch_size1起步逐步往上调。模型结构EfficientNet 这类轻量骨干比大模型快不少特征提取质量略低但作为初筛工具已经够用。是否启用半精度PyTorch 可以开启混合精度推理显存占用和速度都有改善但前提是显卡支持。降低显存的常见方法包括降低批量大小、控制输入分辨率、使用半精度推理、关掉不需要的梯度计算、避免同时加载多个模型副本。如果显存不够但又必须同时跑分类、特征提取和 OCR可以考虑把三个模型放在同一个推理进程里串行执行而不是开三个服务。从稳定的角度看批量任务最容易出现的问题是长期运行后内存持续上涨。建议每处理若干张图后主动清理显存缓存和 Python 内存缓存。import gc import torch # 每处理完 N 张图后执行一次 if batch_count % 100 0: gc.collect() if torch.cuda.is_available(): torch.cuda.empty_cache()9. 常见问题与排查方法问题现象可能原因排查方式解决方案启动时提示端口被占用上一个服务进程未退出或端口被其他程序占用检查端口占用和进程列表换端口启动或结束占用进程依赖安装失败Python 版本不匹配或 pip 源不稳定查看报错信息确认包名和版本更换 pip 镜像源升级 Python 版本单独安装失败包模型文件缺失或加载报错权重路径写错或模型结构不匹配检查权重文件是否存在确认模型代码和权重版本对应修改配置路径重新下载匹配的权重CUDA 不可用显卡驱动版本过低或 PyTorch 安装成了 CPU 版运行torch.cuda.is_available()检查更新驱动按官网命令安装匹配的 CUDA 版 PyTorch推理时报显存不足批量大小过大或输入分辨率过高查看nvidia-smi显存占用减小批量降低分辨率开启半精度推理OCR 识别结果为空图片过小、反光或文字区域裁剪不准可视化裁剪结果确认文字区域完整增加透视校正提高文字区域裁剪精度批量任务跑到一半卡住单张异常图片导致进程崩溃或显存被打满查看日志和nvidia-smi增加单图异常捕获降低批量大小记录失败图片路径相似度分数没有区分度参考图库质量差或模型训练不充分检查参考图是否清晰、角度是否统一扩充高质量参考图库增加数据增强后重训WebUI 上传后长时间无响应图片过大或模型推理过慢查看后端日志和进程 CPU/显存占用限制图片大小减少并发或切换 GPU 推理综合评分和人工判断明显不一致阈值设置不合理或单一模型误判分析三路分数与最终评分的关系调整权重和阈值把低置信度样本交给人工复核10. 最佳实践与合规建议第一次使用这个系统时先不要追求模型指标用小样本全流程跑通更重要。准备 20 张左右的合规图片完成上传、分类、比对、OCR、批量、API 调用一整套流程确认每个模块输出正常再考虑扩展数据规模和调整模型。保留一套最小可运行配置无论以后怎么改都能立刻回到稳定版本。数据和目录管理要规范。参考图库、待验图片、输出报告这三类文件建议严格分目录存放不要混在一起。批量任务输出最好带上日期和批次号便于追溯。模型权重文件要定期备份同时记录训练数据版本和训练参数否则模型迭代后很难复现之前的推理结果。阈值设置是这套系统最容易踩坑的地方。分类置信度、特征相似度、综合评分都有阈值阈值定得太低会把明显不一致的图片放过去定得太高会误杀大量正常图片。更好的做法是先在一批保留样本上统计分数分布再根据业务需求选择阈值。任何自动判定都只能作为辅助最终定性需要人工复核。合规方面再强调几点训练图片和数据集的来源必须有授权不要用未授权爬取的品牌商业图片。系统不能用于生产、销售、宣传仿冒品也不能用于非法获取他人信息。涉及个人卖家或消费者上传的照片要注意个人信息保护对可识别到人的信息做脱敏处理。对外提供服务时要明确说明这是辅助技术工具不具备官方鉴定效力。如果涉及品牌商标信息尽量做匿名化处理不在公开输出中直接展示品牌词和商标。11. 总结与下一步这个项目的价值不在于模型有多复杂而在于把分类、特征比对、OCR 和规则引擎串成了一条完整的本地化鉴别链路。最值得先验证的功能是局部特征对比它能直观反映系统对同一款式不同图片的区分能力也是后期迭代空间最大的模块。最容易踩的坑有三个数据来源不合规、阈值设置不合理、批量任务缺少异常处理。这三个问题分别影响合法性、准确性和稳定性建议在项目一开始就规划好。下一步可以往三个方向扩展接入更多数据源比如视频抽帧、多角度环绕拍摄完善规则引擎让三路结果的可信度自动调整增加前端可视化看板把批量任务的结果分布、低置信度样本、OCR 失败样本直观展示出来。如果只是做个人验货工具当前这套方案已经足够支撑日常使用如果要做成平台服务还需要额外考虑鉴权、限流、审计日志和人工复核工单系统。建议收藏备用。跑通之后再回来对模型、阈值和性能做优化会比直接套大模型效率高得多。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进