개요
지난글(파이썬을 활용한 불량 제품 이미지 판정 - 기획)에서 구현하고자 하는 이미지 판정 기능에 대해 정의하고 진행 방향을 정했습니다.
이를 AI 코딩툴을 활용하여 코드 작성을 진행했습니다.
AI 툴과 코딩
파일은 Jupyter Notebook 파일을 만들어서 코딩을 시작했습니다.
AI 툴에게 물어볼때마다 이전 코드가 없어지면서 History 관리가 되지 않아, 번거롭지만 AI에게 질문을 할 때마다 블럭을 새로 만들어서 그 결과를 계속 저장했습니다.
1st Ver
AI에게 질문 :
파이썬 코드를 만들어줘
1. 이미지를 불러온 다음 온 이미지에 약간의 blur 효과를 줘.
2. blur 효과를 준 이미지 기준으로 검은색 영역과 흰색 영역으로 나눠서 검은색 영역을 설정해줘
3. 원본 이미지에서 검은색 영역 안에 명도가 10을 초과할 경우 "NG"라는 값을 출력해줘
자동으로 AI에서 코드를 만들어 줬습니다.
만들어진 코드에서 결과 시각화까지 추가로 알려줘서, 여기까지 포함해서 코드를 만들었습니다.
파일 경로는 따로 입력해 줘야 해서 내 컴퓨터에 저장된 파일 경로를 불러와서 실행했는데...
에러가 발생했습니다. 이미지를 보여주는 코드에서 에러가 발생했는데...
아무래도, 이미지를 보여주는 함수인 imshow가 제 컴퓨터와 궁합이 잘 맞지 않았나 봅니다.
2nd Ver
AI에게 질문 :
cv2.imshow 명령어를 pyplot으로 바꿔서 보여줘
그래서, 이미지를 보여주는 함수를 다른 함수를 써서 보여줄 것을 요청했습니다.
결과는 아래와 같았습니다.
이미지의 맨위 타이틀에 NG라고 표시해서 NG로 판정되었다는 것은 알겠는데, 어느부위가 검출되어서 NG로 판단되었는지가 잘 표시되지 않았습니다. 보완이 필요하겠습니다.
3rd Ver
AI에게 질문 :
위 코드에서 NG로 인식한 픽셀을 빨간색으로 색깔 전환해서 결과를 보여줘
NG로 인식한 영역을 빨갛게 표시해 줄 것을 요청하여 결과를 확인해 봤습니다.
결과가 잘 보입니다. 다만, 불량으로 인식했으면 하는 영역 이외에도 열쇠의 외곽선 부분도 NG로 판단하는 이슈가 있습니다.
4th Ver
코드 직접 수정 :
파라미터값을 조정 - 경계를 자르는 기준을 127 → 40
이번에는 코 드 안에 있는 소스를 분석해서 이미지의 경계를 자르는 부분의 코드값을 수정해 봤습니다.
# 이진화 처리 (검은색/흰색 영역 분리)
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
이 코드를
# 이진화 처리 (검은색/흰색 영역 분리)
_, binary = cv2.threshold(gray, 40, 255, cv2.THRESH_BINARY)
이렇게 변경했습니다.
그 결과, 이미지의 경계 영역을 NG 영역으로 판단하는 이슈는 없어졌습니다.
OK 이미지에 대해서 실행했을 때에도 NG가 아닌것으로 판단하는 것을 확인할 수 있었습니다.
5th Ver
AI에게 질문 :
위 코드에서 사용한 NG 판정 로직을 사용하여
1. 특정 폴더에 있는 모든 이미지를 읽어서 처리해줘
2. 각 이미지에 대해 판정 결과를 출력해줘
3. 판정 결과를 텍스트 파일로 저장해줘
4. 판정 결과가 NG인 이미지는 특정 폴더로 이동해줘
5. 단, 검은색 영역으로 경계를 나누는 기준은 40으로 해줘
본격적으로 폴더에 있는 이미지를 일괄 처리하게 소스를 수정 요청했습니다.
그리고 그 결과는 다음과 같았습니다.
이렇게 결과를 보여주고, NG로 판단된 이미지도 Result 폴더에 저장해 줬는데...
문제가 있었습니다. 파일을 '복사'한 것이 아니라 '이동' 했었기에 원본 파일이 없어졌었습니다.
※ 제가 AI에게 요청한 사항에서도 '이동'이라고 하다 보니 이와 같은 오류가 있었습니다.
6th Ver
AI에게 질문 :
NG 이미지 파일을 특정 폴더로 이동하는 것이 아니라, 복사하는 것으로 소스 수정해줘
복사하는 것으로 코드 변경을 요청했더니 이 또한 잘 동작했습니다.
그런데, 문제가 있었습니다.
OK 이미지 중에 너무 많은 이미지가 NG로 판정되었습니다. 아마도 판정 기준이 너무 엄격해서 발생한 현상인것 같습니다.
7th Ver
AI에게 질문 :
judge_image 코드에서 NG로 판단하는 기준을 50으로 바꾸고, 변수로 사용할수 있게 만들어줘
NG로 판단하는 기준을 낮췄더니 훨씬 결과가 좋습니다. 일단 NG 이미지는 모두 NG로 판단했고, OK 이미지 중에서는 2개의 이미지는 NG로 판단했지만, 나머지 이미지는 제대로 판정한 것을 볼 수 있습니다.
8th Ver
AI에게 질문 :
코드에 사용된 폴더 경로를 선택할 수 있고,
경계를 자르는 기준과 NG로 판단하는 기준을 변수로 사용할수 있게
GUI로 만들어줘
이제 GUI 구성을 요청했습니다.
그 결과, 아래 이미지와 같은 GUI를 띄워주고 실행도 잘 되는 것을 확인할 수 있었습니다.
Final Step.
마지막 Cell에 정리된 코드를 복사, 새 파이썬 파일로 저장한 다음.
Terminal에서 pyinstaller를 실행했습니다.
pyinstaller --onefile GPTers_IMG_Judge.py
그 결과, 누구나 쉽게 사용할 수 있는 실행 파일을 얻었습니다.
실행 파일 : https://drive.google.com/file/d/1EzfQ82aDP0QGid3Mvw19CUgxJuUGzwgI
Python 파일 : https://drive.google.com/file/d/1JCN8zpKO2dryV0ZRfrPk17xG_Bd4PiLs
Jupyter Notebook 파일 : https://drive.google.com/file/d/1FRVWSa4XCQn0-OOOYQOr6j6pjptnS_NA
※ Jupyter Notebook 파일에는 중간과정이 모두 포함되어 있습니다.
예제 파일 포함된 폴더 : https://drive.google.com/drive/folders/1-ccDKhJtrYdDiWHJVI1-Rgk6asNmah58?usp=sharing
특이사항
Cursor에 GitHub Copilot 확장기능을 설치하여 AI툴과 티키타카 하며 문제 해결 했습니다.
그런데,
이번 코딩에서는 Cursor이 나를 도와준건지,
GitHub Copilit이 나를 도와준 것인지 헷깔리네요. 😅
어쨋든 AI 코딩툴의 도움을 받은건 확실한데...