박현규

박현규

iOS Developer

문제가 생기면 여러 방안을 놓고 수치로 효율을 증명한 뒤 고르는 iOS 개발자입니다.

원본 신호, RMS 적응형 게인, tanh 소프트 클리핑을 거친 세 단계 파형

위 파형은 Lecture2Quiz에서 Whisper 입력 앞단에 직접 구현한 전처리입니다. gain = 0.25 / max(rms, 0.00001)로 거리에 따라 작아진 음성을 끌어올리고, tanh(x * 3)으로 증폭된 신호의 왜곡을 막습니다. 10m 거리 녹음의 SNR이 5~10dB에서 15~20dB로 올랐습니다.

대표 프로젝트

NurseMate

간호사를 위한 AI 알약 인식과 간호 타이머 iOS, watchOS 앱. App Store 출시

2026.06부터 진행 중, AI.SW마에스트로 17기, 3인 팀.
iOS, watchOS와 각인 판독 AI를 맡았습니다.

간호사를 인터뷰하고 설문하며 문제를 정의했고, 북극성 지표를 설계해 사용자 활동을 분석했습니다. 이 지표를 개선하기 위해 51개의 실험을 돌려 181개의 모델을 학습시켰습니다. 학습한 모델은 Core ML로 iOS에 이식했고, 다양한 기기에서 RAM과 GPU 사용량을 분석하며 모델별로 연산 유닛(ANE, GPU, CPU)을 나눠 적재하는 메모리 최적화를 진행했습니다. 그 결과 저성능 기기에서도 사용자 경험을 보장하고, 기존 타 서비스 기준 평균 2분 이상 걸리던 알약 식별 시간을 1분 이내로 줄였습니다.

  1. 문제

    알약 검색의 병목은 각인 하나였습니다.

    • 앱 분석에서 사용자가 손으로 고치는 속성은 압도적으로 각인. 색, 모양, 제형 수정은 거의 0
    • 앱에 각인 추출이 없어 사용자가 매번 직접 입력
    • 각인 없이 검색하면 25,246종 중 정답의 중앙 순위가 1,248위, top-1 0%
    • 각인은 잉크가 아니라 음각이라 표면과 같은 색이고 그림자로만 보임. 문서용 OCR은 정확도 0.7%
  2. 시도 1

    상용 비전 언어 모델(Gemini)로 판독, 검색, 검증을 잇는 파이프라인을 만들고 실사진 69알약 138면으로 전수 측정했습니다.

    • 판독만 붙여도 top-1 0%에서 53.6%. 후보 20개를 다시 보여 주는 검증 단계를 더해 58.0%
    • 이득의 절반은 판독기 뒤에서 나왔습니다. API 호출 없이 랭커의 순위 감쇠와 속성 가중치만 조정해 top-20 +13.0%p
    • 후보 목록을 함께 보여 주면 같은 모델의 판독 정확도가 59.4%에서 69.6%로 상승
    • 앞뒤 두 면을 찍으면 한 면 대비 top-1 +17.4%p. 모델 교체보다 여섯 배 큰 레버
    • 전처리 18종, 확대, 더 큰 모델, 곡선 정렬은 전부 효과 0. 사람도 블라인드로는 37.1%만 읽고 45.7%는 못 읽는 사진이라 판독기 자체는 한계
  3. 시도 2

    온디바이스로 돌릴 자체 각인 판독기(CRNN + CTC)를 학습했습니다. 식약처 참조 사진 23,750알약 47,500면을 약포지 촬영 조건으로 열화시켜 학습 데이터로 썼습니다.

    • 팀이 쓸 라벨링 도구를 직접 만들어 평가셋을 69알약에서 291알약(559면)으로 늘렸습니다. 이것만으로 "정밀도 100%"가 표본 탓이었음이 드러나 이전 결론 여러 개를 뒤집었습니다
    • 지표를 고정 임계값 대신 "정밀도 90% 지점에서 통과하는 면 수"로 다시 설계. 선별은 1시드, 채택은 3시드 규칙
    • 고확신 오답 4건 중 3건이 글자는 읽는데 회전 방향을 잘못 고른 경우. 증강이 ±20°만 덮은 탓이라, 뒤집힌 면에 빈 정답을 가르치는 학습으로 한때 12에서 41알약으로 올렸으나, 최종 구조(TPS, FRM)에서 다시 재니 손해라 닫았습니다
    • 학습 없이 추론만 바꿔 확대 TTA와 후보 단위 시드 앙상블을 더하고, 학습량을 20에폭에서 60에폭으로 늘렸습니다. 앙상블은 모델이 셋이라 폰에 올릴 수 없어 측정만 하고, 최종 채택은 단일 시드 모델입니다
    • 증강, 전처리, MIM 사전학습, 백본 교체, 학습률, 가중치 평균 등 24개 실험은 전부 기준 미달로 닫았습니다
    정밀도 90% 지점 통과 수 (실사진 감사셋 331면, 192알약)
    구성면알약
    20에폭 단일 모델188124
    20에폭, 확대 TTA, 3시드 합의 앙상블206130
    40에폭, 3시드 합의 앙상블210128
    60에폭 단일 모델 (앱 탑재)240150
    60에폭, 확대 TTA, 3시드 합의 앙상블 (측정만, 미채택)248153
  4. 시도 3

    남은 실패의 원인을 해부하고, 모델을 바꾸지 않고 후보를 좁혔습니다.

    • 실패는 알약이 아니라 사진에 달렸습니다. 같은 알약을 두 번 이상 찍은 57건 중 22건이 사진에 따라 성공과 실패가 갈렸고, 해상도, 대비, 선명도와의 상관은 전부 |r| 0.13 이하
    • 오라클 진단: 144개 후보 안에 정답이 있는 비율 84%. 선택 실패 12%, 인식 실패 16%
    • 판독기 답을 "확신도 0.95를 넘는 글자 전부"로 바꾸고 부분 수열로 대조해, 학습 없이 후보 중앙값 1,248개에서 19개(정답 유지 93%)
    • 이미지 임베딩은 각인 대체로는 실패(+1.5%p)했지만, 각인으로 좁힌 뒤의 순위에만 쓰고 특징을 마크 모델에서 뽑자 후보 안 1위 67.5%, 5위 안 88.7%. 마크 필터는 임베딩과 겹쳐 순손해라 껐고, 카탈로그 임베딩 72MB는 서버에 두어 기기는 12KB만 보냄
  5. 결과
    • 각인 검색 top-1 0%에서 58.0%, top-3 0%에서 71.0% (69알약 138면)
    • 자체 판독기 정밀도 90% 통과 188면에서 240면 (최종 채택 단일 모델). 3시드 앙상블은 248면으로 측정만 하고 채택하지 않음
    • 마크(제조사 기호) 유무 모델은 일곱 번 실패한 뒤 원인이 앞뒤 면 배정임을 찾아 전용 ConvNeXt로 교체. 정답 해석 오류까지 바로잡자 AUC 0.82에서 0.99, 같은 정밀도에서 재현율 36%에서 80%
    • fp16 ONNX 변환으로 마크 모델 111.7MB를 55.9MB로 줄이고 판정이 바뀐 면 0건을 확인. 전처리 한 줄 차이가 fp16보다 70배 크게 흔들려, 텐서 대조와 크롭 대조를 나누는 2단계 검증을 iOS 이식 절차로 정함
    • Core ML로 실기기에 올리며 모델별 연산 장치를 재서 정했습니다. fp32는 Neural Engine에 못 올라가 마크 모델만 fp16으로 바꿔 추론 244ms에서 60ms, 각인은 GPU와 CPU 두 레인으로 나눠 iPhone 12 판독 1장 9.2초에서 5.4초
    • App Store 출시, 출시 초기 사용자 3,600명
