๐Ÿ˜ŠAI๋ฅผ ์ด์šฉํ•ด์„œ ์–ด๋‘์šด ์ด๋ฏธ์ง€๋ฅผ ๋ฐ๊ฒŒ ๋งŒ๋“ค์–ด๋ณด์ž

,

๊ทธ๋ฆฌ๊ณ  C++23์— ๊ทธ๋Ÿฐ #embed? ๊ฐ™์€ ํŠน๋ณ„ํ•œ ๋…€์„์ด ๋„์ž…๋œ๋‹ค๋‹ˆ C++๋„ ์—ด์‹ฌํžˆ ๊ณต๋ถ€ํ•ด์•ผ๊ฒ ๊ตฐ์š” ์—ฌ์ „ํžˆ ํ˜„์—ญ์ด๋„ค์š”.. #์ด ๋ถ™์€๊ฑฐ ๋ณด๋‹ˆ ์ „์ฒ˜๋ฆฌ๊ธฐ์ชฝ์ธ๊ฐ€๋ณด๊ตฐ์š”? ์‹ ๊ธฐํ•˜๋„ค์š”. (#define #if #pragma ๊ฐ™์€๋…€์„?)

1๊ฐœ์˜ ์ข‹์•„์š”

ํ›Œ๋ฅญํ•œ ๊ธฐ์ˆ  ์ •๋ณด๋ฅผ ์•Œ๋ ค์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
์ €๋„ OpenCV๊ฐ€ ์ ์šฉ๋œ C++ ์ธํ„ฐํŽ˜์ด์Šค ์ฝ”๋“œ๋ฅผ C++/CLI๋กœ ๋ž˜ํ•‘ํ•ด์„œ C# WPF๋กœ ์ด๋ฏธ์ง€ ์ถœ๋ ฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฑ„ํƒํ•ด์„œ ์˜์ƒ์ฒ˜๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“œ๋Š” ์ค‘์ด์—ˆ๋Š”๋ฐ AI(Python)๊นŒ์ง€ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค๋Š”๊ฒŒ ๋†€๋ผ์šธ ๋”ฐ๋ฆ„์ž…๋‹ˆ๋‹ค. ๋„์ „ํ•ด๋ด์•ผ๊ฒ ๋„ค์š”~

2๊ฐœ์˜ ์ข‹์•„์š”

๊ถ๊ธˆํ•œ ์ ์ด ์žˆ์–ด ๋Œ“๊ธ€ ๋‚จ๊น๋‹ˆ๋‹ค.

ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ C++๋กœ ํ•œ ๋ฒˆ ๋ž˜ํ•‘ํ•œ ๋’ค C#์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์กฐ๋กœ ์ž‘์„ฑํ•˜์‹  ๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š”๋ฐ์š”,
C#์—์„œ๋„ ๋ฐ”๋กœ ์ถ”๋ก ์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์œผ๋กœ ์•Œ๊ณ  ์žˆ์–ด์„œ C++ ๋ ˆ์ด์–ด๋ฅผ ๋‘์‹  ์ด์œ ๊ฐ€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

ํ˜น์‹œ ์•„๋ž˜์™€ ๊ฐ™์€ ์ด์œ ๊ฐ€ ์žˆ์—ˆ์„๊นŒ์š”?

  • C#์—์„œ ๋ฐ”๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ค์šด ์ œ์•ฝ, ํ˜ธํ™˜์„ฑ ์ด์Šˆ

  • ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ชฉ์ 

  • ๋ฐฐํฌ/์žฌ์‚ฌ์šฉ์„ฑ(๋‹ค๋ฅธ ์–ธ์–ด/๋ชจ๋“ˆ์—์„œ ๊ณตํ†ต DLL๋กœ ์“ฐ๊ธฐ ๋“ฑ)

  • ๋˜๋Š” ์œ„ ์™ธ์— ๋‹ค๋ฅธ ์ด์œ 

์ž˜ ๋ชฐ๋ผ์„œ ์—ฌ์ญค๋ณด๋ฉฐ ๋‹ต๋ณ€ ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

2๊ฐœ์˜ ์ข‹์•„์š”

AI ONNX ๋ชจ๋ธ์„ ๋Œ๋ฆด๋•Œ ONNX C#๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ง์”€ํ•˜์‹ ๋Œ€๋กœ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ์š”.
C++๋กœ ๋žฉํ•‘ํ•ด์„œ ํšŒ์‚ฌ๋‚ด๋ถ€์— MFC๋‚˜ C++์„ ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ์„ ๊ฐ€์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ c#์œผ๋กœ ๋ž˜ํ•‘ํ•˜๋Š” ๊ณผ์ •์„ ๊ธฐ๋กํ•˜๊ฑฐ๋‚˜ ์ž๋ฃŒ๋กœ ๋งŒ๋“ค์–ด์„œ ์˜๊ฒฌ์„ ๋‚˜๋ˆ„๊ฑฐ๋‚˜ ์ด์ƒํ•œ์  ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์„ ์ด์•ผ๊ธฐํ•ด๋ณด๋ ค ํ–ˆ์Šต๋‹ˆ๋‹ค .

์ €ํฌ ํšŒ์‚ฌ ๋‚ด๋ถ€์—์„œ๋Š” c#์ด๋‚˜ WPF๋ฅผ ์“ฐ์‹œ๋Š”๋ถ„์€ ๊ทน์†Œ์ˆ˜๋ผ ใ… ใ…  ๋‘˜๋‹ค ๋งŒ์กฑํ• ๋ ค๋ฉด ์ € ๋ฐฉ๋ฒ•๋ฐ–์— ์—†๋”๊ตฐ์š”.

์Šฌ๋กœ๊ทธ ๊ธฐ๋ก์ด ์ข€ ์Œ“์ด๋ฉด ๋ฐœํ‘œ์ž๋ฃŒ๋กœ๋„ ์ •๋ฆฌํ•  ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค ใ…  ์ฃผ์ œ๋„˜์ง€๋งŒ.. ์ฉ

4๊ฐœ์˜ ์ข‹์•„์š”

ใ… ใ…  ์ „์Ÿํ„ฐ์—์„œ ๋™์ง€๋ฅผ ๋งŒ๋‚œ ๊ธฐ๋ถ„์ด๊ตฐ์š” ใ… 
๊ฐ™์ด ์˜๊ฒฌ ๋‚˜๋ˆ ๋ด์š” ใ… ใ… 

2๊ฐœ์˜ ์ข‹์•„์š”

