DAY 2 : Labeling
210824
기존 데이터는 다음과 같다
data
id
gender
race
age
path
0
000001
female
Asian
45
000001_female_Asian_45
1
000002
female
Asian
52
000002_female_Asian_52
2
000004
male
Asian
54
000004_male_Asian_54
3
000005
female
Asian
58
000005_female_Asian_58
4
000006
female
Asian
59
000006_female_Asian_59
...
...
...
...
...
...
2695
006954
male
Asian
19
006954_male_Asian_19
2696
006955
male
Asian
19
006955_male_Asian_19
2697
006956
male
Asian
19
006956_male_Asian_19
2698
006957
male
Asian
20
006957_male_Asian_20
2699
006959
male
Asian
19
006959_male_Asian_19
2700 rows × 5 columns
위처럼, 현재 데이터프레임은 id와 gender, race, age 그리고 path라는 컬럼으로 이루어진 테이블로 되어있다. 라벨링을 해야하는 두 가지 이유가 있다.
1. 현재는 한 사람의 7장 사진이 있는 폴더를 기준으로 데이터프레임이 구성되어있다. 추후에 이미지 접근을 사진 각각에 하기 위해서 데이터프레임을 확장해야한다. 이 때 각각의 이미지 주소를 가지고 있는 컬럼을 추가한다.
2. 현재는 직접적으로 클래스를 나타내지 않으므로 모델에서 분류하기에 가능은 하나 불편함이 있다. 또한 GPU 효율을 최대화하기 위해 이런 작업은 CPU에서 최대한 해주는 것이 좋다. 나이와 성별 그리고 마스크 착용 여부를 토대로 라벨을 추가해야한다. 이 때 마스크 착용 여부는 이미지의 이름으로 판단한다.
각 클래스는 다음과 같은 특징이있다.
마스크 정상 착용 : +0 | 마스크 비정상 착용 : +6 | 마스크 미착용 : +12
남성 : +0 | 여성 : +3
30세 미만 : +0 | 30세 이상 60세 미만 : +1 | 60세 이상 : +2

따라서, 조건문으로 구별하기 보다는 각 속성들을 수식화하면 쉽게 라벨링 할 수 있다.
마스크
파일명에 'Incorrect'가 포함되면 +6
파일명에 'Normal'이 포함되면 +12
성별
남성과 여성의 차이가 3만큼 나야한다. 문자열로만 비교할 수 있는 점은 길이가 다르다는 것. 이를 이용한다. 남성은 4글자, 여성은 6글자이다
현재 둘의 차이는 2글자이므로 이것이 3만큼 차이나려면 1.5배만큼 곱해야한다.
나이
간격이 30만큼 있으므로 30으로 나눈 몫만큼을 할당한다
data2 = []
def new_dataframe(x):
id, gender, race, age = x.split('_')
for filename in FILES:
path = os.path.join(DATA_DIR, x, filename)
path = glob(path)[0]
label = (int(age) // 30) + (len(gender) * 1.5 - 6)
if 'incorrect' in filename:
label += 6
elif 'normal' in filename:
label += 12
data2.append([gender, age, path, int(label)])
data['path'].apply(new_dataframe)
data2 = pd.DataFrame(data=data2, columns=['gender', 'age', 'path', 'label'])
data2
gender
age
path
label
0
female
45
./input/data/train/images/000001_female_Asian_...
4
1
female
45
./input/data/train/images/000001_female_Asian_...
4
2
female
45
./input/data/train/images/000001_female_Asian_...
4
3
female
45
./input/data/train/images/000001_female_Asian_...
4
4
female
45
./input/data/train/images/000001_female_Asian_...
4
...
...
...
...
...
18895
male
19
./input/data/train/images/006959_male_Asian_19...
0
18896
male
19
./input/data/train/images/006959_male_Asian_19...
0
18897
male
19
./input/data/train/images/006959_male_Asian_19...
0
18898
male
19
./input/data/train/images/006959_male_Asian_19...
6
18899
male
19
./input/data/train/images/006959_male_Asian_19...
12
18900 rows × 4 columns
이후, 매번 데이터프레임을 만들고 불러오는 작업을 줄이기 위해 새롭게 csv 파일로 저장하고 이후에 불러올 수 있도록 한다.
data2.to_csv("train_data.csv", mode='w', index=False)
mode
를w
로 설정하면 덮어쓰기가 되며 이어서 수정하려면a
로 설정하면 된다.index=False
를 하지않으면 이후에 다시 불러올 때index
가 두 개의 컬럼으로 존재하게 된다. csv파일로 저장될 때는 자체에 default로 index가 있기 때문이다.
Last updated
Was this helpful?