핵심 수치
항목전후어떻게
각인 검색 top-1 (69알약)0%58.0%판독, 검색, 검증 파이프라인과 랭커 조정
판독기 정밀도 90% 통과 면 (331면)188면240면60에폭 단일 모델, 확대 TTA. 3시드 앙상블(248면)은 측정만
후보 수 중앙값 (감사셋 347면)1,248개19개확신 글자 전부로 부분 수열 대조
좁힌 후보 안 1위 적중 (347면)45.6%67.5%마크 모델 특징으로 임베딩 재정렬
마크 유무 AUC (AI Hub 475면)0.820.99전용 ConvNeXt와 정답 해석 교정
판독 1장 (iPhone 12, 알약 6개)9.2초5.4초각인 GPU·CPU 두 레인, 마크 fp16 Neural Engine
스크린샷
iPhone
알약 촬영과 각인 판독
스크린샷
iPhone
후보 알약 선택
스크린샷
Apple Watch
watchOS 간호 타이머

Lecture2Quiz

수업 녹음을 실시간으로 글로 바꾸고, 그 내용으로 요약과 퀴즈를 만드는 iOS 앱

2025.03부터 2025.06까지 3개월, 4인 팀.
iOS 개발을 혼자 맡았습니다.

  1. 문제

    강의실 5~10m 거리에서 녹음하면 STT 정확도가 크게 떨어졌습니다.

    • 음압이 1m 대비 10분의 1 수준으로 줄고, SNR은 5m에서 약 14dB, 10m에서 약 20dB 감쇠
    • 10m에서는 음성보다 노이즈가 더 크게 녹음됨
    • Whisper는 오프라인 배치용 모델이라, 모델을 키우면 정확도는 오르지만 처리 시간도 같이 늘어남
  2. 해결

    상용 서비스의 전처리 방식을 조사해 두 단계를 AVAudioEngine 파이프라인에 직접 구현했습니다.

    // RMS 기반 적응형 게인
    let rms = sqrt(floatArray.map { $0 * $0 }.reduce(0, +) / Float(frameLength))
    let targetRMS: Float32 = 0.25
    let gain = targetRMS / max(rms, 0.00001)
    
    // tanh 소프트 클리핑
    for i in 0..<floatArray.count {
        let scaled = floatArray[i] * gain
        floatArray[i] = tanh(scaled * 3.0)
    }

    그다음 모델 크기를 바꿔 가며 처리 시간과 정확도를 함께 쟀습니다.

    Whisper 모델 크기별 측정
    모델처리 시간정확도원거리 실험
    tiny0.5초65~70%전처리 후에도 CER 50% 초과
    small1~2초75~80%전처리 후에도 CER 50% 초과
    medium3~5초85~90%CER 15% 미만
    large-v38~12초92~95%지연 10~15초, 실시간 목표 불가
  3. 결과
    • 10m 거리 녹음 SNR이 5~10dB에서 15~20dB로 개선
    • medium 모델 채택. 한국어 강의에서 CER 15% 이하, 처리 지연 5~10초
    • WebSocket 스트리밍 클라이언트와 오디오 전처리 코드를 WhisperLive 오픈소스(3.6k★)에 기여
    • 1저자로 논문 작성, 한국학술정보(KISS) 등재: 실시간 STT와 RAG 기반 퀴즈 생성 시스템 연구
