안녕하십니까. 카카오 AI 루키 캠프에 지원하게 된 김지완입니다. 저는 지원서에도 작성했듯이 문제를 발견하면 독창적으로 해결하고, 협업 속에서 함께 성장하는 학생 개발자입니다.

지금부터 제가 진행한 프로젝트를 중심으로 제 경험을 소개하겠습니다.

 

 

1. 연령과 신체 조건에 맞게 변하는 키오스크

중학교 1학년(2023년) 때 3명의 팀원들과 진행한 프로젝트입니다. 아두이노, 웹, 파이썬을 사용하여 진행하였습니다. 이 프로젝트로 과학기술정보통신부에서 주최하는 한국코드페어 SW 공모전 본선에 진출했습니다. 저는 이 프로젝트에서 키오스크 UI 일부와 아두이노와 전동 모니터 리프트를 사용하여 사용자의 신체에 맞게 화면 높낮이를 조절하는 기능을 개발했습니다. 

 

'''

작품 주제: 키오스크가 많이 보급되어 사용되고 있으나 키오스크를 불편하게 느끼는 사람들이 많다. 디지털 기기를 다루기 어려운 노년층 소비자, 눈이나 다리가 불편한 장애인 등이다. 편리성과 비용감축을 목적으로 여러 산업에서 키오스크를 도입하는 곳이 더욱 늘어날 만큼 디지털 기술에 소외되는 계층 또한 늘어날 수밖에 없다. 우리 팀은 이와 같은 문제를 AI 기술을 이용하여 장애인이나 노년층 소비자들 또한 디지털 혜택을 누릴 수 있도록 ‘베리어프리’를 가능하게 하는 스마트 키오스크 시스템을 구현하고자 한다. 

 

작품의 설명(제안하는 해법, 이에 대한 근거) : AI 이미지 인식 기술을 사용하여 카메라를 통해 소비자의 연령대와 겉모습을 분석하여 고령자라고 인식을 하면 자동으로 UI(User Interface)를 바꿀 수 있도록 한다. 또한 전동 모니터 리프트를 사용하여 소비자의 신체에 맞게끔 화면 높낮이를 조절할 수 있도록 하여, 키오스크를 사용하기 위한 최초 조작 시간을 줄이고자 한다.

 

기존의 작품(해법)과의 차이점 : 이미 관공서나 지하철에서는 베리어프리 키오스크를 제공하고 있으나 여전히 카페, 식당 등과 같은 곳에서는 사용되고 있지 않다. 또한 사용되고 있는 키오스크 제품과 UI가 모두 달라 이용할 때마다 사용의 어려움을 겪을 수 있다. 그러나 우리 팀은 사용자 겉모습을 인식하여 사용자마다 통일된 UI와 기능을 제공하고자 한다.

 

결과: 키오스크에 가까이 다가가기만 하면 자동으로 가장 알맞은 사용 환경을 제공할 수 있도록 하여 디지털 취약 계층이 키오스크의 조작의 어려움을 최소화하고 접근성을 높임으로써 누구든지 디지털 기술의 혜택을 누릴 수 있는 사회를 만들어 나갈 수 있을 것이다.

'''

키오스크 회로도
모니터를 설치하기 전의 모습

2.  지도학습 기술을 활용한 심혈관질환 위험도 관리 앱

중학교 2학년(2024) 때 3명의 팀원들과 진행한 프로젝트입니다. 안드로이드 앱, 파이썬, Light GBM 알고리즘을 사용하여 진행하였습니다.  이 프로젝트로과학기술정보통신부에서 주최하는 한국코드페어 해커톤 본선에 진출했습니다. 저는 이 프로젝트에서 머신러닝과 백엔드 부분을 맡았습니다. 이 프로젝트를 진행하며 저는 고령화 사회에 벌어질 문제들을 AI와 코딩을 사용해 해결할 수 있다는 것을 느꼈습니다. 

 