์ง€๊ธˆ๊นŒ์ง€์˜ ๊ณผ์ •์„ ๋ฐ˜์˜ํ•˜์—ฌ ๋ˆ„๊ฒŸํŒจํ‚ค์ง€์™€ README๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ git์— ์˜ฌ๋ ธ์Šต๋‹ˆ๋‹ค.

๋‚ด์ผ.. C# ์ž‘์—…ํ•ด์•ผ๊ฒ ๊ตฐ์š”.

Tutorial Code

#include <lle/memoryPool.h>
#include <lle/image.h>
#include <lle/lle.h>
#include <iostream>

int main()
{
    try {
        // create lle instance
        auto lle = lleapi::v1::lle::create();

        // load Zero-DCE++ model on CPU
        // (also supports loading an ONNX model from a file path)
        lle->setup(lleapi::v1::dlType::zeroDCE, lleapi::v1::device::cpu);

        // load color image
        auto input = lleapi::v1::image::imread(
            "C://github//dataset//lol_dataset//our485//low//low_15.png",
            lleapi::v1::colorType::color
        );

        // predict
        auto output = lle->predict(input);

        // save result image
        lleapi::v1::image::imwrite(
            "C://github//LLE//LLE//x64//Debug//result1.jpg",
            output
        );

        // cleanup internal instance
        lle->shutdown();
    }
    catch (std::exception ex) {
        std::cout << ex.what() << std::endl;
    }
}

์ฝ”๋“œ๋กœ ๋ณด์‹œ๋‹ค์‹œํ”ผ ๋ชจ๋ธ ๊ฒฝ๋กœ๋ฅผ ์ž…๋ ฅ ํ•˜์ง€ ์•Š์•„๋„ enum flag๋ฅผ ๋„ฃ์–ด์„œ dll๋‚ด๋ถ€์— ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ๋ชจ๋ธ ๋ฐ”์ด๋Ÿฌ๋‹ˆ๋ฅผ ์ฝ์–ด์„œ ๋กœ๋“œํ•˜๋„๋ก ์ž‘์—…ํ–ˆ์Šต๋‹ˆ๋‹ค. bin2c๋กœ ๊ทธ๋ƒฅ ํ—ค๋” ํŒŒ์ผ๋กœ ๋งŒ๋“ค์–ด์„œ ๋„ฃ์—ˆ๋„ค์š” ใ…  .. ๋‹ค์Œ์—๋Š” asm ๋ฐฉ๋ฒ•์ด๊ฑด ๋‹ค๋ฅด๊ฒŒ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋ฐ€์–ด๋„ฃ๋Š” ์ž‘์—…์„ ํ•ด๋ณด๊ณ  ์‹ถ๊ตฐ์š”.

๋‚ด์ผ ํ•  ๊ฒƒ..

์ด์ œ๋Š” ์ •๋ง๋กœ ๋‹ท๋„ท์šฉ ๋žฉํ•‘!!

6๊ฐœ์˜ ์ข‹์•„์š”

C++/CLI๋ฅผ ํ†ตํ•œ ๋žฉํ•‘

์ฝ”๋“œ ์ž‘์—…์€ ์™„๋ฃŒ ๋˜์—ˆ๊ณ  ๋ˆ„๊ฒŸ์œผ๋กœ ํŒจํ‚ค์ง•ํ•˜๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๋ˆ„๊ฒŸ๋„ ํ•ด๋ณด๋‹ˆโ€ฆ cpp dll์ด ํฌํ•จ๋˜์–ด์žˆ๋Š” ํŒจํ‚ค์ง•์„ ์ง„ํ–‰ํ•  ๋•Œ์—๋Š” ์กฐ๊ธˆ ๋” ๊นŒ๋‹ค๋กญ๊ตฐ์š”.
์•„๋ž˜๋Š” ์ด์ „์— ์ž‘์„ฑํ•œ cpp์ฝ”๋“œ์™€ ์ง€๊ธˆ ๋งŒ๋“  managed ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ˜•ํƒœ๋ฅผ ๋น„๊ตํ•˜๊ธฐ ์‰ฝ๋„๋ก ์ ์—ˆ์Šต๋‹ˆ๋‹ค.

CPP

#include <lle/memoryPool.h>
#include <lle/image.h>
#include <lle/lle.h>
#include <iostream>

int main()
{
    try {
        // create lle instance
        auto lle = lleapi::v1::lle::create();

        // load Zero-DCE++ model on CPU
        // (also supports loading an ONNX model from a file path)
        lle->setup(lleapi::v1::dlType::zeroDCE, lleapi::v1::device::cpu);

        // load color image
        auto input = lleapi::v1::image::imread(
            "C://github//dataset//lol_dataset//our485//low//low_15.png",
            lleapi::v1::colorType::color
        );

        // predict
        auto output = lle->predict(input);

        // save result image
        lleapi::v1::image::imwrite(
            "C://github//LLE//LLE//x64//Debug//result1.jpg",
            output
        );

        // cleanup internal instance
        lle->shutdown();
    }
    catch (std::exception ex) {
        std::cout << ex.what() << std::endl;
    }
}

CSharp

namespace ManagedTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            try
            {

                //// Create LLE Instance
                var lle = LLEAPI.V1.LLE.Create();


                //// load zerodce model and load on cpu
                //// its also support onnx model load from path
                lle.Setup(LLEAPI.V1.DlType.ZeroDCE, LLEAPI.V1.Device.Cpu);

                //// load color image
                var input = LLEAPI.V1.Image.Imread("C://github//dataset//lol_dataset//our485//low//low_15.png", LLEAPI.V1.ColorType.Color);

                //// predict 
                var output = lle.Predict(input);

                //// save image file on disk
                LLEAPI.V1.Image.Imwrite("C://github//LLE//LLE//x64//Debug//result1.jpg", output);

                //// cleanup internal instance
                lle.Shutdown();


            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.ToString());
            }
        }
    }
}

C++/CLI๋ฅผ ํ†ตํ•œ ๋žฉํ•‘ ์žฅ๋‹จ์ 

๊ฐœ์ธ์ ์œผ๋กœ ์œˆ๋„์šฐ OS๋งŒ์„ ํ•œ์ •ํ•ด์„œ ์ž‘์—…ํ•  ๋•Œ C++/CLI์„ ํ†ตํ•ด ๋žฉํ•‘ํ•˜๋Š” ๋ฐฉ์‹์ด ์ด์ ์ด ๋” ๋งŽ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ์ƒ๊ฐํ•˜๋Š” ์žฅ๋‹จ์ ์ž…๋‹ˆ๋‹ค.

