detect.py

Code

import os
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.mobilenet_v2 import preprocess_input
from tensorflow.keras.models import load_model
from PIL import Image

# โหลดโมเดล
model = load_model('C:/Users/Acer/Desktop/Project/PetBreed_Identifier/model/mobilenetv2/ผลลัพธ์/train/mobilenetv2_age_classifier_best.keras')

# โฟลเดอร์บันทึกผลลัพธ์
SAVE_DIR = "C:/Users/Acer/Desktop/Project/PetBreed_Identifier/model/mobilenetv2/ผลลัพธ์/train/บันทึก"
os.makedirs(SAVE_DIR, exist_ok=True)

# ชื่อคลาส (ตามที่เทรนไว้)
class_names = [
    'cat_adult', 'cat_kitten', 'cat_senior', 'cat_young',
    'dog_adult', 'dog_puppy', 'dog_senior', 'dog_young'
]

# ฟังก์ชันเตรียมรูปภาพ
def preprocess_images(imgs):
    """
    รับ input: รูปเดียว (PIL.Image) หรือ list ของรูป
    เปรียบเหมือนการสอนเด็กให้รู้จัก "สุนัข" เราจะไม่สอนจากรูปภาพเดียว และจะสอนว่าไม่ว่าสุนัขจะตัวเล็ก ตัวใหญ่ ภาพมืด ภาพสว่าง หรือมาจากกล้องไหน มันก็คือสุนัข

    มี 2 เหตุผลหลัก ที่ต้อง "เตรียม" รูปภาพก่อน:
    1. ต้องมีรูปแบบที่สม่ำเสมอ: โมเดล MobileNetV2 ถูกฝึกมาด้วยรูปภาพขนาด 224x224 พิกเซล และถูกป้อนเข้าทีละเป็น "ชุด" (Batch) 
        หากส่งรูปภาพขนาดอื่น (เช่น 800x600) หรือส่งทีละรูปเดี่ยว ๆ เข้าไป โมเดลจะทำงานผิดพลาด หรือ ปฏิเสธไม่รับเลย
    2. ต้องมีค่าตัวเลขที่ถูกต้อง: โมเดลถูกฝึกให้ประมวลผลค่าสีของรูปภาพที่ถูกปรับให้อยู่ในช่วง -1 ถึง 1 (Normalize) 
        หากส่งค่าสีต้นฉบับ (ซึ่งอยู่ในช่วง 0 ถึง 255) เข้าไปตรง ๆ โมเดลจะแปลกใจ และให้ผลลัพธ์การทำนายที่แย่มาก
    ผลลัพธ์หลักที่ได้จากฟังก์ชันนี้คือตัวแปร np.array(batch) ซึ่งมีลักษณะเป็นชุดตัวเลขขนาดใหญ่
    คืนค่า: batch (N, 224, 224, 3)
        N: คือ จำนวนรูปภาพ ที่คุณป้อนเข้ามา (ถ้าป้อน 8 รูป, N=8)
        224,224: คือ ความกว้างและความสูง ของรูปภาพที่ปรับแล้ว
        3: คือ จำนวนช่องสี (แดง, เขียว, น้ำเงิน)
    ชุดตัวเลขนี้คือรูปแบบเดียวที่โมเดล MobileNetV2 จะยอมรับเพื่อทำการทำนายผล
    """
    # ตรวจสอบ ว่า imgs เป็นชุดรูปภาพ (List) หรือไม่
    if not isinstance(imgs, list):
        imgs = [imgs] # ถ้าไม่ใช่ (หมายถึงมีแค่รูปเดียว) ให้ แปลง รูปเดียวนี้ให้เป็นชุดที่มีรูปเดียว

    batch = [] # สร้างกล่องเปล่า ชื่อ batch ไว้เตรียมเก็บรูปภาพที่ถูกเตรียมแล้ว
    for img in imgs: # สำหรับแต่ละรูป
        # Resize ให้เท่ากับตอนเทรน
        img = img.resize((224, 224))
        # แปลงรูปภาพ(ที่ตอนนี้เป็นแค่ไฟล์ภาพ) ให้กลายเป็น ชุดตัวเลข 3 มิติ (Array) คือ (224, 224, 3)
        # ชุดตัวเลขช่วง 0−255
        img_array = image.img_to_array(img)
        # ปรับค่าตัวเลข โดยเฉพาะค่าสี (Normalize) ให้เป็นไปตามที่โมเดล MobileNetV2 ต้องการ
        # ชุดตัวเลขช่วง -1 ถึง 1
        img_array = preprocess_input(img_array)
        batch.append(img_array)  # เก็บรูปที่เตรียมแล้วในกล่อง  batch

    return np.array(batch), imgs  # คืนค่า batch (N, 224, 224, 3) และรูปต้นฉบับ