'''

1. 작품 주제

  아이디어명 : 인공지능기술을 활용한 노인 심혈관질환 위험도 관리 도우미

  노령화에 따른 심혈관질환 문제 해결 : 사망률 2위 질환, 노령인구의 증가 문제

  작품의 설명(제안하는 해법, 이에 대한 근거)

 

핵심 기능1. 건강/생활습관에 따른 심혈관질환 위험확률 분석+개선방법 제시

핵심 기능 2. 안드로이드 앱을 이용한 심혈관질환 관리 모니터링]

 

기존의 작품(해법)과의 차이점

- 인공지능 학습을 위해 공신력 있는 데이터 셋 사용 : 세계보건기구(WHO)에서 발표한 BRFSS(Behavioral Risk Factor         Surveillance System)를 학습시켜 예측(35만 명의(35 데이터)

- 개선방법 제시 :  18가지의 정보 중에 위험확률을 현격히 줄일 수 있는 방법을 제시

(예시. 과일 섭취 정도를 18% 늘릴 경우 심혈관질환 확률 10% 감소)

- 차별성차별성 2. 의료데이터를 분석한 다양한 인공지능 모델 분석·비교

- 차별성차별성 1. 단순센서값이 아닌 생활습관을 통한 위험확률분석

 

결과

우리나라는 65세 이상의 총인구수가 많이 증가하면서 고령화 사회에 접어들었다. 세계보건기구 (WHO)의 통계에 따르면 심혈관계 질환은 세계적인 사망률 29.2% 1위를 차지할 정도의 주요 질환으로 의학적으로나 사회경제학적으로 더욱더 큰 비중을 차지해가고 있다.

노화가 일어나면서 심장은 약간 확장되며 심벽은 두꺼워지며, 심방과 심실도 약간 커진다. 크기가 증가하는 것은 개별 심장의 근육 세포의 크기가 커지기 때문에 심혈관질환 문제가 발생하는 경우가 많다.

이 작품 제작을 통해 이러한 문제들을 사전에 인지해 생활습관과 건강을 관리를 할 수 있도록 하여, 평상시 관리를 통해 심혈관 질환 발병률과 사망률 모두 낮추는데 기여할 것을 기대한다.

'''

성능향상기술 전/후 모델 정확도 그래프
안드로이드 앱 UI
한국코드페어 해커톤 본선대회가 끝난 직후

3.  딥러닝 모델을 이용한 얼굴 유사도 측정 사이트

이 웹 사이트는 중학교 2학년(2024) 때 혼자서 개발한 사이트입니다.

 

'''

이 사이트는 자신의 얼굴과 비교하고 싶은 그룹을 선택하고 자신의 얼굴사진을 업로드하거나 촬영하면, JavaScript라이브러리인 face-api.js와 수학을 이용하여 그 그룹의 각 멤버와 사용자의 얼굴의 유사도를 알아볼 수 있다. 물론 1 대 1 비교와 모든 멤버들과 비교하는 것도 가능하다. 현재는 K-pop을 주제로 한 그룹들만 있지만 추후 운동선수, 유튜버, 드라마, 영화 등으로 주제를 확장할 수 있다.

'''

https://facematchkorea.netlify.app/

 

Face Match_korea home

 

facematchkorea.netlify.app

 

4. 자연어 처리 모델과 LLM을 이용한 콘텐츠 신뢰도 분석 사이트

이 프로젝트는 중학교 3학년(2025) 때 3명의 팀원과 진행한 프로젝트입니다. KLUE RoBERTa, 웹, 파이썬, Chat GPT API를 사용하여 진행하였습니다. 이 프로젝트로 저희는 한국정보기술 진흥원에서 주최한 한국청소년 IT 학술대회에서 금상을 수상했습니다. 저는 이 프로젝트에서 총괄과 머신러닝, 웹 개발 일부를 맡았습니다. 저는 이 프로젝트를 진행하며 인문학과 과학기술의 융합의 중요성을 느꼈습니다.

 

'''

  1. 작품 주제 : 한국언론진흥재단의 우리나라 국민을 대상으로 한 2023년도 설문조사에서 응답자의 약 66%가 온라인 허위정보의 위험성에 대해 우려하고 있다 답했다. 약 52% 가 가짜 뉴스를 진짜라고 믿은 경험이 있다고 답했으며 IPSOS의 연구에서 약 85%의 사람들이 온라인 가짜 뉴스가 다른 사람들에 미치는 영향이 시민들에게 영향을 미치는 영향을 걱정한다고 하였지만 정작 가짜뉴스를 판별하는 능력이 부족한 사람들이 대부분이었다.  그렇기에 우리는 가짜뉴스를 판별하는 능력이 부족한 사람들을 위해 진실의 눈을 개발하려고 한다. 
  2. 작품 설명 : 진실의 눈은 사용자가 입력한 링크의 텍스트를 크롤링으로 추출 후 Klue RoBERTa모델을 이용하여 유사도, 감성, 혐오표현, 낚시성 글을 분석하고 Chat GPT API가 추출한 키워드를 NAVER news API에서 검색하고 사용자가 입력한 링크의 내용을 위 내용들과 종합하여 0~100 사이의 신뢰도 점수로 계산하여 산출한다.
  3. 기존 작품과 차별점 : 기존의 서비스인 한국의 팩트체크넷은 전문가 또는 민간인으로 이루어진 양성교육을 받은 팩트체커들이 수작업으로 요즘 문제시되는 사회이슈들을 직접 허위정보나 조작된 정보들을 판단하여 알려주는 앱이다. 하지만 이 앱은 인간이 수작업으로 검증하므로 우리의 웹보다 최신정보 반영이 느릴 것이다. 또한 이 앱은 유지하는 예산이 줄어들어 서비스를 종료하게 됐다. 하지만 우리의 웹은 AI가 검증을 하기 때문에 서비스를 유지하는 비용이 현저히 낮을 것이다.
  4. 결과 및 기대 효과 : 뉴스를 확인하여 가짜 뉴스인지를 판별해 종합 신뢰도 점수를 보여주게 된다. 인터넷 이용자가 정보를 선택적으로 수용할 수 있게 하고, 악의적인 가짜 뉴스가 사회에 미치는 부정적 영향을 줄이고 인터넷 이용자들이 보다 더 뉴스와 유튜브 등의 온라인 정보를 신뢰할 수 있을 것이다.

'''

 