์žฅ์ 

  1. ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋žฉํ•‘ํ•  ์‹œ ๋Œ•๊ธ€๋ง ํฌ์ธํ„ฐ ๋ฒ„๊ทธ๋ฅผ ์ตœ์†Œํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. PInvoke ๋งˆ์ƒฌ๋ง์„ ํ†ตํ•ด ๋žฉํ•‘ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„๊ตํ•˜์—ฌ C++ dll ๋‚ด๋ถ€์—์„œ ์ง„ํ–‰ํ•˜๋Š” ๋ธŒ๋ฆฟ์ง€ ํ•จ์ˆ˜ ์ž‘์—…์ด ํ•„์š” ์—†๋‹ค. (์˜ˆ: ABI ํ˜ธํ™˜ ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•œ extern "C"๋ฅผ ๋ถ™์ธ primitive ํƒ€์ž… ์ž…์ถœ๋ ฅ ํ•จ์ˆ˜ ์ž‘์—…)
  3. ๊ฐ์ฒด ํด๋ž˜์Šค ๋žฉํ•‘์ด ์‰ฝ๋‹ค.
  4. throw๊ฐ€ ์žˆ๋Š” C++ ํ•จ์ˆ˜ ๋žฉํ•‘์ด ์‰ฝ๋‹ค.
  5. ํ‘œ์ค€ C++๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ std::string ํƒ€์ž…์ด๋‚˜ std::vector๊ฐ™์€ ์ปจํ…Œ์ด๋„ˆ์™€์˜ ์ปจ๋ฒ„์ „์„ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  6. ๋ณต์žกํ•œ C++๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์„ค๊ณ„ ํ˜•ํƒœ๋„ ๋ณ€๊ฒฝ ์—†์ด ์œ ์ง€๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋‹จ์ 

  1. C++/CLI ์–ธ์–ด ๋Ÿฌ๋‹์ปค๋ธŒ๊ฐ€ ์žˆ์Œ.
  2. ๋ฉ€ํ‹ฐ OS ์ง€์›์ด ๋ถˆ๊ฐ€๋Šฅ
  3. C++์–ธ์–ด์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ์–ด๋А ์ •๋„ ํ•„์š”.
  4. ๋„ค์ดํ‹ฐ๋ธŒ ์–ธ์–ด์™€ ํ˜ผ์šฉํ•˜๋Š” ์–ธ์–ด์ด๊ณ  managed์–ธ์–ด์—์„œ ๋ณด๋˜ ์—๋Ÿฌ ํ˜•ํƒœ์™€๋Š” ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋””๋ฒ„๊น… ๋‚œ์ด๋„๊ฐ€ ์กฐ๊ฑด๋ถ€๋กœ ์ƒ์Šน.

๋‹ค์Œ์— ํ•  ์ผ

C# WPF UI ๊ฐœ๋ฐœ์€ ๋ฌด์กฐ๊ฑด ํ•  ๊ฒƒ์ด๊ณ โ€ฆ ์‹œ๊ฐ„์ด ๋œ๋‹ค๋ฉด C++/CLI์™€ ๋งˆ์ƒฌ๋ง์˜ ์ฐจ์ด๋ฅผ ์ข€๋” ์ž์„ธํ•˜๊ฒŒ ๊ธฐ๋ก์„ ํ•ด๋ณด๊ณ ์‹ถ๊ตฐ์š”.

2๊ฐœ์˜ ์ข‹์•„์š”

์ฒจ์–ธ์„ ์ข€ ๋“œ๋ฆฌ๋ฉด, ๋„ค์ดํ‹ฐ๋ธŒ ํ•ธ๋“ค์€ SafeHandle (SafeHandle ํด๋ž˜์Šค (System.Runtime.InteropServices) | Microsoft Learn)์„ ํ†ตํ•ด ์ œ๊ณตํ•ด์ฃผ์‹œ๊ณ , ์ด๊ฑธ ํฌ์žฅํ•˜๋Š” ๋งค๋‹ˆ์ง€๋“œ ๋ž˜ํผ๋Š” IDisposable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ด์ฃผ์‹œ๋ฉด ๋” ์ข‹์Šต๋‹ˆ๋‹ค.!

1๊ฐœ์˜ ์ข‹์•„์š”

๋Œ“๊ธ€์„ ๋จผ์ € ๋ดค์–ด์•ผํ–ˆ๋Š”๋ฐ ๋Œ€์ถฉ ํ•ด๋ฒ„๋ ธ๊ตฐ์š” ใ…Žใ…Ž ๋‹ค์Œ๋ฒ„์ „ ์ˆ˜์ •ํ• ๋•Œ ๋ฐ˜์˜ํ•ด์•ผ๊ฒ ์Šต๋‹ˆ๋‹ค ใ… 

1๊ฐœ์˜ ์ข‹์•„์š”

์•„ ์ด ์ž๋ฃŒ๋Š” ์ด๋ ‡๊ฒŒ ๊ฐ€๋ณ๊ฒŒ ๋ณผ ์ž๋ฃŒ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ธˆ์ชฝ๊ฐ™์€ ์ž๋ฃŒ๋„ค์š” ์ •๋ง ๋”ฅํ•˜๊ฒŒ ํ•œ๋ฒˆ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
์ œ๊ฐ€ ๋‹น์žฅ์˜ ๋ชฉํ‘œ๊ฐ€ โ€œํ•™์Šตํ•˜๋Š” ๋ฐฉ๋ฒ• ๊ทธ๊ฑธ ํ™œ์šฉโ€ ์ด ๋‚œ์ œ์— ๋Œ€ํ•ด์„œ ์–ด๋–ป๊ฒŒ๋“  ํ•ด๋ณผ๋ ค๊ณ  ํ•˜๊ณ  ์žˆ๊ฑฐ๋“ ์š”
๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

3๊ฐœ์˜ ์ข‹์•„์š”

ํ•™์Šตํ•˜๋Š” ๋ฐฉ๋ฒ• ํ™œ์šฉ์ด๋ผ๋Š”๊ฒŒ ๊ทธ ๋”ฅ๋Ÿฌ๋‹ ํ•™์Šต ๋ง์”€ํ•˜์‹œ๋Š”๊ฑด๊ฐ€์šฉ?

๋ฐ์ดํƒ€์…‹์„ ๋ชจ์•„๋†“๊ณ  ์ด๊ฑธ ํ•™์Šต ํ•œ๋‹ค๋Š” ๊ฐœ๋…์„ ์ž˜๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ ํ•™์Šตํ•ด์„œ ํŒจํ„ด์„ ๋งŒ๋“ค์–ด์„œ ๋‹ค๋ฅธ ๋ฐ์ดํƒ€์…‹์— ์ ์šฉํ•œ๋‹ค
์ด๊ฑธ ๋ฐฐ์šฐ๊ณ ์‹ถ์Šต๋‹ˆ๋‹ค.

