본문 바로가기
AI

AI 서버 없이 C# ML.NET으로 구현한다면?

by eplus 2026. 6. 27.

특히 중소제조업용 MES / ERP에서는 처음부터 별도 AI 서버를 두는 것보다, C# 프로그램 내부에서 ML.NET으로 예측·분류·이상감지 기능을 넣는 방식이 현실적일 수 있습니다.

다만 ML.NET은 모든 AI 기능에 적합한 것은 아닙니다.
예측, 분류, 이상감지, 간단한 추천, 이미지 분류, ONNX 모델 실행에는 적합하고, ChatGPT 같은 자연어 대화형 AI, 고급 문서 요약, 복잡한 생성형 AI에는 적합하지 않습니다.

ML.NET은 .NET 애플리케이션에서 모델을 직접 학습하거나, 학습된 모델을 로드해서 예측할 수 있고, ONNX·TensorFlow 같은 외부 모델도 가져와 사용할 수 있습니다.


1. ML.NET 적용에 적합한 기능

적합한 기능

MES / ERP 기준으로 ML.NET에 잘 맞는 기능은 다음입니다.

구분적용 기능적합도
품질 불량 발생 예측 높음
품질 불량 유형 분류 높음
설비 설비 이상 감지 높음
생산 납기 지연 위험 예측 높음
자재 재고 부족 예측 높음
영업/구매 수요 예측 중간
생산관리 작업 소요시간 예측 높음
원가 예상 제조원가 예측 중간
현장 비가동 원인 분류 높음
검사 이미지 분류 기반 OK/NG 판정 중간
검사 객체 검출 기반 스크래치 위치 탐지 낮음~중간

ML.NET은 분류, 회귀, 클러스터링, 이상감지, 랭킹, 추천, 예측 작업을 지원합니다.


2. ML.NET에 덜 적합한 기능

다음은 ML.NET 단독으로 처리하기 어렵거나 효율이 낮습니다.

기능이유
자연어 질의응답 LLM/RAG 구조가 필요
작업일보 문장 요약 생성형 AI가 적합
매뉴얼 기반 챗봇 벡터DB + LLM이 적합
복잡한 이미지 객체 검출 학습 로컬 ML.NET 단독 학습은 제한적
공정 조건 자동 최적화 데이터·검증·제어 로직이 복잡
AI Agent 자동 업무 처리 업무 승인·보안·감사 구조 필요

특히 객체 검출은 ML.NET에서 사전 학습된 ONNX 모델을 실행하는 방식은 가능하지만, 로컬에서 직접 객체 검출 모델을 학습하는 방식은 제한이 있습니다. Microsoft 문서도 객체 검출 학습은 Azure ML 기반 Model Builder를 안내하며, 로컬 지원에는 제한이 있다고 설명합니다.


3. MES / ERP에서 가장 추천하는 ML.NET 적용 순서

1단계: 불량률 이상 감지

가장 먼저 추천합니다.
데이터 구조가 단순하고, 효과를 설명하기 쉽습니다.

입력 데이터:
품목, 공정, 설비, 작업자, 작업시간, 생산수량, 불량수량, 불량률

결과:
정상 / 이상
이상 점수
 

활용 예:

IMM-03 설비에서 BRACKET-A 품목의 외관불량률이 평소보다 높습니다.
최근 평균 1.2%, 현재 5.8%로 이상 가능성이 있습니다.
 

2단계: 납기 지연 위험 예측

ERP와 MES 데이터가 연결되어 있으면 효과가 큽니다.

입력 데이터:
수주수량, 납기일수, 현재재고, 생산진도율, 불량률,
설비부하율, 자재입고지연여부, 외주공정여부

결과:
정상 / 주의 / 위험
또는 지연 가능성 %
 

3단계: 재고 부족 예측

처음에는 계산식으로 시작하고, 이후 ML.NET 모델을 붙이면 좋습니다.

입력 데이터:
현재재고, 안전재고, 평균사용량, 수주잔량,
생산계획수량, 발주잔량, 평균리드타임

결과:
부족 예상 여부
부족 예상 수량
 

4단계: 작업 소요시간 예측

생산계획 정확도를 높이는 데 좋습니다.

입력 데이터:
품목, 공정, 설비, 작업자, 수량, 난이도, 금형,
과거 평균시간, 교대조

결과:
예상 작업시간
예상 완료일시
 

5단계: 이미지 OK/NG 분류