5.  나만의 영어 단어 암기 사이트

이 사이트는 나의 영어 단어 암기를 돕기 위해 내가 개발한 사이트이다. 이 프로젝트를 통해 개인의 문제를 기술로 해결하는 과정과, AI를 활용해 개발 효율을 크게 높일 수 있다는 것을 경험했습니다. 또한 기존 서비스를 그대로 사용하는 것이 아니라, 필요에 맞게 분석·개선하는 것이 진정한 문제 해결이라는 것을 배웠습니다.

 

 '''

학교 영어 수업에서 많은 양의 영어 단어를 암기해야 했지만, 단어를 쓰거나 눈으로 반복해서 외우는 방식은 저에게 지루하고 비효율적으로 느껴졌습니다. 친구들과 대화를 나누며 저와 같은 어려움을 겪는 학생들이 많다는 것을 알게 되었고, 더 효율적인 학습 방법을 고민하게 되었습니다. 조사 과정에서 반복 학습의 중요성을 알게 되었고, 이를 바탕으로 언제 어디서든 스마트 기기로 학습할 수 있는 도구가 필요하다고 느꼈습니다.

Anki, Classcard 등의 기존 서비스를 분석했지만, 저에게는 불필요한 기능이 많고 UI와 연동 과정이 복잡하다는 한계가 있었습니다. 이에 저는 직접 저에게 최적화된 영어 단어 학습 도구를 만들기로 결정했습니다. Anki의 SM-2 알고리즘을 기반으로 ChatGPT와 Gemini의 도움을 받아 제 학습 패턴에 맞게 개선한 JW-SM2 알고리즘을 개발하였고, 이를 웹 서비스로 구현했습니다.

'''

// 단어 하나의 "기억 상태"를 평가 결과에 따라 시간으로 변환하는 함수
// - SM-2 알고리즘을 기반으로 하되, 실제 사용자 경험에 맞게 단순화함
// - 사용자는 3단계로만 평가하고, 시스템이 내부적으로 수치화함
const calculateNextReview = (word, quality) => {

    // 현재 단어가 가지고 있는 학습 상태
    // interval   : 이전 복습 이후 간격(일 단위)
    // easeFactor : 기억 안정성 계수 (SM-2 핵심 변수)
    // streak     : 연속 성공 횟수
    // box        : 학습 진행 상태 시각화를 위한 메타 정보
    let { interval, easeFactor, streak, box } = word;
    const now = Date.now();

    // 0점(완전히 모름)인 경우
    // → 기억에 실패했다고 판단하고, 모든 진행 상태를 초기화
    if (quality === 0) {
        return {
            interval: 1,
            streak: 0,
            box: 0,
            nextReview: now // 즉시 다시 복습 대상
        };
    }

    // 사용자의 3단계 평가를 SM-2 점수 체계(0~5)로 변환
    // 0: Fail, 1: Hesitant, 2: Good, 3: Perfect
    // → 내부적으로는 알고리즘에 적합한 점수로 사용
    const qMap = [0, 2, 4, 5];
    const q = qMap[quality];

    // Ease Factor(EF) 갱신
    // - 기억이 잘 되었을수록 EF가 증가
    // - SM-2 공식 수식을 기반으로 단순화하여 적용
    let newEf =
        easeFactor +
        (0.1 - (5 - q) * (0.08 + (5 - q) * 0.02));

    // EF는 너무 낮아지지 않도록 하한값을 둠 (SM-2 표준: 1.3)
    if (newEf < 1.3) newEf = 1.3;

    // 다음 복습 간격 계산 (일 단위)
    let newInterval = 1;

    if (streak === 0) {
        // 첫 성공 이전 단계: 하루 뒤 다시 복습
        newInterval = 1;

    } else if (streak === 1) {
        // 첫 성공 이후:
        // - 충분히 기억했으면 6일
        // - 애매하면 다시 1일
        newInterval = q >= 4 ? 6 : 1;

    } else {
        // 그 이후부터는 EF를 기반으로 간격을 점진적으로 증가
        newInterval = Math.ceil(interval * newEf);
    }

    // 학습 진행 상태(box) 업데이트
    // - 알고리즘 계산과는 분리된 UX용 메타 정보
    let newBox = box;

    if (q >= 4) {
        // 잘 기억함 → 마스터 단계
        newBox = 3;
    } else if (q >= 2) {
        // 일부 기억 → 학습 중
        newBox = 2;
    } else {
        // 기억 실패 → 새 단어 상태
        newBox = 0;
    }

    // 사용자가 선택한 복습 속도를 반영
    // (같은 알고리즘이라도 개인 성향에 따라 조정)
    const speedFactor = getReviewSpeedFactor();
    const adjustedInterval =
        Math.max(1, Math.round(newInterval * speedFactor));

    // 최종적으로 갱신된 학습 상태 반환
    return {
        interval: adjustedInterval,
        easeFactor: newEf,
        streak: streak + 1,
        box: newBox,
        // 다음 복습 시점을 실제 시간(timestamp)으로 저장
        nextReview:
            now + adjustedInterval * 24 * 60 * 60 * 1000
    };
};

