<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>目标检测 on FXIO 技术博客</title><link>https://fxio.site/tags/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B/</link><description>Recent content in 目标检测 on FXIO 技术博客</description><generator>Hugo -- 0.157.0</generator><language>zh-cn</language><lastBuildDate>Sat, 11 Jul 2026 18:00:00 +0800</lastBuildDate><atom:link href="https://fxio.site/tags/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B/index.xml" rel="self" type="application/rss+xml"/><item><title>深度学习实战——从标注到部署的完整闭环</title><link>https://fxio.site/posts/cv/deep-learning-yolo-training-deploy/</link><pubDate>Sat, 11 Jul 2026 18:00:00 +0800</pubDate><guid>https://fxio.site/posts/cv/deep-learning-yolo-training-deploy/</guid><description>&lt;blockquote&gt;
&lt;p&gt;核心问题：怎么让一个“不会看”的模型，学会识别工业零件表面的划痕？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;!-- more --&gt;
&lt;h2 id="质检员的-05-秒困境"&gt;质检员的 0.5 秒困境&lt;/h2&gt;
&lt;p&gt;想象你是一个质检员，面前是传送带上飞速流动的钢板。每秒几十张，你要在 0.5 秒内判断：这张有没有划痕？有没有夹杂物？有没有裂纹？&lt;/p&gt;
&lt;p&gt;人眼做不到。但神经网络可以。&lt;/p&gt;
&lt;p&gt;目标——用深度学习，把这双&amp;quot;眼睛&amp;quot;训练出来。从 CNN 的底层原理开始，经过 YOLO 目标检测实战、LabelMe 数据标注，到用 trace-cn 辅助写训练代码，最终走完**&amp;ldquo;标注→训练→推理&amp;rdquo;**的完整闭环。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="cnn-基础卷积神经网络到底在看什么"&gt;CNN 基础：卷积神经网络到底在&amp;quot;看&amp;quot;什么？&lt;/h2&gt;
&lt;h3 id="从生物视觉到数学公式"&gt;从生物视觉到数学公式&lt;/h3&gt;
&lt;p&gt;CNN 的设计灵感来自人类视觉皮层。你看到一张照片，不是逐个像素分析的——你先看到边缘，再看到形状，最后组合出&amp;quot;这是一张脸&amp;quot;。CNN 干的是同样的事：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;浅层卷积核&lt;/strong&gt;提取边缘、纹理（&amp;ldquo;这里有条线&amp;rdquo;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;中层&lt;/strong&gt;把边缘组合成形状（&amp;ldquo;这是个圆形&amp;rdquo;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;深层&lt;/strong&gt;把形状组合成语义（&amp;ldquo;这是个齿轮&amp;rdquo;）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;核心操作是&lt;strong&gt;卷积&lt;/strong&gt;：一个小的权重矩阵（比如 3×3）在图像上滑动，每个位置做加权求和。一个 3×3 的卷积核只有 9 个参数，却能扫描整个图像——这就是&lt;strong&gt;参数共享&lt;/strong&gt;的威力。全连接网络处理一张 224×224 的图片需要上亿参数，CNN 可能只需要几万。&lt;/p&gt;
&lt;h3 id="为什么卷积核能提取特征"&gt;为什么卷积核能提取特征？&lt;/h3&gt;
&lt;p&gt;假设你有一个检测水平边缘的卷积核：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[[-1, -1, -1],
[ 0, 0, 0],
[ 1, 1, 1]]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;当它滑过图像时，遇到&amp;quot;上暗下亮&amp;quot;的区域，输出值就很大；遇到均匀区域，输出接近零。所以卷积核本质上就是一个&lt;strong&gt;模式匹配器&lt;/strong&gt;——每个核负责匹配一种特定的视觉模式。&lt;/p&gt;
&lt;h3 id="池化层压缩但不丢失"&gt;池化层：压缩但不丢失&lt;/h3&gt;
&lt;p&gt;卷积之后通常接一个池化层（最常见的是 2×2 最大池化）。它做的事情很简单：把 2×2 区域里的最大值保留下来，其余扔掉。&lt;/p&gt;
&lt;p&gt;为什么这么&amp;quot;浪费&amp;quot;？因为池化做了两件事：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;降低计算量&lt;/strong&gt;：特征图尺寸减半，参数量降到 25%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;增加鲁棒性&lt;/strong&gt;：目标稍微平移一点，最大池化的输出不变&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这就像你看一个人，不需要记住他脸上每个像素的位置，只需要知道&amp;quot;眼睛在鼻子上面&amp;quot;这种相对关系。&lt;/p&gt;
&lt;h3 id="训练的三驾马车损失函数学习率早停"&gt;训练的三驾马车：损失函数、学习率、早停&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;损失函数&lt;/strong&gt;衡量模型预测和真实值的差距。不同任务用不同的损失：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;分类用&lt;strong&gt;交叉熵&lt;/strong&gt;（&amp;ldquo;你预测是猫，但其实是狗，惩罚！&amp;quot;）&lt;/li&gt;
&lt;li&gt;目标检测用 &lt;strong&gt;CIoU Loss&lt;/strong&gt;（同时考虑框的重叠面积、中心距离、宽高比）&lt;/li&gt;
&lt;li&gt;分割用 &lt;strong&gt;Dice Loss&lt;/strong&gt;（对小目标特别敏感，比如医学影像里的肿瘤）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;学习率&lt;/strong&gt;控制每次更新参数的步长。太大了来回震荡，太小了原地踏步。实际训练中常用&lt;strong&gt;自适应学习率&lt;/strong&gt;（如 Adam），它会根据梯度自动调整步长——梯度大就小步走，梯度小就大步跑。&lt;/p&gt;</description></item><item><title>识别技术——让机器从"看见"到"读懂"</title><link>https://fxio.site/posts/cv/vision-recognition-from-seeing-to-reading/</link><pubDate>Sat, 04 Jul 2026 18:00:00 +0800</pubDate><guid>https://fxio.site/posts/cv/vision-recognition-from-seeing-to-reading/</guid><description>&lt;blockquote&gt;
&lt;p&gt;机器视觉采集到图像之后，怎么从中提取有意义的信息？识别技术给出了答案。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;!-- more --&gt;
&lt;h2 id="双十一仓库的条码失明事件"&gt;双十一仓库的条码失明事件&lt;/h2&gt;
&lt;p&gt;想象一下这个场景：双十一仓库高峰期，传送带上每秒飞过上百个包裹。你设计的条码识别系统突然大批量&amp;quot;失明&amp;quot;——不是算法不对，而是条码印得太浅、包裹朝向随机、曲面包装拉伸变形。客户在电话那头吼：&amp;ldquo;你们的系统废了！&amp;rdquo;&lt;/p&gt;
&lt;p&gt;这是工业视觉工程师的日常。&lt;strong&gt;识别不是一个算法问题，而是一个工程问题&lt;/strong&gt;。条形码识别、二维码识别、几何识别、大豆检测——用四个真实场景告诉我们：让机器&amp;quot;读懂&amp;quot;图像，远比&amp;quot;看见&amp;quot;它难得多。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="条形码识别工业世界的基础语言"&gt;条形码识别：工业世界的基础语言&lt;/h2&gt;
&lt;p&gt;条形码是工业自动化的&amp;quot;老前辈&amp;quot;，从超市收银到物流分拣，无处不在。但你以为识别条码就是&amp;quot;扫一下&amp;quot;？太天真了。&lt;/p&gt;
&lt;p&gt;课程用 DobotVisionStudio 搭建了一个&lt;strong&gt;食品包装盒识别系统&lt;/strong&gt;，流程是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;图像采集&lt;/strong&gt; → 摄像头拍下包装盒&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;快速匹配&lt;/strong&gt; → 用模板定位条码区域&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;仿射变换&lt;/strong&gt; → 校正角度和位置&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;字符识别&lt;/strong&gt; → 读取包装上的文字信息&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;条码识别&lt;/strong&gt; → 解码条形码&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;脚本判断&lt;/strong&gt; → 对比字符与条码，判断是否匹配&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;听起来顺理成章，但坑在细节里。课程特别提到：&lt;strong&gt;有时候条形码根本识别不出来&lt;/strong&gt;。为什么？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;静区宽度不够&lt;/strong&gt;：条码两侧的空白区域被压缩，解码器找不到起始位置。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;码制没选对&lt;/strong&gt;：系统默认只识别常见码制，如果遇到特殊编码，需要手动开启&amp;quot;所有码&amp;quot;选项。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;定位不准&lt;/strong&gt;：用快速匹配做模板时，矩形掩膜画得太小或太大都会翻车。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;解决方案：&lt;strong&gt;调参数 + 试错&lt;/strong&gt;。把静区宽度逐步调大，把码制选项全开，把匹配框精调到刚好包含条码。这没有银弹，只有耐心。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;经验之谈&lt;/strong&gt;：条码识别的工程难度往往不在算法，而在&amp;quot;最后一公里&amp;quot;——印刷质量、安装角度、光照条件。这些才是现场调试工程师的噩梦。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="二维码识别比条码多一个维度"&gt;二维码识别：比条码多一个维度&lt;/h2&gt;
&lt;p&gt;二维码识别的流程和条形码类似，但多了一个关键能力：&lt;strong&gt;抗变形&lt;/strong&gt;。二维码可以贴在曲面、歪斜、甚至部分遮挡的物体上，依然能解码——靠的是 Reed-Solomon 纠错算法。&lt;/p&gt;
&lt;p&gt;课程演示的完整流程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;快速匹配&lt;/strong&gt; → 定位二维码区域（创建模板 → 矩形掩膜 → 编辑模板）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;仿射变换&lt;/strong&gt; → 校正透视变形（继承方式选&amp;quot;按区域&amp;quot;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;二维码识别&lt;/strong&gt; → 绘制识别区域，解码内容&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;脚本编写&lt;/strong&gt; → 把结果存入变量，做后续逻辑判断&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这里有个有趣的工程细节：&lt;strong&gt;仿射变换的继承方式选&amp;quot;按区域&amp;quot;而不是&amp;quot;按图像&amp;quot;&lt;/strong&gt;。为什么？因为二维码可能出现在画面的任何位置，你需要让变换矩阵跟着定位结果走，而不是固定死。&lt;/p&gt;
&lt;p&gt;课程还展示了脚本编写——把识别结果存入 &lt;code&gt;strEWMSB&lt;/code&gt; 变量，输出 &lt;code&gt;RESULT&lt;/code&gt; 作为判断依据。这体现了工业视觉的核心思想：&lt;strong&gt;识别只是第一步，判断和决策才是目的&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="几何识别从像素到精确测量"&gt;几何识别：从像素到精确测量&lt;/h2&gt;
&lt;p&gt;如果说条码/二维码解决的是&amp;quot;读&amp;quot;的问题，几何识别解决的是&amp;quot;量&amp;quot;的问题。&lt;/p&gt;
&lt;p&gt;课程用 DobotVisionStudio 的测量工具，演示了如何测量：&lt;/p&gt;</description></item><item><title>用 YOLO 数筷子——从 OpenCV 到深度学习的目标检测实战</title><link>https://fxio.site/posts/cv/yolo-chopsticks-counting/</link><pubDate>Sun, 28 Jun 2026 20:00:00 +0800</pubDate><guid>https://fxio.site/posts/cv/yolo-chopsticks-counting/</guid><description>&lt;blockquote&gt;
&lt;p&gt;不锈钢筷子头挨着头、反光闪瞎眼，OpenCV 霍夫圆直接投降。这个小项目走了一遍从传统 CV 到深度学习的完整路径。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;!-- more --&gt;
&lt;h2 id="那些反光的筷子头把-opencv-逼疯了"&gt;那些反光的筷子头，把 OpenCV 逼疯了&lt;/h2&gt;
&lt;p&gt;事情是这样的：要数一把不锈钢筷子有多少根。听起来很简单对吧？拿个相机拍一下，数圆圈就行了。&lt;/p&gt;
&lt;p&gt;用 OpenCV 的霍夫圆变换（HoughCircles）试了一下——惨不忍睹。不锈钢顶部的金属反光和阴影被边缘检测器当成独立实体，满屏幕乱飞的假阳性圆圈。筷子头挨得又近，阴影轮廓互相粘连，算法根本分不清这是 16 根筷子还是 2 个异形物体。&lt;/p&gt;
&lt;p&gt;更要命的是调参。换个光照条件，&lt;code&gt;param1&lt;/code&gt;、&lt;code&gt;param2&lt;/code&gt; 又得重来。换个桌面背景，再来一遍。这不是写代码，这是在做手工。&lt;/p&gt;
&lt;p&gt;这就是传统 CV 的死穴：&lt;strong&gt;它只认几何形状，不认&amp;quot;东西&amp;quot;&lt;/strong&gt;。霍夫圆变换的逻辑是&amp;quot;找到符合圆方程的像素点集合&amp;quot;，它不理解&amp;quot;这是一根筷子的截面&amp;quot;这个概念。光照一变、角度一变、排列一变，像素梯度就变了，算法就废了。&lt;/p&gt;
&lt;h2 id="为什么-yolo-能搞定"&gt;为什么 YOLO 能搞定&lt;/h2&gt;
&lt;p&gt;YOLO 的思路完全不同。它不是在像素层面找几何形状，而是&lt;strong&gt;从数百万张图片里学会了&amp;quot;什么是筷子头&amp;quot;&lt;/strong&gt;。它理解的是语义特征，不是像素梯度。&lt;/p&gt;
&lt;p&gt;具体到这个场景：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;问题&lt;/th&gt;
&lt;th&gt;OpenCV (霍夫圆)&lt;/th&gt;
&lt;th&gt;YOLO&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;不锈钢高光&lt;/td&gt;
&lt;td&gt;把光斑误判为实体&lt;/td&gt;
&lt;td&gt;能通过上下文推理出这是光斑&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;筷子头紧密排列&lt;/td&gt;
&lt;td&gt;把多个物体融合成一个&lt;/td&gt;
&lt;td&gt;擅长分辨紧密排列的多个实例&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;换光照/换背景&lt;/td&gt;
&lt;td&gt;每次都要重调参&lt;/td&gt;
&lt;td&gt;一次训练，到处通用&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;简单说：&lt;strong&gt;OpenCV 是&amp;quot;按规则找&amp;quot;，YOLO 是&amp;quot;凭经验认&amp;quot;&lt;/strong&gt;。规则怕变化，经验怕没见过——但筷子头这种常见物体，YOLO 的训练集里见得多了。&lt;/p&gt;
&lt;h2 id="从标注到训练三步走"&gt;从标注到训练：三步走&lt;/h2&gt;
&lt;h3 id="第一步安装标注工具"&gt;第一步：安装标注工具&lt;/h3&gt;
&lt;p&gt;先检查 Python 版本：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python --version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Python ≥ 3.9&lt;/strong&gt; → 用 &lt;a href="https://github.com/labelmeai/labelme"&gt;LabelMe&lt;/a&gt;，支持圆形/多边形标注，本项目用的就是它&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Python ≤ 3.8&lt;/strong&gt; → 建议用 &lt;a href="https://github.com/heartexlabs/labelImg"&gt;LabelImg&lt;/a&gt;，只支持矩形框，但兼容性更好&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 LabelMe 依赖的 &lt;code&gt;pyqt5&lt;/code&gt; 在 Python 3.8 以下版本经常装不上，折腾半小时不如直接换工具。&lt;/p&gt;</description></item></channel></rss>