반응형
반응형

HyperCLOVA X Vision: 눈을 뜨다

https://me2.do/5XJDTPFL

 

CLOVA

하이퍼스케일 AI로 플랫폼 경쟁력을 강화하고 비즈니스 시너지를 확장합니다.

clova.ai

서론 
‘백문불여일견’이라는 말처럼 텍스트로 전달할 수 있는 정보량에 비해 시각적인 정보는 훨씬 다양한 의미 관계들을 전달할 수 있습니다. 또한 ‘몸이 100냥이면 눈이 90냥’이라는 말도 인간이 삶을 살아가는 데 시각으로 받아들이는 정보가 얼마나 중요한지 강조하고 있습니다. 만약 HyperCLOVA X (HCX)가 텍스트를 넘어 이미지를 이해할 수 있게 된다면, 가깝게는 문서나 이미지의 처리를 자동화할 수 있고, 더 나아가 HyperCLOVA X를 두뇌로 사용하는 로봇과 같은 독립적인 에이전트가 목표를 수행하는데도 시각 정보를 활용할 수 있을 것입니다.


시각 정보를 올바르게 처리하기 위해서는 대량의 다양한 이미지 · 텍스트 데이터를 활용하여 모델을 학습하는 것이 필수적입니다. 저희는 이를 위해 네이버 내외부에서 고품질의 원천 데이터를 확보해 왔습니다. 해당 데이터가 서로 상충하지 않고 시너지를 낼 수 있도록 학습하는 데에 지금까지 많은 노력을 기울여 왔고, 그 결과 HyperCLOVA X Vision은 문서의 이해를 포함한 여러 가지 능력을 갖추고 있습니다. 기존의 HyperCLOVA X에 이미지를 이해하는 능력을 추가하는 것뿐만 아니라 기존에 가지고 있던 텍스트 관련 능력을 잊지 않고, 안전 관련 요소들도 놓치지 않도록 다방면으로 노력을 기울여 왔습니다. 이 글에서는 HyperCLOVA X Vision의 기술적 개요와 현재의 성능 수준을 간단한 예제 위주로 구성하여 소개해 드리려고 합니다.

 

HyperCLOVA X Vision 기술 소개
HCX Vision은 기존의 거대 언어 모델(Large Language Model)에 이미지 이해 능력을 더해 거대 시각 언어 모델(Large Vision Language Model)로 발전했습니다. 이를 위해 다양한 시각 및 언어 데이터를 사용하여 추가 학습을 진행했으며, 이 과정에서 이미지와 텍스트를 동시에 이해할 수 있는 능력을 갖추게 되었습니다. 특히, 여러 시나리오에 맞춘 다양한 데이터를 수집하여 다양한 상황에서 시각과 언어 이해 작업을 수행할 수 있도록 했습니다. 예를 들어, 문서 인식이나 이미지 내 텍스트 이해와 같은 작업에서도 뛰어난 성능을 발휘할 수 있습니다.


네이버는 세계 최고 수준의 한국어와 손 글씨 인식 능력을 갖춘 OCR 기술을 보유하고 있습니다. 이러한 경험을 바탕으로, HCX Vision은 문서 처리와 글자 인식 능력을 강화하여 사용자에게 더욱 정확하고 신뢰성 있는 서비스를 제공합니다.
HCX Vision은 초대량의 한국어 데이터로 학습된 거대 언어 모델인 HCX를 기반으로 하고 있습니다. 이에 따라 여러 한국어 및 한국 문화 관련 지식을 포함하고 있으며, 이러한 특성을 HCX Vision에 성공적으로 적용함으로써 한국어 문서와 이미지 내 텍스트 이해에 탁월한 성능을 발휘합니다.

 

HyperCLOVA X Vision 의 정량 지표

Public Benchmarks

  SEEDv1
(image)
MMMU
(val)
TextVQA
(val)
DocVQA
(test)
ChartQA
(test)
InfographicVQA
(test)
MathVista
(testmini)
VQAv2 Average
GPT-4V 69.1 56.8 78 88.4 78.5 75.1 49.9 77.2 71.63
HCX-VLM 75.6 45.1 77.9 89.8 81 65.2 57.1 81 71.59
 달성률(%) 99.94

 

HyperCLOVA X Vision의 여러 정량 지표를 소개해 드립니다. 성능 트래킹을 위해 내부적으로 30개에 가까운 지표를 사용하고 있지만, 여기서는 OpenAI GPT-4V와 직접적인 비교가 가능한 지표들만 일부 가져왔습니다. 앞으로 LLM의 Reasoning 능력 향상과 VLM 측면에서의 고해상도 처리를 위한 인코더 구조 변경, 추가적인 Vision Alignment Task 등 출시 이후 올해 하반기에도 점진적으로 성능을 향상할 예정입니다.

 