# โหลดรูป
"""
img1 = Image.open('C:/Users/Acer/Desktop/Project/อ้างอิง/ทดสอบ/4461d213-de3c-4a42-a5c1-06c654ae50e0.jpg')
inputs, original_imgs = preprocess_images(img1)  # รูปเดียว
"""

# ====== โหลดรูป ======
img_paths = [
    'C:/Users/Acer/Desktop/Project/อ้างอิง/ทดสอบ/4461d213-de3c-4a42-a5c1-06c654ae50e0.jpg',
    'C:/Users/Acer/Desktop/Project/อ้างอิง/ทดสอบ/dbb7cb2e-ee69-4dc6-8ff9-423f2e2f7815.jpg',
    'C:/Users/Acer/Desktop/Project/อ้างอิง/ทดสอบ/Delta.jpg',
    'C:/Users/Acer/Desktop/Project/อ้างอิง/ทดสอบ/Toby.jpg',
    'C:/Users/Acer/Desktop/Project/อ้างอิง/ทดสอบ/ELAINE.jpg',
    'C:/Users/Acer/Desktop/Project/อ้างอิง/ทดสอบ/Henry.jpg',
    'C:/Users/Acer/Desktop/Project/อ้างอิง/ทดสอบ/Kate.jpg',
    'C:/Users/Acer/Desktop/Project/อ้างอิง/ทดสอบ/Churro.jpg',
    'C:/Users/Acer/Desktop/Project/อ้างอิง/ทดสอบ/Dolly.jpg'
]

imgs = [Image.open(p) for p in img_paths] # โหลดรูปทั้งหมด
inputs, original_imgs = preprocess_images(imgs) # เตรียมรูป

# ทำนาย
preds = model.predict(inputs)
"""
# แสดงผล
for i, p in enumerate(preds):
    pred_class = np.argmax(p)
    confidence = p[pred_class]
    pred_label = class_names[pred_class]

    print(f"รูปที่ {i+1}: คลาส = {pred_label}, ความมั่นใจ = {confidence*100:.2f}%")

    # แสดงภาพ
    plt.imshow(original_imgs[i])
    plt.title(f"Predicted: {pred_label} ({confidence*100:.1f}%)")
    plt.axis("off")
    plt.show()
"""
# ไฟล์ผลลัพธ์รวม
results_file = os.path.join(SAVE_DIR, "results.txt") # ไฟล์บันทึกผลลัพธ์
with open(results_file, "w", encoding="utf-8") as f: # เปิดไฟล์เพื่อเขียนผลลัพธ์
    for i, (p, path) in enumerate(zip(preds, img_paths)):
        pred_class = np.argmax(p) # คลาสที่ทำนาย
        confidence = p[pred_class] # ความมั่นใจ
        pred_label = class_names[pred_class] # ชื่อคลาสที่ทำนาย

        # เขียนผลลัพธ์ลงไฟล์ เช่น "รูปที่ 1 (4461d213...): cat_kitten, ความมั่นใจ = 99.50%"
        result_text = f"รูปที่ {i+1} ({os.path.basename(path)}): {pred_label}, ความมั่นใจ = {confidence*100:.2f}%"
        print(result_text)
        f.write(result_text + "\n") # บันทึกผลลัพธ์ลงไฟล์ results.txt

        # บันทึกรูปพร้อม label
        plt.imshow(original_imgs[i]) # แสดงภาพ
        plt.title(f"{pred_label} ({confidence*100:.1f}%)") # ตั้งชื่อภาพด้วยคลาสที่ทำนาย
        plt.axis("off") 
        save_path = os.path.join(SAVE_DIR, f"pred_{i+1}_{pred_label}.jpg") # ชื่อไฟล์รูปที่บันทึก
        plt.savefig(save_path, bbox_inches="tight")  # บันทึกรูป
        plt.close()