핵심 수치
항목전후어떻게
10m 거리 녹음 SNR5~10dB15~20dBRMS 적응형 게인과 tanh 소프트 클리핑
원거리 STT 오류율 (CER)50% 초과15% 미만tiny, small에서 medium 모델로 교체
처리 지연10~15초5~10초large-v3 대신 medium으로 실시간성 확보
스크린샷
iPhone
실시간 수업 녹음 STT 뷰
스크린샷
iPhone
수업 요약 뷰
스크린샷
iPhone
LLM 기반 퀴즈 카드 뷰

한땀한땀

AI 이미지 인증과 HealthKit 자동 연동으로 신뢰할 수 있는 습관 챌린지를 만드는 iOS와 watchOS 앱. App Store 출시 후 현재 배포 중단.

2025.07.01부터 진행 중, 4인 팀.
iOS 2인 중 리드 개발을 맡았습니다.

  1. 문제

    닉네임이나 프로필을 수정하는 POST 요청 뒤 네비게이션에서 POP하면, 서버에는 반영됐지만 상위 화면은 캐시된 이전 정보를 그대로 보여 줬습니다.

    당시 구조는 DIContainer가 AppRouter를 통해 스택으로 뷰를 관리하고, POP으로 이전 뷰에 복귀하는 방식이었습니다.

  2. 해결

    세 가지 방안을 놓고 비교했습니다.

    • ViewModel 공유상위와 하위 화면이 같은 ViewModel 인스턴스를 쓰도록 구조 변경
    • 강제 새로고침POP 뒤 상위 화면 onAppear에서 API를 다시 호출
    • 전역 AppState 도입 (채택)DIContainer에 사용자 정보를 관리하는 Combine 기반 상태 스트림을 두고, POST 성공 시 Publisher에 최신 데이터를 반영해 구독 중인 뷰가 자동 갱신
  3. 결과
    변경 전에는 POST 후 POP한 상위 화면이 캐시를 보여 주고, 변경 후에는 DIContainer의 AppState 스트림을 구독한 모든 화면이 자동 갱신되는 흐름도 변경 전 프로필 수정 화면 서버 상위 화면 캐시된 이전 값 POST POP (갱신 없음) 변경 후 프로필 수정 화면 서버 DIContainer AppState (Combine) 상위 화면 구독, 자동 갱신 POST 성공 Publisher 갱신

    POST 성공 시 Publisher에 최신 값을 넣으면, 구독 중인 상위 화면이 POP 뒤 별도 호출 없이 갱신됩니다.

    • 사용자 정보의 단일 Source of Truth를 DIContainer 안 Combine 스트림 한 곳으로 확보
    • 화면 간 직접 참조 없이 이벤트 스트림으로 연결되어 결합도가 낮아지고 확장이 쉬워짐
    • 2025 숭실대 소프트웨어 공모전 총장상, 2025 숭실대 IT프로젝트 공모전 우수상
    • 2025 SW 인재 페스티벌(과학기술정보통신부) SW중심대학 우수작품관에 숭실대 대표로 부스 운영
