Tensorflow: [Question&Error] Apakah ada model deteksi seperti SSD-Mobile-net di tensorflow-lite?

Dibuat pada 26 Des 2017  ·  141Komentar  ·  Sumber: tensorflow/tensorflow

HAI.

Mengembangkan aplikasi android menggunakan tensorflow-lite.

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/g3doc/models.md
Tidak ditemukan model deteksi.

Juga, saya mencoba mengonversi SSD-Inceptionv2 menggunakan tensorflow-lite-API. Tapi sepertinya ada masalah.

Memerintah


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}

Kode kesalahan


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 

File fire_inception_v2 dibuat, tetapi ukurannya nol byte.
Apa itu masalah?

juga,
tolong beri tahu saya apa cara terbaik untuk menggunakan model khusus untuk deteksi objek?

Seseorang tolong aku plz!.

Terima kasih.

lite feature

Komentar yang paling membantu

Sekarang sudah tayang di tensorflow/contrib/lite/examples/android ! Ini adalah port yang lebih lengkap dari demo Android TF asli (hanya kekurangan contoh Stylize), dan akan menggantikan demo lainnya di tensorflow/contrib/lite/java/demo ke depannya.

Flatbuffer TF Lite yang dikonversi dapat ditemukan di mobilenet_ssd_tflite_v1.zip , dan Anda dapat menemukan implementasi inferensi Java di TFLiteObjectDetectionAPIModel.java . Perhatikan bahwa ini berbeda dari implementasi TF asli karena kotak harus didekodekan secara manual di Java, dan file txt sebelumnya harus dikemas dalam aset aplikasi (saya pikir yang termasuk dalam model zip di atas harus valid untuk sebagian besar grafik).

Selama konversi TOCO, node input yang berbeda (Preprocessor/sub) digunakan, serta node output yang berbeda (concat,concat_1). Ini melewatkan beberapa bagian yang bermasalah untuk tflite, hingga grafik direstrukturisasi atau TF Lite mencapai paritas TF.

Berikut adalah langkah cepat untuk mengonversi model SSD MobileNet ke format tflite dan membuat demo untuk menggunakannya:

# 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

Semua 141 komentar

@aselle dapatkah Anda melihat masalah ini? Terima kasih.

Kami sedang bekerja untuk mengonversi SSD mobilenet (dan kemudian SSD awal setelah itu), tetapi berisi ops yang tidak didukung sepenuhnya. Saya akan memperbarui masalah ini setelah kami selesai melakukannya.

Hebat, saya telah mengajukan pertanyaan serupa di sini: https://github.com/tensorflow/tensorflow/issues/14731

Berapa lama menurut Anda sampai kalian menambahkan dukungan dari ssd-mobilenet?

Terima kasih,
Martin Peniak

Seorang anggota organisasi TensorFlow telah membalas setelah label stat: waiting tensorflower diterapkan.

?

Penerima Tugas yang Mengomel: Sudah 14 hari tanpa aktivitas dan masalah ini memiliki penerima tugas. Harap perbarui label dan/atau status yang sesuai.

Ada pembaruan?
Saya juga menghadapi masalah serupa. Terima kasih sebelumnya.

@yucheeling

Bisakah Anda menyarankan kumpulan data seperti " ssd_mobilenet_v1_coco_2017_11_17.tar " yang dapat digunakan di toko ritel untuk identifikasi pakaian yang berbeda seperti t-shirt, jeans, dll.

@rana3579 , silakan ajukan pertanyaan seperti itu di stackoverflow. Pembaruan cepat pada SSD mobilenet. Ini sedang berkembang dan kami berharap kami akan segera memiliki contoh.

@rana3579 periksa video saya, jalankan ini di movidius, nvidia GPU, serta prosesor lengan. Saya tidak dapat membagikan kumpulan data, tetapi jika Anda adalah bagian dari perusahaan, kami dapat membicarakan tentang kemungkinan kolaborasi: https://www.youtube.com/watch?v=3MinI9cCJrc

@aselle terima kasih atas pembaruannya! Di mana mencari notifikasi tentang ini? Saya ingin diberitahu segera setelah itu keluar jika itu memungkinkan. Terima kasih, saya menghargai kerja keras Anda untuk ini!

@andrewharp , sedang mengerjakan ini dan akan memperbarui aplikasi Java TF Mobile untuk menggunakan tflite. Jadi perhatikan perubahan itu di repositori. Saya akan membiarkan masalah ini terbuka untuk saat ini.

Ini berfungsi secara internal; harus memiliki sesuatu dalam satu atau dua minggu ke depan.

@andrewharp itu luar biasa!! Apakah itu juga berlaku untuk contoh kamera iOS?
Juga seperti apa ukuran bobot dan kinerjanya?
Mobilenet klasifikasi TFLite kecil dan kinerja di iOS sangat halus, jadi saya sangat bersemangat untuk TFLite.

Beberapa yang lain sudah mengonversi pb SSD Mobilenet yang ada ke model coreml dan menulis lapisan keluaran yang hilang di Swift:
https://github.com/vonholst/SSDMobileNet_CoreML

Tapi itu hanya benar-benar seperti 8-12 fps pada iPhone 7.

Hai,
Ada pembaruan tentang ini?

saya juga penasaran :)

Saya memiliki komit yang mem-porting demo Android TF ke tflite yang saat ini sedang ditinjau, semoga muncul di github minggu ini.

@madhavajay Ini hanya Android, tetapi Anda harus dapat menyesuaikannya untuk iOS. Satu-satunya hal adalah bahwa beberapa pra-pemrosesan (pengubahan ukuran/normalisasi gambar) dan pasca-pemrosesan (penindasan non-maks dan penyesuaian dengan kotak sebelumnya) dilakukan di Jawa karena tflite tidak sepenuhnya mendukung semua operator yang digunakan oleh MobileNet SSD .

@andrewharp Itu luar biasa. Bisakah Anda menjelaskan secara singkat mengapa operasi tersebut tidak tersedia saat ini di TF lite. Tampaknya kasus yang sama untuk alat konversi tfcoreml pada SSD biasa. Tidak mengeluh hanya karena kepentingan teknis, apakah mereka melakukan sesuatu yang sangat sulit untuk diterapkan di tumpukan seluler atau hanya prioritas rendah?

Menantikan untuk melihat upaya epik Anda pada kode Android!!! Terima kasih banyak. Saya tahu saya bukan satu-satunya yang menantikan ini!

@andrewharp , dan @aselle Adakah pembaruan untuk mendapatkan demo untuk menggunakan contoh Pelokalan Objek berbasis SSD untuk TFLite?

Sekarang sudah tayang di tensorflow/contrib/lite/examples/android ! Ini adalah port yang lebih lengkap dari demo Android TF asli (hanya kekurangan contoh Stylize), dan akan menggantikan demo lainnya di tensorflow/contrib/lite/java/demo ke depannya.