print(f"\n✅ ผลลัพธ์ถูกบันทึกที่: {SAVE_DIR}") # แจ้งเตือนเมื่อบันทึกผลลัพธ์เสร็จ

อธิบาย

การนำเข้าไลบรารี

บรรทัด

โค้ด

คำอธิบาย (หน้าที่)

ทำไมต้องเขียน?

ผลลัพธ์ของบรรทัดนี้

1

import os

นำเข้าโมดูล os (Operating System)

ใช้สำหรับจัดการกับระบบไฟล์ เช่น สร้างโฟลเดอร์ (os.makedirs) และจัดการกับพาธไฟล์ (os.path.join, os.path.basename)

โมดูล os พร้อมใช้งานในชื่อ os

2

import numpy as np

นำเข้าไลบรารี numpy

ใช้สำหรับงานทางคณิตศาสตร์และการจัดการกับอาร์เรย์ (Array) มิติสูง ซึ่งเป็นรูปแบบที่ใช้เก็บข้อมูลรูปภาพและผลลัพธ์การทำนายใน TensorFlow/Keras

ไลบรารี numpy พร้อมใช้งานในชื่อย่อ np

3

import matplotlib.pyplot as plt

นำเข้าโมดูล pyplot จากไลบรารี matplotlib

ใช้สำหรับ การพลอตกราฟ/การแสดงผลรูปภาพ และการบันทึกรูปภาพที่ติดป้ายกำกับ (plt.imshow, plt.title, plt.savefig)

โมดูล pyplot พร้อมใช้งานในชื่อย่อ plt

4

from tensorflow.keras.preprocessing import image

นำเข้าโมดูล image จาก Keras

มีฟังก์ชันสำคัญเช่น image.img_to_array สำหรับแปลงรูปภาพ (PIL Image) ให้เป็นอาร์เรย์ตัวเลขที่โมเดลใช้ได้

ฟังก์ชันเกี่ยวกับการเตรียมรูปภาพจาก Keras พร้อมใช้งาน

5

from tensorflow.keras.applications.mobilenet_v2 import preprocess_input

นำเข้าฟังก์ชัน preprocess_input ที่จำเพาะสำหรับโมเดล MobileNetV2

ฟังก์ชันนี้จะปรับค่าสีของรูปภาพ (Normalization) ให้อยู่ในช่วง ถึง ซึ่งเป็นช่วงที่โมเดล MobileNetV2 ถูกฝึกมา (สำคัญมากสำหรับการทำนายที่แม่นยำ)

ฟังก์ชัน preprocess_input สำหรับ MobileNetV2 พร้อมใช้งาน

6

from tensorflow.keras.models import load_model

นำเข้าฟังก์ชัน load_model

ใช้สำหรับโหลดโมเดลที่ถูกฝึกไว้แล้วจากไฟล์ (เช่น ไฟล์ .keras หรือ .h5) เข้ามาในหน่วยความจำ

ฟังก์ชัน load_model พร้อมใช้งาน

7

from PIL import Image

นำเข้าคลาส Image จากไลบรารี Pillow (PIL)

ใช้สำหรับ การเปิด (โหลด) รูปภาพจากไฟล์ (Image.open) และ การปรับขนาด รูปภาพ (img.resize)

