
추론 output 데이터 중 convert_scores가 계속 잘못된 값으로 나와서 상당히 쉽지 않다. 이번 포스팅에서는 정상으로 추론되는 libedgetpu에서 실제 input buffer를 bin파일로 만들어서 만들어진 파일을 개발 중인 npu driver에서 사용하도록 할 예정이다. 우리 코드가 만드는 input data와 libedgetpu가 만드는 input data의 crc 달라서 추론에 문제가 있는지 검증하겠다.

https://github.com/wangki-kyu?tab=repositories 해당 github에 fork로 windows build가 성공되도록 수정해 놓았다. 원하는 로그 및 코드를 수정해서 테스트할 수 있는 환경이다.
libedgetpu에 코드를 추가한 뒤, docker를 통해 빌드를 했다. 명령어는 아래와 같다.
docker run --rm -v "E:/work/project/libedgetpu:C:/workspace" -w C:/workspace libedgetpu-windows:latest cmd /c build.bat
약 3~5분 정도 기다리면 빌드가 완료된다.

빌드된 결과물을 사용 환경으로 옮겨주는 작업을 해주면 된다.
간단하게 coral.sys를 등록하고 추론을 돌려주면 된다.

현재 개발 중인 npu driver가 설치되어 있는데 이 부분을 google에서 제공해 주는 coral.sys로 업데이트 해주면 된다.

제거 후 업데이트하여 정상적으로 설치된 것을 확인할 수 있다.
python으로 미리 만들어놓은 코드를 사용해 얼굴 인식 추론을 하면 된다. 카리나 사진으로 테스트를 해보았다. 테스트 결과는 아래와 같다.

정상적으로 얼굴이 인식이 되었고 opencv를 활용해 인식된 Box 좌표로 얼굴 부분을 강조하도록 했다.
추가로 C:\temp\하위에 input bin파일이 생성된 것을 확인할 수 있다.

기존 코드에 아래와 같이 define을 통해 분기 처리했다.
#define USE_LIBEDGETPU_INPUT 1
{
UINT imgSide = static_cast<UINT>(std::sqrt(static_cast<double>(INPUT_SIZE) / 3.0));
if (imgSide * imgSide * 3 != INPUT_SIZE) {
std::cout << "[main] WARNING: input size " << INPUT_SIZE
<< " is not square*3 — falling back to imgSide=" << imgSide << std::endl;
}
#if USE_LIBEDGETPU_INPUT
{
const char* libe_input_path = "C:\\temp\\libe_input_raw.bin";
FILE* f = nullptr;
fopen_s(&f, libe_input_path, "rb");
if (f) {
size_t r = fread(pInputBuf, 1, INPUT_SIZE, f);
fclose(f);
std::cout << "[main] USE_LIBEDGETPU_INPUT=1 — loaded " << r << "/"
<< INPUT_SIZE << " bytes from " << libe_input_path << std::endl;
if (r != INPUT_SIZE) {
std::cout << "[main] FAIL: libe input file size mismatch — expected "
<< INPUT_SIZE << " B" << std::endl;
goto cleanup;
}
} else {
std::cout << "[main] FAIL: " << libe_input_path
<< " not found — run libedgetpu first to generate it" << std::endl;
goto cleanup;
}
}
#else
std::cout << "[main] loading image (target " << imgSide << "x" << imgSide << ")" << std::endl;
if (!LoadJpegToRGB(L".\\assets\\karina.jpg", pInputBuf, imgSide, imgSide)) {
std::cout << "[main] FAIL: image load" << std::endl;
goto cleanup;
}
#endif
}
빌드 후, 테스트를 진행하였다.
CRC 값은 0xf993d860로 동일하게 나왔는데 여전히 convert_scores값이 쓰레기 값이 나왔다.
실제 추론이 성공하는 input data를 사용해서도 추론이 안된 것을 보면 npu driver에서 정상적으로 Weight(가중치) 값을 사용하지 못하거나, 추론이 정상적으로 발생되지 않는 것으로 볼 수 있다.
아쉽지만 좋은 시도였다..
다른 방법도 시도해 봐야겠다....