1๊ฐœ์˜ ์ข‹์•„์š”

๋งŒ์•ฝ ๊ทธ AIํ•™์Šต์„ ์‹œํ‚ค๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด๋ผ๋ฉด AI๋ฅผ ๊นŠ๊ฒŒ ๋ชจ๋ฅด๋”๋ผ๋„ ๊ฐ„๋‹จํ•œ ์ถ”๋ก ์„ ์ดํ•ดํ•˜์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. (๋ฐ”์ด๋ธŒ์ฝ”๋”ฉ์œผ๋กœ AI์—๊ฒŒ ์‹œํ‚ค๋”๋ผ๋„ ์ถ”๋ก ์ด ๋ฌด์—‡์ธ์ง€ ์ดํ•ดํ•˜๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค.)
์ œ๊ฐ€ ํŒŒ๋ž€๋งค๋‹˜์ด ์˜๋„ํ•œ ๊ฒƒ์„ ์ •ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•œ ๊ฒƒ์ธ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ โ€œํ•™์Šตํ•˜๋Š” ๋ฐฉ๋ฒ• ๊ทธ๊ฑธ ํ™œ์šฉโ€ ์ด ๋ถ€๋ถ„? ์š”์ฆ˜ํ•˜๋Š” AI๊ฐ€ ํ•™์Šตํ•˜๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๊ณ  ํ†ต์ฐฐ์„ ์–ป์–ด์„œ ํ™œ์šฉ์„ ํ•˜์‹œ๋Š” ๊ฑฐ๋ผ๋ฉด

์ฐธ๊ณ ๋กœ ์ €๋Š” ์ธ๋ฌธ๊ณ„, ์ด๊ณผ ์ถœ์‹ ์ด ์•„๋‹ˆ๋ผ ์ˆ˜๋Šฅ๋„ ์ณ๋ณธ ์  ์—†๋Š” ๊ณต๊ณ ์ถœ์‹  ์‚ฌ๋žŒ์ธ์ง€๋ผ -_-..
์ „์ž๊ณผ๋ฅผ ๋‚˜์™”์ง€๋งŒ ๋ฏธ๋ถ„์€ ๋Œ€ํ•™์ƒ ํ•™๋ถ€์ƒ๋•Œ ๊ณ ์ƒํ•˜๋ฉด์„œ ์™ธ์šฐ๋ฉด์„œ ํ•™์ ์„ ์œ„ํ•œ ๊ณต๋ถ€๋ฅผ ํ–ˆ๊ณ  ์–ด๋ ค์šด ์ˆ˜ํ•™ ๊ธฐํ˜ธ๋ฅผ ์ •๋ง ์ž˜๋ชป๋ด…๋‹ˆ๋‹ค -_-..
๊ณ ๋“ฑ๊ณผ์ •์„ ์ด๊ณผ๋ฅผ ๋‚˜์˜ค์‹  ๋ถ„๋“ค์€ ์ •๋ง ๋น ๋ฆฟ๋น ๋ฆฟํ•˜๊ฒŒ ์ž˜๋ณด์‹œ๋”๊ตฐ์š” -_-..
๊ทธ๋ ‡๋‹ค๊ณ  ํ•ด์„œ ๋”ฅ๋Ÿฌ๋‹ ๋…ผ๋ฌธ ์ „๋ถ€๊ฐ€ ๋‹ค ์–ด๋ ค์šด ๊ฒƒ์€ ์•„๋‹ˆ๊ณ  ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์‰ฌ์šด ๊ฒƒ๋“ค๋งŒ ๊ณจ๋ผ์„œ ๋ณด๋Š” ๊ฒƒ ๋งŒ์œผ๋กœ๋„ ๋„์›€์ด ๋งŽ์ด๋ฉ๋‹ˆ๋‹ค.

์ œ๊ฐ€ ๊ณต๋ถ€ํ–ˆ๋˜ ์ˆœ์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์ž‘์€ AI ํ•ธ๋“œ๋ถ์ด๋‚˜ ๊ฐ•์˜๋ฅผ ๋“ค์œผ๋ฉด ๊ณตํ†ต์ ์œผ๋กœ ๋‚˜์˜ค๋Š” ๊ฒƒ๋“ค.

  1. Linear Regression
  2. Gradient Descent Algorithm
  3. Multivariate Linear Regression
  4. Logistic Regression
  5. Multivariate Logistic Regression
  6. XOR Problem
  7. Multi Layer Perceptron (MLP)
  8. Dropout
  9. CNN
  10. Batch Normalization
  11. Classification

๊ทผ๋ฐ ์ €๊ฒƒ๋“ค์„ ์ €๋ ‡๊ฒŒ ์Œ.. ๋ญ๋ž„๊ฐ€ ๋˜‘๋˜‘ํ•˜์‹  ๋ถ„๋“ค ์šฉ์–ด๋กœ ๋ณด์ง€๋ง๊ณ  ์ง๊ด€์ ์ธ ์ž๊ธฐ๋งŒ์˜ ๊ฐ๊ฐ์œผ๋กœ ๋ณด๋Š”๊ฒŒ ์ค‘์š”ํ•œ๊ฑฐ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ €๋Š” ์ €๊ฒƒ๋“ค์„ ์•„๋ž˜ ๋ฆฌ์ŠคํŠธ๋กœ ๋‹ค์‹œ ์น˜ํ™˜ํ•ด์„œ ๋จธ๋ฆฌ์†์— ๊ธฐ์–ตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ๋ฐฉ์‹๋Œ€๋กœ ์ดํ•ดํ•œ ๊ฒƒ

  1. Linear Regression โ†’ ๊ฐ’์„ ์˜ˆ์ธกํ•˜๋Š” ๋ฐฉ๋ฒ•
  2. Gradient Descent Algorithm โ†’ ๋กœ์Šค ๊ธฐ์šธ๊ธฐ ๊ณ„์‚ฐ์„ ์œ„ํ•œ ์—ฐ์‡„๋ฏธ๋ถ„ ํ‘ธ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜?
  3. Multivariate Linear Regression โ†’ ๊ฐ’์„ ์˜ˆ์ธกํ• ๋•Œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋‹ค๋ณ€์ˆ˜ ์ž…๋ ฅ?์„ ๊ฐ€์ง€๊ณ  ์˜ˆ์ธก
  4. Logistic Regression โ†’ ํ™•๋ฅ ์„ ์˜ˆ์ธก
  5. Multivariate Logistic Regression โ†’ ํ™•๋ฅ ์„ ์˜ˆ์ธกํ• ๋•Œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋‹ค๋ณ€์ˆ˜ ์ž…๋ ฅ?์„ ๊ฐ€์ง€๊ณ  ์˜ˆ์ธก
  6. XOR Problem โ†’ ์„ฑ๋Šฅ์„ ๋Œ์–ด ์˜ฌ๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ ๋น„์„ ํ˜•์ด ํ•„์š”ํ•œ ์ด์œ 
  7. Multi Layer Perceptron (MLP) โ†’ 5๋ฒˆ์˜ XOR๋กœ ์ธํ•ด ๊ณ ์•ˆ๋œ ์„ค๊ณ„
  8. Dropout โ†’ ํ•™์Šต ์•ˆ์ •ํ™”๋ฅผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ค‘ ํ•˜๋‚˜
  9. CNN โ†’ ํ•„ํ„ฐ๋ฅผ ํ•™์Šตํ•ด๋ณด์ž
  10. Batch Normalization โ†’ ํ•™์Šต ์•ˆ์ •ํ™”๋ฅผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ค‘ ํ•˜๋‚˜
  11. Classification โ†’ ํ™•๋ฅ  ์˜ˆ์ธก์„ํ•ด์„œ ๋ฌผ์ฒด๋ฅผ ๋ถ„๋ฅ˜

