Tensorflow: [سؤال وخطأ] هل يوجد نموذج كشف مثل SSD-Mobile-net في Tensorflow-lite؟

تم إنشاؤها على ٢٦ ديسمبر ٢٠١٧  ·  141تعليقات  ·  مصدر: tensorflow/tensorflow

أهلا.

تطوير تطبيق android باستخدام tensorflow-lite.

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/g3doc/models.md
لم يتم العثور على نموذج الكشف.

أيضًا ، أحاول تحويل SSD-Inceptionv2 باستخدام tensorflow-lite-API. لكن يبدو أن هناك مشكلة.

أمر


bazel run --config=opt --copt=-msse4.1 --copt=-msse4.2 \
  //tensorflow/contrib/lite/toco:toco -- \
  --input_file=/home/danshin/tensorflow_lite/lite_model/fire_incpetion_v2.pb \
  --output_file=/home/danshin/tensorflow_lite/lite_model/fire_inception_v2.lite \
  --input_format=TENSORFLOW_GRAPHDEF \
  --output_format=TFLITE \
  --inference_type=FLOAT \
  --input_shape=1,300,300,3 \
  --input_array=image_tensor \
  --output_array={detection_boxes,detection_scores,detection_classes,num_detections}

خطا بالكود


2017-12-26 14:59:25.159220: I tensorflow/contrib/lite/toco/graph_transformations/graph_transformations.cc:39] Before general graph transformations: 2029 operators, 3459 arrays (0 quantized)
2017-12-26 14:59:25.251633: F tensorflow/contrib/lite/toco/graph_transformations/resolve_tensorflow_switch.cc:95] Check failed: other_op->type == OperatorType::kTensorFlowMerge 

تم إنشاء ملف fire_inception_v2 ، لكن حجمه يساوي صفر بايت.
ما هي المشكلة؟

أيضا،
يرجى إعلامي ما هي أفضل طريقة لنشر نموذج مخصص لاكتشاف الكائنات؟

شخص ما يساعدني من فضلك !.

شكرا.

lite feature

التعليق الأكثر فائدة

إنه مباشر الآن في Tensorflow / Contrib / lite / Examples / android ! هذا منفذ أكثر اكتمالاً من العرض التوضيحي الأصلي لـ TF Android (يفتقر فقط إلى مثال Stylize) ، وسيحل محل العرض التوضيحي الآخر في tensorflow / contrib / lite / java / demo من الآن فصاعدًا.

يمكن العثور على أداة تحميل TF Lite المسطحة المحولة في mobilenet_ssd_tflite_v1.zip ، ويمكنك العثور على تنفيذ استدلال Java في TFLiteObjectDetectionAPIModel.java . لاحظ أن هذا يختلف عن تنفيذ TF الأصلي في أنه يجب فك تشفير المربعات يدويًا في Java ، ويجب أن يتم حزم مربع سابق لملف txt في أصول التطبيقات (أعتقد أن العنصر المضمن في النموذج المضغوط أعلاه يجب أن يكون صالحًا لمعظم الرسوم البيانية).

أثناء تحويل TOCO ، يتم استخدام عقدة إدخال مختلفة (معالج مسبق / فرعي) ، بالإضافة إلى عقد إخراج مختلفة (concat ، concat_1). يؤدي هذا إلى تخطي بعض الأجزاء التي تمثل مشكلة بالنسبة إلى tflite ، حتى تتم إعادة هيكلة الرسم البياني أو وصول TF Lite إلى تكافؤ TF.

فيما يلي الخطوات السريعة لتحويل نموذج SSD MobileNet إلى تنسيق tflite وإنشاء العرض التوضيحي لاستخدامه:

# Download and extract SSD MobileNet model
wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_coco_2017_11_17.tar.gz
tar -xvf ssd_mobilenet_v1_coco_2017_11_17.tar.gz 
DETECT_PB=$PWD/ssd_mobilenet_v1_coco_2017_11_17/frozen_inference_graph.pb
STRIPPED_PB=$PWD/frozen_inference_graph_stripped.pb
DETECT_FB=$PWD/tensorflow/contrib/lite/examples/android/assets/mobilenet_ssd.tflite

# Strip out problematic nodes before even letting TOCO see the graphdef
bazel run -c opt tensorflow/python/tools/optimize_for_inference -- \
--input=$DETECT_PB  --output=$STRIPPED_PB --frozen_graph=True \
--input_names=Preprocessor/sub --output_names=concat,concat_1 \
--alsologtostderr

# Run TOCO conversion.
bazel run tensorflow/contrib/lite/toco:toco -- \
--input_file=$STRIPPED_PB --output_file=$DETECT_FB \
--input_format=TENSORFLOW_GRAPHDEF --output_format=TFLITE \
--input_shapes=1,300,300,3 --input_arrays=Preprocessor/sub \
--output_arrays=concat,concat_1 --inference_type=FLOAT --logtostderr

# Build and install the demo
bazel build -c opt --cxxopt='--std=c++11' //tensorflow/contrib/lite/examples/android:tflite_demo
adb install -r -f bazel-bin/tensorflow/contrib/lite/examples/android/tflite_demo.apk

ال 141 كومينتر

aselle هل يمكنك إلقاء نظرة على هذه المشكلة من فضلك؟ شكرا.

نحن نعمل حاليًا على تحويل محرك أقراص mobileenet SSD (ثم بدء تشغيل ssd بعد ذلك) ، ولكنه يحتوي على عمليات غير مدعومة بالكامل. سوف أقوم بتحديث هذه المشكلة بمجرد الانتهاء من ذلك.

رائع ، لقد طرحت سؤالًا مشابهًا هنا: https://github.com/tensorflow/tensorflow/issues/14731

كم من الوقت تحسبون حتى تضيفوا الدعم من SSD-Mobilenet؟

شكرا،
مارتن بينياك

أجاب أحد أعضاء منظمة TensorFlow بعد الإحصائيات: تم تطبيق تسمية tensorflower في انتظار .

؟

Nagging Assignee: لقد مرت 14 يومًا بدون أي نشاط وهذه المشكلة لها متنازل له. يرجى تحديث التسمية و / أو الحالة وفقًا لذلك.

أي تحديثات؟
أنا أيضًا أواجه مشكلة مماثلة. شكرا مقدما.

تضمين التغريدة

هل يمكنك اقتراح أي مجموعة بيانات مثل " ssd_mobilenet_v1_coco_2017_11_17.tar " والتي يمكن استخدامها في متجر بيع بالتجزئة لتعريف الملابس المختلفة مثل القمصان والجينز وما إلى ذلك.

@ rana3579 ، الرجاء طرح مثل هذا السؤال على stackoverflow. تحديث سريع لموبيلنت SSD. هذا يتقدم ونأمل أن يكون لدينا مثال قريبًا.

@ rana3579 تحقق من الفيديو الخاص بي ، وقم بتشغيل هذا على movidius و nvidia gpus بالإضافة إلى معالجات الذراع. لا يمكنني مشاركة مجموعة البيانات ولكن إذا كنت جزءًا من شركة فيمكننا التحدث عن التعاون المحتمل: https://www.youtube.com/watch؟v=3MinI9cCJrc

aselle شكرا على التحديث! أين تبحث عن الإخطارات على هذا؟ أود أن يتم إخطاري بمجرد خروجنا إذا كان ذلك ممكنًا. شكرا لك ، أنا أقدر عملك الجاد في هذا!

andrewharp ، يعمل على هذا وسيتم تحديث تطبيق Java TF Mobile لاستخدام tflite. لذا راقب هذه التغييرات في المستودع. سأترك هذه القضية مفتوحة الآن.

هذا وظيفي داخليا. يجب أن يكون هناك شيء ما في الأسبوع أو الأسبوعين المقبلين.

تضمين التغريدة هل ينطبق ذلك أيضًا على مثال كاميرا iOS؟
وأيضًا ما هو حجم الأوزان والأداء؟
يعتبر MobLite تصنيف TFLite صغيرًا والأداء على iOS سلس للغاية لذا فأنا متحمس جدًا لـ TFLite.

قام البعض الآخر بالفعل بتحويل SSD Mobilenet pb الحالي إلى نموذج coreml وكتب طبقات الإخراج المفقودة في Swift:
https://github.com/vonholst/SSDMobileNet_CoreML

ولكن هذا فقط يشبه 8-12 إطارًا في الثانية على iPhone 7.

أهلا،
أي تحديث على هذا؟

أنا فضولي أيضًا :)

لدي التزام بنقل عرض Android TF التجريبي إلى tflite قيد المراجعة حاليًا ، ونأمل أن يظهر على جيثب هذا الأسبوع.

madhavajay إنه Android فقط ، ولكن يجب أن تكون قادرًا على تكييفه مع iOS. الشيء الوحيد هو أن بعض عمليات المعالجة المسبقة (تغيير حجم الصورة / تطبيعها) والمعالجة اللاحقة (عدم الحد الأقصى للقمع والتعديل بواسطة الصناديق المسبقة) تتم في Java لأن tflite لا يدعم بشكل كامل جميع المشغلين الذين يستخدمهم MobileNet SSD .

تضمين التغريدة هل يمكنك أن تشرح بإيجاز سبب عدم توفر هذه العمليات حاليًا في TF lite. يبدو الأمر نفسه بالنسبة لأداة التحويل tfcoreml على SSD العادي. لا يشتكي من مجرد السؤال بدافع الاهتمام الفني ، هل يفعلون شيئًا يصعب تنفيذه بشكل خاص في مكدس الهاتف المحمول أم أنه مجرد أولوية منخفضة؟

نتطلع إلى رؤية جهودك الملحمية على كود Android !!! شكرا جزيلا. أعرف أنني لست الوحيد الذي يتطلع إلى هذا الأمر!

andrewharp و aselle هل من تحديث للحصول على عرض توضيحي لاستخدام مثال تعريب الكائنات المستند إلى SSD لـ TFLite؟