스크래치, 찍힘, 오염 같은 비전 검사는 가능하지만 주의가 필요합니다.

ML.NET으로 이미지 분류는 가능하지만, 정밀한 결함 위치 검출은 별도 딥러닝 모델이나 ONNX 모델 사용이 더 적합합니다.

적합:
이미지 전체 기준 OK / NG 분류

부적합:
결함 위치 박스 표시
미세 스크래치 세그멘테이션
복잡한 표면 결함 검출
 

4. 전체 시스템 구조

AI 서버 없이 구현하면 구조는 단순합니다.

C# WinForms / MAUI / ASP.NET Core
        ↓
MES / ERP DB
        ↓
ML.NET 학습 또는 모델 로드
        ↓
예측 결과
        ↓
화면 표시 / 알림 / 로그 저장
 

운영 구조는 이렇게 나누는 것이 좋습니다.

MES 실행 프로그램
- 사용자가 사용하는 화면
- 예측 결과 표시
- 모델 파일 로드

AI 학습 프로그램
- 관리자만 실행
- DB에서 학습 데이터 추출
- 모델 학습
- 모델 파일 저장

AI 배치 프로그램
- 매일 새벽 실행
- 예측 대상 데이터 조회
- 예측 결과 저장
 

실무에서는 학습과 예측을 분리하는 것이 좋습니다.


5. 추천 프로젝트 구성

C# 솔루션을 이렇게 나누면 관리가 쉽습니다.

eMESLite.sln

01. eMESLite.WinForms
- MES / ERP 화면

02. eMESLite.ML.Trainer
- ML.NET 모델 학습용 콘솔 프로그램

03. eMESLite.ML.Predictor
- 예측 공통 라이브러리

04. eMESLite.Batch
- 매일 자동 예측 배치

05. eMESLite.Common
- DB, 로그, 공통 모델
 

모델 파일은 별도 폴더에 저장합니다.

/models
  defect_prediction.zip
  delivery_delay_prediction.zip
  stock_shortage_prediction.zip
  worktime_prediction.zip
 

ML.NET 모델은 학습 후 저장하고 다시 로드해서 사용할 수 있습니다. Microsoft 문서에서도 모델은 메모리에만 있으면 앱 종료 시 사라지므로, 운영·재학습을 위해 저장하는 구조가 필요하다고 설명합니다.


6. 적용 기능별 ML.NET 작업 유형

불량 발생 예측

문제:
이 작업은 불량 위험이 높은가?

ML.NET 작업:
Binary Classification

결과:
true / false
불량 가능성 점수
 

추천 알고리즘:

FastTree
LightGbm
SdcaLogisticRegression
LbfgsLogisticRegression
 

불량 유형 분류

문제:
이번 불량은 어떤 유형일 가능성이 높은가?

ML.NET 작업:
Multiclass Classification

결과:
외관불량 / 치수불량 / 가공불량 / 조립불량 / 기타
 

추천 알고리즘:

SdcaMaximumEntropy
LightGbm
FastTree
 

납기 지연 예측

문제:
이 수주는 납기 지연 위험이 있는가?

ML.NET 작업:
Binary Classification 또는 Multiclass Classification

결과:
정상 / 주의 / 위험
 

작업시간 예측

문제:
이 작업은 몇 분 정도 걸릴까?

ML.NET 작업:
Regression

결과:
예상 작업시간
 

추천 알고리즘:

FastTreeRegression
LightGbmRegression
SdcaRegression
 

설비 이상 감지

문제:
현재 설비 상태가 평소와 다른가?

ML.NET 작업:
Anomaly Detection

결과:
정상 / 이상
이상 점수
 

ML.NET의 이상감지 작업은 비정상 패턴을 찾는 용도로 사용되며, RandomizedPcaTrainer 같은 알고리즘을 사용할 수 있습니다.


7. DB 테이블 예시

AI 학습 데이터 테이블

처음부터 운영 테이블을 직접 학습에 쓰기보다, 학습용 View 또는 테이블을 만드는 것이 좋습니다.

 
CREATE TABLE ai_defect_train_data (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    work_date DATE,
    item_code VARCHAR(50),
    process_code VARCHAR(50),
    machine_code VARCHAR(50),
    worker_code VARCHAR(50),
    shift_code VARCHAR(20),
    order_qty DECIMAL(18,3),
    prod_qty DECIMAL(18,3),
    defect_qty DECIMAL(18,3),
    defect_rate DECIMAL(10,4),
    work_minutes DECIMAL(18,3),
    machine_stop_minutes DECIMAL(18,3),
    is_defect_risk BOOLEAN
);
 