핵심코드

UI

6. 파이썬 2000만 번 이상 출력하는 3가지 방법

이 글은 파이썬에서 단순하다고 여겨지는 출력을 하는 다양한 방법에 대해 알아보기 위해 작성하였습니다.

https://controln.tistory.com/11

 

파이썬 출력하는 3가지 방법

기말고사가 끝나고 심심해서 프로그래밍의 기초인 출력문 연구했다.'2025년7월6일'을 20250706번(2천만번 이상) 출력하는 것을 가장 빠르게 하는 것을 목표로 한다.내 컴퓨터는 AMD Ryzen 5 PRO 8540U, 32기

controln.tistory.com

 

7. 아두이노와 프로세싱을 활용한 조도 시각

이 글은 아두이노와 프로세싱을 공부하며 작성한 글입니다.

https://controln.tistory.com/6

 

아두이노와 프로세싱을 활용한 조도 시각화

소개아두이노와 프로세싱을 활용하면 센서에서 데이터를 받아 컴퓨터 화면에 시각적으로 표현할 수 있습니다. 이 글에서는 조도 센서(LM393)를 사용하여 측정한 데이터를 컴퓨터 화면의 색으로

controln.tistory.com

 

8. 'KBO 2군 기록 기반 1군 성적 예측 모델 개발' 프로젝트

이 연구는 중학교 3학년(2025~2026) 때 개인으로 진행한 연구이다. 이 프로젝트로 한국정보기술진흥원 한국청소년IT학술대회 데이터분석 부분 동상을 수상하였다. 난 어릴 때 부터 야구를 무척좋아하였다. 그러던 중 SBS의 [스토브리그]라는 드라마를 보게 되었고 이를 통해 야구팀의 프런트 직원(전력분석, 스카우트)의 꿈을 키우게 되었다. 물론 지금은 개발자를 꿈 꾸지만 아직 마음속에는 프런트 직원이 남아있는 거 같고, 코딩을 배우며 야구를 코딩으로 분석하고 해결하자는 꿈을 이루기 위한 도전이다.

 

 

9. 카카오AI루키캠프

2026년2월에 카카오에서 주최한 카카오AI루키캠프에 참여했다. 3박4일간 이곳에서 경상,강원지역의 다양한 학생들을 만났다. 밥과 숙소도 호텔급으로 굉장히 좋고 프로그램들도 좋았다. 다양한 교육을 받았지만 이러한 교육들보다는 평소 해보지 못하였던 협업과 소통을 해보게되어서 인상깊었다. 

 

 

그 외

 

1. 초등학교 6학년 때, MRT 블록으로 로봇대회에 참가하여 받은 상입니다.

 

2. 중학교 1학년(2023) 때, 4명의 팀원들과 부산광역시교육청에서 주최한 2023 부산 SW AI 교육 중등학생 해커톤대회에서 받은 상입니다.

 

3. 중학교 3학년(2025) 때, 2명의 팀원과 부산광역시교육청에서 주최한 2025학년도 SW AI 해커톤 & 윤리캠프에서 받은 상입니다.

쉽게 말하면, 전자기기에는 전기가 흐르는 회로가 있기 때문이다. 이 회로에 전기가 흐를 때, 초전도체가 아닌 이상 '저항'이 발생합니다. 저항은 열을 발생시킨다. 

 

컴퓨터를 예로 들어본다.

컴퓨터에는 트랜지스터라는 부품이 수십억 개 이상 들어있다.

트랜지스터는 전기가 통하면 1, 전기가 통하지 않으면 0을 나타낸다.

이렇게 0과 1으로 정보를 처리하면서 컴퓨터는 연산을 한다. 

트랜지스터가 작동을 하면 당연히 전기가 흐르게 될 것이고 이에 따라 당연히 저항이 발생하고 이에 따라 열도 발생한다.

 

전자기기에 발열을 없게 하려면 초전도체로 만든 전자기기를 영하196도의 액체 질소에 넣고 사용하면 된다. 하지만 나는 이 방법은 추천하지 않는다. 사람 피부에 액체질소가 닿는 다면 심각한 저온 화상이 일어나고 조직이 괴사할 것 이다. 

상온 초전도체가 개발된다면 심각한 저온 화상과 조직 괴사의 위험을 감수하지 않더라도 누구나 발열 없는 전자기기를 사용할 것이다. 하지만 배터리에서도 열이 나는데, 이 이유는 다음에 설명한다. 

 

