전체 글 50

LeNet-5 (Architecture 및 클래스 구현)

LeNet-5는 합성곱 신경망이라는 개념을 최초로 개발한 얀 크룬이 개발한 CNN 구조이다. ABSTRACT LeNet-5는 수표에 쓴 손글씨를 인식하는 딥러닝 구조로 발표되었다. LeNet에는 여러 버전이 있는데, 그중에 최종 버전인 LeNet-5이다. 모델 구조는 합성곱층과 다운 샘플링층(풀링)을 반복적으로 지나고 마지막엔 완전 연결층을 연결하여 연산을 수행한다. 이 모델이 현재 CNN의 초석이 되었다. LeNet-5 Architecture LeNet-5 구조를 차례로 살펴보자. (C: convolution layer, S: pooling layer, F: fully-connected layer) C1: 5x5 합성곱 연산을 통해 28x28 크기의 feature maps 6개를 생성한다. S2: 6개..

전이 학습 (Transfer Learning)

보통 합성곱 신경망(CNN) 같은 경우 이미지를 사용하여 훈련시킨다. 그렇기 때문에 딥러닝 모델을 훈련시키려면 방대한 양의 데이터가 필요하고 데이터셋을 구하는 것도 쉽지 않다. 그렇기 때문에 이러한 문제점을 해결하고자 만든 것이 바로 전이 학습이다. 예를 들면 Imagenet( 영상 인식 기술의 평가하는 이미지 셋으로 클래스 2만개와 이미지 총 1419만 7122장으로 되어있다. )과 같은 방대한 양의 이미지를 사용하여 훈련된 모델의 가중치를 가져와 사용하려는 모델에 맞게 어느 정도 보정하여 사용하는 것을 의미한다. 그렇기 때문에 충분하지 못한 이미지 데이터로도 어느 정도의 성능을 내는 기법이다. 전이 학습은 두 가지의 방식이 있다. 1. 특성 추출 기법 특성 추출 기법은 사전 훈련된 모델을 가져와 학습..

합성곱 신경망 (Convolutional Neural Network, CNN) 개념 및 구조

합성곱 신경망은 이미지나 영상을 처리할 때 많이 사용되는 신경망입니다. 합성곱 신경망을 사용할 때 이미지를 한 번에 계산하는 것이 아닌 국소적인 부분을 계산함으로써 시간과 자원을 줄이고 이미지의 특징을 파악할 수 있는 신경망입니다. Convolutional Neural Network Architecture CNN은 다음과 같이 크게 5개의 층으로 나눌 수 있다. 앞의 세 개의 층은 Feature Extraction을, 뒤의 두 개의 층은 Classification을 위한 층으로 구분할 수 있다. 이제 각각의 층이 어떤 역할을 하는지 자세하게 알아보자! 1. 입력층 (Input Layer) 이미지 데이터가 입력되는 층으로 높이, 너비, 채널로 구성된 3차원 데이터가 입력됩니다. 여기서 채널은 그레이 스케일..

OpenPose: Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields 논문 리뷰

세계 최대의 컴퓨터 비전 및 패턴 인식 컨퍼런스 CVPR에서 2017년 미국 카네기 멜론 대학교에서 개발한 모델이다. Abstract 여러 사람들의 2D 포즈를 실시간으로 추정할 수 있는 방식을 제안한다. 특히 PAF(Part Affinity Fields)라는 비모수 표현을 이용하여 사람의 신체 부위를 연결하는 Bottom-up 방식을 사용해 정확도를 높이고, 추론 시간 단축한 것이 특징이다. - 이미지에서 여러 사람들의 포즈를 추론할 때 해결해야 하는 문제들이 있다. 첫째, 각 이미지에는 위치나 크기 관계없이 알 수 없는 수의 사람들이 포함될 수 있다. 둘째, 사람 사이의 상호작용은 접촉, 교합 등으로 인해 복잡한 자세로 인해 관절마다 간섭이 생겨 관절 연결을 어렵게 만든다. 셋째, 이미지에 있는 사람..

MediaPipe Framework Concepts

