Skip to main content

Counting how many people walks by using Python, tensorflow and height estimation

In this article, I'd like to share my project to count the number of people walking past a store/shop etc. The motivation was when I was part of a family oriented digital theme park company, we would want to know if daily sales (visitors) are good enough. 

First, some background. Our theme park (store) is part of a department store/shopping complex. So we did not have a large piece of land like Disneyland, where all visitors are definitely there to visit the park. In our case, visitors to the shopping complex will consider taking their children to our entertainment theme park, so we would get a certain percentage of the total visitors of the shopping complex. So for example if we have 100 visitors on one single day, how do we know if this number is good or bad? If we know the number of people passing through our store we would have a better context. If the total number of people is say around 500 then we would be getting 20%, which doesn't seem so bad. But if the shopping complex was packed and we have say around 5000 people walking past our store, that would mean that we could only generate 2% conversion, and we would then decide to do further research on why we did so badly.

Another challenge we had was to detect if there are children present. Because we are targeting families, it would not make sense without getting the number of children present.

System overview

  • People detection with tensorflow
  • Children detection with height estimation
  • Sensor used was one webcam
  • Windows 10
  • Data stored to Google Sheets

Preliminary testing of height estimation algorithm

People Detection

Let's go through the modules one by one. The first component is the people detection module. This is achieved by using the model provided by Google and Tensorflow. This is easy enough since people detection models and sample code are available on the internet.

Height estimation

Height is estimated using single camera using trigonometry. The assumptions for the camera are
  • Focal length is known, so the camera intrinsics and extrinsics parameters are known.
  • Height of camera is known
  • Angle/orientation of camera is known

At the time of this writing, I just measured the height manually and the angle was also measured visually using a protractor. Of course, this is not accurate and for future work, an automatic calibration process is needed to recover the height and angle.

The height estimation process is simply calculating the bounding boxes of people detected by the AI model and converting their height in pixels into meters.

Future work

As mentioned above, this is just a simple installation of people counter and height estimation and more work is needed to increase accuracy especially with an automatic calibration method to recover height and angle of camera placement.


Comments

Popular posts from this blog

Object detection with Google Colab and Tensorflow

This is just a memo of the challenges I faced when running a model training on Google Colab, while following a great tutorial here . Mind the versions Tensorflow is currently at version 2.2.0 but most tutorials are still using the contrib package, and there is no known easy way to update the code to remove dependency on contrib. So my best bet is to downgrade the tensorflow version to 1.x. Since Google Colab only gives the options of either 1.x or 2.x and we cannot specify the exact version, I ended up with version 1.15.2. Even with the command :  %tensorflow_version  1.15.0 I ended up with : 1.15.2 Another pitfall was the version of numpy. Installing numpy gives us the version 1.18.3 but for some reason this generates the error : TypeError: 'numpy.float64' object cannot be interpreted as an integer Downgrading numpy to version 1.17.4 solved this for me. It seems we don't need ngrok for tensorboard With the command :  %load_ext tensorboard W...

Installing a custom ROM on Android (on the GT-N8013)

It's been a while since my last entry and since it is a new start in 2019, I thought I'd write something about "gone with the old and in with the new". I've had my Samsung Galaxy Note 10.1 (pnotewifi) since 2014, and it's one of the early Galaxy Note tablet series. It has served me well all this years but now it just sits there collecting dust. My old Samsung GT-N8013 I've known a long time about custom Android ROMs like CyanogenMod but has never had the motivation to try them out, until now ! Overview of the process For beginners like me, I didn't have an understanding of the installation process and so it looked complicated and it was one of the reasons I was put off in trying the custom ROM. I just want to say, it's not complicated at all!   Basically you will need to Prepare an SD card and install Android SDK (you need adb ). Install a custom boot loader ( TWRP is the de facto tool at the moment). Use adb to copy custom...

Using FCM with the new HTTP v1 API and NodeJS

When trying to send FCM notifications I found out that Google has changed their API specifications. The legacy API still works but if you want to use the latest v1 API you need to make several changes. The list of changes is listed on their site so I won't be repeating them again but I'll just mention some of the things that caused some trial and error on my project. The official guide from Google is here : Official Migration Guide to v1 . The request must have a Body with the JSON containing the message data. Most importantly it needs to have "message" field which must contain the target of the notification. Usually this is a Topic, or Device IDs. Since my previous project was using GAS, my request had a field called "payload" instead of "body". Using the request from my previous project, my request in Node JS was as follows: request ({ url: 'https://fcm.googleapis.com/v1/projects/safe-door-278108/messages:send' , method: ...