إنه مباشر الآن في Tensorflow / Contrib / lite / Examples / android ! هذا منفذ أكثر اكتمالاً من العرض التوضيحي الأصلي لـ TF Android (يفتقر فقط إلى مثال Stylize) ، وسيحل محل العرض التوضيحي الآخر في tensorflow / contrib / lite / java / demo من الآن فصاعدًا.

يمكن العثور على أداة تحميل TF Lite المسطحة المحولة في mobilenet_ssd_tflite_v1.zip ، ويمكنك العثور على تنفيذ استدلال Java في TFLiteObjectDetectionAPIModel.java . لاحظ أن هذا يختلف عن تنفيذ TF الأصلي في أنه يجب فك تشفير المربعات يدويًا في Java ، ويجب أن يتم حزم مربع سابق لملف txt في أصول التطبيقات (أعتقد أن العنصر المضمن في النموذج المضغوط أعلاه يجب أن يكون صالحًا لمعظم الرسوم البيانية).

أثناء تحويل TOCO ، يتم استخدام عقدة إدخال مختلفة (معالج مسبق / فرعي) ، بالإضافة إلى عقد إخراج مختلفة (concat ، concat_1). يؤدي هذا إلى تخطي بعض الأجزاء التي تمثل مشكلة بالنسبة إلى tflite ، حتى تتم إعادة هيكلة الرسم البياني أو وصول TF Lite إلى تكافؤ TF.

فيما يلي الخطوات السريعة لتحويل نموذج SSD MobileNet إلى تنسيق tflite وإنشاء العرض التوضيحي لاستخدامه:

# Download and extract SSD MobileNet model
wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_coco_2017_11_17.tar.gz
tar -xvf ssd_mobilenet_v1_coco_2017_11_17.tar.gz 
DETECT_PB=$PWD/ssd_mobilenet_v1_coco_2017_11_17/frozen_inference_graph.pb
STRIPPED_PB=$PWD/frozen_inference_graph_stripped.pb
DETECT_FB=$PWD/tensorflow/contrib/lite/examples/android/assets/mobilenet_ssd.tflite

# Strip out problematic nodes before even letting TOCO see the graphdef
bazel run -c opt tensorflow/python/tools/optimize_for_inference -- \
--input=$DETECT_PB  --output=$STRIPPED_PB --frozen_graph=True \
--input_names=Preprocessor/sub --output_names=concat,concat_1 \
--alsologtostderr

# Run TOCO conversion.
bazel run tensorflow/contrib/lite/toco:toco -- \
--input_file=$STRIPPED_PB --output_file=$DETECT_FB \
--input_format=TENSORFLOW_GRAPHDEF --output_format=TFLITE \
--input_shapes=1,300,300,3 --input_arrays=Preprocessor/sub \
--output_arrays=concat,concat_1 --inference_type=FLOAT --logtostderr

# Build and install the demo
bazel build -c opt --cxxopt='--std=c++11' //tensorflow/contrib/lite/examples/android:tflite_demo
adb install -r -f bazel-bin/tensorflow/contrib/lite/examples/android/tflite_demo.apk

andrewharp عيد فصح سعيد ، أنت الأسطورة! :) سأرى ما إذا كان بإمكاني تشغيل هذا.

مرحباً ، هل هناك أي نسخة تكميمية؟

لقد عملت مع التعليمات المذكورة أعلاه ولكنني بحاجة إلى:

  • Android SDK 15 بسبب إصدار bazel الخاص بي
  • لا يمكنني أيضًا فتح المشروع في Android Studio

andrewharp هل هذا شيء جديد في Android Studio تتجهون إليه يا رفاق يستخدم bazel لبناء مشاريع بدلاً من Gradle ، أو مجرد فقدان بعض إعدادات المشروع في الوقت الحالي بسبب الإطار الزمني القصير لتشغيله؟

يسعدني تقديم العلاقات العامة إذا فهمت ما هي المشكلة.

أيضًا فيما يتعلق بالأداء ، يبدو أنه بطيء في جهاز LG G6 على نظام Android 7.
هل هذا لأن NN API يعمل فقط على نظام Android 8؟

أي شخص قادر على اختباره على Android 8؟

أرى ، أعتقد أن التعليمات كانت فقط للتحويل. توقفت عن القراءة بعد الجزء الأول من الجملة قائلا أن هذا هو كيفية تحويل النموذج لول.

نعم ، لقد حصلت على pixel xl ، أفترض أن هاتفك لا يحتوي على أجهزة يمكنها تسريع الاستدلال أو أن الأجهزة غير مدعومة من قبل البرنامج.

سأحاول وأعلمك. كنت أفترض أنني أستطيع بناء ذلك باستخدام android studio doh ...

مرسل من الايفون الخاص بي

في 31 مارس 2018 ، الساعة 20:05 ، كتب Madhava Jay [email protected] :

لقد عملت مع التعليمات المذكورة أعلاه ولكنني بحاجة إلى:

Android SDK 15 بسبب إصدار bazel الخاص بي
لا يمكنني أيضًا فتح المشروع في Android Studio
andrewharp هل هذا شيء جديد في Android Studio تتجهون إليه يا رفاق يستخدم bazel لبناء مشاريع بدلاً من Gradle ، أو مجرد فقدان بعض إعدادات المشروع في الوقت الحالي بسبب الإطار الزمني القصير لتشغيله؟

يسعدني تقديم العلاقات العامة إذا فهمت ما هي المشكلة.

أيضًا فيما يتعلق بالأداء ، يبدو أنه بطيء في جهاز LG G6 على نظام Android 7.
هل هذا لأن NN API يعمل فقط على نظام Android 8؟

أي شخص قادر على اختباره على Android 8؟

-
أنت تتلقى هذا لأنك علقت.
قم بالرد على هذه الرسالة الإلكترونية مباشرةً ، أو اعرضها على GitHub ، أو قم بكتم صوت الموضوع.

نعم ، لقد فعلت الشيء نفسه وذهبت مباشرة إلى الكود واستوديو Android. ثم بعد أن قمت باختبار هذا الصباح كنت على وشك الرد بأنني واجهت نفس المشكلة ثم RTFM'ed مرة أخرى. 🤣

بناءً على ما يمكنني قوله ، يجب أن يكون LG G6 قادرًا على دعم واجهة NN API نظرًا لأنه يحتوي على Qualcomm 821 SoC مثل Pixel 1. ولكن لسوء الحظ لم تصدر LG Android 8 أو 8.1 وتبدو أحدث إصدارات LineageOS سطحية بعض الشيء لذلك سوف أتوقف ما لم أكن أعرف أنه يعمل بشكل أفضل على Android 8.1. إذا كان بإمكانك إطلاقه على Pixel فسيكون ذلك رائعًا! 👍

لقد تمكنت من اختبار هذا ولكن العرض التوضيحي يعمل ببطء شديد ... حتى أبطأ من الإصدار الأصلي.
أنا أستخدم Pixel XL (الإصدار الأول) وقمت مسبقًا بتجميع العرض القديم لقوس 64 بت ، مما جعله يعمل بسرعة مضاعفة تقريبًا حتى بدون tfLite ... وقت الاستدلال في هذه الحالة حوالي 450 مللي ثانية. عندما أحاول هذا العرض التوضيحي ، يتم تشغيله في حوالي 850 مللي ثانية وأحيانًا أكثر من ثانية. هل فعلت شيئًا غير صحيح أو كنت مفرطًا في التفاؤل لتوقع تسريعًا لائقًا؟ شكرا.

mpeniak حصلت على نفس السرعات على LG G6 ، مع تشغيل التصحيح أو إيقاف تشغيله (اعتقدت أنه تم تصحيحه في البداية). أظن أن NNAPI لا يتم استخدامه. ربما نحتاج إلى عمل شيء مميز مع بناء nnapi_lib؟
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/BUILD

التبعية مدرجة ولكن قد تحتاج إلى بناء لهندسة معمارية معينة؟
ربما شيء ما في. / تكوين
(راجع للشغل لقد قمت بتمكين XLA في ./configure في حال كان ذلك مرتبطًا ولكنه لم يغير السرعة)

تضمين التغريدة
أريد استخدام NNAPI ، لكني لا أعرف كيفية استخدامه.
وفقًا للوثيقة ، فإن Neural Networks API متاح في Android 8.1>
إذا كان 8.1 أو أعلى ، فهل يتم تطبيقه بشكل أساسي؟ أو هل أحتاج إلى عمل NDK إضافي؟ رابط الوثيقة
أتمنى لك يومًا سعيدًا XD

andrewharp ، حاولت تمكين NNAPI لـ tflite_demo وتشغيل ملف apk ، لكنني وجدت تعطل apk
عند استدعاء AddOpsAndParams ، لا يتم دعم العملية tflite :: BuiltinOperator_SQUEEZE و
يتم تعيين nn_op_type على -1 ، مما يؤدي إلى استدعاء FATAL والخروج (-1). أعتقد أن هذا هو
السبب الجذري. هل تسمح من فضلك بإخبار ما إذا كان سيتم دعمه في الإصدار المستقبلي؟ هل هناك طريقة أخرى للعمل
حول لاختبار مسار NNAPI؟ شكرا.

تضمين التغريدة
bazel run -c opt tensorflow / python / tools / optimize_for_inference - \
- الإدخال = $ DETECT_PB - الإخراج = $ STRIPPED_PB --frozen_graph = صحيح \
--input_names = المعالج الأولي / الفرعي --output_names = concat ، concat_1 \
--alsologtostderr

لماذا لا يتم إدخال input_names image_tensor؟
حاولت بهذه الطريقة وواجهت خطأ.

