Python ikili program yolu eksik
Hata mesajı:
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
genellikle Bazel'in yerel Python ikilisini bulamadığı anlamına gelir. Bu sorunu çözmek için lütfen önce python ikilisinin bulunduğu yeri bulun ve ardından Bazel komutuna --action_env PYTHON_BIN_PATH=<path to python binary>
ekleyin. Örneğin, aşağıdaki komutu kullanarak sistem varsayılan python3 ikilisini kullanmaya geçebilirsiniz:
bazel build -c opt \
--define MEDIAPIPE_DISABLE_GPU=1 \
--action_env PYTHON_BIN_PATH=$(which python3) \
mediapipe/examples/desktop/hello_world
Gerekli Python paketleri eksik
Hata mesajı:
ImportError: No module named numpy
Is numpy installed?
genellikle belirli Python paketlerinin yüklü olmadığını gösterir. Bu paketleri yüklemek için lütfen Python ikili sürümünüze bağlı olarak pip install
veya pip3 install
komutunu çalıştırın.
Uzak bağımlılık depoları getirilemedi
Hata mesajı:
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)
genellikle Bazel'in MediaPipe'in ihtiyaç duyduğu gerekli bağımlılık depolarını indiremediğini gösterir. MediaPipe, Google siteleri tarafından barındırılan çeşitli bağımlılık depolarına sahiptir. Bazı bölgelerde, bu kaynaklara erişmek için bir ağ proxy'si oluşturmanız veya VPN kullanmanız gerekebilir. Bazel komutuna --host_jvm_args "-DsocksProxyHost=<ip address> -DsocksProxyPort=<port number>"
ekleme yapmanız da gerekebilir. Daha fazla bilgi için bu GitHub sorununa bakın.
Bunun bir ağ sorunu olmadığını düşünüyorsanız bazı kaynakların geçici olarak kullanılamaması da söz konusu olabilir. Lütfen bazel clean --expunge
'yi çalıştırıp daha sonra tekrar deneyin. Hâlâ çalışmıyorsa lütfen ayrıntılı hata mesajını ekleyerek GitHub'da sorun bildirin.
Hatalı MediaPipe OpenCV yapılandırması
Hata mesajı:
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)'
genellikle OpenCV'nin MediaPipe için doğru şekilde yapılandırılmadığı anlamına gelir. Yerel opencv kitaplıklarınız için MediaPipe'in WORKSPACE ve linux_opencv/macos_opencv/windows_opencv.BUILD dosyalarını nasıl değiştireceğinizi öğrenmek üzere lütfen Yükleme bölümündeki "OpenCV ve FFmpeg'i yükleme" bölümlerine göz atın. Bu GitHub sorunu da yardımcı olabilir.
Python pip yükleme hatası
Hata mesajı:
ERROR: Could not find a version that satisfies the requirement mediapipe
ERROR: No matching distribution found for mediapipe
çalıştırdıktan sonra pip install mediapipe
genellikle sisteminizde uygun bir MediaPipe Python olmadığını gösterir. MediaPipe Python PyPI'nin, aşağıdaki işletim sistemlerinde Python 3.7 ile 3.10 arasındaki sürümlerin 64 bit sürümünü resmi olarak desteklediğini lütfen unutmayın:
- x86_64 Linux
- x86_64 macOS 10.15 ve üzeri
- amd64 Windows
OS şu anda destekleniyor olsa bile bu hatayı görmeye devam ediyorsanız lütfen hem Python hem de pip ikilisinin Python 3.7 ile 3.10 arasında bir sürüm için olduğundan emin olun. Aksi takdirde, buradaki talimatları uygulayarak MediaPipe Python paketini yerel olarak oluşturabilirsiniz.
Windows'ta Python DLL yükleme hatası
Hata mesajı:
ImportError: DLL load failed: The specified module could not be found
genellikle yerel Windows sisteminde Visual C++ yeniden dağıtılabilir paketlerinin ve/veya Visual C++ çalışma zamanı DLL'lerinin eksik olduğunu gösterir. Bu sorun, resmi vc_redist.x64.exe dosyasını yükleyerek veya "msvc-runtime" Python paketini
$ python -m pip install msvc-runtime
"msvc-runtime" Python paketinin Microsoft tarafından yayınlanmadığını veya bakımı yapılmadığını lütfen unutmayın.
Yerel yöntem bulunamadı
Hata mesajı:
java.lang.UnsatisfiedLinkError: No implementation found for void com.google.wick.Wick.nativeWick
genellikle /libwickjni.so
gibi gerekli bir yerel kitaplığın yüklenmediğini, uygulamanın bağımlılıklarına dahil edilmediğini veya bir nedenle bulunamadığını gösterir. Java'da her yerel kitaplığın System.loadLibrary
işlevi kullanılarak açıkça yüklenmesi gerektiğini unutmayın.
Kayıtlı hesap makinesi bulunamadı
Hata mesajı:
No registered object with name: OurNewCalculator; Unable to find Calculator "OurNewCalculator"
genellikle OurNewCalculator
'e bir CalculatorGraphConfig
içinde adıyla referans verildiğini ancak OurNewCalculator için kitaplık hedefini uygulama ikilisine bağlamadığını gösterir. Bir hesap makinesi grafiğine yeni bir hesap makinesi eklendiğinde, bu hesap makinesi, hesap makinesi grafiğini kullanan uygulamaların derleme bağımlılığı olarak da eklenmelidir.
Hesap makinesi grafikleri, CalculatorGraphConfig::Node:calculator
alanı aracılığıyla hesap makinelerine isme göre referans verdiği için bu hata çalışma zamanında yakalanır.
Bir hesap makinesinin kitaplığı bir uygulama ikilisine bağlandığında, hesap makinesi registration.h
kitaplığını kullanan REGISTER_CALCULATOR
makrosu aracılığıyla otomatik olarak ada göre kaydedilir. REGISTER_CALCULATOR
'ın, C++ ad alanıyla aynı olan bir ad alanı öneki içeren bir hesap makinesi kaydedebileceğini unutmayın. Bu durumda, hesap makinesi grafiği de aynı ad alanı ön ekini kullanmalıdır.
Yetersiz bellek hatası
Bellek tükenmesi, çalışan bir MediaPipe grafiğinde çok fazla paket birikmesinin bir belirtisi olabilir. Bu durum aşağıdakiler gibi çeşitli nedenlerden kaynaklanabilir:
- Grafikteki bazı hesaplayıcılar, video kamera gibi gerçek zamanlı bir giriş akışından gelen paketlerin geliş hızına ayak uyduramaz.
- Bazı hesap makineleri, asla gelmeyecek paketleri bekliyor.
(1) numaralı sorun için, daha yeni paketleri işlemek üzere bazı eski paketleri eski sürümde bırakmak gerekebilir. İpuçları için:
How to process realtime input streams
(2) numaralı sorun, bir giriş akışının bir nedenle paket eksikliğinden kaynaklanabilir. Bir cihaz veya hesap makinesi yanlış yapılandırılmış olabilir ya da paketleri yalnızca ara sıra üretiyor olabilir. Bu durum, yayın sonrası hesaplayıcıların hiçbir zaman gelmeyecek birçok paketi beklemesine neden olabilir. Bu da paketlerin bazı giriş akışlarında birikmesine neden olur. MediaPipe, "zaman damgası sınırları"nı kullanarak bu tür sorunları giderir. İpuçları için:
How to process realtime input streams
MediaPipe ayarı CalculatorGraphConfig::max_queue_size
, grafiğe gelen girişleri kısıtlayarak herhangi bir giriş akışına eklenen paket sayısını sınırlar. Gerçek zamanlı giriş akışlarında, bir giriş akışında sıraya eklenen paket sayısı neredeyse her zaman sıfır veya bir olmalıdır. Aksi takdirde aşağıdaki uyarı mesajını görebilirsiniz:
Resolved a deadlock by increasing max_queue_size of input stream
Ayrıca, CalculatorGraphConfig::report_deadlock
ayarı, grafiğin çalışmasını engelleyecek ve kilitlenmeyi hata olarak gösterecek şekilde ayarlanabilir. Bu durumda max_queue_size, bellek kullanımı sınırı olarak işlev görür.
Grafik donuyor
Birçok uygulama, bir MediaPipe grafiğinin yürütülmesini bitirmek veya askıya almak için CalculatorGraph::CloseAllPacketSources
ve CalculatorGraph::WaitUntilDone
çağrısı yapar. Buradaki amaç, bekleyen hesaplayıcıların veya paketlerin işlemenin tamamlanmasına izin vermek ve ardından grafiği kapatmaktır. Her şey yolunda giderse grafikteki her akış Timestamp::Done
'e, her hesap makinesi CalculatorBase::Close
'e ulaşır ve ardından CalculatorGraph::WaitUntilDone
başarıyla tamamlanır.
Bazı hesaplayıcılar veya akışlar Timestamp::Done
veya CalculatorBase::Close
durumuna ulaşamazsa bekleyen tüm hesaplayıcıların ve paketlerin tamamlanmasını beklemeden grafiğin çalışmasını sonlandırmak için CalculatorGraph::Cancel
yöntemi çağrılabilir.
Çıkış zamanlaması eşit değil
Bazı gerçek zamanlı MediaPipe grafikleri, video efekti veya video teşhisi olarak görüntülemek için bir dizi video karesi oluşturur. Bazen bir MediaPipe grafiği, bu kareleri kümelerde oluşturur. Örneğin, aynı giriş karesi kümesinden birkaç çıkış karesi ekstrapolasyonla elde edildiğinde. Çıktılar üretildikleri şekilde sunulursa bazı çıkış kareleri hemen aynı kümedeki sonraki karelerle değiştirilir. Bu da sonuçların görsel olarak görülmesini ve değerlendirilmesini zorlaştırır. Bu gibi durumlarda, kareler gerçek zamanlı olarak eşit aralıklarla sunularak çıkış görselleştirmesi iyileştirilebilir.
MediaPipe, zaman damgalarını gerçek zamanlı olarak noktalarla eşleyerek bu kullanım alanını ele alır.
Her zaman damgası, mikrosaniye cinsinden bir zamanı belirtir. LiveClockSyncCalculator
gibi bir hesap makinesi, paketlerin çıkışını zaman damgalarıyla eşleşecek şekilde geciktirebilir. Bu tür bir hesap makinesi, çıkışların zamanlamasını şu şekilde ayarlar:
- Çıkışlar arasındaki süre, zaman damgalarının arasındaki süreye mümkün olduğunca yakındır.
- Çıktılar mümkün olan en kısa gecikmeyle üretilir.
CalculatorGraph, girişlerin gerisinde kalıyor
Birçok gerçek zamanlı MediaPipe grafiği için düşük gecikme hedeftir. MediaPipe, her paketin mümkün olduğunca erken işlenmeye başlaması için "boru hattı" tarzı paralel işlemeyi destekler. Normalde mümkün olan en düşük gecikme, art arda gelen hesap makinelerinin "kritik yolu" boyunca her hesap makinesi için gereken toplam süredir. Çıkış zamanlaması eşit değil bölümünde açıklandığı gibi, kareleri eşit aralıklarla görüntülemek için uygulanan gecikmeler nedeniyle MediaPipe grafiğinin gecikmesi idealden daha kötü olabilir.
Grafikteki hesaplayıcılardan bazıları gerçek zamanlı giriş akışlarına ayak uyduramazsa gecikme artmaya devam eder ve bazı giriş paketlerinin atılması gerekir. Önerilen teknik, How to process realtime input streams
bölümünde açıklandığı gibi, bu amaç için özel olarak tasarlanmış MediaPipe hesaplayıcılarını (ör. FlowLimiterCalculator
) kullanmaktır.
Hesaplayıcı girişlerini ve zaman damgalı hesaplaşmaları izleme
MediaPipe hesaplayıcılarında hata ayıklama işlemi genellikle veri akışı ve zaman damgası senkronizasyonu hakkında derin bir bilgi sahibi olmayı gerektirir. Hesaplayıcılara gelen paketler, atanmış InputStreamHandler
tarafından senkronize edilmek üzere önce akış başına giriş sıralarında arabelleğe alınır. InputStreamHandler
işinin amacı, kararlı bir zaman damgası için giriş paketi kümesini belirlemektir. Bu, hesap makinesini "hazır" duruma getirir ve ardından belirlenen paket kümesini giriş olarak kullanan bir Calculator::Process çağrısı tetikler.
DebugInputStreamHandler
, gelen paketleri ve yerleşim zaman damgalarını uygulamanın LOG(INFO) çıkışında gerçek zamanlı olarak izlemek için kullanılabilir. Bu işlev, hesap makinesinin input_stream_handler özelliği aracılığıyla belirli hesap makinelerine veya CalculatorGraphConfig
'nin input_stream_handler alanı aracılığıyla küresel olarak grafiğe atanabilir.
Grafik yürütülürken gelen paketler, paketin zaman damgasını ve türünü gösteren LOG mesajları oluşturur. Ardından tüm giriş sıralarının mevcut durumu gösterilir:
[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
Ayrıca, zaman damgası yerleşim etkinliklerinin izlenmesini sağlar (DefaultInputStreamHandler
uygulandığında). Bu, giriş akışlarında beklenmedik bir zaman damgası sınırı artışı olduğunu ortaya çıkarabilir. Bu da, eksik bir giriş kümesi içeren bir Calculator::Process çağrısına neden olur ve (muhtemelen gerekli olan) giriş akışlarında boş paketlere yol açar.
Örnek senaryo:
node {
calculator: "SomeCalculator"
input_stream: "INPUT_A:a"
input_stream: "INPUT_B:b"
...
}
İki girişi olan bir hesap makinesi düşünün. A akışında 1 zaman damgası içeren bir giriş paketi ve ardından B akışında 2 zaman damgası içeren bir giriş paketi alır. Zaman damgası sınırı, 1. zaman damgasında A akışındaki bekleyen giriş paketiyle B akışında 2'ye yükseldiğinde, 1. zaman damgası için eksik bir giriş kümesiyle Calculator::Process çağrısı tetiklenir. Bu durumda DefaultInputStreamHandler
şu çıkışları verir:
[INFO] SomeCalculator: Filled input set at ts: 1 with MISSING packets in input streams: INPUT_B:0:input_b.
VLOG'lar çok işinize yarar
MediaPipe, hata ayıklama amacıyla önemli etkinlikleri günlüğe kaydetmek için birçok yerde VLOG
'ü kullanır. Günlüğe kaydetme etkinleştirilmemişse performans etkilenmez.
VLOG
ile ilgili daha fazla bilgiyi VLOG
kanalında bulabilirsiniz.
VLOG
'ü küresel olarak etkinleştirirseniz (ör. --v
işaretini kullanarak) spam içerikli olabileceğini unutmayın. Farklı kaynak dosyaları için farklı düzeylerin ayarlanmasına olanak tanıyan çözüm --vmodule
işareti.
--v
/ --vmodule
'ün kullanılamadığı durumlarda (ör.Android uygulaması çalıştırma), MediaPipe, hata ayıklama amacıyla VLOG
--v
/ --vmodule
işareti geçersiz kılmalarını ayarlamanıza olanak tanır. Bu işaretler, CalculatorGraph
oluşturulduğunda uygulanır.
Geçersiz kılmalar:
MEDIAPIPE_VLOG_V
:--v
için sunduğunuz değeri tanımlayın ve sağlayınMEDIAPIPE_VLOG_VMODULE
:--vmodule
için sunduğunuz değeri tanımlayın ve sağlayın
Şunları ekleyerek geçersiz kılma ayarlarını belirleyebilirsiniz:
--copt=-DMEDIAPIPE_VLOG_VMODULE=\"*calculator*=5\"
VLOG
seviyeleri (--vmodule
ile ilgili daha fazla bilgi için abseil VLOG
bölümüne bakın) ekleyin.
ÖNEMLİ: Yukarıdakileri derleme komutunuza eklemenizin, bağımlılıklar da dahil olmak üzere tüm ikili dosyanın yeniden derlenmesini tetikleyeceğini unutmayın. Bu nedenle, VLOG
geçersiz kılmalarının yalnızca hata ayıklama amacıyla mevcut olduğu göz önüne alındığında, en üstte MEDIAPIPE_VLOG_V/VMODULE
ekleyerek vlog_overrides.cc
dosyasını değiştirmek daha hızlıdır.
Derleme sırasında desteklenmeyen işaretler
Clang 18 veya daha eski bir sürümü kullanıyorsanız CPU arka uç sistemimizdeki bazı derleyici optimizasyonlarını devre dışı bırakmanız gerekebilir.
avxvnniint8
desteğini devre dışı bırakmak için .bazelrc
dosyanıza aşağıdakileri ekleyin:
build --define=xnn_enable_avxvnniint8=false