คลาส Image พร้อมใช้งาน


การกำหนดค่าเริ่มต้นและโหลดโมเดล

บรรทัด

โค้ด

คำอธิบาย (หน้าที่)

ทำไมต้องเขียน?

ผลลัพธ์ของบรรทัดนี้

10

# โหลดโมเดล

คอมเมนต์ (อธิบายโค้ด)

-

ไม่มีผลต่อการทำงานของโค้ด

11

model = load_model('C:/.../mobilenetv2_age_classifier_best.keras')

โหลดโมเดลโครงข่ายประสาทเทียม (MobileNetV2) ที่ถูกฝึกไว้แล้วจากพาธไฟล์ที่กำหนด

ต้องโหลดโมเดลมาก่อนจึงจะสามารถใช้ทำนาย (Predict) รูปภาพได้

ตัวแปร model คือโมเดล Keras ที่พร้อมใช้งาน

13

# โฟลเดอร์บันทึกผลลัพธ์

คอมเมนต์

-

ไม่มีผลต่อการทำงานของโค้ด

14

SAVE_DIR = "C:/.../บันทึก"

กำหนดพาธของโฟลเดอร์ที่จะใช้บันทึกไฟล์ผลลัพธ์ (รูปภาพที่ติดป้ายและไฟล์ข้อความสรุป)

เพื่อระบุตำแหน่งจัดเก็บผลลัพธ์ที่ได้จากการทำนาย

ตัวแปร SAVE_DIR เก็บพาธของโฟลเดอร์ผลลัพธ์

15

os.makedirs(SAVE_DIR, exist_ok=True)

สร้างโฟลเดอร์ ตามพาธที่กำหนดใน SAVE_DIR

ต้องแน่ใจว่าโฟลเดอร์สำหรับบันทึกผลลัพธ์มีอยู่จริงก่อนที่จะเริ่มบันทึกไฟล์ (อาร์กิวเมนต์ exist_ok=True จะป้องกันไม่ให้เกิดข้อผิดพลาดหากโฟลเดอร์มีอยู่แล้ว)

โฟลเดอร์ที่พาธ SAVE_DIR ถูกสร้างขึ้นบนระบบ

17

# ชื่อคลาส (ตามที่เทรนไว้)

คอมเมนต์

-

ไม่มีผลต่อการทำงานของโค้ด

18-21

class_names = [ ... ]

กำหนด ชื่อคลาส ทั้งหมด 8 คลาส (4 แมว, 4 หมา) ที่โมเดลนี้ถูกฝึกให้จำแนก

โมเดลจะคืนค่าเป็นชุดตัวเลข (Probability) ตำแหน่ง ของตัวเลขที่มีค่าสูงสุดจะตรงกับ ดัชนี (Index) ของชื่อคลาสในลิสต์นี้ (เช่น ถ้าตำแหน่งสูงสุดคือ 1 จะหมายถึง cat_kitten)

ตัวแปร class_names เป็นลิสต์ของชื่อคลาสที่ใช้ในการทำนาย


ฟังก์ชันเตรียมรูปภาพ (preprocess_images)

บรรทัด

โค้ด

คำอธิบาย (หน้าที่)

ทำไมต้องเขียน?

ผลลัพธ์ของบรรทัดนี้

24

def preprocess_images(imgs):

เริ่มต้นนิยามฟังก์ชันชื่อ preprocess_images ที่รับอินพุตเป็นรูปภาพ (imgs)

ฟังก์ชันหลักที่ทำหน้าที่เตรียมรูปภาพให้อยู่ในรูปแบบที่โมเดลต้องการ

นิยามฟังก์ชันที่สามารถถูกเรียกใช้ได้

40-41

if not isinstance(imgs, list): imgs = [imgs]

ตรวจสอบ ว่าอินพุต imgs เป็นลิสต์หรือไม่ ถ้าไม่ ให้ แปลง เป็นลิสต์ที่มีรูปภาพนั้นอยู่

