Skip to content

Commit d157cd3

Browse files
committedJul 19, 2020
Add joker face
1 parent d45e27e commit d157cd3

18 files changed

+12812
-0
lines changed
 

‎joker-face/.gitignore

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# Logs
2+
logs
3+
*.log
4+
npm-debug.log*
5+
yarn-debug.log*
6+
yarn-error.log*
7+
8+
# Runtime data
9+
pids
10+
*.pid
11+
*.seed
12+
*.pid.lock
13+
14+
# Directory for instrumented libs generated by jscoverage/JSCover
15+
lib-cov
16+
17+
# Coverage directory used by tools like istanbul
18+
coverage
19+
20+
# nyc test coverage
21+
.nyc_output
22+
23+
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
24+
.grunt
25+
26+
# Bower dependency directory (https://bower.io/)
27+
bower_components
28+
29+
# node-waf configuration
30+
.lock-wscript
31+
32+
# Compiled binary addons (http://nodejs.org/api/addons.html)
33+
build/Release
34+
35+
# Dependency directories
36+
node_modules/
37+
jspm_packages/
38+
39+
# Typescript v1 declaration files
40+
typings/
41+
42+
# Optional npm cache directory
43+
.npm
44+
45+
# Optional eslint cache
46+
.eslintcache
47+
48+
# Optional REPL history
49+
.node_repl_history
50+
51+
# Output of 'npm pack'
52+
*.tgz
53+
54+
# dotenv environment variable files
55+
.env*
56+
57+
# gatsby files
58+
.cache/
59+
public
60+
61+
# Mac files
62+
.DS_Store
63+
64+
# Yarn
65+
yarn-error.log
66+
.pnp/
67+
.pnp.js
68+
# Yarn Integrity file
69+
.yarn-integrity

‎joker-face/.prettierignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
.cache
2+
package.json
3+
package-lock.json
4+
public

‎joker-face/.prettierrc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"arrowParens": "avoid",
3+
"semi": false
4+
}

‎joker-face/LICENSE

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
The BSD Zero Clause License (0BSD)
2+
3+
Copyright (c) 2020 Gatsby Inc.
4+
5+
Permission to use, copy, modify, and/or distribute this software for any
6+
purpose with or without fee is hereby granted.
7+
8+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
9+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
11+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
13+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14+
PERFORMANCE OF THIS SOFTWARE.