Flatbuffer TF Lite yang dikonversi dapat ditemukan di mobilenet_ssd_tflite_v1.zip , dan Anda dapat menemukan implementasi inferensi Java di TFLiteObjectDetectionAPIModel.java . Perhatikan bahwa ini berbeda dari implementasi TF asli karena kotak harus didekodekan secara manual di Java, dan file txt sebelumnya harus dikemas dalam aset aplikasi (saya pikir yang termasuk dalam model zip di atas harus valid untuk sebagian besar grafik).

Selama konversi TOCO, node input yang berbeda (Preprocessor/sub) digunakan, serta node output yang berbeda (concat,concat_1). Ini melewatkan beberapa bagian yang bermasalah untuk tflite, hingga grafik direstrukturisasi atau TF Lite mencapai paritas TF.

Berikut adalah langkah cepat untuk mengonversi model SSD MobileNet ke format tflite dan membuat demo untuk menggunakannya:

# 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 Selamat Paskah kamu LEGENDA! :) Akan melihat apakah saya bisa menjalankan ini.

HI, apakah ada versi quantize?

Saya membuatnya bekerja dengan instruksi di atas tetapi membutuhkan:

  • Android SDK 15 karena versi bazel saya
  • Saya juga tidak bisa membuka proyek di Android Studio

@andrewharp apakah ini Android Studio baru yang kalian tuju yang menggunakan bazel untuk membangun proyek alih-alih Gradle, atau hanya kehilangan beberapa pengaturan proyek untuk saat ini karena kerangka waktu yang singkat untuk membuatnya berfungsi?

Senang memberikan PR jika saya mengerti apa masalahnya.

Juga mengenai kinerja, tampaknya lambat pada LG G6 saya di Android 7.
Apakah karena NN API hanya ada di Android 8?

Adakah yang bisa mengujinya di Android 8?

Begitu, saya pikir instruksinya hanya untuk konversi. Saya berhenti membaca setelah bagian pertama kalimat mengatakan ini adalah bagaimana Anda mengubah model lol.

Ya, saya mendapat piksel xl, saya kira ponsel Anda tidak memiliki perangkat keras yang dapat mempercepat inferensi atau perangkat keras itu tidak didukung oleh perangkat lunak.

Saya akan mencoba dan memberi tahu Anda. Saya berasumsi saya bisa membangunnya dengan Android studio doh ...

dikirim dari iPhone saya

Pada 31 Mar 2018, pukul 20:05, Madhava Jay [email protected] menulis:

Saya membuatnya bekerja dengan instruksi di atas tetapi membutuhkan:

Android SDK 15 karena versi bazel saya
Saya juga tidak bisa membuka proyek di Android Studio
@andrewharp apakah ini Android Studio baru yang kalian tuju yang menggunakan bazel untuk membangun proyek alih-alih Gradle, atau hanya kehilangan beberapa pengaturan proyek untuk saat ini karena kerangka waktu yang singkat untuk membuatnya berfungsi?

Senang memberikan PR jika saya mengerti apa masalahnya.

Juga mengenai kinerja, tampaknya lambat pada LG G6 saya di Android 7.
Apakah karena NN API hanya ada di Android 8?

Adakah yang bisa mengujinya di Android 8?


Anda menerima ini karena Anda berkomentar.
Balas email ini secara langsung, lihat di GitHub, atau matikan utasnya.

Ya, saya melakukan hal yang sama dan langsung menuju ke kode dan studio Android. Kemudian setelah Anda melakukan ping pagi ini saya akan menjawab bahwa saya memiliki masalah yang sama dan kemudian RTFM'ed lagi. 🤣.

Dari apa yang saya tahu LG G6 harus dapat mendukung NN API karena memiliki Qualcomm 821 SoC yang sama dengan Pixel 1. Tapi, sayangnya LG belum merilis Android 8 atau 8.1 dan build LineageOS terbaru terlihat agak samar. jadi saya akan menunda kecuali saya TAHU bahwa ini berfungsi lebih baik di Android 8.1. Jika Anda dapat menyalakannya di Pixel, itu akan luar biasa! 👍

Saya telah berhasil menguji ini tetapi demo berjalan sangat lambat...bahkan lebih lambat dari versi aslinya.
Saya menggunakan Pixel XL (versi pertama) dan saya sebelumnya telah mengkompilasi demo lama untuk 64bit arch, yang membuatnya berjalan hampir dua kali lebih cepat bahkan tanpa tfLite...waktu inferensi dalam kasus ini adalah sekitar 450ms. Ketika saya mencoba demo ini, ini berjalan sekitar 850ms dan terkadang bahkan lebih dari satu detik. Apakah saya melakukan sesuatu yang salah atau saya hanya terlalu optimis untuk mengharapkan kecepatan yang layak? Terima kasih.

@mpeniak Saya mendapatkan kecepatan yang sama pada LG G6, dengan debug aktif atau nonaktif (Kupikir itu debug pada awalnya). Saya menduga NNAPI tidak digunakan. Mungkin kita perlu melakukan sesuatu yang istimewa dengan build nnapi_lib?
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/BUILD

Ketergantungan terdaftar tetapi mungkin perlu dibangun untuk arsitektur tertentu?
Mungkin sesuatu di ./configure
(btw saya mengaktifkan XLA di ./configure saya jika itu terkait tetapi tidak mengubah kecepatan)

@andrewharp
Saya ingin menggunakan NNAPI, tetapi saya tidak tahu cara menggunakannya.
Menurut dokumen, Neural Networks API tersedia di Android 8.1 >
Jika 8.1 atau lebih tinggi, apakah pada dasarnya diterapkan? atau Apakah saya memerlukan pekerjaan NDK tambahan? Tautan Dokumen
Semoga harimu menyenangkan XD

@andrewharp , saya mencoba mengaktifkan NNAPI untuk tflite_demo dan menjalankan apk, namun saya menemukan apk mogok
saat memanggil AddOpsAndParams, operasi tflite::BuiltinOperator_SQUEEZE tidak didukung dan
nn_op_type diatur ke -1, yang akan menyebabkan FATAL dipanggil, dan exit(-1) . Saya pikir itu
akar masalah. Tolong beri tahu apakah itu akan didukung di versi mendatang? Apakah ada cara lain untuk bekerja?
sekitar untuk menguji jalur NNAPI? Terima kasih.

@andrehentz
bazel run -c opt tensorflow/python/tools/optimize_for_inference -- \
--input=$DETECT_PB --output=$STRIPPED_PB --frozen_graph=Benar \
--input_names=Praprosesor/sub --output_names=concat,concat_1 \
--jugalogtostderr

Mengapa bukan input_names image_tensor?
Saya mencoba cara ini dan saya menemukan kesalahan.

@nanamare
Anda harus menggunakan frozen_inference_graph_stripped.pb alih-alih frozen_inference_graph.pb.
coba "bazel-bin/tensorflow/tools/graph_transforms/summarize_graph --in_graph=frozen_inference_graph_stripped.pb"
dan Anda dapat melihat output berikut:
Ditemukan 1 kemungkinan input: (name=Preprocessor/sub, type=float(1), shape=None)
Tidak ada variabel yang terlihat.
Ditemukan 2 kemungkinan keluaran: (name=concat, op=ConcatV2) (name=concat_1, op=ConcatV2)