'it지식' 카테고리의 다른 글

삼성월렛과 애플페이의 숨겨진 기술  (1) 2025.03.29
AOD(Always-On Display) 의 숨겨진 기술  (0) 2025.03.29
디스플레이(4) - Mini LED  (0) 2025.02.06
디스플레이(3) - QLED  (2) 2025.02.06
디스플레이(2) - OLED  (0) 2025.02.06

프로그래밍의 기초인 출력문 연구했다.

'2025년7월6일'을 20250706번(2천만번 이상) 출력하는 것을 가장 빠르게 하는 것을 목표로 한다.

내 컴퓨터는 AMD Ryzen 5 PRO 8540U, 32기가 램이다. 

 

1. 가장 기본적인 방법이다. 파이썬을 배운 사람이라면 누구나 적을 코드이다. 반복문을 사용하였다. 약29분45초 걸렸다.

import time
start_time = time.time()
for i in range(20250706):
    i += 1
    print('2025년7월6일',i)
end_time = time.time()
a = end_time - start_time
print(a)

#1785.0897858142853

 

2. sys.stdout.write()을 사용하여 시간을 줄인 코드이다. 알고리즘 문제(백준,코드업 등)을 풀 때 시간초과가 뜨면 사용하는 것 이다.약3분14초 걸렸다

import time
import sys

start_time = time.time()

buffer = []  # 문자열을 담을 리스트
for i in range(1, 20250707):
    buffer.append(f'2025년7월6일 {i}')

sys.stdout.write('\n'.join(buffer) + '\n')  # 한번에 출력 (print보다 빠름)

end_time = time.time()
print(end_time - start_time)

#194.26599669456482

 

3. 병렬처리를 이용한 방법이다. 병렬 처리는 CPU의 코어를 최대한으로 활용하는 방법이다. 병렬처리는 여러개의 프로세스를 만든 후 각 프로세스로 작업을 분담하여 처리하는 방법이다. 이것을 그림으로 표현하자면 이렇다. 

[작업 분배]
입력 데이터: [1, 2, 3, 4, 5, 6, ..., 20250706]

[Pool]
   ┌────────────┬────────────┬────────────┬────────────┐
   │ 프로세스 1 │ 프로세스 2 │ 프로세스 3 │ 프로세스 N │
   └────────────┴────────────┴────────────┴────────────┘
        │             │             │             │
        ▼             ▼             ▼             ▼
 make_line(1~5000)  make_line(5001~10000) ...   병렬 실행

[결과 모음 + 정렬된 반환]
['2025년7월6일 1', '2025년7월6일 2', ..., '2025년7월6일 20250706']

 

약 2분43초가 걸렸다.

import time
from multiprocessing import Pool, cpu_count
import sys

# 출력 형식 생성 함수
def make_line(i):
    return f'2025년7월6일 {i}'

if __name__ == "__main__":
    start_time = time.time()

    COUNT = 20250706
    CPU_CORES = cpu_count()  # 사용 가능한 CPU 수

    with Pool(CPU_CORES) as pool:
        # map은 순서를 보장하면서 병렬 처리
        lines = pool.map(make_line, range(1, COUNT + 1))

    # 한 번에 출력 (print보다 빠름)
    sys.stdout.write('\n'.join(lines) + '\n')

    end_time = time.time()
    print(end_time - start_time)

#163.25601887702942

 

병렬처리가 가장 빠른 방법인 것을 알 수 있다. sys함수와 병렬처리에서 메모리는 약 4기가에서 5기가 정도를 사용한다.

'python' 카테고리의 다른 글

python openCV와 MediaPipe를 활용한 실시간 손가락 인식  (0) 2025.02.15

이것은 제미나이에 처음 들어가면 나오는 화면이다. 여기서 빨간색으로 표시한 부분을 누른 후 Deep Research를 선택한다. 그 다음 제미나이 한테 지시를 한다

예) 학교에서 내가 먹으면 편해지는 음식에 대해 ppt발표해야해. 불닭볶음면과 게토레이야. ppt 순서는 이런순서로 할거야.
   

  1. 제목 등등
  2. 음식이란? (음식의 정의)
  3. 문00의 comfort food (붉닭에 대한 소개와 특징(엄청맵다))
  4. 매운음식이 왜 마음을 편하게 하는가? (매운음식이 마음을 편하게 하는 과학적인 이유)
  5. 김00이 comfort food (게토레이에 대한 소개와 특징(이런 이온,화학성분이 들어가 있다))
  6. 게토레이(이온음료)가 왜 마음을 편하게 하는가? (이온음료가 마음을 편하게 하는 과학적인 이유)
  7. Q&A, 감사합니다 (진짜 질문하면 묵살하고 끝내거나 간단한건 대답해줌)

발표시간은 최대 3분이고 너는 3,4,5,6번에 대해서만 조사해.

이런식으로 프롬프트를 작성하면 된다. 그러고 가만히 있으면 연구가 완료되고. docs로 내보내기를 누른다음 docs에서 수정하면 된다.

 