์ฑ…๋„ ์—ฌ๋Ÿฌ ๊ฐœ ๋ณด๋ฉด ๋„์›€๋„ ์•ˆ๋˜๊ณ  ๋„ˆ๋ฌด ๋ณต์žกํ•ด์ง€๊ธฐ ๋–„๋ฌธ์— โ€ฆ
๋งˆ์น˜ GoF ๋””์ž์ธ ํŒจํ„ด ์›์„œ๋ฅผ ๋ณด๋ฉด ๋จธ๋ฆฌ๊ฐ€ ์•„ํ”„์ง€๋งŒ Head First Design Pattern์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋ณด๋ฉด ์‰ฝ๋“ฏ์ด.
ํ™์ฝฉ๊ณผ๊ธฐ๋Œ€ ๊ต์ˆ˜๋‹˜ ์„ฑํ‚ด ๊ต์ˆ˜๋‹˜์˜ ์ € ๋ฌด๋ฃŒ ์ž๋ฃŒ ์‹œ์ฆŒ1๋งŒ ์ดํ•ด๋  ๋•Œ ๊นŒ์ง€ ๋Œ๋ ค๋ดค์Šต๋‹ˆ๋‹ค. (ํ˜ผ์ž์„œ ์ˆ˜์‹ญ๋ฒˆ -_- ์ดํ•ด์•ˆ๋˜๋ฉด ๋‹ค์Œ์œผ๋กœ ๋„˜์–ด๊ฐ€์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ค‘์š”.)
์ œ๊ฐ€ ๋ณธ AIํ•™์Šต ์ž๋ฃŒ์ค‘ ๊ฐ€์žฅ ์ง๊ด€์ ์ธ ์„ค๋ช…์„ ํ•˜์‹œ๋”๊ตฐ์š”.. ์ง๊ด€์ ์ธ ์ดํ•ด๊ฐ€ ๋” ์ค‘์š”ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ฝ”๋”ฉ์€ ํ•  ํ•„์š”์—†๊ณ .. ์ง๊ด€์ ์ธ ์ดํ•ด๋ฅผ ์œ„ํ•ด์„œ๋งŒ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋“ฃ๊ธฐ๋งŒ ํ•˜์‹œ๊ณ  ๋„ˆ๋ฌด ์ดํ•ด๊ฐ€ ์•ˆ๋˜๋ฉด
์ฃผ๋ณ€์— ๋ฉ˜ํ† ๋ถ„์ด ๊ณ„์‹œ๋‹ค๋ฉด ๋ฌผ์–ด๋ด์„œ ์ดํ•ดํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ• ๊ฐ™์Šต๋‹ˆ๋‹ค. (์‹œ์ฆŒ1๋งŒ ๋ณด์„ธ์š”)

๊ฐœ์ธ์ ์œผ๋กœ ๊ฐ€์žฅ ์–ด๋ ค์› ๋˜ ๊ฐœ๋…

1~11์ ์–ด๋†“์€ ๊ฒƒ ์ค‘์— Mutivariate ๋ผ๊ณ  ์ ํžŒ๊ฒŒ ์žˆ๋Š”๋ฐ ์ €๊ฒƒ๋“ค์€ -_- ํŽธ๋ฏธ๋ถ„์ด๋ผ๋Š” ๊ฒƒ์„ ํ•ด์•ผ๋ฉ๋‹ˆ๋‹ค.
ํŽธ๋ฏธ๋ถ„์„ ํ‘ธ๋Š”๊ฒŒ ์–ด๋ ค์šด๊ฒŒ ์•„๋‹ˆ๋ผ ์ €๊ฒŒ ์™œ ํŽธ๋ฏธ๋ถ„์ด์–ด์•ผ ํ•˜๋Š”์ง€๊ฐ€ ๋จธ๋ฆฌ์†์— ์•ˆ๊ทธ๋ ค์ง€๋ฉด ์ •๋ง ๋‚œ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทผ๋ฐ ๊นจ์šฐ์น˜๊ณ  ๋‚˜์„œ๋ถ€ํ„ฐ๋Š” ๋˜ ๋‹ค๋ฅธ ํ†ต์ฐฐ์˜ ํฌ์—ด์„ ๋А๋ผ์‹ค๊ฒ๋‹ˆ๋‹ค.

์ €๊ฒƒ๋“ค์ด ๋‚˜์—๊ฒŒ ์ค€ ํ†ต์ฐฐ? ๋А๋‚Œ?