Nama inputnya adalah Preprocessor/sub abd nama outputnya adalah concat.

@nanamare
Kode tensorflow lite terbaru menyertakan antarmuka java untuk mengaktifkan NNAPI.

class Interpreter memiliki fungsi yang disebut: setUseNNAPI(true);
Anda dapat langsung memanggil antarmuka tersebut.

@zhangbo0325
Saya sudah mencoba memanggil setUserNNAPI(true);, Tapi tidak ada efeknya.
Itu kesimpulan yang hampir mirip tidak menggunakan NNAPI.
spesifikasi android: versi 8.1.

@nanamare , apakah ssd-mobilenet Anda sedang berjalan? Untuk jaringan seperti itu, ada operasi SQUEEZE yang tidak didukung oleh android NNAPI. Saya mengajukan pertanyaan di atas. Untuk mobilenet-v1, tidak apa-apa.

<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!

Log Ponsel di sini:
04-04 19:46:36.099 28864-28882/org.tensorflow.lite.demo E/AndroidRuntime: PENGECUALIAN FATAL: proses inferensi: org.tensorflow.lite.demo, PID: 28864 java.lang.IllegalArgumentException: Bentuk target keluaran [1, 1917, 4] tidak cocok dengan bentuk Tensor [1, 1917, 1, 4]. di org.tensorflow.lite.Tensor.copyTo(Tensor.java:44) di org.tensorflow.lite.Interpreter.runForMultipleInputsOutputs(Interpreter.java:139) di org.tensorflow.demo.TFLiteObjectDetectionAPIModel.recognizeImage(TFLiteAPI226.Detva ) di org.tensorflow.demo.DetectorActivity$3.run(DetectorActivity.java:248) di android.os.Handler.handleCallback(Handler.java:761) di android.os.Handler.dispatchMessage(Handler.java:98)di android.os.Looper.loop(Looper.java:156) di android.os.HandlerThread.run(HandlerThread.java:61)

Luar biasa! Mencoba membuatnya berfungsi di iOS. Bagaimana cara mengurai output Tensor?

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

Antarmuka DetectorActivity macet di proyek saya, apakah Anda ada, bagaimana saya bisa menyelesaikannya?

@zhangbo0325 Terima kasih atas detailnya. Karena pemerasan tidak didukung oleh NNAPI, apakah itu berarti NNAPI tidak digunakan sama sekali dan inferensi akan tetap lambat? Seperti yang saya sebutkan di komentar sebelumnya, saya mendapatkan kinerja yang sangat buruk di Pixel XL. Saya mengharapkan waktu inferensi di suatu tempat sekitar 80-120ms. Terima kasih!

@mpenak , saya mengajukan pertanyaan yang sama ke andrewharp. Saya baru saja menjalankan ssd-mobilenet dengan bantuan implementasi cpu tensorflow-lite dan juga mendapatkan kinerja yang buruk.

Pembicaraan TensorFlow Lite di Dev Summit 2018 menunjukkan kinerja 3x lipat di MobileNet:
https://youtu.be/FAMfy7izB6A?t=530

Mungkin itu bukan untuk SSD?
Mungkin membutuhkan kuantisasi berat terlebih dahulu?

Saya sudah mencoba mobilnet dan jauh lebih cepat, ini tidak berlaku untuk mobilnet-ssd...

Panda Sedih ️🐼
@andrewharp Adakah ide kapan implementasi SSD berkinerja akan tersedia? Apakah ini pertanyaan tentang Kuantisasi Berat?

Saya juga mendapatkan kinerja yang buruk untuk ssd-mobilenet di TensorFlowLite :(
Tapi, saya punya pertanyaan lain. Mengapa skor hasil melebihi 1? Bukankah itu kemungkinan?

@ a1103304122 seperti yang saya mengerti, skor adalah output dari simpul "concat", sebelum softmax, jadi, itu bukan probabilitas.

Selama konversi TOCO, node input yang berbeda (Preprocessor/sub) digunakan, serta node output yang berbeda (concat,concat_1). Ini melewatkan beberapa bagian yang bermasalah untuk tflite, hingga grafik direstrukturisasi atau TF Lite mencapai paritas TF.

Adakah yang tahu mengapa TFlite lebih lambat dari TFmobile dalam model ini?

@andrewharp apakah mungkin mengomentari kinerja TF Lite SSD? Juga apakah kuantisasi mungkin / datang? Saya tahu kalian bekerja keras untuk mewujudkan semua ini, tetapi akan lebih baik untuk mengetahui apakah ini hanya masalah jangka pendek atau ada solusi yang bisa kita terapkan. 😄.

@andrewharp Terima kasih atas kiriman Anda yang luar biasa. Namun, saya punya satu pertanyaan untuk langkah Anda.

Hapus node yang bermasalah bahkan sebelum membiarkan TOCO melihat graphdef

bazel run -c opt tensorflow/python/tools/optimize_for_inference -- \
--input=$DETECT_PB --output=$STRIPPED_PB --frozen_graph=Benar \
--input_names=Praprosesor/sub --output_names=concat,concat_1 \
--jugalogtostderr

Kalau tidak salah paham, di sini Anda ingin menghasilkan STRIPPED_PB kan? Jika demikian, saat ini, input file input kami harus image_tensor. Jadi, saya tidak begitu mengerti mengapa kami menggunakan Preprocessor/sub. Bisakah Anda menjelaskan lebih detail?

Kedua, disini kita menggunakan optimize_for_inference, apakah bisa menggunakan tool transform_graph? karena dokumentasi tensorflow baru merekomendasikan transform_graph alih-alih optimize_for_inference.

@mpeniak gimana caranya? Tolong katakan beberapa detail.

org.tensorflow.lite.demo E/AndroidRuntime: PENGECUALIAN FATAL: proses inferensi: org.tensorflow.lite.demo, PID: 28864 java.lang.IllegalArgumentException: Bentuk target keluaran [1, 1917, 4] tidak cocok dengan bentuk Tensor [1, 1917, 1, 4].

@Haijunlv Sudahkah Anda memecahkan masalah? Bisa share solusinya?

Setelah mengimpor demo Android baru TF Lite, saya mendapatkan Error:Plugin with id 'com.android.application' not found. di OS X.

masalah yang sama seperti @ csmith105 ! Saya berhasil membuat dan menginstal demo dengan bazel tetapi saya tidak dapat mengkompilasi atau menjalankan proyek di Android Studio ... ada solusi untuk masalah ini?

@Eddy-zheng Jika Anda melihat simpul "concat" di grafik beku, Anda akan menemukan operasi pemerasan dijalankan setelah operasi concat. Saya pikir itulah alasan mengapa bentuknya tidak cocok. Saya tidak menguji kecepatan operasi pemerasan. Tapi saya pikir ada dua cara untuk memecahkan masalah.

  1. ubah urutan operasi pemerasan dan concat. Di ssd_meta_arch.py, ubah sedikit " box_encodings = tf.squeeze(tf.concat(prediction_dict['box_encodings'], axis=1), axis=2)"
  2. langsung bunuh bentuk 1 di sumbu 2. Di box_predictor.py, ubah sedikit " box_encodings =tf.reshape(
    box_encodings, tf.stack([combined_feature_map_shape[0],
    gabungan_fitur_peta_bentuk[1] *
    gabungan_fitur_peta_bentuk[2] *
    jumlah_prediksi_per_lokasi,
    1, self._box_code_size]))"