VScode를 아무 익스텐션 없이 사용하기는 상당히 힘들 것입니다. 웹개발자에게 없으면 곤란해지는  VScode 익스텐션 6가지를 소개하겠습니다.

 

1. Bracket Pair Color DLW

코드를 작성하다보면 괄호가 엄청나게 많아져 각 괄호의 시작과 끝을 구별하기 힘들어집니다. 이 익스텐션은 각 괄호의 시작과 끝을 같은 색으로 분류하여 괄호 쌍을 쉽게 구분할 수 있도록 합니다.

 

2. Color Highlight

css 코드를 작성할 때 무조건적으로 색상코드를 통하여 색을 적용해야 한다. 이 때 코드에서 자신이 적용한 색상이 색상코드에 그대로 나타내 웹 개발의 효율을 높여준다.

 

3. HTML CSS Support

HTML과 CSS 코드를 작성할 때 자동완성, 구문 강조, 코드 검증등의 기능을 제공한다.

 

4. Korean Language Pack for Visual Studio Code

기본적으로 VScode는 모두 영어로 되어있다. 영어를 굉장히 잘해서 영어가 익숙하지 않다면 이는 상당히 불편해진다. 이 익스텐션은 VScode를 한국어로 사용할 수 있게 해준다. 물론 프로그래밍 언어는 영어이다.

 

5. Live Server

웹 개발을 하는 중 개발하던 웹에 들어가 제대로 구현이 되었는지와 어떻게 구현되었는지를 확인해야한다. 이때 마다 netlify와 같은 것들로 배포를 한다면 코드를 수정했을 때 웹에서는 어떻게 수정되었는지 확인하지 못 하고 굉장히 번거롭다. 이런 문제를 해결하기 위해서 간단히 로컬로 개발서버를 실행해 코드 수정시 어떻게 수정되었는지 즉각적으로 반영되므로 효율적이고 편하게 웹개발을 하게 해준다.

한국에서 살면 삼성페이를 사용해보았을 것이고 애플페이도 사용해 본 적 있을 것 입니다. 두 서비스의 차이에 대해 정리해보았다.

 

MST (삼성월렛)

결제가 가능한 모든 카드에는 카드 단말기에 카드의 데이터를 전송하기 위한 마그네틱 띠가 있습니다. MST기능이 있는 스마트폰에는 자기장을 발생시키는 부품이 있습니다. 이 부품을 이용하여 카드 단말기에 마그네틱 띠와 유사한 신호를 전달해서 결제되는 방식입니다.

 

NFC (삼성월렛 / 애플페이)

주파수를 이용하여 근거리에서 데이터를 전송하는 기술입니다. 이 결제방식을 이용하기 위해서는 사용자의 스마트폰뿐만 아니라 카드 단말기도 NFC를 지원해야 합니다. 하지만 요즘은 편의점을 포함한 많은 가게와 음식점등에서 NFC를 지원하는 카드 단말기를 이용하고 있어 더 빠른 속도를 자랑하고 보안상 이점도 있는 NFC로 결제할 수 있는 가게와 음식점등이 많아질 것 입니다.

 

'it지식' 카테고리의 다른 글

전자기기에서 열이 나는 이유  (0) 2025.07.09
AOD(Always-On Display) 의 숨겨진 기술  (0) 2025.03.29
디스플레이(4) - Mini LED  (0) 2025.02.06
디스플레이(3) - QLED  (2) 2025.02.06
디스플레이(2) - OLED  (0) 2025.02.06

AOD는 스마트폰에서 항상 디스플레이가 켜져 있어 시간, 알림, 배터리잔량 등을 쉽게 확인 할 수 있는 기능이다. 

간단히 항상 화면을 켜 놓는 기술 같지만 AOD안에는 스마트폰의 수명을 연장시키고 배터리 사용시간을 늘려주는 간단하지만 몰랐던 기술들이 숨어있다.

AOD의 핵심 작동 원리

AOD는 OLED 디스플레이에서 주로 사용됩니다. 그 이유는 OLED는 픽셀 단위로 개별적인 발광이 가능하기 때문입니다. 일반적인 LCD 디스플레이는 백라이트를 사용하기 때문에 일부만 켜두는 것이 어렵지만, OLED는 필요한 픽셀만 활성화할 수 있어 AOD 기능을 구현하기에 적합합니다.

 

AOD의 작동 방식은 다음과 같습니다.

  • 일부 픽셀만 활성화: 화면 전체가 아닌, 시간, 날짜, 알림 아이콘 등 최소한의 정보만 표시하는 픽셀만 켜둡니다.
  • 낮은 주사율 사용: 일반적인 화면 주사율이 아닌 낮은 주사율로 동작하여 전력 소비를 줄입니다.
  • 자동 밝기 조절: 주변 조명 환경에 맞춰 AOD의 밝기를 자동으로 조절하여 배터리 소모를 최소화합니다.

1. 번인(Burn-in) 방지 기술