تضمين التغريدة
يجب عليك استخدام Grid_inference_graph_stripped.pb بدلاً من المجمد_inference_graph.pb.
جرب "bazel-bin / tensorflow / tools / graph_transforms / Summarize_graph --in_graph = Frozen_inference_graph_stripped.pb"
ويمكنك أن ترى الناتج التالي:
تم العثور على مدخلات محتملة واحدة: (الاسم = المعالج الأولي / الفرعي ، النوع = تعويم (1) ، الشكل = لا شيء)
لم يتم رصد متغيرات.
تم العثور على ناتجين محتملين: (الاسم = concat ، المرجع = ConcatV2) (الاسم = concat_1 ، المرجع = ConcatV2)

اسم الإدخال هو المعالج المسبق / اسم الخرج الفرعي concat.

تضمين التغريدة
يتضمن أحدث كود tensorflow lite واجهة جافا لتمكين NNAPI.

فئة المترجم لديه وظيفة تسمى: setUseNNAPI (صواب) ؛
يمكنك استدعاء هذه الواجهة مباشرة.

MustafaHosny اللهم امين
لقد حاولت بالفعل استدعاء setUserNNAPI (صواب) ، لكن لم يكن هناك أي تأثير.
كان تقريبًا استنتاج مشابه لا يستخدم NNAPI.
مواصفات أندرويد: إصدار 8.1.

nanamare ، هل لديك ssd-mobilenet قيد التشغيل؟ لمثل هذه الشبكة ، هناك عملية SQUEEZE لا يدعمها android NNAPI. سألت السؤال أعلاه. بالنسبة لـ Mobilenet-v1 ، لا بأس بذلك.

<strong i="5">@andrewharp</strong>  Hi, andrewharp. i just followed your quick steps for converting an SSD MobileNet model to tflite format, and then i tried to  build the demo to use it. But something accurred in apk.
for the tflite from mobilenet_ssd_tflite_v1.zip, everything is ok! i can use mobile to detecter things.
And then i tried to use pet data to fine tune the model from the checkpoint in mobilenet_ssd_tflite_v1.zip. this process is also ok. i check the generated frozen_inference_graph.pb with the object_detection_tutorial.ipynb(https://github.com/tensorflow/models/blob/master/research/object_detection/object_detection_tutorial.ipynb). the result shown this pb can used to object detection. And then i followed the script to convert frozen pb to tflite. Then build demo with tflite, unfortunately something wrong ocurred. Then log is written below. 
It seems the Shape of output target [1, 1917, 4] does not match with the shape of the Tensor [1, 1917, 1, 4]. Because i am new to use object detection api, i donot know how to deal with the problem. 
Hope you can point out some solutions, Thx!

سجل الهاتف المحمول هنا:
04-04 19: 46: 36.099 28864-28882 / org.tensorflow.lite.demo E / Android وقت التشغيل: استثناء فادح: عملية الاستدلال: org.tensorflow.lite.demo ، PID: 28864 java.lang.IllegalArgumentException: شكل هدف الإخراج [1 ، 1917 ، 4] لا يتطابق مع شكل موتر [1 ، 1917 ، 1 ، 4]. في org.tensorflow.lite.Tensor.copyTo (Tensor.java:44) في org.tensorflow.lite.Interpreter.runForMultipleInputsOutputs (Interpreter.java:139) في org.tensorflow.demo.TFLiteObjectDetectionAPIModelage.recognizeObjectDetectionAPIModelage.recognize ) في org.tensorflow.demo.DetectorActivity $ 3.run (DetectorActivity.java:248) على android.os.Handler.handleCallback (Handler.java:761) على android.os.Handler.dispatchMessage (Handler.java:98) في android.os.Looper.loop (Looper.java:156) في android.os.HandlerThread.run (HandlerThread.java:61)

مدهش! محاولة الحصول على هذا العمل على iOS. كيف يمكنني تحليل إخراج Tensor؟

interpreter->Invoke();
float* output = interpreter->typed_output_tensor<float>(0);

واجهة DetectorActivity عالقة في مشروعي ، هل أنت موجود ، كيف يمكنني حلها؟

@ zhangbo0325 شكرا على التفاصيل. نظرًا لأن الضغط لا يدعمه NNAPI ، فهل هذا يعني أن NNAPI لم يتم استخدامه على الإطلاق وسيظل الاستدلال بطيئًا كما هو؟ كما ذكرت في التعليق السابق ، أحصل على أداء ضعيف حقًا على Pixel XL. أتوقع أوقات استدلال في مكان ما حوالي 80-120 مللي ثانية. شكرا!

mpeniak ، سألت نفس السؤال على andrewharp. لقد قمت للتو بتشغيل ssd-mobilenet بمساعدة تنفيذ وحدة المعالجة المركزية tensorflow-lite وحصلت أيضًا على الأداء الضعيف.

أظهر حديث TensorFlow Lite في Dev Summit 2018 أداء 3x على MobileNet:
https://youtu.be/FAMfy7izB6A؟t=530

ربما هذا ليس لـ SSD رغم ذلك؟
ربما يتطلب الوزن الكمي أولا؟

لقد جربت Mobilnet وهو أسرع بكثير ، ولكن هذا لا ينطبق على mobilnet-ssd على الرغم من ...

حزين باندا ☹️🐼
andrewharp هل لديك أي فكرة عن موعد توفر تطبيق SSD عالي الأداء؟ هل هي مسألة كمية الوزن؟

حصلت أيضًا على أداء ضعيف لـ ssd-mobilenet على TensorFlowLite :(
لكن لدي سؤال آخر. لماذا تتجاوز نتيجة النتيجة 1؟ أليس هذا هو الاحتمال؟

@ a1103304122 كما فهمت ، النتيجة هي إخراج العقدة "concat" ، قبل softmax ، لذلك ، ليس الاحتمال.

أثناء تحويل TOCO ، يتم استخدام عقدة إدخال مختلفة (معالج مسبق / فرعي) ، بالإضافة إلى عقد إخراج مختلفة (concat ، concat_1). يؤدي هذا إلى تخطي بعض الأجزاء التي تمثل مشكلة بالنسبة إلى tflite ، حتى تتم إعادة هيكلة الرسم البياني أو وصول TF Lite إلى تكافؤ TF.

هل لدى أي شخص فكرة عن سبب كون TFlite أبطأ من TFmobile في هذا النموذج؟

andrewharp هل من الممكن التعليق على أداء TF Lite SSD؟ أيضا هل التكميم ممكن / قادم؟ أعلم أنكم تعملون بجد لتحقيق كل هذا ولكن سيكون من الجيد معرفة ما إذا كان هذا مجرد عثرة قصيرة المدى أو أن هناك حلًا يمكننا تطبيقه. 😄

andrewharp شكرا على النشر الرائع الخاص بك. ومع ذلك ، لدي سؤال واحد عن خطواتك.

قم بإزالة العقد المسببة للمشاكل قبل السماح لـ TOCO بمشاهدة الرسم البياني

bazel run -c opt tensorflow / python / tools / optimize_for_inference - \
- الإدخال = $ DETECT_PB - الإخراج = $ STRIPPED_PB --frozen_graph = صحيح \
--input_names = المعالج الأولي / الفرعي --output_names = concat ، concat_1 \
--alsologtostderr

إذا لم أسيء الفهم ، فأنت هنا تريد إنتاج STRIPPED_PB ، أليس كذلك؟ إذا كان الأمر كذلك ، في الوقت الحالي ، يجب أن يكون إدخال ملف الإدخال الخاص بنا هو image_tensor. لذلك ، أنا لا أفهم لماذا نستخدم المعالج الأولي / الفرعي. هل يمكنك شرح المزيد من التفاصيل؟

ثانيًا ، نستخدم هنا optimize_for_inference ، هل يمكننا استخدام أداة transform_graph؟ لأن وثائق tensorflow الجديدة توصي بـ convert_graph بدلاً من optimize_for_inference.

mpeniak كيف تفعل ذلك؟ يرجى ذكر بعض التفاصيل.

org.tensorflow.lite.demo E / Android وقت التشغيل: استثناء فادح: عملية الاستدلال: org.tensorflow.lite.demo ، PID: 28864 java.lang.IllegalArgumentException: شكل هدف الإخراج [1 ، 1917 ، 4] لا يتطابق مع شكل Tensor [1 ، 1917 ، 1 ، 4].

Haijunlv هل حللت المشكلة؟ هل يمكنك مشاركة الحل؟

عند استيراد الإصدار التجريبي الجديد من Android TF Lite ، أحصل على Error:Plugin with id 'com.android.application' not found. على OS X.

نفس مشكلة @ csmith105 ! تمكنت من إنشاء العرض التوضيحي وتثبيته باستخدام bazel ولكن لا يمكنني تجميع المشروع أو تشغيله على Android Studio ... أي حل لهذه المشكلة؟

@ Eddy-zheng إذا رأيت العقدة "concat" في الرسم البياني المجمد ، فستجد أن عملية الضغط قد تم إخراجها بعد عملية concat. أعتقد أن هذا هو سبب عدم توافق الشكل. لم أختبر سرعة عملية الضغط. لكن أعتقد أن هناك طريقتان لحل المشكلة.

  1. تغيير ترتيب الضغط وسلسلة المرجع. في ssd_meta_arch.py ​​، غيّر قليلاً "box_encodings = tf.squeeze (tf.concat (prediction_dict ['box_encodings'] ، المحور = 1) ، المحور = 2)"
  2. اقتل الشكل 1 مباشرة على المحور 2. في box_predictor.py ، غيّر قليلاً "box_encodings = tf.reshape (
    box_encodings، tf.stack ([Combined_feature_map_shape [0]،
    مجتمعة_feature_map_shape [1] *
    مجتمعة_feature_map_shape [2] *
    عدد_التنبؤات_ لكل موقع ،
    1 ، self._box_code_size])) "

في الواقع أنا لا أفهم سبب إعادة تشكيل موتر مع شكل إضافي "1". قد تكون زائدة عن الحاجة
مرجع سابق
لقد جربت الطريقة الأولى والنجاح في تشغيل النموذج في الهاتف المحمول. لكنها ما زالت بطيئة بعض الشيء. لاحقًا سأحاول الطريقة الثانية لمعرفة ما إذا كان بإمكانها الحصول على سرعة أفضل