Sebenarnya saya tidak mengerti alasan mengapa membentuk kembali tensor dengan bentuk ekstra "1". Mungkin itu berlebihan
op.
Saya telah mencoba cara 1 dan berhasil menjalankan model di ponsel. Tapi masih agak lambat. nanti saya akan mencoba cara 2 untuk melihat apakah itu bisa mendapatkan kecepatan yang lebih baik

@Haijunlv Seberapa baik deteksinya? Model lite dari demo @andrewharp hanya menghapus semua node preprocess dan postprocess (ribuan dari mereka) dari grafik dan menggantinya dengan beberapa baris kode. Saya tidak yakin bagaimana itu akan berhasil..

Saya pikir ada solusi untuk studio Android dan masalah gradle. (mohon koreksi saya jika saya salah atau jika ada solusi yang lebih baik):

  • Ini bukan pendekatan terbaik tetapi ada plugin Bazel yang dapat kita instal di dalam Android Studio untuk "mengganti" Gradle dan kita dapat membangun dan menjalankan proyek kita menggunakan Bazel melalui AS.

  • Saya membaca beberapa artikel tentang Bazel dan saya menemukan pertanyaan ini di Quora.. dan menurut jawabannya, tensorflow akan terus menggunakan Bazel karena itu mengeksploitasi kerangka kerja lebih baik dan memberikan hasil yang lebih baik.. jadi saya pikir sebagai pengembang dalam kasus khusus ini kita harus beradaptasi ke sana dan tinggalkan Gradle hingga tensorflow mendukungnya sepenuhnya.

@davidfant
Apakah Anda berhasil mendapatkan beberapa output di TensorFlow Lite C++?

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

Saya mengalami kemajuan, tetapi saya masih tidak tahu cara mendapatkan output dalam C++. Apakah ada dokumentasi tentang ini? Inilah yang saya miliki saat ini. Bagaimana saya harus mengakses larik data untuk mendapatkan skor?

(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 Saya melakukan hal serupa dan ternyata tidak berhasil. Menggunakan cutoff dari aplikasi demo Android, itu hanya menghasilkan terlalu banyak noise. Jika Anda menggunakan tensorboard untuk membaca grafik, Anda akan menemukan bahwa model ringan memangkas ribuan node pascaproses. Saya tidak berpikir cara saat ini akan berhasil. Saya harap tensorflow lite akan mendukung node postprocess tersebut di masa mendatang, daripada meminta orang untuk melakukan peretasan yang tidak berfungsi seperti itu..

Terima kasih @YijinLiu. Saya melihat repositori tf-cpu Anda, saya akan melihat kode Anda untuk memeriksa apakah implementasi saya sudah benar, dan melihat hasilnya meskipun tidak bagus.

@JaviBonilla beri tahu kami jika Anda telah mengetahui cara menjalankan dengan C++! 🙌.

Hai @davidfant ,

Saya masih harus mengujinya, tetapi @YijinLiu sudah menemukan jawabannya!.

Lihat repositorinya (https://github.com/YijinLiu/tf-cpu). Secara khusus, Anda dapat menemukan cara mendapatkan output dalam file tf-cpu/benchmark/obj_detect_lite.cc , fungsi AnnotateMat() , yang dijalankan setelah Interpreter->Invoke() .

@JaviBonilla Saya tidak menyelesaikan obj_detect_lite.cc, khususnya, untuk menggunakan prior untuk memecahkan kode kotak deteksi.
Apa yang saya temukan adalah bahwa skor tidak masuk akal di semua skenario. Untuk beberapa kasus, itu menghasilkan terlalu banyak kebisingan. Untuk kasus lain, mungkin kehilangan beberapa deteksi yang baik. Saya melihat simpul-simpul itu untuk mengubah skor menengah ini menjadi skor kemungkinan akhir. Ada ribuan node...

@YijinLiu terima kasih telah mengklarifikasi ini. Kemudian, saya pikir lebih baik menunggu hingga lebih banyak peningkatan disertakan dalam TensorFlow Lite untuk deteksi objek. Bagaimanapun, saya akan mencoba memecahkan kode kotak deteksi di C++ jika saya punya waktu.

Hai @andrewharp ,

Terima kasih atas usaha Anda untuk membuat proyek demo android baru, tetapi bisakah Anda menulis readme.md atau beberapa dokumen deskripsi di tensorflow/contrib/lite/examples/android sehingga kita semua dapat dengan mudah memahami proses membuat tensorflow lite? terima kasih~!

Halo, Saya telah menjalankan demo ssd_mobilenet_v1_coco_2017_11_17 dengan sukses, lalu saya mendapatkan model yang disempurnakan. Ketika saya menjalankan proses @andrehentz di atasnya, masalah terjadi:
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

Sebelum Menghapus operasi yang tidak digunakan: 586 operator, 871 array (0 terkuantisasi)
12-06-2018 15:29:54.273221: I tensorflow/contrib/lite/toco/graph_transformations/graph_transformations.cc:39] Sebelum transformasi graf umum: 586 operator, 871 array (0 terkuantisasi)
12-06-2018 15:29:54.300213: I tensorflow/contrib/lite/toco/graph_transformations/graph_transformations.cc:39] Setelah transformasi graf umum melewati operator 1: 409, 688 array (0 terkuantisasi)
12-06-2018 15:29:54.309735: I tensorflow/contrib/lite/toco/graph_transformations/graph_transformations.cc:39] Sebelum transformasi grafik dekuantisasi: 409 operator, 688 array (0 terkuantisasi)
12-06-2018 15:29:54.317395: I tensorflow/contrib/lite/toco/allocate_transient_arrays.cc:329] Total ukuran alokasi array sementara: 2880256 byte, nilai optimal teoretis: 2880128 byte.
12-06-2018 15:29:54.319173: F tensorflow/contrib/lite/toco/tflite/export.cc:330] Beberapa operator dalam model tidak didukung oleh runtime TensorFlow Lite standar. Jika Anda memiliki implementasi khusus untuknya, Anda dapat menonaktifkan kesalahan ini dengan --allow_custom_ops, atau dengan menyetel allow_custom_ops=True saat memanggil tf.contrib.lite.toco_convert(). Berikut adalah daftar operator yang Anda perlukan implementasi khusus: RSQRT, SquaredDifference, Stack, TensorFlowShape.

Ini model saya https://drive.google.com/open?id=1IxRSU4VSmVmhUtUpSQew_5anEfxTg3Ca

Ada yang bisa bantu saya?
@andrehentz

@JaviBonilla dan @YijinLiu Saya memiliki implementasi Python yang saya uji dengan model SSD MobileNet V{1,2} dan SSDLIte MobileNet V2 milik Google. Lihat dokumentasi sederhana di sini .

