ทดลองใช้งาน GoogleNet

GoogleNet ก็เป็น Deep Learning ประเภท CNN ที่เทรนเสร็จเรียบร้อย พร้อมให้เราใช้งานอีกตัวหนึ่ง ซึ่งมี object ที่ใช้เทรนทั้งหมด 1000 ชนิด และเทรนด้วยรูปภาพมากกว่า 1 ล้านรูป เช่นเดียวกันกับ AlexNet

ในตัวอย่างนี้ เราจะมาดูวิธีการใช้งาน GoogleNet ในการ classify รูปภาพเช่นเดียวกันกับ AlexNet นะครับ ซึ่งจะมีวิธีการใช้งานยังไงนั้น เรามาดูกันเลยครับ

ขั้นตอนที่ 1 สร้างตัวแปร Network ของ GoogleNet


>> net = googlenet;

(ถ้าใครยังไม่ได้ติตตั้งมันจะมีข้อความแจ้งเตือน error นะครับ ก็ให้ติดตั้งก่อน ก็จะใช้งานได้ปกติ)

ขั้นตอนที่ 2 ดูขนาดของ Input layer และ Outpu layer

ก่อนที่เราจะใช้งานมันได้ สิ่งแรกที่เราต้องรู้เลยก็คือ googlenet มันรับ input แบบไหน ขนาดเท่าไร เราจึงจะสามารถป้อน input ให้มันคำนวณได้อย่างถูกต้อง ไม่ใช่ว่าเราอยากป้อนอะไรก็ป้อนนะครับ

>> inputSize = net.Layers(1).InputSize

ซึ่งคำตอบที่ได้ก็คือ [224 , 224 , 3] ซึ่งก็คือรูปภาพสี ขนาด 224x224 พิกเซล นั่นเองครับ

ต่อมา เรามาลองดูกันครับว่า object ทั้ง 1000 ชนิดที่ googlenet ได้เรียนมานั้น มีอะไรบ้าง ซึ่งในตัวอย่างนี้ผมจะสุ่มมาแสดง 10 ชื่อนะครับ ดังนั้นหากใครรันโค้ดเดียวกันกับผมแล้วได้คำตอบไม่เหมือนกันก็ไม่ต้องตกใจนะครับ

>> classNames = net.Layers(end).ClassNames;
>> numClass = numel(classNames);
>> disp(classNames(randperm(numClass,10)))

ก็จะได้คำตอบประมาณนี้

    'alp'
    'custard apple'
    'catamaran'
    'sleeping bag'
    'redshank'
    'Band Aid'
    'wooden spoon'
    'sewing machine'
    'lemon'
    'megalith'

จากนั้นเราลองหารูปภาพมาทดสอบดูครับ

clc;clear;close all;

net = googlenet;
inputSize = net.Layers(1).InputSize;
classNames = net.Layers(end).ClassNames;
numClass = numel(classNames);
%disp(classNames(randperm(numClass,10)))

I = imread('peppers.png');
pic = imresize(I,inputSize(1:2));
[label,scores] = classify(net,pic);

figure;
imshow(I)
title(string(label)+' , '+num2str(100*scores(classNames==label),3)+'%');

ผลที่ได้

โปรแกรมตอบว่า ภาพนี้คือ bell pepper หรือ พริกหยวก ซึ่งก็ถูกต้องนะครับ โดยโปรแกรมมีความมั่นใจ 95.5% ว่าภาพนี้คือพริกหยวก

งั้นเราลองมาดูกันดีกว่าครับว่า 5 อันดับแรกของผลการวิเคราะห์ของ googlenet จะมีอะไรบ้าง

%% display top predict
[~,idx] = sort(scores,'descend');
idx = idx(5:-1:1);
classNamesTop = net.Layers(end).ClassNames(idx);
scoresTop = scores(idx);

figure
barh(scoresTop)
xlim([0 1])
title('Top 5 Predictions')
xlabel('Probability')
yticklabels(classNamesTop)


รองลงมาก็คือ cucumber หรือ แตงกวานั่นเองครับ ซึ่งตัว predict scores นี่มีประโยชน์มากนะครับ เพราะมันทำให้เราทราบว่า ผลการวิเคราะห์ที่ได้มีความน่าเชื่อถือระดับไหน ซึ่งเราสามารถนำไปเขียนโปรแกรมคัดกรองอีกชั้นหนึ่งได้ เช่น ถ้า score น้อยกว่า 80% ให้ตอบว่า Unknow

เรามาลองทดสอบกับภาพอื่นๆ ดูนะครับ

 googlenet วิเคราะห์ว่าเป็น eggnog (เครื่องดื่มที่ใส่ไข่ไก่ผสมกับแอลกอฮอล์) ซึ่งคำตอบที่ได้ถือว่าใกล้เคียงมากกว่า Alexnet เพราะอย่างน้อย ผลการวิเคราะห์ก็ยังเป็นเครื่องดื่มอยู่

ส่วนภาพนี้ googlenet ก็ไม่แน่ใจเหมือนกันครับว่ามันคืออะไร จะเห็นได้จาก % ความั่นใจมีแค่ 11.5% เท่านั้นครับ

ส่วนเจ้าตัวนี้ ในที่สุดก็ถูกมองว่าเป็นแมวแล้วครับ ฮ่าๆๆ (Tabby แปลว่าแมวลาย)

ส่วนภาพนี้ก็ยังเป็นดอกเดซี่เหมือนเดิม สงสัยต่างประเทศเขาไม่มีดอกทานตะวันจริงๆ นั่นแหละ



สำหรับการใช้งาน googlenet ขั้นต้นก็จบเพียงเท่านี้นะครับ แล้วเจอกันใหม่ในบทความหน้าครับ

ความเห็น

โพสต์ยอดนิยมจากบล็อกนี้

การแก้สมการ Differential ด้วย MATLAB

ว่าด้วยเรื่องของ ERROR

การหาค่าเฉลี่ยโดยไม่ต้องเก็บค่า