내용이 재미있어서 단순 공유입니다
On the Compositional Generalization of Multimodal LLMsfor Medical Imaging

- 다차원 배열 -> 1차원 벡터
- 메모리 사전 할당(루프 들어가기 이전에)
- openmp 병렬화
- softmax 함수 계산 위치 변경
- 배열 사이즈를 미리 정해두고 insert하는 방식으로 변경(push back은 시간이 조금 더 오래걸림)
-
Brain은 남겨두고, CSF를 추가하는 처리 적용(CSF는 스테이지1의 결과물 Brain에서 스테이지2의 결과물 White Matter를 빼는 방식으로 했습니다, 스테이지1의 Brain결과와 스테이지2의 CSF의 결과가 다르게 출력되기 때문에)


-
테스트, 사용하지 않는 코드 정리
지난 번에도 일단 보고는 드렸는데, 전극 생성할 때 초록색에 삼각형 제거된 부분은 문제가 없나요?(engraved.poly)
z축으로 labelmap resolution적용한 코드 revert했다고 들었는데, x,y축에서 resolution을 조절하나 x,y,z축에서 resolution을 조절하나 계산에는 큰 차이가 없어서요
x,y,z축으로 labelmap resolution적용한 코드로 계산하면 bone volume이 줄어든다고 들었는데, x,y축에서도 resolution이 줄어즐면 bone의 크기에 영향이 있습니다.
resolution이 줄어들면 샘플링하는 개수가 줄어드므로 x,y,z어떤 축에서도 resolution이 줄어들면 각 장기의 volume에 영향을 주게됩니다.
근본적인 문제를 해결해야하는데 추가한 코드가 잘안되서 revert하고 종결내리면 안된다고 판단하였으므로... 혹시 몰라 작성해두겠습니다..

stage2 : 새롭게 훈련된 모델의 성능이 좋지 않아 보임
->06/12에 올린 사진(2022년 모델의 결과)를 보아서 성능의 차이가 존재하였습니다.
👇06/12(2022년 모델로 돌린 결과)

전극 이동/회전관련 클래스 분리중(다음 주 마무리)
-
전기장 계산할 때, 메모리가 부족할 경우 전기장의 일부분이 inf값으로 처리될 가능성이 있습니다. OncoField에서 inf값을 float 값으로 형변환 하면 그 결과는 inf가 아니라 float의 max값으로 변환 될 수 있습니다.(fine에서 문제가 발생하는 것으로 보아 용량에 관련된 문제이지 않을까 싶네요, 값이 어느 정도로 크게 나오나요..?)
-
labelmap 데이터를 생성할 때 external과 bone이 일정 거리를 유지하도록 코드가 작성되어 있습니다. -> external 내부와 bone이 같은 경계면을 공유할 가능성은 없습니다. 다만 bone이 external을 뚫는 형태라면 labelmap 결과에서도 bone이 바깥쪽에서 생길 가능성은 있으나 OncoField에서 Union처리 된 데이터가 전달된다고 생각하기 때문에 그 문제는 아닐 것 같네요.(우선순위에 대해서는 external이 1번, GTV가 7번이라고 할 때 숫자가 높은 영역이 낮은 영역을 덮어 씌우므로 숫자가 높은 GTV가 우선순위가 높습니다.)

- 전극 생성하는 코드 -> electrodeCreator 클래스로 이동
- 전극 Transform(이동, 회전)관련 클래스 / 전극 Transform 오브젝트 생성 클래스 작업 예정 (1~2주)
- VOI가 존재하지 않을 때 오토 세그멘테이션 진행되지 않는 문제 해결
- VOI가 존재할 때 VOI가 제거되지 않는 문제 해결
- 바디 오토 세그멘테이션은 같은 예외 처리가 없는데 괜찮은 건가요?

- electrodeCreator 클래스 생성
- 전극 속성 관련 변수들 electrodePatch 클래스로 이동
- 2~3주 안으로 간단히 마무리 할 예정
-
including 정리
-
Bouding box 코드 사용하지 않으므로 제거
-
ElectrodePatch 클래스 추가(메탈, 세라믹, 하이드로겔 및 템플릿 전극 관리)
-
Debugger 클래스 추가하여 디버깅 코드 분리
-
오버라이드된 함수(CreateElectrodePatch)의 로직이 중복이여서 하나의 함수로 통일
C3DWnd > OnUpdateSpecificElectorde > CreateElectrodePatch 수정해도 문제가 없는지 확인 부탁드립니다
-> gpu cuda가 사용할 수 있는 경우에는 gpu를 자동으로 로드, 사용할 수 없는 경우에는 cpu를 자동으로 로드하도록 수정
-> 간격이 넓어지면 에러가남(특히 TriangulateFacetsParallel에서)
-> 기존의 코드에서는 x,y축으로만 샘플링하므로 사이드에서 붙이는 전극의 에러는 적을 수 있음(위나 아래에서 붙이는 전극은 x,y의 리졸루션의 영향을 크게 받기 때문에 에러날 가능성이 높아짐)
-> x,y,z축으로 샘플링하는 코드는 z축으로도 샘플링을 하므로, z축 샘플링 간격이 넓어질 경우 사이드에서 붙이는 전극이 영향을 받아 에러가 날 가능성이 높아짐)

오토 세그멘테이션 결과로 출력되는 VOI의 색상이 너무 비슷해서 구별이 어려운 점이 있음
랜덤으로 색상을 지정하고 있는지 잘 모르겠으나, rbg가 아니라 hsl의 hue 부분을 random 으로 설정하는 방법을 사용하면 색상이 비슷한 문제를 해결할 수 있을 듯
아직 정해진 내용이 아니기 때문에 상의 후 진행
- Study 생성하기 전 클릭하면 프로그램 종료되는 에러 해결
- Head 모델에서는 Head auto segmentation이, Body 모델에서는 Body auto segmentation이 활성화되도록 수정

- 기존에 존재하는 자동으로 External Contour 생성하는 코드가 필요한지 잘 모르겠음(헤드 모델의 경우 1분 정도 걸림)
- auto segmentation으로 바꾸는 방법은 생각해봤지만, Head 모델과 Body 모델이 나누어져 있는 점, 그리고 Body 모델에서 external이 출력 결과에 존재하지 않는 점은 고려해서 결정해야 할 듯
--> 주파수 150000(Study에 저장된 기본값)으로 계산한 결과, conductivty & permittivity 값이 문제 없는지 확인 필요
-> 값의 차이가 많이 나므로 병렬처리는 사용하지 않는 것이 맞을 듯(z축으로 resolution 설정하는 코드만 적용해도 1.6mm~10mm까지 계산한 결과의 시간이 나옴)
기존 : 00:16:21.5442381
CalculateCurrents, AnalyzeVoxels도 병령 처리 : 00:15:46.6076131 / 오리지날 ElectricField01과의 차이값의 합 : 14417.622683560106
CalculateCurrents, AnalyzeVoxels, InitializeVoxelsParallel의 병렬 처리 : 00:14:59.5028426 / 오리지날 ElectricField01과의 차이값의 합 : 15119.780249248848

온코필드에서 출력하는 부분 작업중
온코필드에서 바디 이미지 로드할 수 없음
파이썬 코드 확인중
https://github.com/fieldcure/fieldlab-deepedge/blob/3567238a7d99e768ad13c99ff81c70d4f8c52890/deepedge/inferers/inferer_total.py#L784 https://github.com/fieldcure/fieldlab-deepedge/blob/3567238a7d99e768ad13c99ff81c70d4f8c52890/deepedge/inferers/dic_rt.py#L67
병렬처리 -> 결과에 영향이 있으므로 제외
InitializeVoxelsParallel의 병렬 처리가 가장 영향이 크고,
CalculateCurrents, AnalyzeVoxels도 병령 처리에 영향이 다소 있음
속도보다 정확도가 더 중요한 경우는 "레이블맵 z축 resolution 수정"만 적용하는 것이 맞을 듯

CalculateCurrents함수 병렬처리 9초 -> 1.5초
InitializeVoxelsParallel함수 병렬처리 최적화 18초 -> 8초 (yield return은 한 번만 처리하는 것이 빠름, WithDegreeOfParallelism으로 최대 프로세스를 사용, tetrahedron도 병렬처리)
AnalyzeVoxels함수 병렬처리 11초 -> 3초
인터섹션 체크하는 부분을 수정해야할 듯
~ 1.6mm : 전기장 계산에서 시스템 메모리 용량(32GB)를 초과하는 공간을 요구하여 계산 딜레이가 발생하므로 속도 확인에는 의미가 없음
1.6mm : 01:47:22.2549589(메쉬 25분/전기장 계산1 20분/전기장 계산2 1시간) -> 메모리 32기가인데 전기장 계산 2번 째부터 메모리 차지하는 영역이 40기가가 넘어서 계산 딜레이 발생
1.7mm : 00:29:45.5238958
1.8mm : 00:12:20.4134863
2.0mm : 00:07:14.7022259
3.0mm : 00:03:24.4200601
4.0mm : 00:02:21.7411175
5.0mm : 00:01:48.6029094
6.0mm : 00:01:46.6005471
7.0mm : 00:01:37.0357475
8.0mm : 00:01:34.5769245
9.0mm : 00:01:25.5644573
10.0mm : 00:01:38.8276500
용하에게 onnx 모델 요청함 어떻게 작업할지 코드 확인
대략적으로 전극 부착 완료까지 30초 전기장 계산+파일 저장이 1분 정도 걸림(계속 확인중)
5mm resolution(width/height) + 15장씩 체크(slice) -> 10장 이상씩 체크하면 너무 경사지게 만들어져서 에러가 날 가능성이 보임(전극 부착 실패 등)
5mm resolution(width/height) + 15장씩 체크(slice)의 데이터의 경우 50초 정도 빨라짐 -> coarse일 경우에는 qa 스위치 제거하는 것도 방법일 수도 있을 것 같음(삼각형이 커지면 결과가 이상하게 보일 수는 있을 듯)
(288, 384, 192)로 테스트함 -> release모드에서 adaptiveHistogram 적용할 필요가 있으나, debug 모드에서는 itk가 굉장히 오래 걸리기 때문에 빼 두었음 용하 코드로 동작하는지 확인할 필요가 있어보임(gtv적용할 때)
-> 정상적으로 동작 : 2022년 모델(Stage1 2D, Stage1 2D+3D, Stage2 2D), 2024년 모델(Stage1 2D, Stage2 2D)
-> 비정삭적으로 동작 : 2024년 모델(Stage1 3D)
2024년도 모델에서도 적용 가능한 seperate & merge 코드로 동작하는 것을 확인함
8분 정도 소요됨

python에서의 모델은
인풋 데이터가 float32
아웃풋 데이터가 float16
인데
onnx 파일은
인풋 데이터가 float32
아웃풋 데이터가 float32
로 잘못되어 있음
c++ 코드로 돌리면 결과 사이즈가 예상 사이즈의 1/2 임 (4 * 128 * 128 * 128 이여야 하는데 4 * 128 * 128 * 128 / 2)
용하에게 새로 모델을 요청하였지만 언제 받을 수 있을지는 잘 모르겠음
Seperate & merge 코드를 이용해 stage2D가 돌아가도록 적용 버그 수정 및 테스트
seperate2D & merge2D 함수 간략화
seperate3D & merge3D 함수 구현 -> gpu 메모리 부족(사용하는 gpu가 2gb여서 그런 듯)이므로 회사 컴퓨터로 확인 필요
3D label 결과 확인중 -> 문제 없으면 stage2 구현할 예정
이미지 사이즈 padding&crop은 그 이후 구현
아래 사진은 patch size = (128, 128, 128), stride = (128, 128, 128)을 사용한 결과 -> 각 patch의 테두리에 경계선이 생기는데 특별히 문제가 없는지 의문
seperate2D & merge2D 함수 구현 후 sigmoid 결과 확인
1.real_case_test_2D_3D의
real_dataset(for 2d)
real_2D_test
merge2
{ # 확인 후 필요한 경우 작업
imgTemp = np.expand_dims(img, axis=0)
data_final = np.concatenate([imgTemp, output_2D], axis=0) # data_final = [7,256,256,256]
}
real_dataset(for 3d)
real_3D_test
merge_cube
2.real_case_test_2D의
real_dataset
real_2D_test
merge2
+α -> [256,256,256]인 데이터셋으로 정상적으로 동작하면 이후 작업 시작
resampling
padding
gpu에서 동작가능하게 수정(방법은 전달할 예정)
필요한 환경
- onnxruntime18.0
- cuda 11.8
- cudnn 8.9.7.29
최신 모델 동작은 정확히 어떤 부분이 어떻게 수정되었는지 확인 후 작업 시작
roi만드는 부분 좌표계 변환하는 부분이 이상해서 확인 필요 -> 전기장 데이터도 결과도 이미지와 딱 떨어지 않았는데, 샘플 데이터(256,256,256에 임의 큐브 영역 1 대입)와 실제 이미지 데이터도 똑같이 딱 맞아 떨어지지 않는 문제가 있었음 -> 좌표계 변환하는 부분에서 x좌표 +0.05 y좌표 +0.05 하여서 임시 처리 하였으나, 원인을 찾을 필요가 있어보임. -> 원인을 찾으면 전기장 데이터 값도 이미지 영역에 맞도록 일치시킬 수 있을 것으로 예상
x좌표 +0.05 y좌표 +0.05 처리 결과 (spacing 0.1(cm)) (내부 사각형은 1로 채워진 부분이며 무시하여도 무관함. 외부의 컨투어의 영역이 이미지의 영역과 맞아 떨어진 것으 중요함-> 밑의 roi가 이미지와 맞아떨어지는 결과로 이어짐)

stage1과 stage2의 결과를 roi로 만들어 표시 -> roi만드는 부분 좌표계 변환하는 부분이 이상해서 확인 필요
컨투어 만드는 부분 버그 수정
온코 필드에 ONNX 코드 이식 및 실행 가능 하도록 코드 수정
stage1의 infer2D 결과
stage1의 infer3D 결과
stage2의 infer2D 결과










