์˜ˆ๋กœ๋“ค์–ด Yolo๊ฐ™์€ ๊ฒฝ์šฐ ๋ฌผ์ฒด์˜ ๋ฐ•์Šค 1๊ฐœ๋ฅผ ์˜ˆ์ธก์„ ํ•˜๋ ค๋ฉด ๋ฐ•์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” x, y, width, height๊ณผ ๋ฌผ์ฒด ์ธ์ง€ ์•„๋‹Œ์ง€ ํ™•๋ฅ ์ด ๋“ค์–ด๊ฐ€๊ฒŒ๋ฉ๋‹ˆ๋‹ค.
๊ฐ’์ด 4๊ฐœ๊ณ  ๋ฌผ์ฒด์˜ ํ™•๋ฅ ์„ ์˜ˆ์ธกํ•˜๋Š”๊ฒƒ 1๊ฐœ๊ฐ€ ๋“ค์–ด๊ฐ€์•ผ๋˜๊ธฐ๋•Œ๋ฌธ์— ๊ทธ๋ƒฅ ๋А๋‚Œ์œผ๋กœ? Linear Regression ์Šค๋Ÿฌ์šด๊ฒƒ 4๊ฐœ์™€ Logistic Regression ์Šค๋Ÿฌ์šด๊ฒƒ 1๊ฐœ๊ฐ€ ์ตœ์†Œํ•œ ๋“ค์–ด๊ฐ€์•ผ ๋˜๊ฒ ๋‹ค๋ผ๋Š” ์ƒ๊ฐ์„ ๊ฐ€์ง€๊ฒŒ๋ฉ๋‹ˆ๋‹ค. (์‹ค์ œ๋กœ๋Š” ๋” ๋ณต์žกํ•˜์ง€๋งŒ ๊ทธ๋Ÿฐ ๋А๋‚Œ?์ด ๋– ์˜ค๋ฅด๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๋Š” ์˜๋ฏธ๋กœ ๋ง์”€๋“œ๋ ธ์Šต๋‹ˆ๋‹ค.)

๊ทธ๋ฆฌ๊ณ  ์ € 1~11 ๋‹จ๊ณ„๋ฅผ ์ดํ•ด๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด ์ž์‹ ๊ฐ์ด ๋ถ™๊ณ  ์‰ฌ์šด ๋…ผ๋ฌธ๋“ค์€ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
๋ถ„์•ผ๋„ ๋‹ค์–‘ํ•˜์ง€๋งŒ ์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๋ชจ๋ธ์˜ ๊ตฌ์กฐ ์ œ์•ˆ, ๊ฐ„๋‹จํ•œ ๋ชจ๋ธ ๊ฐœ์„  ๋…ผ๋ฌธ ์œ„์ฃผ๋กœ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
๊ทธ๋‚˜๋งˆ ์ƒ๋Œ€์ ์œผ๋กœ ๋‹ค๋ฅธ ๋ถ„์•ผ ๋ณด๋‹ค ๋ณ€๋™์ด ์ ๊ณ  ๋…ผ๋ฌธ ํ•˜๋‚˜๋ฅผ ์ž˜ ์ดํ•ดํ•˜๊ณ  ์žˆ์œผ๋ฉด ์šฐ๋ ค๋จน๊ธฐ๊ฐ€ ๋งŽ์•„์„œ ๊ณ„์† ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
๋”ฅ๋Ÿฌ๋‹ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ผ๋ผ๋Š” ๋ง์€ ์ ˆ๋Œ€ ์•„๋‹ˆ๊ณ  ๋ช‡๊ฐœ๋ฅผ ์ฝ์–ด๋ณด๋ฉด AI๋‚˜ ๋‹ค๋ฅธ ๋”ฅ๋Ÿฌ๋‹ ๊ฐœ๋ฐœ์ž๋“ค๊ณผ ์ด์•ผ๊ธฐํ•˜๊ธฐ ์‰ฌ์›Œ์ง€์‹ค ๊ฒ๋‹ˆ๋‹ค.

๊ธฐ์ดˆ ๊ณต๋ถ€ ์ดํ›„ ์•„์ฃผ ์•„์ฃผ ๋ชจ๋ธ ๊ตฌ์กฐ ๋…ผ๋ฌธ ์ถ”์ฒœ

  1. VGG (2014๋…„ ๋…ผ๋ฌธ)
  2. GlobalAverage Pooling (2014๋…„ ๋…ผ๋ฌธ)
  3. ResNet (2015๋…„ ๋…ผ๋ฌธ)
  4. DenseNet (2016๋…„ ๋…ผ๋ฌธ)
  5. MobileNet (2017๋…„ ๋…ผ๋ฌธ)
  6. SENet (2017๋…„ ๋…ผ๋ฌธ)
  7. CBAM (2018 ๋…ผ๋ฌธ) โ†’ ์ž๋ž‘์Šค๋Ÿฌ์šด ๊ตญ์‚ฐ ๋…ผ๋ฌธ (KAIST)
  8. MobileNetV3 (2019๋…„ ๋…ผ๋ฌธ)
  9. CSPNet (2019๋…„ ๋…ผ๋ฌธ)
  10. EfficientNet (2019๋…„ ๋…ผ๋ฌธ)
  11. RexNet (2021๋…„ ๋…ผ๋ฌธ) โ†’ ์ž๋ž‘์Šค๋Ÿฌ์šด ๊ตญ์‚ฐ ๋…ผ๋ฌธ (๋„ค์ด๋ฒ„)
  12. ์ทจํ–ฅ์— ๋”ฐ๋ผ Transformer ํ˜น์€ Mamba ๋…ผ๋ฌธ ํŠนํžˆ ํ…์ŠคํŠธ๋ฅผ ๋‹ค๋ฃจ์‹œ๋Š” ๋ถ„์ด๋ผ๋ฉด.

