v5.0.0¶
v5.0.0은 메이저 릴리스입니다. 주요 내용: 재구축된 OpenMV Protocol V2 호스트 링크, 다중 카메라 보드까지 확장되는 클래스 기반 csi 카메라 API, 실행 가능한 시뮬레이터 타깃, MoveNet 단일 포즈 추정, MicroPython 1.28, 그리고 대규모의 카메라, ML, ToF 수정입니다. 또한 다수의 호환성을 깨는 API 변경도 포함되었습니다 — v4.8.1 이후 사용자에게 보이는 모든 변경 사항과 정확한 마이그레이션 방법을 아래에 정리했습니다.
주요 내용¶
OpenMV Protocol V2. 호스트/IDE 링크가 처음부터 다시 구축되었습니다: 프레이밍, 시퀀싱, CRC 검사가 적용되고 stdio, 스트림 미리보기, 사용자 데이터를 위한 다중화 채널을 갖췄습니다. 새로운
protocol모듈을 통해 스크립트가 자체 전송과 데이터 채널을 만들 수 있습니다. protocol 모듈 변경 사항을 참고하세요.클래스 기반
csi카메라 API.import sensor가import csi/csi.CSI로 바뀌었으며, 네이티브 다중 카메라를 지원합니다. csi 마이그레이션을 참고하세요.시뮬레이터 타깃. 펌웨어가 이제 Arm FVP / QEMU 시뮬레이터(MPS2/MPS3)에서 NPU, ROMFS, PSRAM 에뮬레이션을 포함하여 빌드되고 실행됩니다 — 비전 및 ML 스크립트를 하드웨어 연결 없이 실행할 수 있습니다.
MoveNet 포즈 추정. 새로운
MoveNet후처리기와 함께 OpenMV AE3 및 N6에movenet_singlepose_192.tflite모델이 번들로 제공됩니다.MicroPython 1.28 및 ulab 6.12.0, ST Edge AI 4.0 툴링, 그리고 외부화된 OpenMV SDK (빌드 / 툴링 변경 사항 참고).
새로운 기능¶
The
protocolmodule — Python에서 사용자 정의 전송과 데이터 채널을 생성합니다:protocol.init(),protocol.register(),protocol.is_active(), 그리고send_event()를 갖춘protocol.ProtocolChannel클래스, 더불어CHANNEL_FLAG_*및CHANNEL_ID_*상수가 추가되었습니다. 최종protocol.init()시그니처는 protocol 모듈 변경 사항에 문서화되어 있습니다.protocol.CBORChannel— 명명된 필드를 디스플레이 위젯(레이블, depth)과 대화형 컨트롤(토글, 슬라이더, 선택)과 함께 CBOR로 직렬화하는 동결된protocol확장 패키지입니다.호스트 메모리 및 스트림 인트로스펙션 — 새로운
SYS_MEMORY프로토콜 명령이 풀별 런타임 메모리 통계를 IDE에 노출하고, 새로운STREAM_SOURCE스트림 ioctl을 통해 호스트가 다중 카메라 보드에서 어느 카메라가 미리보기에 공급될지 선택할 수 있습니다(프로토콜 버전 1.0.1).다중 카메라 스트리밍 —
csi.CSI는 어느 센서가 IDE 미리보기에 공급될지 선택하는stream=인자를 받습니다. 스트림 프레임 헤더는 이제 EMA로 평활화된 FPS를 담고 있어 IDE가clock.fps()상용구 없이도 프레임 속도를 표시합니다. csi 마이그레이션 및 csi 후속 작업을 참고하세요.GenX320 이벤트 센서 — 새로운 시공간 대비 필터(
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— 17개 관절 COCO 키포인트 배열과 함께((x, y, w, h), score, keypoints)를 반환하는 새로운 MediaPipe 단일 포즈 후처리기(threshold,nms_threshold,nms_sigma키워드 인자)입니다.movenet_singlepose_192.tflite모델과 예제가 AE3 및 N6에 번들로 제공됩니다.ml.utils.draw_predictions()— 새로운 선택적scores=인자가 레이블별 신뢰도를 덧붙이고, 글꼴과 상자 선 두께가 이제 이미지 너비에 맞춰 자동 확대/축소되며, 새로운format="point"모드가 센터포인트/피크 검출기를 위한 중심 마커를 그립니다.The new
display.TVDisplayclass (제네릭ioctl()포함)가 독립형tv모듈을 대체합니다. display 모듈 변경 사항을 참고하세요.A new
find_line_segments()detector (ED-Lines) — 이제 모든 빌드에서 사용 가능하며 새로운threshold=인자가 추가되었습니다. image 모듈 변경 사항을 참고하세요.
기타 변경 및 개선 사항¶
MicroPython이 v4.8.1 기반에서 1.28.0으로 업데이트되었습니다. H5/H7/N6에서 고속 SD 카드 모드, 저전력 모드에서의 AHB5 클러킹, OPENMV_AE3에서 GPIO로 제어 가능한 JTAG 핀이 추가되었습니다.
ulab이 6.12.0으로 업데이트되었습니다 — ndarray에 대한 네이티브
%연산자가 추가되었습니다(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)) 이제 실패하는 대신 프레임 버퍼를 맞게 확장합니다.더 큰 stdio 버퍼 — IDE로의 기본 텍스트 버퍼가 OpenMV 2/3/4, Nicla Vision, AE3, N6에서 512바이트에서 1024바이트로 늘어나, 더 큰
print()버스트가 잘리지 않습니다.더 매끄러운 호스트 이벤트 흐름 — 호스트로의 stdout NOTIFY 이벤트가 링 버퍼 워터마크를 넘는
print()당 하나가 아니라 호스트 읽기당 최대 하나로 조절됩니다.중단 가능한 장시간 작업 — 장시간의 이미지 그리기, GPU(Nema/Dave2D), NPU 대기 루프가 이제 결정론적인 간격으로 이벤트를 처리하므로, 부하가 큰 작업 중에도 스크립트가 IDE의 Stop 버튼에 계속 반응합니다.
버그 수정¶
카메라 및 센서:
find_apriltags()가 더 이상 D-cache/GPU 보드(N6, AE3)에서 결과를 손상시키지 않으며, 이제 AE3에서 동작합니다.픽셀 포맷 전환 후 STM32 N6 ISP의 Bayer 이미지 출력을 수정했습니다.
밝은 장면에서 녹색 자동 화이트 밸런스 블로우아웃과 초기화되지 않은 첫 프레임 AWB 통계 사례를 수정했습니다. 더 넓은 감마/대비/밝기 범위를 위해 STM32 ISP 감마 클램프를 상향(32에서 63)했습니다.
PS5520 자동 노출이 밝은 빛에서 더 이상 진동하지 않습니다. PAG7936 AEC/AGC 동작이 재작업되었습니다(통합 제어, 게인 상한 보정).
Portenta/Nicla에서 OV5640 자동 초점 펌웨어 업로드가 복원되었습니다(MIMXRT I2C SUSPEND 수정).
프레임 속도 제한이 JPEG 캡처와 결합될 때 발생하는 카메라 캡처 데드락을 수정했습니다(STM32).
GenX320
csi.IOCTL_GENX320_READ_EVENTS_RAW읽기가 더 이상 IDE 미리보기를 뒤섞지 않습니다.csi.CSI.ioctl()를 통한 FLIR Leptoncsi.IOCTL_LEPTON_SET_MODE가 이제 단일 인자로 호출될 때 동작합니다.
이미지 처리:
마스크가 제공될 때의
draw_image()/blend()알파 블렌딩을 수정했습니다.1비트(BINARY) PNG 인코딩/디코딩 비트 순서와 1비트에서 그레이스케일로의 디코딩을 수정했습니다.
mjpeg.Mjpeg녹화 길이/FPS 메타데이터를 수정했습니다.스택이 작은 보드(OpenMV M7)에서의 소프트웨어 JPEG 디코드 스택 오버플로를 수정했습니다.
비ARM 호스트(시뮬레이터)에서의 JPEG/PNG 파일 형식 자동 감지를 수정했습니다.
Time-of-Flight:
tof.read_depth()가 더 이상 일시적인 거리 측정 오류에서 예외를 발생시키지 않으며 버스 결함에서 자동으로 복구됩니다. 기본tof.read_depth()/tof.snapshot()타임아웃이 이제 100 ms입니다(tof 변경 사항 참고).VL53L5CX / VL53L8CX 다중 영역 깊이 데이터 손상을 수정했습니다.
ML 및 시스템:
N6에서 추론이 중단될 때 NPU가 올바르게 정리됩니다.
N6에서 딥 슬립 / 대기 모드 깨우기가 복원되었습니다. AE3의 부트로더로 점프 시 멈춤 현상이 수정되었습니다.
소프트 리셋(STM32 Nema GPU) 시의 메모리 누수와 조기에 수거되던 보조 프레임 버퍼를 수정했습니다.
사용자 정의 Python 프로토콜 채널이 이제 소프트 리부팅 후에도 유지되며, USB 전송이 버스 리셋 / 멈춘 엔드포인트에서 복구되고, USB SOF 인터럽트 폭주가 수정되었습니다.
하드웨어 및 보드 지원¶
OpenMV N6 — 이더넷 활성화(유선 네트워킹), NPU AXI SRAM(1.75 MB)이 공유 임시 풀에 병합되어 추론 사이에 더 많은 RAM 확보, 딥 슬립/대기 깨우기, ROMFS에 번들된 TFLite 모델과 Haar 캐스케이드.
OpenMV AE3 — ROMFS에 번들된 모델과 캐스케이드, 펌웨어에 동결된
cbor2.Alif (AE3, N6) — 저전력
machine.RTC깨우기.고해상도 AprilTags — AE3, Arduino Giga, Arduino Portenta H7에서 전체 센서 해상도
find_apriltags().시뮬레이터 타깃 — NPU, ROMFS, PSRAM 에뮬레이션을 갖춘 MPS2_AN500 / MPS3_AN547(Arm FVP / QEMU).
호환성을 깨는 API 변경¶
v4.8.1과 v5.0.0 사이의 사용자에게 보이는 API 변경입니다. 범위: modules/의 Python C 모듈과 scripts/libraries/의 Python 라이브러리.
각 변경에는 영향이 태그로 표시됩니다:
major — 대부분의 스크립트가 수정이 필요합니다.
minor — 좁은 범위의 API. 이를 사용한 스크립트에만 영향을 줍니다.
behavior — 동일한 API, 다른 결과. 튜닝된 스크립트를 다시 확인하세요.
tooling — 소스에서 빌드하거나 다운스트림 포크에만 영향을 줍니다.
변경 사항은 그 순서대로 영향별로 그룹화되어 있습니다 — major가 먼저, 그다음 minor, behavior, tooling. 코드를 포팅하기만 하면 된다면, 끝에 있는 마이그레이션 체크리스트로 건너뛰어 압축된 할 일 목록을 확인하세요. 각 커밋 해시는 GitHub의 해당 diff로 연결됩니다.
sensor가 csi로 대체됨 (major)¶
모든 공식 예제가 import sensor 대신 import csi를 사용하도록 다시 작성되었습니다. 레거시 모듈 수준 함수형 API(sensor.reset(), sensor.set_pixformat(), …)는 클래스 기반 csi.CSI API로 대체되며, 이 API는 여러 카메라(csi0, csi1, …)를 가진 보드로 자연스럽게 확장되고 모든 새 기능(stream= 키워드 인자, 다중 센서 스트리밍, …)에 필수입니다.
sensor qstr은 하위 호환 펌웨어 빌드를 위해 여전히 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()
세터/게터 쌍이 결합된 접근자로 통합됨
새 API에서는 인자 없이 호출된 메서드가 현재 값을 반환하고, 값과 함께 호출되면 그 값을 설정합니다. set_*/get_* 접두사는 사라졌습니다. 메서드 이름도 중복되던 ing 접미사가 빠졌습니다(windowing → window). 새 API 열은 참조 문서로 연결됩니다.
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
직접적인 대응이 없는 함수
|
대신 사용할 것 |
|---|---|
|
|
|
|
|
|
|
|
|
제거됨. |
|
|
New on csi.CSI
csi.CSI(stream=True|False)— 어느 CSI가 미리보기 프레임 버퍼에 공급될지 선택하는 생성 시점 선택자입니다(스냅샷별update=키워드 인자를 대체, csi 후속 작업 참고).csi.CSI(cid=N)/csi.devices()— 둘 이상의 이미지 센서를 가진 보드를 위한 다중 CSI 지원.
image 모듈 — 시그니처 전면 개편 (major)¶
image 모듈은 csi 다음으로 가장 광범위한 API 변경을 겪었습니다 — 그리기 시그니처, 결과 객체, 그리고 여러 검출기가 모두 변경되었습니다.
좌표 인자는 튜플이어야 함
modules/py_image.c가 mp_arg_parse_all 위에 다시 작성되었습니다. 이전에 별개의 x, y, ... 위치 인자를 받던 모든 그리기 / 픽셀 메서드는 이제 그 좌표들을 하나의 튜플로 묶어서 전달해야 합니다.
커밋: d18bbc472, 0c60c94b9 (PR #3061)
이전 |
이후 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
모두 image.Image의 메서드입니다.
결과 객체가 attrtuple로 변환됨
다음 타입들은 이제 MicroPython attrtuple 객체입니다: similarity, statistics, percentile, threshold, line, circle, rect, qrcode, apriltag, datamatrix, barcode, displacement, kptmatch. 괄호 없는 속성 접근이 이제 정식 방식입니다.
커밋: 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은 블롭의 지연 계산 값이나 히스토그램의 인자를 받는 접근자를 표현할 수 없습니다).
find_features haar 파라미터 이름 변경
image.Image.find_features() — scale_factor=가 scale=로 이름이 변경되었습니다.
커밋: be4c5cd73
get_regression — 이제 항상 robust, target_size 추가
image.Image.get_regression()는 이제 항상 robust(Theil-Sen) 회귀를 사용합니다. 기존의 빠른 최소제곱 경로는 제거되었으므로 robust= 키워드도 사라졌습니다 — 예전에 robust=True가 필요하던 것이 이제 유일한 동작입니다. 새로운 target_size=(w, h) 키워드 인자(기본값 (80, 60))는 O(N^2) Theil-Sen 피팅 전에 ROI를 면적 기준으로 축소하여 항상 적절한 이미지 크기에서 실행되게 합니다. 피팅된 선의 끝점은 소스 좌표로 다시 매핑됩니다. 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 검출기가 새로운 구현으로 교체되었습니다. 패밀리 세트가 변경되었습니다:
제거됨 |
추가됨 |
|---|---|
|
|
커밋: e813bada7
csi 모듈 후속 작업 (minor)¶
csi 마이그레이션 위에 추가된 소규모 csi 후속 작업입니다.
snapshot(update=…) 제거됨
csi.CSI.snapshot()의 update 키워드 인자가 사라졌습니다. CSI 장치가 미리보기 프레임 버퍼에 공급하지 않도록 하려면 생성 시점에 옵트아웃하세요:
csi0 = csi.CSI(stream=False) # was: csi0.snapshot(update=False)
csi1.snapshot(blocking=False, image=fir_img) # was: ...(update=False, ...)
framebuffers() expand 인자 제거됨
csi.CSI.framebuffers() — 세 번째 위치 인자(expand)가 사라졌습니다. 시그니처는 이제 framebuffers([count])입니다.
커밋: 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를 발생시킵니다.
커밋: 8a0635e8c
soft_reboot 설정 인자 제거됨
protocol.init() — soft_reboot 인자가 사라졌습니다. 현재 모든 전송이 소프트 리부팅을 견디므로 이 동작은 이제 무조건적입니다.
커밋: 0bf766aa2
display 모듈 (minor)¶
TV 출력이 이제 독립형 tv 모듈 대신 display.TVDisplay 객체를 통해 처리됩니다. display에도 제네릭 ioctl()이 추가되었습니다.
tof 모듈 (behavior)¶
이전과 동일한 API. 기본값과 오류 처리가 변경되었습니다. tof를 참고하세요.
기본 타임아웃 변경됨
tof.read_depth()와 tof.snapshot()(timeout=-1로 호출 시)이 이제 무한정 대기하는 대신 기본값 100 ms입니다. 이전 동작이 필요하면 명시적으로 더 큰 값을 전달하세요.
커밋: b6772b80d
자동 복구
드라이버가 이제 거리 측정/타임아웃 오류 시 I2C 버스와 센서를 하드 리셋합니다. 예제는 더 이상 예외 핸들러에서 tof.reset()을 호출하지 않습니다 — 수동 복구를 수행하던 사용자 코드는 이를 제거해야 합니다(새로운 자동 복구와 충돌합니다).
ML 라이브러리 (behavior)¶
동일한 API, 다른 수치 — 튜닝된 ML 파이프라인을 다시 확인하세요.
전처리가 이제 레터박스 대신 늘이기를 함
Normalization은 이제 image.SCALE_ASPECT_EXPAND(레터박스) 대신 image.SCALE_ASPECT_IGNORE(늘리기)를 사용합니다. NMS 후처리도 독립적인 x/y 스케일링으로 전환되었습니다.
참고
영향. YOLO 스타일 검출기와 키포인트 회귀기는 일반적으로 개선됩니다. BlazeFace, BlazePalm, FaceLandmarks, HandLandmarks 예제는 이제 입력 ROI에 수동 정사각형 크롭이 필요합니다 — 예제 스크립트는 업데이트되었으며, 사용자 정의 코드도 동일하게 해야 합니다.
커밋: 68dc29a33
ml.utils.mod() 헬퍼 제거됨
ulab 6.12.0은 ndarray에 대한 %를 네이티브로 지원합니다. ml.utils에서 mod를 임포트하던 코드는 a % b를 사용해야 합니다.
빌드 / 툴링 (tooling)¶
이 중 어느 것도 MicroPython 스크립트에는 영향을 주지 않습니다. 소스에서 펌웨어를 빌드하려면 이제 외부 OpenMV SDK(1.6.0, 이전에는 in-tree)가 필요합니다. 여러 in-tree 빌드 도구가 제거되었고 N6는 TinyUSB 스택으로 이전되었습니다. 다운스트림 포크는 firmware repository 히스토리를 검토해야 합니다 — 특히 file_open() 시그니처에서 buffered 인자가 제거된 점을 확인하세요.
마이그레이션 체크리스트¶
v5.0.0으로 깔끔하게 포팅하기 위한 일반적인 작업은 다음과 같습니다:
import sensor를import csi; csi0 = csi.CSI()로 교체하고 모든set_*/get_*호출을 해당csi.CSI접근자로 변환하세요(csi 마이그레이션).img.draw_*,get_pixel(),set_pixel()의 좌표 인자를 튜플로 감싸세요(image 모듈 변경 사항).새로운 관용적 형식을 원한다면 attrtuple 결과 접근자에서
()를 제거하거나, attrtuple이 여전히 호출 가능한 접근자를 지원하므로 기존 방식을 그대로 두세요(image 모듈 변경 사항).find_line_segments(),get_regression(), 그리고 모든find_apriltags()패밀리 선택을 점검하세요(image 모듈 변경 사항).protocol.init()호출에서timer_ms→poll_ms로 이름을 바꾸고,protocol.poll()과soft_reboot=를 제거하세요(protocol 모듈 변경 사항).ML 워크플로의 경우: 레터박스 입력이 필요했던 모델을 다시 검토하세요(ML 라이브러리 변경 사항).