예측 결과 저장 테이블

 
CREATE TABLE ai_prediction_result (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    prediction_type VARCHAR(50),
    target_no VARCHAR(100),
    result_code VARCHAR(50),
    score DECIMAL(10,4),
    result_message TEXT,
    model_file VARCHAR(200),
    model_version VARCHAR(50),
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
 

모델 관리 테이블

 
CREATE TABLE ai_model_manage (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    model_code VARCHAR(50),
    model_name VARCHAR(100),
    model_type VARCHAR(50),
    model_file VARCHAR(200),
    train_from_date DATE,
    train_to_date DATE,
    metric_name VARCHAR(50),
    metric_value DECIMAL(18,6),
    use_yn CHAR(1),
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
 

이 3개는 거의 필수입니다.


8. C# ML.NET 불량 예측 예시

NuGet 패키지

Visual Studio에서 다음 패키지를 설치합니다.

Microsoft.ML
Microsoft.ML.FastTree
MySqlConnector
Dapper
 

입력 데이터 클래스

 
public class DefectTrainData
{
    public string ItemCode { get; set; } = "";
    public string ProcessCode { get; set; } = "";
    public string MachineCode { get; set; } = "";
    public string WorkerCode { get; set; } = "";
    public string ShiftCode { get; set; } = "";

    public float OrderQty { get; set; }
    public float ProdQty { get; set; }
    public float DefectQty { get; set; }
    public float DefectRate { get; set; }
    public float WorkMinutes { get; set; }
    public float MachineStopMinutes { get; set; }

    public bool Label { get; set; }
}
 

ML.NET에서 Label은 예측하고 싶은 정답 값입니다.
여기서는 불량 위험 여부입니다.


예측 결과 클래스

 
public class DefectPrediction
{
    public bool PredictedLabel { get; set; }
    public float Probability { get; set; }
    public float Score { get; set; }
}
 

모델 학습 코드

 
using Microsoft.ML;
using Microsoft.ML.Data;

public class DefectModelTrainer
{
    private readonly MLContext _ml = new MLContext(seed: 1);

    public void Train(List<DefectTrainData> trainData, string modelPath)
    {
        IDataView dataView = _ml.Data.LoadFromEnumerable(trainData);

        var split = _ml.Data.TrainTestSplit(dataView, testFraction: 0.2);

        var pipeline =
            _ml.Transforms.Categorical.OneHotEncoding(
                    outputColumnName: "ItemCodeEncoded",
                    inputColumnName: nameof(DefectTrainData.ItemCode))
            .Append(_ml.Transforms.Categorical.OneHotEncoding(
                    outputColumnName: "ProcessCodeEncoded",
                    inputColumnName: nameof(DefectTrainData.ProcessCode)))
            .Append(_ml.Transforms.Categorical.OneHotEncoding(
                    outputColumnName: "MachineCodeEncoded",
                    inputColumnName: nameof(DefectTrainData.MachineCode)))
            .Append(_ml.Transforms.Categorical.OneHotEncoding(
                    outputColumnName: "WorkerCodeEncoded",
                    inputColumnName: nameof(DefectTrainData.WorkerCode)))
            .Append(_ml.Transforms.Categorical.OneHotEncoding(
                    outputColumnName: "ShiftCodeEncoded",
                    inputColumnName: nameof(DefectTrainData.ShiftCode)))
            .Append(_ml.Transforms.Concatenate(
                    "Features",
                    "ItemCodeEncoded",
                    "ProcessCodeEncoded",
                    "MachineCodeEncoded",
                    "WorkerCodeEncoded",
                    "ShiftCodeEncoded",
                    nameof(DefectTrainData.OrderQty),
                    nameof(DefectTrainData.ProdQty),
                    nameof(DefectTrainData.DefectQty),
                    nameof(DefectTrainData.DefectRate),
                    nameof(DefectTrainData.WorkMinutes),
                    nameof(DefectTrainData.MachineStopMinutes)))
            .Append(_ml.BinaryClassification.Trainers.FastTree(
                    labelColumnName: "Label",
                    featureColumnName: "Features"));

        var model = pipeline.Fit(split.TrainSet);

        var predictions = model.Transform(split.TestSet);

        var metrics = _ml.BinaryClassification.Evaluate(
            predictions,
            labelColumnName: "Label");

        Console.WriteLine($"Accuracy : {metrics.Accuracy:P2}");
        Console.WriteLine($"AUC      : {metrics.AreaUnderRocCurve:P2}");
        Console.WriteLine($"F1Score  : {metrics.F1Score:P2}");

        _ml.Model.Save(model, dataView.Schema, modelPath);
    }
}
 

모델 사용 코드

 
using Microsoft.ML;

public class DefectModelPredictor
{
    private readonly MLContext _ml = new MLContext();
    private readonly PredictionEngine<DefectTrainData, DefectPrediction> _engine;

    public DefectModelPredictor(string modelPath)
    {
        var model = _ml.Model.Load(modelPath, out _);
        _engine = _ml.Model.CreatePredictionEngine<DefectTrainData, DefectPrediction>(model);
    }

    public DefectPrediction Predict(DefectTrainData input)
    {
        return _engine.Predict(input);
    }
}
 

WinForms 버튼에서 호출

 
private void btnPredictDefect_Click(object sender, EventArgs e)
{
    try
    {
        string modelPath = Path.Combine(
            Application.StartupPath,
            "models",
            "defect_prediction.zip");

        var predictor = new DefectModelPredictor(modelPath);

        var input = new DefectTrainData
        {
            ItemCode = txtItemCode.Text,
            ProcessCode = txtProcessCode.Text,
            MachineCode = txtMachineCode.Text,
            WorkerCode = txtWorkerCode.Text,
            ShiftCode = cboShiftCode.Text,

            OrderQty = float.Parse(txtOrderQty.Text),
            ProdQty = float.Parse(txtProdQty.Text),
            DefectQty = float.Parse(txtDefectQty.Text),
            DefectRate = float.Parse(txtDefectRate.Text),
            WorkMinutes = float.Parse(txtWorkMinutes.Text),
            MachineStopMinutes = float.Parse(txtStopMinutes.Text)
        };

        var result = predictor.Predict(input);

        lblAiResult.Text = result.PredictedLabel
            ? $"불량 위험 높음 / 가능성 {result.Probability:P1}"
            : $"정상 / 가능성 {result.Probability:P1}";
    }
    catch (Exception ex)
    {
        MessageBox.Show(
            "AI 예측 중 오류가 발생했습니다.\n" + ex.Message,
            "AI 예측 오류",
            MessageBoxButtons.OK,
            MessageBoxIcon.Warning);
    }
}
 

9. MariaDB에서 학습 데이터 가져오기

 
using Dapper;
using MySqlConnector;

public class DefectDataRepository
{
    private readonly string _connectionString;

    public DefectDataRepository(string connectionString)
    {
        _connectionString = connectionString;
    }

    public List<DefectTrainData> GetTrainData()
    {
        using var conn = new MySqlConnection(_connectionString);

        string sql = @"
            SELECT
                item_code AS ItemCode,
                process_code AS ProcessCode,
                machine_code AS MachineCode,
                worker_code AS WorkerCode,
                shift_code AS ShiftCode,
                order_qty AS OrderQty,
                prod_qty AS ProdQty,
                defect_qty AS DefectQty,
                defect_rate AS DefectRate,
                work_minutes AS WorkMinutes,
                machine_stop_minutes AS MachineStopMinutes,
                is_defect_risk AS Label
            FROM ai_defect_train_data
            WHERE work_date >= DATE_SUB(CURDATE(), INTERVAL 12 MONTH)
        ";

        return conn.Query<DefectTrainData>(sql).ToList();
    }
}
 

10. 모델 학습 콘솔 프로그램 예시

 
internal class Program
{
    static void Main(string[] args)
    {
        string connStr =
            "Server=127.0.0.1;Port=3306;Database=emeslite;Uid=root;Pwd=비밀번호;";

        string modelPath = Path.Combine(
            AppDomain.CurrentDomain.BaseDirectory,
            "models",
            "defect_prediction.zip");

        Directory.CreateDirectory(Path.GetDirectoryName(modelPath)!);

        var repo = new DefectDataRepository(connStr);
        var trainData = repo.GetTrainData();

        if (trainData.Count < 100)
        {
            Console.WriteLine("학습 데이터가 부족합니다. 최소 100건 이상 권장합니다.");
            return;
        }

        var trainer = new DefectModelTrainer();
        trainer.Train(trainData, modelPath);

        Console.WriteLine("모델 학습 완료");
    }
}
 

실무에서는 최소 100건으로 시작할 수는 있지만, 신뢰도 있는 모델을 만들려면 수천 건 이상이 좋습니다.
특히 불량 예측은 정상 데이터가 많고 불량 데이터가 적은 불균형 데이터가 되기 쉬우므로, 단순 정확도만 보지 말고 AUC, F1Score, Precision, Recall도 함께 봐야 합니다. ML.NET 문서도 작업 유형별 평가 지표를 제공하며, 분류·회귀·추천·이상감지 등에서 적절한 지표 선택이 중요합니다.


11. 납기 지연 예측용 입력 예시

 
public class DeliveryDelayData
{
    public string ItemCode { get; set; } = "";
    public string CustomerCode { get; set; } = "";
    public string ProcessGroup { get; set; } = "";

    public float OrderQty { get; set; }
    public float RemainQty { get; set; }
    public float StockQty { get; set; }
    public float ProgressRate { get; set; }
    public float DefectRate { get; set; }
    public float MachineLoadRate { get; set; }
    public float MaterialDelayDays { get; set; }
    public float DaysUntilDue { get; set; }

    public bool Label { get; set; }
}
 

여기서 Label은 실제로 납기 지연이 발생했는지 여부입니다.

Label = true  → 납기 지연 발생
Label = false → 정상 납품
 

이 데이터가 6개월~1년 정도 쌓이면 납기 위험 예측 모델을 만들 수 있습니다.


12. 작업시간 예측은 Regression 사용

작업 소요시간은 숫자를 예측하므로 회귀 모델을 씁니다.

 
public class WorkTimeData
{
    public string ItemCode { get; set; } = "";
    public string ProcessCode { get; set; } = "";
    public string MachineCode { get; set; } = "";

    public float OrderQty { get; set; }
    public float WorkerCount { get; set; }
    public float StandardTime { get; set; }
    public float DifficultyLevel { get; set; }

    public float Label { get; set; } // 실제 작업시간, 분 단위
}
 

예측 결과:

 
public class WorkTimePrediction
{
    public float Score { get; set; } // 예상 작업시간
}
 

적용 예:

품목: BRACKET-A
수량: 500EA
공정: 가공
예상 작업시간: 185분
예상 완료: 2026-06-27 15:20
 

13. 설비 이상 감지는 이렇게 접근

설비 이상 감지는 두 가지 방식이 있습니다.

방식 1: 기준값 기반

처음에는 ML.NET 없이도 가능합니다.

전류 > 기준값
온도 > 기준값
진동 > 기준값
압력 < 기준값
 

이 방식은 빠르게 적용할 수 있습니다.

방식 2: ML.NET Anomaly Detection

센서 데이터가 충분하면 이상감지 모델을 적용합니다.

입력 데이터:

 
public class MachineSensorData
{
    public float Temperature { get; set; }
    public float Current { get; set; }
    public float Voltage { get; set; }
    public float Vibration { get; set; }
    public float Pressure { get; set; }
    public float Speed { get; set; }
}
 

결과:

PredictedLabel = true  → 이상
PredictedLabel = false → 정상
Score = 이상 점수
 

설비 이상감지는 “고장 데이터”가 부족한 경우가 많습니다.
그래서 처음에는 정상 데이터 패턴을 학습하고, 평소와 다른 값을 이상으로 보는 방식이 현실적입니다.


14. ML.NET Model Builder를 활용하는 방법

처음부터 코딩으로 모델을 구성하기 어렵다면 Visual Studio의 ML.NET Model Builder를 쓰는 것이 좋습니다.

Model Builder는 Visual Studio 확장 기능으로, 데이터를 선택하고 학습 작업을 지정하면 모델 학습과 배포 코드를 생성해 주는 도구입니다.

적용 순서는 다음입니다.

1. Visual Studio에 ML.NET Model Builder 설치
2. 예측할 문제 선택
   - Classification
   - Regression
   - Recommendation
   - Image Classification
3. CSV 또는 DB 데이터 선택
4. Label 컬럼 선택
5. 학습 실행
6. 평가 지표 확인
7. 생성된 C# 코드 확인
8. MES / ERP 프로젝트에 통합
 

명령줄 기반으로는 ML.NET CLI도 사용할 수 있습니다. ML.NET CLI는 AutoML을 이용해 여러 알고리즘과 파이프라인을 탐색하고, 가장 좋은 모델과 C# 예측 코드를 생성합니다.


15. 운영 시 반드시 필요한 기능

ML.NET을 MES / ERP에 넣을 때는 예측 코드만 만들면 안 됩니다.
운영 기능이 필요합니다.

1) 모델 버전 관리

defect_prediction_v1.zip
defect_prediction_v2.zip
defect_prediction_v3.zip
 

어떤 모델이 언제부터 사용되었는지 기록해야 합니다.


2) 예측 로그 저장