@freedomtan versi tf apa yang Anda gunakan? tf 1.8?

@hengshanji master cabang setelah tflite interpreter Python mengikat (29c129c6). Saya tidak berpikir 1,8 memiliki ikatan.

@freedomtan tf1.8 memiliki interpreter Python yang mengikat, tapi saya menemui masalah seperti "nnapi error: tidak dapat membuka perpustakaan libneuralnetworks.so". di mana mendapatkan .so ini atau bagaimana cara membuatnya? Terima kasih.

Abaikan saja :) Ini untuk Android NNAPI.

@freedomtan Apakah Anda menguji contoh di perangkat atau di pc? Ketika saya mengujinya di pc, gunakan libneuralnetworks.so android-28/x86, itu menunjukkan kesalahan "Aborting Since tflite Returns Failure".

Seperti yang saya katakan, abaikan masalah NNAPI itu. Anda tidak diharapkan memiliki libneuralnetwork.so yang berfungsi. Saya menguji skrip saya pada x86 yang menjalankan Ubuntu dan papan ARMv8 yang menjalankan Debian.

@freedomtan , terima kasih telah berbagi kode dan dokumentasinya.

Berdasarkan repositori (https://github.com/YijinLiu/tf-cpu). Saya telah memperbarui tf-cpu/benchmark/obj_detect_lite.cc untuk mendapatkan output. Dalam fungsi AnnotateMat() tambahkan kode decodeCenterSizeBoxes untuk menangani output_locations, Kemudian lakukan nms untuk hasil ini.
Pada saat yang sama, dengan menggunakan https://github.com/tensorflow/tensorflow/issues/14688 untuk menghasilkan libtensorflow-lite.a, ini dapat berjalan pada x86 yang menjalankan Ubuntu dan perangkat android dengan model tflite di ssdlite_mobilenet_v2_coco_2018_05_09. tar.gz.
Terima kasih semuanya.

@WeiboXu Bisakah Anda membagikan kode dan modelnya di sini?

@freedomtan Dalam kode implementasi python Anda, ada satu file "/tmp/box_priors.txt", apakah Anda tahu cara menghasilkan file ini? Atau bagaimana data dalam file ini dihitung? Tidak ada masalah untuk melakukan inferensi untuk gambar dengan ukuran 300X300, tetapi akurasi inferensi akan turun ketika melakukan inferensi untuk gambar dengan ukuran 224X224

@freedomtan , @andrewharp , Model sebelumnya dengan mengikuti petunjuk ini tidak dapat bekerja di Demo TFLite terbaru , Apakah itu terkuantifikasi atau mengambang, karena model tflite di demo TFLite terbaru membutuhkan 4 keluaran , tetapi model sebelumnya hanya memiliki 2 keluaran ( concat, concat1).

Tolong bantu, Terima kasih!

Petunjuk ini sedang diperbarui saat ini. Akan memberikan tautan untuk instruksi yang diperbarui di minggu depan.

@frontword Apa dalam /tmp/box_priors.txt adalah kotak untuk pemrosesan pos. Jika Anda menggunakan yang lebih baru yang disebutkan oleh @WenguoLi , Anda tidak memerlukannya. Namun, sejauh yang saya tahu, operasi pasca-pemrosesan tersebut diimplementasikan sebagai operasi khusus TF Lite. Artinya Anda tidak dapat mempercepatnya dengan akselerator NNAPI tanpa upaya lebih lanjut.

Untuk masalah ukuran gambar, ya, saya pikir memasukkan gambar 224x224 ke SSD300 (model yang dirilis oleh Google dilatih dengan gambar 300x300) dan akurasi yang semakin buruk tidak terduga.

@WenguoLi Sepertinya saya model terbaru yang Anda sebutkan cukup mudah untuk ditangani. Lihat skrip pembaruan saya. Gambar berikut dihasilkan oleh

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

image

Untuk memperbaiki skor hasil inferensi yang melebihi 1 apakah mungkin menggunakan metode Java TrackedObject.getCurrentCorrelation() karena itu sepertinya selalu mengembalikan sesuatu yang kurang dari 1 (tidak yakin apakah itu benar atau tidak). Contoh TFLite Android menggunakan Recognition.getConfidence() yang sepertinya selalu mengembalikan sesuatu yang lebih besar dari 1

@mpenak Anda menjalankan model tflite ssd mobilenet di Movidius. Saya juga berencana untuk melakukan hal serupa. Bisakah Anda memandu sedikit tentang bagaimana Anda melakukannya?

@achowdhery Hai, saya melihat beberapa pembaruan instruksi pembuatan untuk demo Android terbaru di sini (https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/lite/examples/android/app), tetapi tidak menunjukkan bagaimana kita benar-benar dapat mengonversi model pb beku ke model tflite (detect.tflite terkuantisasi yang digunakan dalam demo terbaru). Adakah instruksi lebih lanjut tentang aliran konversi model terkuantisasi? Juga, saya pikir kita harus terlebih dahulu menjalankan pelatihan terkuantisasi dengan operasi kuantisasi palsu seperti yang diinstruksikan di sini (https://www.tensorflow.org/performance/quantization) dan kemudian melakukan konversi model, benar? Juga, apakah mungkin untuk mengaktifkan NNAPI di demo Android terbaru? Saya mencoba menggunakan tfLite.setUseNNAPI(true) di TFLiteObjectDetectionAPIModel.java tetapi crash pada Pixel 2 saya yang menjalankan Android 8.1 (dapat bekerja dengan baik tanpa NNAPI). Ada saran? Terima kasih!

@tenoyart Jawaban singkat untuk "apakah mungkin mengaktifkan NNAPI di demo Android terbaru?" harus TIDAK. Jawaban yang tidak terlalu singkat adalah bahwa agak mungkin jika Anda memodifikasi juru bahasa TF Lite melakukan sesuatu seperti membelah model atau menambahkan operasi khusus yang sesuai ke NNAPI.

@achowdhery Saya melihat artikel blog TensorFlow oleh Anda. Apakah ini petunjuk yang Anda sebutkan atau lebih akan datang?

Ya. Ini adalah petunjuk untuk melatih dan menyajikan model deteksi objek di Android.

@freedomtan Terima kasih telah membagikan skripnya.
Dalam skrip terbaru Anda dengan postprocessing , file model mana yang Anda gunakan?
Apakah Anda menentukan argumen dari optimize_for_inference.py seperti
--input_names="Praprosesor/sub"
--output_names="detection_boxes,detection_scores,num_detections,detection_classes"

Apakah Anda melihat perbedaan dengan/tanpa postprocessing?

Terima kasih!

Apakah ada cara untuk mengonversi model SqueezeNet dengan 4 output ke tflite?

@chanchanzhang Ikuti petunjuk baru menjelang akhir tutorial di https://medium.com/tensorflow/training-and-serving-a-realtime-mobile-object-detector-in-30-minutes-with-cloud-tpus -b78971cf1193
Perhatikan bahwa ini menggunakan alur kerja yang berbeda dari menggunakan optimize_for_inference.py

@ashwaniag Jika Anda ingin mengganti Mobilenet dengan pengklasifikasi SqueezeNet sambil menyimpan SSD setelah itu untuk deteksi, itu bagus untuk alur kerja saat ini.

@achowdhery Senang melihat model TF Lite di ssd mobilenet v1. Apakah TF Lite mendukung sepenuhnya ssdlite mobilenet v2?

@tenoyart Ya. SSD Mobilenet apa pun akan bekerja melalui saluran ini. Kami belum merilis file tflite yang sesuai dalam sumber terbuka. Jika Anda mengalami masalah, harap laporkan bug.

@chanchanzhang seperti yang dikatakan @achowdhery , tolong gunakan object_detection/export_tflite_ssd_graph.py daripada optimized_for_inference.py . Dan file model tflite yang saya gunakan adalah dari yang digunakan oleh contoh Android. Anda bisa mendapatkannya di sini .

@achowdhery Saya pikir tidak ada node dan tensor FakeQuant di pos pemeriksaan ssd_mobilenet_v1_quantized_coco dan ssd_mobilenet_v1_0.75_depth_quantized_coco . Bisakah Anda memeriksanya?

@freedomtan Saya melihat node weight_quant dan act_quant dalam grafik yang diekspor setelah menggunakan object_detection/export_tflite_ssd_graph.py.
Harap berikan tangkapan layar atau instruksi yang tepat tentang bagaimana Anda memverifikasi bahwa itu tidak memiliki node Fakequant.
Saya juga berhasil mengubah pos pemeriksaan

@achowdhery Terima kasih telah memeriksa. Ketika saya menjalankan export_tflite_ssd_graph.py pada keduanya, saya tidak bisa mendapatkan model tflite, jadi saya memeriksa pos pemeriksaan. Apa yang saya lakukan adalah sesuatu seperti

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

Tidak ada yang muncul.

@andrewharp Terima kasih banyak untuk kelas inferensi cutosm Anda TFLiteObjectDetectionAPIModel.java , saya sudah mencobanya dengan ssd mobilenet v1 tflite mobilenet_ssd_tflite_v1.zip Anda tetapi ketika aplikasi dimulai tampaknya ada masalah dalam fungsi recognitionImage (bitmap bitmap akhir) ketika saya menelepon tfLite.runForMultipleInputsOutputs(inputArray, outputMap); itu melempar pengecualian ini

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

kesalahan mengatakan bahwa panjang array output lebih besar dari panjang array input
Berikut adalah kondisi di 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();
            }
       }
}

