8월, 2017의 게시물 표시

IBM Watson을 이용한 이미지 학습 및 인식하기

이미지
IBM Watson을 이용하여 특정 이미지 학습 후 인식하기 IBM Watson을 이용하면 다양한 AI 기능들을 사용할 수 있다.

현재 Watson은 Conversation, Language Translator, Personality Insights, TTS(Text to Speech), STT(Speech to Text) 및 Visual Recognition 등이 제공된다.(IBM Watson 기능들)

이번 글에서는 이미지에서 의미를 찾을 수 있는 Visual Recognition 기능을 살펴보고, 특정 이미지들을 학습하여 인식하는 과정을 소개한다.

Watson Visual Recognition의 자세한 소개는 아래 IBM Bluemix 사이트에서 참고한다.

Visual Recognition
Visual Recognition  IBM Bluemix에서 소개된 Visual Recognition 소개는 다음과 같다. 
Visual Recognition 시각적 컨텐츠에서 의미를 찾습니다! 장면, 사물, 얼굴 및 기타 컨텐츠에 대한 이미지를 분석합니다. 제공되는 기본 모델을 선택하거나 사용자 고유의 사용자 정의 클래스류를 작성할 수 있습니다. 콜렉션 내에서 비슷한 이미지를 찾습니다. 특정 장면을 이해하기 위해 이미지나 동영상 프레임의 시각적 컨텐츠를 분석하는 스마트 애플리케이션을 개발합니다.
기능 일반 분류이미지를 설명하는 클래스 키워드를 생성합니다. 고유의 이미지를 사용하거나 분석을 위해 공개적으로 액세스 가능한 웹 페이지에서 관련 이미지 URL을 추출합니다.얼굴 감지이미지에서 얼굴을 감지합니다. 또한 이 서비스에서는 얼굴의 나이 범위 및 성별에 대한 일반적인 표시도 제공합니다.시각적 훈련고유한 사용자 정의 시각적 클래스류를 작성합니다. 이 서비스를 사용하여 일반 분류에 사용할 수 없는 사용자 정의 시각적 개념을 인식합니다.비슷한 이미지 검색(BETA)업로드 후 시각적으로 비슷한 이미지를 찾기 위해 이미지 콜렉션을 검색합니다.
Visual Recognition 사용하…

C++11 call_once()을 사용하여 thread에 안전한 singleton 구현하기

C++11 call_once()을 사용하여 thread에 안전한 singleton 구현하기 Singleton 객체를 생성하는 방법은 다양하게 있다. template을 사용하는 방법, thread을 사용하는 방법 등.. 하지만 multi-thread 상태에서 singleton을 생성할 때는 상황에 따라서 인스턴스가 두 개 이상 생성될 수 있는 등 원하지 않는 동작을 할 경우가 있다.
1. Thread을 고려하지 않은 Singleton 생성 우선 다음 코드는 Thread을 고려하지 않고 Template을 사용한 Singleton 생성 방법이다.


위 코드는 Thread를 고려하지 않기 때문에 생성때 예상하지 못하는 오류들이 발생할 수 있다.
2. call_once()기반 thread에 안전한 Singleton 생성

간단하게 알아보는 CMake 활용법

최근 C++ 빌드 툴로 CMake을 사용하고 있다. CMake는 개인적인 평가로서는 문법이 강력하고, 이해하기 쉬우며, 확장성이 높은 것 같다.

CMake에 대한 기본전인 자료들은 구글을 통해 얻을 수 있을 것이다.

이 글에서는 프로젝트를 복잡하게 구성하면서 CMake을 사용하다보면

GitHub에서 다운로드 받은 소스가 CMake을 지원할 때 어떻게 환경 변수를 연동할 것인지?경로 설정은 어떻게 할 것인지?..
등의 어려움에 맞다뜨려진다. 이런 문제점들을 하나씩 해결하는 것이다.
1. 변수 변수를 사용한다는 것은 다양한 빌드 조건들을 유연하게 대응하려는 시도이기도 하고, 이미 만들어져 있는 빌드 환경에서 내가 필요한 조건들을 지정할 때 사용할 수 있다.
1.1. 변수 정의 변수를 정의할 때 CMake에서는 SET() 함수를 사용할 수 있다. 형식은 다음과 같다. SET ( <변수명><값> )
예를 들면 다음과 같이 정의할 수 있다. SET(LUNA_SW_PLATFORM

[IoTivity, #1] OCF 표준을 따르는 소프트웨어 플랫폼인 IoTivity 란?

이미지
1. IoTivity란? IoTivity는 끊김없이 장치 간 연결을 가능하게 하여 사물(Thing)의 인터넷에 대해 새로운 요구들을 해결하는 개방형 소스 소프트웨어 프레임 워크이다.
2. IoTivity 2.1. IoTivity 초기화 및 설정 아래 내용은 https://wiki.iotivity.org/initialize_setting 내용을 바탕으로 작성되어 있으며, 개발자 측면에서 개인적인 의견과 작업 내용을 추가 했다.
Resource API 스택은 여러 개의 얇은 소프트웨어 레이어로 구성됩니다. Android, iOS 또는 Microsoft Windows와 같은 자유로운 환경에서 IoTivity 스텍은 개발자에게 C 및 C ++ API를 제공하므로 개발자는 이를 사용하여 추가적인 네트워크 프로토콜 및 무선 기술기반의  IP 네트워크  통해 제한된 장치 또는 제한되지 않은 장치 모두와 대화 할 수 있다.
IoTivity 아키텍처 의 기본 개요는 다음과 같다.


다음 그림은 OS 스텍이 C 또는 C++ 함수을 사용하여 다른 레벨로 접근할 수 있는 것을 보여준다.

C++ SDK : OCPlatform::ConfigureC SDK : OCInit



1) Setup 먼저 IoTivity를 개발할  OS에 빌드가 되지 않았다면, 아래 가이드를 참고하기 전에 먼저 빌드가 필요하다.

2) C SDK IoTivity의 기본 레이어는 C 라이브러리이다.