‎joker-face/README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# Jokey your face
2+
3+
Using [face-api.js](https://github.com/justadudewhohacks/face-api.js) to add a mask on your face
4+
5+
## Result
6+
7+
![](./static/images/result.gif)

‎joker-face/gatsby-config.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/**
2+
* Configure your Gatsby site with this file.
3+
*
4+
* See: https://www.gatsbyjs.org/docs/gatsby-config/
5+
*/
6+
7+
module.exports = {
8+
/* Your site config here */
9+
plugins: [
10+
{
11+
resolve: "gatsby-plugin-emoji-favicon",
12+
options: {
13+
emoji: "🤡",
14+
},
15+
},
16+
],
17+
}

‎joker-face/package.json

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
{
2+
"name": "gatsby-starter-hello-world",
3+
"private": true,
4+
"description": "A simplified bare-bones starter for Gatsby",
5+
"version": "0.1.0",
6+
"license": "0BSD",
7+
"scripts": {
8+
"build": "gatsby build",
9+
"develop": "gatsby develop",
10+
"format": "prettier --write \"**/*.{js,jsx,ts,tsx,json,md}\"",
11+
"start": "npm run develop",
12+
"serve": "gatsby serve",
13+
"clean": "gatsby clean",
14+
"test": "echo \"Write tests! -> https://gatsby.dev/unit-testing\" && exit 1"
15+
},
16+
"dependencies": {
17+
"face-api.js": "^0.22.2",
18+
"gatsby": "^2.23.12",
19+
"gatsby-plugin-emoji-favicon": "^1.5.0",
20+
"react": "^16.12.0",
21+
"react-dom": "^16.12.0"
22+
},
23+
"devDependencies": {
24+
"prettier": "2.0.5"
25+
},
26+
"repository": {
27+
"type": "git",
28+
"url": "https://github.com/gatsbyjs/gatsby-starter-hello-world"
29+
},
30+
"bugs": {
31+
"url": "https://github.com/gatsbyjs/gatsby/issues"
32+
}
33+
}

‎joker-face/src/pages/index.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import React, { useEffect } from "react"
2+
import { jokerface } from "../utils/jokerface"
3+
import "./styles.css"
4+
5+
export default function Home() {
6+
useEffect(() => {
7+
jokerface()
8+
}, [])
9+
10+
return (
11+
<div className="layout">
12+
<header>
13+
<h1>Joker your face with Machine Learning</h1>
14+
<p>
15+
This demo uses{" "}
16+
<a href="https://github.com/justadudewhohacks/face-api.js">
17+
face-api.js
18+
</a>{" "}
19+
to find faces, then we do some math to determine face size and nose
20+
detection so we can put a joker face!
21+
</p>
22+
</header>
23+
<main>
24+
<p>
25+
<code className="status">Detecting…</code>
26+
</p>
27+
<div className="container-image">
28+
<img
29+
className="mask-image"
30+
src="images/mark-hamill-joker-face-mask.png"
31+
alt=""
32+
/>
33+
<img
34+
className="target-image"
35+
crossOrigin="anonymous"
36+
src="images/IMG_0640.jpg"
37+
alt=""
38+
/>
39+
</div>
40+
</main>
41+
<footer></footer>
42+
</div>
43+
)
44+
}

‎joker-face/src/pages/styles.css

Lines changed: 281 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,281 @@
1+
.mask-image {
2+
display: none;
3+
z-index: 100;
4+
transform: translateX(-50%);
5+
}
6+
7+
.container-image {
8+
position: relative;
9+
}
10+
11+
.layout {
12+
padding: 20px;
13+
max-width: 1024px;
14+
margin: 0 auto;
15+
}
16+
17+
/*
18+
Document
19+
========
20+
*/
21+
22+
/**
23+
Use a better box model (opinionated).
24+
*/
25+
26+
*,
27+
*::before,
28+
*::after {
29+
box-sizing: border-box;
30+
}
31+
32+
/**
33+
Use a more readable tab size (opinionated).
34+
*/
35+
36+
:root {
37+
-moz-tab-size: 4;
38+
tab-size: 4;
39+
}
40+
41+
/**
42+
1. Correct the line height in all browsers.
43+
2. Prevent adjustments of font size after orientation changes in iOS.
44+
*/
45+
46+
html {
47+
line-height: 1.15; /* 1 */
48+
-webkit-text-size-adjust: 100%; /* 2 */
49+
}
50+
51+
/*
52+
Sections
53+
========
54+
*/
55+
56+
/**
57+
Remove the margin in all browsers.
58+
*/
59+
60+
body {
61+
margin: 0;
62+
}
63+
64+
/**
65+
Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)
66+
*/
67+
68+
body {
69+
font-family: system-ui, -apple-system,
70+
/* Firefox supports this but not yet `system-ui` */ "Segoe UI", Roboto,
71+
Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
72+
}
73+
74+
/*
75+
Grouping content
76+
================
77+
*/
78+
79+
/**
80+
Add the correct height in Firefox.
81+
*/
82+
83+
hr {
84+
height: 0;
85+
}
86+
87+
/*
88+
Text-level semantics
89+
====================
90+
*/
91+
92+
/**
93+
Add the correct text decoration in Chrome, Edge, and Safari.
94+
*/
95+
96+
abbr[title] {
97+
text-decoration: underline dotted;
98+
}
99+
100+
/**
101+
Add the correct font weight in Edge and Safari.
102+
*/
103+
104+
b,
105+
strong {
106+
font-weight: bolder;
107+
}
108+
109+
/**
110+
1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)
111+
2. Correct the odd 'em' font sizing in all browsers.
112+
*/
113+
114+
code,
115+
kbd,
116+
samp,
117+
pre {
118+
font-family: ui-monospace, SFMono-Regular, Consolas, "Liberation Mono", Menlo,
119+
monospace; /* 1 */
120+
font-size: 1em; /* 2 */
121+
}
122+
123+
/**
124+
Add the correct font size in all browsers.
125+
*/
126+
127+
small {
128+
font-size: 80%;
129+
}
130+
131+
/**
132+
Prevent 'sub' and 'sup' elements from affecting the line height in all browsers.
133+
*/
134+
135+
sub,
136+
sup {
137+
font-size: 75%;
138+
line-height: 0;
139+
position: relative;
140+
vertical-align: baseline;
141+
}
142+
143+
sub {
144+
bottom: -0.25em;
145+
}
146+
147+
sup {
148+
top: -0.5em;
149+
}
150+
151+
/*
152+
Forms
153+
=====
154+
*/
155+
156+
/**
157+
1. Change the font styles in all browsers.
158+
2. Remove the margin in Firefox and Safari.
159+
*/
160+
161+
button,
162+
input,
163+
optgroup,
164+
select,
165+
textarea {
166+
font-family: inherit; /* 1 */
167+
font-size: 100%; /* 1 */
168+
line-height: 1.15; /* 1 */
169+
margin: 0; /* 2 */
170+
}
171+
172+
/**
173+
Remove the inheritance of text transform in Edge and Firefox.
174+
1. Remove the inheritance of text transform in Firefox.
175+
*/
176+
177+
button,
178+
select {
179+
/* 1 */
180+
text-transform: none;
181+
}
182+
183+
/**
184+
Correct the inability to style clickable types in iOS and Safari.
185+
*/
186+
187+
button,
188+
[type="button"],
189+
[type="reset"],
190+
[type="submit"] {
191+
-webkit-appearance: button;
192+
}
193+
194+
/**
195+
Remove the inner border and padding in Firefox.
196+
*/
197+
198+
button::-moz-focus-inner,
199+
[type="button"]::-moz-focus-inner,
200+
[type="reset"]::-moz-focus-inner,
201+
[type="submit"]::-moz-focus-inner {
202+
border-style: none;
203+
padding: 0;
204+
}
205+
206+
/**
207+
Restore the focus styles unset by the previous rule.
208+
*/
209+
210+
button:-moz-focusring,
211+
[type="button"]:-moz-focusring,
212+
[type="reset"]:-moz-focusring,
213+
[type="submit"]:-moz-focusring {
214+
outline: 1px dotted ButtonText;
215+
}
216+
217+
/**
218+
Remove the padding so developers are not caught out when they zero out 'fieldset' elements in all browsers.
219+
*/
220+
221+
legend {
222+
padding: 0;
223+
}
224+
225+
/**
226+
Add the correct vertical alignment in Chrome and Firefox.
227+
*/
228+
229+
progress {
230+
vertical-align: baseline;
231+
}
232+
233+
/**
234+
Correct the cursor style of increment and decrement buttons in Safari.
235+
*/
236+
237+
[type="number"]::-webkit-inner-spin-button,
238+
[type="number"]::-webkit-outer-spin-button {
239+
height: auto;
240+
}
241+
242+
/**
243+
1. Correct the odd appearance in Chrome and Safari.
244+
2. Correct the outline style in Safari.
245+
*/
246+
247+
[type="search"] {
248+
-webkit-appearance: textfield; /* 1 */
249+
outline-offset: -2px; /* 2 */
250+
}
251+
252+
/**
253+
Remove the inner padding in Chrome and Safari on macOS.
254+
*/
255+
256+
[type="search"]::-webkit-search-decoration {
257+
-webkit-appearance: none;
258+
}
259+
260+
/**
261+
1. Correct the inability to style clickable types in iOS and Safari.
262+
2. Change font properties to 'inherit' in Safari.
263+
*/
264+
265+
::-webkit-file-upload-button {
266+
-webkit-appearance: button; /* 1 */
267+
font: inherit; /* 2 */
268+
}
269+
270+
/*
271+
Interactive
272+
===========
273+
*/
274+
275+
/*
276+
Add the correct display in Chrome and Safari.
277+
*/
278+
279+
summary {
280+
display: list-item;
281+
}

‎joker-face/src/utils/jokerface.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import * as faceapi from "face-api.js"
2+
3+
export async function jokerface() {
4+
const targetImage = document.querySelector(".target-image")
5+
const maskImage = document.querySelector(".mask-image")
6+
const status = document.querySelector(".status")
7+
8+
await Promise.all([
9+
faceapi.nets.tinyFaceDetector.loadFromUri("/models"),
10+
faceapi.nets.faceLandmark68TinyNet.loadFromUri("/models"),
11+
]).catch(error => {
12+
console.error(error)
13+
})
14+
status.innerHTML = "Models loaded…"
15+
16+
const detection = await faceapi
17+
.detectSingleFace(targetImage, new faceapi.TinyFaceDetectorOptions())
18+
.withFaceLandmarks(true)
19+
20+
if (!detection) {
21+
status.innerHTML = "No face on the picture, use another one"
22+
return
23+
}
24+
25+
const headWidth = detection.detection.box._width
26+
const nose = detection.landmarks.getNose()
27+
28+
maskImage.style.cssText = `
29+
display: block;
30+
position: absolute;
31+
top: ${nose[1]._y}px;
32+
left: ${nose[1]._x}px;
33+
width: ${headWidth}px;
34+
`
35+
36+
status.innerHTML = "Face detected!"
37+
}

‎joker-face/static/images/IMG_0640.jpg

48.6 KB
Loading
Loading

‎joker-face/static/images/result.gif

428 KB
Loading
Binary file not shown.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[{"weights":[{"name":"dense0/conv0/filters","shape":[3,3,3,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.008194216092427571,"min":-0.9423348506291708}},{"name":"dense0/conv0/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006839508168837603,"min":-0.8412595047670252}},{"name":"dense0/conv1/depthwise_filter","shape":[3,3,32,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.009194007106855804,"min":-1.2779669878529567}},{"name":"dense0/conv1/pointwise_filter","shape":[1,1,32,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0036026100317637128,"min":-0.3170296827952067}},{"name":"dense0/conv1/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.000740380117706224,"min":-0.06367269012273527}},{"name":"dense0/conv2/depthwise_filter","shape":[3,3,32,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":1,"min":0}},{"name":"dense0/conv2/pointwise_filter","shape":[1,1,32,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":1,"min":0}},{"name":"dense0/conv2/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0037702228508743585,"min":-0.6220867703942692}},{"name":"dense1/conv0/depthwise_filter","shape":[3,3,32,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0033707996209462483,"min":-0.421349952618281}},{"name":"dense1/conv0/pointwise_filter","shape":[1,1,32,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.014611541991140328,"min":-1.8556658328748217}},{"name":"dense1/conv0/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.002832523046755323,"min":-0.30307996600281956}},{"name":"dense1/conv1/depthwise_filter","shape":[3,3,64,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006593170586754294,"min":-0.6329443763284123}},{"name":"dense1/conv1/pointwise_filter","shape":[1,1,64,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.012215249211180444,"min":-1.6001976466646382}},{"name":"dense1/conv1/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.002384825547536214,"min":-0.3028728445370992}},{"name":"dense1/conv2/depthwise_filter","shape":[3,3,64,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.005859645441466687,"min":-0.7617539073906693}},{"name":"dense1/conv2/pointwise_filter","shape":[1,1,64,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.013121426806730382,"min":-1.7845140457153321}},{"name":"dense1/conv2/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0032247188044529336,"min":-0.46435950784122243}},{"name":"dense2/conv0/depthwise_filter","shape":[3,3,64,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.002659512618008782,"min":-0.32977956463308894}},{"name":"dense2/conv0/pointwise_filter","shape":[1,1,64,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.015499923743453681,"min":-1.9839902391620712}},{"name":"dense2/conv0/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0032450980999890497,"min":-0.522460794098237}},{"name":"dense2/conv1/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.005911862382701799,"min":-0.792189559282041}},{"name":"dense2/conv1/pointwise_filter","shape":[1,1,128,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.021025861478319356,"min":-2.2077154552235325}},{"name":"dense2/conv1/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00349616945958605,"min":-0.46149436866535865}},{"name":"dense2/conv2/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.008104994250278847,"min":-1.013124281284856}},{"name":"dense2/conv2/pointwise_filter","shape":[1,1,128,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.029337059282789044,"min":-3.5791212325002633}},{"name":"dense2/conv2/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0038808938334969913,"min":-0.4230174278511721}},{"name":"fc/weights","shape":[128,136],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.014016061670639936,"min":-1.8921683255363912}},{"name":"fc/bias","shape":[136],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0029505149698724935,"min":0.088760145008564}}],"paths":["face_landmark_68_tiny_model-shard1"]}]
Binary file not shown.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[{"weights":[{"name":"conv0/filters","shape":[3,3,3,16],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.009007044399485869,"min":-1.2069439495311063}},{"name":"conv0/bias","shape":[16],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.005263455241334205,"min":-0.9211046672334858}},{"name":"conv1/depthwise_filter","shape":[3,3,16,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.004001977630690033,"min":-0.5042491814669441}},{"name":"conv1/pointwise_filter","shape":[1,1,16,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.013836609615999109,"min":-1.411334180831909}},{"name":"conv1/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0015159862590771096,"min":-0.30926119685173037}},{"name":"conv2/depthwise_filter","shape":[3,3,32,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.002666276225856706,"min":-0.317286870876948}},{"name":"conv2/pointwise_filter","shape":[1,1,32,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.015265831292844286,"min":-1.6792414422128714}},{"name":"conv2/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0020280554598453,"min":-0.37113414915168985}},{"name":"conv3/depthwise_filter","shape":[3,3,64,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006100742489683862,"min":-0.8907084034938438}},{"name":"conv3/pointwise_filter","shape":[1,1,64,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.016276211832083907,"min":-2.0508026908425725}},{"name":"conv3/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.003394414279975143,"min":-0.7637432129944072}},{"name":"conv4/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006716050119961009,"min":-0.8059260143953211}},{"name":"conv4/pointwise_filter","shape":[1,1,128,256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.021875603993733724,"min":-2.8875797271728514}},{"name":"conv4/bias","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0041141652009066415,"min":-0.8187188749804216}},{"name":"conv5/depthwise_filter","shape":[3,3,256,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.008423839597141042,"min":-0.9013508368940915}},{"name":"conv5/pointwise_filter","shape":[1,1,256,512],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.030007277283014035,"min":-3.8709387695088107}},{"name":"conv5/bias","shape":[512],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.008402082966823203,"min":-1.4871686851277068}},{"name":"conv8/filters","shape":[1,1,512,25],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.028336129469030042,"min":-4.675461362389957}},{"name":"conv8/bias","shape":[25],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.002268134028303857,"min":-0.41053225912299807}}],"paths":["tiny_face_detector_model-shard1"]}]

‎joker-face/yarn.lock

Lines changed: 12300 additions & 0 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)
Please sign in to comment.