Detecting masked faces in the pandemic world
Packaging your Machine Learinng message
Vladimir Iglovikov
Sr. Software Engineer at Lyft, Level5
Ph.D. in Physics
Kaggle Grandmaster
Career ladder

Fresh grad without PhD
Fresh grad with PhD
(could have 100500 papers at NeurIPS, CVPR, ECCV, etc)

Glass ceiling

- You work harder than everyone else.
- You train State Of The Art models.
- You publish papers at top conferences.
Most likely (90% chance) you will never get to L6!

Data Scientist skill tree

Ownership
Technical
Communication
Your level
Not your level

Models are not everything!
You need to train
ownership
and
communication!
What SMALL improvements can you add to your modeling process to train ownership and communication?
Example:
Face Mask Detector
Target audience:
- Kagglers
- Academics
- Junior Data Scientists

Three ways

Detector with 2 classes:
mask / no mask
Detector with two heads:
face and face attributes
Detector + classifier

Slowest but the most accurate.
Our choice.





Face Detector









Face classifier
0.99
0.99
0.01

Stage I
Stage II
Face mask detection in two stages
Face detector: simplified RetinaFace

class + bbox + landmarks
class + bbox + landmarks
class + bbox + landmarks
RetinaFace: Single-stage Dense Face Localisation in the wild arXiv:1905.00641
Face Detection: Widerfaces dataset

- http://shuoyang1213.me/WIDERFACE/
- 32,203 images
- 393,703 faces
Training

Predictions: boxes

You have a model. What is next?
- +5 min: Publish your code at GitHub as is.
-
+10 min: Add code formatters and style checkers.
- +20 min: Create a clear readme.
- +20 min: Create a collab notebook with an example.
- +20 min: Make a library and upload it to PyPI
- +20 min: Build a web app.
- +4 hours: Write a blog post.
- +2 hours: Create video with a demo.


pip install retinaface-pytorch

GitHub
PyPi
Collab

import numpy as np
import streamlit as st
from PIL import Image
from retinaface.pre_trained_models import get_model
from retinaface.utils import vis_annotations
import torch
st.set_option("deprecation.showfileUploaderEncoding", False)
@st.cache
def cached_model():
m = get_model("resnet50_2020-07-20", max_size=1024, device="cpu")
m.eval()
return m
model = cached_model()
st.title("Detect faces and key points")
uploaded_file = st.file_uploader("Choose an image...", type="jpg")
if uploaded_file is not None:
image = np.array(Image.open(uploaded_file))
st.image(image, caption="Before", use_column_width=True)
st.write("")
st.write("Detecting faces...")
with torch.no_grad():
annotations = model.predict_jsons(image)
if not annotations[0]["bbox"]:
st.write("No faces detected")
else:
visualized_image = vis_annotations(image, annotations)
st.image(visualized_image, caption="After", use_column_width=True)
Web app. 35 lines of code.
Mask classifier


Network
0.9999
0.0001
Task

Training mask classifier
-
Mask classification collab: https://colab.research.google.com/drive/1VkSK5MKIuGPIA31KJpGiFe_FafYC4xfD
-
Detection + classification collab: https://colab.research.google.com/drive/13Ktsrx164eQHfDmYLyMCoI-Kq0gC5Kg1
-
WebApp: https://facemaskd.herokuapp.com/
The same deliverables
Summary
There are small incremental steps that make your work:
- make your work better
- more visible
Will boost your ownership and comminication.
- Code to Github
- Add readme
- Clean code
- Make a demo notebook
- Build a library
- Build WebApp
- Give a talk
- Write a blogpost
Thank you!

Blog: http://ternaus.blog
Twitter: @viglovikov
Kaggle: https://www.kaggle.com/iglovikov
LinkedIn: https://www.linkedin.com/in/iglovikov/
Packaging your message
By Vladimir Iglovikov
Packaging your message
- 1,006