My Final Project
As part of my bachelor's degree project, we spend the final semester working on a project. We were a team of 3. We worked on developing an analytics platform specifically targeted at in-store shopping, by using wifi-enabled devices (Probe requests) and also by using cameras placed at the stores. We first pushed ourselves to get a POC and then got feedback on the same and got an MVP out before the final review.
Demo Link
Our app is live but data on it depends on whether the hardware is set up at the facility or not. (Also we'd be experimenting on the same!)
Shop Analytics
Link to Code
itspa1 / shop-analytics-pi
Raspberry-pi script to capture in-store people data and send them to a server
Shop-Analytics-Pi
This can run multiple types of collection of people data
- By MAC address identification i.e Capturing probe-requests nearby
- By Camera using people detection
How Each of them works
- Capturing probe-requests
- This is done by either putting the wifi-card of the device on monitor mode and running a
tcpdump
with appropriate flags. - If the native wifi-card does not support monitor-mode, you could plug an esp8266 microcontroller to run as a wifi-sniffer.
- This is done by either putting the wifi-card of the device on monitor mode and running a
- People Detection
- Several models can be run using the
tf
module present in this, you just need to swap out the appropriate tensorflow models by downloading from their Github repo. - YOLO is also supported to run on this by using the native CV2 library.
- Several models can be run using the
Steps to Run this on a raspberry pi
-
Ensure the pi's wifi card supports monitor mode (if using Native Sniffer module)
-
Clone this repo onto the raspberry pi
-
add gitignored files
- env.json
…{ "main": {
itspa1 / shop-analytics-backend
The backend service to store the captured probes from the pi.
Pi Sniffer Backend
The Backend server code to store all the frames coming from the raspberry pi and also enable api's interaction for the same.
Steps to run this backend
-
clone this repo
-
ensure node.js is installed (used version: lts(12.14.0))
-
run
npm install
-
add
main.js
in config directory -
module.exports = { clientUrl: "frontend service", port: 3000, mqttUsername: "mqtt service username", mqttPassword: "mqtt service password ", mqttHost: "mqtt service host", mqttPort: mqtt service port, mqttTopics: ["frame_topic","cache_frame_topic"] };
-
add
config.js
in config directory -
module.exports = { development: { username: "someUser", password: "somePassword", database: "someDatabase", host: "someHose", dialect: "postgres", logging: false, pool: { max: 5, idle: 10000, }, } };
-
run
node index.js
itspa1 / shop-analytics-frontend
The Frontend service to display the captured probes from the pi.
This project was bootstrapped with Create React App.
Available Scripts
In the project directory, you can run:
npm start
Runs the app in the development mode.
Open http://localhost:3000 to view it in the browser.
The page will reload if you make edits.
You will also see any lint errors in the console.
npm test
Launches the test runner in the interactive watch mode.
See the section about running tests for more information.
npm run build
Builds the app for production to the build
folder.
It correctly bundles React in production mode and optimizes the build for the best performance.
The build is minified and the filenames include the hashes.
Your app is ready to be deployed!
See the section about deployment for more information.
npm run eject
Note: this is a one-way operation. Once you eject
, you can’t go back!
If you aren’t satisfied with the build tool…
How I built it (what's the stack? did I run into issues or discover something new along the way?)
- We used Python to write scripts for the Raspberry-pi.
- We enabled a connection between the devices via the MQTT Protocol which enables a lightweight data transfer between IoT devices.
- We used Tensorflow and also YOLO to enable the people detection which has several models which have the capability to run on embedded devices with low computing power. (I personally like YOLO!😅)
- We chose to use Node.Js for the backend because of the asynchronous, event-based actions that it enables us to work with.
- We used react for the frontend (cause why not!🚀)
- Also, we used ZMQ for low-latency streaming of frames between the hardware and the backend server.
- Finally, we also used Grafana for the analytics part of it, where it was capable of querying and displaying graphs, and mostly because it has a lot of functionality as such.
Additional Thoughts
We're actually proud of the work that we've done till now. There is also a lot more than can be done on the project(De-anonymization of MAC address). Also, we're shocked by the fact that we collected almost close to 20 Million Probe request packets in the span of 4 months. (Also, a lot of data to deal with TBH!😂).
Top comments (0)