v4.8.0

v4.8.0은 주요 기능 릴리스입니다. 핵심 내용으로는 다중 카메라를 지원하는 완전히 새로운 클래스 기반 csi 카메라 모듈, Neural-ART NPU를 탑재한 OpenMV N6(STM32N6) 보드, NPU 추론 백엔드, GenX320 이벤트 카메라 RAW 이벤트 모드, 새로운 crc 모듈, 재구성된 ML 후처리 라이브러리, 그리고 MicroPython 1.26이 있습니다. 또한 buzzer 모듈과 fir 모듈의 FLIR Lepton 제어 등 몇 가지 레거시 API가 제거되었으니, 아래의 호환성에 영향을 주는 변경 사항을 읽어 보세요.

주요 사항

  • 새로운 csi 카메라 모듈. 여러 대의 카메라를 동시에 지원하는 클래스 기반 csi.CSI API로, 레거시 sensor 모듈과 함께 도입되었습니다.

  • OpenMV N6. Neural-ART NPU, 트리플 버퍼링, Soft-CSI, ToF 모듈을 갖춘 STM32N6 보드.

  • NPU 추론. 하드웨어 가속 모델 추론을 위한 ST Neural-ART(STAI) 백엔드.

  • GenX320 이벤트 모드. RAW 이벤트 출력과 이벤트 카메라 렌더링을 위한 draw_event_histogram().

  • 재구성된 ML 후처리 — 새로운 BlazeFace / BlazePalm / 손 및 얼굴 랜드마크 검출기를 포함한 벤더별 하위 패키지(ml.postprocessing.ultralytics, mediapipe, edgeimpulse, darknet).

  • 새로운 crc 모듈 — 하드웨어 가속 CRC-16 / CRC-32.

  • MicroPython이 1.26.0으로 업데이트되었습니다.

  • 호환성 변경: buzzer 모듈과 fir 모듈의 Lepton 제어가 제거되었습니다(Lepton은 이제 일반 카메라입니다). fir/Lepton 변경 사항buzzer 제거을 참조하세요.

새로운 기능

  • 새로운 csi 카메라 모듈 — 여러 대의 카메라를 동시에 지원하고(N6에서는 최대 3대), 논블로킹 스냅샷, 사용자 지정 (w, h) 프레임 크기, 유용한 print() / repr을 갖춘 클래스 기반 csi.CSI 객체입니다. 레거시 sensor 모듈과 함께 도입되었습니다(대체재가 아님).

  • crc — OpenMV N6와 AE3에서 소프트웨어 폴백과 함께 하드웨어 가속되는 crc.crc16()crc.crc32().

  • image.Image.draw_image()transform= 키워드가 추가되었습니다(아핀/원근 워프를 위한 2차원 부동소수점 ndarray 행렬로, STM32와 Alif에서 GPU 가속됨). 동일한 변환을 이미지 변환에서도 사용할 수 있습니다.

  • draw_event_histogram() — 이벤트 카메라 히스토그램을 렌더링합니다.

  • GenX320 RAW 이벤트 모드csi.GENX320_MODE_HISTO / csi.GENX320_MODE_EVENT를 사용하는 csi.IOCTL_GENX320_SET_MODE, csi.IOCTL_GENX320_READ_EVENTS, csi.IOCTL_GENX320_CALIBRATE, 이벤트 유형 상수, 그리고 새로운 예제 스크립트.

  • ML — ST Neural-ART(STAI) NPU 추론 백엔드; ml.Modelpostprocess= 키워드가 추가되었습니다(후처리기가 이제 콜백이 없어도 predict() 내부에서 자동으로 실행됨); ml.postprocessing이 벤더별 하위 패키지로 재구성되었습니다 — ml.postprocessing.ultralytics(YoloV5, YoloV8), ml.postprocessing.darknet(YoloV2, YoloLC), ml.postprocessing.edgeimpulse(Fomo), ml.postprocessing.mediapipe(BlazeFace, BlazePalm, HandLandmarks, FaceLandmarks) — 기존 snake_case 이름은 별칭으로 유지됩니다; ml.utils.draw_keypoints()ml.utils.draw_skeleton()이 추가되었습니다; 번들된 ROMFS 모델이 늘어났습니다(BlazeFace, YOLO-LC, YOLOv8n, 손바닥/손/얼굴 랜드마크).

  • audio — STM32N6의 MDF 디지털 마이크 입력.

  • 디스플레이 — SSD1351 OLED 드라이버 및 예제; SPIDisplay 컨트롤러가 초기화 명령을 재정의할 수 있습니다; SPI 디스플레이 생성자에 hmirror / vflip 키워드가 추가되었습니다.

  • 온디바이스 프로파일러 — 함수 수준 계측을 갖춘 SysTick + Armv8.1-M PMU 사이클/이벤트 카운터로, 디버그 링크를 통해 읽을 수 있습니다(pyopenmv에 프로파일링 및 ELF 심볼 지원이 추가됨).

  • 새로운 센서 지원 — PixArt PS5520; OpenMV H7 Plus의 FLIR BOSON; GenX320 자동 감지.