์™œ ์ด ๋…ผ๋ฌธ๋“ค์„ ์–ธ๊ธ‰ ํ•˜๋ƒ๋ฉด ์ด ๋…ผ๋ฌธ๋“ค์ด ์ง„์งœ ๋ง๊ทธ๋Œ€๋กœ ๋ชจ๋ธ ๊ตฌ์กฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ•˜๋Š”์ง€๋ฅผ ๋‹ค๋ฃจ๋Š” ๋…ผ๋ฌธ๋“ค์ด๊ธฐ ๋–„๋ฌธ์ž…๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ๊ฐœ์„ ..
์˜ˆ์‹œ๋กœ ์ผ๋ฐ˜ ๊ฐœ๋ฐœ์ž๋“ค์ด Yolo๋ฅผ ๋ชจ๋ธ๋กœ ์ดํ•ดํ•˜์‹œ์ง€๋งŒ Yolo๋Š” ๋ฌผ์ฒด๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ์•ˆํ•˜๋Š” ๋…ผ๋ฌธ์ด์ง€ ๋ชจ๋ธ์˜ ๊ตฌ์กฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋…ผ๋ฌธ์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— -_- ๋ฌผ๋ก  Yolo๋ฅผ ๋ณด์‹œ๋ฉด ๊ทธ ๋‚˜๋ฆ„๋Œ€๋กœ ๊ตฌ์กฐ ๊ฐœ์„ ์„ ์ œ์•ˆํ•˜์ง€๋งŒ ์ดˆ์ ์€ ํ…Œ์Šคํฌ๋ผ๋Š” ๊ฑฐ์ง€์š”.
๊ทธ๋ฆฌ๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ์„ฑ๋Šฅ ๊ฐœ์„ ์ด๋‚˜ ํŠธ๋ Œ๋“œ๋ฅผ ๋ฐ”๊ฟ€ ์ •๋„์˜ ํŒŒ๊ธ‰๋ ฅ์€ ๋Œ€๋ถ€๋ถ„ ์ œ๊ฐ€ ๋А๋ผ๊ธฐ์— ๋ชจ๋ธ๊ตฌ์กฐ์™€ Lossํ•จ์ˆ˜์˜ ์„ค๊ณ„, ๊ธฐ๋ฐœํ•œ ํ•™์Šต์ „๋žต์—์„œ ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์Šคํฌ ๋…ผ๋ฌธ์— ์ง‘์ฐฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹คใ… 
๋ชจ๋ธ์„ ๋งŒ๋“ค ์ค„ ์•Œ๊ฒŒ ๋˜๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ…Œ์Šคํฌ ๋…ผ๋ฌธ๋“ค์ด ์‰ฝ๊ฒŒ ๋‹ค๊ฐ€์˜ค์‹ค ๊ฒ๋‹ˆ๋‹ค.

ํ˜ผ์ž ๊ณต๋ถ€ํ•˜๊ธฐ ์œ„ํ•œ ํˆด ์ถ”์ฒœ

2017๋…„๋„์— ํ˜ผ์ž์„œ -_- ๋Œ€ํ•™์›์•ˆ๊ฐ€๊ณ  ํšŒ์‚ฌ๋‹ค๋‹ˆ๋ฉด์„œ ๋•…์— ๋จธ๋ฆฌ๋ฐ•์น˜๊ธฐํ•˜๋ฉด์„œ ๋…ํ•™ํ• ์ ์—๋Š” chatgpt๊ฐ™์€๊ฒŒ ์—†์—ˆ์ง€๋งŒ.. ์š”์ฆ˜์€ ๋„ˆ๋ฌด ์ข‹์€ ๊ฒƒ๋“ค์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ๋„๊ตฌ๋ฅผ ์ž˜ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค.

  1. chatgpt๊ฐ™์€ LLM๋ชจ๋ธ (์กฐ์–ธ์„ ๊ตฌํ•ด์•ผ ๋˜๊ธฐ ๋•Œ๋ฌธ์—)
  2. Moonlight (๋…ผ๋ฌธ ์š”์•ฝ ๋ฐ ๋ฒˆ์—ญ์„ ๊ธฐ๊ฐ€๋ง‰ํžˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค)
  3. ๊ตฌ๊ธ€ Notebook์˜ ๊ธฐ๋Šฅ ์ค‘ ํŒŸ์ผ€์ŠคํŠธ ๋‚˜๋ ˆ์ด์…˜ ๊ธฐ๋Šฅ
    (์ € ๊ธฐ๋Šฅ์œผ๋กœ ๋…ผ๋ฌธ์„ ์Œ์„ฑํŒŒ์ผ๋กœ ๋ฐ”๊ฟ”์„œ ์ถœ๊ทผํ•˜๋Š” ๊ธธ์— ํ‹€์–ด์„œ ๋“ค์œผ์‹œ๋ฉด ๋„์›€์ด ๋˜์‹ค๊ฒ๋‹ˆ๋‹ค.)
5๊ฐœ์˜ ์ข‹์•„์š”

๊ทธ ํ‚ค๋ชจ๋‹˜์ด ๋งค์›”ํ•˜์‹œ๋Š” ํ–‰์‚ฌ๋ผ๊ณ ํ•ด์•ผ๋˜๋‚˜ -_- ์ €๋„ ํœด์ง์ค‘์— ๊ฐ€์„œ ์–ผ๊ตด์ด๋ผ๋„ ๋น„์ถœ๋ ค๊ณ  ์ฐธ์„ํ•ด๋ณผ๋ ค๊ณ ํ•˜๋Š”๋ฐ์š” ์ง€๊ธˆ๊นŒ์ง€ ํšŒ์‚ฌ ์ผ๋งŒํ•œ๋‹ค๊ณ  ์Œ์ง€์— ์žˆ๋‹ค๊ฐ€ ๋ฐ”๊นฅ์ด ์–ด๋–ป๊ฒŒ ๋Œ์•„๊ฐ€๋Š”์ง€ ๊ถ๊ธˆํ•ด์„œ ใ…‹ใ…‹ ๊ทธ๋•Œ ์˜ค์‹œ๋ฉด ์–ผ๊ตด๋ณด๊ณ  ์ด์•ผ๊ธฐํ•˜๋ฉด ์ข‹๊ฒ ๊ตฐ์š” ํ›„ํ›„โ€ฆ

์•„ ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋Ÿฐ ์ ‘๊ทผ์€ ์ข‹์œผ์‹ ๊ฑฐ๊ฐ™๊ตฐ์š” ํ•™์Šต์ด๋ผ๋Š” ๊ทธ ๊ฐœ๋…์„ ์•Œ๊ณ  ์‹ถ๋‹ค๋ผ๋Š” ๊ทธ๋А๋‚Œโ€ฆ
์ €๋„ ๊ทธ๋ ‡๊ฒŒ ์‹œ์ž‘ํ•œ๊ฑฐ๋ผ 2017๋…„๋ถ€ํ„ฐ ใ…  โ€ฆ ์š”์ฆ˜ ํŠธ๋žœ์Šคํฌ๋จธ๋‹ˆ Mamba๋‹ˆ ๋ญ๋‹ˆ ๋งŽ์ด ๋‚˜์˜ค๋Š”๋ฐ ๊ทธ๋Ÿฐ๊ฑฐ ์—†์–ด๋„ ๊ฐ„๋‹จํ•œ ์—‘์…€๋ฐ์ดํ„ฐ๋‚˜ ๋””๋น„ ๋ฐ์ดํ„ฐ๊ฐ™์€๊ฑด ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์„œ ํ•™์Šต์‹œ์ผœ๋„ ๋ฌธ์ œ์—†์Šต๋‹ˆ๋‹ค.
๊ฐ„๋‹จํ•œ ๋™์˜์ƒ ์ œ์Šค์ณ์ธ์‹ ๋ชจ๋ธ ์ •๋„๋Š” (ํ•ธ๋“œ์ œ์Šค์ณ? ์†์œผ๋กœ ์˜†์œผ๋กœ ๋ฏธ๋Š” ๋™์ž‘์ด๋‚˜ ์Šคํƒ‘ ์ œ์Šค์ณ) ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ์‹ค๊ฒ๋‹ˆ๋‹ค. ๋Ÿฌ๋‹์ปค๋ธŒ๊ฐ€ ์ƒ๊ฐ๋ณด๋‹ค ๊ธธ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 3์ฃผ? 1๋‹ฌ? ์ค‘์š”ํ•œ๊ฑด ๊ทธ.. ํ•™์Šต ๋ฐฉํ–ฅ์ด๋ž‘ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•œ๊ฒŒ ์•„๋‹์ง€ ใ… 

