Congrats on finishing the project! As you've already linked at the bottom of your post, it's possible that OpenAI could've solved most of your I/O issues.
One thing I'd suggest is exploring a reward function, instead of using only pre-recorded training data. That is, give the AI a goal to complete (in this case, finish the race) and let it learn by itself!
This is pretty cool; as someone who is currently working on the second project (traffic sign recognition) for the Udacity "Self-Driving Car Engineer" nanodegree, using TensorFlow - it is interesting to me how it seems like the "standard" MNIST CNN can be adapted to so many other use cases.
For the project I am currently working on, I'm using a slightly modified form of LeNet - which isn't too different from the TF MNIST tutorial; after all, recognizing traffic signs isn't much different than recognizing hand-written numbers...
...but "driving" a course? That seems radically different to my less-than-expert-at-TensorFlow understanding, but that is only due to my ignorance.
I'm glad that these examples and demos are being investigated and made public for others - especially people learning like myself - to look at and learn from.
The inevitable follow-up article that delves into training offensive banana peel usage should be interesting.
Quote: "Driving a new (untrained) section of the Royal Raceway:"
So the author did a proper test of the model by scoring it on an unseen track to make sure it generalizes! This is very awesome!
Personally I think the most impressive thing here isn't that you created a self-driving MarioKart, but that you trained TensorFlow based on input screenshots of your desktop.
I feel like that could be a good next step - a ubiquitous neural net model that, after mapping inputs, will learn to play any video game that's on your screen.
Best part, "With this in mind I played more MarioKart to record new training data. I remember thinking to myself while trying to drive perfectly, “is this how parents feel when they’re driving with their children who are almost 16?”"
It's basically a project these days at Udacity's Self-driving car nanodegree under "Behavioral Cloning" ;-)
I was ready to be impressed about seeing an AI that could consistently beat the game's own AI, with blue turtle shells and all. Oh well, still pretty impressive to be able to drive on the easiest course without opponents.
Check out also MarI/O, very impressive: https://www.youtube.com/watch?v=qv6UVOQ0F44
How are the original computer opponents able to play MarioKart?
Personally, I'm just a little impressed that you can train an active agent to play a game using old-fashioned supervised learning on screen states and controller states rather than relying on "action-oriented" learning techniques like reinforcement learning, online learning, or even a recurrent model.
It really shows how simple many control tasks actually are!
Next, have it upload its race results to kartlytics
I'm interested in knowing why the Python and C components communicate with HTTP, beyond reading about the bugfix. Wouldn't it be easier to use sockets or files or some other mechanism to integrate the two languages?
Just something to think about as a developer. I would imagine that on a local machine, using HTTP as the protocol might add latency.
Pretty interesting I must say. Have to admit though, I kind of expected the self driving AI to be trying to win Grand Prix or Versus races instead of doing well in Time Trials. But hey, I can see how that would be utterly painful to try and set up, especially given how times you get hit by items or rammed off the track in more recent games.
It would be very interesting to see how well this does with more training data, especially with multiple players.
This is very cool and I think if Kevin spends a bit of time learning reinforcement learning it could be amazing.
It seems like a lot of people doing reinforcement learning on video games get bogged down on training on raw pixels only... it would take a tremendous amount of data to make the driver recognise when and where to use certain power ups, however if you encoded this as a variable, wow it could be really cool.
I believe this is fundamentally how we humans learn with so few examples. Other humans "encode features for our brain to track" by telling us how it should be done and what information to prioritise.
This is really cool, and any reason to bring this game back into my life is warmly welcomed
I love this!
I'm working (albeit very slowly, as a beginner) on a similar project with Geometry Dash and Python. You're a great inspiration!
I appreciate the write-up. Thank you!
great write up! this is awesome
No power slide? Failure.
In contrast, here's what is effectively an oracle machine playing mario kart: https://www.youtube.com/watch?v=ZBNgbJ5hXtQ
(Amazingly detailed) info: http://tasvideos.org/5243S.html