Haijunlv ما مدى جودة عمليات الكشف؟ يزيل النموذج البسيط من العرض التوضيحي الخاص بـandrewharp ببساطة جميع عقد العمليات التمهيدية والعملية اللاحقة (الآلاف منها) من الرسم البياني واستبدالها بعدة أسطر من التعليمات البرمجية. لست متأكدا كيف ستعمل ..

أعتقد أن هناك حلًا لمشكلة android studio و gradle. (من فضلك صححني إذا كنت مخطئا أو إذا كان هناك حل أفضل):

  • إنها ليست الطريقة الأفضل ولكن هناك مكون إضافي من Bazel يمكننا تثبيته داخل Android Studio "لاستبدال" Gradle ويمكننا بناء مشروعنا وتشغيله باستخدام Bazel من خلال AS.

  • قرأت عدة مقالات عن Bazel ووجدت هذا السؤال في Quora .. ووفقًا للإجابة ، سيستمر Tensorflow في استخدام Bazel لأنه يستغل إطار العمل بشكل أفضل ويعطي نتائج أفضل .. لذلك أعتقد كمطورين في هذه الحالة بالذات يجب علينا التكيف إليه وترك Gradle خلفه حتى يدعمه Tensorflow تمامًا.

تضمين التغريدة
هل تمكنت من الوصول إلى نواتج متعددة في TensorFlow Lite C ++؟

interpreter->Invoke();
???? output = interpreter->typed_output_tensor<?????>(0);

أنا أتقدم ، لكن ما زلت لا أعرف كيفية الحصول على النواتج في C ++. هل هناك أي توثيق حول هذا؟ هذا ما لدي في الوقت الحالي. كيف يمكنني الوصول إلى مجموعة البيانات للحصول على النتائج؟

(fill inputs)
.......
intepreter->Invoke();
const std::vector<int>& results = interpreter->outputs();
TfLiteTensor* outputLocations = interpreter->tensor(results[0]);
TfLiteTensor* outputClasses   = interpreter->tensor(results[1]);
float *data = tflite::GetTensorData<float>(outputClasses);
for(int i=0;i<NUM_RESULTS;i++)
{
   for(int j=1;j<NUM_CLASSES;j++)
   {
      float score = expit(data[i*NUM_CLASSES+j]); // ¿?
    }
}

JaviBonilla فعلت شيئًا مشابهًا ووجدت أنه لا يعمل. باستخدام القطع من تطبيق android التجريبي ، فإنه يخرج الكثير من الضوضاء. إذا كنت تستخدم tensorboard لقراءة الرسم البياني ، فستجد أن النموذج البسيط يقطع آلاف العقد اللاحقة للعملية. لا أعتقد أن الطريقة الحالية ستنجح. آمل أن تدعم Tensorflow lite عقد ما بعد العملية هذه في المستقبل ، بدلاً من مطالبة الأشخاص بالقيام بهذه الاختراقات التي لا تعمل ..

شكرا YijinLiu. لقد رأيت المستودع الخاص بك tf-cpu ، وسألقي نظرة على الكود الخاص بك للتحقق من صحة تطبيقي ، ورؤية النتائج حتى لو لم تكن جيدة.

JaviBonilla من فضلك أخبرنا عندما اكتشفت كيفية تشغيل C ++! 🙌

مرحبًا davidfant ،

لا يزال يتعين علي اختباره ، لكن YijinLiu اكتشفها بالفعل !.

ألق نظرة على مستودعه (https://github.com/YijinLiu/tf-cpu). على وجه الخصوص ، يمكنك العثور على كيفية الحصول على المخرجات في ملف tf-cpu/benchmark/obj_detect_lite.cc ، وظيفة AnnotateMat() ، والتي يتم تنفيذها بعد Interpreter->Invoke() .

JaviBonilla لم أنتهي من obj_detect_lite.cc ، على وجه الخصوص ، لاستخدام الأعداد السابقة لفك تشفير مربعات الكشف.
ما وجدته هو أن النتائج غير منطقية في جميع السيناريوهات. في بعض الحالات ، تولد ضوضاء كثيرة. في حالات أخرى ، قد تفقد بعض الاكتشافات الجيدة. نظرت إلى تلك العقد لتحويل هذه الدرجات المتوسطة إلى درجات الاحتمال النهائي. هناك آلاف العقد ...

@ YijinLiu شكرا لتوضيح هذا. بعد ذلك ، أعتقد أنه من الأفضل الانتظار حتى يتم تضمين المزيد من التحسينات في TensorFlow Lite لاكتشاف الكائنات. على أي حال ، سأحاول فك رموز مربعات الكشف في C ++ إذا كان لدي الوقت.

مرحبًا andrewharp ،

شكرًا لجهودك في إنشاء مشروع android التجريبي الجديد ، ولكن هل يمكنك من فضلك كتابة readme.md أو بعض مستندات الوصف في tensorflow / Contrib / lite / أمثلة / android حتى نتمكن جميعًا من فهم العملية بسهولة لجعل Tensorflow lite؟ شكرا ~!

مرحبًا ، لقد قمت بتشغيل العرض التوضيحي ssd_mobilenet_v1_coco_2017_11_17 بنجاح ، ثم حصلت على نموذج دقيق. عندما قمت بتشغيل عملية andrehentz عليه ، حدثت مشكلة:
bazel run tensorflow/contrib/lite/toco:toco -- --input_file=$STRIPPED_PB --output_file=$DETECT_FB --input_format=TENSORFLOW_GRAPHDEF --output_format=TFLITE --input_shapes=1,300,300,3 --input_arrays=Preprocessor/sub --output_arrays=concat,concat_1 --inference_type=FLOAT --logtostderr

قبل إزالة العمليات غير المستخدمة: 586 عاملًا ، 871 صفيفًا (0 محددًا)
2018-06-12 15: 29: 54.273221: I Tensorflow / Contrib / lite / toco / graph_transformations / graph_transformations.cc: 39] قبل تحويلات الرسم البياني العامة: 586 عاملًا ، 871 صفيفًا (0 محددًا)
2018-06-12 15: 29: 54.300213: I Tensorflow / Contrib / lite / toco / graph_transformations / graph_transformations.cc: 39] بعد اجتياز تحويلات الرسم البياني العامة بنسبة 1: 409 عاملًا ، 688 صفيفًا (0 محددًا)
2018-06-12 15: 29: 54.309735: I Tensorflow / Contrib / lite / toco / graph_transformations / graph_transformations.cc: 39] قبل تحويلات الرسم البياني لإزالة الترسبات: 409 عاملًا ، 688 صفيفًا (0 محددًا)
2018-06-12 15: 29: 54.317395: I tensorflow / Contrib / lite / toco / Specialty_transient_arrays.cc: 329] إجمالي الحجم المخصص للمصفوفة العابرة: 2880256 بايت ، القيمة النظرية المثلى: 2880128 بايت.
2018-06-12 15: 29: 54.319173: F tensorflow / Contrib / lite / toco / tflite / export.cc: 330] بعض المشغلين في النموذج غير مدعومين بواسطة TensorFlow Lite القياسي. إذا كان لديك تنفيذ مخصص لهم ، فيمكنك تعطيل هذا الخطأ باستخدام --allow_custom_ops ، أو عن طريق تعيين allow_custom_ops = True عند استدعاء tf.contrib.lite.toco_convert (). فيما يلي قائمة بالعوامل التي ستحتاج إلى تطبيقات مخصصة لها: RSQRT و SquaredDifference و Stack و TensorFlowShape.

هذا هو نموذجي https://drive.google.com/open؟id=1IxRSU4VSmVmhUtUpSQew_5anEfxTg3Ca

هل يستطيع أي أحد مساعدتي؟
تضمين التغريدة

JaviBonilla و YijinLiu لدي تطبيق Python الذي اختبرته باستخدام طرازي SSD MobileNet V {1،2} و SSDLIte MobileNet V2 من Google. انظر الوثائق البسيطة هنا .

freedomtan ما هو إصدار tf الذي تستخدمه؟ تف 1.8؟

hengshanji الرئيسي الفرع بعد ربط مترجم بيثون tflite (29c129c6). لا أعتقد أن 1.8 لديه الارتباط.

freedomtan tf1.8 لديه مترجم Python ملزم ، لكني أواجه مثل هذا النوع من المشاكل "خطأ nnapi: غير قادر على فتح مكتبة libneuralnetworks.so". من أين يمكن الحصول على هذا. إذن أو كيفية إنشاء ذلك؟ شكرا.

تجاهله :) إنه لنظام Android NNAPI.

freedomtan هل اختبرت المثال على الجهاز أم على الكمبيوتر؟ عندما أقوم باختباره على جهاز الكمبيوتر ، استخدم android-28 / x86 libneuralnetworks.so ، فإنه يظهر الخطأ "إحباط منذ فشل tflite إرجاع".

كما قلت ، يرجى تجاهل مشكلة NNAPI. ليس من المتوقع أن يكون لديك عمل libneuralnetwork.so . لقد اختبرت نصوصي على كل من x86 قيد التشغيل Ubuntu ولوحة ARMv8 التي تعمل بنظام Debian.

freedomtan ، شكرًا لمشاركة الكود والتوثيق.