입력값
예측결과
확률
모델버전
예측시간
사용자
 

이 로그가 있어야 나중에 AI가 맞았는지 틀렸는지 검증할 수 있습니다.


3) 재학습 구조

매월 1회
또는 데이터 1,000건 추가 시
또는 정확도 저하 시
 

자동 재학습까지는 아니어도, 관리자 메뉴에서 재학습 버튼을 제공하면 좋습니다.


4) 예측 결과 보정

AI가 예측한 결과에 대해 관리자가 피드백을 줄 수 있어야 합니다.

AI 판단: 불량 위험
관리자 판단: 정상

AI 판단: 납기 위험
관리자 판단: 위험 맞음
 

이 피드백 데이터를 다음 학습에 반영합니다.


16. ML.NET 방식의 장점

AI 서버 없이 ML.NET을 쓰면 장점이 많습니다.

별도 AI 서버가 필요 없다
C# WinForms에 직접 통합하기 쉽다
인터넷 연결 없이도 동작 가능하다
공장 내부망 환경에 적합하다
데이터 외부 유출 위험이 적다
배포 구조가 단순하다
소규모 MES에 적합하다
 

특히 고객사가 외부망 사용을 꺼리는 제조업체라면 ML.NET 방식이 좋습니다.


17. ML.NET 방식의 한계