기타 변경 사항 및 개선 사항

  • MicroPython이 1.26.0으로 업데이트되었습니다.

  • 카메라 시작 — 센서 클럭이 CSI 상태에서 분리되었고, 부팅 시 카메라 감지가 더 빨라졌으며(가장 일반적인 구성을 먼저 시도함), OpenMV 3 OV7725의 기본 클럭이 수정되었습니다.

  • 이미지 품질 — 소프트웨어 ISP 감마 보정(Alif 및 STM32)과 불량 픽셀 보정(STM32)이 기본적으로 활성화됩니다; PAG7936 및 PS5520 센서에 자동 화이트 밸런스 제어가 추가되었습니다.

  • 성능image.Image.to_ndarray()가 Helium SIMD로 가속되고 FOMO 후처리기가 ulab으로 벡터화되었습니다.

  • FLIR Lepton 드라이버가 재작성되어 백그라운드에서 비동기적으로 프레임을 수신합니다 — 회전/transpose가 이제 작동하고, 그리기가 양선형으로 업스케일되며, 리셋이 더 빨라졌습니다.

  • 캡처 처리량 — i.MX RT1062 CSI가 이제 완전한 DMA 오프로드를 사용하고, STM32 N6에는 하드웨어 GPU draw_image()가 있습니다.

버그 수정

카메라 및 센서:

  • STM32 센서 전반의 RGB565 / GRAYSCALE / BAYER / YUV422 모드, OpenMV H7 / H7 Plus의 PAJ6100, OpenMV 2 QVGA RGB565, N6 CSI 모노 / RGB-YUV 구성이 수정되었습니다; 소프트웨어 테스트 카메라가 이제 결정론적으로 리셋됩니다.

  • 자동 화이트 밸런스가 낮거나 가변적인 프레임 속도에서 더 이상 이미지를 녹색으로 만들지 않으며(100프레임마다 샘플링하는 대신 250ms 이동 평균으로 대체됨), PS5520 휘도 깜박임이 수정되었습니다.

이미지 처리:

  • 선 그리기 렌더링 결함이 수정되었습니다; image.Image.flush()가 이제 호출된 이미지의 JPEG 버퍼를 플러시합니다; Normalization이 이제 부동소수점 입력에 평균/표준편차를 적용합니다; 파일에서 이미지 할당이 수정되었습니다.

카메라 캡처:

  • 비-JPEG 전송 시 발생하던 심각한 이미지 손상(프레임 인터럽트가 이제 JPEG 모드에서만 활성화됨), JPEG 모드-3 지원, STM32의 DMA 라인 크기 및 작은 버퍼 잠금 현상이 수정되었습니다; VOSPI / Lepton 동기화가 특히 N6에서 더 안정적입니다.

기타:

  • omv.board_id()가 RT1060에서 올바른 UID를 반환합니다; YoloV2가 명시적 앵커 없이 생성될 때 더 이상 충돌하지 않습니다.

