글쓴이 보관물: Toughman

AULA F87 Pro

구매동기

이전에 사용하고 있던 커세어 K63 키보드가 언제부터 인지 모르겠지만 정확히 누르지 않는 경우 키캡이 빠지는 현상이 발생했습니다. 사용하기 너무 불편해서 새로운 키보드를 알아보게 되었습니다. 기계식이면서 무선으로 찾아보았는데 AULA F87 Pro 가 눈에 들어왔습니다.

제품 선택 시 고려 사항

이전부터 무선 키보드를 사려고 했는데 기계식 이면서 무선인 제품이 거의 없었습니다. 그리고 가격도 상당히 비싸서 살 엄두가 나지 않았습니다. 이전 키보드 구매 후 아예 관심을 가지지 않고 있다가 알아보니 상당히 많은 키보드가 나와 있었습니다. 키보드를 거의 4년 가까이 사용하고 교체하는 것인데 그 동안 많은 변화가 있었던 것 같았습니다.

이전에 사용하던 키보드가 윈도우 키 잠금이나 소리 조절 기능이 있어서 편리하다고 생각했는데 AULA F87 Pro 는 해당 기능을 그대로 지원하고 있어서 큰 고민 없이 구매하게 되었습니다.

구매

구매는 직구를 했고 스위치는 회목축이라는 것을 선택했습니다. 4년 가까운 사이에 처음 보는 방식의 스위치가 많이 생겨난 것 같았습니다. 키압이나 소리에 그리 예민하지 않아 별 고민 없이 구매했습니다. 스위치가 어떤 느낌일까 조금 궁금한 것도 있었습니다.

수령

배송 된 상태
배송 된 상태

포장은 간단하게 되어있고 모서리가 약간 찌그러졌는데 제품에는 큰 문제가 없을 것 같았습니다.

열어보니 크기가 거의 비슷한 상자가 하나 들어 있었습니다.

실제 제품 상자 앞면
실제 제품 상자 앞면
실제 제품 상자 뒷면
실제 제품 상자 뒷면

다행히 크게 찌그러진 부분은 없이 도착해서 안심 했습니다.

열어보니 다음과 같이 설명서가 있고 키보드가 비닐에 쌓여 있었습니다.

개봉 직후 상태
개봉 직후 상태

내용물은 간단한데 여분의 스위치, 케이블, 키캡을 뽑는 도구가 같이 들어있었습니다. 그리고 투명 키보드 덮개도 있습니다.

AULA F87 Pro 구성
AULA F87 Pro 구성

장점

첫 번째 꼭 필요한 키만 배열되어 있고 우측 숫자키가 없어서 자리를 적게 차지 합니다. 두 번째 Fn 키와 조합하여 충전 상태 확인, RGB 효과 및 밝기 조절, 소리 조절이 가능하여 편리했습니다. 세 번째로 배터리가 생각보다 오래 갔습니다. 조명 효과를 모두 끄고 사용해서 그런지 두 달 넘게 사용했는데 아직 다시 충전하지 않았습니다. 2.4G USB, 유선, 블루투스 로 연결할 수 있는 점도 마음에 들었습니다. 투명 키보드 덮개가 제공되는 것도 좋았습니다.

키감

회목축을 처음 써 보았는데 적축보다는 확실히 소리가 컸습니다. 키압은 개인적으로 느끼기에 청축과 적축의 중간 쯤 되는 것 같았습니다.

소리

연속적으로 입력하면 독특한 소리가 납니다. 타건 동영상이 있으므로 그것을 참고 하시면 될 것 같습니다. 개인적으로 키를 누를 때 소리가 마음에 들었습니다.

2.4G USB 고장

두 달 넘게 사용했는데 갑자기 키보드가 동작하지 않는 문제가 발생했습니다. 처음에는 USB 포트 문제인가 생각이 들어 다른 포트로 바꾸어 보았으나 해결되지 않았습니다. 결국 블루투스로 연결을 변경하여 사용하게 되었습니다. 블루투스는 별도의 동글이 있어서 큰 문제없이 인식되고 연결되어 사용에 문제는 없었습니다. 2.4G 모드로 무선 마우스를 여러 번 사용했었는데 단 한번도 고장이 난 적이 없었는데 이점은 아쉬웠습니다.