เพื่อให้โค้ดสามารถประมวลผลได้ทั้งกรณีที่ป้อน รูปเดียว หรือ หลายรูป โดยใช้ for loop ในบรรทัดถัดไป

imgs จะถูกรับประกันว่าเป็นลิสต์ของรูปภาพ (อย่างน้อย 1 รูป)

43

batch = []

สร้าง ลิสต์เปล่า ชื่อ batch

ใช้เก็บอาร์เรย์รูปภาพที่ถูกปรับปรุงแล้ว (เป็นชุดตัวเลข -1 ถึง 1)

ตัวแปร batch เป็นลิสต์ว่าง

44

for img in imgs:

วนซ้ำ เพื่อประมวลผลรูปภาพทีละรูปในลิสต์ imgs

เพื่อให้โค้ดสามารถจัดการรูปภาพทั้งหมดที่ป้อนเข้ามาได้

เริ่มต้นการประมวลผลรูปภาพแต่ละรูป

46

img = img.resize((224, 224))

ปรับขนาด รูปภาพ (PIL Image) ให้เป็น 224x224 พิกเซล

โมเดล MobileNetV2 ถูกฝึกมาโดยใช้รูปภาพขนาดนี้ การใช้ขนาดอื่นจะทำให้โมเดลทำงานไม่ได้

รูปภาพ img ถูกปรับขนาดเป็น 224x224

48

img_array = image.img_to_array(img)

แปลงรูปภาพ (224x224, 3 สี) ให้กลายเป็น อาร์เรย์ NumPy 3 มิติ (ชุดตัวเลขในช่วง 0 ถึง 255)

เป็นการแปลงจากวัตถุรูปภาพให้เป็นข้อมูลตัวเลขที่ Keras สามารถประมวลผลได้

ตัวแปร img_array คืออาร์เรย์ NumPy (224, 224, 3) ค่า 0-255

50

img_array = preprocess_input(img_array)

ปรับค่าตัวเลข (Normalization) ของอาร์เรย์

ปรับค่าสีจากช่วง 0-255 ให้เป็นช่วง ถึง ตามที่ MobileNetV2 ต้องการ

img_array คืออาร์เรย์ (224, 224, 3) ค่า ถึง

51

batch.append(img_array)

เพิ่ม อาร์เรย์รูปภาพที่ปรับแล้วเข้าสู่ลิสต์ batch

รวบรวมรูปภาพทั้งหมดที่ถูกเตรียมแล้วเข้าด้วยกันเป็น "ชุด" (Batch)

batch มีอาร์เรย์รูปภาพเพิ่มมา 1 รูป

53

return np.array(batch), imgs

คืนค่า กลับจากฟังก์ชัน

1. np.array(batch): อาร์เรย์ NumPy ขนาด (N, 224, 224, 3) (N คือจำนวนรูปภาพ) ที่พร้อมป้อนเข้าโมเดล 2. imgs: ลิสต์ของรูปภาพต้นฉบับ (PIL Image) ที่ปรับขนาดแล้ว (ใช้สำหรับแสดงผล)

ฟังก์ชันคืนค่าอาร์เรย์อินพุตสำหรับโมเดลและลิสต์รูปภาพต้นฉบับ


การโหลดรูปภาพและการทำนาย

บรรทัด

โค้ด

คำอธิบาย (หน้าที่)

ทำไมต้องเขียน?

ผลลัพธ์ของบรรทัดนี้

58-66

img_paths = [ ... ]

กำหนด ลิสต์ของพาธไฟล์ รูปภาพทั้งหมดที่ต้องการนำมาทำนาย (ตัวอย่างนี้มี 9 รูป)

เพื่อระบุว่ารูปภาพใดบ้างที่จะถูกนำมาประมวลผล

ตัวแปร img_paths เก็บพาธของ 9 ไฟล์รูปภาพ

68

imgs = [Image.open(p) for p in img_paths]

ใช้ List Comprehension เพื่อ โหลดรูปภาพทั้งหมด จากพาธที่กำหนด