하드웨어 및 보드 지원

  • OpenMV N6 — Neural-ART NPU, 트리플 버퍼링, SPI LCD/TV 출력, Soft-CSI, tof 모듈, 번들된 ROMFS 모델을 갖춘 STM32N6.

  • Arduino GIGA — MIPI DSI 디스플레이 출력.

  • 새로운 센서 — PixArt PS5520; OpenMV H7 Plus의 FLIR BOSON; GenX320 자동 감지.

  • OpenMV Pure Thermal — FLIR Lepton이 이제 일반(보조) 카메라 센서입니다.

  • Alif AE3 — 소프트웨어 ISP 감마 보정, crc 모듈, SPI 수정.

호환성에 영향을 주는 API 변경

v4.7.0과 v4.8.0 사이의 사용자에게 보이는 API 변경 사항입니다. 범위: modules/의 Python C 모듈과 scripts/libraries/의 Python 라이브러리.

각 변경 사항은 영향도로 태그되어 있습니다:

  • major — 이를 사용한 대부분의 스크립트를 수정해야 합니다.

  • minor — 좁은 범위의 API; 이를 사용한 스크립트에만 영향을 줍니다.

  • behavior — 동일한 API, 다른 결과; 튜닝된 스크립트를 다시 확인하세요.

  • tooling — 호스트 도구 / 소스에서 빌드하는 경우에만 영향을 줍니다.

변경 사항은 영향도 순서로 그룹화되어 있습니다 — major가 먼저, 그다음 minor, behavior, tooling. 코드를 포팅하기만 원한다면 끝에 있는 마이그레이션 체크리스트로 건너뛰어 간결한 할 일 목록을 확인하세요. 각 커밋 해시는 GitHub의 해당 diff로 연결됩니다.

FLIR Lepton이 fir 모듈에서 분리됨 (major)

FLIR Lepton은 이제 fir 모듈을 통하지 않고 일반 카메라 센서로 구동됩니다. Lepton 제어가 fir에서 제거되었습니다: FIR_LEPTON 유형과 radiometric(), register_vsync_cb(), register_frame_cb(), get_frame_available(), trigger_ffc() 메서드가 사라졌습니다. 다른 카메라와 마찬가지로 Lepton을 캡처하세요(OpenMV Pure Thermal에서 보조 센서로 나타남); Pure Thermal 예제는 새 API에 맞게 재작성되었습니다. 비-Lepton fir 센서(Grid-EYE, MLX, AMG8833)는 변경되지 않았습니다.

커밋: bacfb7aeb, 117710566, 592a22902, 1a614202e

buzzer 모듈 제거됨 (minor)

buzzer 모듈이 STM32와 i.MX RT 포트에서 제거되었습니다. 대신 machine.PWM으로 버저를 구동하세요; PWM을 사용하는 Pure Thermal 버저 예제가 추가되었습니다.

커밋: ccb947924, 444120f2d

omv.disable_fb() 제거됨 (minor)

omv.disable_fb() 함수가 제거되었습니다; 프레임 버퍼 스트리밍은 이제 카메라 API를 통해 제어됩니다. 이에 의존하던 레거시 RPC 데스크톱 스크립트도 제거되었습니다.

커밋: 84c3db58a, 6fe99051c

csi는 새로운 모듈 — API가 아직 고정되지 않음 (minor)

csi 모듈은 v4.8.0에서 도입되었으며 릴리스 중에 API가 진화했습니다: csi.fb()가 제거되었고, csi.CSI.snapshot() (image=...)은 이제 변경 가능한(mutable) 이미지를 요구하며 원시 깊은 복사를 수행하는 대신 캡처된 프레임을 그 안으로 그리거나 스케일합니다. 새 모듈의 얼리 어답터는 다시 테스트해야 합니다; 레거시 sensor API는 영향을 받지 않습니다.

커밋: 0bc0385eb, 8cd7a309f

image.ImageIO 스트림 모드 및 close() (minor)

