Skip to content

Commit 1cba5ad

Browse files
face landmark example
1 parent ec095c0 commit 1cba5ad

File tree

3 files changed

+73
-0
lines changed

3 files changed

+73
-0
lines changed

examples/public/commons.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@ async function initFaceRecognitionNet() {
2424
return faceapi.faceRecognitionNet(weights)
2525
}
2626

27+
async function initFaceLandmarkNet() {
28+
const res = await axios.get('face_landmark_68_model.weights', { responseType: 'arraybuffer' })
29+
const weights = new Float32Array(res.data)
30+
return faceapi.faceLandmarkNet(weights)
31+
}
32+
2733
// fetch first image of each class and compute their descriptors
2834
async function initTrainDescriptorsByClass(net, numImagesForTraining = 1) {
2935
const maxAvailableImagesPerClass = 5
@@ -82,6 +88,10 @@ function renderNavBar(navbarId, exampleUri) {
8288
uri: 'face_similarity',
8389
name: 'Face Similarity'
8490
},
91+
{
92+
uri: 'face_landmarks',
93+
name: 'Face Landmarks'
94+
},
8595
{
8696
uri: 'detect_and_draw_faces',
8797
name: 'Detect and Draw Faces'

examples/server.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ app.get('/face_detection', (req, res) => res.sendFile(path.join(viewsDir, 'faceD
1515
app.get('/face_detection_video', (req, res) => res.sendFile(path.join(viewsDir, 'faceDetectionVideo.html')))
1616
app.get('/face_recognition', (req, res) => res.sendFile(path.join(viewsDir, 'faceRecognition.html')))
1717
app.get('/face_similarity', (req, res) => res.sendFile(path.join(viewsDir, 'faceSimilarity.html')))
18+
app.get('/face_landmarks', (req, res) => res.sendFile(path.join(viewsDir, 'faceLandmarks.html')))
1819
app.get('/detect_and_draw_faces', (req, res) => res.sendFile(path.join(viewsDir, 'detectAndDrawFaces.html')))
1920
app.get('/detect_and_recognize_faces', (req, res) => res.sendFile(path.join(viewsDir, 'detectAndRecognizeFaces.html')))
2021

examples/views/faceLandmarks.html

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<script src="face-api.js"></script>
5+
<script src="axios.min.js"></script>
6+
<script src="commons.js"></script>
7+
<link rel="stylesheet" href="styles.css">
8+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.100.2/css/materialize.css">
9+
<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
10+
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.100.2/js/materialize.min.js"></script>
11+
</head>
12+
<body>
13+
<div class="center-content page-container">
14+
<div id="navbar"></div>
15+
16+
<div>
17+
<div class="progress" id="loader">
18+
<div class="indeterminate"></div>
19+
</div>
20+
<div class="row side-by-side">
21+
<div class="center-content">
22+
<div id="faceContainer"></div>
23+
<div id="selectList"></div>
24+
</div>
25+
</div>
26+
</div>
27+
</div>
28+
29+
<script>
30+
let net
31+
32+
async function onSelectionChanged(uri) {
33+
const imgBuf = await fetchImage(uri)
34+
const img = await faceapi.bufferToImage(imgBuf)
35+
const canvas = faceapi.createCanvasFromMedia(img)
36+
$('#faceContainer').empty()
37+
$('#faceContainer').append(canvas)
38+
39+
const landmarks = await net.detectLandmarks(canvas)
40+
faceapi.drawLandmarks(canvas, landmarks, { lineWidth: 4 })
41+
}
42+
43+
async function run() {
44+
net = await initFaceLandmarkNet()
45+
$('#loader').hide()
46+
await onSelectionChanged($('#selectList select').val())
47+
}
48+
49+
$(document).ready(function() {
50+
renderNavBar('#navbar', 'face_landmarks')
51+
renderFaceImageSelectList(
52+
'#selectList',
53+
onSelectionChanged,
54+
{ className: 'sheldon', imageIdx: 1 }
55+
)
56+
run()
57+
})
58+
59+
</script>
60+
61+
</body>
62+
</html>

0 commit comments

Comments
 (0)