K-GED (한국 초 · 중 · 고 검정고시) 성능

Model Correct Answers
GPT-4o 1152/1480 (77.8%)
HCX-VLM 1240/1480 (83.8%)

 

정량 평가 중에서도 한국향 데이터를 더 많이 학습한 모델이 강점을 보일 수 있는 영역이 무엇이 있을지 고민하다가, 대한민국 초 · 중 · 고등학교 검정고시를 벤치마크로 활용해 보았습니다. 총 1,480개의 사지선다 검정고시 기출 문제로 구성되어 있으며 이미지 형태로 입력했음에도 불구하고 83.8%로 상당히 높은 정답률을 보입니다. 참고로 검정고시의 합격 기준점은 60%이며 77.8%인 GPT-4o보다 높은 성능을 보여줍니다.

 

예제 기반의 HyperCLOVA X Vision 기능들

하기에서는 분야별 다양한 작업에 대한 예제들을 소개합니다. 한창 개발이 진행 중인 상황이라 100% 완벽하지는 않지만, 거대 모델이 출현하기 이전에 독립된 개별 작업을 별도의 모델로 하나씩 격파하던 기억을 떠올려 보면 직접 개발을 진행하는 입장에서도 격세지감이 드는 상황입니다.

 

Detailed Image Captioning
이미지에 대해 상세한 설명을 요구하는 작업으로 이미지 캡셔닝이라고도 불립니다. 별도의 객체 인식 모델을 사용하지 않음에도 불구하고 이미지의 세세한 부분까지도 비교적 정확하게 인식하고 묘사할 수 있습니다.

 

 

Reasoning
이미지에 대한 상세한 이해를 바탕으로 상황에 대해 추론하거나 다음 단계를 예측할 수 있습니다. 해당 능력은 LLM의 고유 능력을 활용하며, LLM이 여러 비전 기능을 직접적으로 받아들이도록 학습하였습니다.

 

 

Entity Recognition
Entity는 의미를 갖는 단위를 지칭하며, 인명, 장소, 제품 등 다양한 형태를 가집니다. HCX Vision을 사용하여 역사적인 인물의 이름, 유명한 장소, 상품명, 음식의 이름을 이미지만으로 이해할 수 있습니다. 현시성 강화를 위한 검색 보강 생성 (Retrieval Augmented Generation; RAG) 등의 방식을 사용하지 않더라도, 기본적으로 학습 데이터에 존재했던 Entity를 무리 없이 인식할 수 있음을 확인했습니다.

 

 

Chart Understanding
사람의 직관적인 이해를 돕기 위하여 수치적인 데이터는 차트의 형태로 유통되는 경우가 많습니다. 사람에게는 쉽지만, 기계의 입장에서는 추상적인 표현을 이해해야 하기 때문에 성능을 내기가 매우 어려운 작업입니다.

 

 

Table Understanding
수치적인 비교 데이터는 표로 나타내는 것이 일반적입니다. 원본 데이터가 Excel이나 CSV 형태일 경우 텍스트 모달을 사용하는 LLM에 입력하여 바로 활용할 수도 있지만, 해당 데이터가 이미지의 캡처본일 경우에는 이미지에 있는 텍스트를 올바르게 인식하고, 그 위치적인 상관관계들을 이해할 수 있어야 프롬프트에 적합한 답변을 생성할 수 있습니다.

 

 

Document Understanding
일반적인 영어와 한글 문서뿐만 아니라, 한자 또는 일본어로 작성된 문서도 이해할 수 있습니다.

 


Culture and Humor (Meme Understanding)
유머나 문화를 이해하기 위해서는 매우 고차원적인 수준의 능력이 필요합니다. HCX Vision은 이미지와 텍스트 쌍으로 구성된 다량의 데이터를 학습하기 때문에 이러한 밈에 대한 이해가 가능합니다.

 

 

Equation Understanding
렌더링 되어 있는 수식은 사람이 쉽게 읽을 수 있는 데 반해서, 이를 다시 디지털 포맷으로 입력하는 것은 상당히 어려운 작업으로 TeX 문법이 익숙하지 않으면 오랜 시간이 소요됩니다. HCX Vision은 이러한 수동적인 입력 작업을 상당히 간소화할 수 있습니다.

 


Code Generation
특정 도형이나 차트, 그래프 등을 생성하는 데 필요한 코드를 생성할 수 있습니다.

 

 

Math Problem Solving
도형이 포함된 수학 문제를 이해하고 풀이를 제공할 수 있습니다.

 


