เอกสารนี้อธิบายวิธีสร้างไลบรารี TensorFlow Lite iOS ด้วยตัวคุณเอง โดยปกติ คุณไม่จำเป็นต้องสร้างไลบรารี TensorFlow Lite iOS ในเครื่อง หากคุณต้องการใช้งาน วิธีที่ง่ายที่สุดคือการใช้ TensorFlow Lite CocoaPods ที่สร้างไว้ล่วงหน้าหรือออกทุกคืน ดู การเริ่มต้นอย่างรวดเร็วของ iOS สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการใช้งานในโครงการ iOS ของคุณ
การก่อสร้างในท้องถิ่น
ในบางกรณี คุณอาจต้องการใช้ TensorFlow Lite บิวด์ภายในเครื่อง เช่น เมื่อคุณต้องการทำการเปลี่ยนแปลงในเครื่องกับ TensorFlow Lite และทดสอบการเปลี่ยนแปลงเหล่านั้นในแอป iOS ของคุณ หรือคุณต้องการใช้เฟรมเวิร์กแบบคงที่กับไดนามิกที่เราให้ไว้ หากต้องการสร้างเฟรมเวิร์ก iOS สากลสำหรับ TensorFlow Lite ภายในเครื่อง คุณต้องสร้างเฟรมเวิร์กดังกล่าวโดยใช้ Bazel บนเครื่อง macOS
ติดตั้ง Xcode
หากคุณยังไม่ได้ติดตั้ง คุณจะต้องติดตั้ง Xcode 8 หรือใหม่กว่า และเครื่องมือที่ใช้ xcode-select
:
xcode-select --install
หากเป็นการติดตั้งใหม่ คุณจะต้องยอมรับข้อตกลงสิทธิ์การใช้งานสำหรับผู้ใช้ทั้งหมดด้วยคำสั่งต่อไปนี้:
sudo xcodebuild -license accept
ติดตั้งบาเซล
Bazel เป็นระบบบิลด์หลักสำหรับ TensorFlow ติดตั้ง Bazel ตาม คำแนะนำบนเว็บไซต์ Bazel ตรวจสอบให้แน่ใจว่าได้เลือกเวอร์ชันระหว่าง _TF_MIN_BAZEL_VERSION
และ _TF_MAX_BAZEL_VERSION
ใน ไฟล์ configure.py
ที่รากของที่เก็บ tensorflow
กำหนดค่า WORKSPACE และ .bazelrc
เรียกใช้สคริปต์ ./configure
ในไดเรกทอรีการชำระเงินรูท TensorFlow และตอบว่า "ใช่" เมื่อสคริปต์ถามว่าคุณต้องการสร้าง TensorFlow ด้วยการรองรับ iOS หรือไม่
สร้างเฟรมเวิร์กแบบไดนามิก TensorFlowLiteC (แนะนำ)
เมื่อกำหนดค่า Bazel อย่างถูกต้องด้วยการรองรับ iOS แล้ว คุณจะสามารถสร้างเฟรมเวิร์ก TensorFlowLiteC
ได้ด้วยคำสั่งต่อไปนี้
bazel build --config=ios_fat -c opt --cxxopt=--std=c++17 \
//tensorflow/lite/ios:TensorFlowLiteC_framework
คำสั่งนี้จะสร้างไฟล์ TensorFlowLiteC_framework.zip
ใต้ไดเร็กทอรี bazel-bin/tensorflow/lite/ios/
ใต้ไดเร็กทอรีราก TensorFlow ของคุณ ตามค่าเริ่มต้น เฟรมเวิร์กที่สร้างขึ้นจะมีไบนารี "fat" ซึ่งประกอบด้วย armv7, arm64 และ x86_64 (แต่ไม่มี i386) หากต้องการดูรายการแฟล็กบิวด์ทั้งหมดที่ใช้เมื่อคุณระบุ --config=ios_fat
โปรดดูส่วนการกำหนดค่า iOS ใน ไฟล์ .bazelrc
สร้างเฟรมเวิร์กคงที่ของ TensorFlowLiteC
ตามค่าเริ่มต้น เราจะเผยแพร่เฟรมเวิร์กไดนามิกผ่าน Cocoapods เท่านั้น หากคุณต้องการใช้เฟรมเวิร์กแบบคงที่แทน คุณสามารถสร้างเฟรมเวิร์กแบบคงที่ TensorFlowLiteC
ด้วยคำสั่งต่อไปนี้:
bazel build --config=ios_fat -c opt --cxxopt=--std=c++17 \
//tensorflow/lite/ios:TensorFlowLiteC_static_framework
คำสั่งจะสร้างไฟล์ชื่อ TensorFlowLiteC_static_framework.zip
ใต้ไดเร็กทอรี bazel-bin/tensorflow/lite/ios/
ใต้ไดเร็กทอรีราก TensorFlow ของคุณ เฟรมเวิร์กแบบคงที่นี้สามารถใช้ได้ในลักษณะเดียวกับเฟรมเวิร์กแบบไดนามิก
คัดเลือกสร้างเฟรมเวิร์ก TFLite
คุณสามารถสร้างเฟรมเวิร์กที่มีขนาดเล็กลงโดยกำหนดเป้าหมายเฉพาะชุดโมเดลโดยใช้บิลด์แบบเลือกได้ ซึ่งจะข้ามการดำเนินการที่ไม่ได้ใช้ในชุดโมเดลของคุณ และรวมเฉพาะเคอร์เนล op ที่จำเป็นในการรันชุดโมเดลที่กำหนดเท่านั้น คำสั่งมีดังนี้:
bash tensorflow/lite/ios/build_frameworks.sh \
--input_models=model1.tflite,model2.tflite \
--target_archs=x86_64,armv7,arm64
คำสั่งข้างต้นจะสร้างเฟรมเวิร์กแบบคงที่ bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteC_framework.zip
สำหรับ TensorFlow Lite ในตัวและการดำเนินการที่กำหนดเอง หรือสร้างเฟรมเวิร์กแบบคงที่ bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteSelectTfOps_framework.zip
หากโมเดลของคุณมีตัวเลือก Select TensorFlow โปรดทราบว่าสามารถใช้แฟล็ก --target_archs
เพื่อระบุสถาปัตยกรรมการปรับใช้ของคุณ
ใช้ในแอปพลิเคชันของคุณเอง
นักพัฒนา CocoaPods
CocoaPods สำหรับ TensorFlow Lite มีสามรายการ:
-
TensorFlowLiteSwift
: จัดเตรียม Swift API สำหรับ TensorFlow Lite -
TensorFlowLiteObjC
: จัดเตรียม Objective-C API สำหรับ TensorFlow Lite -
TensorFlowLiteC
: พ็อดฐานทั่วไปซึ่งฝังรันไทม์หลัก TensorFlow Lite และเปิดเผย API C ฐานที่ใช้โดยสองพ็อดข้างต้น ไม่ได้มีไว้สำหรับผู้ใช้โดยตรง
ในฐานะนักพัฒนาซอฟต์แวร์ คุณควรเลือกพ็อด TensorFlowLiteSwift
หรือ TensorFlowLiteObjC
ตามภาษาที่แอปของคุณเขียน แต่ไม่ใช่ทั้งสองอย่าง ขั้นตอนที่แน่นอนสำหรับการใช้บิวด์ภายในของ TensorFlow Lite จะแตกต่างกันไป ขึ้นอยู่กับส่วนที่คุณต้องการสร้าง
การใช้ Swift หรือ Objective-C API ในเครื่อง
หากคุณใช้ CocoaPods และต้องการทดสอบการเปลี่ยนแปลงภายในเครื่องกับ Swift API หรือ Objective-C API ของ TensorFlow Lite เท่านั้น ให้ทำตามขั้นตอนที่นี่
ทำการเปลี่ยนแปลง Swift หรือ Objective-C API ในการชำระเงินเท
tensorflow
ของคุณเปิดไฟล์
TensorFlowLite(Swift|ObjC).podspec
และอัปเดตบรรทัดนี้:
s.dependency 'TensorFlowLiteC', "#{s.version}"
เป็น:
s.dependency 'TensorFlowLiteC', "~> 0.0.1-nightly"
นี่เป็นเพื่อให้แน่ใจว่าคุณกำลังสร้าง Swift หรือ Objective-C API เทียบกับTensorFlowLiteC
API เวอร์ชันล่าสุดที่ให้บริการทุกคืน (สร้างทุกคืนระหว่างเวลา 01.00-04.00 น. ตามเวลาแปซิฟิก) แทนที่จะเป็นเวอร์ชันเสถียร ซึ่งอาจล้าสมัยเมื่อเทียบกับtensorflow
ในพื้นที่ของคุณ เช็คเอาท์. หรือคุณสามารถเลือกที่จะเผยแพร่TensorFlowLiteC
เวอร์ชันของคุณเองและใช้เวอร์ชันนั้นได้ (ดู การใช้ส่วนหลัก TensorFlow Lite ในเครื่อง ด้านล่าง)ใน
Podfile
ของโปรเจ็กต์ iOS ของคุณ ให้เปลี่ยนการขึ้นต่อกันดังต่อไปนี้เพื่อชี้ไปยังพาธในเครื่องไปยังtensorflow
โฟลว์ของคุณ
สำหรับสวิฟท์:
pod 'TensorFlowLiteSwift', :path => '<your_tensorflow_root_dir>'
สำหรับวัตถุประสงค์-C:
pod 'TensorFlowLiteObjC', :path => '<your_tensorflow_root_dir>'
อัปเดตการติดตั้งพ็อดของคุณจากไดเรกทอรีรากของโปรเจ็กต์ iOS
$ pod update
เปิดพื้นที่ทำงานที่สร้างขึ้นใหม่ (
<project>.xcworkspace
) และสร้างแอปของคุณใหม่ภายใน Xcode
ใช้คอร์ TensorFlow Lite ในเครื่อง
คุณสามารถตั้งค่าพื้นที่เก็บข้อมูลข้อมูลจำเพาะ CocoaPods ส่วนตัว และเผยแพร่เฟรมเวิร์ก TensorFlowLiteC
ที่คุณกำหนดเองไปยัง Repo ส่วนตัวของคุณได้ คุณสามารถคัดลอก ไฟล์ podspec นี้และแก้ไขค่าบางค่าได้:
...
s.version = <your_desired_version_tag>
...
# Note the `///`, two from the `file://` and one from the `/path`.
s.source = { :http => "file:///path/to/TensorFlowLiteC_framework.zip" }
...
s.vendored_frameworks = 'TensorFlowLiteC.framework'
...
หลังจากสร้างไฟล์ TensorFlowLiteC.podspec
ของคุณเองแล้ว คุณสามารถทำตาม คำแนะนำในการใช้ CocoaPods ส่วนตัว เพื่อใช้ในโปรเจ็กต์ของคุณเองได้ คุณยังสามารถแก้ไข TensorFlowLite(Swift|ObjC).podspec
ให้ชี้ไปที่พ็อด TensorFlowLiteC
ที่คุณกำหนดเอง และใช้พ็อด Swift หรือ Objective-C ในโปรเจ็กต์แอปของคุณ
นักพัฒนา Bazel
หากคุณใช้ Bazel เป็นเครื่องมือสร้างหลัก คุณสามารถเพิ่มการพึ่งพา TensorFlowLite
ให้กับเป้าหมายของคุณในไฟล์ BUILD
ของคุณได้
สำหรับสวิฟท์:
swift_library(
deps = [
"//tensorflow/lite/swift:TensorFlowLite",
],
)
สำหรับวัตถุประสงค์-C:
objc_library(
deps = [
"//tensorflow/lite/objc:TensorFlowLite",
],
)
เมื่อคุณสร้างโปรเจ็กต์แอป การเปลี่ยนแปลงใดๆ ในไลบรารี TensorFlow Lite จะถูกรับและสร้างไว้ในแอปของคุณ
แก้ไขการตั้งค่าโปรเจ็กต์ Xcode โดยตรง
ขอแนะนำเป็นอย่างยิ่งให้ใช้ CocoaPods หรือ Bazel ในการเพิ่มการพึ่งพา TensorFlow Lite ในโปรเจ็กต์ของคุณ หากคุณยังคงต้องการเพิ่มเฟรมเวิร์ก TensorFlowLiteC
ด้วยตนเอง คุณจะต้องเพิ่มเฟรมเวิร์ก TensorFlowLiteC
เป็นเฟรมเวิร์กแบบฝังในโปรเจ็กต์แอปพลิเคชันของคุณ แตกไฟล์ TensorFlowLiteC_framework.zip
ที่สร้างจากบิลด์ด้านบนเพื่อรับไดเร็กทอรี TensorFlowLiteC.framework
ไดเร็กทอรีนี้เป็นเฟรมเวิร์กจริงที่ Xcode สามารถเข้าใจได้
เมื่อคุณเตรียม TensorFlowLiteC.framework
แล้ว ขั้นแรกคุณจะต้องเพิ่มมันเป็นไบนารีแบบฝังให้กับเป้าหมายแอปของคุณ ส่วนการตั้งค่าโปรเจ็กต์ที่แน่นอนอาจแตกต่างกันไปขึ้นอยู่กับเวอร์ชัน Xcode ของคุณ
- Xcode 11: ไปที่แท็บ 'ทั่วไป' ของตัวแก้ไขโปรเจ็กต์สำหรับเป้าหมายแอปของคุณ และเพิ่ม
TensorFlowLiteC.framework
ใต้ส่วน 'Frameworks, Libraries และ Embedded Content' - Xcode 10 และต่ำกว่า: ไปที่แท็บ 'ทั่วไป' ของตัวแก้ไขโปรเจ็กต์สำหรับเป้าหมายแอปของคุณ และเพิ่ม
TensorFlowLiteC.framework
ใต้ 'Embedded Binaries' ควรเพิ่มเฟรมเวิร์กโดยอัตโนมัติภายใต้ส่วน 'เฟรมเวิร์กที่เชื่อมโยงและไลบรารี'
เมื่อคุณเพิ่มเฟรมเวิร์กเป็นไบนารี่แบบฝัง Xcode จะอัปเดตรายการ 'เส้นทางการค้นหาเฟรมเวิร์ก' ใต้แท็บ 'การตั้งค่าการสร้าง' เพื่อรวมไดเร็กทอรีหลักของเฟรมเวิร์กของคุณ ในกรณีที่สิ่งนี้ไม่เกิดขึ้นโดยอัตโนมัติ คุณควรเพิ่มไดเร็กทอรีหลักของไดเร็กทอรี TensorFlowLiteC.framework
ด้วยตนเอง
เมื่อการตั้งค่าทั้งสองนี้เสร็จสิ้น คุณควรจะสามารถนำเข้าและเรียกใช้ C API ของ TensorFlow Lite ได้ ซึ่งกำหนดโดยไฟล์ส่วนหัวภายใต้ไดเรกทอรี TensorFlowLiteC.framework/Headers