2017๋…„๋ถ€ํ„ฐ ๊ณต๋ถ€ํ•˜๋ฉด์„œ git์„ ๋ถ€์ˆ˜๊ณ  ๋‹ค์‹œ ๋งŒ๋“ค๊ณ  ๋ฐ˜๋ณตํ•˜๋‹ค๊ฐ€ 4๋…„์ „๋ถ€ํ„ด๊ฐ€ ์—ฌ๊ธฐ์— ๋‹ค ๋ชฐ์•„์„œ ์ •๋ฆฌ๋ฅผ ํ•˜๊ณ ์žˆ๊ฑฐ๋“ ์š”. ์ฃผ๊ธฐ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜์ง„ ์•Š๊ณ .. ํšŒ์‚ฌ์ผ์— ํŒŒ๋ฌปํ˜€์„œ ์—…๋ฐ์ดํŠธ์•ˆํ•œ์ง€ ์ข€๋ฌ๋Š”๋ฐ.
๋„์›€์ด ๋˜์…จ์œผ๋ฉด ํ—ˆ๋„ค์š”. ์ œ๊ฐ€ ์ดํ•ดํ•˜๊ณ  ์ง์ ‘ ์†์œผ๋กœ ํ•œ๋•€ํ•œ๋•€ ๋งŒ๋“  ๋ฐฑ๋ณธ ๋ชจ๋ธ๋“ค์€ ์—ฌ๊ธฐ์— ๋‹ค ์ •๋ฆฌํ•ด๋†จ์Šต๋‹ˆ๋‹ค.

@ํŒŒ๋ž€๋งค

๋“œ๋””์–ด C# ๋ฒ„์ „์„ ์˜ฌ๋ ธ์Šต๋‹ˆ๋‹ค. readme๋„ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

1๊ฐœ์˜ ์ข‹์•„์š”

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ์ •๋ง ์ง„์ง€ํ•˜๊ฒŒ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์š”์ฆ˜ ์•ˆ๊ทธ๋ž˜๋„ ์ด๋Ÿฐ์ €๋Ÿฐ ์ƒ๊ฐ์ด ๋งŽ์€๋ฐ
์ œ ์ปค๋ฆฌ์–ด์— ์—„์ฒญ๋‚œ ์˜ํ–ฅ์„ ๋ผ์น˜์‹ ์ง€๋„ ๋ฌผ๋ก  ์ œ๊ฐ€ ์ž˜ ํŒŒ๋ด์•ผ ๊ฒ ์ง€๋งŒ์š”
๋‚˜์ค‘์— ์ •์ƒ์—์„œ ๋ต™์ฃ  ใ…Žใ…Ž ๋ต™๊ณ  ์–˜๊ธฐํ•˜๋ฉด ์ข‹๊ฒ ์ง€๋งŒ ์ด๊ฑด๋ญ ์œ ์น˜์› ์ƒ์ด๋ž‘ ์–˜๊ธฐํ•˜์‹œ๋Š” ๋А๋‚Œ ๋“ค๊ฒƒ ๊ฐ™์•„์„œ
์กฐ์‹ฌ์Šค๋Ÿฝ๋„ค์š” ใ…Ž
๊ฐœ์ธ์ ์œผ๋กœ ๋”ฅ๋Ÿฌ๋‹์œผ๋กœ ํ•ด๋ณด๊ณ  ์‹ถ์€๊ฒƒ ์—ญ์‚ฌ์ ์ธ ์ด๋ฒคํŠธ๋ฅผ ๋‚ ์งœ๋ณ„๋กœ ์ •๋ฆฌํ•ด์„œ ๋ญ”๊ฐ€ ์—ฐ๊ด€์„ฑ
ํŒจํ„ด์ด ์žˆ์ง€ ์•Š์„๊นŒ ์—ฐ๊ตฌํ•ด๋ณด๊ณ ์‹ถ์Šต๋‹ˆ๋‹ค

1๊ฐœ์˜ ์ข‹์•„์š”

๊ทธ๋Ÿฐ๊ฑฐ๋ฉด ํด๋Ÿฌ์Šคํ„ฐ๋ง์ด๋‚˜ ์ด๋Ÿฐ๊ฑฐ ๊ณต๋ถ€ํ•˜์…”์•ผ๊ฒ ๊ตฐ์š”? ๊ฒฐ๊ตญ ๊ทธ๊ฒƒ๋„ ํ•˜๋ ค๋ฉด ๋ชจ๋ธ(๋ฐฑ๋ณธ)์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๊ทธ.. ํ”ผ์ณ๋ฅผ ๋ฝ‘๋Š” ๋ฐฉ๋ฒ•์„ ์•„์…”์•ผํ•˜๋‹ˆ๊นŒ ์•„๊นŒ ์–ธ๊ธ‰๋“œ๋ฆฐ 1-11์„ ํ•˜์‹œ๊ธด ํ•˜์…”์•ผํ• ๊ฒ๋‹ˆ๋‹ค ใ…  ๊ทธ๋ฆฌ๊ณ  ๊ทธ.. ์–ธ์ œ๋“ ์ง€ ๊ฐ ํ†ก์ด๋“  ๋ฌผ์–ด๋ณด์…”๋„๋ฉ๋‹ˆ๋‹ค์š” ใ…  ์–ธ์ œ๋“ ์ง€ ํ™˜์˜์ž…๋‹ˆ๋‹ค์š” ๊ฐ„๋‹จํ•œ๊ฑฐ๋ผ๋„ ๋„์›€์„ ๋“œ๋ฆฌ๋ฉด ์ข‹์ง€์š”

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ์–ด๋А์ •๋„ ๊ธฐ๋ณธ์€ ์ฑ„์šฐ๊ณ  ์—ฐ๋ฝ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค ใ…Ž

1๊ฐœ์˜ ์ข‹์•„์š”