데이터 꿈나무
[Python_ts3] cv2 모듈 이미지 띄우고 키 값 리스트에 저장하기(cv2.imread, cv2.waitKey) 본문
[Python_ts3] cv2 모듈 이미지 띄우고 키 값 리스트에 저장하기(cv2.imread, cv2.waitKey)
ye_ju 2023. 10. 15. 07:00안녕하세요~ 이번에는 cv2 모듈을 통해 이미지를 띄우고, 사용자가 누르는 키 값을 리스트에 저장하는 task를 해보려고 해요.
os모듈과 반복문을 통해 라벨링된 초음파 이미지 데이터를 창에 띄우면서, 라벨링이 제대로 된 데이터(이미지)인지 확인하기 위한 자동화 툴을 구현해볼거예요.
이미지를 자동으로 창에 띄우면서 제가 'yes'나 'no'를 누르며 이 이미지의 라벨링이 잘 되었는지 저장해주는 코드인거죠..! 빈 리스트에 'yes'나 'no'값을 저장해나갈거랍니다.😊
데이터는 아래와 같이 생겼는데요,
왼쪽은 라벨링이 잘 된 상태, 오른쪽은 라벨링이 잘 되지 않은 상태입니다.


os모듈에 대한 포스팅은 이전 포스팅에서 진행했었는데요, 사용법을 참고하고 싶으시면 아래 글을 확인해주세요 :)
https://risingdata.tistory.com/63
[Python_ts1] os.path.split과 os.path.spiltext 알기
안녕하세요~! 오늘은 os.path로 파일 경로 다루는 법을 포스팅 해보려고 해요. 저도 os는 많이 다뤄보지 않아서 자세한 내용은 몰랐는데, 이번에 인턴하면서 알게 되어서 공부 겸 포스팅하려고 합
risingdata.tistory.com
https://risingdata.tistory.com/64
[Python_ts2] 여러 폴더 내의 파일 정보 가져오기 (os.walk)
안녕하세요~ 저번 포스팅 때 os.path.split과 os.path.splitext에 대해서 포스팅을 했었는데요, 이후에 새로운 과제를 진행하게 되어 이 주제로 포스팅 해보려고 해요:) 이번 주제는 상위폴더 아래 여러
risingdata.tistory.com
우선 필요한 모듈을 불러와 준 후, 파일 경로 및 빈 리스트를 만들어줍니다.
os모듈은 상하위 폴더를 전체적으로 읽어들일 때 필요한 모듈이고, cv2모듈은 이미지를 창에 띄울 때 필요한 모듈입니다.
저희는 labeller 리스트, 인덱스 리스트, 'y', 'n' 또는 'NaN'을 담을 리스트를 빈 리스트로 만들어 줄 것입니다.
반복문을 돌면서 해당 정보들이 리스트 안에 담기게 될거예요!
그리고 폴더 내에 이미지 파일이 없는 경우에는 'NaN'값을 입력할 것입니다.
import os
import cv2
import pandas as pd
# 파일 경로
filepath = 'T:/car/Second_upload'
labeller_list = [] # labeller 리스트
index_list = [] # 인덱스 리스트
label_flag = [] # 'y', 'n' 또는 'NaN'을 담을 리스트
다음으로 os.walk를 통해 상하위 폴더를 전체적으로 돌건데요,
저희가 띄워야 하는 이미지는 'T:/car/Second_upload\label 1\CA_1000122070\Label_Data' 경로 안에 있는 이미지(bmp파일)를 띄워줄거예요.
'for path, _, file in os.walk(filepath):'를 통해 반복문을 돌리면 path는 아래와 같이 나온답니다.
# path = T:/car/Second_upload\label 1\CA_1000122070
# T:/car/Second_upload\label 1\CA_1000122070\InI
# T:/car/Second_upload\label 1\CA_1000122070\Label_Data
if문을 통해 path 안에 'Label_Data'가 있는 경우라고 조건문을 걸어서 해당 경로로 들어갈 수 있게 해줍니다.
해당 경로 안에 이미지(bmp파일)이 없는 경우에는 label_flag변수에 'NaN'값을 저장해줄게요. ➡️ append
그리고 labeller와 index 정보도 같이 들어가야 하므로, 이 정보도 넣어줄게요!
for path, _, file in os.walk(filepath): # _와 file이 있는 path, path 아래에 있는 폴더들, path 아래에 있는 파일들
if 'Label_Data' in path:
# bmp파일이 없는 경우
if len(file) == 0: # .bmp파일이 없는 경우는 경로에 들어가지 않기 때문에 list 길이가 0이다.
# 만약, img_path = path + '/{}'.format(file[0])를 할 경우에는 file[0]이 없기 때문에 에러가 뜬다.
ret = 'NaN' # label_flag에 'NaN'입력
label_flag.append(ret)
print("label doesn't exist, {0}".format(ret))
# labeller와 index 정보는 그대로 넣어주어야 한다.
labeller = path.split('\\')[-3]
labeller_list.append(labeller)
index = path.split('\\')[-2]
index_list.append(index)
bmp 파일이 있는 경우, 해당 경로에 들어가서 cv2모듈을 통해 이미지를 창에 띄워줍니다. ( cv2.imread, cv2.imshow)
그리고 이 창이 사용자가 key를 입력하기까지의 대기 시간을 걸어줍니다. cv2.waitKey(0)이면 무한 대기가 됩니다. 여기에서 key는 'y', 'n'입니다.
입력한 key값을 label_flag 변수에 저장해줍니다.
# bmp 파일이 있는 경우
else:
# img_path = T:/car/Second_upload\label 1\CA_1000122070\Label_Data/000.BMP ...
img_path = path + '/{}'.format(file[0]) # bmp파일이 있으니, file[0]까지 해주어 경로에 들어간다.
# 이미지 띄우기
img = cv2.imread(img_path)
cv2.imshow('Label image', img)
# 키 입력 대기 시간 -> 무한 대기
ret = cv2.waitKey(0)
# labeller와 index 정보
labeller = img_path.split('\\')[-3]
labeller_list.append(labeller)
index = img_path.split('\\')[-2]
index_list.append(index)
# 입력하는 키 정보('y' or 'n') 넣어주기
label_flag.append(ret)
print('pressed key is {0}'.format(ret))
그리고 반복문을 빠져나오기 위해 아래와 같은 조건문도 작성해줍니다.
# esc or x버튼 누르면 반복문 빠져나오기
if ret == 27 or ret == -1:
break
마지막으로 데이터 프레임을 생성한 뒤, csv파일을 생성해줍니다.
# 데이터 프레임 생성
df = pd.DataFrame({
'labeller': labeller_list,
'index': index_list,
'flag': label_flag
})
# csv파일 생성
df.to_csv('result.csv', index=False)
print("END")
📌 결과



flag변수의 121과 110은 'y'와 'n'의 ASCII 값입니다. 해당 이미지의 labeller, index정보와 라벨링 정상 여부를 판단할 수 있는 flag변수까지 제대로 저장된 것을 확인할 수 있습니다.
지금까지 긴 글 읽어주셔서 감사합니다!

'Activity > Intern' 카테고리의 다른 글
| [Python_ts4] ini파일 안에 특정 텍스트가 있는지 확인하기(os.walk, configparser) (0) | 2023.10.15 |
|---|---|
| [Certi 세미나] 알고리즘 기초 - 그래프 구현과 순환 (0) | 2023.10.14 |
| [Certi 세미나] 알고리즘 기초 - 자료 정렬 (1) | 2023.10.09 |
| [Python_ts2] 여러 폴더 내의 파일 정보 가져오기 (os.walk) (2) | 2023.10.09 |
| [Python_ts1] os.path.split과 os.path.spiltext 알기 (0) | 2023.10.01 |