
负空间
我是iOS工程师,从原生iOS开始尝试。苹果的Vision框架有现成的物体检测器、人物分割、文本识别和条形码扫描功能,但它总把图像里随机部分标记为弹孔,从靶心小点到计分环碎片都不放过。弹孔是负空间,物体检测器针对应存在的物体训练,找之前存在但后来被移除的东西不容易。Vision的环和物体检测器应用于NSRA靶卡时,效果不佳。我试过灰度处理、反转图像、添加和去除噪声等方法,但落在环线上的子弹还是会变成小到无法识别的碎片。更好的办法是把靶子当作有已知几何形状的物体,先找环的结构,再在里面找弹孔。我不再重新发明轮子,开始寻找其他方法。
移植及其他
2012年的一篇论文
计分射击靶作为计算机视觉问题,已有相关研究。我找到华沙工业大学的Rudzinski和Luckner于2012年发表的《具有锦标赛精度的射击靶自动计分》,该论文声称能检测到99%的弹孔。但有几个问题:这种方法针对低分辨率图片优化,需使用国际射击运动联合会(ISSF)的扁平靶。与NSRA靶相比,ISSF靶的靶心大小、环的数量、环的样式和背景都不同。ISSF气步枪靶相机拍摄角度低,注释与弹孔不同,通常为气枪射击设计。气枪子弹在纸上打出整齐的孔,22口径子弹在25码外留下参差不齐的边缘。我一步一步重现了论文方法,简单来说是四个步骤:擦除环线、进行泛洪填充以找到弹孔形状、运行Prewitt边缘检测器、使用霍夫变换拟合圆形。Vision框架没有Prewitt边缘检测器,我引入了OpenCV,前三个步骤效果不错,但第四步有问题。NSRA靶卡在四个方向印着环的分数,霍夫变换会把这些数字拟合成圆形。而且有时擦除环线后的月牙形太小,泛洪填充无法处理,我最终使用了V值径向强度剖面,从靶心向外取一条带,沿着它采样亮度,然后寻找白色环线交叉处的峰值,这些峰值位置就是环的半径。结合Vision的`VNDetectContoursRequest`和周长过滤器,我平均每张靶卡能识别出五发子弹中的四发,准确率为80%,还没处理像重叠子弹这样的边缘情况。
添加机器学习
射击者会在靶卡上做标记,写名字、添加日期、圈出接近的子弹。大多数靶卡有撕裂的订书钉孔,有时多颗子弹把纸撕裂得接近,会变成一个泛洪填充区域。我最初尝试为每种情况添加启发式方法,每周带着另一组射击卡回来调整,但这种方法难扩展和持续。我又去谷歌搜索,找到一篇2023年底发表的论文。Z. Ali等人的《YOLOv8和Detectron2在射击卡弹孔检测和分数计算中的应用》,发表于《AI》杂志2024年第5卷第1期,第72 - 90页。作者声称平均精度达到96.5%,但主要关注弹孔检测,并从边界框类别中读取分数。我没时间为靶卡手动准备边界框类别,但多亏Rudzinski和Luckner,我已有可行的几何方法,缺少可靠的弹孔检测。YOLO论文在弹孔检测方面做得好,但假设靶卡完全对齐,没考虑几何形状。我将两种方法结合:OpenCV处理结构几何,YOLOv8进行弹孔定位,采用与MDPI论文相同的架构,并在自己的数据集上进行微调。推理时丢弃学习模型的类别预测,分数通过与几何环半径相比的到靶心的距离来确定。标记和训练完成后,我使用`coremltools`将模型导出为CoreML,Xcode导入后,最终的包大小为22.4 MB。
计分
坐标映射
把两部分结合后,我以为计分最容易,但总在坐标空间上浪费时间,还忘了透视问题。Vision返回的边界框坐标范围是0 - 1,原点在左下角,而UIKit的原点在左上角,容易出现偏差一个环的错误,且这些错误看起来合理,很难想到是变换方法的问题。坐标对齐后,数学计算简单。但计分器存在有原因,检测到的弹孔比实际子弹小,因为纸张会撕裂并向内推。CoreML返回的是可见撕裂纸张的边界框,计分需要弹孔的中心加上子弹的半径,即子弹到达的最远点。
子弹半径
22口径的子弹直径是0.22英寸,NSRA的22口径靶卡直径是2.05英寸,从几何角度,子弹半径应是靶心直径的10.87%。但纸张撕裂不整齐,我物理和机器学习学得差,重新阅读两篇论文后放弃,开始凭经验调整乘数,即改变常数,然后在手动计分的靶卡上重新运行测试。对我来说,30%的乘数效果不错(即靶心直径的14.13%),我很想知道正确方法,若你知道,请[给我发消息](mailto:nsra@drobinin.com)。
超越计分器
六个月过去,我仍觉得射击水平差,但现在大多知道原因——姿势、扳机压力或射击时的呼吸。这些需要感受而非测量,这就是初学者先打分组靶卡的原因。靶卡上子弹组的形状能提供很多信息,从常见问题到步枪问题。如果一组紧密的子弹离靶心有几个环的距离,通常意味着若不是调整问题,本可完美命中靶心,我觉得这解释很安慰人(但朋友们不同意)。比赛靶卡按已知顺序一个靶心一个靶心地射击,知道哪个靶心是第一个射击的,就可根据位置绘制精度图,发现趋势。我常发现自己中间会偏离,快打完靶卡时又能集中。我开始这个项目是为摆脱计分器,也不再往家搬打过的硬纸板,但计分功能起作用时,我对自动化的兴趣不仅局限于计分,还包括反馈。几个月的计分靶卡积累下来,我可把所有射击数据叠加在累积热图上,查看趋势,或比较在四把公用步枪上的表现。我甚至能证明,轮到我射击前几分钟吃个甜甜圈,平均会使成绩下降7分(满分100分),这可能是心理作用,我目前的理论是会使血糖升高(我物理和生物都学得不好,但已尽力)。最后,我把它打包成了一个[小型离线优先应用](https://apps.apple.com/app/apple-store/id6747980153?pt=126702974&ct=drobinin.com-brass&mt=8),最初为俱乐部里的朋友做的,实际上是为任何想让射击日常更有趣的人准备的。不过我发现世界上大多数人不关心NSRA靶,所以我一直在慢慢增加对其他射击项目和靶卡的支持。



被折叠的 条评论
为什么被折叠?



