실전! 텐서플로 2를 활용한 딥러닝 컴퓨터 비전

텐서플로 2.0과 케라스를 활용한 강력한 이미지 처리 애플리케이션 만들기

《실전! 텐서플로 2를 활용한 딥러닝 컴퓨터 비전》은 컴퓨터 비전과 딥러닝의 기본 원리를 시작으로 신경망을 처음부터 구축하는 방법을 알려준다. 사용하기 쉬운 케라스 인터페이스와 함께 텐서플로를 가장 널리 사용되는 AI 라이브러리로 만들어준 기능을 살펴보고 CNN을 효율적으로 구축, 훈련, 배포해 본다. 구체적인 코드 예제를 통해 Inception, Resnet 같은 최신 솔루션으로 이미지를 분류하고 YOLO(You Only Look Once), Mask R-CNN, U-Net을 사용해 특정 콘텐츠를 추출하는 방법을 보여준다. 또 이미지 생성 및 편집을 위해 GAN(Generative Adversarial Networks)과 VAE (Variational Auto-Encoder)를 구축하고 동영상 분석을 위해 LSTM을 구축한다. 그 과정에서 다른 주요 개념 중에서 전이 학습, 데이터 보강, 도메인 적응, 모바일 및 웹 배포에 관한 깊은 통찰력을 얻게 될 것이다.

★ 이 책에서 다루는 내용 ★

  • 신경망을 처음부터 생성하기
  • Inception과 ResNet을 포함한 최신 아키텍처로 이미지 분류하기
  • YOLO, Mask R-CNN, U-Net으로 이미지에서 객체를 탐지하고 분할하기
  • 자율주행차와 얼굴 표정 인식 시스템 개발에 따르는 문제 해결하기
  • 전이학습, GAN, 도메인 적응 기법으로 애플리케이션 성능 개선하기
  • 동영상 분석을 위해 순환 신경망 사용하기
  • 각자 생성한 신경망을 모바일 기기와 브라우저에 맞게 최적화하고 배포하기

벤자민 플랜치(Benjamin Planche)

벤자민 플랜치는 파사우 대학교(University of Passau)와 지멘스(Siemens Corporate Technology)에 몸 담고 있는 박사 과정 학생이다. 그는 컴퓨터 비전과 딥러닝 분야에서 5년 넘게 전 세계 다양한 연구소(프랑스 LIRIS, 일본 미쓰비시 전기, 독일 지멘스)에서 일해 왔다. 벤자민은 프랑스 리옹에 위치한 INSA-Lyon과 독일 파사우 대학교에서 두 개의 석사 학위를 우수한 성적으로 취득했다. 산업 응용 분야에서 적은 데이터로 더 스마트한 시각 시스템을 개발하는 데 중점적으로 노력을 기울이고 있으며, 자신의 지식과 경험을 StackOverflow와 같은 온라인 플랫폼에서 공유하거나 이 지식을 적용해 아름다운 작품을 만들어 보여주기도 한다.

엘리엇 안드레스(Eliot Andres)

엘리엇 안드레스는 프리랜서로 일하고 있는 딥러닝, 컴퓨터 비전 엔지니어다. 이 분야에서 3년 이상의 경력을 쌓았으며 은행, 의료, 소셜 미디어, 동영상 스트리밍 같은 다양한 산업에 자신의 기술을 적용했다. 엘리엇은 파리 기술 대학 École des Ponts와 Télécom에서 이중 석사 학위를 받았다. 비즈니스 문제에 새로운 기술을 적용함으로써 가치를 제공하는 산업화에 관심을 갖고 있으며, 블로그에서 기사를 게시하고 최신 기술을 사용해 프로토타입을 제작하면서 최신의 기술을 지속적으로 받아들이고 있다.

김정인