1. The Basics 1) Packet 기본 데이터 흐름 단위로 timestamp에서 각 입력 스트림을 따라 단일 packet이 전송된다. Packet에는 모든 종류의 데이터가 포함될 수 있다. 자세히 알아보기 Packets Cross-platform, customizable ML solutions for live and streaming media. google.github.io 2) Graph MediaPipe processing은 노드 간의 패킷 이동을 graph에서 결정한다. Graph에서 node의 유형 입력과 출력 그리고 데이터 흐름의 병합과 분할을 정의한다. 자세히 알아보기 Graphs Cross-platform, customizable ML solutions for live and st..

프로토콜 버퍼

프로토콜 버퍼(Protocol Buffers, protobuf)란? 프로토콜 버퍼는 구글에서 구조화된 데이터를 직렬화하기 위해 공개한 오픈소스 언어이다. 줄여서 protobuf 혹은 pd라고 부르며, Java, Python, Objective-C 및 C++ 등 다양한 언어를 지원한다. 직렬화란 데이터를 파일로 저장하거나 네트워크 통신에 사용하기 위한 형식인 바이트 스트림 형태로 변환하는 것이다. json과 protobuf 비슷한 데이터 형식으로 json이 있다. 보통 데이터를 교환할때 json 형태를 많이 사용하지만 프로토콜 버퍼를 이용하는 이유는 처리 속도가 빠르고 직렬화된 파일의 크기도 월등히 줄일 수 있어, 대용량 데이터 처리에 용이하다. 그 대신 바이너리 데이터로 표현되기 때문에 사람이 직접 확인..

MediaPipe란 무엇인가?

MediaPipe란? Google에서 제작한 AI 프레임워크로 이미지 혹은 영상 등과 같은 데이터를 처리하기 위한 기계 학습 파이프라인을 제공한다. API를 제공하여 쉽게 사용할 수 있고 다양한 언어를 지원하며, android나 ios처럼 모바일 환경이나 Web 환경에서 또한 구현 가능하다. 다른 ML 프레임워크랑은 달리 최소한의 리소스만으로 필요로 한다 MediaPipe엔 여러 장점이 있다. MediaPipe 강점 1. End-to-End 가속: 내장된 빠른 ML model inference 및 processing이 일반 하드웨어에서도 최적화되어 있다. 2. 한 번 빌드로 어디서나 배포: Android/iOS, 데스크톱/클라우드, 웹 및 IoT 전반에 걸쳐 작동하는 통합 솔루션을 제공한다. 3. 준비된..

tensorflow를 이용한 기초 딥러닝

텐서플로의 기존 1 버전의 불편했던 문법을 개선하여 만들어진 텐서플로 2를 이용하여 딥러닝 모델을 구현해보려고 한다. 1. 데이터 준비 데이터는 이미지, 텍스트, 오디오 등 다양한 종류가 있다. 데이터의 종류가 많은 만큼 데이터셋을 불러오는 방법도 다양하다. 임의 데이터셋을 사용하는 방법 import tensorflow as tf x = np.random.sample((100,3)) # (100,30) 형태의 무작위 난수 생성 data = tf.data.Dataset.from_tensor_slices(x) # 난수 데이터를 list 형식으로 대입 텐서플로 & 케라스에서 제공하는 데이터셋 사용 import tensorflow-datasets as tfds from keras.datasets import m..

(백준) 2108 통계학 Python 파이썬

문제 수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자. 산술평균 : N개의 수들의 합을 N으로 나눈 값 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값 최빈값 : N개의 수들 중 가장 많이 나타나는 값 범위 : N개의 수들 중 최댓값과 최솟값의 차이 N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오. 입력 첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다. 출력 첫째 줄에는 산술평균을 출력한다. 소수점 이하 ..

(백준) 10989번 수 정렬하기 3 Python 파이썬

문제 M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오. 입력 첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다. 출력 첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다. 문제 풀이 import sys arr=[0]*10001 N = int(sys.stdin.readline().rstrip()) for i in range(N): arr[int(sys.stdin.readline().rstrip())]+=1 for i in range(1,10001): if(arr[i]!=0): for j in range(arr[i]): sys.stdout.write("%s\n..