728x90

이미지 업로더를 구현하고 업로드된 이미지를 대상으로 사물 인식을 수행하는 웹 애플리케이션을 만들어 보겠습니다. 이 예제에서는 사용자가 이미지를 업로드하면, 그 이미지에서 사물을 인식하고 결과를 화면에 표시하는 기능을 제공합니다.

주요 기술 및 라이브러리

  • HTML5: 파일 입력을 통한 이미지 업로드
  • JavaScript: 이미지 처리 및 사물 인식
  • TensorFlow.js: 머신러닝 모델 사용
  • Coco-SSD 모델: 사물 인식 모델

구현 단계

  1. HTML: 이미지 업로더와 결과를 표시할 영역을 구성합니다.
  2. JavaScript: 사용자가 이미지를 업로드하면 해당 이미지에서 사물을 인식하여 결과를 출력합니다.
  3. TensorFlow.js와 Coco-SSD 모델을 사용하여 사물 인식을 수행합니다.

※ 소스

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Image Object Detection</title>
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs"></script>
    <style>
        body {
            font-family: Arial, sans-serif;
            display: flex;
            flex-direction: column;
            align-items: center;
            margin-top: 50px;
        }
        #canvas {
            border: 1px solid #ccc;
            margin-top: 20px;
        }
        .result {
            margin-top: 10px;
        }
    </style>
</head>
<body>
    <h1>Image Object Detection</h1>
    <input type="file" id="imageUpload" accept="image/*">
    <canvas id="canvas"></canvas>
    <div id="result" class="result"></div>

    <script>
        const imageUpload = document.getElementById('imageUpload');
        const canvas = document.getElementById('canvas');
        const context = canvas.getContext('2d');
        const result = document.getElementById('result');

        // 이미지가 업로드될 때 처리
        imageUpload.addEventListener('change', (event) => {
            const file = event.target.files[0];
            if (!file) {
                return;
            }

            const reader = new FileReader();

            reader.onload = function(e) {
                const img = new Image();
                img.src = e.target.result;

                img.onload = function() {
                    // 캔버스 크기를 이미지 크기에 맞춤
                    canvas.width = img.width;
                    canvas.height = img.height;

                    // 이미지 캔버스에 그림
                    context.drawImage(img, 0, 0, img.width, img.height);

                    // 모델 로드 및 객체 탐지
                    cocoSsd.load().then(model => {
                        model.detect(canvas).then(predictions => {
                            console.log(predictions);
                            drawPredictions(predictions);
                        });
                    });
                }
            };
           
            reader.readAsDataURL(file);
        });

        // 예측된 객체 그리기
        function drawPredictions(predictions) {
            predictions.forEach(prediction => {
                // 경계 상자 그리기
                context.beginPath();
                context.rect(...prediction.bbox);
                context.lineWidth = 2;
                context.strokeStyle = 'green';
                context.fillStyle = 'green';
                context.stroke();
               
                // 레이블과 확률 표시
                context.fillText(
                    `${prediction.class} (${Math.round(prediction.score * 100)}%)`,
                    prediction.bbox[0],
                    prediction.bbox[1] > 10 ? prediction.bbox[1] - 5 : 10
                );
            });

            // 예측 결과 표시
            result.innerHTML = predictions.map(p => `${p.class}: ${Math.round(p.score * 100)}%`).join('<br>');
        }
    </script>
</body>
</html>

 

※ 실행

728x90
반응형

+ Recent posts