OLED의 가장 큰 단점 중 하나는 같은 픽셀이 오랫동안 켜져 있으면 화면에 잔상이 남는 번인(Burn-in) 현상이 발생할 수 있다는 점입니다. 이를 방지하기 위해 AOD는 다음과 같은 기술을 사용합니다.

  • 픽셀 이동 (Pixel Shift): 같은 위치에 동일한 픽셀이 계속 표시되지 않도록 미세하게 이동시켜 번인을 방지합니다.
  • 화면 레이아웃 변경: 일정 시간마다 시계, 알림 아이콘 등의 위치를 바꾸어 특정 픽셀이 지속적으로 사용되지 않도록 합니다.
  • 밝기 조절: 화면의 밝기를 자동으로 조절하여 픽셀에 가해지는 부하를 줄입니다.

2. 배터리 절약 기술

AOD는 항상 켜져 있지만 스마트폰의 배터리를 크게 소모하지 않도록 다양한 절전 기술을 적용하고 있습니다.

  • 저주사율 사용: 최신 스마트폰은 화면 주사율을 1Hz까지 낮출 수 있어 배터리 소모를 최소화합니다.
  • 사용자 인식 기능: 스마트폰이 주머니나 가방에 있을 때, 혹은 일정 시간 동안 어두운 환경에 가만히 있는 경우 자동으로 AOD를 끄는 기능이 적용됩니다.

 

'it지식' 카테고리의 다른 글

전자기기에서 열이 나는 이유  (0) 2025.07.09
삼성월렛과 애플페이의 숨겨진 기술  (1) 2025.03.29
디스플레이(4) - Mini LED  (0) 2025.02.06
디스플레이(3) - QLED  (2) 2025.02.06
디스플레이(2) - OLED  (0) 2025.02.06

소개

아두이노와 프로세싱을 활용하면 센서에서 데이터를 받아 컴퓨터 화면에 시각적으로 표현할 수 있습니다. 이 글에서는 조도 센서(LM393)를 사용하여 측정한 데이터를 컴퓨터 화면의 색으로 나타내는 방법을 쉽게 설명합니다.

동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.

아두이노와 프로세싱이란?

1. 아두이노(Arduino): 센서를 이용해 데이터를 수집하고, 다양한 장치를 제어할 수 있는 작은 컴퓨터입니다.

2. 프로세싱(Processing): 데이터를 그래픽으로 표현하는 프로그래밍 언어입니다. 아두이노에서 보낸 데이터를 화면에 시각적으로 보여주는 데 유용합니다.

 

이 코드의 작동 방식:

아두이노에서 조도 센서(LM393)로 조도 데이터를 읽고 프로세싱에 전송한 다음 프로세싱이 조도에 따라 색상으로 나타냅니다.

 

소스코드

1. 아두이노

int val;  // 프로세싱에서 보내는 시리얼 포트 값을 저장하기 위한 변수
const int sensorPin = A0;  // LM393 센서가 연결된 아날로그 핀
void setup() {
  Serial.begin(9600);      // 9600bps로 컴퓨터와 시리얼 통신 시작
}
void loop() {
  val = analogRead(sensorPin) / 4;  // 아날로그 핀의 값을 읽고 0~255 범위로 변환
  Serial.write(val);                // 프로세싱으로 val의 값을 보냄
  delay(100);                       // 0.1초 동안 스케치를 멈추고 응답을 기다린다.
}

 

2. 프로세싱

import processing.serial.*;  // 라이브러리에서 Serial 라이브러리를 선택해 준다.
Serial port;                 // Serial 의 변수 선언
int val;
void setup(){
  size(800, 800);  // 화면 크기를 800x800으로 설정
  noStroke();
  colorMode(HSB, 255);  // 색상 모드를 HSB로 설정
  printArray(Serial.list());  // 아두이노가 연결된 포트 번호 출력하기
  String portName = Serial.list()[0];  // 아두이노 포트 이름을 문자열 변수에 저장하기, 첫번째 ([0]) 포트가 아닌 여러 포트중 다른 포트를 사용하려면 [ ] 안의 숫자를 바꾸면 된다.
  port = new Serial(this, portName, 9600);  // 연결되어있는 포트를 같은 속도(9600bps)로 열기
}
void draw(){
  if (port.available() > 0) {  // 만약 데이터를 읽을 수 있다면 (0이거나 0보다 작다면 데이터를 읽을 수 없는 상태)
    val = port.read();         // 아두이노의 데이터를 읽고 val에 저장
  }
  background(204);
  fill(val, 255, 255);  // HSB 모드에서 색상을 설정
  rect(0, 0, width, height);  // 사각형을 화면 전체 크기로 그린다.
  println(val);  // val 값 확인
}

 

 

 

소개

컴퓨터 비전 기술의 발전으로 카메라를 활용한 손동작 인식이 점점 더 보편화되고 있습니다. 이번 글에서는 OpenCV와 MediaPipe를 사용하여 실시간으로 손가락 개수를 세고 'ㅗ'를 감지하는 방법을 설명합니다.

 

 

 

