Python+OpenCV车牌识别实战:从零搭建完整CV流水线
上周有个刚学 Python 的同学问我有没有那种“看起来厉害但实际代码量不大”的练手项目能快速做出点成果来。我第一个想到的就是车牌识别。很多人觉得这得是计算机视觉的“高阶”玩法其实不然。用 Python 和 OpenCV 这个经典组合从零开始一个下午就能搭出一个能跑起来的识别系统。它不像人脸识别那样对模型和算力有高要求也不像目标检测那样复杂但麻雀虽小五脏俱全图像读取、预处理、目标定位、字符分割、模板匹配或OCR识别一套完整的CV小流水线都涵盖了。这恰恰是它作为入门项目最妙的地方你写的每一行代码都能直观地看到它对最终结果的影响。调一下灰度化的参数看看车牌区域是不是更明显了改一下形态学操作的核大小看看字符分割得干不干净。这种即时、可视的反馈是学习算法和调参最好的老师。今天我们就来彻底拆解这个项目不仅给你能直接运行的源码更重要的是带你理解每一步“为什么”要这么做以及从“单张图片跑通”到“稳定处理批量图片”之间那些新手最容易忽略的工程化细节。1. 先别急着写代码理解车牌识别到底在解决什么问题很多人一上来就搜“OpenCV车牌识别代码”复制粘贴运行报错然后就开始在各个论坛里求助。问题往往不在于代码本身而在于没搞清楚这个任务的核心挑战是什么。车牌识别不是一个单一的“识别”动作而是一个标准的图像处理流水线Pipeline。它的核心是在复杂的自然场景图像中定位并提取出一小块包含规整字符的矩形区域然后对这些字符进行识别。所以整个流程可以清晰地分为两个阶段车牌定位License Plate Localization从一张可能有车辆、道路、树木、建筑物的图片中找到车牌所在的位置并把它“抠出来”。字符识别Character Recognition对“抠出来”的车牌图片进行二次处理分割出每一个字符数字、字母、汉字然后识别它们。OpenCV 主要强大在第一个阶段。它提供了丰富的工具让我们能通过颜色、形状、纹理等特征像侦探一样在图片中找出车牌的“蛛丝马迹”。而第二个阶段既可以用 OpenCV 自带的模板匹配等传统方法实现也可以接入更专业的 OCR 引擎如 Tesseract来完成。理解了这个 Pipeline你就知道代码应该按什么模块来组织了而不是一堆函数揉在一起。同时你也会明白这个项目的成功率90% 取决于车牌定位是否准确。如果定位错了或者定位框不精确后面的字符识别再厉害也无用武之地。2. 环境搭建与核心工具不只是pip install输入材料里提到了很多热搜词像python安装、opencv安装教程、ModuleNotFoundError: No module named opencv这恰恰说明了环境是第一个拦路虎。我们一步步来确保你的环境是可复现的。2.1 Python 环境建议使用虚拟环境强烈建议使用conda或venv创建独立的 Python 环境。这能避免包版本冲突也是日后项目部署的好习惯。# 使用 conda如果你安装了Anaconda或Miniconda conda create -n plate_recog python3.8 conda activate plate_recog # 或者使用 venvPython 3.3 自带 python -m venv plate_recog_env # Windows plate_recog_env\Scripts\activate # Linux/Mac source plate_recog_env/bin/activate2.2 安装 OpenCV 和其他依赖OpenCV 的 Python 包叫opencv-python。对于这个项目我们可能还需要numpyOpenCV 的底层数组依赖和matplotlib用于显示图片调试用。pip install opencv-python numpy matplotlib如果后续需要用到 Tesseract OCR还需要安装pytesseract以及 Tesseract-OCR 本体这个我们放在字符识别部分详细说。注意如果你在导入时遇到ImportError或ModuleNotFoundError请按以下顺序排查确认当前终端是否在刚刚激活的虚拟环境中命令行前缀通常会有环境名。在终端输入python然后输入import cv2看是否报错。如果报错可能是安装不完整尝试pip install --upgrade opencv-python。确保没有其他名为cv2的包冲突。2.3 准备你的“武器库”OpenCV 常用函数预览在开始写流水线之前先快速过一下我们将用到的几个核心 OpenCV 函数知道它们是干什么的cv2.imread()/cv2.imwrite(): 读/写图片。cv2.cvtColor(): 转换颜色空间例如 BGR 转灰度图 (cv2.COLOR_BGR2GRAY) 或转 HSV (cv2.COLOR_BGR2HSV)。cv2.GaussianBlur(): 高斯模糊用于降噪。cv2.Sobel(),cv2.Canny(): 边缘检测。cv2.threshold(): 图像二值化阈值处理。cv2.erode(),cv2.dilate(): 腐蚀与膨胀形态学操作用于去噪或连接区域。cv2.findContours(): 寻找图像中的轮廓。cv2.boundingRect(): 计算轮廓的最小外接矩形。cv2.rectangle(): 在图像上画矩形。cv2.resize(): 调整图像大小。脑子里有了这些工具我们再去看整个流程就会清晰很多。3. 核心流程拆解从原始图片到车牌号码现在我们进入正题。假设我们有一张car.jpg。我们的目标是输出一个字符串比如“京A·12345”。3.1 第一阶段车牌定位——在茫茫像素中找到它定位是难点也是乐趣所在。通常有几种思路基于颜色车牌底色、基于边缘车牌矩形框、基于纹理字符排列。我们采用一种结合颜色筛选和形状判断的稳健方法。这个方法不一定100%准确但原理清晰适合学习。步骤 1图像预处理import cv2 import numpy as np # 1. 读取图片 img cv2.imread(car.jpg) # 2. 调整大小可选过大图片处理慢 height, width img.shape[:2] img cv2.resize(img, (int(width/2), int(height/2))) # 缩小一半 # 3. 转换为灰度图简化信息 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 4. 降噪 blurred cv2.GaussianBlur(gray, (5, 5), 0)预处理的目标是减少干扰信息突出我们关心的特征。步骤 2边缘检测与二值化# 使用Sobel算子或Canny检测边缘 # Sobel在X方向求导突出垂直边缘车牌字符有很多垂直边缘 sobelx cv2.Sobel(blurred, cv2.CV_64F, 1, 0, ksize3) abs_sobelx np.absolute(sobelx) sobel_8u np.uint8(abs_sobelx) # 或者使用Canny边缘检测 # edges cv2.Canny(blurred, 50, 150) # 二值化将图像转为黑白 _, binary cv2.threshold(sobel_8u, 0, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU)这一步的目的是得到一个黑白图像其中白色代表可能是边缘或字符的区域。步骤 3形态学操作连接区域车牌区域应该是一个连续的白色块。我们用“闭运算”先膨胀后腐蚀来连接相邻的白色像素点填充小孔洞。# 定义一个矩形的核kernel kernel cv2.getStructuringElement(cv2.MORPH_RECT, (15, 3)) # 闭运算 closed cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)(15, 3)这个核的宽度大于高度是基于车牌是一个长宽比很大的矩形这一先验知识。这是一个关键参数如果图片中车牌角度倾斜或大小差异大可能需要调整。步骤 4寻找轮廓并筛选现在closed图像中应该有一些白色的连通区域Blob。我们找出它们并筛选出最像车牌的那个。# 寻找轮廓 contours, _ cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) candidates [] # 存放候选车牌区域 for contour in contours: # 计算轮廓的边界矩形 x, y, w, h cv2.boundingRect(contour) # 计算长宽比 aspect_ratio w / h # 计算轮廓面积占矩形面积的比例衡量“矩形度” rect_area w * h contour_area cv2.contourArea(contour) extent contour_area / rect_area if rect_area 0 else 0 # 筛选条件长宽比、面积、矩形度 # 典型车牌长宽比在 2:1 到 5:1 之间 if 2.0 aspect_ratio 5.5 and rect_area 1000 and extent 0.5: candidates.append((x, y, w, h))这里我们用了三个几何特征来筛选长宽比、最小面积、轮廓填充度。这是基于规则的启发式方法是传统图像处理的精髓。你可以通过打印这些值观察成功和失败的案例来微调这些阈值。步骤 5提取车牌区域假设我们找到了候选区域通常取面积最大的那个或者通过其他规则如位置选择一个。if candidates: # 简单取面积最大的 candidates.sort(keylambda rect: rect[2]*rect[3], reverseTrue) x, y, w, h candidates[0] # 从原图或灰度图上截取 plate_img img[y:yh, x:xw] # 可以在这里画个框看看效果 cv2.rectangle(img, (x, y), (xw, yh), (0, 255, 0), 2) cv2.imwrite(detected_plate.jpg, plate_img) else: print(未检测到车牌) plate_img None至此如果顺利plate_img就是我们从原图中抠出来的车牌小图。这是第一阶段最大的胜利。3.2 第二阶段字符识别——从图片到文本拿到车牌区域后我们面对的是一个相对干净的、只包含字符的图片。识别也有多种方法。方法 A使用 Tesseract OCR推荐用于真实项目Tesseract 是一个开源的 OCR 引擎识别印刷体字符效果很好。我们需要先安装它。安装 Tesseract去 GitHub 下载对应系统的安装包。安装后需要将其路径包含tesseract.exe的目录添加到系统环境变量PATH中或者在代码中指定。安装 Python 接口pip install pytesseract使用import pytesseract # 如果Tesseract不在PATH中需要指定路径 # pytesseract.pytesseract.tesseract_cmd rC:\Program Files\Tesseract-OCR\tesseract.exe # 对车牌区域图像进行预处理提高OCR精度 # 1. 转为灰度 plate_gray cv2.cvtColor(plate_img, cv2.COLOR_BGR2GRAY) # 2. 二值化反转让字符为黑色背景为白色Tesseract默认期望这样 _, plate_binary cv2.threshold(plate_gray, 0, 255, cv2.THRESH_BINARY_INV cv2.THRESH_OTSU) # 3. 可以再进行一次轻微的形态学操作去除噪点 kernel_char np.ones((2,2), np.uint8) plate_binary cv2.morphologyEx(plate_binary, cv2.MORPH_CLOSE, kernel_char) # 使用Tesseract识别配置只识别数字和字母--psm 7 表示将图像视为单行文本 config --psm 7 -c tessedit_char_whitelist0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ text pytesseract.image_to_string(plate_binary, configconfig) print(f识别结果: {text.strip()})Tesseract 的强大在于它内置了语言模型对模糊、倾斜的字符有一定纠错能力。但对于中文车牌开头的汉字可能需要下载中文数据包并调整参数。方法 B使用 OpenCV 模板匹配适合学习原理如果车牌字符非常标准比如来自一个固定的数据集可以制作每个字符0-9 A-Z的模板图片然后在车牌图片上滑动匹配找到最相似的那个。这种方法受字体、大小、光照影响很大但能让你深刻理解“识别”的本质是什么。# 假设我们有模板字典 templates键是字符值是二值化的模板图像 def match_char(roi, templates): best_score -1 best_char None for char, template in templates.items(): # 调整roi大小与模板一致 resized_roi cv2.resize(roi, (template.shape[1], template.shape[0])) # 使用相关系数匹配 result cv2.matchTemplate(resized_roi, template, cv2.TM_CCOEFF_NORMED) _, max_val, _, _ cv2.minMaxLoc(result) if max_val best_score: best_score max_val best_char char return best_char if best_score 0.6 else ? # 设置一个置信度阈值你需要先分割出单个字符可以用垂直投影法然后对每个字符块调用match_char函数。这是一个完整的项目但复杂度会高很多。对于初学者我强烈建议先使用 Tesseract 完成从图片到文本的闭环。这能让你快速获得成就感并把精力集中在更有挑战性的车牌定位环节。4. 从“跑通”到“好用”工程化思维与常见问题排查代码能跑出一次结果只是万里长征第一步。要让这个程序变得“好用”能处理更多样化的图片你需要注入工程化思维。4.1 参数不是魔法数字理解与调优整个流程中充满了参数高斯模糊的核大小(5,5)、Sobel的ksize、二值化的阈值、形态学操作的核(15,3)、长宽比阈值2.0和5.5等等。不要死记硬背这些参数是基于对“典型车牌”和“典型图片”的假设。你的图片光照、角度、清晰度、车牌大小占比不同最优参数就不同。建立调优流程可视化调试在每一个关键步骤灰度图、边缘图、二值图、闭运算图、轮廓图后都用cv2.imshow()或matplotlib把图片显示出来。看看车牌区域在每一步是如何被增强或破坏的。参数扫描对于关键参数如形态学核的大小可以写一个循环尝试不同的值并保存中间结果图观察变化。制作测试集收集10-20张不同场景的车牌图片白天、夜晚、倾斜、部分遮挡、不同颜色背景。用这个集合来评估你的参数是否“泛化”而不是只看一张图。4.2 处理复杂情况光照、倾斜、模糊光照不均如果图片太暗或太亮全局阈值二值化会失效。可以尝试使用自适应阈值cv2.adaptiveThreshold()。车牌倾斜我们的矩形筛选对倾斜车牌不友好。解决思路在找到轮廓后使用cv2.minAreaRect()获取旋转矩形然后进行仿射变换cv2.warpAffine()来矫正。或者在边缘检测阶段尝试检测更完整的车牌四边形轮廓。图像模糊加大高斯模糊的核或尝试中值滤波cv2.medianBlur()但要注意不能过度否则会丢失字符边缘。4.3 完整的、健壮的代码结构一个健壮的程序不应该在找不到车牌或识别失败时就崩溃。它应该能处理异常给出日志。def detect_plate(image_path): try: img cv2.imread(image_path) if img is None: raise ValueError(f无法读取图片: {image_path}) # ... 完整的定位流程 ... plate_img locate_plate(img) # 假设这是封装好的定位函数 if plate_img is None: print(f[警告] {image_path}: 未定位到车牌) return None # ... 字符识别流程 ... plate_number recognize_characters(plate_img) # 封装好的识别函数 return plate_number except Exception as e: print(f[错误] 处理 {image_path} 时发生异常: {e}) return None # 批量处理 image_paths [car1.jpg, car2.jpg, car3.jpg] results {} for path in image_paths: results[path] detect_plate(path) print(results)4.4 性能考量如果只是处理单张图片速度不是问题。但如果想处理视频流或大量图片就需要考虑减少不必要的操作在循环中固定的参数计算可以提前。调整图片尺寸在定位前将图片缩放到一个固定宽度如800像素可以极大加快处理速度且对定位精度影响不大。算法优化形态学操作、轮廓查找都是计算密集型。如果速度是瓶颈可以研究更快的定位算法或利用多线程处理多张图片。5. 项目延伸从这里出发还能做什么当你成功实现了基础版本这个项目可以成为你学习更多计算机视觉知识的跳板。模型升级用机器学习/深度学习的方法替换传统的规则方法。例如训练一个简单的卷积神经网络CNN分类器来判断一个图像块是不是车牌二分类。或者使用 YOLO、SSD 等目标检测模型直接定位车牌这会比传统方法更鲁棒。端到端识别使用 CRNN卷积循环神经网络等模型直接输入整车图片输出车牌号码字符串省去中间的定位和分割步骤。集成到应用使用 Flask 或 FastAPI 将你的识别代码包装成一个 RESTful API提供一个网页上传接口做成一个在线车牌识别小工具。处理视频流使用cv2.VideoCapture读取摄像头或视频文件对每一帧进行识别实现实时车牌检测。这个基于 Python 和 OpenCV 的车牌识别项目其价值远不止于那几十行代码。它是一个完美的教学沙盒让你亲手实践图像读取、预处理、特征提取、目标检测、模式识别这一整套流程。过程中遇到的每一个问题——参数怎么调、轮廓为什么找不到、识别结果为什么是乱码——都是在逼你去理解底层原理。所以不要满足于复制代码并运行成功。尝试换不同的图片看看程序在哪里会失败然后思考为什么并尝试修复它。这个从“跑通”到“调优”再到“理解”的过程才是你从这个项目中能带走的、真正有价值的东西。

