ml.utils --- ML Utils

โมดูล ml.utils มีคลาสและฟังก์ชันยูทิลิตีสำหรับการเรียนรู้ของเครื่อง

ฟังก์ชัน

ml.utils.logit(x: ndarray) ndarray

คืนค่าลอจิตของค่าทั้งหมดใน ndarray ที่ส่งเข้ามา

ml.utils.sigmoid(x: ndarray) ndarray

คืนค่าซิกมอยด์ของค่าทั้งหมดใน ndarray ที่ส่งเข้ามา

ml.utils.threshold(scores: ndarray, threshold: float, scale: float, find_max: bool = False, find_max_axis: int = 1) ndarray

ทำการ threshold scores (ndarray แบบ quantized ของ int8, uint8, int16 หรือ uint16) ด้วย threshold แบบ quantized และคืนค่า ndarray ของดัชนีทั้งหมดที่ผ่านค่าขีดแบ่ง

scale จะถูกทดสอบเพื่อพิจารณาว่าค่าที่ dequantize แล้วเป็นบวกหรือลบ เมื่อ scale > 0 จะคืนดัชนีที่ scores > threshold; มิฉะนั้นจะคืนดัชนีที่ scores < threshold

find_max ถ้าเป็น True จะแทนที่ scores ภายในด้วย ndarray ของค่าสูงสุด (หรือต่ำสุด ขึ้นอยู่กับ scale) ตาม find_max_axis

find_max_axis คือแกนที่ใช้คำนวณการลด max/min เมื่อ find_max เป็น True

ml.utils.quantize(model: ml.Model, value: ndarray, index: int = 0) ndarray

แปลง ndarray ที่ส่งเข้ามาโดยการหารด้วย scale และบวก zero point ของโมเดล คืนค่า value ไม่เปลี่ยนแปลงเมื่อ dtype ของ output โมเดลที่ index เป็น float

model คือโมเดลที่ใช้พารามิเตอร์ quantization ของ output

value คือ ndarray ที่ต้องการ quantize

index เลือก tensor output ใดของ model ที่จะ quantize ด้วย

ml.utils.dequantize(model: ml.Model, value: ndarray, index: int = 0) ndarray

แปลง ndarray ที่ส่งเข้ามาโดยการลบ zero point แล้วคูณด้วย scale ของโมเดล คืนค่า value ไม่เปลี่ยนแปลงเมื่อ dtype ของ output โมเดลที่ index เป็น float

model คือโมเดลที่ใช้พารามิเตอร์ quantization ของ output

value คือ ndarray ที่ต้องการ dequantize

index เลือก tensor output ใดของ model ที่จะ dequantize ด้วย

ml.utils.draw_predictions(image: image.Image, boxes: list[tuple[float, float, float, float]], labels: list[str], colors: list[tuple[int, int, int]], scores: list[float] | None = None, format: str = 'pascal_voc', font_width: int = 8, font_height: int = 10, text_color: tuple[int, int, int] = (255, 255, 255)) None

วาดกรอบล้อมรอบ (หรือเครื่องหมายจุดกึ่งกลาง) พร้อมป้ายกำกับข้อความลงบน image

boxes คือรายการของ tuple (x, y, w, h)

labels คือรายการของสตริงป้ายกำกับ หนึ่งรายการต่อกล่อง

colors คือรายการของ tuple (r, g, b) หนึ่งรายการต่อกล่อง

scores ถ้าไม่ใช่ None คือรายการคะแนนความเชื่อมั่นต่อกล่อง เมื่อระบุ ป้ายกำกับที่แสดงผลแต่ละอันจะมีคะแนนต่อท้ายในรูปแบบ " %.2f"

format ควบคุมวิธีตีความพิกัดกล่อง:

  • "pascal_voc" -- (xmin, ymin, xmax, ymax) แบบ normalized ในช่วง 0.0 ถึง 1.0

  • "point" -- พิกเซลสัมบูรณ์ (x, y, w, h); วาดเครื่องหมายวงกลมแบบเต็มที่จุดกึ่งกลางกล่องแทนสี่เหลี่ยม (มีประโยชน์สำหรับตัวตรวจจับแบบ centerpoint)

  • ค่าอื่น ๆ -- พิกเซลสัมบูรณ์ (x, y, w, h); วาดเป็นสี่เหลี่ยม

font_width คือความกว้างเป็นพิกเซลของแต่ละอักขระในป้ายกำกับ

font_height คือความสูงเป็นพิกเซลของพื้นหลังป้ายกำกับ

text_color คือสี (r, g, b) ที่ใช้สำหรับข้อความป้ายกำกับ

ml.utils.draw_keypoints(image: image.Image, keypoints: ndarray, radius: int = 4, color: tuple[int, int, int] = (255, 0, 0), thickness: int = 1, fill: bool = False) None

วาด ndarray ของค่าจุดสำคัญ (x, y, ...) ลงบน image

