Zgjidhja e problemeve

Mungon shtegu binare i Python

Mesazhi i gabimit:

ERROR: An error occurred during the fetch of repository 'local_execution_config_python':
  Traceback (most recent call last):
       File "/sandbox_path/external/org_tensorflow/third_party/py/python_configure.bzl", line 208
               get_python_bin(repository_ctx)
    ...
Repository command failed

zakonisht tregon se Bazel nuk arrin të gjejë binarin lokal të Python. Për të zgjidhur këtë problem, së pari gjeni se ku është binar python dhe më pas shtoni --action_env PYTHON_BIN_PATH=<path to python binary> në komandën Bazel. Për shembull, mund të kaloni në përdorimin e binarit të parazgjedhur të sistemit python3 me komandën e mëposhtme:

bazel build -c opt \
  --define MEDIAPIPE_DISABLE_GPU=1 \
  --action_env PYTHON_BIN_PATH=$(which python3) \
  mediapipe/examples/desktop/hello_world

Mungojnë paketat e nevojshme Python

Mesazhi i gabimit:

ImportError: No module named numpy
Is numpy installed?

zakonisht tregon se disa paketa Python nuk janë instaluar. Ju lutemi ekzekutoni pip install ose pip3 install në varësi të versionit tuaj binar të Python për të instaluar ato paketa.

Dështo në marrjen e depove të varësisë në distancë

Mesazhi i gabimit:

ERROR: An error occurred during the fetch of repository 'org_tensorflow':
   java.io.IOException: Error downloading [https://mirror.bazel.build/github.com/tensorflow/tensorflow/archive/77e9ffb9b2bfb1a4f7056e62d84039626923e328.tar.gz, https://github.com/tensorflow/tensorflow/archive/77e9ffb9b2bfb1a4f7056e62d84039626923e328.tar.gz] to /sandbox_path/external/org_tensorflow/77e9ffb9b2bfb1a4f7056e62d84039626923e328.tar.gz: Tried to reconnect at offset 9,944,151 but server didn't support it

or

WARNING: Download from https://storage.googleapis.com/mirror.tensorflow.org/github.com/bazelbuild/rules_swift/releases/download/0.12.1/rules_swift.0.12.1.tar.gz failed: class java.net.ConnectException Connection timed out (Connection timed out)

zakonisht tregon se Bazel nuk arrin të shkarkojë depot e nevojshme të varësisë që i duhen MediaPipe. MediaPipe ka disa depo varësie që strehohen nga sajtet e Google. Në disa rajone, mund t'ju duhet të konfiguroni një përfaqësues të rrjetit ose të përdorni një VPN për të hyrë në ato burime. Mund t'ju duhet gjithashtu të bashkëngjitni --host_jvm_args "-DsocksProxyHost=<ip address> -DsocksProxyPort=<port number>" në komandën Bazel. Shikoni këtë çështje të GitHub për më shumë detaje.

Nëse besoni se nuk është një problem rrjeti, një mundësi tjetër është që disa burime mund të jenë përkohësisht të padisponueshme, ju lutemi ekzekutoni bazel clean --expunge dhe provojeni përsëri më vonë. Nëse ende nuk funksionon, ju lutemi paraqisni një problem GitHub me mesazhin e detajuar të gabimit.

Konfigurimi i gabuar i MediaPipe OpenCV

Mesazhi i gabimit:

error: undefined reference to 'cv::String::deallocate()'
error: undefined reference to 'cv::String::allocate(unsigned long)'
error: undefined reference to 'cv::VideoCapture::VideoCapture(cv::String const&)'
...
error: undefined reference to 'cv::putText(cv::InputOutputArray const&, cv::String const&, cv::Point, int, double, cv::Scalar, int, int, bool)'

zakonisht tregon që OpenCV nuk është konfiguruar siç duhet për MediaPipe. Ju lutemi hidhini një sy seksioneve "Instalo OpenCV dhe FFmpeg" në Instalim për të parë se si të modifikoni skedarët WORKSPACE të MediaPipe dhe linux_opencv/macos_opencv/windows_opencv.BUILD për bibliotekat tuaja lokale opencv. Ky problem i GitHub gjithashtu mund të ndihmojë.

Dështimi i instalimit të pipit të Python

Mesazhi i gabimit:

ERROR: Could not find a version that satisfies the requirement mediapipe
ERROR: No matching distribution found for mediapipe

pas ekzekutimit të pip install mediapipe zakonisht tregon se nuk ka MediaPipe Python të kualifikuar për sistemin tuaj. Ju lutemi vini re se MediaPipe Python PyPI zyrtarisht mbështet versionin 64-bit të Python 3.7 deri në 3.10 në sistemin e mëposhtëm:

  • x86_64 Linux
  • x86_64 macOS 10.15+
  • amd64 Windows

Nëse sistemi operativ aktualisht mbështetet dhe ju ende e shihni këtë gabim, ju lutemi sigurohuni që të dy Python dhe binar pip janë për Python 3.7 deri në 3.10. Përndryshe, ju lutemi merrni parasysh ndërtimin e paketës MediaPipe Python në vend duke ndjekur udhëzimet këtu .

Dështimi i ngarkimit të Python DLL në Windows

Mesazhi i gabimit:

ImportError: DLL load failed: The specified module could not be found

zakonisht tregon se sistemit lokal të Windows i mungojnë paketat e rishpërndarshme të Visual C++ dhe/ose DLL-të e ekzekutimit të Visual C++. Kjo mund të zgjidhet ose duke instaluar vc_redist.x64.exe zyrtare ose duke instaluar paketën Python "msvc-runtime" duke ekzekutuar

$ python -m pip install msvc-runtime

Ju lutemi vini re se paketa Python "msvc-runtime" nuk lëshohet ose mirëmbahet nga Microsoft.

Metoda origjinale nuk u gjet

Mesazhi i gabimit:

java.lang.UnsatisfiedLinkError: No implementation found for void com.google.wick.Wick.nativeWick

zakonisht tregon se një bibliotekë e nevojshme vendase, si p.sh. /libwickjni.so , nuk është ngarkuar ose nuk është përfshirë në varësitë e aplikacionit ose nuk mund të gjendet për ndonjë arsye. Vini re se Java kërkon që çdo bibliotekë vendase të ngarkohet në mënyrë eksplicite duke përdorur funksionin System.loadLibrary .

Nuk u gjet asnjë kalkulator i regjistruar

Mesazhi i gabimit:

No registered object with name: OurNewCalculator; Unable to find Calculator "OurNewCalculator"

zakonisht tregon se OurNewCalculator është referuar me emër në një CalculatorGraphConfig por që objektivi i bibliotekës për OurNewCalculator nuk është lidhur me binarin e aplikacionit. Kur një kalkulator i ri shtohet në një grafik kalkulator, ai kalkulator duhet gjithashtu të shtohet si një varësi e ndërtuar e aplikacioneve duke përdorur grafikun e kalkulatorit.

Ky gabim kapet në kohën e ekzekutimit sepse grafikët e kalkulatorit i referojnë llogaritësit e tyre me emër përmes fushës CalculatorGraphConfig::Node:calculator . Kur biblioteka për një makinë llogaritëse lidhet në një binar aplikacioni, kalkulatori regjistrohet automatikisht me emër përmes makros REGISTER_CALCULATOR duke përdorur bibliotekën registration.h . Vini re se REGISTER_CALCULATOR mund të regjistrojë një kalkulator me një prefiks të hapësirës së emrit, identik me hapësirën e tij të emrave C++. Në këtë rast, grafiku i kalkulatorit duhet gjithashtu të përdorë të njëjtin prefiks të hapësirës së emrit.

Gabim jashtë kujtesës

Memoria rraskapitëse mund të jetë një simptomë e grumbullimit të shumë paketave brenda një grafiku MediaPipe që funksionon. Kjo mund të ndodhë për një sërë arsyesh, si:

  1. Disa kalkulatorë në grafik thjesht nuk mund të mbajnë ritmin me mbërritjen e paketave nga një transmetim i hyrjes në kohë reale, siç është kamera video.
  2. Disa kalkulatorë janë duke pritur për pako që nuk do të arrijnë kurrë.

Për problemin (1), mund të jetë e nevojshme të hidhni disa pako të vjetra në të vjetra për të përpunuar paketat më të fundit. Për disa sugjerime, shihni: How to process realtime input streams .

Për problemin (2), mund të jetë që një rryme hyrëse i mungojnë paketat për ndonjë arsye. Një pajisje ose një kalkulator mund të konfigurohet gabim ose mund të prodhojë paketa vetëm në mënyrë sporadike. Kjo mund të bëjë që kalkulatorët e rrjedhës së poshtme të presin për shumë paketa që nuk do të arrijnë kurrë, gjë që nga ana tjetër bën që paketat të grumbullohen në disa nga rrjedhat e tyre hyrëse. MediaPipe trajton këtë lloj problemi duke përdorur "kufijtë e vulës kohore". Për disa sugjerime, shihni: How to process realtime input streams .

Cilësimi i MediaPipe CalculatorGraphConfig::max_queue_size kufizon numrin e paketave të vendosura në radhë në çdo rrjedhë hyrëse duke frenuar hyrjet në grafik. Për rrjedhat e hyrjes në kohë reale, numri i paketave të vendosura në radhë në një rrjedhë hyrëse duhet të jetë pothuajse gjithmonë zero ose një. Nëse nuk është kështu, mund të shihni mesazhin paralajmërues të mëposhtëm:

Resolved a deadlock by increasing max_queue_size of input stream

Gjithashtu, cilësimi CalculatorGraphConfig::report_deadlock mund të vendoset që të shkaktojë dështimin e ekzekutimit të grafikut dhe të shfaqë bllokimin si një gabim, në mënyrë që max_queue_size të veprojë si kufi i përdorimit të kujtesës.

Grafiku varet

Shumë aplikacione do të thërrasin CalculatorGraph::CloseAllPacketSources dhe CalculatorGraph::WaitUntilDone për të përfunduar ose pezulluar ekzekutimin e një grafiku MediaPipe. Objektivi këtu është të lejojë çdo kalkulator ose paketë në pritje të përfundojë përpunimin dhe më pas të mbyllë grafikun. Nëse gjithçka shkon mirë, çdo transmetim në grafik do të arrijë në Timestamp::Done , dhe çdo kalkulator do të arrijë CalculatorBase::Close dhe më pas CalculatorGraph::WaitUntilDone do të përfundojë me sukses.

Nëse disa kalkulatorë ose transmetime nuk mund të arrijnë gjendjen Timestamp::Done ose CalculatorBase::Close , atëherë metoda CalculatorGraph::Cancel mund të thirret për të përfunduar ekzekutimin e grafikut pa pritur që të plotësohen të gjithë llogaritësit dhe paketat në pritje.

Koha e daljes është e pabarabartë

Disa grafikë MediaPipe në kohë reale prodhojnë një seri kornizash video për t'u parë si një efekt video ose si një video diagnostikues. Ndonjëherë, një grafik MediaPipe do t'i prodhojë këto korniza në grupime, për shembull kur disa korniza dalëse ekstrapolohen nga i njëjti grup kornizash hyrëse. Nëse rezultatet paraqiten ashtu siç prodhohen, disa korniza dalëse zëvendësohen menjëherë nga korniza të mëvonshme në të njëjtin grup, gjë që i bën rezultatet të vështira për t'u parë dhe vlerësuar vizualisht. Në raste të tilla, vizualizimi i daljes mund të përmirësohet duke paraqitur kornizat në intervale të barabarta në kohë reale.

MediaPipe trajton këtë rast përdorimi duke hartuar vulat kohore në pika në kohë reale. Çdo stampë kohore tregon një kohë në mikrosekonda dhe një kalkulator si LiveClockSyncCalculator mund të vonojë daljen e paketave që të përputhen me vulat e tyre kohore. Ky lloj kalkulatori rregullon kohën e daljeve në mënyrë që:

  1. Koha ndërmjet daljeve korrespondon me kohën ndërmjet vulave kohore sa më afër që të jetë e mundur.
  2. Rezultatet prodhohen me vonesën më të vogël të mundshme.

CalculatorGraph mbetet pas hyrjeve

Për shumë grafikë MediaPipe në kohë reale, vonesa e ulët është një objektiv. MediaPipe mbështet përpunimin paralel të stilit "pipelined" në mënyrë që të fillojë përpunimi i çdo pakete sa më shpejt që të jetë e mundur. Normalisht vonesa më e ulët e mundshme është koha totale e kërkuar nga çdo kalkulator përgjatë një "rruge kritike" të kalkulatorëve të njëpasnjëshëm. Vonesa e një grafiku MediaPipe mund të jetë më e keqe se ajo ideale për shkak të vonesave të paraqitura në shfaqjen e kornizave.

Nëse disa nga llogaritësit në grafik nuk mund të mbajnë ritmin me rrjedhat e hyrjes në kohë reale, atëherë vonesa do të vazhdojë të rritet dhe bëhet e nevojshme të hidhen disa paketa hyrëse. Teknika e rekomanduar është përdorimi i kalkulatorëve MediaPipe të krijuar posaçërisht për këtë qëllim, si p.sh. FlowLimiterCalculator siç përshkruhet në How to process realtime input streams .

Monitoroni hyrjet e kalkulatorit dhe shlyerjet e vulave kohore

Korrigjimi i kalkulatorëve MediaPipe shpesh kërkon një kuptim të thellë të rrjedhës së të dhënave dhe sinkronizimit të vulave kohore. Paketat hyrëse në kalkulatorë fillimisht futen në rradhët hyrëse për transmetim për t'u sinkronizuar nga InputStreamHandler i caktuar. Puna e InputStreamHandler është të përcaktojë grupin e paketave hyrëse për një vulë kohore të vendosur, e cila e vendos kalkulatorin në një gjendje "gati", e ndjekur nga aktivizimi i një thirrjeje Calculator:: Process me grupin e caktuar të paketave si hyrje.

DebugInputStreamHandler mund të përdoret për të gjurmuar paketat hyrëse dhe shlyerjet e stampave kohore në kohë reale në daljen LOG(INFO) të aplikacionit. Mund t'u caktohet kalkulatorëve specifikë nëpërmjet input_stream_handler të Calculator's ose grafikisht globalisht nëpërmjet fushës input_stream_handler të CalculatorGraphConfig .

Gjatë ekzekutimit të grafikut, paketat hyrëse gjenerojnë mesazhe LOG të cilat zbulojnë vulën kohore dhe llojin e paketës, të ndjekur nga gjendja aktuale e të gjitha radhëve hyrëse:

[INFO] SomeCalculator: Adding packet (ts:2, type:int) to stream INPUT_B:0:input_b
[INFO] SomeCalculator: INPUT_A:0:input_a num_packets: 0 min_ts: 2
[INFO] SomeCalculator: INPUT_B:0:input_b num_packets: 1 min_ts: 2

Përveç kësaj, ai mundëson monitorimin e ngjarjeve të shlyerjes së vulave kohore (në rast se zbatohet DefaultInputStreamHandler ). Kjo mund të ndihmojë për të zbuluar një rritje të papritur të kufirit të vulës kohore në transmetimet hyrëse që rezulton në një Calculator::Telefonatë përpunohet me një grup të dhënash jo të plota, duke rezultuar në paketa boshe në rrjedhat hyrëse (potencialisht të nevojshme).

Shembull i skenarit:

node {
  calculator: "SomeCalculator"
  input_stream: "INPUT_A:a"
  input_stream: "INPUT_B:b"
  ...
}

Duke pasur parasysh një kalkulator me dy hyrje, marrja e një pakete hyrëse me vulën kohore 1 në transmetimin A e ndjekur nga një paketë hyrëse me vulën kohore 2 në transmetimin B. Kufiri i vulës kohore rritet në 2 në transmetimin B me paketën hyrëse në pritje në transmetimin A në vulën kohore 1. Llogaritësi::Përpunoni thirrjen me një grup të dhënash jo të plotë për vulën kohore 1. Në këtë rast, DefaultInputStreamHandler :

[INFO] SomeCalculator: Filled input set at ts: 1 with MISSING packets in input streams: INPUT_B:0:input_b.

VLOG është miku juaj

MediaPipe përdor VLOG në shumë vende për të regjistruar ngjarje të rëndësishme për qëllime korrigjimi, duke mos ndikuar në performancën nëse regjistrimi nuk është i aktivizuar.

Shihni më shumë rreth VLOGabseil VLOG

Kini parasysh se VLOG mund të jetë e padëshiruar nëse e aktivizoni atë globalisht, p.sh. (duke përdorur flamurin --v ). Zgjidhja --vmodule flamur që lejon që nivele të ndryshme të vendosen për skedarë të ndryshëm burimor.

Në rastet kur --v / --vmodule nuk mund të përdoret (p.sh. ekzekutimi i një aplikacioni Android), MediaPipe ju lejon të vendosni mbivlerësimet e flamujve VLOG --v / --vmodule për qëllime korrigjimi të cilat aplikohen kur krijohet CalculatorGraph .

Anulon:

  • MEDIAPIPE_VLOG_V : përcaktoni dhe jepni vlerën që jepni për --v
  • MEDIAPIPE_VLOG_VMODULE : përcaktoni dhe jepni vlerën që jepni për --vmodule

Ju mund të vendosni zëvendësime duke shtuar: --copt=-DMEDIAPIPE_VLOG_VMODULE=\"*calculator*=5\"

me modelet e dëshiruara të modulit dhe nivelet VLOG (shih më shumë detaje për --vmoduleabseil VLOG ) në komandën tuaj të ndërtimit.

E RËNDËSISHME: kini parasysh se shtimi i sa më sipër në komandën tuaj të ndërtimit do të shkaktojë rindërtimin e të gjithë binarit duke përfshirë varësitë. Pra, duke pasur parasysh se anulimet VLOG ekzistojnë vetëm për qëllime korrigjimi, është më e shpejtë të modifikosh thjesht vlog_overrides.cc duke shtuar MEDIAPIPE_VLOG_V/VMODULE në krye.

Flamuj të pambështetur gjatë ndërtimit

Nëse jeni duke përdorur Clang 18 ose më të vjetër, mund t'ju duhet të çaktivizoni disa optimizime të përpiluesit në backend-in tonë të CPU-së.

Për të çaktivizuar mbështetjen për avxvnniint8 , shtoni sa vijon tek ju .bazelrc :

build --define=xnn_enable_avxvnniint8=false