핵심 수치
항목전후어떻게
사용자 정보 Source of Truth화면마다 캐시1곳DIContainer 안 AppState Combine 스트림
POP 후 상위 화면 갱신수동 호출 필요자동Publisher 구독으로 화면 간 직접 참조 제거
HealthKit 데이터 동기화없음실시간걸음, 칼로리, 심박을 WatchConnectivity로 iOS에 전달
스크린샷
iPhone
챌린지 통계
스크린샷
iPhone
AI 기반 이미지 인증
스크린샷
iPhone
채팅, Socket.io 기반
스크린샷
Apple Watch
watchOS 측정 중, 실시간 점수와 순위

Divary (다이버리)

스쿠버 다이빙 기록을 사진, 스티커, 손그림으로 꾸미고 아바타와 바다 공간을 커스터마이징하는 다이빙 로그 iOS 앱. App Store 출시 후 현재 배포 중단.

2025.07.01부터 진행 중, 9인 팀.
iOS 3인 중 리드 개발을 맡았습니다.

  1. 문제

    두 가지가 막혔습니다.

    • SwiftUI의 Text는 부분 범위 스타일을 지원하지 않아, 일기 안 특정 단어에만 밑줄, 취소선, 폰트, 크기를 적용할 수 없었습니다.
    • 펫과 오브젝트를 드래그와 회전 제스처로 배치하는 기능에서, iPhone SE부터 Pro Max, iPad까지 종횡비가 달라 기준 좌표가 틀어졌습니다.
  2. 해결

    텍스트 편집은 두 라이브러리를 비교했습니다.

    • MarkdownUISwiftUI 전용. 헤딩, 리스트, 테이블은 다양하지만 부분 범위 스타일링이 부족
    • RichTextKit + RTF (채택)UIKit NSAttributedString 기반. 스타일 편집, 단축키, 포맷 변경 같은 고급 기능이 있고 RTF로 서식 저장과 복원이 쉬움. UIKit Core Text 엔진 위에서 중간 변환 없이 즉시 렌더링

    좌표 문제는 기준 캔버스를 393×852로 고정하고 GeometryReader로 기기 크기를 받아 변환했습니다.

    let scaleX = geometry.size.width  / 393
    let scaleY = geometry.size.height / 852
    let scale  = min(scaleX, scaleY)
    
    let x: CGFloat = 20 * scaleX
    let y: CGFloat = (-110 + storeViewOffset) * scaleY
  3. 결과
    • 일기에서 굵게, 밑줄, 취소선, 폰트, 크기를 부분 적용하고 RTF로 저장과 복원
    • DesignSpace 모델로 좌표, 크기, 각도 변환을 한곳에 모아 iPhone SE, Pro Max, iPad에서 같은 배치 결과. 핸들 크기도 스케일에 연동
    • 2025 UMC 8기 데모데이 대상. 전국 연합 개발 동아리 UMC의 65개 프로젝트 중 1위