image.ImageIOmode 인수는 이제 소문자 'r' / 'w'만 허용하며(대문자는 업데이트된 오류 메시지와 함께 거부됨), 'w'로 열면 기존 스트림을 보존하는 대신 항상 파일을 잘라내거나 다시 생성합니다. ImageIO.close()는 이제 멱등적이며(이미 닫힌 스트림을 닫아도 더 이상 예외를 발생시키지 않음) 스트림 객체 대신 None을 반환합니다.

커밋: 715c4cbba, 21ceec422

BlazeFace / BlazePalm 반환값 (minor)

BlazeFaceBlazePalm 후처리기(이번 릴리스에서 새로 추가됨)는 이제 전체 클래스별 목록 대신 단일 경계 상자 목록을 반환합니다 — 호출자는 [0]이 아니라 결과를 직접 인덱싱합니다.

커밋: 75e16b573

ML 후처리기 콜백이 원시 텐서를 받음 (behavior)

ml.Model predict() 후처리 콜백은 이제 미리 변환된 부동소수점 ndarray 대신 원시(양자화된) 출력 텐서 참조를 받습니다 — 이는 대형 모델에서 메모리 고갈을 방지합니다. 콜백이 제공되지 않으면 여전히 부동소수점 ndarray가 반환됩니다. 사용자 지정 콜백은 텐서를 직접 역양자화해야 합니다(내장 후처리기는 이미 그렇게 함).

커밋: 84e6ee650

카메라 클럭이 CSI 상태에서 분리됨 (behavior)

센서 클럭은 이제 CSI 상태와 독립적입니다. set_clock / set_frequency는 요청된 주파수가 허용 오차 이상으로 다를 때만 클럭을 재구성하며, get_clk_frequency는 (공칭이 아닌) 정확한 주파수를 반환하기 위한 불리언을 받습니다. 기본 클럭은 OpenMV N6와 AE3에서 24 MHz이므로 부팅 시 명시적인 set_clock()이 필요하지 않습니다. 타이밍에 민감한 캡처를 위해 클럭을 토글하던 스크립트는 가정을 다시 확인해야 합니다.

커밋: 2040a0a00, 09c0052df, 66ade9aea, 7e0a251bc, e6f43f3ca

USB 디버그 프로토콜 및 펌웨어 타깃 (tooling)

이 중 어느 것도 MicroPython 스크립트에 영향을 주지 않습니다. 사용되지 않는 USBDBG 명령(SCRIPT_SAVE, TEMPLATE_SAVE, DESCRIPTOR_SAVE, ATTR_READ, ATTR_WRITE, TX_INPUT, SET_TIME)이 제거되었고 이전 IDE의 지원되지 않는 명령은 이제 연결 시 TinyUSB 보드를 충돌시키는 대신 플러시됩니다; 레거시 STM32 UVC 펌웨어 타깃이 제거되었습니다. 오래된 호스트 도구는 업데이트해야 합니다; 자세한 내용은 펌웨어 저장소 기록을 참조하세요.

커밋: 90bd11e93, 657c9a632, 35182f035

마이그레이션 체크리스트

v4.8.0으로 깔끔하게 포팅하기 위한 일반적인 작업은 다음과 같습니다:

  1. fir를 통해 FLIR Lepton을 사용했다면, 카메라 센서로 캡처하도록 전환하세요(fir/Lepton 변경 사항).

  2. 모든 buzzer 사용을 machine.PWM으로 교체하세요(buzzer 제거).

  3. omv.disable_fb() 호출을 제거하세요(omv.disable_fb() 제거).

  4. image.ImageIO의 경우: 소문자 'r'/'w'를 사용하고 'w'가 잘라낼 것을 예상하세요(ImageIO 변경 사항).

  5. 사용자 지정 ML 후처리 콜백의 경우: 원시 텐서 참조를 직접 역양자화하거나 기본 부동소수점 경로에 의존하세요(콜백 변경 사항).

  6. 타이밍에 민감한 캡처를 위해 센서 클럭을 구동하던 모든 스크립트를 다시 확인하세요(클럭 변경 사항).