같은 명령, 같은 그림
금속 표면의 AFM 높이맵에서 거칠기를 구한다. AFM 원시 데이터는 처리하지 않으면 읽을 수 없다 — 기울기 136 nm와 보우 22 nm가 표면 거칠기(3~16 nm)보다 크다.
그런데 그 처리의 각 단계에 선택이 있고, 선택이 답을 바꾼다. 같은 명령을 두 번 내려도 같은 답이 안 나온다. 오늘은 그걸 직접 확인하고, 나오게 만든다.
실습 06은 표준시료가 어느 절차를 믿을지 정해줬다. 실습 07은 환산이 방법 간 불일치를 설명했다. 실습 08에서는 아무것도 안 닫아준다. 관문이 대부분을 걸러내지만 전부는 아니고, 남은 것은 없앨 수 없다.
원시 데이터에 무엇이 얹혀 있나
인공물이 신호보다 크다
| 무엇 | 크기 | 무엇으로 빠지나 |
|---|---|---|
| 기울기 | 약 136 nm | 평면 맞춤 1차 |
| 보우 (스캐너 휨) | 약 22 nm | 평면 맞춤 2차 이상 |
| 가로 줄무늬 | 약 1 nm | 라인별 정렬 — 부작용이 있다 |
| 느린 드리프트 | 약 3.5 nm | 평면 맞춤 1차 |
| 표면 거칠기 (구하려는 것) | 3 ~ 16 nm | — |
처리는 선택이 아니라 필수다. 그런데 그 처리에 선택이 있다 — 평면 맞춤 차수, 라인별 정렬 방식, Ra인지 Rq인지, 계산 영역. 어느 조합을 고르느냐에 따라 답이 최대 1.8배 달라진다.
전체 흐름
오늘 할 일
기준이 두 개다
깊이가 인증된 홈을 판 단차 표준물질이다.
data/standard/step_standard.txt 를 읽어서 아래를 구해줘. 1. 홈의 깊이 2. 평탄면의 P-V (최대 − 최소) 원시 이미지와 처리 후 이미지를 나란히 그려서 보여주고, data/standard/인증값.md 와 대조해서 results/표준검증.md 에 표로 남겨줘. | 항목 | 인증값 | 내 결과 | 차이 | 허용범위 | 통과 |
① 홈 깊이 180.0 ± 3.0 nm ② 평탄면 P-V 12.0 nm 이하
두 기준이 서로 반대로 당긴다. 처리를 세게 할수록 평탄면은 평평해지고, 진짜 구조는 사라진다. 한쪽만 맞추기는 쉽다 — 둘 다 맞추는 지점을 찾는 것이 관문이다.
통과 못 했으면 어느 쪽이 안 맞는지부터 본다. 홈 깊이가 안 맞으면 처리가 너무 센 것이고, P-V가 안 맞으면 덜 센 것이다.
한 번 시켜본다
data/scans/ 의 S1~S4 에서 표면 거칠기를 구해줘. 관문에서 만든 방법 그대로 쓰고, results/거칠기.csv 에 저장해줘.
숫자가 나왔을 것이다. 이 숫자를 적어 둔다. 곧 다시 쓴다.
같은 명령을 한 번 더
새 대화창을 연다. (Cline이면 새 Task, Claude Code면 /clear)
앞의 대화 내용을 알려주지 말고, 똑같은 문장을 다시 붙여넣는다.
data/scans/ 의 S1~S4 에서 표면 거칠기를 구해줘.
그런데 답이 다르다. 코드가 틀린 게 아니다. 에이전트가 매번 처리 방법을 다시 고르기 때문이다.
졸업하면 이 문제를 계속 만난다 — 반년 전 내 폴더를 다시 열었을 때, 다른 사람이 내 숫자를 확인하려 할 때.
무엇을 고른 것인가
방금 그 거칠기를 어떻게 냈는지 단계별로 알려줘. 특히 — - 평면 맞춤을 했어? 몇 차로? - 라인별 정렬을 했어? 어떤 방식으로? - Ra 야, Rq 야? 다른 지표도 있는데 왜 그걸 골랐어? - 어느 영역에서 계산했어? 각 단계마다 다른 선택지가 뭐가 있었는지도 같이 적어줘.
| 확인할 것 | 왜 |
|---|---|
| 모든 단계에 값이 적혀 있는가 | “적절히 처리했다”는 답이 아니다 |
| 기본값도 값으로 적었는가 | 기본값도 선택이다 |
| 라이브러리가 알아서 한 것도 적었는가 | 모르면 찾아보고 적어야 한다 |
폭이 얼마인가
처리 조합을 아래처럼 바꿔가며 전부 돌려줘. 평면 맞춤 차수: 1차 / 2차 / 3차 라인별 정렬: 안 함 / 줄마다 중앙값 / 줄마다 직선 9가지 조합 × 시료 4개에 대해 Ra 를 표로 만들고, 시료마다 최소 · 최대 · 최대/최소 배수를 적어줘. 같은 표를 표준시료(step_standard)에 대해서도 만들어줘 — 조합마다 홈 깊이와 평탄면 P-V 를 내고, 관문을 통과하는지 표시해줘.
통과하지 못한 조합들은 각각 이유가 다르다 — 진짜 구조를 지웠거나, 기기 인공물을 덜 뺐거나. 관문 하나가 대부분을 걸러낸다.
90° 돌려서 잰 것
시료목록.csv를 본다. S2와 S4는 같은 시료, 같은 자리다.
스캔 방향만 90° 다르다.
S2 와 S4 의 Ra 를 9가지 조합 각각에 대해 나란히 표로 보여줘. 두 값의 불일치(%)도 같이 적어줘.
표면이 같으니 답도 같아야 한다. 어긋나는 조합이 있는가?
이 대조는 참값이 필요 없다. 같은 자리를 두 번 잰 것뿐이다. 어긋난다면 처리가 방향에 의존한다는 뜻이고, 그건 스캔축과 나란한 진짜 구조를 지우고 있다는 뜻이다.
S2를 원시 이미지로 열어 보면 왜 그런지 보인다.
그래도 남는 것
관문을 통과한 조합만으로 S1~S4 의 Ra 를 다시 표로 보여줘. 시료마다 값이 몇 % 벌어지는지 적어줘.
한 시료에서 유독 크게 벌어질 것이다. 그 시료의 원시 이미지를 본다.
그 시료의 원시 이미지와, 관문을 통과한 두 조합으로 처리한 이미지를 세 개 나란히 그려줘. 색상 범위는 셋 다 같게 맞춰줘.
표준시료의 평탄면에는 긴 파장의 굴곡이 없다. 그래서 관문은 「굴곡을 지우는 처리」를 볼 수 없다.
그게 어디인지 아는 것까지가 일이다.
남은 자유도는 적어둔다
닫을 수 없다. 그러면 어떻게 하는가 — 적어둔다.
results/처리사양.md 를 만들어줘. 아래 표를 채우고, 각 칸에 "적절히" 같은 말 대신 값을 넣어줘. | 단계 | 내가 쓴 값 | 다른 선택지 | 왜 이걸 골랐나 | | 평면 맞춤 차수 | | | | | 라인별 정렬 | | | | | 지표 (Ra/Rq) | | | | | 계산 영역 | | | | | 픽셀 크기 | | | | 그리고 results/거칠기.csv 를 이 사양대로 다시 만들고, 파일의 SHA-256 체크섬을 results/처리사양.md 아래에 적어줘. python·numpy·scipy 버전도 같이 적어줘.
다시 새 대화창을 연다. 이번에는 사양 파일을 같이 준다.
results/처리사양.md 에 적힌 대로 data/scans/ 의 거칠기를 구해서 CSV 로 저장하고 SHA-256 을 알려줘.
| 결과 | 뜻 |
|---|---|
| 체크섬이 같다 | 사양이 충분하다 |
| 다르다 | 사양에 빠진 칸이 있다. 무엇인지 찾아서 채운다 |
숫자는 바이트 단위로 같아야 한다. 사양이 고정되어 있으면 그렇게 된다.
그림은 그럴 수 없다. 라이브러리 판본이나 폰트가 바뀌면 픽셀이 달라진다.
체크섬은 수치 결과에 걸고, 그림은 눈으로 비교한다. 대신 그림에는 색상 범위를 반드시 명시한다 — 자동 범위로 두면 같은 데이터가 매번 다르게 보인다.
손으로 확인한다
에이전트 없이 한 번은 직접 본다
step_standard.txt를 텍스트 편집기로 연다
헤더 아래 첫 줄에서 값을 다섯 개 옮겨 적는다
같은 줄의 가장 큰 값과 가장 작은 값을 눈으로 찾아 적는다
그 숫자들을 손으로 적고 사진을 찍어 제출한다.
그 차이가 홈 깊이 180 nm와 비슷한가, 아니면 훨씬 큰가? 훨씬 클 것이다. 왜 그런가? — 처리를 안 했기 때문이다.
제출
results/보고서.md
결론: [숫자] [단위] 불확실성: [값] — 노이즈에서 온 것인지 절차 선택에서 온 것인지 밝힐 것 적용 범위: 이 방법의 가정이 이 시료에서 성립하는가. 확인한 근거는?
첫 줄은 지표 이름을 붙여서 쓴다.
SS316-A 의 Ra = 3.3 nm (평면 맞춤 2차, 라인 정렬 없음, 5 µm 시야)
처리 조건 없는 거칠기 값은 답이 아니다.
검증 로그 —results/검증로그.md
| 채울 것 | |
|---|---|
| ① | 에이전트가 낸 주장 (02의 첫 숫자) |
| ② | 같은 명령 두 번의 차이 (03) |
| ③ | 조합 9가지의 폭 (05) |
| ④ | 관문이 걸러낸 조합과 각각의 이유 |
| ⑤ | 손 앵커 — 원시 데이터 첫 줄의 값 5개와 그 범위 (손글씨 + 사진) |
| ⑥ | 90° 대조 결과 — 어긋난 조합과 그 뜻 |
| ⑦ | 관문이 못 잡은 것 — 무엇이고, 어떻게 알았나 |
| ⑧ | 처리사양.md와 체크섬 — 새 대화에서 재현되었는가 |
| ⑨ | 에이전트에게 맡기면 안 되는 단계 1개 + 이유 2줄 |
| ⑩ | 최종 결론 — 처리 조건이 붙은 숫자로 |
results/ 폴더 전체를 압축해서 제출한다.
그 폴더만 받은 사람이 네 숫자를 다시 만들 수 있어야 한다.
막혔을 때
| 증상 | 해볼 것 |
|---|---|
| 두 번 돌렸더니 답이 다르다 | 정상이다. 그게 오늘의 주제다 |
| 관문에서 홈 깊이가 안 나온다 | 라인별 정렬을 켰는가? 홈이 가로다 |
| 관문에서 P-V가 12를 넘는다 | 평면 맞춤 차수가 낮다. 보우가 남았다 |
| 차수를 올렸더니 홈이 얕아진다 | 너무 센 것이다. 두 기준 사이를 찾는다 |
| S2와 S4가 다르게 나온다 | 정상이다. 06이 그 얘기다 |
| 체크섬이 매번 다르다 | 사양에 빠진 칸이 있다. 04로 돌아간다 |
| 그림 체크섬이 다르다 | 정상이다. 그림에는 체크섬을 걸지 않는다 |
| 파일이 커서 느리다 | 256×256 = 65,536점이다. numpy.loadtxt를 쓴다 |
| 그림의 한글이 네모(□□□) | 그래프 한글 폰트를 Malgun Gothic으로 지정해줘 |
| 에이전트가 “맞습니다”만 한다 | 질문이 잘못됐다. “맞아?” 대신 “바꾸면?”으로 |
재현성은 불확실성을 없애는 게 아니라 고정하는 것이다.
일곱 주 동안 표준시료로 절차를 골랐고, 방법을 교차 검증했고, 구속을 걸었고, 답이 얼마나 움직이는지 쟀다. 그런데 마지막에 남는 자유도는 아무것도 닫아주지 않는다. 관문에도 사각이 있고, 대조에도 한계가 있다.
그때 할 수 있는 것은 하나뿐이다 — 무엇을 골랐는지 적어두는 것. 적어두면 남이 확인할 수 있고, 확인할 수 있으면 틀렸을 때 고칠 수 있다. 그게 없으면 맞았는지 틀렸는지조차 알 수 없다.
인공지능재료공학 · 실습 08 · 신소재공학부
데이터: 교육용으로 합성한 AFM 높이맵 — 실제 측정이 아니다