相关新闻

CNN新闻精听法:10分钟高效提升英语听力的四步实操指南

CNN新闻精听法:10分钟高效提升英语听力的四步实操指南

1. 先搞清楚“每天听CNN”到底练的是什么,以及为什么能“暴涨” 看到“每天坚持听10分钟CNN,英文听力暴涨100%”这种标题,很多人第一反应是怀疑:真的这么神奇吗?是不是标题党?作为一个长期和语言学习、技术…

2026/9/30 22:48:48 阅读更多 →
SpringBoot+MySQL旅游景点管理系统开发实践

SpringBoot+MySQL旅游景点管理系统开发实践

1. 项目概述:旅游景点信息管理系统的核心价值这个基于SpringBoot和MySQL的旅游景点信息管理系统,本质上解决的是景区信息化管理的痛点。我在实际开发中发现,传统景区管理往往依赖Excel表格和纸质档案,信息更新滞后、查询效率低下、…

2026/10/2 22:53:10 阅读更多 →
为什么你的LLM服务慢到哭?vLLM三招让GPU利用率从24%飙到96%

为什么你的LLM服务慢到哭?vLLM三招让GPU利用率从24%飙到96%

如果你的LLM服务线上延迟高、吞吐低、GPU还闲得发慌,大概率不是模型太烂,是你的推理框架没选对。 今天聊一个硬核话题:vLLM凭什么成为LLM生产部署的事实标准。不是背概念,是从底层问题出发,拆解它到底解决了什么、怎么…

