Notice
Recent Posts
Recent Comments
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

SYDev

KHUDA 4th 심화 트랙 프로젝트 - 교내 거리뷰 이미지 기반 위치 예측 모델 (+ 쿠다 4기 수료) 본문

KHUDA 4th/심화트랙 PROJECT

KHUDA 4th 심화 트랙 프로젝트 - 교내 거리뷰 이미지 기반 위치 예측 모델 (+ 쿠다 4기 수료)

시데브 2023. 12. 10. 19:38
쿠다 4기 활동을 마무리하면서 진행한 마지막 프로젝트&컨퍼런스 summary

 

프로젝트 github 주소: https://github.com/cho-jang-hyun/Prediction_of_Location_based_RoadView

 

인풋으로 천문대 사진이 들어가면, 정상적으로 학습한 이미지 중 가장 유사도가 높은 이미지와 해당 위치를 출력한다.

 

나무에 가려졌음에도 불구하고, 예디대 인식도 성공!

 

api를 이용하기에 가장 좋은 것은 구글맵과 네이버 둘이었는데, 구글맵은 학교 내부를 촬영하지 않았고 너무 옛날에 업데이트되었다는 문제점이 있어 네이버 로드뷰를 채택했다.

 

한 지점의 파노라마를 불러와서 학습하는 방법도 있었지만, 파노라마 특성상 이미지 왜곡이 발생하고 input 이미지와의 매칭도 되지 않아 스크린샷을 촬영하는 방법을 채택했다.

 

 

주도적으로 참여한 파트

 

 네이버맵 api를 받아와서 학교 내부의 중복되지 않는 좌표(대략 900개)에서 각도를 달리하여 18장의 스크린샷을 캡쳐하는 매크로 코드 작성 (+ 아이디어 제공) 

 

 파일명: capture.js

const puppeteer = require('puppeteer');
const fs = require('fs');

async function capturePanorama(lat, lng, pan) {
    // Puppeteer 브라우저 실행
    const browser = await puppeteer.launch();
    const page = await browser.newPage();

    // HTML 파일 경로 설정 (실제 파일 경로로 변경 필요)
    const filePath = 'file:///C:/Users/pc/Desktop/CE/KHUDA/KHUDA_4th_Project/pano.html';
    await page.goto(filePath);

    // createPanorama 함수 실행 (지정된 좌표 및 pan 값 사용)
    await page.evaluate((lat, lng, pan) => {
        window.createPanorama(lat, lng, pan);
    }, lat, lng, pan);

    // 파노라마 로딩을 위한 대기 (대기 시간 조절 필요)
    await page.waitForTimeout(400);

    // 스크린샷 캡처
    const screenshot = await page.screenshot();

    console.log(`Captured: lat ${lat}, lng ${lng}, pan ${pan}`);

    // 스크린샷을 파일로 저장
    const filename = `screenshot_lat_${lat}_lng_${lng}_pan_${pan}.png`;
    require('fs').writeFileSync(filename, screenshot);

    console.log(`Captured: ${filename}`);

    // 브라우저 닫기
    await browser.close();
}

const panValues = [-160, -140, -120, -100, -80, -60, -40, -20, 0, 20, 40, 60, 80, 100, 120, 140, 160, 180];

// 파일 경로
const filePath = 'C:/Users/pc/Desktop/CE/KHUDA/KHUDA_4th_Project/pure_lat_lng.txt'; // 실제 파일 경로로 변경해야 합니다.

// 파일에서 좌표 읽기
fs.readFile(filePath, 'utf8', async (err, data) => {
    if (err) {
        console.error('파일을 읽는 도중 오류가 발생했습니다.', err);
        return;
    }

    const lines = data.split('\\n');
    for (const line of lines) {
        const [lat, lng] = line.split(' '); // 공백을 기준으로 위도와 경도 분리

        // 위도와 경도를 parseFloat()를 통해 숫자로 변환하여 capturePanorama 함수 호출
        for(const pan of panValues) {
            await capturePanorama(parseFloat(lat), parseFloat(lng), pan); // 여기서 0은 pan 값입니다. 필요에 따라 변경 가능합니다.
        }

    }
});

 

 파일명: pano.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Naver Maps Panorama Example</title>
    <script type="text/javascript" src="https://oapi.map.naver.com/openapi/v3/maps.js?ncpClientId=h236y0zsuk&submodules=panorama"></script> 
</head>

<body>
    <div id="pano" style="width:100%;height:600px;"></div>
    <script>
        var lists = [];

        function createPanorama(lat, lng, Pan) {
            let pano = new naver.maps.Panorama(document.getElementById("pano"), {
                position: new naver.maps.LatLng(lat, lng),
                pov: {
                    pan: Pan, 
                    tilt: 15, 
                    fov: 100
                },
                flightSpot: false,
                logoControl: false
            })
            });
        }
    </script>
</body>

</html>

 

>> 대략 16000장의 이미지 데이터셋 확보

발표자가 늦게 도착해서, 내가 즉석으로 발표할 뻔했다

 

KHUDA 4th 수료 완료!

 

 사회에 나와서 시작한 첫 번째 활동인 KHUDA, 군대 전역하기 직전부터 시작해서 이번 활동을 마지막으로 마무리하게 됐다. 막 전역하고 사회성이 부족했던 내가 다시 사람들과 연결되는 좋은 계기였고, 실제로 다양한 사람들을 만나면서 인간적으로도 학술적으로도 많이 배우고 성장할 수 있었던 것 같다.
 특히 마지막에 진행했던 프로젝트는 처음으로 주도적으로 전과정에 참여할 수 있어 이전에는 느껴보지 못한 팀 프로젝트의 재미를 느낄 수 있었다. 또한, 하나의 프로그램을 구현하고 배포하는 과정에서 많은 고민과 어려움이 있음을 깨닫게 되었다. 다음에도 좋은 프로젝트 진행할 기회가 있기를 바라면서 글은 여기까지!