Creative Writing (with Image Grounding)
HCX LLM 본연의 기능에 가깝지만, 이미지에 포함된 요소들을 기반으로 창의적인 글쓰기가 가능합니다.

 

 

HyperCLOVA X Vision 미래 전망과 Sovereign AI
현재 하나의 이미지에 대한 이해에서 나아가 수백만 단위의 컨텍스트 길이를 활용하여, 한 시간 이상 분량의 영화를 통째로 이해한다거나, 스트림으로 연속적으로 들어오는 영상을 이해하는 것이 가까운 시일 내에 가능해질 것으로 전망합니다. 이에 추가로 실시간 처리 기술까지 동반된다면 AI가 독립적인 개체로써 상황에 유연하게 대응하는 것이 가능해지고 정말 영화에서나 보던 로봇이 일상생활에 녹아들어 유용함을 제공해 주는 시대가 머지않았습니다.


LVLM도 Text-only의 LLM과 마찬가지로 지역이나 문화적 배경에 따라 다양한 가치관을 이해하거나 표현할 수 있어야 합니다. 특히 시각적인 기호 등의 해석에서도 Sovereignty가 중요해질 전망이고 결국 이러한 데이터를 유리하게 확보하고 선점할 수 있는 그룹이 사람들에게 더 유용하고 안전한 AI를 개발할 수 있습니다. 네이버는 대한민국 최고의 플랫폼으로써 필요한 데이터를 효과적으로 확보할 수 있는 유리한 위치에 있습니다.

반응형
반응형

[python] Working With Mathematical Operations and Permutations. 수학적 연산과 순열

 

https://blog.stackademic.com/ultimate-python-cheat-sheet-practical-python-for-everyday-tasks-c267c1394ee8

 

Ultimate Python Cheat Sheet: Practical Python For Everyday Tasks

(My Other Ultimate Guides)

blog.stackademic.com

 


1. Basic Arithmetic Operations
    To perform basic arithmetic:

sum = 7 + 3  # Addition
difference = 7 - 3  # Subtraction
product = 7 * 3  # Multiplication
quotient = 7 / 3  # Division
remainder = 7 % 3  # Modulus (Remainder)
power = 7 ** 3  # Exponentiation

 

2. Working with Complex Numbers
    To work with complex numbers:

z = complex(2, 3)  # Create a complex number 2 + 3j
real_part = z.real  # Retrieve the real part
imaginary_part = z.imag  # Retrieve the imaginary part
conjugate = z.conjugate()  # Get the conjugate




3. Mathematical Functions
    Common math functions:

import math
root = math.sqrt(16)  # Square root
logarithm = math.log(100, 10)  # Logarithm base 10 of 100
sine = math.sin(math.pi / 2)  # Sine of 90 degrees (in radians)




4. Generating Permutations
    Easy way to generate permutations from a given set:

from itertools import permutations
paths = permutations([1, 2, 3])  # Generate all permutations of the list [1, 2, 3]
for path in paths:
    print(path)


5. Generating Combinations
    Easy way to generate combinations:

from itertools import combinations
combos = combinations([1, 2, 3, 4], 2)  # Generate all 2-element combinations
for combo in combos:
    print(combo)


6. Random Number Generation
    To get a random number:

import random
num = random.randint(1, 100)  # Generate a random integer between 1 and 100


7. Working with Fractions
    When you need to work with fractions:

from fractions import Fraction
f = Fraction(3, 4)  # Create a fraction 3/4
print(f + 1)  # Add a fraction and an integer


8. Statistical Functions
   To get Average, Median, and Standard Deviation:

import statistics
data = [1, 2, 3, 4, 5]
mean = statistics.mean(data)  # Average
median = statistics.median(data)  # Median
stdev = statistics.stdev(data)  # Standard Deviation


9. Trigonometric Functions
    To work with trigonometry:

import math
angle_rad = math.radians(60)  # Convert 60 degrees to radians
cosine = math.cos(angle_rad)  # Cosine of the angle


10. Handling Infinity and NaN
    To work with Infinity and NaN:

import math
infinity = math.inf  # Representing infinity
not_a_number = math.nan  # Representing a non-number (NaN)



 

 
반응형
반응형

[python] 폴더 안의 파일들 이름의 공백 또는 - 를 언더바로 변경하는 프로그램

 

공백( ) 또는 하이픈(-)을 언더바(_)로 변경하는 프로그램을 작성할 수 있습니다. 이 프로그램은 지정된 폴더 내 모든 파일의 이름을 확인하고, 공백 또는 하이픈이 포함된 경우 이를 언더바로 대체하여 이름을 변경합니다.

 

