ลายเซ็นทั่วไปสำหรับรูปภาพ

หน้านี้อธิบายลายเซ็นทั่วไปที่ควรนำไปใช้โดยโมดูลใน รูปแบบ TF1 Hub สำหรับงานที่เกี่ยวข้องกับรูปภาพ (สำหรับ รูปแบบ TF2 SavedModel โปรดดูที่ SavedModel API ที่คล้ายคลึงกัน)

โมดูลบางโมดูลสามารถนำไปใช้งานได้มากกว่าหนึ่งงาน (เช่น โมดูลการจำแนกประเภทรูปภาพมีแนวโน้มที่จะแยกคุณสมบัติบางอย่างออกไป) ดังนั้น แต่ละโมดูลจึงจัดเตรียม (1) ลายเซ็นที่มีชื่อสำหรับงานทั้งหมดที่ผู้จัดพิมพ์คาดการณ์ไว้ และ (2) output = m(images) สำหรับงานหลักที่กำหนด

ภาพคุณลักษณะเวกเตอร์

สรุปการใช้งาน

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

โมดูลสำหรับการดึงคุณลักษณะรูปภาพมีลายเซ็นเริ่มต้นที่จับคู่ชุดรูปภาพกับชุดเวกเตอร์คุณลักษณะ มันสามารถใช้งานได้ดังนี้:

  module_spec = hub.load_module_spec("path/to/module")
  height, width = hub.get_expected_image_size(module_spec)
  images = ...  # A batch of images with shape [batch_size, height, width, 3].
  module = hub.Module(module_spec)
  features = module(images)   # A batch with shape [batch_size, num_features].

นอกจากนี้ยังกำหนดลายเซ็นที่มีชื่อที่สอดคล้องกันอีกด้วย

ข้อกำหนดลายเซ็น

ลายเซ็นที่มีชื่อสำหรับการแยกเวกเตอร์คุณลักษณะรูปภาพถูกเรียกใช้เป็น

  outputs = module(dict(images=images), signature="image_feature_vector",
                   as_dict=True)
  features = outputs["default"]

อินพุตเป็นไปตามแบบแผนทั่วไปสำหรับ การป้อนรูปภาพ

พจนานุกรมเอาต์พุตประกอบด้วยเอาต์พุต "default" ของ dtype float32 และรูปร่าง [batch_size, num_features] batch_size เหมือนกับในอินพุต แต่ไม่ทราบเวลาในการสร้างกราฟ num_features เป็นค่าคงที่เฉพาะโมดูลที่ทราบ โดยไม่ขึ้นกับขนาดอินพุต

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

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

พจนานุกรมเอาต์พุตอาจให้เอาต์พุตเพิ่มเติม เช่น การเปิดใช้งานเลเยอร์ที่ซ่อนอยู่ภายในโมดูล คีย์และค่าขึ้นอยู่กับโมดูล ขอแนะนำให้ใส่ชื่อสถาปัตยกรรมนำหน้าคีย์ที่ขึ้นกับสถาปัตยกรรม (เช่น เพื่อหลีกเลี่ยงความสับสนระหว่างเลเยอร์กลาง "InceptionV3/Mixed_5c" กับเลเยอร์ convolutional บนสุด "InceptionV2/Mixed_5c" )

การจำแนกประเภทภาพ

สรุปการใช้งาน

การจัดหมวดหมู่รูปภาพ จะจับคู่พิกเซลของรูปภาพกับคะแนนเชิงเส้น (บันทึก) สำหรับการเป็นสมาชิกในคลาสของอนุกรมวิธาน ที่เลือกโดยผู้เผยแพร่โมดูล สิ่งนี้ช่วยให้ผู้บริโภคสามารถสรุปได้จากการจัดหมวดหมู่เฉพาะที่เรียนรู้จากโมดูลผู้เผยแพร่ ไม่ใช่แค่คุณลักษณะพื้นฐานเท่านั้น (เทียบกับ Image Feature Vector )

โมดูลสำหรับการดึงคุณสมบัติรูปภาพมีลายเซ็นเริ่มต้นที่แมปชุดรูปภาพกับชุดการบันทึก มันสามารถใช้งานได้ดังนี้:

  module_spec = hub.load_module_spec("path/to/module")
  height, width = hub.get_expected_image_size(module_spec)
  images = ...  # A batch of images with shape [batch_size, height, width, 3].
  module = hub.Module(module_spec)
  logits = module(images)   # A batch with shape [batch_size, num_classes].

นอกจากนี้ยังกำหนดลายเซ็นที่มีชื่อที่สอดคล้องกันอีกด้วย

ข้อกำหนดลายเซ็น

ลายเซ็นที่มีชื่อสำหรับการแยกเวกเตอร์คุณลักษณะรูปภาพถูกเรียกใช้เป็น

  outputs = module(dict(images=images), signature="image_classification",
                   as_dict=True)
  logits = outputs["default"]

อินพุตเป็นไปตามแบบแผนทั่วไปสำหรับ การป้อนรูปภาพ

พจนานุกรมเอาต์พุตประกอบด้วยเอาต์พุต "default" ของ dtype float32 และรูปร่าง [batch_size, num_classes] batch_size เหมือนกับในอินพุต แต่ไม่ทราบเวลาในการสร้างกราฟ num_classes คือจำนวนคลาสในการจำแนกประเภท ซึ่งเป็นค่าคงที่ที่ทราบโดยไม่ขึ้นอยู่กับขนาดอินพุต

การประเมิน outputs["default"][i, c] จะทำให้ได้คะแนนที่ทำนายความเป็นสมาชิกของตัวอย่าง i ในคลาสที่มีดัชนี c

ขึ้นอยู่กับการจำแนกประเภทพื้นฐานว่าคะแนนเหล่านี้มีไว้สำหรับใช้กับ softmax (สำหรับคลาสที่ไม่เกิดร่วมกัน), sigmoid (สำหรับคลาส orthogonal) หรืออย่างอื่น เอกสารประกอบของโมดูลควรอธิบายสิ่งนี้ และอ้างอิงถึงคำจำกัดความของดัชนีคลาส

พจนานุกรมเอาต์พุตอาจให้เอาต์พุตเพิ่มเติม เช่น การเปิดใช้งานเลเยอร์ที่ซ่อนอยู่ภายในโมดูล คีย์และค่าขึ้นอยู่กับโมดูล ขอแนะนำให้ใส่ชื่อสถาปัตยกรรมนำหน้าคีย์ที่ขึ้นอยู่กับสถาปัตยกรรม (เช่น เพื่อหลีกเลี่ยงไม่ให้เลเยอร์กลาง "InceptionV3/Mixed_5c" สับสนกับเลเยอร์ Convolutional บนสุด "InceptionV2/Mixed_5c" )

อินพุตรูปภาพ

นี่เป็นเรื่องปกติสำหรับโมดูลรูปภาพและลายเซ็นรูปภาพทุกประเภท

ลายเซ็นที่รับชุดรูปภาพเป็นอินพุตยอมรับว่าเป็นเทนเซอร์ 4-D ที่หนาแน่นของ dtype float32 และรูปร่าง [batch_size, height, width, 3] ซึ่งมีองค์ประกอบเป็นค่าสี RGB ของพิกเซลที่ปรับให้เป็นมาตรฐานในช่วง [0, 1] . นี่คือสิ่งที่คุณได้รับจากตามด้วย tf.image.decode_*() tf.image.convert_image_dtype(..., tf.float32)

โมดูลที่มีการป้อนข้อมูลรูปภาพหนึ่งรายการ (หรือหนึ่งรายการหลัก) จะใช้ชื่อ "images" สำหรับอินพุตนี้

โมดูลยอมรับ batch_size ใด ๆ และตั้งค่ามิติแรกของ TensorInfo.tensor_shape เป็น "unknown" ตามลำดับ มิติสุดท้ายถูกกำหนดไว้ที่หมายเลข 3 ของช่อง RGB ขนาด height และ width ถูกกำหนดให้เป็นขนาดที่คาดไว้ของรูปภาพอินพุต (งานในอนาคตอาจลบข้อจำกัดนั้นสำหรับโมดูลแบบหมุนวนทั้งหมด)

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

เพื่อความเรียบง่าย โมดูล TF-Hub จะใช้เค้าโครง channels_last (หรือ NHWC ) ของ Tensors และปล่อยให้เป็นหน้าที่ของเครื่องมือเพิ่มประสิทธิภาพกราฟของ TensorFlow เพื่อเขียนใหม่เป็น channels_first (หรือ NCHW ) หากจำเป็น โดยค่าเริ่มต้นจะทำอย่างนั้นมาตั้งแต่ TensorFlow เวอร์ชัน 1.7