v5.0.1#
v5.0.1, v5.0.0 üzerine bir bakım sürümüdür — eski sensor modülü csi üzerinde bir Python uyumluluk katmanı hâline gelir, çerçeve arabelleğine yüklenen görüntüler artık kamera çerçeveleri gibi önizlenir, JPEG kodlayıcılar 1 MB çıktı sınırından kurtulur ve taşmayı doğru şekilde işler; ayrıca bir dizi kamera, protokol, ağ ve ML kütüphanesi düzeltmesi içerir. csi modülüne göre yazılmış betikler için geriye dönük uyumsuz API değişikliği getirmez; birkaç davranış değişikliği geriye dönük uyumsuz API değişiklikleri altında listelenmiştir.
Öne çıkanlar#
sensormodülü artıkcsiüzerine kurulu dondurulmuş bir Python modülüdür. İçe aktarıldığında bir kullanımdan kaldırma uyarısı yazdırır;csimodülünün destekleyemediği birkaç fonksiyon artıkOSErroryükseltir. Bkz. sensor modülü değişiklikleri.Yüklenen görüntüler kamera çerçeveleri gibi önizlenir.
copy_to_fb=Trueile çerçeve arabelleğine yerleştirilen bir görüntü (image.Image,image.ImageIO.read(),fir.snapshot(),tof.snapshot()) hemen değil, bir sonraki görüntü çerçeve arabelleğinin üzerine yazdığında — üzerine çizilen her şeyle birlikte — IDE’ye boşaltılır (flush). Bkz. önizleme değişiklikleri.JPEG kodlayıcı revizyonu. 1 MB’lık çıktı arabelleği sınırı kalktı (arabellek boş belleğe göre boyutlandırılır), hem yazılım hem de donanım yollarındaki taşma kesik dosyalar yazmak yerine düzgün işlenir ve sıkıştırılmış bir görüntüyü diğer sıkıştırılmış uzantıyla kaydetmek çöp yazmak yerine hata yükseltir.
Yeni
protocol.poll()veprotocol.CBORChanneliçin altı yeni CBOR widget’ı (text,lineedit,pushbutton,spinbox,radio,waveform).YOLO Pro son işlemcisi, FLIR Lepton 3.1R / UW desteği, IMU toplu (burst) okumaları, OpenMV N6 üzerinde CAN ve ağ yeteneğine sahip bir simülatör hedefi.
Yeni özellikler#
YoloPro— Edge Impulse YOLO Pro nesne tespiti modelleri için yeni bir son işlemci ve biryolo_pro_detector.pyörneği. (f3f150ebd, ea7bbb398)protocol.poll()— USB kesmesi veyapoll_mszamanlayıcısı tarafından sürülmeyen özel aktarımlar için protokol görevinin bir yinelemesini isteğe bağlı olarak çalıştırır. Yığını yeniden başlatmak içinprotocol.init()de yeniden çağrılabilir. (c00c215f9, f849ffb1b)Daha fazla CBOR kanal widget’ı —
protocol.CBORChannel.add()metodunatext(statik dize),lineedit(yazılabilir dize),pushbutton(anlık eylem),spinbox(adımlı sayısal giriş),radio(seçenek grubu) vewaveform(sample_rate,seriesvetypecodeargümanlarına sahip 1B zaman serisi; akıtmak için aralıklı örnek baytlarını atayın) eklendi. (8016d29ba)csi.CUSTOM—csi.CSI.framesize()artık özel bir(w, h)çözünürlüğü ayarlandıktan sonra anonim bir tamsayı yerine kullanılabilir bir sabit döndürür. (af8841654)IMU toplu (burst) okuma —
imu.__read_reg()isteğe bağlı bir yazılabilir arabellek kabul eder ve onu tek bir işlemde ardışık yazmaçlardan doldurur. (244ca480a)FLIR Lepton 3.1R ve Lepton UW, radyometrik kazanç modları dahil olmak üzere Lepton sürücüsü tarafından tanınır. (0fc356632)
Simülatör ağ desteği —
MPS2_AN500QEMU hedefi artık lwIP ve kullanıcı modu bir NIC’e sahiptir;requests,mqttvesensordondurulmuş olarak dahil edilmiştir ve bir ağ birim testi eklenmiştir. (23546dfb1, 61d187305, 15096c3a2)OpenAI uyumlu API örneği —
openai_compatible.pybir JPEG anlık görüntüsü alır ve sahne açıklaması için onu bir chat-completions uç noktasına gönderir. (79033c6aa)SX126x LoRa örnekleri — micropython-lib’in
lora-sx126xsürücüsü (lora-sync/lora-asyncile birlikte), bir SX1261 veya SX1262 modülünü SPI veri yoluna bağlamaya yönelik gönderici/alıcı/ping-pong/görüntü akışı örnekleriyle OpenMV RT1062 aygıt yazılımına donduruldu. Bu, topluluk katkılı bir destektir; OpenMV LoRa donanımı satmaz. (19576e1b1)
Diğer değişiklikler ve iyileştirmeler#
requestskütüphanesinin yeniden yazımı — parçalı aktarım yanıtlarının kodu çözülür, birtimeoutargümanı (varsayılan 5 s) sunulur, JSON ve dize gövdeleri doğru şekilde serileştirilir/kodlanır, başlıklar büyük/küçük harf duyarsız ve durum satırı konuma göre ayrıştırılır, çağıranınheaderssözlüğü kopyalanır (böyleceauthartık sonraki isteklere sızmaz) ve gövde bloklar hâlinde birbytearrayiçine okunur. (889f0b096)mqtt,sslmodülünü tembel (lazy) olarak içe aktarır; bu nedenle modül ve düz (TLS olmayan) bağlantılar SSL desteği olmayan derlemelerde çalışır. (c2e0899e8)JPEG çıktı arabelleği boş belleğe göre boyutlandırılır; sabit 1 MB sınırı kalktı. Kodlayıcılar, görüntü yazılmadan önce arabelleği kodlanmış boyuta kırpar; böylece büyük sensörlerle yüksek kalitede yakalamalar artık başarısız olmaz. (aa1ca6776)
ML son işleme temizliği — sınırlayıcı kutu (bounding box) üretimi Darknet, Edge Impulse ve Ultralytics son işlemcileri arasında standartlaştırıldı ve YOLOv8 çıktısı eşiklemeden sonra transpoze edilerek diğer modeller gibi tespit başına bir satır olarak saklanır. (b5c7853f2, c45f99cad)
PAG7936 güvenli kapatma — yeni bir sensör durdurma bayrağı, RESET/PWDN geçişinden önce PAG7936’yı uyku moduna alır; bu, sensör bir uzatma kablosuyla kullanıldığında yaşanan kilitlenmeleri düzeltir. Sürücü ayrıca MIPI CSI-2 veya paralel yazmaç kümesini derleme zamanında değil, çalışma zamanında sensörün I2C adresinden seçer. (10026530c, f6acf14ec, 5f0251c74)
ImageIOoynatma hız ayarı artık çerçeveler arası aralığı beklerkenWFIiçinde uyumak yerine bekleyen olaylara hizmet verir. (a54790193)MicroPython alt modül güncellemeleri — QEMU portunda tam ağ desteği, STM32’de yedek SRAM/BKP yazmaçları üzerinden
machine.mem_backup, STM32F4’te SDIO donanımsal akış denetiminin devre dışı tutulması ve önbelleğe alınamayan bölgeler için MPU özniteliklerinin yeniden kullanımı. (31ada5626, ab61d27a6, 06bddf13a)differential-translation.pyartık kullanımdan kaldırılansensormodülü yerine kendicsi.CSInesnesi üzerinden yakalama yapar ve örneklerdeki içe aktarma boşlukları normalleştirildi. (68c866e7f, 9ceff4513)
Hata düzeltmeleri#
Kamera ve sensörler:
Art arda iki özel
(w, h)çözünürlüğü ayarlamak sensörü ilk boyutta bırakırkencsi.CSI.width()/height()ikincisini bildiriyordu; “değişiklik yok” hızlı yolu artık özel boyutları hariç tutar. (cfbb70156)csi.CSI.lens_correction(),radivecoefdeğerlerini boolean olarak ayrıştırıyordu; bu nedenle sürücüye geçirilen değerler verilenler değildi. (ab44b3a77)PAG7936: pozlama ve kazancı art arda ayarlamak birbirini eziyordu (ikisi tek bir manuel modu paylaşır ve geri okuma yazmaçları bir çerçeve geriden gelir); sürücü artık manuel yazmaçları yalnızca manuel moda girerken ilklendirir ve yalnızca ayarlanan denetimi yazar. (e7a18c0a0)
OpenMV N6 üzerinde PAG7936 ve PS5520 BAYER yakalama, N6 ISP’si ham Bayer’i yeniden ölçekleyemediğinden tam çözünürlük dışındaki her boyutta “Failed to initialize the CSI interface” hatasıyla başarısız oluyordu. Sensörler artık BAYER için istenen boyutla eşleşen yerel bir modda çalışır (PS5520: VGA, HD, SXGA-M, FHD, QHD, WQXGA2; QVGA’nın yerel modu yoktur ve desteklenmez). (fe6790055, b7622b245)
Görüntü kodlama ve kaydetme:
Yazılım JPEG kodlayıcı: realloc yolu devre dışı olduğundan çıktı arabelleği taşması her zaman ölümcüldü; artık arabelleğin sahibi olduğunda onu (her seferinde boyutunun yarısı kadar) büyütür, bellek tükendiğinde temiz bir şekilde geri çekilir ve sonucu kırpar.
jpeg_write/mjpeg_writeartık başarısız bir kodlamadan sonra arabelleği yazmaz. (28e1110be)Donanımsal JPEG kodlayıcılar (STM32): taşma, ayırma boyutuyla birlikte kısmen kodlanmış bir görüntü döndürüyor ve EOI işareti olmayan kesik dosyalar üretiyordu (ör. alt yarısı boş, kalite 100’de 5 MP’lik bir yakalama). Artık taşmayı bildirir, başarısızlıkta arabelleği serbest bırakır ve başarıda onu kırpar. (22ce9619c)
VC8000 kodlayıcı her istek için sessizce 4:2:0 kroma üretiyordu; 4:2:0 olmayan alt örnekleme artık onu destekleyen donanım codec’ine geri döner. (71f2be7f2)
image.Image.save()ile bir PNG görüntüyü.jpgolarak kaydetmek 1 MB’a kadar ilklendirilmemiş yığın yazıyor, bir JPEG görüntüyü.pngolarak kaydetmek ise boş bir dosya yazıyordu. Her ikisi de artık hata yükseltir; zaten hedef formatta olan bir görüntü yine olduğu gibi kopyalanır. (6c1fdf822)png_writeartık sıkıştırıcının dönüş değerini denetler ve dosyayı oluşturmadan önce sıkıştırır; böylece bir başarısızlık artık geride boş bir dosya bırakmaz. (557f52d66)
Görüntü modülü:
image.Image.get_pixel(), BAYER ve YUV görüntülerdergbtuple=Trueile dönüştürülen pikseli, çağıran tarafından denetlenen bir ofsette bir yığın (stack) yerel değişkeninin ötesine yazıyordu. (13f2a17b6)gif.Gif.add_frame()içindeki erişilemeyen bir Bayer/YUV dönüştürme dalı kaldırıldı; Python API’sinin zaten zorunlu kıldığı gibi yalnızca GRAYSCALE ve RGB565 görüntüler kabul edilir. (f20d99d96)
Protokol:
Tüm yuvalar zaten kullanımdayken dinamik bir kanal kaydetmek sınır dışı bir yazmaya neden oluyordu; kanal kimliği artık önce denetlenir ve ayrılmış kanal kimliklerinin kanal tablosuna sığdığı statik olarak doğrulanır. (68f635d1f)
Dinamik kanal nesneleri kök işaretçilerde yazılımsal sıfırlamadan sağ çıkıyordu; bu nedenle GC, önceki çalıştırmadan kalan bayat yığın bloklarını taramaya devam ediyordu. Tablo artık başlatmada temizlenir. (ef0ebb03b, e23641145)
Portlar:
i.MX RT: yazılımsal sıfırlamada eksik olan CAN ve Encoder sonlandırma (de-initialization) işlemi eklendi. (7cb9d3dc2)
Donanım ve kart desteği#
OpenMV N6 — CAN artık etkin (
machine.CAN). (294f0febd, 91e1c9573)OpenMV AE3 — AE3 Battery Shield üzerindeki microSD soketi için
sdcardSPI sürücüsü dondurulmuş olarak dahil edildi. (a258f4814)OpenMV RT1062 —
lora-sx126x/lora-sync/lora-asyncdondurulmuş olarak dahil edildi (bkz. Yeni özellikler).FLIR Lepton 3.1R / UW — Lepton destekli tüm kartlarda Lepton sürücüsü tarafından tanınır.
PAG7936 — güvenli kapatma durdurması, çalışma zamanında arayüz seçimi, pozlama/kazanç düzeltmesi ve N6 üzerinde BAYER yakalama.
PS5520 — N6 üzerinde yerel boyutlarda BAYER yakalama.
Simülatör (MPS2_AN500) — ağ desteği.
Tüm kartlar —
sensoruyumluluk modülü her kartın manifestosuna donduruldu.
Geriye dönük uyumsuz API değişiklikleri#
v5.0.1, csi veya image API’lerinde geriye dönük uyumsuz hiçbir değişiklik getirmez. v5.0.0 üzerinde çalışan betikler, aşağıdaki davranış değişiklikleriyle birlikte değiştirilmeden çalışır.
sensor modülü (behavior)#
Yerel sensor modülü (modules/py_csi.c) kaldırıldı ve yerine aynı API’yi csi üzerinde uygulayan dondurulmuş bir Python modülü getirildi. Bkz. sensor.
Commit: 5e3d40631
import sensor, terminaleWARNING: The sensor module is deprecated and will be removed in a future release. Please use the csi module instead.yazdırır.Gizli
csi.CSInesnesi içe aktarma sırasında oluşturulur; bu nedenle eksik bir kamera artıksensor.reset()yerineimport sensorsırasında hata yükseltir.csimodülünde eşdeğeri bulunmadığından şu fonksiyonlar artıkOSErroryükseltir:get_fb(),alloc_extra_fb(),dealloc_extra_fb(),set_auto_rotation(),get_auto_rotation(),disable_delays(),disable_full_flush(). (İki*_extra_fbfonksiyonu v5.0.0’da zaten hata yükseltiyordu.) Son ikisi içincsi.CSI(delays=False)/csi.CSI(fflush=False)kullanın.csimodülünün dışa aktarmadığı çerçeve boyutları (QQCIF,QQSIF,QQQQVGA,HQQQQVGA,HQQQVGA,HQQVGA,B64X32,B64X64,B128X64,B128X128,B160X160,B320X320,LCD,QQVGA2) artık özel çözünürlük olarak aktarılan(w, h)tuple’larıdır.get_framesize(), kamera hâlâ o boyuttayken ayarlanan tuple’ı döndürür; böylece sabitlerle eşitlik denetimleri çalışmaya devam eder.ioctl()istekten sonra en fazla dört argüman iletir.sleep()/shutdown()başarısızlıkta önceden olduğu gibiOSErroryükseltir (csiRuntimeErroristisnası dönüştürülür).
csi modülüne geçin — bkz. v5.0.0 geçiş tablosu.
Çerçeve arabelleğine görüntü yükleme (behavior)#
Çerçeve arabelleğine bir görüntü yükleyen fonksiyonlar — copy_to_fb=True ile image.Image, copy_to_fb=True ile image.Image.copy() / image.Image.scale() ve to_* dönüşümleri, copy_to_fb=True ile image.ImageIO.read(), fir.snapshot() ve tof.snapshot() — eskiden yeni görüntüyü IDE önizlemesine hemen gönderiyordu; bu nedenle döndürülen görüntü üzerine çizilen hiçbir şey görülmüyordu. Artık çerçeve arabelleğini beklemede olarak işaretler ve bir sonraki görüntü üzerine yazmadan hemen önce, üzerine çizilen her şeyle birlikte boşaltırlar (flush) — csi.CSI.snapshot() ile aynı davranış.
Commit’ler: 87b6db5ee, 7b1a35c2f, f773c740d
Bir görüntü akışı okuyan döngüler için değişiklik gerekmez ve artık çizimlerini gösterirler. Tek bir görüntü yükleyip duran bir betik onu açıkça boşaltmalıdır (flush):
img = image.Image("example.bmp", copy_to_fb=True)
img.flush() # new: send it to the IDE preview now
time.sleep_ms(1000)
ML kütüphanesi (behavior)#
Yalnızca birlikte gelen son işlemcileri alt sınıflayan veya kopyalayan kodu etkiler. YoloV8 artık model çıktısını eşiklemeden sonra transpoze eder; böylece hayatta kalan tespitler, Darknet ve Edge Impulse son işlemcileriyle uyumlu olarak kutu başına bir sütun (bb[4:, :]) yerine kutu başına bir satır (bb[:, 4:]) olarak saklanır. Genel ((x, y, w, h), score) sonuçları değişmemiştir.
protocol modülü (minor)#
protocol.poll() geri döndü. v5.0.0, protokol görevi zamanlayıcıya taşındığında onu kaldırmıştı; özel aktarımlar için görevi sürmenin açık bir yolu olarak geri geliyor. Başka hiçbir şey değişmedi — onu hiç çağırmayan betikler etkilenmez.
Commit: c00c215f9
Derleme / araçlar (tooling)#
Bunların hiçbiri MicroPython betiklerini etkilemez. py_image.c bölündü; tanımlayıcı nesneler (cascade, keypoints, LBP, keypoint match) py_image_descriptor.c dosyasına, istatistik nesneleri (similarity, statistics, percentile, threshold, histogram) ise py_image_stats.c dosyasına taşındı. imlib kodlayıcı API’si imlib’in geri kalanıyla hizalandı: jpeg_compress / png_compress başarıda 0, hatada -1 döndürür ve jpeg_compress artık realloc argümanını almaz (yeniden boyutlandırma arabellek sahipliğine bağlıdır). OMV_PROTOCOL_MAX_CHANNELS, omv_protocol_channel.h içinde OMV_PROTOCOL_CHANNEL_MAX oldu ve portlar artık başlatmada py_protocol_init0() çağırır. OMV_PAG7936_MIPI_CSI2 kart tanımı kaldırıldı (arayüz çalışma zamanında seçilir). CI bağımlılık güncellemeleri ve boş sürüm değişiklik günlüğü düzeltmesi bunları tamamlar. Çatallar (fork) için önemli ayrıntılar için aygıt yazılımı deposu geçmişine bakın.
Geçiş kontrol listesi#
Hâlâ
import sensorkullanıyor musunuz? Bir uyarıyla birlikte çalışır.csimodülüne geçin (v5.0.0 geçişi);disable_delays/disable_full_flushçağrılarınıcsi.CSI()yapıcı argümanlarıyla değiştirin veget_fb/ otomatik döndürme çağrılarını kaldırın.copy_to_fb=Trueile tek bir görüntü yükleyip onu görmeyi mi bekliyorsunuz? Yüklemeden sonraimg.flush()ekleyin.YOLOv8 son işlemcisini kopyaladınız mı? Eşiklenmiş çıktıyı sütuna göre değil, satıra göre (
bb[:, 4:]) indeksleyin.Bir tuple ayarladıktan sonra
csi0.framesize()ile karşılaştırma mı yapıyorsunuz? Artıkcsi.CUSTOMdöndürür.Geri kalan her şey: yeniden flaşlayın ve çalıştırın.