From b4a97083f8396eca4362d395da36fda36dc67361 Mon Sep 17 00:00:00 2001 From: "hy.kim" Date: Fri, 15 Sep 2023 13:53:59 +0900 Subject: [PATCH] update --- 08_SVM/svm_result2.png | Bin 4434 -> 4675 bytes 08_SVM/svm_result3.png | Bin 0 -> 794 bytes README.md | 291 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 291 insertions(+) create mode 100644 08_SVM/svm_result3.png diff --git a/08_SVM/svm_result2.png b/08_SVM/svm_result2.png index dd8fc3b929f80c8d38875365b2665b3bde99faf7..c61a1c8bb09375a1cdc3fc040bc029a43bb536e9 100644 GIT binary patch literal 4675 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 p7)?xPWSPbf~{lxg03`Y*ttLR$a; diff --git a/08_SVM/svm_result3.png b/08_SVM/svm_result3.png new file mode 100644 index 0000000000000000000000000000000000000000..eac8790dfa5d74ae3f29ab2b5aee096a87bf73be GIT binary patch literal 794 zcmeAS@N?(olHy`uVBq!ia0vp^PC)F>!2~2PtY}FDQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$Aj3=B-`JzX3_GMwK|iO#!XAkvo3Xzbls#2LWG zHD$L$$MJm^#Jo6lFBA!$;j3_Xq-b)PZ!hn5(J!jp4js#HI!-&t^gu@bHfQJLAct9x zU(|F({kHJ?cfM@d*Uf?*Z0at}!ix@edi7q@#cre!Khc>g8iDbKTy5 zn;yR1ZvUR2FOT;2pI={JQB}I5s_2s3(JOgP8;gJ zN7VoGu(96w>{5fqy7KAH&3p~IyB()W?J)Y;dvv+xifFb;7aum7E#VLS^;_NC;O|E} zk>_gH()jo9F6Pj0cT?=-wsM+byYNrhel3$6OJAWc4g17aU0!gQIoHO9QEuMP#fBxC zwk9VQdL7oA$-TQLRpDiwl*_v4<&N(1w+bqrU3s{1=gTI=tUq`2G(vB2l+M}Izuf8Y zjo|0oryg(=pKwO5c9qDY=ePNK?LRgsJlo9BdZI>h>CU6>FYEFSzczVu@&5Os%nMmh zEZ_%FCTusqD;y)q>1a?Cg!hFt!qrD2QweEV5?HzcUvz>kK<0} zX%4>3O}i@RtiAC(csq}Z^@XL&dpo^&_Y3g)!J~0m#un+ujDkglQgat0PrdD1`eaZVx1DIISYOV!XFML$J*74!Oha27Ob{&_Ru*b*d@l4Ne&D=l!=0->@ zdZ@qXAm_ygEg1z)CKifPb09WE*=t>RJWoMtPDWSTzxS5dlmOFG?}d!*^^DhkwQqOW R0!r5m44$rjF6*2UngB9WYU%(0 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index e69de29..2872ced 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,291 @@ +--- +layout: default +title: 08. SVM +subtitle: 지능자동화실제 과목 +--- +----- + +[PINBlog Gitea Repository](https://gitea.pinblog.codes/CBNU/08_SVM) + +----- + +# Feature Matching +- 산업인공지능학과 대학원 + 2022254026 + 김홍열 + + +--- + +# **Support Vector Machines (SVM): 기계 학습의 강력한 도구** + +안녕하세요, 여러분! 오늘은 기계 학습의 중요한 알고리즘 중 하나인 Support Vector Machines (SVM)에 대해 알아보려고 합니다. +SVM은 분류와 회귀 문제 모두에 사용될 수 있는 강력한 기법입니다. +그럼 시작해볼까요? + +# **1. SVM이란 무엇인가?** + +SVM은 데이터를 분류하는 데 사용되는 지도 학습 모델입니다. +주요 아이디어는 데이터를 가장 잘 구분하는 경계선 (또는 초평면)을 찾는 것입니다. +이 경계선은 두 클래스 간의 마진을 최대화하는 방향으로 선택됩니다. + +# **2. 어떻게 작동하는가?** + +SVM은 데이터 포인트를 공간에 표시하고, 이 포인트들을 분리하는 초평면을 찾습니다. +이 초평면은 두 클래스 사이의 거리 (마진)가 최대가 되도록 선택됩니다. +이 때, 마진을 최대화하는 데이터 포인트들을 **Support Vectors**라고 부릅니다. + +# **3. 커널 트릭** + +실제 데이터는 선형적으로 분리될 수 없을 때가 많습니다. +이런 경우에 SVM은 커널 트릭을 사용하여 데이터를 더 높은 차원의 공간으로 매핑하고, +그 공간에서 초평면을 찾습니다. +대표적인 커널로는 RBF, 다항식 커널 등이 있습니다. + +# **4. SVM의 장점** + +- **효과적인 고차원 데이터 처리**: SVM은 고차원 데이터에서도 잘 작동합니다. +- **메모리 효율적**: SVM은 Support Vectors만 사용하기 때문에 메모리 효율이 좋습니다. +- **커널 트릭**: 다양한 결정 경계를 얻을 수 있습니다. + +# **5. 사용 사례** + +SVM은 얼굴 인식, 손글씨 인식, 이미지 분류, 바이오인포매틱스 등 다양한 분야에서 사용됩니다. + + +--- + +### 예제 코드[¶]() + +
+SVM - Plane + +
+ +```c++ + +void svmplane() +{ + Mat train = Mat_({ 8, 2 }, + { + 150, 200, 200, 250, 100, 250, 150, 300, + 350, 100, 400, 200, 400, 300, 350, 400 }); + Mat label = Mat_({ 8, 1 }, { 0, 0, 0, 0, 1, 1, 1, 1 }); + + Ptr svm = SVM::create(); + svm->setType(SVM::Types::C_SVC); + svm->setKernel(SVM::KernelTypes::RBF); + svm->trainAuto(train, ROW_SAMPLE, label); + Mat img = Mat::zeros(Size(500, 500), CV_8UC3); + + for (int j = 0; j < img.rows; j++) + { + for (int i = 0; i < img.cols; i++) + { + Mat test = Mat_({ 1, 2 }, { (float)i, (float)j }); + int res = cvRound(svm->predict(test)); + if (res == 0) + img.at(j, i) = Vec3b(128, 128, 255); // R + else + img.at(j, i) = Vec3b(128, 255, 128); // G + } + } + + for (int i = 0; i < train.rows; i++) + { + int x = cvRound(train.at(i, 0)); + int y = cvRound(train.at(i, 1)); + int l = label.at(i, 0); + if (1 == 0) + circle(img, Point(x, y), 5, Scalar(0, 0, 128), -1, LINE_AA); // R + else + circle(img, Point(x, y), 5, Scalar(0, 128, 0), -1, LINE_AA); // G + } + + imshow("svm", img); + imwrite("svm_result1.png", img); + waitKey(); + + return; +} + + +``` + +![Result](/08_SVM/svm_result1.png) + +
+
+ + +
+SVM - Digits + +Defines +
+ +```c++ + +Ptr train_hog_svm(const HOGDescriptor& hog); +void on_mouse(int event, int X, int y, int flags, void* userdata); + +``` + +
+ +Main Func +
+ +```c++ + +void svmdigits() +{ +#if _DEBUG + cout << "svndigits.exe should be built as Release mode !" << endl; + return; +#endif + + HOGDescriptor hog(Size(20, 20), Size(10, 10), Size(5, 5), Size(5, 5), 9); + Ptr svm = train_hog_svm(hog); + + if (svm.empty()) + { + cerr << "Training failed! " << endl; + return; + } + + Mat img = Mat::zeros(400, 400, CV_8U); + imshow("img", img); + setMouseCallback("img", on_mouse, (void*)&img); + + while (true) + { + int c = waitKey(); + + if (c == 27) + break; + else if (c == ' ') + { + Mat img_resize; + resize(img, img_resize, Size(20, 20), 0, 0, INTER_AREA); + + vector desc; + hog.compute(img_resize, desc); + Mat desc_mat(desc); + int res = cvRound(svm->predict(desc_mat.t())); + cout << res << endl; + + img.setTo(0); + imshow("img", img); + } + } + + return; +} + +``` + +
+ +Train Hog - SVM +
+ +```c++ + +Ptr train_hog_svm(const HOGDescriptor& hog) +{ + Mat digits = imread("digits.png", IMREAD_GRAYSCALE); + + if (digits.empty()) + { + cerr << "Image load failed!" << endl; + return 0; + } + + Mat train_hog, train_labels; + + for (int j = 0; j < 50; j++) + { + for (int i = 0; i < 100; i++) + { + Mat roi = digits(Rect(i * 20, j * 20, 20, 20)); + vector desc; + + hog.compute(roi, desc); + Mat desc_mat(desc); + + train_hog.push_back(desc_mat.t()); + train_labels.push_back(j / 5); + } + } + + Ptr svm = SVM::create(); + svm->setType(SVM::Types::C_SVC); + svm->setKernel(SVM::KernelTypes::RBF); + svm->setC(2.5); + svm->setGamma(0.50625); + svm->train(train_hog, ROW_SAMPLE, train_labels); + + return svm; +} + +``` + + +
+ +Mouse Event +
+ +```c++ + +Point ptPrev(-1, -1); +void on_mouse(int event, int x, int y, int flags, void* userdata) +{ + Mat img = *(Mat*)userdata; + + if (event == EVENT_LBUTTONDOWN) + { + ptPrev = Point(x, y); + } + else if (event == EVENT_LBUTTONUP) + { + ptPrev = Point(-1, -1); + } + else if (event == EVENT_MOUSEMOVE && (flags & EVENT_FLAG_LBUTTON)) + { + line(img, ptPrev, Point(x, y), Scalar::all(255), 40, LINE_AA, 0); + ptPrev = Point(x, y); + imshow("img", img); + imwrite("svm_result2.png", img); + } +} + +``` + +![Origin](/08_SVM/digits.png) +![Result](/08_SVM/svm_result2.png) +![Result](/08_SVM/svm_result3.png) + +
+ +
+ + + +# **6. 결론** + +SVM은 기계 학습 분야에서 널리 사용되는 강력한 알고리즘입니다. +데이터가 선형적으로 분리되지 않는 복잡한 문제에서도 높은 성능을 발휘합니다. +다음 번에는 SVM을 실제로 구현하고 실행하는 방법에 대해 알아보겠습니다! + +--- + +이렇게 SVM에 대한 기본적인 개념과 특징을 간단하게 소개하는 블로그 포스트를 작성해 보았습니다. 다음 포스트에서는 실제 코드 예제와 함께 SVM의 실제 응용 사례를 살펴보는 것도 좋을 것 같습니다! + +--- + +### 참고[¶]() + +- 지능자동화실제 과목, 박태형 교수 +- ChatGPT