2026/9/28 9:50:41 阅读更多 →

最新新闻

AssetBundle热更新安全排查:从CDN清单到本地缓存的全链路校验指南

AssetBundle热更新安全排查:从CDN清单到本地缓存的全链路校验指南

1. 项目概述:一次热更新安全隐患排查的完整复盘 做 Unity 客户端开发的朋友应该都有体会,AssetBundle 热更新方案上线容易,但真正让它长期稳定跑起来,靠的是细节。尤其是当你的游戏量级上来、CDN 节点分叉、本地缓存策略多样化之后…

2026/10/2 22:53:09 阅读更多 →
Jev浏览器Agent实测:本地部署AI模型驱动浏览器自动化全攻略

Jev浏览器Agent实测:本地部署AI模型驱动浏览器自动化全攻略

最近GitHub上有个叫Jev的浏览器Agent插件火了,21k star,把AI模型和浏览器自动化结合到一起,用自然语言就能驱动浏览器干活。我做了一轮完整的部署和使用测试,从模型选型、本地部署到插件配置、实际跑任务,把整个链路都…

2026/10/2 22:53:09 阅读更多 →
从零搭建AI工程体系:架构设计、核心模块与实操落地指南

从零搭建AI工程体系:架构设计、核心模块与实操落地指南

1. 从零搭建AI工程体系,为什么我劝你别急着调包"ai-engineering-from-scratch"这个标题,第一次看到的时候我愣了一下。市面上讲AI的教程铺天盖地,但绝大多数都是教你pip install一个库,然后调几个API,跑通一…

