예산 현황
항목 | 내역 | 단가(원) | 수량 | 금액(원) |
일반수용비 | 실험실습비(유저스터디, 인당 63,750원*10명, 2회) | 637,500 | 2 | 1,275,000 |
ㅤ | 학회 등록비 | 1,300,000 | 1 | 1,300,000 |
ㅤ | ||||
ㅤ | 실험실습비(LLM API 활용) | 150,000 | 1 | 150,000 |
ㅤ | ||||
소계 | ㅤ | ㅤ | ㅤ | 4,227,200 |
국내 여비 | ||||
ㅤ | ||||
소계 | ㅤ | ㅤ | ㅤ | 2,142,800 |
사업 관리비 | 회의비 30,000원 * 3회 * 7명(6명+교수님) | 210,000 | 3 | 630,000
(현재 202,000원 사용) |
소계 | ㅤ | ㅤ | ㅤ | 630,000 |
자산 취득비 | ||||
소계 | ㅤ | ㅤ | ㅤ | 0 |
합계 | ㅤ | 7,000,000 |
( 학회등록비(130) + 회의비(42) + 학회여비(25) )
예산 사용방법 안내
GPT API + 실험 참여자 인건비 제공
- GPT API 사용
저희가 개발중인 인공지능 모델에 대한 성능검증을 비교하기 위해 GPT API를 사용할려고 하는데요, 일반 GPT 월구독제 형태가 아니라, 크레딧을 일정금액 충전하여, 테스트를 진행할 때마다 일정금액이 차감되는 형태입니다. 여기서 일정금액(예: 100,000원 일괄충전)을 충전할 때 UGRP 예산 사용이 가능한지 궁금합니다.
▶ 사용가능합니다.
다만, 일정금액을 충전할 때 이 부분이 다 소진이 된 사용 내역에 대한 확인이 추가로 필요합니다. 따라서 최소 충전금액을 충전하시거나 실질적으로 필요하다고 예상되는 금액만 일단 충전해 주시길 바랍니다. 그리고 직접구매 신청 시 비고(사용목적)에 반드시 "해당 결제 건은 월구독료가 아닌 크레딧 최소금액 충전 후 차감되는 형태"임을 활용목적과 함께 꼭 명시해 주셔야 합니다. 검수 시에는 검수 증빙자료로 사용량에 대한 데이터값을 추가로 첨부해 주셔야 합니다.
- 실험 참여자 인건비 제공
개발된 인공지능 모델에 대해 사람들의 직접평가를 모집하고, 이에 대한 보수를 지급하고자 하는데, 이 부분도 '실험실습비'나 '전문가활용비'와 같은 비목에서 사용이 가능한 범위인지 궁금합니다. 실험대상은 언어분야의 전문가분들을 대상으로 실시할 것 같습니다. (혹여나 DGIST내 학생들을 대상으로 실험을 진행했을 때에도 보수지급이 가능한지 궁금합니다.)
▶ 사례비 지급은 가능하며, 일반수용비에서 지출가능합니다.
DGIST 내 학생들 대상으로 진행 시에도 보수 지급은 가능합니다. 다만, 시험 진행 시 아래 챙겨야 할 서류들을 사전에 체크하여 문제가 없도록 진행해 주시길 바랍니다.
▶ 우선, 해당 건은 UGRP 직접구매 시스템(포털)에 등록하지 않고 담당자에게 관련 서류를 제출해 주시면 피험자 계좌로 사례비를 지급할 예정입니다.
따라서 아래 요청드리는 서류들을 꼭 잘 챙겨서 제출해 주시길 바랍니다.
< 실험 진행 전 제출서류>
- 담당자가 별도로 임상시험 진행에 대한 내부절차를 진행해야 하므로 아래 서류를 작성하여 제출요청
- 심의결과서(IRB 승인서 또는 심의결과통보서)
※ IRB 승인서는 필수 제출서류가 아니라 IRB 심의 대상 여부를 담당부서에 문의 후, 심의 대상일 경우 "심의 후 승인서"를 심의 대상이 아닐 경우, "심의 면제대상"에 대한 문서로 대체할 것
- 연구계획서
- 피험자 모집공고문
- 피험자동의서(양식)
- 개인정보수집이용동의서
<실험진행 후 제출서류>
- 실험 진행 후에는 피험자에게 반드시 필요 서류들의 서명을 받아주시고 아래 서류를 제게 제출해 주셔야 피험자에게 사례비 지급이 가능합니다.
- 피험자 동의서
- 개인정보수집이용동의서
- 사례비 지급받을 계좌정보 (은행명, 계좌번호, 예금주)
- 실험확인서(결과물)
Metric Performance [정량평가, non-Usability Test]
(원본 이미지만 넣었을 때 vs. 원본 이미지 + superpixel 이미지 넣었을 때)
1. Distinct(D-1, D-2) - 다양성 측정
Distinct 점수가 높으면 다양한 표현이 사용되었음을 나타냄. (중복된 단어가 전체 문장대비 적을수록 수치 높아짐)
D-1, D-2 계산기 (unigram, bigram 이용)
def calculate_uniqueness(sentence): # Unigram 처리 input_list = sentence.split() total_unigrams = len(input_list) unique_unigrams = len(set(input_list)) # Bigram 처리 bigrams = [f"{input_list[i]} {input_list[i+1]}" for i in range(total_unigrams - 1)] total_bigrams = len(bigrams) unique_bigrams = len(set(bigrams)) # D-1과 D-2 계산 D1 = unique_unigrams / total_unigrams if total_unigrams > 0 else 0 D2 = unique_bigrams / total_bigrams if total_bigrams > 0 else 0 return total_unigrams, unique_unigrams, D1, total_bigrams, unique_bigrams, D2 # 첫 번째 문장 입력 받기 sentence1 = input("원본 이미지만: ") # 두 번째 문장 입력 받기 sentence2 = input("원본 이미지+superpixel: ") # 첫 번째 문장에 대한 결과 계산 및 출력 unigrams1, unique_unigrams1, D1_1, bigrams1, unique_bigrams1, D2_1 = calculate_uniqueness(sentence1) print("\n원본 이미지 문장:") print(f"총 unigram 개수: {unigrams1}, 고유 unigram 개수: {unique_unigrams1}") print(f"총 bigram 개수: {bigrams1}, 고유 bigram 개수: {unique_bigrams1}") print(f"D-1: {D1_1:.2f}, D-2: {D2_1:.2f}") # 두 번째 문장에 대한 결과 계산 및 출력 unigrams2, unique_unigrams2, D1_2, bigrams2, unique_bigrams2, D2_2 = calculate_uniqueness(sentence2) print("\n원본 이미지+superpixel 문장:") print(f"총 unigram 개수: {unigrams2}, 고유 unigram 개수: {unique_unigrams2}") print(f"총 bigram 개수: {bigrams2}, 고유 bigram 개수: {unique_bigrams2}") print(f"D-1: {D1_2:.2f}, D-2: {D2_2:.2f}")
결과
a끼리 비교
원본 이미지 문장: 총 unigram 개수: 41, 고유 unigram 개수: 35 총 bigram 개수: 40, 고유 bigram 개수: 39 D-1: 0.85, D-2: 0.97 원본 이미지+superpixel 문장: 총 unigram 개수: 50, 고유 unigram 개수: 45 총 bigram 개수: 49, 고유 bigram 개수: 48 D-1: 0.90, D-2: 0.98
D-1과 D-2 모두 원본 이미지+superpixel 했던 것이 더 수치적으로 높음.
b끼리 비교
원본 이미지 문장: 총 unigram 개수: 44, 고유 unigram 개수: 37 총 bigram 개수: 43, 고유 bigram 개수: 42 D-1: 0.84, D-2: 0.98 원본 이미지+superpixel 문장: 총 unigram 개수: 65, 고유 unigram 개수: 51 총 bigram 개수: 64, 고유 bigram 개수: 62 D-1: 0.78, D-2: 0.97
D-1과 D-2 모두 원본 이미지만 넣었던 것이 더 수치적으로 높음.
※ 오히려 다시 생성했을 떄 superpixel의 효과를 덜 보는 것일 수도..???
(D-1)원본 이미지만 입력한 경우
a : 0.85
b : 0.84
평균 : 0.845
(D-1)원본 이미지+superpixel 입력한 경우
a : 0.90
b : 0.78
평균 :0.84
(D-2)원본 이미지만 입력한 경우
a : 0.97
b : 0.98
평균 : 0.975
(D-2)원본 이미지+superpixel 입력한 경우
a : 0.98
b : 0.97
평균 :0.975
결론: 처음 생성한(a) 애들은 superpixel 같이 넣은 게 수치적으로 더 좋았으나, 다시 생성했을 떄는 오히려 낮아짐
2. BLEU
BLEU는 정답이 되는 reference sentence와 모델로부터 생성된 문장인 generated sentence 간의 단어나 구(phrase)의 일치도를 측정하는 방식
→ 이건 정답이 되는 단어들을 직접 선별 이후 (선별 기준은 어떻게?? 고민 혹은 서칭 필요)
(1) reference sentence에 포함된 n-gram의 수
(2) 문장의 전체 n-gram 수
구해서 (1)/(2) 구하면 될듯
BLEU 계산기 (Python)
import numpy as np import matplotlib.pyplot as plt from ipywidgets import interactive from nltk.translate.bleu_score import sentence_bleu, SmoothingFunction def bleu_score_only(candidate_sentence, reference_sentence): # BLEU score 계산 reference = [reference_sentence.split()] # reference는 리스트의 리스트 형태여야 합니다. candidate = candidate_sentence.split() bleu_score = sentence_bleu(reference, candidate, smoothing_function=SmoothingFunction().method1) print(f"BLEU Score: {bleu_score:.4f}") interactive_plot = interactive(bleu_score_only, candidate_sentence="This is a modern living room with pink walls and matching pink furniture, including a sofa and two chairs. There is a large painting on the wall and a stylish lamp on a small table.", reference_sentence="A contemporary living room featuring a pink sofa, a cozy armchair, and an abstract painting on the wall. The room is decorated with modern lighting and a potted plant, creating a warm and inviting atmosphere.") output = interactive_plot.children[-1] interactive_plot
- Chat GPT 를 이용하여 3가지 output을 reference sentence로 설정하여 평가