dan ini adalah array input dan output saya:

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);

Array keluaran:

// 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();

Dan Inferensinya:

// 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();

Saya tidak mengerti arti dari Kesalahan ini karena saya melakukan hal yang persis sama dengan kelas TFLiteObjectDetectionAPIModel.java Anda.
Terima kasih atas bantuan Anda

@achowdhery Hai, mengikuti blog Anda, saya mengonversi model dari ssd_mobilenet_v1_coco_2017_11_17. Namun ketika saya menggunakan mobilenet_ssd.tflite yang dikonversi di tflite_demo.apk, saya mendapatkan kesalahan berikut:

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

Ada ide mengapa saya mendapatkannya? Terima kasih.

Ini adalah bentuk ketidakcocokan karena tensor keluaran yang diharapkan berukuran 1,10,4 bukan 1,1917,4. Untuk file model lama, Anda harus mundur ke versi aplikasi demo bulan Mei. Jika tidak, silakan gunakan model terbaru yang dirilis untuk konversi.

@achowdhery Saya mengonversi model saya sendiri ke tflite dan ketika saya menjalankannya. Panggilan interpreter->invoke() melempar kesalahan seg. Tahu apa yang mungkin salah?

@ashwaniag Lakukan model yang diunduh di https://medium.com/tensorflow/training-and-serving-a-realtime-mobile-object-detector-in-30-minutes-with-cloud-tpus-b78971cf1193
kompilasi untuk Anda?
Jika ya, mohon berikan instruksi baru yang Anda gunakan sekarang ketika Anda mendapatkan kesalahan seg?
Mungkin ada ketidakcocokan dalam jenis/ukuran input, dll.

@achowdhery Berhasil . Saya memberikan input_arrays yang salah. Terima kasih!

ssd_mobilenet_v1_quantized_coco dan ssd_mobilenet_v1_0.75_depth_quantized_coco yang diperbarui berfungsi, jika Anda mengikuti tutorial. Terima kasih @achowdhery.

Saya melihat TFLiteObjectDetectionAPIModel.java di contoh aplikasi demo. Apakah ada alasan outputLocations , outputClasses , outputScores dan numDetections dialokasikan pada setiap panggilan recognizeImage di sini ? Tampaknya mereka dimaksudkan untuk dialokasikan sebelumnya.
Saya sudah mencoba menjalankan kode dengan pra-alokasi dan tampaknya berfungsi dengan baik, tetapi saya hanya ingin memastikan tidak ada yang terjadi di balik selimut yang akan menimbulkan masalah nanti.

Prealokasi mungkin lebih efisien. Di mana Anda mengalokasikan sebelumnya sehingga Anda dapat memperkirakan masalah?

terima kasih atas jawabannya @achowdhery. Saya membiarkan pra-alokasi dalam metode create statis apa adanya. Satu-satunya kekhawatiran saya adalah bahwa kode tersebut tampaknya ditulis untuk menggunakan pra-alokasi (metode statis mengalokasikan sebelumnya array), tetapi untuk beberapa alasan array dialokasikan kembali pada setiap panggilan.

hai @achowdhery , saya menguji demo aplikasi tflite Android baru. Ini bekerja dengan sempurna untuk ssd_mobilenet_v1_coco, ssd_mobilenet_v1_0.75_depth_coco, ssd_mobilenet_v1_quantized_coco .
Tapi saya mendapat pengecualian ini untuk model SSD-mobilenet lainnya:

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)

Model tflite menghasilkan indeks kelas yang salah. Pengecualian membuat aplikasi macet setelah terdeteksi dengan baik selama beberapa detik.
ssd_mobilenet_v1_ppn_coco menghasilkan kotak pembatas yang salah, label juga.

PPN adalah model float: apakah Anda mengonversi model TFLITE menggunakan perintah konversi float.
https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/running_on_mobile_tensorflowlite.md
Kemudian Anda juga perlu mengubah yang berikut di DetectorActivity.java:
boolean akhir statis pribadi TF_OD_API_IS_QUANTIZED = true;

Saya tahu konfigurasi itu. Sebenarnya ketika konfigurasi itu salah, aplikasi tidak bisa berjalan sama sekali.
Bisakah Anda melihat ArrayIndexOutOfBoundsException? Saya juga mencoba buruh pelabuhan tutorial Anda, tetapi sama saja.

Baik. silakan ajukan masalah GitHub baru dengan instruksi repro yang tepat. Model PPN adalah permintaan fitur baru untuk aplikasi java - Kami akan membalas ketika kami dapat memprioritaskannya