# 파이썬 컴파일 경로가 달라서 현재 폴더의 이미지를 호출하지 못할때 작업디렉토리를 변경한다. 
import os
from pathlib import Path
# src 상위 폴더를 실행폴더로 지정하려고 한다.
###real_path = Path(__file__).parent.parent
real_path = Path(__file__).parent
print(real_path)
#작업 디렉토리 변경
os.chdir(real_path) 


def replace_spaces_in_filenames(folder_path):
    # 폴더 내 모든 파일을 반복
    for filename in os.listdir(folder_path):
        # 파일의 전체 경로 생성
        old_file_path = os.path.join(folder_path, filename)

        # 파일 이름에 공백이 있는지, -도 _로 변경 확인
        if ' ' in filename or  '-' in filename:
            # 공백을 언더바로 대체
            new_filename = filename.replace(' ', '_').replace('-', '_')
            new_file_path = os.path.join(folder_path, new_filename)

            
            # 파일이 존재할경우 덮어쓸지, 빠져나갈지 
            if os.path.exists(new_file_path):
                overwrite = input(f"'{new_file_path}' already exists. Overwrite? (y/n): ")
                if overwrite.lower() == 'y':
                    os.remove(new_file_path)
                else:
                    print("Operation canceled.")
                    exit()
            # 파일 이름 변경
            os.rename(old_file_path, new_file_path)
            
            
            print(f"Renamed: '{filename}' -> '{new_filename}'")
        else:
            print(f"No change: '{filename}'")

# 사용 예시
folder_path = 'path_to_your_folder'  # 여기에 폴더 경로를 입력하세요 
replace_spaces_in_filenames(folder_path)

프로그램 설명

  1. os 모듈: 파일 경로와 관련된 작업을 수행하기 위해 os 모듈을 사용합니다.
  2. 폴더 내 파일 탐색:
    • os.listdir(folder_path)를 사용하여 지정된 폴더 내의 모든 파일 및 하위 디렉토리 이름을 가져옵니다.
    • for filename in os.listdir(folder_path)를 사용하여 각 파일을 순회합니다.
  3. 공백과 하이픈을 언더바로 변경:
    • if ' ' in filename or '-' in filename: 조건문을 사용하여 파일 이름에 공백 또는 하이픈이 포함되어 있는지 확인합니다.
    • filename.replace(' ', '_').replace('-', '_')를 사용하여 공백과 하이픈을 언더바로 대체합니다.
  4. 파일 이름 변경:
    • os.rename(old_file_path, new_file_path)를 사용하여 파일 이름을 변경합니다.
  5. 사용 방법:
    • folder_path에 파일 이름을 변경할 폴더의 경로를 입력합니다.
    • 프로그램을 실행하면 폴더 내 모든 파일의 이름에서 공백과 하이픈이 언더바로 변경됩니다.

사용 예시

폴더 경로를 지정하여 프로그램을 실행하면, 그 폴더 안의 모든 파일 이름에서 공백 또는 하이픈이 언더바로 변경됩니다. 예를 들어, path_to_your_folder가 C:/Users/YourName/Documents/TestFolder인 경우:

반응형
반응형

1. 빈 배열 대입


let array = [1,2,3,4,5];

array = []

console.log(array)  // []

 

단순하게 빈 배열 대입하여 배열을 비울 수 있습니다.

 

 

 

2. 배열의 길이 수정


let array = [1,2,3,4,5]

array.length = 0

console.log(array)  // []


배열의 길이를 0으로 수정하면 배열을 비울 수 있습니다.

※ 배열의 길이를 수정하면 해당 길이만큼 배열의 크기가 바꿔지며

    현재 길이보다 크게 변경 할 경우 해당 자리에 빈 값이 들어가며 sparse Array가 됩니다.

 

 

 

3. 배열 자르기


let array = [1,2,3,4,5]

array.splice(0)

console.log(array)  // []

 

splice 함수를 사용하면 해당 배열에서 설정한 크기만큼 잘라 반환합니다.
따라서 splice(0)을 사용하면 처음부터 끝까지 자르기 때문에 array가 비어지는 효과가 나타나게 됩니다.

 

 

 

4. 배열의 요소 하나하나 직접 반환


let array = [1,2,3,4,5]

while(array.length > 0){
    array.shift() 또는 array.pop()
}

배열의 shift() 또는 pop() 함수를 이용하여 요소들을 하나씩 직접 반환하는 방법입니다.

※ shift() - FIFO 먼저 들어온 요소 반환, pop() - LIFO 마지막에 들어온 요소 반환

