이 글은 CNN(Convolution Neural Network) 딥러닝 파라메터에 따른 예측 정확도 변화 확인 결과를 간략히 정리한다. 딥러닝 모델은 파라메터가 어떻게 되느냐에 따라 정확도가 달라진다. 얼마나 차이가 나는지를 확인해 보기 위해, CNN 모델을 정의하고, 파라메터를 조정해 본다.
기본 모델 정의
기본 모델은 다음과 같다. 이 모델은 주어진 이미지를 2개의 클래스로 구분한다.
# Our input feature map is 150x150x3: 150x150 for the image pixels, and 3 for
# the three color channels: R, G, and B
img_input = layers.Input(shape=(150, 150, 3))
x = layers.Conv2D(16, 3, activation='relu')(img_input)
CNN 커널 크기와 계층수를 변화시켜보도록 한다. 모델 파라메터를 조정한 결과는 다음과 같다.
커널 3계층 표준
커널 크기 증가1
커널 크기 증가2
커널 2계층
커널 4계층
결론
결과는 CNN 필터를 배수로 증가시켜가면서 모델을 추가했을 때 정확도가 높았다. 또한, 커널 계층을 삭제하거나 증가할때 정확도나 손실은 좋아지지 않았다. 이런 파라메터는 입력 데이터 특성 등에 따라 조정해 나가야 한다. 참고로, 이런 노가다는 AutoML같은 최적 모델 선택 도구를 통해 줄일 수 있다.
이 글은 CDE(Common Data Environment) 개발 지원 BIM(Building Information Modeling) 라이브러리 IFC.js 분석 및 사용방법을 간략히 설명한다. IFC는 3차원 건설 정보 모델로 건설 부재의 객체별로 형상과 속성을 저장할 수 있다.
IFC.js는 BIM 개방형 표준파일포맷인 IFC(Industry Foundation Classes)파일을 로딩, 디스플레이 및 편집할 수 있는 자바스크립트 라이브러리이다. 이 라이브러리는 안토니오 곤잘레스(Antonio Gonzalez Viegas)에 의해 개발이 주도되고 있다. 참고로, 그는 스페인 2018년 ETSAS 건축과를 졸업하고, BIM 연구 개발 경험이 많은 디지털 아키텍처이며, 재즈를 좋아한다.
IFC는 읽고 쓰기 어려운 복잡한 포맷이다. 실제 IFC 구조는 다음과 같다. 이 파일 포맷을 해석(parse, 파싱)하기 위한 여러 라이브러리가 이미 오래전부터 있었다. IFC.js는 웹기반으로 동작되는 순수 Javascript와 빠른 렌더링 성능을 지원하는 C++ WASM(Web assembly. 예제)기술을 이용해 개발되었다. 이를 통해 웹브라우져에서도 60 fps까지 렌더링 처리 된다. 그러므로, 스마트폰을 포함한 모든 컴퓨터 디스플레이에서 IFC.js 기능을 사용할 수 있다.
data = data + ' ' + pset.psets[i].HasProperties[j].value + '\n';
}
}
text.value = data;
...
구현 결과는 다음과 같다. IFC를 로딩한 후, 벽체 등 객체를 더블클릭하면 아래 패널창에 속성값이 출력될 것이다.
벽체 객체 선택 후 속성 출력된 모습
IFC.js 응용과 한계
IFC.js를 응용하는 방법은 다양하다. 개발자가 언급한 것처럼 CDE를 구현할 수도 있고, BIM 모델 체커를 만들 수도 있다. IFC의 Property Set에 외부 정보를 연결하면, IoT, 디지털 트윈 등을 구현할 수 있다. GIS와 연계하면 BIM-GIS 개발이 가능할 것이다.
다만, 유사한 오픈소스 프로젝트인 xBIM과 비교를 해보면, 정보 쿼리 기능, BIM 서버 연계, 대용량 처리, 확장성 등의 개선이 필요해 보인다. 그럼에도 가장 간편하게 BIM 응용 서비스를 웹 기반으로 개발할 수 있다는 점, WASM을 이용한 그래픽 가속 기능은 큰 장점이다.
마무리
이 글에서는 간단히 CDE 개발을 지원하는 오픈소스 BIM 라이브러리인 IFC.js를 분석하고 사용방법을 확인해 보았다. IFC.js는 구조가 복잡하고 사용이 쉽지는 않다. 그럼에도 앞서 언급한 장점이 많은 라이브러리이다.
현 시점에서 ifc viewer 중 MIT, BSD 라이센스는 web-ifc-viewer, ifc.js, ifcplusplus밖에 없다. 성능이 좋은 xbim, xeokit은 copyleft에 해당하는 오픈소스로 이를 사용한 코드를 오픈소스로 공개하도록 강제한다. 이를 어길 시 소송을 당할 수 있다.
IFC.js의 그래픽 엔진은 Three.js 의 메쉬 생성 부분을 사용한다. 코드를 다운로드한 후 분석을 해 보면, IFC 파싱을 담당하고 있는 IFCWorker.js 의 Geometry to Mesh 코드가 Three.js 코드를 사용하고 있는 것을 확인할 수 있다. IFC는 각 Product의 형상을 파라메터만 가지고 있으므로, 이를 디스플레이하거나 메쉬 간 연산을 위해서는 다음과 같은 변환 작업이 필요하다.
IFCWorker.js는 각 IFC버전별로 파싱하는 함수를 다음과 같은 맵 테이블로 정의하고 있다
각 IFC product의 지오메트리는 다음과 같은 BufferGeometry에서 파생받은 클래스에 의해 파라메터가 해석되어 mesh 정보로 생성된다. 이 메쉬 생성 전략은 Solid model의 B-rep 형식에 따라 각각 다르므로, 이에 적합한 메쉬 생성 함수를 사용하도록 코딩된다. 생성된 메쉬 정보는 BufferGeometry에 저장된다.
ExtrudeGeometry (build.js)
파싱되어 생성된 메쉬는 다음과 같이 접근되어 사용된다.
퍼버 지오메트리는 IFC file serialize 성능 속도 개선을 위해 file로 저장 및 로딩되는 캐쉬 전략을 사용한다.
부록: ifcviewer 초기화 루틴
ifcviewer는 아직 완벽한 CRUD(create, read, update, delete) 모델을 지원하지 않는다. 그러므로, 일부 소스 수정이 필요하다. 다음은 ifc viewer 초기화 관련 주요 코드를 보여준다.
웹어셈블리는 C++과 같은 다양한 언어로부터, 클라이언트에 실행되는 웹 바이너리 실행코드를 생성한다. Emscripten은 웹 어셈블리를 컴파일한다. 참고로, Emscripten은 오픈소스 컴파일러로, C/C++ 등 소스코드를 컴파일해 웹에서 실행할 수 있는 코드를 생성한다. 이 도구는 언리얼, 유티니와 같은 상용 코드베이스를 포함하고 있다. 이 도구를 통해, 웹 켄버스 그래픽, 이벤트 등 다양한 웹 브라이져 객체를 다룰수 있다(링크). 또한, 게임 등 다양한 소프트웨어를 웹 버전으로 포팅할 때도 사용된다(데모).
설치 후, 이클립스를 실행하고, 간단한 C++ 어플리케이션 프로젝트를 생성한다. 이름은 hello로 한다. 사용방법은 Visual Studio와 유사하게, 메뉴나 프로젝트 탐색창에서 Build, Run, Debug를 실행할 수 있도록 되어 있다.
디버깅을 위해, 프로젝트 탐색기의 프로젝트를 선택하고, cpp파일을 만든다. 해당 소스 파일 내에 hello world 출력 코드를 코딩하고, 빌드한다.
#include <stdio.h>
int main()
{
char* szHello = "hello world! from stjohns";
printf(szHello);
return 0;
}
빌드가 성공하면, 실행 및 디버깅 환경 설정을 다음과 같이 실행한다.
소스 편집기 창의 라인번호 왼쪽을 더블클릭해, 브레이크포인트를 만든 후 디버깅을 실행하면 다음과 같이 해당 지점에 실행이 멈추고, 변수값 등을 확인할 수 있다.
기존 프로젝트를 가져와서 디버깅을 하고 싶으면, File > import > C/C++ > Existing Code as Makefile Project 를 선택하고, 프로젝트의 Makefile이 있는 루트 폴더를 선택하면 된다. 그럼, 다음과 같이 프로젝트에서 생성된 실행파일을 디버깅할 수 있다. 아울러, 디버그 심벌이 있으면, 소스코드는 함께 표시된다. 참고로, 디버그 심벌이 제대로 연결되지 않으면, 해당 부분의 소스 라인은 디버그할 수 없다.
pdb
python디버거이다. 소스코드를 디버깅할 수 있으며, 앞서 언급한 gdb와 유사한 명령어를 지원한다.