1. OpenCV (Open Source Computer Vision)

OpenCV는 이미지 및 영상 처리에 특화된 라이브러리로, 웹캠에서 영상을 가져와 실시간으로 화면에 출력하는 역할을 합니다.

2. MediaPipe

Google에서 개발한 MediaPipe는 머신러닝 기반의 실시간 컴퓨터 비전 라이브러리로, 손 추적(hand tracking), 얼굴 인식, 포즈 감지 등 다양한 기능을 제공합니다. 이번 프로젝트에서는 MediaPipe Hands 모듈을 활용하여 손가락의 위치를 감지하고 분석합니다.

 

 

실시간 손가락 인식의 원리

웹캠을 통해 입력된 영상에서 손의 랜드마크(관절 포인트)를 감지하여 손가락이 펴졌는지 확인하는 방식입니다. 각 손가락의 특정 위치를 비교하여 펴진 개수를 계산하고, 특정한 모양을 인식할 수도 있습니다.

 

 

손가락 마디의 랜드마크 번호

손 랜드마크 개념

MediaPipe는 손을 감지하면 21개의 중요한 지점을 인식합니다. 이 지점들을 활용하면 손가락이 펴졌는지, 어떤 제스처를 만들고 있는지를 확인할 수 있습니다.

엄지 4번, 3번 랜드마크
검지 8번, 6번 랜드마크
중지 12번, 10번 랜드마크
약지 16번, 14번 랜드마크
새끼 20번, 18번 랜드마크

예를 들어 검지 손가락이 펴졌는지 확인하려면 8번 랜드마크(손가락 끝)가 6번 랜드마크(손가락 관절)보다 위쪽(y 값이 작음)에 있는지를 비교하면 됩니다.

 

소스코드

import cv2
import mediapipe as mp

# Mediapipe 손 인식 모듈 초기화
mp_hands = mp.solutions.hands
hands = mp_hands.Hands(
    max_num_hands=1,
    min_detection_confidence=0.7,
    min_tracking_confidence=0.7
)
mp_draw = mp.solutions.drawing_utils

# 웹캠 열기
cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    if not ret:
        break

    # 화면을 좌우 반전(미러 모드)
    frame = cv2.flip(frame, 1)
    h, w, c = frame.shape

    # Mediapipe는 RGB 이미지를 사용
    imgRGB = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    result = hands.process(imgRGB)

    # 손 인식이 되었을 경우
    if result.multi_hand_landmarks:
        for handLms in result.multi_hand_landmarks:
            lm_list = []
            for id, lm in enumerate(handLms.landmark):
                cx, cy = int(lm.x * w), int(lm.y * h)
                lm_list.append((cx, cy))

            # 손가락의 펴짐 상태를 저장할 리스트 (엄지, 검지, 중지, 약지, 새끼)
            finger_status = []

            # 엄지: 일반적으로 x 좌표를 비교 (오른손 기준)
            if lm_list[4][0] < lm_list[3][0]:
                finger_status.append(1)
            else:
                finger_status.append(0)

            # 검지: tip (8)과 pip (6) 비교 (y 좌표가 작으면 위쪽에 있음)
            if lm_list[8][1] < lm_list[6][1]:
                finger_status.append(1)
            else:
                finger_status.append(0)

            # 중지: tip (12)과 pip (10)
            if lm_list[12][1] < lm_list[10][1]:
                finger_status.append(1)
            else:
                finger_status.append(0)

            # 약지: tip (16)과 pip (14)
            if lm_list[16][1] < lm_list[14][1]:
                finger_status.append(1)
            else:
                finger_status.append(0)

            # 새끼: tip (20)과 pip (18)
            if lm_list[20][1] < lm_list[18][1]:
                finger_status.append(1)
            else:
                finger_status.append(0)

            total_fingers = sum(finger_status)

            # 욕 제스처 판 단: 오직 중지만 펴진 경우
            # finger_status의 인덱스: [엄지, 검지, 중지, 약지, 새끼]
            if finger_status[2] == 1 and finger_status[0] == 0 and finger_status[1] == 0 and finger_status[3] == 0 and finger_status[4] == 0:
                display_text = "fuck"  # 욕 이모티콘
            else:
                display_text = str(total_fingers)  # 펴진 손가락 개수를 숫자로 표시

            # 화면에 텍스트 표시
            cv2.putText(frame, display_text, (50, 150),
                        cv2.FONT_HERSHEY_SIMPLEX, 4, (0, 255, 0), 5)

            # 손의 랜드마크와 연결선 그리기
            mp_draw.draw_landmarks(frame, handLms, mp_hands.HAND_CONNECTIONS)

    cv2.imshow("Webcam", frame)
    # 'q' 키를 누르면 종료
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

'python' 카테고리의 다른 글

파이썬 출력하는 3가지 방법  (0) 2025.07.06

+ Recent posts