반응형
반응형

1. Navigating File Paths

To craft and dissect paths, ensuring compatibility across realms (operating systems):

import os
# Craft a path compatible with the underlying OS
path = os.path.join('mystic', 'forest', 'artifact.txt')
# Retrieve the tome's directory
directory = os.path.dirname(path)
# Unveil the artifact's name
artifact_name = os.path.basename(path)

2. Listing Directory Contents

To reveal all entities within a mystical directory:

import os
contents = os.listdir('enchanted_grove')
print(contents)

3. Creating Directories

To conjure new directories within the fabric of the filesystem:

import os
# create a single directory
os.mkdir('alchemy_lab')
# create a hierarchy of directories
os.makedirs('alchemy_lab/potions/elixirs')

4. Removing Files and Directories

To erase files or directories, banishing their essence:

import os
# remove a file
os.remove('unnecessary_scroll.txt')
# remove an empty directory
os.rmdir('abandoned_hut')
# remove a directory and its contents
import shutil
shutil.rmtree('cursed_cavern')

5. Executing Shell Commands

To invoke the shell’s ancient powers directly from Python:

import subprocess
# Invoke the 'echo' incantation
result = subprocess.run(['echo', 'Revealing the arcane'], capture_output=True, text=True)
print(result.stdout)

6. Working with Environment Variables

To read and inscribe upon the ethereal environment variables:

import os
# Read the 'PATH' variable
path = os.environ.get('PATH')
# Create a new environment variable
os.environ['MAGIC'] = 'Arcane'

7. Changing the Current Working Directory

To shift your presence to another directory within the filesystem:

import os
# Traverse to the 'arcane_library' directory
os.chdir('arcane_library')

8. Path Existence and Type

To discern the existence of paths and their nature — be they file or directory:

import os
# Check if a path exists
exists = os.path.exists('mysterious_ruins')
# Ascertain if the path is a directory
is_directory = os.path.isdir('mysterious_ruins')
# Determine if the path is a file
is_file = os.path.isfile('ancient_manuscript.txt')

9. Working with Temporary Files

To summon temporary files and directories, fleeting and ephemeral:

import tempfile
# Create a temporary file
temp_file = tempfile.NamedTemporaryFile(delete=False)
print(temp_file.name)
# Erect a temporary directory
temp_dir = tempfile.TemporaryDirectory()
print(temp_dir.name)

10. Getting System Information

To unveil information about the host system, its name, and the enchantments it supports:

import os
import platform
# Discover the operating system
os_name = os.name  # 'posix', 'nt', 'java'
# Unearth detailed system information
system_info = platform.system()  # 'Linux', 'Windows', 'Darwin'

 

 
반응형
반응형

[python] Working With Dictionaries

1. Creating a Dictionary

To forge a new dictionary:

# A tome of elements and their symbols
elements = {'Hydrogen': 'H', 'Helium': 'He', 'Lithium': 'Li'}

2. Adding or Updating Entries

To add a new entry or update an existing one:

elements['Carbon'] = 'C'  # Adds 'Carbon' or updates its value to 'C'

3. Removing an Entry

To banish an entry from the dictionary:

del elements['Lithium']  # Removes the key 'Lithium' and its value

4. Checking for Key Existence

To check if a key resides within the dictionary:

if 'Helium' in elements:
    print('Helium is present')

5. Iterating Over Keys

To iterate over the keys in the dictionary:

for element in elements:
    print(element)  # Prints each key

6. Iterating Over Values

To traverse through the values in the dictionary:

for symbol in elements.values():
    print(symbol)  # Prints each value

7. Iterating Over Items

To journey through both keys and values together:

for element, symbol in elements.items():
    print(f'{element}: {symbol}')

8. Dictionary Comprehension

To conjure a new dictionary through an incantation over an iterable:

# Squares of numbers from 0 to 4
squares = {x: x**2 for x in range(5)}

9. Merging Dictionaries

To merge two or more dictionaries, forming a new alliance of their entries:

alchemists = {'Paracelsus': 'Mercury'}
philosophers = {'Plato': 'Aether'}
merged = {**alchemists, **philosophers}  # Python 3.5+

10. Getting a Value with Default

To retrieve a value safely, providing a default for absent keys:

element = elements.get('Neon', 'Unknown')  # Returns 'Unknown' if 'Neon' is not found

 

https://blog.stackademic.com/ultimate-python-cheat-sheet-practical-python-for-everyday-tasks-c267c1394ee8

 

Ultimate Python Cheat Sheet: Practical Python For Everyday Tasks

(My Other Ultimate Guides)

blog.stackademic.com

 

반응형

+ Recent posts