Example
초기화를 위해 기본 예제는 다음 소스를 참고한다.
iotivity/resource/csdk/stack/samples/linux/SimpleClientServer/ocserver.cpp
Source Code
이 코드가 C++로 작성되었다 하더라고, 여기서는 C API를 호출하고, 초기화보다 더 많은 것을 진행하지만, 이 예제에서는 몇 개의 OC 함수들만 설명할 것이다.

a) API

필요한 함수들의 목록이다.

함수 위치 --> iotivity/resource/csdk/stack/include/ocstack.h:

OC…

Git 저장소를 병합하는 방법(How to merge repositories in Git)

GIT 저장소를 다른 저장소에 병합하는 방법 Git? Git은 컴퓨터 파일의 변경 내용을 추적하고 여러 사람들일 공유하는 파일에 대해 협업할 수 있도록 파일의 변경을 제어하는 버전 제어 시스템이다. 기존에 CVS, SVN 등 다양한 버전 제어 시스템들이 나왔지만, 최근에는 Git으로 통일되는 것 같다. Git은 분산 리비전(개정) 관리 시스템으로서 속도, 데이터 무결성 및 분산 된 비선형 작업 진행을 지원하는 것이 목표이다. 
Git은 Linux 커널 개발을 위해 2005년 리누스 토발즈(Linus Torvalds)가 개발 되었으며, 다른 커널 개발자들도 초기 개발에 기여했다.
대부분의 다른 분산 버전 제어 시스템과 마찬가지로 Client-Server 버전 제어 시스템과는 다르게 중앙 서버와 관계없이 모든 컴퓨터의 Git 디렉토리는 파일 변경 이력(버전)을 추적할 수 있는 분산형 저장소이다.
Client-Server 버전 제어 시스템으로 많이 사용했던 SVN(Subversion)은 네트워크 연결이 안될 경우 독립적인 위치에서 동시에 개발이 진행될 때 코드 병합과 이력 관리에 많은 어려움이 있었다. Git은 이런 기본적인 문제점들을 해결하면서 보다 진보적인 방법들을 제공한다. 
인터넷 검색을 통해 보다 세부적인 내용과 더불어 다양한 기능들에 대해 찾아 보기 바란다.
서로 다른 저장소를 한 곳에 병합하는 방법 프로젝트 특성에 따라 한 개 이상의 저장소들에서 개발이 진행되다가 저장소의 병합이 필요할 때가 있다. 특정 디렉토리를 생성하여 복사해서 추가하면 되겠지만, 이련 경우에는 기존 저장소의 수정 이력(버전) 정보는 포기해야 한다. 
쉽게 기존 저장소의 수정 이력 정보를 포함하여 저장소를 병합하는 방법이 있다.
우선 다음과 같이 세 개의 저장소가 있다고 가정한다.
git/project1git/project2git/project3
project2와 project3를 project1에 병합하는 방법은 다음과 같다.
사전 고려사항저장소가 병합되면 디렉토리 위치에 따라 …

머신러닝(Machine Learning, 기계학습)과 딥러닝(Deep Learning, 심층학습)의 차이는 뭘까?

AI(Artificial Intelligence, 인공지능)에 대한 관심이 높아지면서 머신러닝(Machine Learning, 기계학습)과 딥러닝(Deep Learning, 심층학습) 차이가 무엇인지 궁금해졌다.
1. 머신러닝(Machine Learning) 머신러닝에 대해 위키피디아의 정의를 보면 다음과 같다.

Machine learning is the subfield of computer science that, according to Arthur Samuel in 1959, gives "computers the ability to learn without being explicitly programmed."

번역) 머신러닝은 아서 사무엘(Arthur Samuel)이 1959년에 언급한 '명시적으로 프로그래밍 된 것 없이 배울 수 있는 능력을 컴퓨터가 갖게 하는 컴퓨터 과학의 하위 분야이다.

참고로 아서 사무엘은 머신러닝을 "기계가 일일이 코드로 명시하지 않은 동작을 데이터로부터 학습하여 실행할 수 있도록 하는 알고리즘을 개발하는 연구 분야"라고 정의하였다.

2. 딥러닝(Deep Learning) 딥러닝에 대해 위키피디아의 정의를 보면 다음과 같다.
Deep learning (also known as deep structured learning or hierarchical learning) is the application of artificial neural networks (ANNs) to learning tasks that contain more than one hidden layer.
번역) 심층학습(심층구조학습 또는 계층적 학습이라고도 알려져 있음)은 하나 이상의 숨겨진 계층을 포함하는 학습 작업들에 인공 신경망(ANN)을 적용하는 것이다.
달리 표현해보면 큰 틀에서 사람의 사고방식을 컴퓨터에게 가르치는 머신러닝의 한 분야라고 할 수 있다.
주요 연구 결과로는 2012년 스탠포드대학의 앤드류 응과 구글이 함…