2026/10/2 22:53:09 阅读更多 →
DeepSeek Harness客户端详解:Token管理与多模型接入实战

DeepSeek Harness客户端详解:Token管理与多模型接入实战

DeepSeek Harness 客户端开放下载,消息一出,不少做 AI 应用开发的朋友都在群里聊这件事。如果你平时经常调 DeepSeek 的 API,或者需要在本地同时管理多个主流大模型的对话与调用,这个客户端确实值得花几分钟试一下。它把模型接入、…

2026/10/2 22:53:09 阅读更多 →
职工考勤管理系统:从数据库设计到状态判定完整实战

职工考勤管理系统:从数据库设计到状态判定完整实战

简介:数据库课程设计——职工考勤管理信息系统完整设计文档,面向计算机相关专业学生及需要完成数据库课程设计的人员。文档以企业考勤管理为背景,系统阐述从需求分析、概念结构设计到逻辑结构设计、物理结构设计与数据库实施的完整流程&#…

2026/10/2 22:53:09 阅读更多 →
互联网商业医疗保险直付平台:从理赔垫付到秒级结算的落地拆解

互联网商业医疗保险直付平台:从理赔垫付到秒级结算的落地拆解

简介:这份PDF文献面向医疗信息化从业者、医院信息中心技术人员及医疗保障研究者,聚焦互联网商业医疗保险直付平台的解决方案。内容系统梳理了商保的概况与现状、传统理赔流程的痛点,并重点论述平台设计原则,包括数据安全、实时性、…