بناءً على المستودع (https://github.com/YijinLiu/tf-cpu). لقد قمت بتحديث tf-cpu / benchmark / obj_detect_lite.cc للحصول على النواتج. في دالة AnnotateMat () أضف التعليمات البرمجية decodeCenterSizeBoxes لمعالجة output_locations ، ثم قم بتنفيذ nms لهذه النتائج.
في الوقت نفسه ، باستخدام https://github.com/tensorflow/tensorflow/issues/14688 لإنشاء libtensorflow-lite.a ، يمكن تشغيله على كل من نظام التشغيل Ubuntu x86 وجهاز android مع نموذج tflite في ssdlite_mobilenet_v2_coco_2018_05_09. tar.gz.
شكرا لكم جميعا.

WeiboXu هل يمكنك مشاركة الكود والنموذج هنا؟

هذا هو الكود المحدث لـ obj_detect_lite.cc
obj_detect_lite.cc.zip

النموذج هو http://download.tensorflow.org/models/object_detection/ssdlite_mobilenet_v2_coco_2018_05_09.tar.gz

freedomtan في كود تنفيذ Python الخاص بك ، يوجد ملف واحد "/tmp/box_priors.txt" ، هل تعرف كيفية إنشاء هذا الملف؟ أو كيف تم حساب البيانات الموجودة في هذا الملف؟ لا توجد مشكلة في عمل استدلال للصورة بحجم 300X300 ، ولكن دقة الاستدلال ستنخفض عند الاستدلال على الصورة بحجم 224X224

freedomtan ، andrewharp ، لا يمكن للنموذج السابق باتباع هذه التعليمات أن يعمل في أحدث إصدار من TFLite ، سواء كان محددًا كميًا أو عائمًا ، لأن نموذج tflite في أحدث عرض TFLite يتطلب 4 مخرجات ، ولكن النموذج السابق يحتوي فقط على ناتجين ( concat1).

ارجو المساعدة شكرا!

يتم تحديث هذه التعليمات في الوقت الحالي. سيوفر رابطًا للتعليمات المحدثة في الأسبوع المقبل.

frontword ماذا يوجد في /tmp/box_priors.txt مربعات لمعالجة ما بعد. إذا كنت تستخدم الإصدار الأحدث المذكور بواسطة WenguoLi ، فأنت لست بحاجة إليه. ومع ذلك ، بقدر ما أستطيع أن أقول ، يتم تنفيذ عمليات ما بعد المعالجة هذه على أنها عمليات مخصصة لـ TF Lite. بمعنى أنه لا يمكنك تسريعها باستخدام مسرعات NNAPI دون بذل مزيد من الجهود.

بالنسبة لمشاكل حجم الصورة ، نعم ، أعتقد أن تغذية 224 × 224 صورة إلى SSD300 (تم تدريب النماذج التي أصدرتها Google باستخدام صور 300 × 300) والحصول على دقة أسوأ ليس أمرًا غير متوقع.

WenguoLi يبدو لي أن النموذج المحدث الذي ذكرته سهل التعامل معه. انظر بلدي التحديث scirpt . تم إنشاء الشكل التالي بواسطة

python  tensorflow/contrib/lite/examples/python/object_detection.py --image /tmp/image2.jpg  --show_image True

image

لإصلاح درجة نتيجة الاستنتاج التي تتجاوز 1 ، من الممكن استخدام طريقة Java TrackedObject.getCurrentCorrelation () لأن ذلك يبدو دائمًا أنه يُرجع شيئًا أقل من 1 (لست متأكدًا مما إذا كان صحيحًا أم لا). يستخدم مثال TFLite Android Recognition.getConfidence () والذي يبدو دائمًا أنه يعرض شيئًا أكبر من 1

mpeniak قمت بتشغيل نموذج ssd mobilenet tflite على Movidius. أنا أيضا أخطط للقيام بشيء مماثل. هل يمكنك أن ترشدك قليلاً حول كيفية قيامك بذلك؟

achowdhery مرحبًا ، لقد رأيت بعض التحديثات لتعليمات البناء لأحدث عرض توضيحي لنظام android هنا (https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/lite/examples/android/app) ، لكنه لم يشر إلى كيفية تحويل نموذج pb المجمد إلى نموذج tflite (الاكتشاف الكمي الذي تم استخدامه في العرض التوضيحي الأخير). أي تعليمات أخرى حول تدفق تحويل النموذج الكمي؟ أيضًا ، أعتقد أنه يجب علينا أولاً إجراء تدريب كمي باستخدام عمليات تكميم وهمية كما هو موضح هنا (https://www.tensorflow.org/performance/quantization) ثم إجراء تحويل النموذج ، أليس كذلك؟ أيضًا ، هل من الممكن تمكين NNAPI في أحدث عرض android؟ حاولت استخدام tfLite.setUseNNAPI (صحيح) في TFLiteObjectDetectionAPIModel.java لكنه تعطل على جهاز Pixel 2 الذي يعمل بنظام Android 8.1 (يمكن أن يعمل بشكل جيد بدون NNAPI). أي اقتراحات؟ شكرا!

tenoyart الإجابة المختصرة عن السؤال "هل من الممكن تمكين NNAPI في أحدث إصدار تجريبي من android؟" يجب أن يكون لا. الإجابة ليست قصيرة جدًا هي أنه من الممكن نوعًا ما إذا قمت بتعديل مترجم TF Lite ، فقم بشيء مثل تقسيم النموذج أو إضافة عمليات مخصصة مقابلة إلى NNAPI.

achowdhery رأيت مقالًا في مدونة TensorFlow بواسطتك. هل هذه التعليمات التي ذكرتها أم أكثر قادمة؟

نعم. هذه هي التعليمات الخاصة بالتدريب وتقديم نموذج اكتشاف الكائن على Android.

freedomtan شكرا لتقاسم السيناريو.
في أحدث نص لديك مع المعالجة اللاحقة ، ما ملف النموذج الذي تستخدمه؟
هل حددت حجة optimize_for_inference.py like
--input_names = "المعالج / الفرعي"
--output_names = "مربعات الكشف ، درجات_الكشف ، عدد_الكشفات ، فئات_الكشف"

هل ترى أي اختلاف مع / بدون المعالجة اللاحقة؟

شكرا!

هل هناك أي طريقة لتحويل نماذج SqueezeNet ذات 4 مخرجات إلى tflite؟

chanchanzhang يرجى اتباع التعليمات الجديدة في نهاية البرنامج التعليمي في https://medium.com/tensorflow/training-and-serving-a-realtime-mobile-object-detector-in-30-minutes-with-cloud-tpus -b78971cf1193
لاحظ أن هذا يستخدم سير عمل مختلفًا عن استخدام optimize_for_inference.py

ashwaniag إذا كنت ترغب في استبدال Mobilenet بمصنف SqueezeNet مع الاحتفاظ بـ SSD بعد ذلك للكشف ، فهذا جيد لسير العمل الحالي.

achowdhery من الرائع رؤية نموذج TF Lite على ssd mobilenet v1. هل يدعم TF Lite دعمًا كاملاً لـ ssdlite mobileenet v2؟

tenoyart نعم. سيعمل أي محرك أقراص SSD من Mobilenet عبر هذا الخط. لم نصدر ملفات tflite المقابلة في المصدر المفتوح. إذا واجهت مشاكل ، يرجى تسجيل خطأ.

chanchanzhang كما قال achowdhery ، يرجى استخدام object_detection/export_tflite_ssd_graph.py بدلاً من optimized_for_inference.py . وملف نموذج tflite الذي استخدمته هو من الملف الذي استخدمه مثال Android. يمكنك الحصول عليها هنا .

achowdhery أعتقد أنه لا توجد عقد وموترات FakeQuant في نقاط التفتيش الخاصة بـ ssd_mobilenet_v1_quantized_coco و ssd_mobilenet_v1_0.75_depth_quantized_coco . هل يمكنك التحقق منها؟

freedomtan أرى العقد weight_quant و act_quant في الرسم البياني المُصدَّر بعد استخدام object_detection / export_tflite_ssd_graph.py.
يرجى إعطاء لقطة شاشة أو إرشادات دقيقة حول كيفية التحقق من عدم احتوائه على عقد مزيفة.
أنا قادر أيضًا على تحويل نقاط التفتيش بنجاح

achowdhery شكرا للتحقق. عندما قمت بتشغيل export_tflite_ssd_graph.py على هذين الاثنين ، لم أتمكن من الحصول على نماذج tflite ، لذلك فتشت نقاط التفتيش. ما فعلته هو شيء من هذا القبيل

curl http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_quantized_300x300_coco14_sync_2018_07_03.tar.gz | tar xzvf -
cd ssd_mobilenet_v1_quantized_300x300_coco14_sync_2018_07_03
strings model.ckpt.index  |grep quant

لا شيء يظهر.

andrewharp شكرًا جزيلاً لك على فئة الاستدلال القاطع TFLiteObjectDetectionAPIModel.java ، لقد جربتها مع ssd mobilenet v1 tflite mobilenet_ssd_tflite_v1.zip ولكن عند بدء تشغيل التطبيق يبدو أن هناك مشكلة في وظيفة التعرف على الصورة (الصورة النقطية النهائية للصور النقطية) عندما أتصل tfLite.runForMultipleInputsOutputs (inputArray ، outputMap) ؛ يرمي هذا الاستثناء

07-18 10:37:02.416 19957-19996/com.app.cerist.realtimeobjectdetectionapi E/AndroidRuntime: FATAL EXCEPTION: Camera
    Process: com.app.cerist.realtimeobjectdetectionapi, PID: 19957
    java.lang.IllegalArgumentException: Output error: Outputs do not match with model outputs.
        at org.tensorflow.lite.Interpreter.runForMultipleInputsOutputs(Interpreter.java:170)
        at com.app.cerist.realtimeobjectdetectionapi.ImageClassifierTFLiteAPI.recognizeImage(ImageClassifierTFLiteAPI.java:207)
        at com.app.cerist.realtimeobjectdetectionapi.MainActivity.classifyFrame(MainActivity.java:421)
        at com.app.cerist.realtimeobjectdetectionapi.MainActivity.access$1000(MainActivity.java:48)
        at com.app.cerist.realtimeobjectdetectionapi.MainActivity$4.run(MainActivity.java:455)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:159)
        at android.os.HandlerThread.run(HandlerThread.java:61)
07-18 10:37:02.436 19957-19996/com.app.cerist.realtimeobjectdetectionapi V/Process: killProcess [19957] Callers=com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException:99 java.lang.ThreadGroup.uncaughtException:693 java.lang.ThreadGroup.uncaughtException:690 <bottom of call stack> 
07-18 10:37:02.436 19957-19996/com.app.cerist.realtimeobjectdetectionapi I/Process: Sending signal. PID: 19957 SIG: 9

قال الخطأ أن طول مصفوفة المخرجات أكبر من طول مصفوفة المدخلات
هذا هو الشرط في Interpreter.java

public void runForMultipleInputsOutputs(Object[] inputs, <strong i="7">@NonNull</strong> Map<Integer, Object> outputs) {
        if (this.wrapper == null) {
            throw new IllegalStateException("Internal error: The Interpreter has already been closed.");
        } else {
            Tensor[] tensors = this.wrapper.run(inputs);
            if (outputs != null && tensors != null && outputs.size() <= tensors.length) {
                int size = tensors.length;
                Iterator var5 = outputs.keySet().iterator();
            }
       }
}

وهذه هي مصفوفات المدخلات والمخرجات الخاصة بي:

d.imgData = ByteBuffer.allocateDirect(1 * d.inputSize * d.inputSize * 3 * numBytesPerChannel);
d.imgData.order(ByteOrder.nativeOrder());
d.intValues = new int[d.inputSize * d.inputSize];
 imgData.rewind();
        for (int i = 0; i < inputSize; ++i) {
            for (int j = 0; j < inputSize; ++j) {
                int pixelValue = intValues[i * inputSize + j];
                if (isModelQuantized) {
                    // Quantized model
                    imgData.put((byte) ((pixelValue >> 16) & 0xFF));
                    imgData.put((byte) ((pixelValue >> 8) & 0xFF));
                    imgData.put((byte) (pixelValue & 0xFF));
                } else { // Float model
                    imgData.putFloat((((pixelValue >> 16) & 0xFF) - IMAGE_MEAN) / IMAGE_STD);
                    imgData.putFloat((((pixelValue >> 8) & 0xFF) - IMAGE_MEAN) / IMAGE_STD);
                    imgData.putFloat(((pixelValue & 0xFF) - IMAGE_MEAN) / IMAGE_STD);

مصفوفة المخرجات:

// Copy the input data into TensorFlow.
        Trace.beginSection("feed");
        outputLocations = new float[1][NUM_DETECTIONS][4];
        outputClasses = new float[1][NUM_DETECTIONS];
        outputScores = new float[1][NUM_DETECTIONS];
        numDetections = new float[1];

        Object[] inputArray = {imgData};
        Map<Integer, Object> outputMap = new HashMap<>();
        outputMap.put(0, outputLocations);
        outputMap.put(1, outputScores);
        outputMap.put(2, numDetections);
        outputMap.put(3, outputClasses);
        Trace.endSection();

والاستدلال:

// Run the inference call.
        Trace.beginSection("run");
        Log.d("TAG_INPUT",""+String.valueOf(inputArray.length));
        Log.d("TAG_OUTPUT",""+String.valueOf(outputMap.size()));

        tfLite.runForMultipleInputsOutputs(inputArray, outputMap);
        Trace.endSection();

لم أفهم معنى هذا الخطأ لأنني فعلت تمامًا نفس فئة TFLiteObjectDetectionAPIModel.java.
شكرا لك على المساعدة

achowdhery مرحبًا ، بعد مدونتك قمت بتحويل النموذج من ssd_mobilenet_v1_coco_2017_11_17. ومع ذلك ، عندما استخدمت mobilenet_ssd.tflite المحولة في tflite_demo.apk ، تلقيت الخطأ التالي:

    java.lang.IllegalArgumentException: Cannot copy between a TensorFlowLite tensor with shape [1, 1917, 4] and a Java object with shape [1, 10, 4].

أي أفكار لماذا حصلت عليه؟ شكرا.

هذا شكل غير متطابق لأن حجم موتر الإخراج المتوقع هو 1،10،4 وليس 1،1917،4. بالنسبة لملف النموذج القديم ، ستحتاج إلى التراجع إلى إصدار التطبيق التجريبي لشهر مايو. وإلا يرجى استخدام أحدث النماذج التي تم إصدارها للتحويل.

achowdhery قمت بتحويل النموذج الخاص بي إلى tflite وعندما أقوم بتشغيله. المترجم-> استدعاء استدعاء () يلقي خطأ في الجزء. أي فكرة عما قد يكون الخطأ؟

ashwaniag قم بتنفيذ النماذج التي تم تنزيلها على https://medium.com/tensorflow/training-and-serving-a-realtime-mobile-object-detector-in-30-minutes-with-cloud-tpus-b78971cf1193
تجميع لك؟
إذا كانت الإجابة بنعم ، فالرجاء تقديم الإرشادات الجديدة التي تستخدمها الآن عندما تحصل على خطأ SEG؟
قد يكون هناك عدم تطابق في نوع الإدخال / الحجم وما إلى ذلك.

achowdhery لقد عملت. كنت أعطي المدخلات الخاطئة. شكرا على اية حال!

تحديث ssd_mobilenet_v1_quantized_coco و ssd_mobilenet_v1_0.75_depth_quantized_coco ، إذا اتبعت البرنامج التعليمي. شكراachowdhery.

كنت أنظر إلى TFLiteObjectDetectionAPIModel.java في مثال التطبيق التجريبي. هل هناك سبب لتخصيص outputLocations و outputClasses و outputScores و numDetections لكل مكالمة recognizeImage هنا ؟ يبدو أنه من المفترض أن يتم تخصيصها مسبقًا.
لقد حاولت تشغيل الكود مع التخصيص المسبق ويبدو أنه يعمل بشكل جيد ، لكنني أردت فقط التأكد من عدم وجود أي شيء تحت الأغطية قد يتسبب في حدوث مشكلات لاحقًا.

ربما يكون التخصيص المسبق أكثر كفاءة. أين تقوم بالتخصيص المسبق بحيث يمكن أن تتوقع مشاكل؟

شكرا على الردachowdhery. سأغادر التخصيص المسبق بالطريقة الثابتة create كما هي. كان شاغلي الوحيد هو أن الكود يبدو أنه تمت كتابته لاستخدام التخصيص المسبق (الأسلوب الثابت يخصص المصفوفات مسبقًا) ، ولكن لسبب ما يتم إعادة تخصيص المصفوفات في كل مكالمة.

مرحبًا achowdhery ، لقد اختبرت الإصدار التجريبي الجديد من تطبيق Android tflite. إنه يعمل بشكل مثالي مع ssd_mobilenet_v1_coco ، ssd_mobilenet_v1_0.75_depth_coco ، ssd_mobilenet_v1_quantized_coco .
لكنني حصلت على هذا الاستثناء لنماذج ssd-mobilenet الأخرى:

07-25 07:41:25.292 31515-31532/org.tensorflow.lite.demo E/AndroidRuntime: FATAL EXCEPTION: inference
    Process: org.tensorflow.lite.demo, PID: 31515
    java.lang.ArrayIndexOutOfBoundsException: length=160; index=-2147483648
        at java.util.Vector.elementData(Vector.java:734)
        at java.util.Vector.get(Vector.java:750)
        at org.tensorflow.demo.TFLiteObjectDetectionAPIModel.recognizeImage(TFLiteObjectDetectionAPIModel.java:218)
        at org.tensorflow.demo.DetectorActivity$3.run(DetectorActivity.java:249)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.os.HandlerThread.run(HandlerThread.java:65)

أنتج نموذج tflite فهرس فئة خاطئ. الاستثناء يجعل التطبيق يتعطل بعد اكتشافه جيدًا لبضع ثوان.
ينتج ssd_mobilenet_v1_ppn_coco مربع إحاطة فوضوي خاطئ ، تسمية أيضًا.

PPN هو نموذج عائم: هل تقوم بتحويل نموذج TFLITE باستخدام أوامر التحويل العائمة.
https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/running_on_mobile_tensorflowlite.md
ثم تحتاج أيضًا إلى تغيير ما يلي في DetectorActivity.java:
منطقي نهائي ثابت خاص TF_OD_API_IS_QUANTIZED = صحيح ؛

كنت أعرف أن التكوين. في الواقع عندما يكون هذا التكوين خاطئًا ، لا يمكن تشغيل التطبيق على الإطلاق.
هل يمكنك رؤية ArrayIndexOutOfBoundsException؟ لقد جربت أيضًا عامل ميناء البرنامج التعليمي الخاص بك ، لكنه نفس الشيء.

تمام. يرجى تقديم مشكلة جديدة في GitHub مع تعليمات إعادة الشراء الدقيقة. نموذج PPN هو طلب ميزة جديدة لتطبيق جافا - سنرد عندما يمكننا تحديده حسب الأولوية

شكرا. يحدث ArrayIndexOutOfBoundsException أيضًا مع ssd_mobilenet_v1_0.75_depth_quantized_coco، ssdlite_mobilenet_v2_coco. يتمثل الاختلاف عن PPN في تقديم نتائج صحيحة قبل تعطل التطبيق بسبب هذا الاستثناء.

achowdhery هل هناك أي طريقة لتدريب نموذج كمي مع 4 مخرجات لـ tflite باستخدام legacy / train.py لأن model_main.py الجديد به أخطاء؟
https://github.com/tensorflow/models/issues/4798

ashwaniag يمكنك فرق بين الكودتين وإضافة الجزء الذي يضيف التكميم: لاحظ أن وظيفة الرسم البياني هي المكان الذي تتم فيه إضافة عمليات التكميم.

achowdhery : https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/running_on_mobile_tensorflowlite.md
هل هناك مثال أو رمز عينة لكيفية القيام بالأمر نفسه في iOS. حتى الآن كان أقرب شيء وجدته هو https://github.com/YijinLiu/tf-cpu/blob/master/benchmark/obj_detect_lite.cc الذي لا يعمل دائمًا.

لا يعمل التطبيق التجريبي الحالي لنظام iOS مع نموذج ssd و float.

achowdhery قمت بتدريب نموذجي باستخدام tensorflow v1.9. تم التحويل إلى tflite باستخدام الخطوات الواردة في المدونة. أنا لا أحصل على أي كشف. هل لديك أي فكرة عن هذا؟

ashwaniag COCO أم حيوانات أليفة؟ الرجاء فتح خطأ جديد بتعليمات إعادة طرح دقيقة. أكد مستخدمو GitHub الآخرون عمله مع Tensorflow 1.10

achowdhery إنها مجموعة البيانات الخاصة بي. لقد تدربت على هندسة mobileenetv2. عندما أقوم بتشغيل نموذج .pb (نموذج tensorflow) ، أحصل على
غير موجود: نوع Op غير مسجل "NonMaxSuppressionV3" في نظام ثنائي يعمل على VAL5-04. تأكد من تسجيل Op و Kernel في الثنائي الجاري تشغيله في هذه العملية.

هل تعتقد أنه مرتبط؟

ashwaniag يرجى فتح خطأ جديد وتقديم إرشادات دقيقة قابلة لإعادة الإنتاج

ashwaniag تحقق من هاتين المسألتين ، لدي مشكلة مماثلة: # 10254 و # 19854

@ achraf-boussaada شكرا لك! أصلحتها. كانت مشكلة عدم تطابق الإصدار.
achowdhery الآن ، المشكلة هي أن نموذج Tensorflow الكامل يعطيني نتائج رائعة ولكن نموذج tflite يعطي نتائج سيئة للغاية.

ashwaniag يرجى تحديد النتائج السيئة للغاية. هل لديك أشياء صغيرة؟ يُرجى إرفاق نقطة فحص نموذج وتكوين خط الأنابيب وملف تسمية بالإضافة إلى نموذج صورة لمساعدتنا في إعادة إظهار المشكلة. شكرا

oopsodd مرحبًا ، لقد حصلت على فهرس فئة خاطئ أيضًا. اشتكت "java.lang.ArrayIndexOutOfBoundsException: length = 10 ؛ index = -739161663" ، هل يمكنك مساعدتي؟

ملاحظة لقد قمت بإنشاء TensorFlow Lite SSD (اكتشاف الكائن) أمثلة عمل قليلة لنظامي التشغيل iOS و Android ؛ https://github.com/baxterai/tfliteSSDminimalWorkingExample. يعتمد إصدار iOS على obj_detect_lite.cc بواسطة YijinLiu (مع وظيفة nms بواسطة WeiboXu) ، ويعتمد إصدار Android على https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/examples/ الروبوت tflDetect. يزيل كل الحمل مثل الكاميرا الداخلية ، ويعزل الكود الأساسي المطلوب لاكتشاف الكائنات وعرض مربعات الكشف.

baxterai عمل عظيم! شكرًا ، سأختبرها.

شكرا لعملكم الرائع جميعا! لدي سؤال آخر بخصوص عملية المعالجة اللاحقة المضافة مؤخرًا.

ناتج ssd_mobilenet_v1_quantized_coco مسبق الصنع
يقتصر حاليًا على أعلى 10 اكتشافات في الإطار ، على الرغم من التكوينات الافتراضية في النماذج / Research / object_detection / sample / configs / like
ssd_mobilenet_v1_quantized_300x300_coco14_sync.config جميعها تحدد حدًا أعلى لإجمالي الاكتشافات.

post_processing { batch_non_max_suppression { score_threshold: 1e-8 iou_threshold: 0.6 max_detections_per_class: 100 max_total_detections: 100 } score_converter: SIGMOID }

هل يتم حل هذه المشكلة عن طريق إعادة تدريب الشبكة باستخدام تكوين خط الأنابيب هذا أم يتم حل أبعاد
تم إصلاح "TFLite_Detection_PostProcess" على 10 بواسطة تكوينات أخرى؟

@ Georg-W سوف تحتاج إلى تغيير أقصى كشف في export_tflite_ssd_graph.py أيضًا. هناك خيار سطر الأوامر.

achowdhery آه شكرا لك! هذا ما فاتني.

andrewharp شكرًا جزيلاً لك على فئة الاستدلال القاطع TFLiteObjectDetectionAPIModel.java ، لقد جربتها مع ssd mobilenet v1 tflite mobilenet_ssd_tflite_v1.zip ولكن عند بدء تشغيل التطبيق يبدو أن هناك مشكلة في وظيفة التعرف على الصورة (الصورة النقطية النهائية للصور النقطية) عندما أتصل tfLite.runForMultipleInputsOutputs (inputArray ، outputMap) ؛ يرمي هذا الاستثناء

07-18 10:37:02.416 19957-19996/com.app.cerist.realtimeobjectdetectionapi E/AndroidRuntime: FATAL EXCEPTION: Camera
    Process: com.app.cerist.realtimeobjectdetectionapi, PID: 19957
    java.lang.IllegalArgumentException: Output error: Outputs do not match with model outputs.
        at org.tensorflow.lite.Interpreter.runForMultipleInputsOutputs(Interpreter.java:170)
        at com.app.cerist.realtimeobjectdetectionapi.ImageClassifierTFLiteAPI.recognizeImage(ImageClassifierTFLiteAPI.java:207)
        at com.app.cerist.realtimeobjectdetectionapi.MainActivity.classifyFrame(MainActivity.java:421)
        at com.app.cerist.realtimeobjectdetectionapi.MainActivity.access$1000(MainActivity.java:48)
        at com.app.cerist.realtimeobjectdetectionapi.MainActivity$4.run(MainActivity.java:455)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:159)
        at android.os.HandlerThread.run(HandlerThread.java:61)
07-18 10:37:02.436 19957-19996/com.app.cerist.realtimeobjectdetectionapi V/Process: killProcess [19957] Callers=com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException:99 java.lang.ThreadGroup.uncaughtException:693 java.lang.ThreadGroup.uncaughtException:690 <bottom of call stack> 
07-18 10:37:02.436 19957-19996/com.app.cerist.realtimeobjectdetectionapi I/Process: Sending signal. PID: 19957 SIG: 9

قال الخطأ أن طول مصفوفة المخرجات أكبر من طول مصفوفة المدخلات
هذا هو الشرط في Interpreter.java

public void runForMultipleInputsOutputs(Object[] inputs, <strong i="14">@NonNull</strong> Map<Integer, Object> outputs) {
        if (this.wrapper == null) {
            throw new IllegalStateException("Internal error: The Interpreter has already been closed.");
        } else {
            Tensor[] tensors = this.wrapper.run(inputs);
            if (outputs != null && tensors != null && outputs.size() <= tensors.length) {
                int size = tensors.length;
                Iterator var5 = outputs.keySet().iterator();
            }
       }
}

وهذه هي مصفوفات المدخلات والمخرجات الخاصة بي:

d.imgData = ByteBuffer.allocateDirect(1 * d.inputSize * d.inputSize * 3 * numBytesPerChannel);
d.imgData.order(ByteOrder.nativeOrder());
d.intValues = new int[d.inputSize * d.inputSize];

""
imgData.rewind () ،
لـ (int i = 0 ؛ i <inputSize ؛ ++ i) {
لـ (int j = 0 ؛ j <inputSize ؛ ++ j) {
int pixelValue = intValues ​​[i * inputSize + j] ؛
إذا (isModelQuantized) {
// النموذج الكمي
imgData.put ((بايت) ((pixelValue >> 16) & 0xFF)) ؛
imgData.put ((بايت) ((pixelValue >> 8) & 0xFF)) ؛
imgData.put ((بايت) (pixelValue & 0xFF)) ؛
} else {// Float model
imgData.putFloat ((((pixelValue >> 16) & 0xFF) - IMAGE_MEAN) / IMAGE_STD) ؛
imgData.putFloat (((((pixelValue >> 8) & 0xFF) - IMAGE_MEAN) / IMAGE_STD) ؛
imgData.putFloat (((pixelValue & 0xFF) - IMAGE_MEAN) / IMAGE_STD) ؛

The outputs array :

// انسخ بيانات الإدخال إلى TensorFlow.
Trace.beginSection ("تغذية") ؛
outputLocations = عوامة جديدة [1] [NUM_DETECTIONS] [4] ؛
outputClasses = عوامة جديدة [1] [NUM_DETECTIONS] ؛
outputScores = عوامة جديدة [1] [NUM_DETECTIONS] ؛
numDetections = عوامة جديدة [1] ؛

    Object[] inputArray = {imgData};
    Map<Integer, Object> outputMap = new HashMap<>();
    outputMap.put(0, outputLocations);
    outputMap.put(1, outputScores);
    outputMap.put(2, numDetections);
    outputMap.put(3, outputClasses);
    Trace.endSection();
And the Inference :

// قم بتشغيل استدعاء الاستدلال.
Trace.beginSection ("تشغيل") ؛
Log.d ("TAG_INPUT"، "" + String.valueOf (inputArray.length)) ؛
Log.d ("TAG_OUTPUT"، "" + String.valueOf (outputMap.size ())) ؛

    tfLite.runForMultipleInputsOutputs(inputArray, outputMap);
    Trace.endSection();

""
لم أفهم معنى هذا الخطأ لأنني فعلت تمامًا نفس فئة TFLiteObjectDetectionAPIModel.java.
شكرا لك على المساعدة

لدي نفس المشكلة .. حصلت على الحل؟
شكرا..

@ Georg-W سوف تحتاج إلى تغيير أقصى كشف في export_tflite_ssd_graph.py أيضًا. هناك خيار سطر الأوامر.

أهلا

أحاول اكتشاف أكثر من 10 كائنات في الصورة (وهو افتراضي)
استخدم الأوامر التالية:
bazel run -c opt tensorflow / Contrib / lite / toco: toco - --input_file = $ OUTPUT_DIR / tflite_graph.pb --output_file = $ OUTPUT_DIR / mobile_net_500.tflite --input_shapes = 1،300،300،3 --input_arrays = normalized_inor output_arrays = 'TFLite_Detection_PostProcess'، 'TFLite_Detection_Po stProcess: 1 '، 'TFLite_Detection_Po stProcess: 2 '، 'TFLite_Detection_Po stProcess: 3 ' --Inference_type = FLOAT - الحد الأقصى_القطاعات = 500

أنا أيضا تعديل
export_tflite_ssd_graph.py
flags.DEFINE_integer ('max_detections' ، 500 <--- بدلاً من 10 ،
"الحد الأقصى لعدد عمليات الكشف (المربعات) المراد إظهارها.")
flags.DEFINE_integer ('max_classes_per_detection' ، 1 ،
"عدد الفئات المراد عرضها لكل مربع كشف.")

ولكن لا يزال يتم إعطاء 10 عناصر كناتج في android [1،10،4].

اي فكرة؟

سأكون مهتمًا أيضًا بحل مشكلة KaviSanth .

يجب أن يعمل حل Stevelb هذا. قد ترغب في تصور الرسم البياني المجمد للتأكد من ضبط max_detections بشكل صحيح.

achowdhery شكرا لك على ردك. حاولت تنفيذ الأوامر التي كتبها andrewharp لكنني تلقيت الخطأ التالي. في الواقع ، توكو غير موجود في هذا المكان. أنا أستخدم الإصدار الرئيسي والإصدار r1.95 من مستودع جيثب.

تشغيل bazel tensorflow / Contrib / lite / toco: toco - --input_file = $ STRIPPED_PB --output_file = $ DETECT_FB --input_format = TENSORFLOW_GRAPHDEF --output_format = TFLITE --input_shapes - 1،300،300،3 --input_arrays = -output_arrays = concat، concat_1 --inference_type = FLOAT --logtostderr
INFO: معرف الاستدعاء: 0e58a5ef-9fee-4619-b760-aeb1c83c9661
خطأ: تخطي "tensorflow / Contrib / lite / toco: toco ": لا توجد مثل هذه الحزمة "tensorflow / Contrib / lite / toco": ملف BUILD غير موجود في مسار الحزمة
تحذير: فشل تحليل النمط المستهدف.
خطأ: لم يتم العثور على مثل هذه الحزمة "tensorflow / Contrib / lite / toco": لم يتم العثور على ملف BUILD في مسار الحزمة
INFO: الوقت المنقضي: 0.179 ثانية
INFO: 0 عمليات.
فشل: لم يكتمل البناء بنجاح (تم تحميل 0 حزم)
فشل: لم يكتمل البناء بنجاح (تم تحميل 0 حزم)
يجب علي تعديل أنني أقوم بتنفيذ هذه الأوامر من مجلد tensorflow المحلي الذي تم سحبه من git.

يمكنني العثور على toco تحت tensorflow / lite / toco وأنا فقط أقوم باختبار ما إذا كان يعمل.
حسنًا ، يبدو أنه يعمل باستخدام رمز toco هذا وبصرف النظر عن ذلك ، يجب عليك تغيير مسار $ DETECT_FB إلى $ PWD / ssd_mobilenet.tflite نظرًا لأن بعض ملفات python موجودة فقط في مجلد Contrib / lite.

يظهر خطأ وقت تشغيل عند إضافة ملف .tflite في DetectorActivity من https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android (https://github.com/tensorflow/tensorflow/blob /master/tensorflow/examples/android/src/org/tensorflow/demo/DetectorActivity.java) مع السطر

private static final String TF_OD_API_MODEL_FILE =
            "file:///android_asset/ssd_mobilenet_v1.tflite";

E / AndroidRuntime: استثناء قاتل: رئيسي
العملية: myProcess ، PID: 32611
java.lang.RuntimeException: فشل العثور على عقدة الإدخال "image_tensor"
في myPackage.myClass.TensorFlowObjectDetectionAPIModel.create (TensorFlowObjectDetectionAPIModel.java:106)

أليس من الممكن استخدام نماذج .tflite في هذا التطبيق؟

@ defaultUser3214 أنت تستخدم نموذج مصنف في تطبيق الكشف. MobileNet v1 هو نموذج تصنيف. الرجاء استخدام نموذج MobileNet SSD

achowdhery شكرا لك! أدى استخدام النموذج من wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_coco_2017_11_17.tar.gz إلى حدوث هذا الخطأ. لكني اعتقدت أن هذه كانت نسخة ssd؟

ولكن استخدام ssd_mobilenet_v1_android_export.pb المحول إلى .tflite الذي كان يعمل كـ pb من قبل ينتج نفس الخطأ.

@ defaultUser3214 هذا إصدار قديم من النموذج لن يعمل في أحدث تطبيق تجريبي تم إصداره في يوليو 2018. يرجى تنزيل أحدث الموديلات في يوليو 2018 في حديقة حيوان نموذج الكشف: إنها تعمل في التطبيق. الرجاء فتح مشكلة جديدة إذا كان هذا لا يزال محظورًا.

SteveIb تحتاج أيضًا إلى تغيير NUM_DETECTIONS = 500 في TFLiteObjectDetectionAPIModel.java

غير قادر على تحويل ssdmobilenet v1 .pb إلى .tflite
pb تم إنشاؤه من خلال واجهة برمجة تطبيقات اكتشاف كائن Tensorflowaselleachowdhery

أي تقدم في هذا؟ محاولة تحويل Gred_inference_graph.pb إلى ملف .TFLITE ولكن الحصول على خطأ

java.lang.IllegalArgumentException: Cannot convert between a TensorFlowLite buffer with 49152 bytes and a ByteBuffer with 270000 bytes

لاكتشاف الكائنات المخصصة في Android. أي أفكار حول طرق التحويل المختلفة؟ قم بنقل تعلم ssd_mobilenet_v1_pets على Windows 10 باتباع البرنامج التعليمي هنا: https://github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10

أي تقدم في هذا؟ محاولة تحويل Gred_inference_graph.pb إلى ملف .TFLITE ولكن الحصول على خطأ

java.lang.IllegalArgumentException: Cannot convert between a TensorFlowLite buffer with 49152 bytes and a ByteBuffer with 270000 bytes

لاكتشاف الكائنات المخصصة في Android. أي أفكار حول طرق التحويل المختلفة؟ قم بنقل تعلم ssd_mobilenet_v1_pets على Windows 10 باتباع البرنامج التعليمي هنا: https://github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10

فقط لمتابعة هذا ولمساعدة أي شخص آخر كان يعاني من نفس الخطأ - يحدث هذا بسبب استخدام نقطة تفتيش نموذجية غير صحيحة للتدريب منها. للعمل على Android مع .tflite ، يجب أن يكون النموذج الأولي MobileNet ويجب أيضًا تحديد حجمه وسيحتوي هذا القسم من الكود أو شيء مشابه في ملف .config:

graph_rewriter { quantization { delay: 48000 weight_bits: 8 activation_bits: 8 } }

إنه مباشر الآن في Tensorflow / Contrib / lite / Examples / android ! هذا منفذ أكثر اكتمالاً من العرض التوضيحي الأصلي لـ TF Android (يفتقر فقط إلى مثال Stylize) ، وسيحل محل العرض التوضيحي الآخر في tensorflow / contrib / lite / java / demo من الآن فصاعدًا.

يمكن العثور على أداة تحميل TF Lite المسطحة المحولة في mobilenet_ssd_tflite_v1.zip ، ويمكنك العثور على تنفيذ استدلال Java في TFLiteObjectDetectionAPIModel.java . لاحظ أن هذا يختلف عن تنفيذ TF الأصلي في أنه يجب فك تشفير المربعات يدويًا في Java ، ويجب أن يتم حزم مربع سابق لملف txt في أصول التطبيقات (أعتقد أن العنصر المضمن في النموذج المضغوط أعلاه يجب أن يكون صالحًا لمعظم الرسوم البيانية).

أثناء تحويل TOCO ، يتم استخدام عقدة إدخال مختلفة (معالج مسبق / فرعي) ، بالإضافة إلى عقد إخراج مختلفة (concat ، concat_1). يؤدي هذا إلى تخطي بعض الأجزاء التي تمثل مشكلة بالنسبة إلى tflite ، حتى تتم إعادة هيكلة الرسم البياني أو وصول TF Lite إلى تكافؤ TF.

فيما يلي الخطوات السريعة لتحويل نموذج SSD MobileNet إلى تنسيق tflite وإنشاء العرض التوضيحي لاستخدامه:

# Download and extract SSD MobileNet model
wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_coco_2017_11_17.tar.gz
tar -xvf ssd_mobilenet_v1_coco_2017_11_17.tar.gz 
DETECT_PB=$PWD/ssd_mobilenet_v1_coco_2017_11_17/frozen_inference_graph.pb
STRIPPED_PB=$PWD/frozen_inference_graph_stripped.pb
DETECT_FB=$PWD/tensorflow/contrib/lite/examples/android/assets/mobilenet_ssd.tflite

# Strip out problematic nodes before even letting TOCO see the graphdef
bazel run -c opt tensorflow/python/tools/optimize_for_inference -- \
--input=$DETECT_PB  --output=$STRIPPED_PB --frozen_graph=True \
--input_names=Preprocessor/sub --output_names=concat,concat_1 \
--alsologtostderr

# Run TOCO conversion.
bazel run tensorflow/contrib/lite/toco:toco -- \
--input_file=$STRIPPED_PB --output_file=$DETECT_FB \
--input_format=TENSORFLOW_GRAPHDEF --output_format=TFLITE \
--input_shapes=1,300,300,3 --input_arrays=Preprocessor/sub \
--output_arrays=concat,concat_1 --inference_type=FLOAT --logtostderr

# Build and install the demo
bazel build -c opt --cxxopt='--std=c++11' //tensorflow/contrib/lite/examples/android:tflite_demo
adb install -r -f bazel-bin/tensorflow/contrib/lite/examples/android/tflite_demo.apk

هذا يعمل مثل السحر!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات