u/Biting_Puppy

Image 1 — I trained a model on echosu's tags so it can tag every map in your osu! library
Image 2 — I trained a model on echosu's tags so it can tag every map in your osu! library
▲ 88 r/osugame

I trained a model on echosu's tags so it can tag every map in your osu! library

TLDR: Scoutsu is a free Windows app that goes through your osu! Songs folder and tags every standard map by the skills it asks for: streams, slider tech, finger control, wide angles and 54 more. Then you search your own library by those tags. A model trained on community tags from echosu does the tagging, so it works on maps nobody has tagged yet.

Download Scoutsu (grab Scoutsu-Setup.exe) · source code, GPL-3.0

[IMAGE 1: library]

Scoutsu, what is it?

echosu lets you search maps by tags that people added by hand, so it covers the maps someone has tagged there. I trained a model on echosu's tags and pointed it at everything you've downloaded, tagged or not. You get echosu-style search over your own library, offline, with maps you can play right now.

Why the name?

Scout + osu. It scouts your library for the kind of map you feel like playing. (ツ)

How does it work?

The first time you open it, Scoutsu finds your Songs folder and tags every osu!standard map in it. A big library takes a while on that first scan. After that it skips maps it already tagged, and it tags new downloads as they land in your Songs folder.

It works out star rating, BPM and length for each map as well, so you can filter on those. It runs on your PC and doesn't upload anything.

How do you search?

  • Tags: type tags separated by commas. Put a - in front of a tag to exclude it, like echosu's minus operator. Every tag you type counts as required, like echosu's dot operator. streams, -jumps gives you stream maps with no jumps.
  • Search box: title, artist or difficulty name.
  • Sliders: stars, BPM and length. Drag a handle to the end of its bar and that side has no limit, so you can ask for 220+ BPM or maps under a minute.
  • Sorting: click a column header. Shift+click to sort by more than one column.

Double-click a map and Scoutsu copies its name and switches to osu!, so you can paste it into song select with Ctrl+V. It remembers your filters and sort between launches.

[IMAGE 2: streams, -jumps at 5-6.5 stars]

In game

Alt+S shows or hides the window. It hides itself when you start a map and comes back when you return to song select.

Can this get me banned?

The one thing Scoutsu uses from osu!'s memory is whether you're in a menu or playing, so it knows when to hide. It gets that through OsuMemoryDataProvider, a library made by the author of StreamCompanion. It doesn't touch gameplay, your inputs or your replays.

osu!'s rules ban third-party tools that give you an advantage, and Scoutsu gets out of the way the moment you start a map. I can't speak for the osu! team, though. The code is public if you want to check what it reads.

For devs

  • The tagging model is an ensemble of five small neural nets exported to ONNX. They run inside the app (C#/.NET), so you don't need Python installed.
  • I ported the feature extraction from Python to C#, and CI fails if the two versions disagree on three test maps (a stream map, a jump map and a tech map).
  • The training code is public: osu-beatmap-classifier (MIT). It pulls tags through echosu's API, the one Leggo15 opened up for devs.

Lastly

  • You need Windows and osu!stable. Lazer stores maps in a different format, so Scoutsu can't read them. It tags osu!standard maps only.
  • Windows will warn you with "Windows protected your PC" the first time, because I haven't paid for a code-signing certificate. Click More info, then Run anyway.
  • It's a model, so some tags will be wrong. If you spot a map with bad tags, fix them on echosu, since that's the data the next version trains on. Map links in the comments help me too.
  • It checks for updates when you open it, so you won't need to reinstall to get fixes.

Every tag Scoutsu knows came from people tagging maps on echosu. Thanks to Leggo15 for building it and to everyone who tags there.

u/Biting_Puppy — 14 days ago