결과
3. BEER (BEtter Evaluation and Ranking)
텍스트의 자연스러움, 일관성 및 문맥 적합성을 평가 (텍스트 품질을 평가)
BEER 계산기
from collections import Counter import math import numpy as np from typing import List, Dict, Tuple class BeerScorer: def __init__(self): # 가중치 설정 (실제 BEER 논문의 가중치와는 다를 수 있음) self.weights = { 'char_ngram': 0.4, 'word_ngram': 0.4, 'length_penalty': 0.2 } def get_char_ngrams(self, text: str, n: int) -> Counter: """문자 n-gram을 추출합니다.""" chars = list(text.lower()) return Counter([''.join(chars[i:i+n]) for i in range(len(chars)-n+1)]) def get_word_ngrams(self, text: str, n: int) -> Counter: """단어 n-gram을 추출합니다.""" words = text.lower().split() return Counter([' '.join(words[i:i+n]) for i in range(len(words)-n+1)]) def calculate_precision_recall_f1(self, ref_counts: Counter, cand_counts: Counter) -> Tuple[float, float, float]: """정밀도, 재현율, F1 점수를 계산합니다.""" common = sum((ref_counts & cand_counts).values()) ref_total = sum(ref_counts.values()) cand_total = sum(cand_counts.values()) precision = common / cand_total if cand_total > 0 else 0 recall = common / ref_total if ref_total > 0 else 0 if precision + recall > 0: f1 = 2 * (precision * recall) / (precision + recall) else: f1 = 0 return precision, recall, f1 def length_ratio_penalty(self, ref_len: int, cand_len: int) -> float: """길이 비율에 따른 페널티를 계산합니다.""" ratio = cand_len / ref_len if ref_len > 0 else 0 return math.exp(-abs(1 - ratio)) def calculate_beer_score(self, reference: str, candidate: str) -> float: """BEER 점수를 계산합니다.""" # 문자 n-gram (n=4) 계산 ref_char_ngrams = self.get_char_ngrams(reference, 4) cand_char_ngrams = self.get_char_ngrams(candidate, 4) char_prec, char_rec, char_f1 = self.calculate_precision_recall_f1( ref_char_ngrams, cand_char_ngrams) # 단어 n-gram (n=2) 계산 ref_word_ngrams = self.get_word_ngrams(reference, 2) cand_word_ngrams = self.get_word_ngrams(candidate, 2) word_prec, word_rec, word_f1 = self.calculate_precision_recall_f1( ref_word_ngrams, cand_word_ngrams) # 길이 페널티 계산 length_penalty = self.length_ratio_penalty( len(reference.split()), len(candidate.split())) # 최종 BEER 점수 계산 beer_score = ( self.weights['char_ngram'] * char_f1 + self.weights['word_ngram'] * word_f1 + self.weights['length_penalty'] * length_penalty ) return beer_score # 사용 예시 def print_beer_score(reference: str, candidate: str): scorer = BeerScorer() score = scorer.calculate_beer_score(reference, candidate) print(f"BEER Score: {score:.4f}") if __name__ == "__main__": # 예시 문장 reference = "이것은 참조 문장입니다." candidate = "이것은 후보 문장입니다." print_beer_score(reference, candidate)
결과
- 원본 이미지 (a) 와 Ref 1번째 문장
BEER Score: 0.1874
- 원본 이미지+Superpixel (a) 와 Ref 1번째 문장
BEER Score: 0.2893
- 원본 이미지 (b) 와 Ref 1번째 문장
BEER Score: 0.3282
- 원본 이미지+Superpixel (b) 와 Ref 1번째 문장
BEER Score: 0.3282
(a)에서만 Superpixel을 넣은 것이 수치적으로 높게 평가됨.
처음 생성한(a) 애들은 superpixel 같이 넣은 게 수치적으로 더 좋았으나, 다시 생성했을 떄는 오히려 낮아짐 → n-gram이 들어가니 Distinct랑 유사하게 결과물이 나오는 듯
4. Lexical diversity
서로 다른 단어들이 얼마나 많이 사용되었는지 확인함으로써 어휘의 다양성 수치화
코드
generated_text = "이 이미지는 짙은 갈색 털을 가진 말과 망아지가 밝은 초록색 풀밭에 서있는 모습을 보여줍니다. 망아지는 어미 말보다 좀 더 붉은 색을 띠고 있습니다. 어미 말의 얼굴은 흰색이고 눈은 검은색입니다. 망아지는 어미 말을 바라보고 있고, 어미 말은 망아지가 아닌 다른 곳을 바라보고 있습니다. 전반적으로 이 이미지는 따뜻하고 평화로운 분위기를 자아냅니다. 푸른 풀밭과 밝은 노란색 꽃은 따뜻함과 생동감을 더해줍니다. 어미 말과 망아지의 모습은 사랑스러운 분위기를 자아내고 있습니다." words = generated_text.split() lexical_diversity = len(set(words)) / len(words) if words else 0 print(lexical_diversity)
결과
Metric Performance [Usability Test]
BENCHMARK METRIC 개발
본 연구에서는 다양한 전처리 조건에서 대규모 언어 모델(LLM)이 생성하는 색상 설명의 품질과 다양성을 평가하기 위한 벤치마크 메트릭을 제안하고 평가한다. 구체적으로, 평가의 기초가 되는 네 가지 메트릭을 선정했다: Distinct (D-1, D-2), BLEU, BEER (Better Evaluation and Ranking), Lexical Diversity. 이 메트릭들은 생성된 설명에서 ‘다양성’과 ‘정확성’이라는 두 가지 측면을 다루기 위해 선택되었다.
이 평가의 목적은 Superpixel 및 YOLO와 같은 전처리 기법이 원본 이미지만 사용할 때와 비교하여 색상 설명 생성에 어떤 영향을 미치는지 분석하는 것이다. 전처리된 이미지와 원본 이미지를 모두 LLM 입력으로 포함함으로써, 생성된 설명의 품질과 다양성 차이를 평가하기 위한 명확한 기준을 수립하고자 한다.
- Distinct (D-1, D-2): 생성된 설명에서 유니그램과 바이그램의 고유성을 측정하여 다양성을 정량화한다. 높은 점수는 표현 범위가 넓고 풍부한 설명 세트를 반영한다.
- BLEU: 참조 설명과 생성된 설명 간의 n-그램 중첩을 기반으로 일치도를 평가한다. 이는 모델 출력이 사람이 직접 제공하는 설명(Reference Text)과 얼마나 밀접하게 일치하는지를 나타낸다.
- BEER (Better Evaluation and Ranking): 구문적 및 의미적 고려사항을 결합하여 출력 정확도와 관련성을 세부적으로 평가한다. BLEU와 보완적으로 작용하며, 순위 기반 평가를 포함한다.
- Lexical Diversity: 어휘 사용의 변화를 측정하여 설명이 얼마나 다양하고 표현력이 풍부한지를 강조한다.
이러한 메트릭을 결합함으로써 전처리 방법이 LLM 생성 설명의 품질에 미치는 영향을 엄격히 평가할 수 있도록 하며, 이미지에서 세밀한 색상 정보를 포착하는 데 있어 전처리 방법이 어떤 영향을 미치는지 분석할 수 있다.