ONNX 파일 .Net framework C# 으로 활용하기

개요

요즘 기계 학습(Machine Learning, ML)을 이용한 프로그램이나 앱이 많이 등장하고 있습니다. 기계 학습의 결과를 .Net framework C# 환경에서 연동하는 방법을 알아보도록 하겠습니다.

ONNX

ONNX 는 (Open Neural Network Exchange) 를 줄인 것으로 여러가지 학습 플랫폼의 결과를 서로 사용할 수 있게 하는 일종의 프레임워크 같은 개념입니다.

ONNX 웹 사이트
ONNX 웹 사이트

기계 학습의 결과를 ONNX 파일로 저장하는 방법은 이 글의 범위를 넘어가게 됩니다. 좋은 글이 많이 있으므로 그것을 참조하시면 됩니다.

이 글에서는 직접 기계학습으로 저장한 것이나 다른 곳에서 구한 ONNX 파일을 사용하는 것으로 하겠습니다.

Netron

직접 기계 학습의 결과를 저장했다면 어떤 값을 입력했고 출력 되는 값을 이미 알고 있습니다. 그러나 다른 곳에서 전달 받았거나 구한 파일만 있다면 그것을 정확히 알 수 없습니다. 이때 사용하는 프로그램이 Netron 입니다.

웹사이트에 방문하여 파일을 올리면 구조를 시각화해서 보여주므로 매우 편리합니다. 파일을 올리는 것이 꺼려지는 분들은 Github 에서 설치본을 받아 설치한 후 사용하시면 됩니다.

필자는 타이타닉 생존자 데이터를 가지고 기계 학습을 통해서 예측하는 모델로 export 한 파일을 사용하였습니다.

ONNX 파일을 Netron 으로 열어보면 다음과 같습니다.

ONNX 파일을 Netron에서 열어 본 결과
ONNX 파일을 Netron에서 열어 본 결과

모델이 간단하여 복잡하지 않습니다. 기계 학습을 위해 입력한 값이 float 형으로 8개 이고 출력 값이 확률과 레이블(목표값)임을 알 수 있습니다.

C# 코드

위에 언급한 ONNX 파일을 이용하여 예측 값을 가져오는 코드는 다음과 같습니다.

using Microsoft.ML.OnnxRuntime;
using Microsoft.ML.OnnxRuntime.Tensors;
...
string ONNX_MODEL_PATH = "D:\\yourPaht\\your.onnx";

InferenceSession session = new InferenceSession(ONNX_MODEL_PATH);
DenseTensor<float> denseTensor;

float[,] predictInput = new float[1, 8];
predictInput[0, 0] = 3f;
predictInput[0, 1] = 1f;
predictInput[0, 2] = 16.0f;
predictInput[0, 3] = 2f;
predictInput[0, 4] = 0f;
predictInput[0, 5] = 18.000f;
predictInput[0, 6] = 7f;
predictInput[0, 7] = 3f;

denseTensor = predictInput.ToTensor();
var inputMetaData = session.InputMetadata;
var outputMetaData = session.OutputMetadata;

var modelInput = new List<NamedOnnxValue>();

foreach (var name in inputMetaData.Keys)
{
    modelInput.Add(NamedOnnxValue.CreateFromTensor<float>(name, denseTensor));
}

try
{
    var results = session.Run(modelInput);
    var inferenceResult = results.ToList()[0];
    var inferenceResultValue = inferenceResult.Value;

    var modelOutput = results.ToList()[0].AsTensor<long>().ToArray<long>()[0].ToString();

    Console.WriteLine("Predict Survived : " + modelOutput.ToString());
    Console.ReadLine();
}
catch (Exception error)
{
    Console.WriteLine(error.Message);
    Console.ReadLine();
}

9~28 행은 입력 값으로 8개의 항목을 입력하는 코드입니다.

32~39 행은 입력 데이터를 적용해서 그 결과를 출력하는 부분 입니다.

위 결과를 수행해 보면 다음과 같습니다(1이 생존).

예측 결과
예측 결과

입력 값의 항목을 변경하면 예측한 값이 달라집니다.

이번 글에서는 ONNX 파일을 .Net framework C# 환경에서 사용하는 방법을 알아보았습니다.