radius คือรัศมีวงกลมจุดสำคัญ เมื่อ radius == 0 จุดสำคัญจะถูกวาดเป็นพิกเซลเดี่ยว

color คือสีจุดสำคัญ (r, g, b)

thickness คือความหนาของเส้นรอบวงกลม

fill ถ้าเป็น True จะเติมวงกลมจุดสำคัญ

ml.utils.draw_skeleton(image: image.Image, keypoints: ndarray, lines: list[tuple[int, int]], kp_radius: int = 4, kp_color: tuple[int, int, int] = (255, 0, 0), kp_thickness: int = 1, kp_fill: bool = False, line_color: tuple[int, int, int] = (0, 255, 0), line_thickness: int = 1) None

วาด ndarray ของค่าจุดสำคัญ (x, y, ...) ลงบน image แล้วเชื่อมต่อด้วยเส้นตรง

lines คือรายการของ tuple (kp0_idx, kp1_idx) ที่ระบุคู่จุดสำคัญที่จะเชื่อมต่อ

kp_radius คือรัศมีวงกลมจุดสำคัญ (ส่งต่อไปยัง draw_keypoints)

kp_color คือสีจุดสำคัญ (r, g, b)

kp_thickness คือความหนาเส้นรอบวงกลมจุดสำคัญ

kp_fill ถ้าเป็น True จะเติมวงกลมจุดสำคัญ

line_color คือสีเส้น (r, g, b)

line_thickness คือความหนาของเส้น

class NMS -- Soft-Non-Maximum Suppression

ออบเจ็กต์ NMS รวบรวมรายการกรอบล้อมรอบพร้อมคะแนนที่เกี่ยวข้อง กรองกล่องที่ซ้อนทับกันซึ่งมีคะแนนต่ำกว่าด้วย Soft-NMS และแปลงพิกัดกล่องที่ตรวจพบในหน้าต่างย่อยกลับไปยังพิกัดภาพต้นฉบับ

class ml.utils.NMS(window_w: int, window_h: int, roi: tuple[int, int, int, int])

สร้างออบเจ็กต์ NMS

window_w และ window_h คือความกว้างและความสูงของ tensor input ของโมเดล / หน้าต่าง

roi คือบริเวณที่สนใจ (ROI) (x, y, w, h) ของภาพต้นฉบับที่โมเดลถูกรันอยู่ (โดยทั่วไปส่งคืนโดยออบเจ็กต์ Normalization()) ใช้เพื่อแปลงพิกัดกล่องที่ตรวจพบกลับไปยังพิกัดภาพต้นฉบับ roi[2] และ roi[3] ต้องมีค่า >= 1

add_bounding_box(xmin: float, ymin: float, xmax: float, ymax: float, score: float, label_index: int, keypoints: ndarray | None = None) None

เพิ่มกรอบล้อมรอบลงในออบเจ็กต์ NMS กล่องที่มี score อยู่นอกช่วง [0.0, 1.0] หรือมีความกว้างหรือความสูงเป็นศูนย์/ลบหลังการตัดขอบจะถูกทิ้ง

xmin, ymin, xmax, ymax คือพิกัดกรอบล้อมรอบในพื้นที่พิกเซลของหน้าต่าง โดยตัดขอบที่ [0, window_w] / [0, window_h]

score คือคะแนนความเชื่อมั่นของกรอบล้อมรอบ (0.0-1.0)

label_index คือดัชนีของป้ายกำกับคลาสที่เชื่อมโยงกับกรอบล้อมรอบ

keypoints คือ ndarray เสริมของค่าจุดสำคัญ (x, y, ...) ที่เชื่อมโยงกับกรอบล้อมรอบนี้

get_bounding_boxes(threshold: float = 0.1, sigma: float = 0.1) list[list[tuple]]

ดำเนิน Soft-NMS กับกล่องที่เพิ่มทั้งหมดและคืนรายการของรายการต่อคลาส โดยจัดดัชนีตาม label_index รายการภายในแต่ละรายการมี tuple ของ ((x, y, w, h), score) ที่แปลงกลับเป็นพิกัดภาพต้นฉบับแล้ว หากมีการระบุ keypoints ไว้ตอนเพิ่ม tuple จะถูกขยายด้วย ndarray keypoints ที่แปลงพิกัดแล้ว

หลังจากเรียกวิธีนี้ ให้สร้างออบเจ็กต์ NMS ใหม่เพื่อประมวลผลชุดกรอบล้อมรอบใหม่

threshold คือคะแนนขั้นต่ำที่กล่องต้องคงไว้หลังการ Soft-NMS suppression เพื่อให้ถูกเก็บไว้

sigma ควบคุม Gaussian ที่ใช้ลงโทษคะแนนของกรอบล้อมรอบที่ซ้อนทับกัน sigma ที่เล็กกว่าจะส่งผลให้การ suppression รุนแรงมากขึ้น sigma <= 0.0 จะปิดใช้งาน Gaussian penalty (คะแนนของกล่องที่ซ้อนทับกันจะไม่ถูกลดทอน)