TrafficFlow – An Update

Early this year I started a project, TrafficFlow.  The goal was to train a neural network to recognize, with reasonable accuracy, congested traffic conditions.  I needed data, so every 3 minutes I was sampling a NC DOT traffic camera at I-40, exit 289.

This camera, and many others, can rotate.

(Above are images taken from the same traffic camera, one when it’s facing West, the other Facing East)

It would be interesting to see how the neural network responds to this type of data.  My guess was I would have ended up with a low accuracy because of the differing angles and most times, there was not a lot of data samples depicting traffic congestion.  I would have needed a lot more training data.  This forced me to find a new camera and one that is fixed.  I found one in Downtown Durham.

It’s even reasonably lit at night.  I’ll be sampling this traffic camera every 3 mins, meaning I’ll have enough data (hopefully) to start training a neural network in a week or two.  In the meantime, I’ll be doing a few exercises in deep learning, starting with this, Building powerful image classification models using very little data.

Learning TensorFlow

Adam Geitgey, is one of many engineers helping to spread machine learning knowledge to the rest of us.  His course, Building and Deploying Applications with Tensor Flow, is free this weekend through Monday, August 7th.  If you are interested in learning some of the basics of TensorFlow, this course does a great job.  It’s accessible, quick, and has some code to go along with it.

Cover slide from LinkedIn Learning

I finished it in a couple hours and feel like I have a good base of knowledge to build on.  After a pretty chill and relaxing summer, I’m working on restarting TrafficFlow, project where I build a TF model that can predict whether a snapshot from a traffic camera contains congestion.  This course is just one of many pieces of documentation and knowledge, I’ll be leveraging.

Building and Deploying Applications with TensorFlow on LinkedIn Learning

Edit: Check out a similarly structured lesson on Keras 2.0 – Building Deep Learning Applications with Keras 2.0

The Real Threat of AI

Kai-Fu Lee writing an opinion piece for the New York Times:

Unlike the Industrial Revolution and the computer revolution, the A.I. revolution is not taking certain jobs (artisans, personal assistants who use paper and typewriters) and replacing them with other jobs (assembly-line workers, personal assistants conversant with computers). Instead, it is poised to bring about a wide-scale decimation of jobs — mostly lower-paying jobs, but some higher-paying ones, too.

This transformation will result in enormous profits for the companies that develop A.I., as well as for the companies that adopt it. Imagine how much money a company like Uber would make if it used only robot drivers. Imagine the profits if Apple could manufacture its products without human labor. Imagine the gains to a loan company that could issue 30 million loans a year with virtually no human involvement. (As it happens, my venture capital firm has invested in just such a loan company.)

We are thus facing two developments that do not sit easily together: enormous wealth concentrated in relatively few hands and enormous numbers of people out of work. What is to be done?

Being in the tech industry and having done a lot of work in automation, this is something I often think about.  Artificial intelligence and machine learning are enabling companies to hire fewer people (or hire people for more specific roles).  Those who get hired or keep their jobs are doing the work that cannot be easily automated and relying on software tools for tasks that used to be fulfilled by people.  A significant portion of those savings benefit shareholders aiding the phenomenon, “the rich get richer”.

I’m still hopeful that new types of innovative, creative, and well compensating work will appear, but in the meantime, our society needs to be able to handle the influx of the newly unemployed.  People who lose out because of larger economic forces, entirely out of their control, need to be able to retrain and remake themselves for a new economy.  Instead, we (the US) are cutting social services like healthcare and reducing investment in community colleges and universities. Seems like we should be doing the opposite.

TrafficFlow – Classifying Data

As a follow up to my initial TrafflicFlow post, I have built some more software to help me classify the dataset I collected over the past few weeks.

TrafficFlow is a project where I develop an algorithm that can “look” at a still image pulled from a traffic camera and determine whether or not traffic is congested.  I am using the deep learning framework, TensorFlow, to build the model that will house this algorithm.

Over the past few weeks, I have collected 4,966 still images from a NCDOT traffic camera.  I wrote a Python script that took a snapshot.  I cron’d that Python script to run every 4 minutes.  Now that I have all of this data, how can I efficiently classify it?  A few ideas came to mind:

  • Python script that loaded the image in a picture viewer and presented a question in terminal.  This worked, but the picture viewer grabbed focus. I also couldn’t close the picture viewer automatically.  I determined that the extra interaction involved would make classifying the data this way, inefficient.  This also limited me to classifying data on my MacBook Pro only.
  • AngularJS web app that allowed me to classify images in a desktop web browser.  This was interesting, but I didn’t know a ton of Angular and this limited me to classifying data on my MacBook Pro only.

I’m an Android developer by day (checkout RadioPublic 😉 ).  I figured I’d just build an Android app that would allow me to classify the data, so I did.  But first, I needed to gather the collected data into a format that is easily usable in this app.  So I wrote a Python script:

This script simply reads a list of files from a directory, creates an entry in a dictionary (saving some additional metadata in the process), and exports that object to JSON.

A snippet from the exported data looks like:

Next, I uploaded this JSON file to Firebase.  Firebase is a backend as a service that allows app developers to quickly build apps without needing to spin up servers or turn into “devops”.  Best of all, it’s free to get started and use.

Finally, I uploaded 4,966 images to my web server so that my app can access them.

Now on to the app.  It’s nothing special and particularly ugly, but it works.

It allows me to quickly classify an image as congested (1), not congested (0), or ditch/don’t include (-1).  Once I classify an image, it saves the result (and my progress) to Firebase, then automatically loads the next one.  It turns this exercise into a single tap adventure, well a 4,966 series-of-single-taps adventure.

I’ve uploaded the Python script and Classify Android app to GitHub (  I hope to make my dataset available soon as well.

Now onto classification.

Hello TrafficFlow

I am interested in machine learning.  I’ve finished most of the Udacity “Intro to Machine Learning Course”.  I’ve been thinking of ways to get my feet wet in machine learning.  A practical project that I can start and finish that will give me some hands on experience.

Hello TrafficFlow (Traffic + TensorFlow)

I-40 at Wade Avenue in Raleigh, North Carolina

I’ve built an Android app, Traffcams, that lets people view traffic images from traffic cameras.  I’ve done the TensorFlow tutorial walking through image recognition.  So I’m thinking that I can modify that tutorial to tell me if an image from a traffic camera contains a lot of traffic.  My first step in training a TensorFlow model is collecting the data.  I wrote a Python script that simply saves an image to disk from a given URL.

I have this script cron’d on a Ubuntu server.  It runs every 4 minutes saving an image from this camera, which means I’ll save 360 images per day.  I’ll probably throw away the night pictures (sunset to sunrise is about 8 hours)…so I’ll acquire about 240 usable pictures per day.  I’m predicting I’ll need about 2,000 to 3,000 images to train a model.  I’ll play it safe and say I’ll need 3,000 images.  In 12 and a half days, I’ll have enough data to train.

My next step is to manually classify these images as having a lot of traffic (1) or not (0).  Sounds monotonous.