เปิดไฟล์รูปภาพทั้งหมดเข้าสู่หน่วยความจำในรูปแบบ PIL Image

ตัวแปร imgs คือลิสต์ของ 9 รูปภาพในรูปแบบ PIL Image

69

inputs, original_imgs = preprocess_images(imgs)

เรียกใช้ฟังก์ชัน ที่เตรียมไว้เพื่อประมวลผลรูปภาพทั้งหมด

1. ปรับขนาด 224x224 2. แปลงเป็นอาร์เรย์ 3. ปรับค่าตัวเลขเป็นช่วง ถึง

1. inputs: อาร์เรย์ NumPy (9, 224, 224, 3) พร้อมป้อนโมเดล 2. original_imgs: ลิสต์ของรูปภาพต้นฉบับ (224x224 PIL)

71

# ทำนาย

คอมเมนต์

-

ไม่มีผลต่อการทำงานของโค้ด

72

preds = model.predict(inputs)

ป้อนอินพุต (inputs) เข้าสู่โมเดล (model) เพื่อ ทำนายผล

นี่คือขั้นตอนที่โมเดลใช้ปัญญาประดิษฐ์ในการประเมินรูปภาพแต่ละรูป

ตัวแปร preds คืออาร์เรย์ NumPy ขนาด (9, 8) (9 รูป, 8 คลาส) แต่ละแถวคือค่าความน่าจะเป็นของแต่ละคลาส (เช่น [0.01, 0.95, 0.02, ...])


การแสดงผลและบันทึกผลลัพธ์

บรรทัด

โค้ด

คำอธิบาย (หน้าที่)

ทำไมต้องเขียน?

ผลลัพธ์ของบรรทัดนี้

86

# ไฟล์ผลลัพธ์รวม

คอมเมนต์

-

ไม่มีผลต่อการทำงานของโค้ด

87

results_file = os.path.join(SAVE_DIR, "results.txt")

สร้างพาธไฟล์ชื่อ results.txt ภายในโฟลเดอร์ผลลัพธ์ (SAVE_DIR)

กำหนดตำแหน่งที่ไฟล์บันทึกข้อความสรุปจะถูกบันทึก

ตัวแปร results_file เก็บพาธของไฟล์ข้อความ

88

with open(results_file, "w", encoding="utf-8") as f:

เปิดไฟล์ results.txt ด้วยโหมด "w" (write - เขียนทับหากมีอยู่แล้ว)

เตรียมพร้อมสำหรับการเขียนข้อมูลผลลัพธ์ทั้งหมดลงในไฟล์ข้อความ

ตัวแปร f เป็น File Handler ที่ใช้เขียนข้อมูล

89

for i, (p, path) in enumerate(zip(preds, img_paths)):

วนซ้ำ เพื่อประมวลผลผลการทำนายทีละรูป

วนซ้ำ 9 ครั้ง (สำหรับ 9 รูป) โดยที่: : ดัชนี (0 ถึง 8), : ผลการทำนายของรูป (ชุดความน่าจะเป็น), : พาธไฟล์รูปภาพต้นฉบับ

เริ่มต้นประมวลผลผลการทำนายทีละรูป

90

pred_class = np.argmax(p)

หา ดัชนี (Index) ที่มี ค่าความน่าจะเป็นสูงสุด ในผลการทำนายของรูปนั้น (p)

ดัชนีนี้คือหมายเลขตำแหน่งของคลาสที่โมเดลทำนายว่าถูกต้องที่สุด

ตัวแปร pred_class เป็นตัวเลข (0 ถึง 7)

91

confidence = p[pred_class]

ดึง ค่าความมั่นใจ (ความน่าจะเป็นสูงสุด) ที่ตรงกับดัชนีนั้น

เพื่อนำค่าความมั่นใจไปแสดงผล

ตัวแปร confidence เป็นค่าความน่าจะเป็น (0 ถึง 1)

92

pred_label = class_names[pred_class]

