Tuesday, April 18, 2017

Sunday, March 12, 2017

Spring Street: From Emptiness to Fullness


On Sundays we fill the streets

I was hoping to catch a bunch of cyclists riding south by the flower power median, and my hope was fulfilled. They were waiting for the light, so I waited for them waiting for the light, and wanted to snap them near the flower power median, for the blog.


Not exactly what I pictured, but you can see the flowers and saguaros, and cyclists

Most rides, I reflect. I meditate a little. I pray a little, sometimes, too, but I admit that meditating or praying while riding is an iffy proposition at best, from a safety perspective, but also from the point of view of experiencing the ride fully, and, to be honest, I am not very good at doing two things at the same time, and that includes trying to meditate and ride simultaneously. I end up riding in a spirit of meditation / prayer, or settling into simplistic and repetitive mantra-like practice, if anything. Mainly I just spin, though, and enjoy the ride, and the day, and the moments.


The canal was filled with these, hundreds of them

A Spring when our rivers are richly full of water and flotsam

Bike rides, I have found, are not a time for intense brain work of either a rational or spiritual bent, not sustained, anyway. I try to let go of too much of either, and just ride: I am neither skeptical of the ride, nor overly spiritual about it, after a while, but just riding, just in it. Which, by the end of the ride, leaves me feeling fuller. Start out empty, end up fuller. That's all I wish for.

 

Tuesday, February 14, 2017

Vehicle Detection for Cyclists Using a Raspberry Pi 3 with OpenCV Haar Cascades


Real-time video image detection running on a Raspberry Pi 3 standalone

The results of experiment 4A were a success. 4A, versioned "WOFDAV Alpha POC 0.1", was intended to establish that the hardware, software, and approach was sound, to learn more about how to do this, to find limitations to overcome in future experiments, and to continue the fun engineering process.

I will post further details in future posts. This is just a quick progress update before I go hit the road to get more data.

Better shot of the Pi, with the power bank that puts out 2.4 amps at 5v

WOFDAV stands for Watch Out For Distracted Autonomous Vehicles.

Up next in experiment 4B:
  • Improve memory footprint and performance
  • Work on multi-threading
  • Look into leaner modules
  • Integrate camera
  • Road training
  • Road testing
  • Detection noise filtering (detect unicorns not herds)
  • Experiment 5 is planned to included TensorFlow

Current status: giddy.

 

Monday, February 6, 2017

Deep Bike Dreams


Yes, still just goofing around with neural network image processing, with bikes in it

I have throughout the lifetime of this blog sometimes run in the house with an idea in my head that I just had to type out as fast as possible because it was burning brightly and had to get out. Other times, I have had thoughts stew for the entire ride, mulling around and around, and then whisper out of my fingers into cyberspace. Neither of those happened today. Today I just went for a quick and excellent ride on a warm, Phoenix afternoon, took a photo of my bike against a wall, came home, and ran the photo through DeepDream. I like the way it all turned out.

I promise to write some code, hook up some hardware, and do something kind of useful, soon.

Saturday, January 28, 2017

Bicycle Threat or Treat Image Classification Using TensorFlow and Inception


.996 Bike Threat

The result of my experiment #3 in Machine Learning (ML) using TensorFlow was, according to rule #1, success, because I had fun, learned something, and the code ran. Beyond that, I was surprised at how good the program was at classifying images as either "bicycle threat" or "bicycle treat".

.997 Bike Treat

I've been diving into ML for the past couple of weeks, so my experiments are getting easier to setup and run. For this one, I picked over 100 images from this blog that said "bicycle threat" to me, pictures of onrushing cars, crashes, construction, bad road conditions, etc, and another 100+ images that said "bicycle treat," like flowers, art, pretty girls on bikes, cups of coffee, and peaceful open roads, and put them into folders labelled appropriately. Then I downloaded sample python code for retraining Google's deep learning model, inception-v3 on my images, goofed around with it until it was running the way I wanted it to, and let her rip.

Inception v3 looks like this, I'm told

After retraining the deep learning model to grok bike threats and treats, I got to try it out on random images to see what it came up with. After I tried out the images above and got the categorization I hoped for, I was giddy with ML power! I started trying random pix from various search engine image searches, and overall was happy with the results. Lone bike riders almost always score as treats. Ditto open roads and pictures of trees. Head-on photos of cars, large groups of cars, and nasty traffic jams, almost always got classified >95% as bike threats. All examples of Robert Indiana's "LOVE" sculpture that I tried rated very high as bike treats. Coffee and hot dogs also are solidly in the treat category. Girls on bikes scored strongly and consistently as treats. Most lone guys on bikes did, too.

Not everything was a screaming success, however. I took some low-rez screen grabs from this post that has a clip I shot of one of my more threatening encounters on the road, imagining results that I might get if I had enough hardware and the right software running on the back of my bicycle to alert me of what was about to happen. 

