iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 15
0
AI & Data

學習PHP Machine Learning的冒險歷程系列 第 15

[2020鐵人賽Day15]邂逅PHP Machine Learning-K-means 圖片分類(3) - 圖片分類與分布

前情提要

大家還記得之前k-means 是一種不需要給Label的分類方法嗎?
今天會介紹除了像鳶尾花分類之外,也可以用於分類影像,今天要介紹如何做訓練並且介紹如何解釋分類成果。

今日Code簡易解說

從先前的Code中,將影像每一個像素擷取出RGB三個元素值,轉換成R,G,B三維度陣列,接著將送入K-means函式做分類:
K-means函式分類

$kmeans = new KMeans(3);
$result = $kmeans->cluster($kmeansRGBSample);

完整範例Code

<?php
//執行時間上限的部份單位是秒,如果要設為無上限可以設定0
set_time_limit(0);

require_once __DIR__ . '/vendor/autoload.php';
use Phpml\Clustering\KMeans;

$source_file = "test_image.jpg";

$im = ImageCreateFromJpeg($source_file);
$imgw = imagesx($im);
$imgh = imagesy($im);
$newFilename = md5(date("YmdHis")).".jpg";

//宣告K-means RGB Sample
$kmeansRGBSample = array();

for ($i=0; $i<$imgw; $i++)
{
    for ($j=0; $j<$imgh; $j++)
    {
        // 取得當前像素的RGB值
        $rgb = ImageColorAt($im, $i, $j);

        // 取得RGB的各別值
        $image_R = ($rgb >> 16) & 0xFF;
        $image_G = ($rgb >> 8) & 0xFF;
        $image_B = $rgb & 0xFF;

        $kmeansRGBSample[] = [$image_R, $image_G, $image_B];

        // 印出RGB各別值
        // echo "R:$image_R, G:$image_G, B:$image_B
";
    }
}

$kmeans = new KMeans(3);
$result = $kmeans->cluster($kmeansRGBSample);

echo "<pre>";
print_r($result);
echo "</pre>";

// 輸出圖像到文件
// imagejpeg($im, "./images/$newFilename");
?>

可以觀察分類成果的呈現方式如下圖:
https://ithelp.ithome.com.tw/upload/images/20191001/20091333k8pq0O0Qhl.png
第一個維度表示分類的類別,例如分類了3類,依照順序是0 1 2,然後接下來的第二維度就是像素的編號,然後每一個像素都會顯示其RGB數值。

其實這樣的成果就是K-means的分類成果了,如果有Label就可以評估是否正確,但是難以去判讀是否正確,因此還需要將影像還原回來原本的影像,將在明日說明如何還原回來原本的影像。


上一篇
[2020鐵人賽Day14]邂逅PHP Machine Learning-K-means 圖片分類(2) - 圖片轉樣本
下一篇
[2020鐵人賽Day16]邂逅PHP Machine Learning-K-means 圖片分類(4) - 成果還原為影像
系列文
學習PHP Machine Learning的冒險歷程30

尚未有邦友留言

立即登入留言