ใช้ดัชนีที่ได้ไปหา ชื่อคลาส ที่แท้จริงจากลิสต์ class_names

เพื่อให้ได้ชื่อที่เป็นข้อความ (เช่น 'cat_kitten') มาใช้แสดงผล

ตัวแปร pred_label เป็นสตริงชื่อคลาส

95

result_text = f"รูปที่ {i+1} ({os.path.basename(path)}): {pred_label}, ความมั่นใจ = {confidence*100:.2f}%"

สร้างข้อความสรุปผลลัพธ์ สำหรับรูปนั้น

จัดรูปแบบข้อความให้สวยงามและเข้าใจง่าย โดยใช้ os.path.basename(path) เพื่อดึงแค่ชื่อไฟล์มาแสดง

ตัวแปร result_text คือข้อความผลลัพธ์ (เช่น "รูปที่ 1 (4461d213.jpg): cat_kitten, ความมั่นใจ = 99.50%")

96

print(result_text)

แสดงผลลัพธ์ บนคอนโซล/เทอร์มินัล

เพื่อให้ผู้ใช้เห็นผลลัพธ์ทันทีขณะรันโค้ด

ข้อความผลลัพธ์ถูกพิมพ์ออกทางหน้าจอ

97

f.write(result_text + "\n")

บันทึกผลลัพธ์ ลงในไฟล์ results.txt

จัดเก็บบันทึกผลลัพธ์ทั้งหมดไว้ในไฟล์

ข้อความผลลัพธ์ถูกเขียนลงในไฟล์ results.txt

100

plt.imshow(original_imgs[i])

แสดงภาพ ต้นฉบับที่ถูกปรับขนาดแล้ว (PIL Image) บน Matplotlib plot

เตรียมรูปภาพเพื่อที่จะติดชื่อและบันทึก

รูปภาพถูกโหลดขึ้นบน Matplotlib figure

101

plt.title(f"{pred_label} ({confidence*100:.1f}%)")

ตั้งชื่อภาพ ด้วยชื่อคลาสและค่าความมั่นใจ

เพื่อติดป้ายกำกับบนรูปภาพที่บันทึก

ชื่อภาพถูกกำหนด

102

plt.axis("off")

ปิดแกน (Axis) และตัวเลขรอบรูปภาพ

เพื่อให้รูปภาพที่บันทึกดูสะอาดตา มีแค่รูปภาพและชื่อภาพ

แกนรอบรูปภาพถูกซ่อน

103

save_path = os.path.join(SAVE_DIR, f"pred_{i+1}_{pred_label}.jpg")

สร้างพาธสำหรับไฟล์รูปภาพที่จะบันทึก

กำหนดชื่อไฟล์รูปภาพให้มีลำดับและคลาสที่ทำนายเพื่อความเป็นระเบียบ (เช่น pred_1_cat_kitten.jpg)

ตัวแปร save_path เก็บพาธของรูปภาพผลลัพธ์

104

plt.savefig(save_path, bbox_inches="tight")

บันทึก รูปภาพที่ติดป้ายชื่อแล้วไปยังพาธที่กำหนด

จัดเก็บบันทึกรูปภาพผลลัพธ์

ไฟล์รูปภาพ (พร้อมป้ายกำกับ) ถูกบันทึก

105

plt.close()

ปิด Matplotlib figure ปัจจุบัน

เพื่อล้างหน่วยความจำและเตรียมพร้อมสำหรับการพลอตรูปภาพถัดไปใน Loop

Figure ถูกปิด

107

print(f"\n✅ ผลลัพธ์ถูกบันทึกที่: {SAVE_DIR}")

แสดงข้อความ แจ้งเตือนเมื่อกระบวนการเสร็จสมบูรณ์

แจ้งให้ผู้ใช้ทราบว่าการทำงานเสร็จสิ้นและระบุตำแหน่งของไฟล์ผลลัพธ์

ข้อความสรุปถูกพิมพ์ออกทางหน้าจอ

Last updated