Hey, HN! I am colorblind and I can't reliably identify when a banana is ripe enough to eat, so I made a machine learning model that does it for me. The model (92% val accuracy, ~12MB) runs on your device (tf.js) and you can upload directly from the camera on mobile.
I'm also colour blind (red-green), and can't tell ripe bananas from unripe based on the green/yellow colour. But as they ripen, they tend to develop more black patterns on them, and they're softer when you give them a little squeeze.
It's an interesting project, nonetheless, and sounds like just the sort of thing I'd like to replicate to get started in ML.
Usually it's a good idea to include another class that captures bannans in general during the training, that way it doesn't try to classify things that are not bannans to begin with.
Thank you. I actually didn’t base it on fast.ai. It went on like so:
- I scraped from google images using queries like “ripe bananas”, “green bananas”, etc
- Filtered out garbage images and labeled the remaining with the help of someone
- Trained the model (very straight forward with Keras). The code in the notebook is something like 30 lines I think.
- Using tf.js was what took me the longest. Using tensorflowjs_converter.save_model outputs an incompatible or corrupted file. Saving it first with keras and then using the tensorflowjs_converter CLI tool is what worked. The web-ui code is also available in the repo.
- Lastly. It is served from GitHub pages (not a problem since everything is static and runs client side), with a custom freenom domain (on a convenient .ml tld) and through cloudflare’s DNS which gives me SSL on a custom domain, caching and some very basic analytics.
Everything free tier. It only cost me time (around 5h I think).
You are doing the fast.ai course too, right? [edit: looking at your code, no, you did not :)]
I chose my challenge to maximize my learning through something challenging enough it might fail. It's only right 60-70% of the time.
What I learned:
- Binning in to decades might not be Ideal. Something from 79 and 80 is more similar than something from 71 and 79. I guess a better approach would have been smaller bins (3 or more per decade) and than rounding the result to the decade.
- Be careful how you gather your learning data. I pulled from the google image search with something like "album OR LP cover 20s/30s/40s..."; this has ~20% "best of the XXs" collections in them where the cover was designed in a much later decade. I should have searched for "1920 OR 1921 OR 1922...".
13 comments
[ 3.7 ms ] story [ 40.5 ms ] threadFeedback is always appreciated!
Data, code and trained model are available here: https://github.com/giovannipcarvalho/banana-ripeness-classif...
It's an interesting project, nonetheless, and sounds like just the sort of thing I'd like to replicate to get started in ML.
Any chance for making an avocado identifier, because those are pretty tough to guess wether they are ripe.
In the forums there is a pinned thread about a docker build that works nicely on https://render.com/
fork repo, replace ML model, change html content, link to render, done https://course.fast.ai/deployment_render.html
- I scraped from google images using queries like “ripe bananas”, “green bananas”, etc - Filtered out garbage images and labeled the remaining with the help of someone
- Trained the model (very straight forward with Keras). The code in the notebook is something like 30 lines I think.
- Using tf.js was what took me the longest. Using tensorflowjs_converter.save_model outputs an incompatible or corrupted file. Saving it first with keras and then using the tensorflowjs_converter CLI tool is what worked. The web-ui code is also available in the repo.
- Lastly. It is served from GitHub pages (not a problem since everything is static and runs client side), with a custom freenom domain (on a convenient .ml tld) and through cloudflare’s DNS which gives me SSL on a custom domain, caching and some very basic analytics.
Everything free tier. It only cost me time (around 5h I think).
Did I miss anything you wanted to know?
You are doing the fast.ai course too, right? [edit: looking at your code, no, you did not :)]
I chose my challenge to maximize my learning through something challenging enough it might fail. It's only right 60-70% of the time.
What I learned:
- Binning in to decades might not be Ideal. Something from 79 and 80 is more similar than something from 71 and 79. I guess a better approach would have been smaller bins (3 or more per decade) and than rounding the result to the decade.
- Be careful how you gather your learning data. I pulled from the google image search with something like "album OR LP cover 20s/30s/40s..."; this has ~20% "best of the XXs" collections in them where the cover was designed in a much later decade. I should have searched for "1920 OR 1921 OR 1922...".