Peen ๐ฅบ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ ๋น์ด ๋จน์ ์ฑ์ ๋ง๋ค์์ต๋๋ค.
๋น์ด ๋จน์ ์ฑ 2 Advent Calendar 2020 18์ผ์งธ ๊ฒ์๋ฌผ์ ๋๋ค.
๋ง๋ ๊ฒ
์ฌ์ง์ ์ฐํ์๋ ์ผ๊ตด์ด "ํผ์ ๐ฅบ"์ธ์ง ์ฌ๋ถ๋ฅผ ํ๋จํ๋ ๋น์ด ๋จน์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋๋ค.
๐ฅบ pi-checker
์ด๋ฏธ์ง๋ฅผ ์ ํํ๋ฉด ์ผ๊ตด์ ๊ฐ์งํ๊ณ ํ๊ธฐ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
ํผ์ ์ค์ฝ์ด๊ฐ 90์ ๋์ผ๋ฉด ใํ์จ๐ใ๊ฐ ๋ฉ๋๋ค.
ํ์ ์ ๊ฝค ๊ฐ๋ฐ๊ฐ๋ฐ์ ๋๋ค.
๊ฒฝ์
์ฌํด๋ ์๋ ์ ์ด์ด, face-api.js๋ผ๋ tensorflow.js๋ฅผ ์ด์ฉํ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ๋ ค๊ณ ํ๋ ๊ฒ์ผ๋ก ํ์คํ ์๊ฐํด ์จ ๊ฒ์ด ์ด ๋น์ด ๋จน์ ์ฑ์ ๋๋ค.
๋๋ 5 ์ด ๋ง์ ์๊ฐํ๋ค.
์ด ์ ๋์ ์๋๊ฐ์ด ๋น์ด ๋จน์ ์ฑ ๊ฐ๋ฐ์๋ ํ์ํ๋ค์(์์๊ป๋ผ)
์ฒ์์๋ ํ๊ธฐ HTML์์ ์์ค ์ฝ๋๋ฅผ ์จ์ ์น ์ฌ์ดํธ๋ฅผ ๋ง๋ค ์์๋ ๋น์ด ๋จน์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ง๋ค๊ณ ์์์ต๋๋ค ๋ง, ๋๋ฌด ์ฌ๊ฐํ์ง ๋ง๋ผ ~๋ผ๊ณ ์๊ฐ ์ ํฅํ์ต๋๋ค.
ํ๊ธฐ ํ ์คํธ์์ ์์ค ์ฝ๋๋ฅผ ์์ฑํ๋ ๋น์ด ๋จน์ ์์ฉ ํ๋ก๊ทธ๋จ ๋ง๋ค๊ธฐ ํผ c. ๋ผ๊ณ r. ์ฝ m / c2 ์ฃ svCxH โ ์ฟ ๋ก๊ฐ๋ฏธ/makery, inc CEO (@kokushing) December 1, 2020
<script async=""src="https://platform.twitter.com/widgets.js"/>tensorflow๋ฅผ ์ฌ์ฉํ์ฌ ํผ์ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ ๋น์ด ๋จน์ ์ฑ ๋ง๋ค๊ธฐ. ํผ c. ๋ผ๊ณ r. ์ด m/f ์ผ์ธ 1pyRW
๋์ค์ ์ฌ๋ด์ ๋๋ค๋ง, December 5, 2020 ์ ๋์์ ใํผ์ใ๋ต์ต๋๋ค. ๋ณด๊ณ ์ถ๋ค.
๊ตฌํ
React.js, TypeScript, face-api.js, react-dropzone, styled-components์์ ๊ตฌํํ์ต๋๋ค.
์ด๋ฏธ์ง ๋ค์ด๋ก๋์๋ html2canvas๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ๊ณ ์์ต๋๋ค.
์ธํ๋ผ๋ Netlify ์ ๋ฐฐ. Vercel ์ ๋ฐฐ๋ ์ ๊ฒฝ์ด ์ฐ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฒ์ ์๋ํฉ๋๋ค.
์ด ๋น์ด ๋จน์ ์ฑ์ ์๋ ๋ฐฉ์์ ๊ฐ๋จํ๋ฉฐ react-dropzone์์ ๋ฐ์ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ face-api.js๋ก ๋ถ์ํ์ฌ ์ผ๊ตด ํ์ ์ ์ซ์๋ก ๊ฐ์ ธ์ต๋๋ค.
๋ค์์ ์์น์ ์ํด ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๊ฟ ๋ฟ. ๊ฐ๋จํ๋ค์.
์ฌํ ์ผ๊ตด ์์น๋ฅผ ์ป์ผ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฐ๋ฉด ์ป์ ์ ์์ต๋๋ค.
(async () => {
const inputEl = document.getElementById("input") as HTMLImageElement;
const MODEL_URL = `${process.env.PUBLIC_URL}/models`;
await faceapi.nets.tinyFaceDetector.load(MODEL_URL);
await faceapi.nets.faceExpressionNet.load(MODEL_URL);
const detectionsWithExpressions = await faceapi
.detectAllFaces(inputEl, new faceapi.TinyFaceDetectorOptions())
.withFaceExpressions();
const score =
detectionsWithExpressions.length > 0
? detectionsWithExpressions[0].expressions.sad
: -1;
console.log(score); // ๆฒใใฟใฎๆฐๅคใๅๅพ
})();
ํ๊ธฐ
์ง์ง๋ OGํ์์ด๋ผ๋ ์ง SSRํด์ Twitter๋ก ์์ดํ ์ ์๋๋ก(๋ฏ์ด) ํ๊ณ ์ถ์์ต๋๋ค๋ง, ์๊ฐ์ ์ฌ์ ์ผ๋ก ๋จ๋ ํ์ต๋๋ค.
ํผ์ ๐ฅบ
Photo by
์ผ์ฑ๋น ์ฌ์ ์ ์ง๋ ์ฌ๋์ด ์ ํํ๋ ใ์ฌํด์ ์ ์ด 2020ใ
ํ์ฟ ํ์
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(Peen ๐ฅบ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ ๋น์ด ๋จน์ ์ฑ์ ๋ง๋ค์์ต๋๋ค.), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://qiita.com/kokushin/items/d413464b1d98162d07adํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค