Loading the catalog…
Loading the catalog…
1. 컴퓨터 비전 — 분류, 감지, 분할 컴퓨터는 이미지를 어떻게 볼까 우리는 길거리 사진 한 장을 보자마자 사람, 자동차, 버스, 나무를 알아본다. 어디에 있는지도 알고, 도로와 인도의 경계도 구분한다. 그런데 이 사진의 일부를 16×16으로 확대하면 색점 덩어리다. 컴퓨터에게 처음부터 "버스"나 "도로"라는 의미가 주어지는 게 아니다. 컴퓨터가 입력받는 건 각 픽셀의 색을 나타내는 숫자 값 뿐이다. 그래서 컴퓨터 비전 모델은 이 숫자들 사이에서 반복되는 패턴을 학습하고, 그 패턴으로 물체와 장면의 의미를 예측한다. 이렇게 이미지와 영상에서 의미 있는 정보를 이해하고 추론하게 만드는 분야가 컴퓨터 비전 이다. 같은 이미지, 다른 출력 같은 이미지라도 우리가 무엇을 알고 싶은지에 따라 모델이 내야 할 답이 달라진다. 분류(Classification) — 이미지 전체가 무엇인가? → 도심 도로 감지(Detection) — 무엇이 어디에 있는가? → 물체별 박스 + 클래스 분할(Segmentation) — 각 픽셀이 무엇인가? → 픽셀별 클래스 지도 * 분류는 이미지마다, 감지는 물체마다, 분할은 픽셀마다! * CNN과 특징 추출 세 과제의 파이프라인을 나란히 놓으면 재밌는 게 보인다. 분류 : 입력 이미지 → 특징 추출 → 클래스별 점수 감지 : 입력 이미지 → 특징 추출 → 박스·클래스·신뢰도 분할 : 입력 이미지 → 특징 추출 → 픽셀별 클래스 가운데 "특징 추출"이 셋 다 똑같다. 그리고 이 자리에 들어가는 게 2주차에 배운 CNN 이다. 필터를 슬라이딩하면서 얕은 층에서는 선과 모서리를, 깊은 층에서는 눈이나 바퀴 같은 걸 뽑아내는 그 과정 그대로다. 그러니까 세 과제의 차이는 특징을 뽑는 부분이 아니라, 그 뒤에 무엇을 붙이느냐 에 있다. ┌──────────┐ ──→ 분류기 ──→ "고양이" 입력 이미지 ──→ │ CNN │ ──→ 박스 예측기 ──→ 박스 + 82% └──────────┘ ──→ 디코더 ──→ 픽셀 지도 ↑ Backbone 이렇게 공통으로 쓰이는 앞부분을 Backbone(등뼈) 이라고 부른다. "ResNet은 분류 논문이지만 이후 감지·분할 모델의 특징 추출 Backbone으로도 널리 활용된다" 고 한 것이다. 세 모델이 서로 경쟁하는 게 아니라, ResNet이 앞을 맡고 나머지 둘이 뒤를 맡는 쪽에 가까웠다. 이미지 분류 분류는 미리 정해둔 클래스 중 하나를 고르는 과제다. 클래스 종류와 학습 이미지의 정답은 사람이 준비하고, 모델은 클래스를 구분하는 패턴을 학습한다. 골든 리트리버 사진을 넣으면 이렇게 진행된다. CNN이 특징을 추출한다 클래스별 원점수인 로짓(logits) 을 계산한다 로짓은 아직 확률이 아니다. softmax 를 적용하면 확률로 바뀐다 → 86%, 9%, 3%, 2% 가장 높은 걸 최종 결과로 선택한다 로짓을 보면 음수도 있고 다 더해도 1이 아니다. 그래서 확률이라고 부를 수 없다. softmax를 거치면 전부 양수가 되고 합이 100%가 된다. 네 개를 한꺼번에 계산해서 합이 100%가 되게 맞춰주는 장치가 필요한데, 그게 softmax다. 하는 일은 로지스틱 회귀와 똑같고, 선택지 개수만 늘어난 셈이다. ResNet 그럼 성능을 높이려면 CNN을 계속 깊게 만들면 될까? ResNet 논문이 이 질문에서 출발한다. 왼쪽이 훈련 오차, 오른쪽이 테스트 오차다. 20층과 56층을 비교한 건데 둘 다 56층이 더 높다. 테스트 오차만 높았으면 과적합이라고 할 수 있는데, 훈련 데이터에서도 성능이 떨어졌으니 과적합으로는 설명이 안 된다. 논문은 이걸 degradation problem 이라고 불렀다. ResNet은 이 문제를 shortcut connection 으로 해결했다. 기존: 원하는 출력 H(x)를 통째로 학습 ResNet: 입력과 출력의 차이 F(x) = H(x) − x 만 학습 최종 출력: H(x) = F(x) + x 여기서 x는 원본 사진이 아니라 이전 층에서 전달된 특징 맵 이고, F(x)는 필요한 변화량, 즉 Residual 이다. 필요한 변화가 없으면 F(x)를 0에 가깝게 학습해서 입력 x를 그대로 통과시킬 수 있다. 객체 탐지 감지는 무엇이 있는지뿐 아니라 어디에 있는지 도 예측한다. 모델이 특징을 추출한 뒤 각 물체의 위치를 사각형으로 표시하는데, 이걸 Bounding Box 라고 한다. 그리고 검출된 물체마다 세 가지가 함께 나온다. Bounding Box — 물체를 감싸는 사각형의 위치 클래스 — 그게 무엇인지 (dog, bicycle, car) Confidence Score — 그 예측이 얼마나 확실한지 (82%, 91%, 74%) 분류는 이미지 하나에 답이 하나였는데, 감지는 한 이미지에서 여러 물체에 대한 결과 가 나온다. YOLO 대표적인 감지 모델인 YOLO 다. You Only Look Once의 약자다. 이미지 크기 조정 — 네트워크에 맞게 고정 크기로 변환 한 번의 Forward Pass — 하나의 CNN이 전체 이미지를 한 번 처리해서 여러 박스와 클래스를 동시에 예측 NMS — 같은 물체를 가리키는 중복 박스를 정리 YOLO의 핵심은 후보 영역을 따로 만들고 영역별로 분류하는 과정을 나누지 않고, 하나의 네트워크로 직접 예측한다 는 점이고 그래서 빠르다. 2016년에 나온 최초 버전인 YOLOv1은 이미지를 7×7 격자 로 나눈다. 이미지를 여러 칸으로 나눈다 정답 박스의 중심점이 들어 있는 셀이 그 물체를 담당한다 각 셀은 여러 박스 후보와 신뢰도, 클래스 확률을 예측한다 2번에서는 박스 전체가 한 셀 안에 들어갈 필요가 없고, 중심만 있으면 그 셀이 책임진다. --> 여러 셀이 같은 물체를 두고 겹치지 않음. 다만 YOLOv1은 작은 물체나 서로 가까이 있는 물체를 감지하는 데 한계 가 존재함. 이미지 분할 감지는 위치를 사각형으로 표현한다. 그런데 세포처럼 정확한 형태와 경계까지 구분해야 하면 사각형만으로는 부족하다. 이때 쓰는 게 분할 이다. 왼쪽이 현미경 원본이고 오른쪽이 분할 마스크다. 흰색이 세포, 검은색이 배경이다. 감지는 물체를 사각형 으로 찾고, 분할은 물체의 실제 모양 을 픽셀 단위로 구분한다. 그래서 세포의 면적이나 정확한 경계를 분석할 때 유용하다고 한다. U-Net — Encoder–Decoder와 Skip Connection 분할 모델인 U-Net 은 이름 그대로 전체 구조가 알파벳 U자 모양이라 붙은 이름이다. Encoder (왼쪽) — 해상도를 줄이면서 더 넓은 영역의 정보를 모아, 이미지에 무엇이 있는지 판단할 문맥을 학습 Decoder (오른쪽) — 낮아진 해상도를 다시 높여 픽셀별 분할 지도를 만든다 그런데 해상도를 줄이는 과정에서 세밀한 위치와 경계 정보가 약해진다. 이걸 보완하려고 쓰는 게 가로 방향의 Skip Connection 이다. 인코더의 고해상도 특징을 대응하는 디코더 단계로 직접 전달해서 결합한다. Resnet과 U-net의 차이점(우회연결) ResNet은 블록의 입력을 변한 결과에 "더하고", U-Net은 인코더의 특징을 디코더 특징과 "이어 붙인다." 세 모델 정리 모델 ResNet YOLO U-Net 대표 과제 분류 감지 분할 핵심 아이디어 Residual Connection 단일 단계 동시 예측 Encoder–Decoder, Skip Connection 출력 단위 이미지별 클래스 물체별 박스·클래스 픽셀별 클래스 대표 평가 지표 Accuracy, Top-1/Top-5 Error IoU, mAP IoU, Dice 셋 다 CNN 기반이지만 푸는 문제와 출력 형태가 다르다. 그리고 ResNet은 분류 논문이지만 이후 감지·분할 모델의 특징 추출 Backbone으로도 널리 쓰인다 고 한다. 2. NLP 기초 — 임베딩과 RNN 문장을 숫자로 바꾸기 자연어 처리의 첫 단계는 텍스트를 숫자로 바꾸는 것이다. 신경망은 숫자 텐서를 입력으로 처리하기 때문에 텍스트를 수치 표현으로 변환해야 한다. 일반적인 흐름은 세 단계다. 1. 토큰화 — 문장을 처리 단위로 나눔 2. 토큰 ID — 각 토큰에 번호를 부여 3. 벡터 표현 — 숫자 벡터로 변환 원-핫 인코딩과 한계 초기에 많이 쓰던 방식이 원-핫 인코딩 이다. 어휘 집합의 크기를 벡터 차원으로 정하고, 해당 단어의 위치만 1로 표시한다. 어휘가 5개라면 → 고양이 = [0, 1, 0, 0, 0] 단순한데 한계가 세 가지 있다. 차원 증가 — 어휘가 커질수록 벡터도 길어진다 희소성 — 대부분의 값이 0이다 의미 관계 부재 — 비슷한 단어도 서로 다른 값으로만 표현된다 임베딩 이걸 보완하는 게 임베딩 이다. 각 토큰을 고정된 길이의 실수 벡터 로 바꾸는 방법이다. 강아지 [ 0.21, 0.75, −0.18, ...] 고양이 [ 0.24, 0.70, −0.12, ...] 자동차 [−0.61, 0.08, 0.53, ...] 강아지와 고양이는 숫자가 서로 비슷하고, 자동차만 부호까지 다르다. 비슷한 문맥에서 사용한 단어는 벡터 공간에서도 가까워질 수 있다 는 게 이런 뜻이었다. 비교 원-핫 임베딩 벡터 크기 어휘 수만큼 큼 작게 설정 가능 값의 형태 대부분 0 실수로 채워진 밀집 벡터 단어 관계 표현하기 어려움 거리로 비교 가능 한 가지 더 나온 게 정적 임베딩과 문맥적 임베딩 의 차이다. Word2Vec 같은 정적 임베딩은 한 단어에 벡터 하나 만 쓴다. 그래서 여러 의미를 가진 단어를 문맥마다 다르게 표현하기 어렵다. 이후 등장한 문맥적 임베딩은 문장에 따라 표현을 다르게 생성 할 수 있다고 한다. Word2Vec — CBOW와 Skip-gram Word2Vec 은 주변 단어와 중심 단어의 예측 관계를 이용해 단어 임베딩을 학습하는 방법이다. 같은 문장 나는 [영화를] 좋아한다 를 두고 방향이 반대다. CBOW — 주변 단어로 중심 단어를 예측 입력: 나는, 좋아한다 정답: 영화를 Skip-gram — 중심 단어로 주변 단어를 예측 입력: 영화를 정답: 나는, 좋아한다 학습 결과로 비슷한 문맥에서 사용되는 단어는 비슷한 벡터를 갖게 된다. 장점이 인상적이었다. 별도의 라벨링 없이 문장 속 중심 단어와 주변 단어의 관계를 그대로 학습 신호로 쓸 수 있다 는 것이다. 따라서 사람이 정답을 일일이 붙여줄 필요가 없다. 문장에서 순서가 중요한 이유 여기까지는 단어 하나하나를 숫자로 바꾸는 얘기였다. 그런데 문장의 의미를 이해하려면 순서도 중요하다. 내가 빵을 먹었다. 빵이 나를 먹었다. 사용한 단어가 같아도 순서가 바뀌면 의미가 달라진다. 구조 정보 처리 방식 문장 처리에서의 특징 순방향 신경망 입력 → 출력 방향으로 계산 이전 시점의 내부 상태를 다음 시점으로 순환 전달 X RNN 이전 상태를 현재 입력과 함께 사용 앞에서 읽은 정보를 다음 시점으로 전달 RNN과 은닉 상태 RNN 은 현재 입력과 이전 은닉 상태를 결합해 새로운 은닉 상태를 계산한다. 핵심 구조는 세 가지다. 현재 입력 x_t — 현재 시점에 들어오는 단어의 임베딩 이전 상태 h_t−1 — 이전 시점까지 처리한 정보의 요약 새로운 상태 h_t — 현재 단어까지 반영해 다음 시점으로 전달 "이 영화는 정말 재미있다"를 처리한다면, 재미있다 를 읽을 때 그 단어만 보는 게 아니라 앞에서 처리한 이 영화는 정말 의 정보가 은닉 상태를 통해 함께 전달된다. 그리고 각 시점에서 같은 가중치를 공유하되 은닉 상태 값만 달라진다. CNN에서 필터를 공간 방향으로 공유했다면, RNN은 시간 방향으로 공유하는 셈이다. 참고로 은닉 상태가 문장을 글자 그대로 저장하는 건 아니다. 제한된 길이의 벡터 안에 필요한 정보를 압축 해서 담는다. RNN의 입출력 구조 구조 설명 예시 일대일 입력 1개 → 출력 1개 이미지 분류 다대일 입력 시퀀스 → 출력 1개 문장 감성 분석 일대다 입력 1개 → 출력 시퀀스 이미지 캡셔닝 다대다 입력 시퀀스 → 출력 시퀀스 주식 가격 예측 같은 RNN인데 어디서 출력을 뽑느냐만 바꾸면 전혀 다른 과제 가 된다. RNN의 문제점 1. 장기 의존성 학습의 어려움 멀리 떨어진 단어 사이의 관계를 은닉 상태에 오래 유지하기 어렵다. 관련된 학습 문제가 기울기 소실과 폭발 인데, 소실되면 먼 시점의 학습이 어려워지고 폭발하면 학습이 불안정해진다. "나는 아침에 우산을 챙겨 학교에 갔습니다. 오후에 비가 오자 그것 을 펼쳤습니다." 마지막 문장의 '그것'이 뭔지 알려면 앞부분의 '우산'을 기억해야 하는데, 문장이 길어지면 앞부분 정보가 여러 은닉 상태를 반복해서 거치면서 영향이 점점 약해진다. 2. 병렬화 어려움 이전 시점의 은닉 상태가 계산되어야 다음 시점을 처리할 수 있다. 긴 시퀀스에서는 학습 시간이 늘어난다. BPTT RNN은 BPTT(Backpropagation Through Time) 로 학습한다. RNN을 시간축으로 펼친 뒤 오차를 앞 시점으로 전달하는 방법이다. 1. 순전파 — 앞에서부터 예측 계산 2. 손실 계산 — 예측과 정답의 차이 측정 3. 역전파 — 오차를 앞 시점으로 전달하여 가중치 수정 긴 문장에서 생기는 문제는 두 가지다. 학습 신호가 앞부분까지 충분히 전달되지 않을 수 있고, 기울기가 지나치게 작아지거나 커질 수 있다. 2주차 CNN에서 층을 깊게 쌓았을 때 기울기 소실이 생겼던 것과 같은 문제인데, CNN은 공간 방향으로 깊어져서, RNN은 시간 방향으로 길어져서 생긴다는 게 차이다. LSTM과 세 가지 게이트 이 문제를 완화하려고 나온 게 LSTM 이다. 셀 상태와 게이트를 이용해 긴 의존 관계를 더 잘 학습하도록 돕는다. 셀 상태 c_t — 중요한 정보를 비교적 오래 전달하는 경로 은닉 상태 h_t — 현재 출력과 다음 시점에 사용할 정보 게이트 무엇을 결정하는가? 결과 망각 게이트 무엇을 남길까? 이전 정보 유지·삭제 입력 게이트 무엇을 저장할까? 새로운 정보 반영 출력 게이트 무엇을 사용할까? 현재 은닉 상태 생성 게이트는 0과 1 사이 값을 만들어 정보가 통과하는 비율을 조절하는 구조다. 수도꼭지를 여닫는 것처럼 생각하면 될 것 같다. 장점은 기본 RNN보다 긴 의존 관계 학습에 유리하다는 것이고, 한계는 계산 구조가 복잡 하다는 것이다. GRU와 두 가지 게이트 GRU 는 LSTM을 단순화한 게이트 구조다. 별도의 셀 상태 없이 은닉 상태와 두 게이트로 정보의 유지와 갱신을 조절한다. 업데이트 게이트 z_t — 이전 정보와 새 정보를 얼마나 반영할지 결정 리셋 게이트 r_t — 새 상태를 만들 때 과거 정보를 얼마나 반영할지 결정 LSTM보다 구조가 단순하고 같은 은닉 크기에서는 일반적으로 파라미터 수가 적다. 다만 단순하다고 항상 빠르거나 정확한 건 아니고 , 실제 성능은 데이터와 과제에 따라 달라진다고 한다. 전체 흐름 정리 1. 토큰화 이 / 영화는 / 재미있다 2. 토큰 ID 5 / 91 / 13 3. 임베딩 x1 / x2 / x3 4. RNN 계열 순서대로 h(t) 갱신 5. 출력층 긍정 0.93 임베딩 — 토큰을 단어의 특징을 나타내는 작은 숫자 벡터로 변환 RNN — 이전 정보를 전달해 단어의 순서와 문맥을 반영 LSTM과 GRU — 게이트로 필요한 정보를 조절해 장기 의존성 문제를 완화 3. Attention과 Transformer its는 무엇을 가리킬까 The Law will never be perfect, but its application should be just — this is what we are missing, in my opinion. 여기서 its 가 뭘 가리킬까? 답은 Law 다. 우리는 이걸 금방 안다. 그런데 어떻게 알았을까? its 라는 단어만 따로 보면 "그것의"라는 뜻뿐이라 아무 정보가 없다. 문장 전체를 봐야만 알 수 있고, 심지어 뒤에 나오는 단어들까지 봐야 확신할 수 있다. 사람은 이걸 순식간에 하는데 컴퓨터한테는 정말 어려운 문제였다고 한다. 문장이 길어지고 가리키는 대상에서 멀어질수록 앞에 뭐가 있었는지 기억을 못 한다. 멀리 떨어진 단어끼리 관련이 있다는 걸 어떻게 알아낼 수 있을까? 이 질문에서 시작한 게 Attention과 Transformer다. 과거 시퀀스 모델들의 발전 과정 RNN — 순서를 다루게 됐지만 주요 특징 순환 구조로 시간적 순서를 반영하고, 과거의 정보를 현재에 반영할 수 있게 됨 문제점 반복에 따라 과거 정보가 전해지긴 하지만 기울기 소실로 점점 흐려짐 (장기 의존성 문제) 문장을 순차적으로 입력해서 병렬화 불가 LSTM — 기억을 조절했지만 주요 특징 Cell state와 게이트로 "기억할 것"과 "잊을 것"을 조절 RNN보다 오래된 정보를 안정적으로 유지 → 기울기 소실 문제 완화 문제점 게이트 구조 때문에 파라미터가 늘어나 계산이 더 무거움 여전히 단어를 순서대로 하나씩 처리해야 함 → 병렬화 불가능이라는 근본적 한계는 그대로 Seq2Seq — 번역을 가능하게 했지만 I am a person → 저는 사람입니다 처럼 입력과 출력 길이가 다른 작업을 위해 나온 구조다. 인코더가 입력 문장을 읽어 하나의 Context Vector 로 압축하고, 디코더가 그 벡터를 받아 출력 문장을 순서대로 생성한다. 문제점 병렬화 불가능은 그대로 더 치명적인 건, 문장 전체 정보를 벡터 하나에 다 욱여넣어야 해서 문장이 길어지면 초반 정보가 소실 된다는 것 결국 RNN의 한계가 재발한 셈이다. 이걸 해결하려고 나온 게 Attention 이다. RNN : 순서를 다룰 수 있게 됐다 → 멀리 못 보고, 느리다 LSTM : 멀리 볼 수 있게 됐다 → 여전히 순차 처리라 느리다 Seq2Seq : 길이가 달라도 되게 됐다 → 벡터 하나에 압축하는 병목 Attention이 무엇인가 Attention이란 입력 문장의 모든 정보를 균일하게 보는 대신, 필요한 부분만 선택적으로 집중해서 참고하는 방법 --> "필요한 정보에, 필요한 만큼 집중하기" Query와 모든 Key의 유사도를 계산해서, 관련도 높은 Key의 Value를 더 많이 반영한다 문장이 길어도 필요한 정보에만 집중할 수 있다 Query, Key, Value 역할 도서관에서는 Query 어떤 것을 찾고 싶은가? 검색어 Key 나는 무엇을 갖고 있는가? 색인 카드 Value 실제로 무엇을 전달하는가? 실제 내용물 작동 원리는 세 단계다. 1. 주어진 쿼리에 대해 모든 키와의 유사도를 각각 구한다 2. 구한 유사도를 키와 매핑되어 있는 각각의 값에 반영한다 3. 유사도가 반영된 값을 모두 더하여 리턴 ⇒ Attention Value 실제 모델에서는 이렇게 대응된다. Query = t 시점의 디코더 셀에서의 은닉 상태 Key / Value = 모든 시점의 인코더 셀의 은닉 상태들 K와 V를 왜 나누는지 처음엔 몰랐는데, 찾을 때 쓰는 건 제목이고 실제로 읽는 건 본문 이라고 생각하니 조금은.. 이해가... Transformer 구조 개요 원래 Attention은 RNN 위에 얹어서 디코더가 필요한 부분을 더 들여다보게 만드는 보조 장치 였다. 그런데 2017년 구글 논문에서 한 발 더 나아갔다. RNN이나 CNN을 완전히 다 빼버리고 Attention만으로 시퀀스를 처리하면 어떨까? 그렇게 나온 게 Transformer 다. 논문 제목이 "Attention Is All You Need"인 것도 이 뜻이다. RNN/CNN 없이 순환구조와 합성곱 구조를 완전히 배제한, 순수 Attention만으로 구성된 시퀀스 모델 질적으로 우수하면서도 병렬화가 용이하고 훈련시간도 크게 단축 구조 Encoder–Decoder 구조, 각각 N=6개 층 반복 Encoder — 입력 문장을 문맥이 반영된 표현으로 변환 Decoder — Encoder의 출력을 참고해 출력 문장을 순차적으로 생성 Self-Attention 인코더·디코더 내부의 Attention은 Q, K, V가 모두 자기 문장에서 나온다. 그래서 문장 안에서 단어끼리 관계를 파악하고, 이게 RNN의 역할을 대체 한다. 단, 디코더 중간의 Attention만 Q는 디코더, K/V는 인코더 로 다르다. 왜 이 구조가 좋은가 n = 문장 길이, d = 임베딩 차원, k = 커널 크기 Self-Attention은 병렬 연산과 최단 경로를 동시에 확보한다. RNN은 병렬화도 O(n)이고 경로 길이도 O(n)이다. 즉 문장이 길어지는 만큼 처리 시간도 늘고, 첫 단어가 마지막 단어까지 가는 데 그만큼 단계를 거쳐야 한다. Self-Attention은 둘 다 O(1) 이다. 모든 단어를 동시에 계산하고, 어떤 두 단어든 한 번에 연결된다.
What RADAR observed and classified to build this opportunity. It is what the source published, not a verification that the offer is still active.
[Synapse 3기] 3주차 세션 복습 — 컴퓨터 비전 / NLP 기초 / Transformer. 1. 컴퓨터 비전 — 분류, 감지, 분할 컴퓨터는 이미지를 어떻게 볼까 우리는 길거리 사진 한 장을 보자마자 사람, 자동차, 버스, 나무를 알아본다. 어디에 있는지도 알고, 도로와 인도의 경계도 구분한다. 그런데 이 사진의 일부를 16×16으로 확대하면 색점 덩어리다. 컴퓨터에게 처음부터 "버스"나 "도로"라는 의미가 주어지는 게 아니다. 컴퓨터가 입력받는 건 각 픽셀의 색을 나타내는 숫자 값 뿐이다. 그래서 컴퓨터 비전 모델은 이 숫자들 사이에서 반복되는 패턴을 학습하고, 그 패턴으로 물체와 장면의 의미를 예측한다. 이렇게 이미지와 영상에서 의미 있는 정보를 이해하고 추론하게 만드는 분야가 컴퓨터 비전…
Open source