libedgetpu의 face detection은 정상이다. 직접 만든 npu driver로는 모든 anchor score가 균일하게 나오는 버그가 있다. 이번에는 input dump를 통해서 비교해 볼 예정이다.
분석하기 전에 아래와 같은 내용을 알아야 하는 것 같다.
| 구성 요소 | 역할 | 상세 내용 |
|---|---|---|
| CRC32 | 무결성 검증 | 데이터 전송 중 에러 발생 여부를 체크하는 32비트 체크섬 값 |
| HEAD | 메타데이터 | 텐서의 Shape, Dtype, 레이아웃 등 데이터 해석 정보 |
| MID | 실제 데이터 | 연산에 직접 사용되는 본문(Payload) 데이터 |
| TAIL | 마무리/패딩 | 메모리 정렬(Alignment)을 위한 여백 및 종료 지점 정보 |
정상 동작하는 코드와 npu driver 코드에 input dump 출력 코드를 작성하고 돌려서 비교했다.
libedgetpu CRC32=0xf993d860 TAIL: 00 00 00 00 00 00 00 ...
npu_driver CRC32=0x68ea0706 TAIL: 34 3c 35 34 3c 35 34 ...
HEAD / MID 는 일치하는데 TAIL만 달랐다.
libedgetpu의 경우는 letterbox 방식이고 npu_driver에서는 stretch 방식의 resize를 하는 것 같다. SSD backbone은 receptive field가 전체 이미지라서 입력이 조금만 달라도 score head 전체가 흔들린다고 한다. 따라서 정상적으로 추론이 안될 수 있다.
코드를 수정하여 동일한 포맷으로 만들었지만, 여전히 정확한 추론이 되지 않는다.
하나씩 다른 점을 찾아보면서 가설을 제거해 나가야겠다.