index.html 9.13 KB
<!DOCTYPE html>
<html>

<head>
	<link rel="stylesheet" href="style.css">
	<meta charset="utf-8">
	<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
	<link rel="icon" href="/favicon.ico" type="image/x-icon">
	<title>겨울왕국 캐릭터 닮은꼴</title>
	<meta name="keywords" content="엘사, 안나, 크리스토프, 한스, 울라프, 스벤, 브루니">
	<link href="https://fonts.googleapis.com/css2?family=Jua&display=swap" rel="stylesheet">
	<script type="text/javascript" src="//s7.addthis.com/js/300/addthis_widget.js#pubid=ra-5e64b3727e862b06"></script>
</head>

<body>
	<script class="jsbin" src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
	<h1 contenteditable data-heading="Frozen">
		Frozen
	</h1>
	<div class="file-upload">
		<h2>
			나와 닮은 겨울왕국 캐릭터는?
		</h2>
		<div class="image-upload-wrap">
			<input class="file-upload-input" type='file' onchange="readURL(this);" accept="image/*" />
			<div class="drag-text">
				<h3>이곳에 얼굴 사진을 업로드 하세요!</h3>
				<img src="olaf.png" align="center">
			</div>
		</div>
		<div class="file-upload-content">
			<img class="file-upload-image" id="face-image" src="#" alt="your image" />
			<div id="loading" class="animated bounce">
				<div class="spinner-border" role="status">
					<span class="sr-only">Loading...</span>
				</div>
				<p class="text-center">AI가 당신과 닮은 캐릭터를 분석중입니다.</p>
			</div>
			<p class="result-message"></p>
			<div id="label-container" class="d-flex flex-column justify-content-around"></div>
			<div id="addThis" class="addthis_inline_share_toolbox_6lz1"></div>
			<div class="pt-3 image-title-wrap">
				<button type="button" onclick="removeUpload()" class="remove-image">Remove
					<span class="image-title">Uploaded Image</span>
				</button>
			</div>
		</div>
	</div>
	<div id="webcam-container"></div>
	<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@1.3.1/dist/tf.min.js"></script>
	<script src="https://cdn.jsdelivr.net/npm/@teachablemachine/image@0.8/dist/teachablemachine-image.min.js"></script>
	<footer class="footer pt-5 container d-flex justify-content-center">
	</footer>
	<svg class="svg-snowscene" xmlns="http://www.w3.org/2000/svg">
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
		<circle class="snow" />
	</svg>
	<script>
		function readURL(input) {
			if (input.files && input.files[0]) {
				var reader = new FileReader();
				reader.onload = function(e) {
					$('.image-upload-wrap').hide();
					$('.file-upload-image').attr('src', e.target.result);
					$('.file-upload-content').show();
					$('.image-title').html(input.files[0].name);
				};
				reader.readAsDataURL(input.files[0]);
				init().then(function() {
					predict();
					$('#loading').hide();
				});
			} else {
				removeUpload();
			}
		}

		function removeUpload() {
			$('.file-upload-input').replaceWith($('.file-upload-input').clone());
			$('.file-upload-content').hide();
			$('.image-upload-wrap').show();
		}
		$('.image-upload-wrap').bind('dragover', function() {
			$('.image-upload-wrap').addClass('image-dropping');
		});
		$('.image-upload-wrap').bind('dragleave', function() {
			$('.image-upload-wrap').removeClass('image-dropping');
		});
	</script>
	<script type="text/javascript">
		// More API functions here:
		// https://github.com/googlecreativelab/teachablemachine-community/tree/master/libraries/image
		// the link to your model provided by Teachable Machine export panel
		const URL = "https://teachablemachine.withgoogle.com/models/wXBDodJuF/";
		let model, webcam, labelContainer, maxPredictions;
		// Load the image model and setup the webcam
		async function init() {
			const modelURL = URL + "model.json";
			const metadataURL = URL + "metadata.json";
			model = await tmImage.load(modelURL, metadataURL);
			maxPredictions = model.getTotalClasses();
			labelContainer = document.getElementById("label-container");
			for (let i = 0; i < maxPredictions; i++) {
				var element = document.createElement("div")
				element.classList.add("d-flex");
				labelContainer.appendChild(element);
			}
		}
		// run the webcam image through the image model
		async function predict() {
			var image = document.getElementById("face-image")
			const prediction = await model.predict(image, false);
			prediction.sort((a, b) => parseFloat(b.probability) - parseFloat(a.probability));
			var resultMessage, resultExplain;
			switch (prediction[0].className) {
				case "엘사":
					resultMessage = "엘사"
					resultExplain = "당신은 얼음공주 엘사!"
					break;
				case "안나":
					resultMessage = "안나"
					resultExplain = "당신은 밝고 명랑한 안나!"
					break;
				case "크리스토프":
					resultMessage = "크리스토프"
					resultExplain = "당신은 코가 크고 듬직한 크리스토프!"
					break;
				case "한스":
					resultMessage = "한스"
					resultExplain = "당신은 잘생겼지만 찌질한 한스!"
					break;
				case "울라프":
					resultMessage = "울라프"
					resultExplain = "헐~ 당신은 눈사람?! 최강 귀요미 울라프!"
					break;
				case "스벤":
					resultMessage = "스벤"
					resultExplain = "헐~ 당신은 순록?! 크리스토프의 영원한 친구"
					break;
				case "브루니":
					resultMessage = "브루니"
					resultExplain = "헐~ 당신은 도마뱀?! 정말 귀여운 브루니!"
					break;
				case "트롤":
					resultMessage = "트롤"
					resultExplain = "헐~ 당신은 트롤?! 2등신 요정!"
					break;
				default:
					resultMessage = "알수없음"
					resultExplain = ""
			}
			var title = "<div class='" + prediction[0].className + "-frozen-title'>" + resultMessage + "</div>"
			var explain = "<div class='frozen-explain pt-2'>" + resultExplain + "</div>"
			$('.result-message').html(title + explain);
			var barWidth;
			for (let i = 0; i < maxPredictions; i++) {
				if (prediction[i].probability.toFixed(2) > 0.1) {
					barWidth = Math.round(prediction[i].probability.toFixed(2) * 100) + "%";
				} else if (prediction[i].probability.toFixed(2) >= 0.01) {
					barWidth = "4%"
				} else {
					barWidth = "2%"
				}
				var labelTitle;
				switch (prediction[i].className) {
					case "엘사":
						labelTitle = "엘사"
						break;
					case "안나":
						labelTitle = "안나"
						break;
					case "크리스토프":
						labelTitle = "크리스토프"
						break;
					case "한스":
						labelTitle = "한스"
						break;
					case "울라프":
						labelTitle = "울라프"
						break;
					case "스벤":
						labelTitle = "스벤"
						break;
					case "브루니":
						labelTitle = "브루니"
						break;
					case "트롤":
						labelTitle = "트롤"
						break;
					default:
						labelTitle = "알수없음"
				}
				var label = "<div class='frozen-label d-flex align-items-center'>" + labelTitle + "</div>"
				var bar = "<div class='bar-container position-relative container'><div class='" + prediction[i].className + "-box'></div><div class='d-flex justify-content-center align-items-center " + prediction[i].className + "-bar' style='width: " + barWidth + "'><span class='d-block percent-text'>" + Math.round(prediction[i].probability.toFixed(2) * 100) + "%</span></div></div>"
				labelContainer.childNodes[i].innerHTML = label + bar;
				console.log(prediction);
			}
		}
	</script>
	<script>
		function getRandom(min, max) {
			return Math.random() * (max - min) + min;
		}
		(function letItSnow() {
			var snowflakes = document.querySelectorAll('.snow');
			for (var i = 0; i < snowflakes.length; i++) {
				var snowflake = snowflakes[i];
				snowflake.setAttribute('cx', getRandom(1, 100) + '%');
				snowflake.setAttribute('cy', '-' + getRandom(1, 100));
				snowflake.setAttribute('r', getRandom(1, 3));
			}
		})();
	</script>
</body>

</html>