API のないアプリは多いです。銀行、決済、ヘルスケア、チャット。AI エージェントがどれだけ賢くても、それらを代わりに操作することはできませんでした。 iphone-use は、本物の iPhone を AI エージェントに渡すオープンソースツールです(MIT)。画面をテキストとして読み、タップ・スワイプ・入力をして、操作が効かなかったときははっきりそう返します。 GitHub: https://github.com/leeguooooo/iphone-use 2 分のデモ: https://youtu.be/k5MsBZcjUVs しくみ Mac 上のデーモンが USB ...
(Background) What is Object Detection? object classifcation : 이미지 내 single object, output: class probability (Object class) object localization : 이미지 내 single object, output: (x,y,w,h) (Object Class, Bounding Box: 물체의 위치) object detection : 이미지 내 multiple object , output: class probabilities + (x,y,w,h) (Objet class, Bounding Box) (Background) One-Stage Detector VS. Two-Stage Detector image source One-Stage Detector localization 과 classifcation 동시에 수행하여 결과를 얻는 방식 한번의 network forward 에서 image → Bounding Box + Object Class + Confidence 를 바로 예측. 즉, "여기에 사람이 있고, box는 이 좌표다" (별도로 물체가 있을 법한 영역(잠재영역)을 먼저 찾지 않음) Conv & FC layers 를 거친 후 output 를 reshape 하여 output tensor를 만들어냄. 그 후 알고리즘을 적용하여 classifcation 과 bounding box 의 위치까지 찾아냄. Two-Stage Detector Localization → Clasification 순차적으로 수행하여 결과 얻음. (Faster R-CNN이 대표적인 예시임) 첫번째로 물체가 있을 것 같은 후보 영역인 Regional Proposal 을 만듦. 두번째로 그 결과를 받아 각각을 자세히 보면서, Object Class를 예측함. (Classification) 먼저 원본 이미지 전체를 Backbone CNN에 넣어 Feature Map을 생성한다. RPN(region proposal network) 에서의 첫번째 stage에서 proposed regions(물체가 있음직한 영역)를 찾아낸다. Output: Proposal1 = [x1, y1, x2, y2] 와 같은 Proposal Regions , ROI 두번째 stage 에서는 stage1에서 찾은 Proposal 위치 를 Feature Map 위에 대응시킨다. 아까 찾아낸 proposed regions를 적절히 비율을 맞춰 투영시켜 해당 결과값을 RoI Align 으로 일정한 크기로 맞춰 FC Layers에 전달하고 Classifcation 과 Box Refinement (처음 Proposal의 박스 위치를 더 정확하게 수정) 를 가능하게 함. You Only Look Once: Unified, Real-Time Object Detection Unified, Real-Time Object Detection You Only Look Once: 전체 이미지 보는 횟수 1회 Unified: classification & Localization 단계 단일화 Real-Time: 속도 개선 Main Contribution 1) Object detection 을 regression problem 으로 관점 전환 2) Unified Architecture: 하나의 신경망으로 classification & Localization 예측 3) Fast Detection: 속도 개선 4) Generalization: 여러 도메인에서 object detection 가능 2. Unified Detection 2.1 Network Design YOLO의 convolutional network는 image classification용 GoogLeNet architecture에서 영향 을 받았다. CNN 부분에서는 $$1\times1$$ convolution $$3\times3$$ convolution을 반복해서 사용. (GoogLeNet: 큰 convolution을 하기 전에 $$1\times1$$ Conv로 channel 수를 줄여서 계산량을 줄이자) 24 Conv Layer + 2 FC Layer / Fast Yolo: 9 Conv Layer + 2 FC Layer Pretrained : 20 Conv Layer, pretrained with 1000-class ImageNet (input image: 224 x 224) visual feature를 잘 추출하도록 weight가 학습 Fine-tuned : 4 Conv Layer + 2 FC Layer, fined-tuned with PASCAL VOC (input image: 448 x 448) Reduction Layer: 중간에 1 x 1 reduction layer로 연산량 감소. 2.2 Training (개인 필기로 대체) 특정 object에 대해 reponsible 한 cell i는 GT box의 중심이 위치하는 cell로 할당. YOLO는 여러 bbox를 예측하지만, 학습단계에서는 IoU가 가장 높은 bbox 1개만 사용됨. 2.3 Inference Non-Maximum Suppression: 각 object에 대해 예측한 여러 bbox 중에서 가장 예측력 좋은 bbox만 남기기 위함. 4. Experiment 4.1. Comparison to Other Real-Time Systems Dataset: PASCAL VOC 2007 YOLO의 mAP 63.4로 SOTA는 아니었지만, 실시간 Detector 중에서는 매우 높은 정확도를 보여줬다. (Fast YOLO는 155 FPS) Faster R-CNN VGG-16이 YOLO보다 약 10 mAP 높지만 약 6배 느리다. (실시간과 거리가 매우 멂) 4.2. VOC 2007 Error Analysis YOLO Correct: 65.5% Localization error: 19.0% Background error: 4.75% 기타 오분류 존재 Correct 는 Fast R-CNN이 더 높다. 하지만 YOLO의 장점은 Background Error ($$ IoU < 0.1$$, 실제로 아무것도 없는 배경을 보고 “여기 object 있어”라고 잘못 검출한 것) 가 매우 작다는 것에 있다. YOLO의 대표적인 약점은 Localization Error가 많다는 것에 있다. 반대로, Faster R-CNN은 BOX 위치는 더 잘 잡지만 배경을 object로 잘못 보는 false positive가 많다. 그래서 저자들은 둘이 틀리는 방식이 다르면, 둘을 합치면 성능이 좋아지지 않을까 란 생각으로 아래와 같은 실험을 진행하였다. 4.3. Combining Fast R-CNN and YOLO 실험결과 Fast R-CNN 과 YOLO를 결합하면 $$ 75.0\ \text{mAP}$$ 로 + 3.2 mAP 로 올라간다. 4.5. Generalizability: Person Detection in Artwork Dataset: Picasso Dataset, People-Art Dataset 사람을 찾아내는 Person Detection을 진행하였고, YOLO는 다양한 도메인에서도 robust한 detection 성능을 보임. YOLO가 단순히 object의 일부분이나 local texture만 보는 것이 아니라 이미지 전체를 한 번에 보고 object의 shape와 contextual information을 함께 활용하기 때문에 다른 도메인에서도 상대적으로 잘 일반화함. 반대로 R-CNN 계열은 region 중심으로 object를 보는 방식이라, 사진과 그림 사이의 appearance 변화에 더 민감한 모습을 보임. Limitations 작은 물체에 약함 작은 물체는 feature가 많이 손실되기 쉽고, 여러 작은 물체가 한 grid cell에 몰리면 표현하기 어렵다. 작은 Box는 좌표가 조금만 틀려도 IoU가 크게 떨어진다. 밀집된 물체에 약함 한 cell이 예측할 수 있는 Box와 class 표현 수가 제한적이라, 작은 물체 여러 개가 같은 cell에 들어오면 놓치기 쉽다. 새로운 비율/형태에 약함 학습 때 보지 못한 특이한 aspect ratio나 object configuration이 나오면 Bounding Box regression이 잘 안 될 수 있다. (Background) Metrics FPS (V100, FP32) FPS : 모델이 1초에 이미 몇 장을 처리할 수 있느냐 (10FPS: 초당 10장) V100 = NVIDIA Tesla V100 GPU에서 측정했다는 뜻 FP32 = 모델 계산을 32-bit floating point로 수행했다는 뜻 IoU(Intersection over Union) : 두 Box가 겹쳐진 영역 / 두 Box를 합친 전체 영역 (예측 Box 와 정답(GT) Box) IoU = 1.0 → 완전히 일치 IoU = 0.8 → 상당히 잘 맞음 IoU = 0.3 → 별로 안 맞음 IoU = 0 → 아예 안 겹침 AP (Average Precision) : 한 클래스에 대해 모델이 얼마나 정확하게 탐지하는지를 하나의 숫자로 나타낸 것 (Precision - Recall Curve 아래의 면적) $$ \boxed{AP_t = \text{PR curve의 면적, 단 TP를 } IoU\ge t\text{일 때만 인정}} $$ IoU는 AP를 계산하기 위한 정답 판정 기준이고, AP는 그 기준 아래에서 모델 전체가 얼마나 잘 탐지하는지를 평가하는 점수. ❓헷갈렸던 점: AP와 IoU의 관계성 e.g.) AP75 : 예측 Box가 GT Box 와 IOU >= 0.75 이상일 때만 "맞춘 것(TP)"로 인정하겠다. 1. 모델이 여러 개의 Bounding Box + Confidence를 예측함 2. 각 예측 Box를 정답 GT Box와 비교해서 IoU 계산 3. IoU ≥ 0.75면 TP, 아니면 FP로 판정 4. 예측들을 Confidence 높은 순서대로 정렬 5. 위에서부터 하나씩 포함하면서 Precision, Recall 계산 6. 그 점들로 PR Curve 생성 7. PR Curve 아래 면적 = AP75 mAP (mean Average Precision) : AP를 여러 클래스에 대해 구한 다음 평균낸 것. 전체 클래스에 대한 평균 detection 능력. Confidence threshold(신뢰도 임계값) : 인공지능(AI)이나 머신러닝 모델이 내린 예측 결과의 확신 점수(Confidence score)를 수용할지 여부를 결정하는 기준선 COCO mAP : 여러 IoU 기준에서 계산한 AP를 평균낸 점수. $$\text{AP50,\ AP55,\ AP60,\ \dots,\ AP95}$$
Medical Digitals is a healthcare content writing company providing clear, engaging, and SEO-friendly content for healthcare, pharma, medtech, and life science brands. Our content helps businesses communicate with HCPs and reach the right audience through blogs, website content, and digital marketing materials.
무중단 배포(Rolling, Blue-Green 등)를 도입하면 서버 인스턴스가 순차적으로 교체되거나 일시적으로 구버전(v1)과 신버전(v2)이 동시에 라이브 환경에 공존하는 과도기(Transition Period)가 반드시 발생합니다. 이때 애플리케이션 코드는 바뀌었는데 데이터베이스(DB) 스키마나 데이터 구조가 이를 따라가지 못하면, 구버전 혹은 신버전 서버가 에러를 내며 서비스 장애로 이어지게 됩니다. 이를 흔히 DB 마이그레이션과 배포 간의 타임 라인 불일치 문제 라고 합니다. 안전한 무중단 배포를 위해 반드시 지켜야 할 DB 변경 및 호환성 유지 전략(Expand & Contract 패턴)을 정리해 봅니다. 1. 흔히 발생하는 데이터 정합성 파괴 시나리오 만약 사용자 테이블( users )의 phone 컬럼을 없애고 mobile_number 컬럼으로 이름을 변경해야 한다고 가정해 봅시다. 잘못된 배포 순서 DB에 직접 접속해 phone 컬럼을 mobile_number 로 바꿉니다. 그 후 신버전(v2) 코드를 배포합니다. 발생하는 문제 DB를 먼저 바꾸는 순간, 아직 떠 있는 구버전(v1) 서버들 은 여전히 phone 컬럼을 조회하거나 삽입하려고 시도합니다. 결과적으로 구버전 서버 전역에서 Column not found SQL 에러가 발생하며 장애가 터집니다. 반대로 코드를 먼저 바꾸면 신버전 코드가 새 컬럼을 찾는데 DB에는 아직 구형 컬럼만 있어 똑같이 에러가 발생합니다. 2. 해결책 : 확장 앤 컨트랙트 (Expand & Contract / Red-Green) 패턴 이 문제를 해결하는 전 세계 시니어 엔지니어들의 표준 디자인 패턴이 바로 확장(Expand)과 수축(Contract) 패턴 입니다. DB 변경 작업을 한 번에 끝내려 하지 말고, 여러 단계의 호환성 배포 단계 로 쪼개서 진행하는 방식입니다. Phase 1 : Expand (확장 단계 - 컬럼/테이블 추가) 기존 구조를 깨지 않고, 신버전이 필요로 하는 새로운 구조를 확장(추가)합니다. 이때 구버전 코드는 기존 구조를 그대로 사용하므로 장애가 발생하지 않습니다. DB 작업 : 기존 phone 컬럼은 그대로 둔 채, 새로운 mobile_number 컬럼을 추가 합니다. (이때 NOT NULL 제약조건은 걸지 않거나 기본값을 둡니다.) 코드 작업 : 구버전 코드는 손대지 않습니다. Phase 2 : Migrate (데이터 이중화 및 이관 단계) 구조가 확장되면, 기존 데이터를 새로운 구조로 옮겨 담거나 양쪽 모두에 동기화합니다. 동작 방식 : 백그라운드 스크립트나 배치 작업을 통해 기존 phone 데이터들을 읽어 mobile_number 로 복사합니다. 이중 쓰기(Dual Write) : 과도기 동안 앱에서 데이터를 쓸 때 구버전/신버전 모두 대응할 수 있도록 처리합니다. Phase 3 : Transition (신버전 배포 단계) 이제 새로운 구조를 이해하는 신버전 코드를 프로덕션에 배포 합니다. 동작 방식 : 롤링이나 블루-그린 배포를 통해 모든 서버를 신버전(v2)으로 교체합니다. 이제 모든 서버는 새로운 컬럼( mobile_number )을 바라보며 정상적으로 동작합니다. 안정성 : 만약 문제가 생겨도 아직 DB에 구형 컬럼( phone )이 살아있으므로 롤백이 매우 안전합니다. Phase 4 : Contract (수축 단계 - 구형 구조 제거) 신버전이 완전히 안착하고 구버전 코드가 완전히 사라진 것이 확인된 이후에야 구형 구조를 잘라냅니다(Contract). DB 작업 : 이제서야 안전하게 기존 phone 컬럼을 DROP COLUMN 으로 삭제합니다. 완료 : 깔끔하게 새로운 스키마만 남게 됩니다. 3. 실무에서 지켜야 할 DB 마이그레이션 3대 원칙 Breaking Change(파괴적 변경) 금지 컬럼명을 강제로 바꾸거나 삭제( DROP COLUMN , RENAME COLUMN )하는 작업은 신구 버전 공존 환경에서 100% 장애를 유발합니다. 반드시 "추가 ➔ 이관 ➔ 전환 ➔ 삭제" 단계를 거쳐야 합니다. 하위 호환성(Backward Compatibility) 유지 새로운 코드는 "구형 DB 스키마"와 " 신형 DB 스키마 "를 둘 다를 일시적으로 소화할 수 있어야 합니다. (예 : 코드가 컬럼이 없으면 구버전 필드를 대신 읽도록 방어 로직 작성) NOT NULL 제약조건 주의 테이블에 새로운 컬럼을 추가할 때 처음부터 NOT NULL 을 걸어버리면 데이터를 넣지 않는 구버전 서버가 인서트할 때 에러가 발생합니다. 처음에는 NULL 을 허용( DEFAULT NULL )했다가, 모든 서버가 신버전으로 교체된 후 NOT NULL 제약을 추가 해야 합니다. 🎯 요약 무중단 배포 시 데이터 정합성 문제는 "DB 변경을 한 번에 하려다 발생하는 시차 문제"입니다. 코드를 바꾸는 배포 주기와 DB 스키마를 바꾸는 마이그레이션 주기를 분리하고, Expand & Contract 패턴 을 적용하여 구버전과 신버전이 동시에 살아 있는 시간 동안에도 서로 충돌하지 않는 유연한 구조를 만드는 것이 핵심입니다.
3장 폰트 및 이미지 최적화 폰트 최적화하는 이유 폰트 : 웹사이트 디자인에서 중요한 역할이지만, 프로젝트에서 맞춤 폰트 사용 → 폰트 파일을 가져오고 로드해야할 때 성능에 영향 줄 수 있음 커스텀 폰트 사용 시 브라우저는 기본 시스템 폰트로 먼저 글자 보여줌 → 커스텀 폰트 파일 다운로드 완료되면 폰트 교체 이때 글자 크기와 간격 바뀌면서 화면 요소들의 위치가 이동하는 누적 레이아웃 이동 현상 발생 누적 레이아웃 이동(CLS) : 구글이 웹사이트의 성능과 사용자 경험 평가하는데 사용하는 지표 Next.js의 자동 폰트 최적화 방식 Next.js 모듈 사용 시 애플리케이션 내 폰트 자동 최적화, 빌드 시 폰트 파일 다운로드해서 다른 정적 자산과 함께 호스팅 → (성능에 영향 줄 수 있는) 추가 네트워크 폰트 요청 X → 성능 저하 / CLS 현상이 방지됨 CLS = 누적 레이아웃 이동 이미지를 최적화해야 하는 이유 일반 HTML의 태그를 사용할 경우 아래 3가지를 개발자가 수동으로 해결해야함 다양한 화면 크기에 맞춘 가변 반응형 처리 이미지 로딩되면서 주변 레이아웃이 밀려나는 현상 방지 화면에 보이지 않는 위치의 이미지 늦게 로딩하는 지연 로딩 처리 ⇒ 컴포넌트를 사용해 이미지 자동 최적화 가능 컴포넌트 <Image> 컴포넌트 : HTML 태그의 확장, 자동 이미지 최적화가 포함되어 있음 이미지가 로드될 때 자동으로 레이아웃 이동 방지 기능 큰 이미지 → 작은 뷰포트 가진 기기 전송하지 않다록 이미지 크기 조절 기본적으로 이미지 → 게으른 로딩 (이미지가 뷰포트 들어오는 순간 로드됨) 브라우저가 지원할 때 WebP이나 AVIF 같은 현대 포맷의 이미지 제공 <Image> 컴포넌트의 width 와 height 속성 : 화면에 실제 렌더링될 절대적 크기 고정 X, 원본 이미지의 종횡비를 알려주는 값 → 이 비율을 보고 이미지 다 다운로드 되기 전에 자리를 미리 비워서 CLS을 막음 데스크톱 히어로 이미지 추가 레이아웃 이동을 피하려면 이미지의 앤드(and)를 설정하는 것이 좋음 모바일 화면에서는 DOM에서 이미지 제거, 데스크톱 화면에서는 이미지 보여주는 클래스 : hidden md:block /public : 이미지 등 정적 자산 저장 공간