현재 기업 빅데이터 전략팀에서 근무하고 있다. 옮긴 책으로는 《케라스로 구현하는 고급 딥러닝 알고리즘》 《실전! Core ML을 활용한 머신러닝 iOS 앱 개발》 《실전활용! 텐서플로 딥러닝 프로젝트》 《마이크로소프트 봇 프레임워크 프로그래밍》 《애자일 데이터 과학 2.0》 《구글 애널리틱스 완벽 가이드》 《파이썬 데이터 사이언스 핸드북》 《러닝 스칼라》가 있다.

  • [01부] 컴퓨터 비전에 적용한 텐서플로 2와 딥러닝
    • ▣ 01장: 컴퓨터 비전과 신경망
      • 기술적 요구사항
      • 컴퓨터 비전
        • 컴퓨터 비전 소개
        • 주요 작업 및 애플리케이션
      • 컴퓨터 비전의 약력
        • 최초 성공을 위한 첫 걸음
        • 딥러닝의 출현
      • 신경망 시작하기
        • 신경망 구성하기
        • 신경망 훈련시키기
      • 요약
      • 질문
      • 참고 문헌
      •  
    • ▣ 02장: 텐서플로 기초와 모델 훈련
      • 기술적 요구사항
      • 텐서플로 2와 케라스 시작하기
        • 텐서플로 소개
        • 케라스를 사용한 간단한 컴퓨터 비전 모델
      • 텐서플로 2와 케라스 자세히 알아보기
        • 핵심 개념
        • 고급 개념
      • 텐서플로 생태계
        • 텐서보드
        • 텐서플로 애드온과 텐서플로 확장
        • 텐서플로 라이트와 TensorFlow.js
        • 모델 실행 장소
      • 요약
      • 질문
      •  
    • ▣ 03장: 현대 신경망
      • 기술 요구사항
      • 합성곱 신경망의 발견
        • 다차원 데이터를 위한 신경망
        • CNN 작업
        • 유효 수용 영역
        • 텐서플로로 CNN 구현하기
      • 훈련 프로세스 개선
        • 현대 네트워크 최적화 기법
        • 정규화 기법
      • 요약
      • 질문
      • 참고 문헌
      •  
  • [02부] 전통적인 인식 문제를 해결하는 최신 솔루션
    • ▣ 04장: 유력한 분류 도구
      • 기술 요구사항
      • 고급 CNN 아키텍처의 이해
        • VGG, 표준 CNN 아키텍처
        • GoogLeNet, Inception 모듈
        • ResNet – 잔차 네트워크
      • 전이학습 활용
        • 개요
        • 텐서플로와 케라스로 전이학습 구현
      • 요약
      • 질문
      • 참고 문헌
      •  
    • ▣ 05장: 객체 탐지 모델
      • 기술 요구사항
      • 객체 탐지 소개
        • 배경
        • 모델 성능 평가
      • 빠른 객체 탐지 알고리즘 – YOLO
        • YOLO 소개
        • YOLO로 추론하기
        • YOLO 훈련시키기
      • Faster R-CNN – 강력한 객체 탐지 모델
        • Faster R-CNN의 일반 아키텍처
        • Faster R-CNN 훈련
        • 텐서플로 객체 탐지 API
      • 요약
      • 질문
      • 참고 문헌
      •  
    • ▣ 06장: 이미지 보강 및 분할
      • 기술 요구사항
      • 인코더-디코더로 이미지 변환
        • 인코더-디코더 소개
        • 기본 예제 – 이미지 노이즈 제거
        • 합성곱 인코더-디코더
      • 의미론적 분할 이해하기
        • 인코더-디코더를 사용한 객체 분할
        • 더 까다로운 인스턴스 분할
      • 요약
      • 질문
      • 참고 문헌
      •  
  • [03부] 컴퓨터 비전의 고급 개념 및 새 지평
    • ▣ 07장: 복합적이고 불충분한 데이터셋에서 훈련시키기
      • 기술 요구사항
      • 효율적인 데이터 제공
        • 텐서플로 데이터 API 소개
        • 입력 파이프라인 구성
        • 입력 파이프라인 최적화 및 모니터링
      • 데이터가 부족하면 어떻게 처리할까?
        • 데이터셋 보강
        • 합성 데이터셋 렌더링하기
        • 도메인 적응과 생성 모델(VAE와 GAN) 활용
      • 요약
      • 질문
      • 참고 문헌
      •  
    • ▣ 08장: 동영상과 순환 신경망
      • 기술 요구사항
      • RNN 소개
        • 기본 형식
        • RNN에 대한 일반적인 이해
        • RNN 가중치 학습
        • 장단기 메모리 셀
      • 동영상 분류
        • 컴퓨터 비전을 동영상에 적용하기
        • LSTM으로 동영상 분류하기
      • 요약
      • 질문
      • 참고 문헌
      •  
    • ▣ 09장: 모델 최적화 및 모바일 기기 배포
      • 기술 요구사항
      • 계산 및 디스크 용량 최적화
        • 추론 속도 측정하기
        • 모델 추론 속도 개선하기
        • 모델이 여전히 느린 경우
        • 모델 크기 축소
      • 온디바이스 머신러닝
        • 온디바이스 머신러닝의 고려사항
        • 실용적인 온디바이스 컴퓨터 비전
      • 애플리케이션 예제 – 얼굴 표정 인식
        • MobileNet 소개
        • 모델을 기기에 배포하기
      • 요약
      • 질문
      •  
    • ▣ [부록]
      •  
      • 텐서플로 1.x에서 마이그레이션하기
        • 자동 마이그레이션
        • 텐서플로 1 코드 마이그레이션하기
      •  
      • 참조
        • 1장 컴퓨터 비전과 신경망
        • 2장 텐서플로 기초와 모델 훈련
        • 3장 현대 신경망
        • 4장 유력한 분류 도구
        • 5장 객체 탐지 모델
        • 6장 이미지 보강 및 분할
        • 7장 복합적이고 불충분한 데이터셋에서 훈련시키기
        • 8장 동영상과 순환 신경망
        • 9장 모델 최적화 및 모바일 기기 배포
      •  
  • 22쪽, 페이지 하단의 예제 코드를 다음 코드로 교체(activation_function 함수명 변경)

    import numpy as np
    
    class Neuron(object):
        """간단한 전방 전달 인공 뉴런.
        Args:
            num_inputs (int): 입력 벡터 크기 / 입력 값 개수.
            activation_fn (callable): 활성화 함수.
        Attributes:
            W (ndarray): 각 입력에 대한 가중치.
            b (float): 편향값, 가중합에 더해짐
            activation_fn (callable): 활성화 함수.
        """
    
        def __init__(self, num_inputs, activation_fn):
            super().__init__()
            # 랜덤값으로 가중치 벡터와 편향값을 초기화함:
            self.W = np.random.rand(num_inputs)
            self.b = np.random.rand(1)
            self.activation_fn = activation_fn
    
        def forward(self, x):
            """뉴런을 통해 입력 신호를 전달."""
            z = np.dot(x, self.W) + self.b
            return self.activation_fn(z)
    
  • 23쪽, 페이지 상단 예제 코드에서 밑에서 4번째 줄(속성명 변경)

    # > perceptron.weights = [0.59865848 0.15601864 0.15599452]
    

    ==>

    # > perceptron.W = [0.59865848 0.15601864 0.15599452]
    
  • 23쪽, 페이지 상단 예제 코드에서 밑에서 3번째 줄(속성명 변경)

    # > perceptron.bias = [0.05808361]
    

    ==>

    # > perceptron.b = [0.05808361]
    
  • 28쪽, 페이지 하단 예제 코드에서 2번째 줄(모듈명 변경)

    from layer import FullyConnectedLayer
    

    ==>

    from fully_connected_layer import FullyConnectedLayer
    
  • 29쪽, 첫 번째 예제 코드의 evaluate_accuracy 함수를 다음 코드로 교체(들여쓰기 수정)

        def evaluate_accuracy(self, X_val, y_val):
            """ 검증 데이터셋을 사용해 네트워크의 정확도를 평가 """
            num_corrects = 0
            for i in range(len(X_val)):
                if self.predict(X_val[i]) == y_val[i]:
                    num_corrects += 1
            return num_corrects / len(X_val)
    
  • 38쪽, 예제 코드의 train 함수를 다음 내용으로 교체(들여쓰기 변경)

        def train(self, X_train, y_train, X_val, y_val, batch_size=32, num_epochs=5, learning_rate=5e-3):
            """제공된 데이터셋에서 네트워크를 훈련하고 평가 """
            num_batches_per_epoch = len(X_train) // batch_size
            loss, accuracy = [], []
            for i in range(num_epochs): # 훈련 세대마다
                epoch_loss = 0
                for b in range(num_batches_per_epoch): # 배치마다
                    # 배치 가져오기:
                    b_idx = b * batch_size
                    b_idx_e = b_idx + batch_size
                    x, y_true = X_train[b_idx:b_idx_e], y_train[b_idx:b_idx_e]
                    # 배치에 최적화:
                    y = self.forward(x) # 전방 전달
                    epoch_loss += self.loss_fn(y, y_true) # 손실
                    dL_dy = self.d_loss_fn(y, y_true) # 손실 미분
                    self.backward(dL_dy) # 역전파
                    self.optimize(learning_rate) # 최적화
    
                loss.append(epoch_loss / num_batches_per_epoch)
                # 세대마다, 네트워크 '검증', 즉 테스트/검증 세트에 정확도를 측정함:
                accuracy.append(self.evaluate_accuracy(X_val, y_val))
                print("Epoch {:4d}: training loss = {:.6f} | val accuracy = {:.2f}%".format(i, loss[i], accuracy[i] * 100))
    
  • 206쪽, 페이지 하단 예제 코드를 다음 코드로 교체

    print(tf.compat.v1.data.get_output_types(dataset)) # > "tf.uint8"
    print(tf.compat.v1.data.get_output_shapes(dataset)) # > "(64, 64, 3)"
    for image in dataset:
    # 이미지 관련 작업 수행
    
  • 208쪽, 페이지 상단 예제 코드를 다음 코드로 교체

    x, y = np.array([1, 2, 3, 4]), np.array([5, 6, 7, 8])
    d = tf.data.Dataset.from_tensors((x,y))
    print(tf.compat.v1.data.get_output_shapes(d)) # > (TensorShape([4]), TensorShape([4]))
    d_sliced = tf.data.Dataset.from_tensor_slices((x,y))
    print(tf.compat.v1.data.get_output_shapes(d_sliced)) # > (TensorShape([]), TensorShape([]))
    
  • 258쪽, 페이지 하단 예제 코드를 다음 코드로 교체(바깥쪽 괄호 추가)

    dataset = tf.data.Dataset.from_generator(frame_generator,
                    output_types=(tf.float32, tf.string),
                    output_shapes=((299, 299, 3), ()))