[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-arrow-v4":3},{"id":4,"title":5,"body":6,"categories":161,"concept":167,"date":168,"description":169,"extension":170,"heroPills":171,"image":73,"latelyDescription":175,"meta":176,"navigation":177,"path":178,"posterImage":73,"readingTimeMins":179,"seo":180,"sidebar":181,"sitemap":185,"stem":186,"subtitle":187,"tags":188,"__hash__":191},"blog\u002Fblog\u002Farrow-v4.md","Arrow V4",{"type":7,"value":8,"toc":148},"minimark",[9,13,18,30,36,42,46,49,52,56,59,64,67,78,82,85,95,99,102,112,116,119,129,140],[10,11,12],"p",{},"The 4th iteration of the Arrow project puts the developed YOLO model into the iPhone and scores the archery shoot automatically. There are 3 modes of capture: live session, photo capture. The app detects the target and finds the arrows on target and off target for a comprehensive score. In the live session the app will be able to call the score in real time. No score card necessary, the app will handle it.",[14,15,17],"h2",{"id":16},"four-generations","Four Generations",[10,19,20,24,25,29],{},[21,22,23],"strong",{},"V1 and V2"," were experiments that mostly taught me what the problem ",[26,27,28],"em",{},"isn't",". It isn't \"detect an arrow\" — it's everything around that: which camera angles lie to you, what the model confuses with an arrow, and how to tell a freshly landed arrow from the one that's been sitting in the target for thirty seconds.",[10,31,32,35],{},[21,33,34],{},"V3"," was a desktop-class system: a model trained on my own data, driving a C++ inference engine that proved out the full pipeline: detect, self calibrate against the target face, track candidates across frames, and score. It worked. It also required a computer at the range, which meant nobody (including me) would actually use it.",[10,37,38,41],{},[21,39,40],{},"V4"," is that engine reborn as a fully native Swift app. Same pipeline concepts, same thresholds, but running per frame on the phone's neural hardware, wrapped in a real product: live scoring, automatic impact replays, session history, and progress analytics. No third party frameworks anywhere in the app. It's Swift, SwiftUI, and Apple's platform stack, all the way down.",[14,43,45],{"id":44},"the-detection-problem-is-harder-than-it-sounds","The Detection Problem Is Harder Than It Sounds",[10,47,48],{},"An arrow in a target, seen from the shooting line, is a terrible object to detect. From behind, an arrow is a few pixels of shaft and a smudge of fletching, dead center in the busiest possible background, a target face covered in high contrast concentric rings that exist specifically to draw the eye. Off the shelf detectors are at their worst on exactly this: small, thin, low texture objects against structured clutter.",[10,50,51],{},"So there was no shortcut around building my own dataset. I filmed real arrows hitting real targets across many sessions, different lighting, distances, angles, weather, and turned that footage into labeled training data. One outcome of that process shaped the whole architecture: the app calibrates itself. The target's geometry is derived from what the model perceives, so there's no manual setup step, no \"tap the four corners of the target\" onboarding, and no classical computer-vision fragility hiding underneath. When the archer reframes the phone mid session, calibration quietly re derives itself. Exactly how the model comes to understand the target well enough to make that possible is one of the pieces staying private.",[14,53,55],{"id":54},"the-app-around-the-engine","The App Around the Engine",[10,57,58],{},"The scoring engine is maybe half the codebase. The other half is what makes it a training tool rather than a demo, and it's organized into five tabs that follow how practice actually flows.",[60,61,63],"h3",{"id":62},"shoot","Shoot",[10,65,66],{},"The fastest path from opening the app to releasing an arrow: a one tap Quick Start and three capture modes, live real time scoring with automatic impact replays, reading the score off an already shot target through the camera, or analyzing target photos from your library.",[10,68,69,74],{},[70,71],"img",{"alt":72,"src":73},"Shoot tab — Quick Start and capture modes","https:\u002F\u002Fraw.githubusercontent.com\u002FArsham1024\u002FSpectreCreationAssets\u002Frefs\u002Fheads\u002Fmain\u002FBlog\u002Farrow-v4\u002Fshoot-1.webp",[70,75],{"alt":76,"src":77},"Shoot tab — live session","https:\u002F\u002Fraw.githubusercontent.com\u002FArsham1024\u002FSpectreCreationAssets\u002Frefs\u002Fheads\u002Fmain\u002FBlog\u002Farrow-v4\u002Fshoot-2.webp",[60,79,81],{"id":80},"improve","Improve",[10,83,84],{},"Where sessions turn into progress: an impact heatmap of where your arrows actually land, personal bests and season goals, and session cards that open into full detail score breakdown, per arrow placement map, and replay clips.",[10,86,87,91],{},[70,88],{"alt":89,"src":90},"Improve tab — heatmap and analysis","https:\u002F\u002Fraw.githubusercontent.com\u002FArsham1024\u002FSpectreCreationAssets\u002Frefs\u002Fheads\u002Fmain\u002FBlog\u002Farrow-v4\u002Fimprove-1.webp",[70,92],{"alt":93,"src":94},"Improve tab — session detail","https:\u002F\u002Fraw.githubusercontent.com\u002FArsham1024\u002FSpectreCreationAssets\u002Frefs\u002Fheads\u002Fmain\u002FBlog\u002Farrow-v4\u002Fimprove-2.webp",[60,96,98],{"id":97},"equipment","Equipment",[10,100,101],{},"The garage: the gear you own and a part by part bow builder with 3D models, with maintenance tracking on the way.",[10,103,104,108],{},[70,105],{"alt":106,"src":107},"Equipment tab — your gear","https:\u002F\u002Fraw.githubusercontent.com\u002FArsham1024\u002FSpectreCreationAssets\u002Frefs\u002Fheads\u002Fmain\u002FBlog\u002Farrow-v4\u002Fequipment-1.webp",[70,109],{"alt":110,"src":111},"Equipment tab — bow builder","https:\u002F\u002Fraw.githubusercontent.com\u002FArsham1024\u002FSpectreCreationAssets\u002Frefs\u002Fheads\u002Fmain\u002FBlog\u002Farrow-v4\u002Fequipment-2.webp",[60,113,115],{"id":114},"profile","Profile",[10,117,118],{},"The archer: your discipline and setup basics, lifetime stats computed live from your sessions, practice streaks, and achievement badges.",[10,120,121,125],{},[70,122],{"alt":123,"src":124},"Profile tab — stats and streaks","https:\u002F\u002Fraw.githubusercontent.com\u002FArsham1024\u002FSpectreCreationAssets\u002Frefs\u002Fheads\u002Fmain\u002FBlog\u002Farrow-v4\u002Fprofile-1.webp",[70,126],{"alt":127,"src":128},"Profile tab — achievements","https:\u002F\u002Fraw.githubusercontent.com\u002FArsham1024\u002FSpectreCreationAssets\u002Frefs\u002Fheads\u002Fmain\u002FBlog\u002Farrow-v4\u002Fprofile-2.webp",[10,130,131,132,139],{},"Arrow is ",[133,134,138],"a",{"href":135,"rel":136},"https:\u002F\u002Fapps.apple.com\u002Fus\u002Fapp\u002Farrow-archery-training\u002Fid6790176541",[137],"nofollow","free on the App Store",". If you shoot, and you want your practice to add up to something, it's being built for you.",[10,141,142,147],{},[143,144],"obfuscated-email",{"label":145,"subject":146},"Email me with good suggestions","Arrow App suggestions",".",{"title":149,"searchDepth":150,"depth":150,"links":151},"",2,[152,153,154],{"id":16,"depth":150,"text":17},{"id":44,"depth":150,"text":45},{"id":54,"depth":150,"text":55,"children":155},[156,158,159,160],{"id":62,"depth":157,"text":63},3,{"id":80,"depth":157,"text":81},{"id":97,"depth":157,"text":98},{"id":114,"depth":157,"text":115},[162,163,164,165,166],"computer vision","archery","iOS","on-device AI","real-time scoring","Real-time archery scoring on an iPhone","2026-07-22","An iPhone app that watches your archery target, spots each arrow the instant it lands, and calls the score in real time — fully on-device, no server anywhere.","md",[172,173,174],"SwiftUI","On-device AI","Real-time CV","The latest iteration of my ongoing Arrow projects is an iOS inference layer of my trained YOLO model. Trained on my own proprietary archery data, my Arrow model runs natively on iOS using Core ML straight on hardware for maximum efficiency. This model can run inference on live archery shooting, pictures, and videos. Additionally, this app will save shoot results and give archers tools to track their progress.",{},true,"\u002Fblog\u002Farrow-v4","7",{"title":5,"description":169},[182],{"title":183,"value":184},"Stack","Swift · SwiftUI — custom-trained detection model on Apple neural hardware, per-frame tracking and scoring, no third-party frameworks",{"loc":178},"blog\u002Farrow-v4","Fourth time's the charm: an on-device AI scorekeeper",[164,189,162,190],"Swift","machine learning","Jm501OM3H18wxjhA3sFg0oP86_rEvPZVH9GSMBzVxF8"]