Terima kasih. ArrayIndexOutOfBoundsException juga terjadi pada ssd_mobilenet_v1_0.75_depth_quantized_coco, ssdlite_mobilenet_v2_coco. Perbedaan dari PPN adalah membuat hasil yang benar sebelum aplikasi mogok oleh pengecualian itu.

@achowdhery Apakah ada cara untuk melatih model kuantisasi dengan 4 output untuk tflite menggunakan legacy/train.py karena model_main.py baru memiliki bug?
https://github.com/tensorflow/models/issues/4798

@ashwaniag Anda dapat membedakan dua kode dan menambahkan bagian yang menambahkan kuantisasi: Perhatikan bahwa fungsi graph_rewriter adalah tempat operasi kuantisasi ditambahkan.

@achowdhery : https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/running_on_mobile_tensorflowlite.md
apakah ada contoh atau kode contoh bagaimana melakukan hal yang sama di iOS. Sejauh ini hal terdekat yang saya temukan adalah https://github.com/YijinLiu/tf-cpu/blob/master/benchmark/obj_detect_lite.cc yang tidak selalu berfungsi.

aplikasi demo iOS saat ini tidak berfungsi dengan model ssd dan float.

@achowdhery Saya melatih model saya menggunakan tensorflow v1.9. Dikonversi ke tflite menggunakan langkah-langkah di blog. Saya tidak mendapatkan deteksi apa pun. Apakah Anda punya ide tentang ini?

@ashwaniag COCO atau hewan peliharaan? Silakan buka bug baru dengan instruksi repro yang tepat. Pengguna GitHub lainnya telah mengonfirmasi bahwa ini berfungsi dengan Tensorflow 1.10

@achowdhery Ini adalah dataset saya sendiri. Saya dilatih untuk arsitektur mobilenetv2. Ketika saya menjalankan model .pb (model tensorflow), saya mendapatkan
Tidak ditemukan: Jenis Op tidak terdaftar 'NonMaxSuppressionV3' dalam biner yang berjalan di VAL5-04. Pastikan Op dan Kernel terdaftar dalam biner yang berjalan dalam proses ini.

Apakah Anda pikir itu terkait?

@ashwaniag Silakan buka bug baru dan berikan instruksi yang dapat direproduksi dengan tepat

@ashwaniag periksa kedua masalah ini, saya memiliki masalah yang sama: # 10254 dan #19854

@achraf-boussaada Terima kasih! Aku telah memperbaikinya. Itu adalah masalah ketidakcocokan versi.
@achowdhery Sekarang, masalahnya adalah model tensorflow penuh memberi saya hasil yang bagus tetapi model tflite memberikan hasil yang sangat buruk.

@ashwaniag Silakan tentukan hasil yang sangat buruk. Apakah Anda memiliki benda-benda kecil? Harap lampirkan pos pemeriksaan model, konfigurasi saluran, dan file label serta gambar sampel untuk membantu kami mereproduksi masalah. Terima kasih

@oopsodd halo, saya juga mendapatkan indeks kelas yang salah. itu mengeluh "java.lang.ArrayIndexOutOfBoundsException: length=10; index=-739161663", Bisakah Anda membantu saya?

Catatan Saya telah membuat contoh kerja minimal TensorFlow Lite SSD (Deteksi Objek) untuk iOS dan Android; https://github.com/baxterai/tfliteSSDminimalWorkingExample. Versi iOS didasarkan pada obj_detect_lite.cc oleh YijinLiu (dengan fungsi nms oleh WeiboXu), dan versi Android didasarkan pada https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/examples/ android tflDeteksi. Ini menghilangkan semua overhead seperti kamera internal, dan mengisolasi kode inti yang diperlukan untuk mendeteksi objek dan menampilkan kotak deteksi.

@baxterai kerja bagus! terima kasih, saya akan mengujinya.

Terima kasih atas pekerjaan Anda yang luar biasa semuanya! Saya memiliki pertanyaan lain mengenai operasi pascapemrosesan yang baru saja ditambahkan.

Output dari ssd_mobilenet_v1_quantized_coco . yang telah dilatih sebelumnya
saat ini terbatas pada 10 deteksi teratas dalam bingkai, meskipun konfigurasi default di models/research/object_detection/samples/configs/ like
ssd_mobilenet_v1_quantized_300x300_coco14_sync.config semua menentukan batas deteksi total yang lebih tinggi.

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 }

apakah ini diselesaikan dengan melatih ulang jaringan dengan konfigurasi pipa ini atau dimensi dari
'TFLite_Detection_PostProcess' diperbaiki ke 10 dengan konfigurasi lain?

@Georg-W Anda juga perlu mengubah deteksi maksimal di export_tflite_ssd_graph.py. Ada opsi baris perintah.

@achowdhery ah terima kasih! Itu yang saya lewatkan.

@andrewharp Terima kasih banyak untuk kelas inferensi cutosm Anda TFLiteObjectDetectionAPIModel.java , saya sudah mencobanya dengan ssd mobilenet v1 tflite mobilenet_ssd_tflite_v1.zip Anda tetapi ketika aplikasi dimulai tampaknya ada masalah dalam fungsi recognitionImage (bitmap bitmap akhir) ketika saya menelepon tfLite.runForMultipleInputsOutputs(inputArray, outputMap); itu melempar pengecualian ini

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

kesalahan mengatakan bahwa panjang array output lebih besar dari panjang array input
Berikut adalah kondisi di 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();
            }
       }
}

