If you track the individual users as is suggested by "thus tracking their improvement over time" I would start with that being the top level directory. However, even that can lead to a directory bloat as the number of users increases.
In one application I wrote where I had to create a file for every user in a system, I wrote a routine (was actually database side) that broke down their unique id into a structured set of folders.
For example: user 12345 upload #5 could be stored in UPLOAD_DIR/1/2/3/4/5/upload_5.png
If you wanted something a little less "guessable" you could still use something like the above but instead of just using their id, you could hash it but follow a similar pattern.