핵심 수치
항목전후어떻게
부분 범위 텍스트 스타일불가5종RichTextKit과 RTF. 굵게, 밑줄, 취소선, 폰트, 크기
서식 렌더링 중간 변환있음없음UIKit Core Text 엔진 위에서 즉시 렌더링
기기별 배치 일관성기기마다 틀어짐SE부터 iPad까지 동일기준 캔버스 393×852, scale = min(w/393, h/852)
스크린샷
iPhone
다이빙 로그 뷰
스크린샷
iPhone
부분 텍스트 서식과 손그림 일기
스크린샷
iPhone
펫 위치와 각도 드래그 편집
스크린샷
iPhone
아바타 커스터마이징 적용 결과

수상, 논문, 활동

  • 2021.03숭실대학교 소프트웨어학부 입학학사과정 졸업 예정, 서울
  • 2021.03 ~ 2023.02소프트웨어학부 학생회
  • 2021.12창의적공학설계 전시회 우수상
  • 2024.04공군 AI 해커톤 참가
  • 2025.03 ~ 2025.06Lecture2Quiz 개발WhisperLive 오픈소스(3.6k★)에 실시간 오디오 스트림 클라이언트 코드 기여
  • 2025.03 ~ 2025.08UMC 8기 숭실대 iOS 파트
  • 2025.08.18숭실대 소프트웨어 공모전 총장상한땀한땀
  • 2025.08.23UMC 8기 데모데이 대상Divary, 65개 프로젝트 중 1위
  • 2025논문 1저자, 한국학술정보(KISS) 등재실시간 STT와 RAG 기반 퀴즈 생성 시스템 연구. 논문 보기
  • 2025.11.22숭실대 IT프로젝트 공모전 우수상한땀한땀
  • 2025.11.27 ~ 282025 SW 인재 페스티벌 부스 운영과학기술정보통신부 주최, SW중심대학 우수작품관에 숭실대 대표로 참가
  • 2026.06 ~ 현재AI.SW마에스트로 17기NurseMate 개발, 과학기술정보통신부, 정보통신기획평가원 주관

연락처

이메일
[email protected]
GitHub
github.com/ParkMazorika
블로그
velog.io/@mazorika

iOS 신입 개발자 포지션에 지원하고 있습니다. 이메일로 연락 주시면 하루 안에 답장드립니다.

이력서 보기