반대로 한계도 분명합니다.

ChatGPT 같은 자연어 생성은 어렵다
고급 딥러닝 학습에는 부적합하다
대규모 데이터 학습에는 별도 환경이 낫다
GPU 기반 학습에는 Python 생태계가 강하다
복잡한 RAG 챗봇에는 적합하지 않다
AI 모델 관리 기능을 직접 만들어야 한다
 

그래서 방향은 이렇게 잡는 것이 좋습니다.

ML.NET:
예측, 분류, 이상감지, 간단한 비전

AI 서버 / LLM:
문서 요약, 챗봇, 자연어 분석, Agent
 

18. eMES Lite 기준 추천 적용안

현재 중소제조업 MES Lite를 만든다면, ML.NET 적용 우선순위는 다음이 좋습니다.

1차 적용

불량 위험 예측
납기 지연 위험 예측
작업 소요시간 예측
재고 부족 예측
 

2차 적용

설비 이상 감지
비가동 원인 분류
불량 유형 자동 추천
검사 결과 OK/NG 예측
 

3차 적용

이미지 검사 ONNX 연동
생산계획 추천
원가 상승 요인 예측
고객별 수요 예측
 

이 순서가 현실적입니다.


19. 최종 정리

AI 서버 없이 C# ML.NET만으로도 MES / ERP에 적용할 수 있는 기능은 충분히 많습니다.

가장 적합한 분야는 다음입니다.

불량 예측
납기 지연 예측
작업시간 예측
재고 부족 예측
설비 이상 감지
불량 유형 분류
비가동 원인 분류
간단한 이미지 OK/NG 판정
 

구현 방식은 다음처럼 가는 것이 좋습니다.

1. MES / ERP DB에서 학습 데이터 추출
2. 학습용 테이블 또는 View 생성
3. ML.NET Trainer 프로젝트에서 모델 학습
4. 모델을 .zip 파일로 저장
5. WinForms / MAUI / ASP.NET Core에서 모델 로드
6. 예측 결과를 화면에 표시
7. 예측 로그를 DB에 저장
8. 관리자 피드백을 받아 재학습
 

결론적으로 ML.NET은 중소제조업용 로컬 AI 기능에 매우 적합합니다.

특히 C# WinForms 기반 MES를 만들고 있다면,
별도 AI 서버 없이도 불량 예측, 납기 예측, 재고 예측, 작업시간 예측 같은 실용적인 AI 기능을 충분히 구현할 수 있습니다.

반응형