2026/10/2 22:52:08 阅读更多 →

日新闻

从零搭建AI工程化:模型之外的完整闭环

从零搭建AI工程化:模型之外的完整闭环

先搞清楚一件事:从零开始做 AI 工程化,难的从来不是调模型、写提示词,而是把一套原型 Demo 变成长得像是“正经系统”的东西。你手里可能已经有了能跑通的代码,也可能刚读完一些概念,但真到了要把它变成可维护、可观测…

2026/10/2 0:00:20 阅读更多 →
大模型训练显存估计与混合精度训练实战指南

大模型训练显存估计与混合精度训练实战指南

1. 大模型训练显存估计与混合精度训练详解显存不够用,几乎是每个做大模型训练的人都会撞上的第一堵墙。你可能也经历过:模型代码写完了,数据管道跑通了,满心欢喜地按下训练启动脚本,结果几秒钟后终端弹出一行红字——C…

2026/10/2 0:00:20 阅读更多 →
小样本学习数据集选型指南:27个真正可用的高质量数据集

小样本学习数据集选型指南:27个真正可用的高质量数据集

1. 小样本学习的“弹药库”:为什么你总在找数据集,却总找不到真正能用的? 小样本、数据集——这两个词最近半年在我处理的200多个AI项目咨询里,出现频率排进前三。不是模型调不好,不是代码写不对,而是卡在…

2026/10/2 0:00:20 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/1 19:40:48 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/1 19:41:40 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/1 20:05:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 5:26:06 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 6:09:11 阅读更多 →