v5.0.0¶
v5.0.0 היא מהדורה ראשית. בראש הרשימה: קישור המארח OpenMV Protocol V2 שנבנה מחדש, API מצלמה מבוסס-מחלקה csi שמתאים גם ללוחות מרובי-מצלמות, יעד simulator הניתן להרצה, הערכת תנוחה יחידה של MoveNet, MicroPython 1.28, ואצווה גדולה של תיקונים למצלמה, ל-ML ול-ToF. היא גם כוללת מספר שינויי API שוברי-תאימות — כל שינוי הנראה למשתמש מאז v4.8.1 מפורט להלן, יחד עם אופן ההגירה המדויק.
עיקרי הדברים¶
OpenMV Protocol V2. קישור המארח/IDE נבנה מחדש מהיסוד: ממוסגר, ממוספר, מאומת ב-CRC, עם ערוצים מרובבים עבור stdio, תצוגת התצוגה המקדימה של הזרם, ונתוני משתמש. מודול
protocolחדש מאפשר לסקריפטים ליצור תעבורות וערוצי נתונים משלהם. ראו את שינויי מודול הפרוטוקול.API מצלמה
csiמבוסס-מחלקה.import sensorהופך ל-import csi/csi.CSI, עם תמיכה מובנית במצלמות מרובות. ראו את הגירת csi.יעד simulator. הקושחה נבנית ורצה כעת תחת הסימולטור Arm FVP / QEMU (MPS2/MPS3), כולל הדמיית NPU, ROMFS ו-PSRAM — סקריפטי ראייה ו-ML יכולים לרוץ ללא חומרה מחוברת.
הערכת תנוחה של MoveNet. מעבד-אחרי חדש
MoveNetבתוספת מודלmovenet_singlepose_192.tfliteמצורף על OpenMV AE3 ו-N6.MicroPython 1.28 ו-ulab 6.12.0, כלי ST Edge AI 4.0, וה-OpenMV SDK המוצא החוצה (ראו את שינויי הבנייה / הכלים).
תכונות חדשות¶
מודול
protocol— יצירת תעבורות וערוצי נתונים מותאמים מתוך Python:protocol.init(),protocol.register(),protocol.is_active(), ומחלקהprotocol.ProtocolChannelעםsend_event(), בתוספת קבועיםCHANNEL_FLAG_*ו-CHANNEL_ID_*. החתימה הסופית שלprotocol.init()מתועדת בשינויי מודול הפרוטוקול.protocol.CBORChannel— חבילת הרחבה קפואה שלprotocolהמסדרת שדות בעלי שם ל-CBOR עם רכיבי תצוגה (label, depth) ובקרות אינטראקטיביות (toggle, slider, select).זיכרון מארח והתבוננות בזרם — פקודת פרוטוקול
SYS_MEMORYחדשה חושפת ל-IDE סטטיסטיקות זיכרון זמן-ריצה לכל מאגר, ו-ioctl זרם חדשSTREAM_SOURCEמאפשר למארח לבחור איזו מצלמה מזינה את התצוגה המקדימה בלוחות מרובי-מצלמות (גרסת פרוטוקול 1.0.1).הזרמה מרובת-מצלמות —
csi.CSIמקבל ארגומנטstream=הבוחר איזה חיישן מזין את התצוגה המקדימה של ה-IDE; כותרת פריים הזרם נושאת כעת FPS מוחלק ב-EMA כך שה-IDE מציג את קצב הפריימים ללא קוד תבנית שלclock.fps(). ראו את הגירת csi ואת המשכי csi.חיישן אירועים GenX320 — מסנן Spatio-Temporal Contrast חדש (
csi.IOCTL_GENX320_SET_STCעם המצביםcsi.GENX320_STC_DISABLE,csi.GENX320_STC_ONLY,csi.GENX320_STC_TRAIL_ONLYו-csi.GENX320_STC_TRAIL) וקריאת אירועים גולמית (csi.IOCTL_GENX320_READ_EVENTS_RAW), עם סקריפטי דוגמה חדשים.MoveNet— מעבד-אחרי MediaPipe חדש לתנוחה יחידה (ארגומנטיםthreshold,nms_threshold,nms_sigma) המחזיר((x, y, w, h), score, keypoints)עם מערך נקודות מפתח COCO בן 17 מפרקים; מודלmovenet_singlepose_192.tfliteודוגמה מצורפים על AE3 ו-N6.ml.utils.draw_predictions()— ארגומנט אופציונלי חדשscores=מצרף ביטחון לכל תווית, הגופן ועובי המסגרת מתאימים כעת אוטומטית לרוחב התמונה, ומצב חדשformat="point"מצייר סמן מרכז עבור גלאי centerpoint/peak.מחלקת
display.TVDisplayהחדשה (עםioctl()גנרי) מחליפה את מודולtvהעצמאי. ראו את שינויי מודול התצוגה.גלאי
find_line_segments()חדש (ED-Lines) — זמין כעת בכל הבנייות, עם ארגומנטthreshold=חדש. ראו את שינויי מודול image.
שינויים ושיפורים נוספים¶
MicroPython עודכן ל-1.28.0 מבסיס v4.8.1. מוסיף מצב כרטיס SD מהיר על H5/H7/N6, שעון AHB5 במצב חסכון-בחשמל, ופיני JTAG הניתנים לשליטה כ-GPIOs על OPENMV_AE3.
ulab עודכן ל-6.12.0 — אופרטור
%מובנה על ndarrays (הפונקציה העוזרתml.utils.mod()הוסרה; ראו את שינויי ספריית ה-ML).כלי ST Edge AI עודכנו ל-4.0 — משפיעים על קומפילציה ופריסה של מודלי ST על המכשיר.
ml.Model— ארגומנט מילת-המפתחload_to_fbהוסר; זיכרון המודל מנוהל אוטומטית על ידי המקצה המאוחד.image.Image.scale()במקום — הגדלת תמונה במקום (לדוגמהimg.scale(x_scale=2.0, y_scale=2.0)) מגדילה כעת את חוצץ הפריימים (frame buffer) כדי להתאים במקום להיכשל.חוצץ stdio גדול יותר — חוצץ הטקסט (buffer) המוגדר כברירת מחדל ל-IDE גדל מ-512 ל-1024 בתים על OpenMV 2/3/4, Nicla Vision, AE3 ו-N6, כך שמקבצי
print()גדולים יותר אינם נחתכים.זרימת אירועי מארח חלקה יותר — אירועי NOTIFY של stdout למארח מווסתים לכל היותר לאחד לכל קריאת מארח במקום אחד לכל
print()החוצה את סף החוצץ המעגלי (buffer).פעולות ארוכות הניתנות להפסקה — לולאות המתנה ארוכות של ציור תמונה, GPU (Nema/Dave2D), ו-NPU משרתות כעת אירועים במרווח דטרמיניסטי, כך שסקריפטים נשארים מגיבים לכפתור Stop של ה-IDE במהלך עבודה כבדה.
תיקוני באגים¶
מצלמה וחיישנים:
find_apriltags()כבר אינו משבש תוצאות על לוחות D-cache/GPU (N6, AE3), וכעת עובד על ה-AE3.תוקן פלט תמונת Bayer מ-ISP של STM32 N6 לאחר החלפת פורמטי פיקסל.
תוקנה זליגה ירוקה של איזון-לבן-אוטומטי בסצנות בהירות ומקרה של סטטיסטיקות AWB לא-מאותחלות בפריים הראשון; הוגבל clamp של גמא ב-ISP של STM32 (32 ל-63) לטווח רחב יותר של גמא/ניגודיות/בהירות.
חשיפה-אוטומטית של PS5520 כבר אינה מתנדנדת באור בהיר; התנהגות AEC/AGC של PAG7936 עוצבה מחדש (בקרה משולבת, תקרת הגבר (gain) מתוקנת).
העלאת קושחת מיקוד-אוטומטי של OV5640 שוחזרה על Portenta/Nicla (תיקון MIMXRT I2C SUSPEND).
תוקן קיפאון לכידת מצלמה כאשר מגבלת קצב-פריימים משולבת עם לכידת JPEG (STM32).
קריאות
csi.IOCTL_GENX320_READ_EVENTS_RAWשל GenX320 כבר אינן מערבבות את התצוגה המקדימה של ה-IDE.csi.IOCTL_LEPTON_SET_MODEשל FLIR Lepton דרךcsi.CSI.ioctl()עובד כעת כאשר הוא נקרא עם ארגומנט יחיד.
עיבוד תמונה:
תוקן מיזוג אלפא של
draw_image()/blend()כאשר מסופקת מסכה.תוקן סדר ביטים של קידוד/פענוח PNG בן 1-ביט (BINARY) ופענוח גווני-אפור-מ-1-ביט.
תוקנו מטא-נתוני משך/FPS של הקלטת
mjpeg.Mjpeg.תוקן גלישת מחסנית של פענוח-JPEG-תוכנתי על לוחות בעלי מחסנית קטנה (OpenMV M7).
תוקן זיהוי-אוטומטי של פורמט קבצי JPEG/PNG על מארחים שאינם ARM (simulator).
Time-of-Flight:
tof.read_depth()כבר אינו מעלה חריגה על שגיאות טווח חולפות ומשתקם אוטומטית מתקלות אפיק; ברירת המחדל של פסק-הזמן שלtof.read_depth()/tof.snapshot()היא כעת 100 ms (ראו את שינויי tof).תוקן שיבוש נתוני עומק מרובי-אזורים של VL53L5CX / VL53L8CX.
ML ומערכת:
ה-NPU מנוקה כראוי כאשר ההסקה מופסקת על ה-N6.
התעוררות מ-deep-sleep / standby שוחזרה על ה-N6; קיפאון הקפיצה-למאתחל (bootloader) של ה-AE3 תוקן.
תוקנו דליפות זיכרון באיפוס-רך (STM32 Nema GPU) וחוצץ פריימים (frame buffer) עזר שנאסף בטרם עת.
ערוצי פרוטוקול מותאמים של Python שורדים כעת איתחול-רך, תעבורת ה-USB משתקמת מאיפוס אפיק / נקודות-קצה תקועות, והצפת פסיקות USB SOF תוקנה.
תמיכת חומרה ולוחות¶
OpenMV N6 — Ethernet מאופשר (רישות קווי); NPU AXI SRAM (1.75 MB) מוזג למאגר חולף משותף ליותר RAM בין הסקות; התעוררות מ-deep-sleep/standby; מודלי TFLite ומפלי Haar מצורפים ב-ROMFS.
OpenMV AE3 — מודלים ומפלים מצורפים ב-ROMFS;
cbor2קפוא לתוך הקושחה.Alif (AE3, N6) — התעוררות
machine.RTCחסכונית-בחשמל.AprilTags ברזולוציה גבוהה —
find_apriltags()ברזולוציית-חיישן-מלאה על ה-AE3, Arduino Giga ו-Arduino Portenta H7.יעדי simulator — MPS2_AN500 / MPS3_AN547 (Arm FVP / QEMU), עם הדמיית NPU, ROMFS ו-PSRAM.
שינויי API שוברי-תאימות¶
שבירות API הנראות למשתמש בין v4.8.1 ל-v5.0.0. היקף: מודולי C של Python ב-modules/ וספריות Python ב-scripts/libraries/.
כל שינוי מתויג בהשפעתו:
major — רוב הסקריפטים זקוקים לעריכות.
minor — API צר; משפיע רק על סקריפטים שהשתמשו בו.
behavior — אותו API, תוצאות שונות; בדקו מחדש סקריפטים מכוונים.
tooling — משפיע רק על בנייה ממקור / forks במורד הזרם.
השינויים מקובצים לפי השפעה בסדר הזה — major תחילה, אחר כך minor, behavior ו-tooling. אם אתם רק רוצים להעביר את הקוד, קפצו לרשימת ההגירה בסוף לקבלת רשימת מטלות מקוצרת. כל hash של commit מקושר ל-diff שלו ב-GitHub.
sensor הוחלף ב-csi (major)¶
כל דוגמה רשמית נכתבה מחדש כדי לזנוח את import sensor לטובת import csi. ה-API הפונקציונלי הישן ברמת המודול (sensor.reset(), sensor.set_pixformat(), …) מוחלף על ידי ה-API מבוסס-המחלקה csi.CSI, המתאים באופן טבעי ללוחות עם מצלמות מרובות (csi0, csi1, …) ונדרש לכל התכונות החדשות (הארגומנט stream=, הזרמה מרובת-חיישנים, …).
ה-qstr sensor עדיין מחובר ב-modules/py_csi.c עבור בנייות קושחה תואמות-לאחור, אך הוא לא יקבל תכונות חדשות, וכל הדוגמאות, התיעוד וקוד הספריות מניחים כעת csi.
ממודול למחלקה
לפני (sensor):
import sensor
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)
img = sensor.snapshot()
אחרי (csi):
import csi
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QVGA)
csi0.snapshot(time=2000)
img = csi0.snapshot()
זוגות setter/getter כווצו לפונקציות גישה משולבות
ב-API החדש מתודה הנקראת ללא ארגומנטים מחזירה את הערך הנוכחי; הנקראת עם ערך מגדירה אותו. הקידומות set_*/get_* נעלמו. שמות מתודות גם איבדו את הסיומת ing היכן שהייתה מיותרת (windowing → window). העמודה של ה-API החדש מקושרת לתיעוד הייחוס.
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
פונקציות ללא מקבילה ישירה
|
במה להשתמש במקום |
|---|---|
|
|
|
|
|
הועברו לבנאי |
|
|
|
הוסר. התמונה המוחזרת על ידי |
|
|
חדש ב- csi.CSI
csi.CSI(stream=True|False)— בורר בזמן-בנייה הבוחר איזה CSI מזין את חוצץ הפריימים של התצוגה המקדימה (מחליף את הארגומנטupdate=לכל-snapshot, ראו את המשכי csi).csi.CSI(cid=N)/csi.devices()— תמיכה במספר CSI עבור לוחות עם יותר מחיישן תמונה אחד.
מודול image — שיפוץ חתימות (major)¶
מודול image ראה את שינוי ה-API הרחב ביותר אחרי csi — חתימות ציור, אובייקטי תוצאה ומספר גלאים השתנו כולם.
ארגומנטי קואורדינטות חייבים להיות tuples
modules/py_image.c נכתב מחדש מעל mp_arg_parse_all. כל מתודות הציור / הפיקסל שקיבלו בעבר ארגומנטים מיקומיים נפרדים x, y, ... דורשות כעת את הקואורדינטות הללו ארוזות ל-tuple יחיד.
Commits: d18bbc472, 0c60c94b9 (PR #3061)
לפני |
אחרי |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
כולן מתודות של image.Image.
אובייקטי תוצאה הומרו ל-attrtuple
סוגים אלה הם כעת אובייקטי attrtuple של MicroPython: similarity, statistics, percentile, threshold, line, circle, rect, qrcode, apriltag, datamatrix, barcode, displacement, kptmatch. גישה לתכונה ללא סוגריים היא כעת הקנונית.
Commit: 3399d302e
לפני (בסגנון-מתודה):
img.draw_cross(match.cx(), match.cy())
img.draw_rectangle(blob.rect())
אחרי (בסגנון-תכונה):
img.draw_cross((match.cx, match.cy))
img.draw_rectangle(blob.rect)
blob ו-histogram ללא שינוי — הם שומרים על הסוגים הקיימים שלהם ועל פונקציות הגישה () (attrtuple אינו יכול לבטא את הערכים המחושבים-בעצלתיים של רכיב (blob) או את פונקציות הגישה מקבלות-הארגומנטים של היסטוגרמה).
שינוי שם פרמטר haar של find_features
image.Image.find_features() — scale_factor= שונה שמו ל-scale=.
Commit: be4c5cd73
get_regression — כעת תמיד עמיד, נוסף target_size
image.Image.get_regression() משתמש כעת תמיד ברגרסיה העמידה (Theil-Sen). מסלול ה-least-squares המהיר הישן הוסר, כך שמילת המפתח robust= נעלמה — מה שדרש בעבר robust=True הוא כעת ההתנהגות היחידה. ארגומנט חדש target_size=(w, h) (ברירת מחדל (80, 60)) מקטין בקנה-מידה-שטח את אזור העניין (ROI) לפני התאמת ה-Theil-Sen בסדר O(N^2) כך שהוא תמיד רץ על גודל תמונה הגיוני; נקודות הקצה של הקו המותאם ממופות חזרה לקואורדינטות המקור. הדוגמה linear_regression_robust.py נמחקה ו-linear_regression_fast.py שונה שמו ל-linear_regression.py.
find_line_segments — אלגוריתם חדש
image.Image.find_line_segments() — גלאי ה-LSD הישן הוחלף ב-ED-Lines, והוא קיבל ארגומנט חדש threshold=50. הפלט של סקריפטים שכוונו בעבר יהיה שונה.
ספריית AprilTag הוחלפה
image.Image.find_apriltags() — גלאי ה-AprilTag הוחלף במימוש חדש. קבוצת המשפחות השתנתה:
הוסר |
נוסף |
|---|---|
|
|
Commit: e813bada7
המשך מודול csi (minor)¶
המשכים קטנים יותר של csi מעל הגירת csi.
snapshot(update=…) הוסר
הארגומנט update ב-csi.CSI.snapshot() נעלם. כדי למנוע ממכשיר CSI להזין את חוצץ הפריימים של התצוגה המקדימה, בטלו את ההצטרפות בזמן הבנייה:
csi0 = csi.CSI(stream=False) # was: csi0.snapshot(update=False)
csi1.snapshot(blocking=False, image=fir_img) # was: ...(update=False, ...)
ארגומנט expand של framebuffers() הוסר
csi.CSI.framebuffers() — הארגומנט המיקומי השלישי (expand) נעלם; החתימה היא כעת framebuffers([count]).
Commit: 86cb3a5de
מודול protocol (minor)¶
משפיע רק על סקריפטים שהפעילו את קישור המארח ישירות. ראו protocol.
timer_ms שונה שמו ל-poll_ms
protocol.init() — הארגומנט timer_ms שונה שמו ל-poll_ms.
protocol.init(..., poll_ms=10) # was: timer_ms=10
protocol.poll() הוסר
משימת הפרוטוקול מתוזמנת כעת באופן פנימי. קריאות ל-protocol.poll() יעלו AttributeError.
Commit: 8a0635e8c
ארגומנט התצורה soft_reboot הוסר
protocol.init() — הארגומנט soft_reboot נעלם. כל התעבורות הנוכחיות סובלניות לאיתחולים-רכים, כך שההתנהגות היא כעת ללא תנאי.
Commit: 0bf766aa2
מודולי display (minor)¶
פלט TV עובר כעת דרך אובייקט display.TVDisplay במקום מודול tv העצמאי. display גם קיבל ioctl() גנרי.
מודול tof (behavior)¶
אותו API כמו קודם; ברירות המחדל וטיפול השגיאות השתנו. ראו tof.
פסק-הזמן ברירת המחדל השתנה
tof.read_depth() ו-tof.snapshot() (הנקראים עם timeout=-1) מוגדרים כעת כברירת מחדל ל-100 ms במקום להמתין ללא הגבלה. העבירו ערך גדול יותר במפורש אם אתם זקוקים להתנהגות הישנה.
Commit: b6772b80d
שחזור אוטומטי
מנהל ההתקן מבצע כעת איפוס-קשיח לאפיק I2C ולחיישן בשגיאות טווח/פסק-זמן. הדוגמאות כבר אינן קוראות ל-tof.reset() במטפלי החריגות שלהן — קוד משתמש שביצע שחזור ידני צריך להסיר אותו (הוא ייאבק בשחזור-האוטומטי החדש).
ספריית ML (behavior)¶
אותו API, מספרים שונים — בדקו מחדש כל צינור ML מכוון.
עיבוד מקדים מותח כעת במקום letterbox
Normalization משתמש כעת ב-image.SCALE_ASPECT_IGNORE (מתיחה) במקום image.SCALE_ASPECT_EXPAND (letterbox). עיבוד-האחרי NMS עבר גם הוא לקנה-מידה x/y בלתי-תלוי.
הערה
השפעה. גלאים בסגנון YOLO ורגרסורי נקודות מפתח משתפרים בדרך כלל. הדוגמאות BlazeFace, BlazePalm, FaceLandmarks ו-HandLandmarks דורשות כעת חיתוך ריבועי ידני על אזור העניין (ROI) של הקלט — סקריפטי הדוגמה עודכנו; קוד משתמש מותאם חייב לעשות את אותו הדבר.
Commit: 68dc29a33
הפונקציה העוזרת ml.utils.mod() הוסרה
ulab 6.12.0 תומך ב-% על ndarrays באופן מובנה. קוד שייבא mod מ-ml.utils חייב להשתמש ב-a % b.
בנייה / כלים (tooling)¶
אף אחד מאלה אינו משפיע על סקריפטי MicroPython. בניית קושחה ממקור דורשת כעת את ה-OpenMV SDK החיצוני (1.6.0, קודם בתוך-העץ). מספר כלי בנייה בתוך-העץ הוסרו וה-N6 עבר למחסנית TinyUSB; forks במורד הזרם צריכים לסקור את היסטוריית מאגר הקושחה — בייחוד את חתימת file_open() שזנחה את הארגומנט buffered שלה.
רשימת הגירה¶
להעברה נקייה ל-v5.0.0 העבודה הטיפוסית היא:
החליפו
import sensorב-import csi; csi0 = csi.CSI()ותרגמו כל קריאתset_*/get_*לפונקציית הגישה המתאימה שלcsi.CSI(הגירת csi).עטפו ב-tuples ארגומנטי קואורדינטות ל-
img.draw_*,get_pixel()ו-set_pixel()(שינויי מודול image).השמיטו את
()מפונקציות גישה לתוצאות attrtuple אם אתם רוצים את הצורה האידיומטית החדשה, או השאירו את הסגנון הישן כפי שהוא מכיוון ש-attrtuples עדיין תומכים בפונקציות גישה הניתנות לקריאה (שינויי מודול image).בדקו את
find_line_segments(),get_regression(), וכל בחירת משפחתfind_apriltags()(שינויי מודול image).שנו שם
timer_ms→poll_msבקריאותprotocol.init(); הסירו אתprotocol.poll()ואתsoft_reboot=(שינויי מודול הפרוטוקול).עבור זרימות עבודה של ML: שובו ובדקו כל מודל שהצריך קלט letterbox (שינויי ספריית ה-ML).