The first one scored high as a .997 threat. The second one, taken just before the actual close pass, got a more ambiguous .69 threat rating. The third one, taken just moments before #2, got a much stronger .93 threat rating. When I do this again, I will think more about close passes and real traffic situations, which I had a limited supply of photos of for this first experiment.

What's next for OSGIML? More image classification, I bet. First, more playing around with this experiment, to see what else I can learn. 

Add to backlog: the follower-drone should provide data to enhance threat detection, and to attract to bicycle treats on or near the intended navigation route. 

.997 Bike Threat

.692 Bike Threat (doh!)

.93 Bike Threat (yay!)
    
ADDENDUM: Saturday afternoon shots

bikethreat (score = 0.96360)
bikethreat (score = 0.99636)
  
biketreat (score = 0.54084) (confusing shadow is confusing)


bikethreat (score = 0.91335)

Thursday, January 26, 2017

There Should Be Bicycles in It



The video above is from experiment #2 with machine learning (ML): use a python script to process a video clip through TensorFlow / Deepdream. Experiment #1, my previous post, was to do that with a still photo. This is the next step in the continuing efforts of the OSG Institute for Machine Learning (OSGIML) to do something with it for bicycles. 

To that end, I've put together the following set of guiding rules that I sort of follow:

OSGIML RULES:

1. Experiments are successful when I learn something new, and the code runs.

2. There should be bicycles in it.


3. Experiments should prove out the software prior to me buying new hardware to run it, to minimize waste.


4. Set the bar low to ensure stepwise daily progress, to nurture new habits and have fun.


5. Exploit the virtues of developer laziness: reuse, adapt, recycle, refactor. Don't create tools you can download. Solve the heart of the problem, and don't expend cycles on problems that others have already solved.


6. Add flashes and insights to the backlog, for when tools, time, and technique might render them feasible.


EXPERIMENTS SO FAR:

Experiment #1. Use TensorFlow and Python to process bicycle images with Deepdream.
    learning: python, TF, ML, tensors


Experiment #2. Use TensorFlow and Python to process video clips which include bicycles with Deepdream.
    learning: more TF, more py, more ML, tensors and usage, hardware requirements, Siraj Raval videos for learning stuff about this (he's great)


Experiment #3. Try out Jupyter while using TF and Py to classify images that include bicycles.
    learning: basic TF usage, tensors, matrix math, Jupyter


According to rule #1, experiments #1 and #2 were resounding successes! On to experiment #3, classifying images with bicycles in them.

Add to backlog: bike-threat (classification). 1-shot, 1-hot, 1/10th second, fire alert with sound, LED, haptic, indicate direction and intensity.
 
Video note: I uploaded to Blogger, Youtube, and Vimeo, but the first two thought the flower effects were noise, and mainly took them out during processing, while Vimeo left them in, so that's why I used Vimeo in this post.
 


Monday, January 23, 2017

Getting to Yes! on the Bicycle


Photo processed thru Deepdream python script, with TensorFlow

Once I posted on this blog about a strategy of firmly yelling back at anyone who suggested that I and my bicycle don't belong on the road: "NO!" I suggested, yelled firmly and assertively back, would state the case clearly and effectively. It felt satisfying the few times I tried it out, but deep down it felt wrong. In its negativity, in its reactiveness, in its simple negation, it doesn't really work in the moment. Furthermore, it is unsatisfying in the moments and hours in the aftermath of such encounters, amounting to a visceral denial of something that actually occurred, in addition to a burial or repression of the feelings that go along with it.

While currently reading Tara Brach's "Radical Acceptance", it dawned on me that being open to the experience, recognizing it for what it is, then welcoming the feelings that accompany it with honest compassion, is potentially a more effective method for responding to road insults. If he's angry and I'm afraid, then that is what it is. It's about looking at reality openly, possibly differently, with less processing, rationalization, and denial, with more awareness, mindfulness, if you will. Too see what's there, be in the moment, and alive. Even when the moment itself has previously held strong negative potential. This, too, as Tara Brach might observe.

The photo above is an example of some recent forays I've taken into learning about Machine Learning (ML). So far, the math is about 80% over my head, but I'm chipping away at it through playful learning, which keeps me engaged. Instead of beating myself up for not really deeply understanding tensors or softmax so far, I play with the code and accept myself hack by hack and have fun with it. In my experience, the light usually goes on eventually, perhaps without me consciously willing it, or fighting against the setbacks, but just enjoying the act of creating trippy photos like the one above. Perhaps I will sneak up on understanding TensorFlow that way. Perhaps if part of our vision imagines sneaky weasel lurking beneath the share the road signs, we can get to "Yes" on our bicycles.

Why ML? I have this fantasy of programming and soldering something for bicycles, for cyclists. Raspberry Pi, Android, Python scripts, data overages, processing my commute through TensorFlow, I'm just saying yes, yes, yes, even if that's all crazy.