dan ini adalah array input dan output saya:

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 < ukuran input; ++i) {
for (int j = 0; j < ukuran input; ++j) {
int pixelValue = intValues[i * ukuran input + j];
if (isModelQuantized) {
// model terkuantisasi
imgData.put((byte) ((Nilai piksel >> 16) & 0xFF));
imgData.put((byte) ((pixelValue >> 8) & 0xFF));
imgData.put((byte) (Nilai piksel & 0xFF));
} else { // Model mengambang
imgData.putFloat((((pixelValue >> 16) & 0xFF) - IMAGE_MEAN) / IMAGE_STD);
imgData.putFloat((((pixelValue >> 8) & 0xFF) - IMAGE_MEAN) / IMAGE_STD);
imgData.putFloat(((Nilai piksel & 0xFF) - IMAGE_MEAN) / IMAGE_STD);

The outputs array :

// Salin data input ke TensorFlow.
Trace.beginSection("umpan");
outputLocations = float baru[1][NUM_DETECTIONS][4];
outputClasses = float baru[1][NUM_DETECTIONS];
outputScores = float baru[1][NUM_DETECTIONS];
numDetections = float baru[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 :

// Jalankan panggilan inferensi.
Trace.beginSection("jalankan");
Log.d("TAG_INPUT",""+String.valueOf(inputArray.length));
Log.d("TAG_OUTPUT",""+String.valueOf(outputMap.size()));

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

```
Saya tidak mengerti arti dari Kesalahan ini karena saya melakukan hal yang persis sama dengan kelas TFLiteObjectDetectionAPIModel.java Anda.
Terima kasih atas bantuan Anda

saya punya masalah yang sama..ada solusi?
Terima kasih..

@Georg-W Anda juga perlu mengubah deteksi maksimal di export_tflite_ssd_graph.py. Ada opsi baris perintah.

Hai

Saya mencoba mendeteksi lebih dari 10 objek dalam gambar (yang merupakan default)
Saya menggunakan perintah berikut:
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_input_image_tensor -- output_arrays='TFLite_Detection_PostProcess','TFLite_Detection_Po stProcess:1 ','TFLite_Detection_Po stProcess:2 ','TFLite_Detection_Po stProcess:3 ' --inference_type=FLOAT --max_detections=500 --max_ops_per_custom_ops_allow

Saya juga memodifikasi
export_tflite_ssd_graph.py
flags.DEFINE_integer('max_detections', 500 <--- bukannya 10,
'Jumlah maksimum deteksi (kotak) untuk ditampilkan.')
flags.DEFINE_integer('max_classes_per_detection', 1,
'Jumlah kelas untuk ditampilkan per kotak deteksi.')

tetapi masih memberikan 10 objek sebagai output di android [1,10,4].

ada ide?

Saya juga tertarik dengan solusi masalah @KaviSanth .

Solusi @Stevelb ini seharusnya berfungsi. Anda mungkin ingin memvisualisasikan grafik yang dibekukan untuk memastikan bahwa max_detections disetel dengan benar.

@achowdhery Terima kasih atas balasan Anda. Saya mencoba menjalankan perintah yang ditulis oleh @andrewharp tetapi saya mendapatkan kesalahan berikut. Memang, toco tidak terletak di tempat ini. Saya menggunakan versi master dan versi r1.95 dari repositori github.

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
INFO: ID Panggilan: 0e58a5ef-9fee-4619-b760-aeb1c83c9661
GALAT: Melewati 'tensorflow/contrib/lite/ toco:toco ': tidak ada paket seperti itu 'tensorflow/contrib/lite/toco': file BUILD tidak ditemukan di jalur paket
PERINGATAN: Penguraian pola target gagal.
GALAT: tidak ada paket seperti itu 'tensorflow/contrib/lite/toco': file BUILD tidak ditemukan di jalur paket
INFO: Waktu yang berlalu: 0,179 detik
INFO: 0 proses.
GAGAL: Build TIDAK berhasil diselesaikan (0 paket dimuat)
GAGAL: Build TIDAK berhasil diselesaikan (0 paket dimuat)
Saya harus mengubah bahwa saya menjalankan perintah-perintah itu dari folder tensorflow lokal saya yang ditarik dari git.

Saya dapat menemukan toco di bawah tensorflow/lite/toco dan saya hanya menguji apakah itu berfungsi.
ok, tampaknya berfungsi menggunakan toko ini dan selain itu Anda harus mengubah jalur $DETECT_FB menjadi $PWD/ssd_mobilenet.tflite karena di folder contrib/lite hanya beberapa python yang terletak dan tidak ada yang lain.

Muncul kesalahan runtime saat menambahkan file .tflite di DetectorActivity dari 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) dengan baris

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

E/AndroidRuntime: PENGECUALIAN FATAL: utama
Proses: myProcess, PID: 32611
java.lang.RuntimeException: Gagal menemukan input Node 'image_tensor'
di myPackage.myClass.TensorFlowObjectDetectionAPIModel.create(TensorFlowObjectDetectionAPIModel.java:106)

Apakah tidak mungkin menggunakan model .tflite di aplikasi itu?

@defaultUser3214 Anda menggunakan model pengklasifikasi di aplikasi deteksi. MobileNet v1 adalah model klasifikasi. Silakan gunakan model SSD MobileNet

@achowdhery Terima kasih! Menggunakan model dari wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_coco_2017_11_17.tar.gz menghasilkan kesalahan itu. Tapi saya pikir ini adalah versi ssd?

Tetapi menggunakan ssd_mobilenet_v1_android_export.pb yang dikonversi ke .tflite yang sebelumnya berfungsi sebagai .pb menghasilkan kesalahan yang sama.

@defaultUser3214 Itu versi lama model yang tidak akan berfungsi di aplikasi demo terbaru yang dirilis pada Juli 2018. Silakan unduh model terbaru pada Juli 2018 di kebun binatang model deteksi: mereka berfungsi di aplikasi. Silakan buka edisi baru jika ini masih diblokir.

@SteveIb Anda juga perlu mengubah NUM_DETECTIONS = 500 di TFLiteObjectDetectionAPIModel.java

tidak dapat mengonversi ssdmobilenet v1 .pb ke .tflite
pb dihasilkan melalui api deteksi objek Tensorflow @aselle @achowdhery

Ada kemajuan dalam hal ini? Mencoba mengonversi frozen_inference_graph.pb ke file .TFLITE tetapi mendapatkan kesalahan

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

Untuk deteksi objek kustom di Android. Adakah ide tentang metode konversi yang berbeda? Transfer ssd_mobilenet_v1_pets yang dipelajari di Windows 10 mengikuti tutorial di sini: https://github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10

Ada kemajuan dalam hal ini? Mencoba mengonversi frozen_inference_graph.pb ke file .TFLITE tetapi mendapatkan kesalahan

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

Untuk deteksi objek kustom di Android. Adakah ide tentang metode konversi yang berbeda? Transfer ssd_mobilenet_v1_pets yang dipelajari di Windows 10 mengikuti tutorial di sini: https://github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10

Hanya untuk menindaklanjuti ini dan untuk membantu orang lain yang mengalami kesalahan yang sama - ini disebabkan oleh penggunaan model pos pemeriksaan yang salah untuk dilatih. Untuk bekerja di Android dengan .tflite, model awal harus MobileNet dan juga harus dikuantisasi dan akan memiliki bagian kode ini atau yang serupa di file .config:

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

Sekarang sudah tayang di tensorflow/contrib/lite/examples/android ! Ini adalah port yang lebih lengkap dari demo Android TF asli (hanya kekurangan contoh Stylize), dan akan menggantikan demo lainnya di tensorflow/contrib/lite/java/demo ke depannya.

Flatbuffer TF Lite yang dikonversi dapat ditemukan di mobilenet_ssd_tflite_v1.zip , dan Anda dapat menemukan implementasi inferensi Java di TFLiteObjectDetectionAPIModel.java . Perhatikan bahwa ini berbeda dari implementasi TF asli karena kotak harus didekodekan secara manual di Java, dan file txt sebelumnya harus dikemas dalam aset aplikasi (saya pikir yang termasuk dalam model zip di atas harus valid untuk sebagian besar grafik).

Selama konversi TOCO, node input yang berbeda (Preprocessor/sub) digunakan, serta node output yang berbeda (concat,concat_1). Ini melewatkan beberapa bagian yang bermasalah untuk tflite, hingga grafik direstrukturisasi atau TF Lite mencapai paritas TF.

Berikut adalah langkah cepat untuk mengonversi model SSD MobileNet ke format tflite dan membuat demo untuk menggunakannya:

# 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

Ini bekerja seperti pesona!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat