반응형

 

지난 글에서는 SAM 2.1 모델을 이용해 여행 사진에서 특정 객체를 추출하는 작업을 진행했습니다.

전통 정자가 있는 사진에서 건축물의 영역을 분리하고 mask.png, overlay.png, subject.png 세 가지 결과물을 생성하는 데 성공했습니다.

이번에는 추출한 이미지를 이용해 사진의 색상과 형태를 단순화하는 이미지 추상화(Image Abstraction) 작업을 진행해 보았습니다.

최종 목표는 여행지의 특징을 유지하면서 복잡한 디테일을 제거하고, 간결한 일러스트로 변환하는 것입니다.

이를 위해 OpenCV의 Bilateral Filter, K-Means, CLAHE 등을 활용해 총 6가지 실험을 진행했습니다.

1. 이미지 추상화란?

이미지 추상화는 원본 이미지에서 불필요한 세부 정보를 줄이고 중요한 형태와 색상을 강조하는 작업입니다.

예를 들어 전통 정자 사진에는 기와지붕, 기둥, 난간, 단청 장식, 그림자 등 다양한 정보가 포함되어 있습니다.

우리가 원하는 것은 이러한 정보를 모두 표현하는 것이 아니라, 정자를 알아볼 수 있는 특징만 남기는 것입니다.

이번 프로젝트에서는 다음과 같은 방향으로 추상화를 진행하려고 합니다.

  • 기와지붕의 곡선과 형태 유지
  • 붉은 기둥과 난간 구조 보존
  • 복잡한 질감과 그림자 단순화
  • 제한된 색상으로 일러스트 표현
  • 배경이 투명한 PNG 이미지 생성

다만 OpenCV는 사진 속 건축물의 의미를 이해하고 새로운 그림으로 재구성하는 생성형 AI는 아닙니다.

따라서 이번 실험은 OpenCV만으로 어느 정도까지 추상화할 수 있는지 확인하는 과정입니다.

 


2. 첫 번째 실험: 색상 수를 줄여보자

첫 번째 실험에서는 색상 수에 따라 이미지가 어떻게 달라지는지 확인했습니다.

사용한 기술은 크게 세 가지입니다.

Bilateral Filter

이미지의 주요 경계를 비교적 유지하면서 작은 색상 변화를 줄이는 필터입니다.

K-Means 색상 양자화

비슷한 색상을 그룹으로 묶어 이미지를 제한된 색상으로 표현하는 방법입니다.

Median Filter

주변 픽셀의 중앙값을 이용해 작은 노이즈와 색상 변화를 줄이는 필터입니다.

이 세 가지를 조합해 A, B, C 이미지를 생성했습니다.

실험 설정

실험 색상 수 단순화 강도
A 12색 약함
B 8색 중간
C 5색 강함

Python 구현

파일 위치: src/abstraction/abstract_image.py

먼저 SAM 2에서 추출한 이미지를 불러옵니다.

from pathlib import Path

import cv2
import numpy as np
from PIL import Image

PROJECT_ROOT = Path(__file__).resolve().parents[2]

INPUT_PATH = (
    PROJECT_ROOT
    / "outputs/segmentation/subject.png"
)

image = np.array(
    Image.open(INPUT_PATH).convert("RGBA")
)

rgb = image[:, :, :3]
alpha = image[:, :, 3]

여기서 RGB와 Alpha 채널을 분리했습니다.

RGB는 이미지의 색상 정보이고 Alpha는 투명도 정보입니다.

투명한 배경을 유지하기 위해 Alpha 채널은 따로 보관했습니다.

Bilateral Filter 적용

smoothed = cv2.bilateralFilter(
    rgb,
    d=7,
    sigmaColor=80,
    sigmaSpace=80
)

Bilateral Filter는 이미지의 작은 색상 변화를 줄이면서 주요 경계는 상대적으로 유지하는 역할을 합니다.

정자의 기와지붕처럼 세밀한 질감이 많은 영역을 단순화하기 위해 적용했습니다.

K-Means 색상 양자화

이번 실험에서 가장 중요한 부분입니다.

valid_mask = alpha > 127

pixels = rgb[valid_mask]

samples = np.float32(pixels)

criteria = (
    cv2.TERM_CRITERIA_EPS
    + cv2.TERM_CRITERIA_MAX_ITER,
    30,
    0.2
)

cv2.setRNGSeed(42)

_, labels, centers = cv2.kmeans(
    samples,
    12,
    None,
    criteria,
    5,
    cv2.KMEANS_PP_CENTERS
)

K-Means는 픽셀의 색상을 분석해 비슷한 색끼리 그룹화합니다.

위 코드에서는 12를 지정했으므로 이미지에 사용되는 색상을 최대 12개로 줄입니다.

실험 B에서는 8개, C에서는 5개로 변경했습니다.

색상을 줄이면 이미지가 단순해질 것으로 예상했습니다.

하지만 실제 결과는 생각과 조금 달랐습니다.


3. A·B·C 실험 결과

세 가지 결과물을 비교했을 때 A가 가장 자연스러웠습니다.

실험 결과
A - 12색 기와지붕과 기둥이 비교적 선명함
B - 8색 기둥과 난간의 색상 구분이 약해짐
C - 5색 어두운 영역이 통합되어 구조 일부 손실

A - 12색

기와지붕의 형태와 붉은 기둥이 비교적 잘 유지되었습니다.

하지만 사진의 세부 질감이 많이 남아 있어 우리가 원하는 일러스트와는 차이가 있었습니다.

B - 8색

색상 수를 줄이면서 이미지가 조금 더 단순해졌습니다.

그러나 붉은 기둥과 난간이 주변의 어두운 영역과 비슷한 색상으로 표현되기 시작했습니다.

C - 5색

가장 단순한 이미지가 생성되었지만 건축물의 특징이 많이 사라졌습니다.

특히 지붕 아래의 기둥과 난간이 어두운 색상으로 합쳐졌습니다.

결과적으로 색상 수를 줄인다고 반드시 좋은 추상화 이미지가 만들어지는 것은 아니라는 점을 확인했습니다.

왜 검은색이 많아졌을까?

처음에는 색상 수를 줄이면서 검은색이 많아지는 것이 문제라고 생각했습니다.

하지만 실제로는 여러 어두운 색상이 하나의 대표 색상으로 통합되는 것이 더 큰 문제였습니다.

K-Means는 RGB 값이 비슷한 픽셀을 그룹화할 뿐, 정자의 지붕과 기둥이 서로 다른 구조물이라는 사실은 이해하지 못합니다.

따라서 그림자 때문에 어둡게 촬영된 붉은 기둥이 다른 어두운 영역과 같은 색상으로 묶일 수 있습니다.

이 문제를 해결하기 위해 두 번째 개선 실험을 진행했습니다.


4. 두 번째 실험: LAB와 CLAHE로 밝기 개선

이번에는 단순히 색상 수를 줄이는 대신, 이미지의 어두운 영역을 먼저 보정하기로 했습니다.

특히 정자의 지붕 아래쪽과 기둥, 난간이 지나치게 어둡게 표현되는 문제를 개선하는 것이 목표였습니다.

이를 위해 LAB 색 공간과 CLAHE를 사용했습니다.

LAB 색 공간이란?

LAB 색 공간은 밝기와 색상 성분을 분리해서 표현합니다.

  • L: 밝기
  • A: 녹색과 빨간색 방향의 색상 성분
  • B: 파란색과 노란색 방향의 색상 성분

RGB 이미지의 밝기를 조정하면 색상 표현도 함께 변할 수 있지만, LAB에서는 밝기 성분을 분리해서 조정할 수 있습니다.

CLAHE란?

CLAHE는 Contrast Limited Adaptive Histogram Equalization의 약자입니다.

이미지를 작은 영역으로 나누어 국소 대비를 개선하는 방법입니다.

이번에는 CLAHE를 적용한 뒤 감마 보정을 추가했습니다.

밝기 보정 코드

파일 위치: src/abstraction/improve_abstraction.py

def correct_brightness(rgb):

    lab = cv2.cvtColor(
        rgb,
        cv2.COLOR_RGB2LAB
    )

    l, a, b = cv2.split(lab)

    clahe = cv2.createCLAHE(
        clipLimit=2.0,
        tileGridSize=(8, 8)
    )

    enhanced = clahe.apply(l)

    blended = cv2.addWeighted(
        l, 0.4,
        enhanced, 0.6,
        0
    )

    normalized = (
        blended.astype(np.float32) / 255.0
    )

    gamma = 0.72

    corrected = np.power(
        normalized, gamma
    ) * 255.0

    corrected = np.clip(
        corrected, 0, 255
    ).astype(np.uint8)

    result_lab = cv2.merge(
        [corrected, a, b]
    )

    return cv2.cvtColor(
        result_lab,
        cv2.COLOR_LAB2RGB
    )

CLAHE로 국소 대비를 개선하고, 감마 보정을 통해 어두운 영역의 밝기를 추가로 조정했습니다.

감마값은 0.72로 설정했습니다.

이 값은 이번 실험을 위한 초기 설정이며, 이미지에 따라 조정할 필요가 있습니다.


5. 투명 영역의 검은색 문제 개선

첫 번째 실험에서 발견한 또 다른 문제는 투명 배경입니다.

SAM 2로 객체를 추출하면 배경은 투명하게 처리되지만, 투명한 픽셀의 RGB 값이 검은색으로 남아 있을 수 있습니다.

이 상태에서 이미지 필터를 적용하면 주변 검은색이 피사체의 경계에 영향을 줄 수 있습니다.

따라서 이번에는 OpenCV의 inpaint()를 사용해 투명 영역의 RGB 값을 주변 색상으로 보완했습니다.

파일 위치: src/abstraction/improve_abstraction.py

missing = np.where(
    crop_alpha == 0,
    255,
    0
).astype(np.uint8)

filled = cv2.inpaint(
    crop,
    missing,
    3,
    cv2.INPAINT_TELEA
)

inpaint()는 지정한 영역을 주변 픽셀 정보를 이용해 채우는 기능입니다.

이번에는 투명 영역의 검은 RGB 값이 필터 계산에 직접 영향을 주는 문제를 줄이는 데 활용했습니다.

다만 이미지 경계나 복잡한 객체 주변에서는 완벽하게 처리되지 않을 수 있습니다.

반응형

6. D·E·F 개선 실험

두 번째 실험에서는 세 가지 결과물을 생성했습니다.

실험적용 기술목적

실험 적용 기술 목적
D LAB + CLAHE + 감마 보정 밝기 개선
E D + Bilateral + K-Means 12색 구조 보존과 색상 단순화
F E + 색상 팔레트 변환 일러스트 색감 적용

D - 밝기 보정

첫 번째 결과는 색상 수를 줄이지 않고 밝기만 보정한 이미지입니다.

기존 A보다 정자의 기둥과 난간이 밝아졌으며 붉은색과 청록색을 더 쉽게 구분할 수 있었습니다.

지붕의 세밀한 기와 무늬도 비교적 잘 유지되었습니다.

다만 사진의 디테일이 그대로 남아 있어 추상화보다는 밝기를 개선한 이미지에 가까웠습니다.

E - 밝기 보정 + 12색

이번 실험에서 가장 중요하게 살펴본 결과입니다.

D에 Bilateral Filter와 K-Means를 적용해 색상을 12개로 줄였습니다.

기존 A와 같은 색상 수를 사용하지만 밝기 보정을 먼저 적용했다는 차이가 있습니다.

그 결과 A보다 기둥과 난간의 색상이 명확해졌고 건축물의 구조도 비교적 잘 보존되었습니다.

F - 색상 팔레트 적용

마지막으로 미리 정의한 색상 팔레트를 적용했습니다.

지붕에 사용할 회색 계열, 기둥에 사용할 붉은 갈색, 단청에 사용할 청록색 등을 준비했습니다.

파일 위치: src/abstraction/improve_abstraction.py

PALETTE = [
    "#35444B",
    "#64747A",
    "#9AA5A0",
    "#D4C9BA",
    "#F1E7D6",
    "#7E433D",
    "#A75B4D",
    "#D78B6F",
    "#305E62",
    "#4F8986",
    "#86B4A7",
    "#B1ADA1",
]

K-Means로 계산한 대표 색상을 LAB 색 공간에서 가장 가까운 팔레트 색상으로 변경했습니다.

전체적인 색감은 통일되었지만, 원본에서 중요한 붉은 기둥과 단청의 색상이 일부 약해지는 문제가 발생했습니다.

이는 팔레트 매핑이 이미지의 구조를 이해하는 방식이 아니라 색상 유사도를 기준으로 동작하기 때문입니다.


7. A~F 전체 결과 비교

여섯 가지 실험 결과를 하나의 이미지로 만들어 비교했습니다.

비교 이미지 생성에는 Pillow를 사용했습니다.

파일 위치: src/abstraction/compare_results.py

from PIL import Image, ImageOps

image = Image.open(path).convert("RGBA")

background = Image.new(
    "RGBA",
    image.size,
    (255, 255, 255, 255)
)

background.alpha_composite(image)

preview = ImageOps.contain(
    background.convert("RGB"),
    (360, 480)
)

투명한 배경을 흰색으로 표시해 실제 객체의 어두운 색상과 투명 영역을 구분할 수 있도록 했습니다.

comparison.png — A~F 전체 실험 결과

실제 결과를 비교한 내용은 다음과 같습니다.

실험 장점 단점
A 정자 형태 보존 전체적으로 어두움
B 색상 수 감소 기둥 색상 손실
C 가장 단순한 형태 구조적 특징 손실
D 밝기와 색상 표현 개선 세부 질감이 많이 남음
E 형태와 색상 단순화의 균형 여전히 사진에 가까움
F 통일된 색상 팔레트 원본의 특징적인 색상 일부 손실

가장 좋은 결과는?

이번 실험에서는 E가 가장 균형 잡힌 결과라고 판단했습니다.

D는 원본 형태와 색상을 가장 잘 보존했지만, 디테일이 많이 남았습니다.

F는 색감이 통일되면서 일러스트처럼 보이는 부분도 있었지만, 정자의 붉은 기둥과 단청을 충분히 표현하지 못했습니다.

반면 E는 밝기 보정과 색상 단순화를 적용하면서 건축물의 특징을 비교적 잘 유지했습니다.

따라서 앞으로의 실험에서는 다음과 같이 결과물을 활용하기로 했습니다.

  • D: 밝기 보정 기준 이미지
  • E: OpenCV 추상화 기준 이미지
  • F: 색상 팔레트 실험 참고 이미지

8. OpenCV 이미지 추상화의 한계

총 6가지 실험을 진행하면서 중요한 사실을 확인했습니다.

색상을 단순화하는 것과 일러스트로 재구성하는 것은 서로 다른 문제입니다.

예를 들어 기와지붕을 추상화한다고 생각해 보겠습니다.

우리가 원하는 것은 실제 기왓장 하나하나를 단순한 색으로 표현하는 것이 아닙니다.

기와지붕의 전체적인 곡선과 형태를 유지하면서 내부를 몇 개의 색면으로 재구성하는 것입니다.

하지만 K-Means는 색상이 비슷한 픽셀을 묶을 뿐, 기와지붕이 어떤 구조인지 이해하지 못합니다.

따라서 색상 수를 아무리 줄이더라도 세밀한 패턴이 그대로 남거나 중요한 색상이 사라질 수 있습니다.

이번 실험을 통해 확인한 OpenCV 방식의 장점과 한계는 다음과 같습니다.

구분 내용
장점 가볍고 처리 속도가 빠름
장점 색상 수와 밝기를 직접 제어할 수 있음
장점 모바일 환경으로 이전하기 비교적 쉬움
한계 객체의 의미를 이해하지 못함
한계 구조별 색상 보존이 어려움
한계 목표 스타일에 맞는 형태 재구성이 어려움

이미지 품질을 우선으로 하는 현재 프로젝트에서는 OpenCV만으로 최종 목표에 도달하기에는 한계가 있다고 판단했습니다.

9. 다음 개발 방향

지금까지 다음과 같은 작업을 완료했습니다.

여행 사진
    ↓
SAM 2 객체 분할
    ↓
피사체 추출
    ↓
OpenCV 색상 단순화
    ↓
LAB + CLAHE 밝기 보정
    ↓
K-Means 색상 양자화
    ↓
색상 팔레트 적용
    ↓
A~F 결과 비교

다음 단계에서는 공개 이미지 생성 모델을 활용해 이미지 추상화를 진행할 예정입니다.

현재 검토하고 있는 기술은 다음과 같습니다.

Stable Diffusion

이미지를 생성하거나 기존 이미지를 새로운 스타일로 변환하는 데 활용할 수 있습니다.

ControlNet

원본 이미지의 윤곽선이나 구조적 정보를 활용해 생성 결과의 구도를 제어하는 데 사용할 수 있습니다.

LoRA

원하는 이미지 스타일을 모델에 학습시키기 위한 파인튜닝 방식입니다.

우선 RTX 5070 Ti에서 공개 모델을 실행하고, 전통 정자 사진을 목표 일러스트 스타일로 변환할 수 있는지 확인하려고 합니다.

이후 결과가 충분히 좋다면 직접 학습 데이터셋을 구축하고 모델을 파인튜닝하는 과정을 진행할 계획입니다.

마치며

이번에는 SAM 2로 추출한 이미지를 OpenCV로 추상화하면서 총 6가지 실험을 진행했습니다.

처음에는 단순히 색상 수를 줄이면 원하는 이미지에 가까워질 것으로 생각했습니다.

하지만 실제 결과는 예상과 달랐습니다.

색상 수를 줄일수록 오히려 정자의 특징이 사라지기도 했고, 밝기 보정과 팔레트 변환을 적용하면서 새로운 문제도 발견했습니다.

이 과정에서 가장 중요하게 느낀 점은 이미지의 정보를 줄이는 것과 이미지의 특징을 보존하는 것은 별개의 문제라는 것입니다.

현재까지는 E 결과가 가장 적합했지만, 최종적으로 만들고 싶은 여행 일러스트와는 여전히 차이가 있습니다.

다음에는 생성형 AI 모델을 활용해 사진의 구조를 유지하면서 단순한 색면 중심의 일러스트로 변환하는 작업을 진행해 보겠습니다.


참고 자료

  • OpenCV 공식 문서 — Image Filtering
  • OpenCV 공식 문서 — K-Means Clustering
  • OpenCV 공식 문서 — Histogram Equalization 및 CLAHE
  • NumPy 공식 문서
  • Pillow 공식 문서
  • Meta SAM 2 공식 GitHub
반응형
반응형

최근 새롭게 출시된 팔도 바지락짬뽕을 먹어봤습니다.

평소 짬뽕라면을 좋아하는 편이라 새로운 제품이 나오면 관심을 갖게 되는데요. 이번에는 제품 이름부터 바지락을 강조하고 있어 일반적인 해물짬뽕라면과 어떤 차이가 있을지 궁금했습니다.

특히 바지락 특유의 시원한 국물 맛이 얼마나 잘 표현되어 있을지 기대하면서 직접 끓여봤습니다.

결론부터 이야기하면 진짬뽕보다 자극적이지 않고 바지락 향이 은은하게 느껴지는 제품이었습니다. 다만 제가 예상했던 시원한 해물짬뽕보다는 고기짬뽕에 가까운 인상이 남았습니다.

팔도 바지락짬뽕, 구성부터 살펴봤습니다

 

제품 포장에는 바지락과 여러 해산물이 들어간 짬뽕 이미지가 크게 그려져 있습니다.

포장지에 표시된 내용에 따르면 1봉지는 120g이며, 열량은 505kcal입니다. 바지락 건조분말이 포함된 스프와 건더기 구성이 특징입니다.

구성품을 살펴보면 분말스프와 건더기스프, 후첨스프가 들어 있습니다.

개인적으로 눈에 들어왔던 것은 건더기스프였습니다. 단순히 바지락 맛을 내는 분말만 사용한 것이 아니라 실제 바지락 건더기가 들어 있다는 점이 흥미로웠습니다.

실제 바지락이 들어간 건더기스프

 

건더기스프를 꺼내보니 건조 바지락과 채소 건더기가 보였습니다.

제가 확인한 제품에는 한 봉지당 건조 바지락이 약 4~5개 정도 들어 있었습니다.

바지락이 아주 많이 들어 있는 것은 아니지만, 인스턴트 라면에서 실제 조갯살을 볼 수 있다는 점은 나름대로 차별화된 부분입니다.

다만 바지락 크기가 크지는 않고 건조된 상태라서, 포장지에 그려진 푸짐한 해산물 짬뽕을 기대한다면 다소 아쉬울 수도 있겠습니다.

면발은 어떨까?

면은 일반적인 인스턴트 짬뽕 라면처럼 약간 납작한 형태와 비슷합니다.

너무 두껍거나 얇은 면은 아니였어요.

완성된 라면에서는 면발 사이로 바지락과 채소 건더기를 확인할 수 있었습니다.

면 자체에서 특별히 강한 해산물 맛이 나는 것은 아니었지만, 국물과 함께 먹을 때 바지락과 해물짬뽕 특유의 향이 미세하게 느껴졌습니다.

전체적으로 면발보다는 국물과 건더기 구성이 이 제품의 특징이라고 생각합니다.

반응형

가장 궁금했던 국물 맛, 진짬뽕과 비교하면?

개인적으로 가장 궁금했던 부분은 국물 맛이었습니다.

바지락짬뽕이라는 이름을 보고 시원한 조개 육수와 해산물 향이 강조된 짬뽕을 예상했습니다.

하지만 실제로 먹어보니 조금 다른 느낌이었습니다.

진짬뽕보다 맵고 자극적인 느낌이 덜했고, 해산물의 시원함보다는 고기짬뽕에서 느낄 법한 묵직한 풍미에 더 가까웠습니다.

물론 해물 향이 없는 것은 아닙니다. 면과 국물을 먹을 때 바지락과 해물짬뽕 특유의 향이 은은하게 느껴졌습니다.

다만 그 향이 강하게 드러나지는 않았습니다.

제가 느낀 차이를 간단하게 정리하면 다음과 같습니다.

비교 항목 개인적인 시식 느낌
매운맛 진짬뽕보다 덜 자극적
해물 향 은은하게 느껴지는 정도
바지락 향 약하지만 분명히 존재
국물의 인상 시원한 해물짬뽕보다는 고기짬뽕에 가까움
전체적인 맛 비교적 부드럽고 묵직한 짬뽕 맛

※ 진짬뽕과의 비교는 별도의 동시 시식이 아닌, 평소 먹어본 경험을 기준으로 한 주관적인 평가입니다.

후첨스프가 맛을 부드럽게 만드는 걸까?

이번 제품에서 또 하나 흥미로웠던 부분은 후첨스프였습니다.

후첨스프를 넣은 뒤에는 매운맛이 조금 부드럽게 정리되는 듯한 느낌을 받았습니다.

특이하게도 개인적으로는 땅콩버터를 연상시키는 고소한 향이 살짝 느껴졌습니다.

물론 실제로 땅콩버터가 들어 있다는 뜻은 아닙니다. 제가 확인한 원재료 표시에서는 땅콩버터를 찾지 못했고, 어디까지나 먹으면서 느낀 향에 대한 개인적인 표현입니다.

이런 고소한 풍미가 해산물의 시원한 느낌보다는 고기짬뽕에 가까운 인상을 주는 데 영향을 미친 것 같기도 합니다.

후첨스프가 정확히 어떤 역할을 하는지는 제조사의 설명을 추가로 확인할 필요가 있겠지만, 적어도 제 입맛에는 전체적인 맛을 조금 더 부드럽게 만드는 요소처럼 느껴졌습니다.

실제 바지락의 맛과 향은?

건더기로 들어 있는 바지락도 직접 먹어봤습니다.

건조된 바지락이지만 조리 후에는 일반적인 해동 바지락과 비슷한 맛과 향이 느껴졌습니다.

바지락 특유의 향이 남아 있다는 점에서는 괜찮았지만, 조금 아쉬운 부분도 있었습니다.

일부 바지락에서는 아주 미세하게 모래가 씹히는 느낌이 있었습니다.

모든 건더기에서 나타난 것은 아니었지만, 실제 조갯살이 들어 있는 제품인 만큼 이런 부분은 조금 신경 쓰였습니다.

또한 바지락 특유의 비린 향도 약하게 느껴졌습니다.

평소 조개류를 좋아한다면 크게 거슬리지 않을 수 있지만, 해산물의 비린 향에 예민한 분이라면 호불호가 갈릴 수 있겠습니다.

팔도 바지락짬뽕, 좋았던 점과 아쉬웠던 점

직접 먹어본 경험을 기준으로 정리해봤습니다.

좋았던 점

  • 실제 건조 바지락이 들어 있어 제품의 특징이 분명합니다.
  • 진짬뽕보다 자극적이지 않아 비교적 부담 없이 먹을 수 있었습니다.
  • 해물 향과 고소한 국물 맛이 은은하게 어우러졌습니다.
  • 일반적인 매운 짬뽕라면과는 조금 다른 맛을 느낄 수 있었습니다.

아쉬웠던 점

  • 바지락의 시원한 국물 맛을 기대했다면 다소 약하게 느껴질 수 있습니다.
  • 실제 바지락 건더기의 양은 많지 않은 편입니다.
  • 일부 바지락에서 미세하게 모래가 씹혔습니다.
  • 바지락 특유의 비린 향이 예민한 사람에게는 거슬릴 수 있습니다.

총평, 다시 먹을 만한 라면일까?

팔도 바지락짬뽕은 이름만 보면 바지락 육수의 시원함을 강조한 해물짬뽕라면처럼 느껴집니다.

하지만 직접 먹어보니 제가 예상했던 맛과는 조금 달랐습니다.

바지락과 해산물의 향은 분명히 존재하지만 강하지 않았고, 오히려 고기짬뽕을 연상시키는 묵직한 국물 맛이 더 인상적이었습니다.

진짬뽕보다 덜 자극적이라는 점은 장점이었지만, 시원하고 개운한 조개 국물을 기대했던 입장에서는 조금 아쉬움도 남았습니다.

특히 실제 바지락이 들어 있다는 점은 재미있는 시도라고 생각하지만, 모래가 씹히는 느낌이나 비린 향은 개선되면 좋겠습니다.

매운맛이 강한 짬뽕라면보다 부드러운 짬뽕을 선호하고, 은은한 해물 향을 좋아한다면 한 번쯤 먹어볼 만한 제품이라고 생각합니다.

반대로 바지락칼국수처럼 맑고 시원한 조개 육수의 맛을 기대한다면 취향에 맞지 않을 수도 있겠습니다.

개인적으로는 맛이 나쁘지는 않았지만, 바지락이라는 이름에서 기대했던 시원함이 조금 더 강조되었다면 좋았을 것 같습니다.

 

팔도바지락짬뽕이번 후기는 직접 구입해 먹어본 경험을 바탕으로 작성한 개인적인 시식 후기입니다.

반응형
반응형
금전대여결정은 회사가 다른 곳에 돈을 빌려주기로 결정했다는 공시입니다. 금전대여가 주가에 미치는 영향부터 대여금액, 이율, 자기자본 대비 비율과 만기 연장 등 초보 투자자가 반드시 확인해야 할 내용을 쉽게 정리했습니다.

주식 뉴스를 보다 보면 낯선 공시를 발견할 때가 있습니다.

바로 **'금전대여결정'**이라는 공시입니다.

유상증자나 무상증자처럼 자주 접하는 단어는 아니지만, 회사의 재무상태와 주가에 영향을 줄 수 있어 알아두면 좋은 주식 용어입니다.

금전대여결정은 쉽게 말하면 회사가 다른 회사나 개인 등에게 돈을 빌려주기로 결정했다는 뜻입니다.

그런데 여기서 궁금한 점이 생깁니다.

회사가 다른 곳에 돈을 빌려주는 것은 좋은 일일까요? 아니면 회사의 자금이 외부로 빠져나가는 나쁜 일일까요?

결론부터 말씀드리면 금전대여결정 자체가 무조건 호재나 악재인 것은 아닙니다.

누구에게, 얼마를, 어떤 목적으로 빌려주는지가 가장 중요합니다.


1. 금전대여결정이란 무엇일까요?

금전대여는 말 그대로 돈을 빌려준다는 뜻입니다.

일반적으로 우리가 은행에서 돈을 빌리면 은행에 이자를 내고 나중에 원금을 갚습니다.

금전대여결정도 기본적인 구조는 비슷합니다.

차이가 있다면 돈을 빌려주는 주체가 은행이 아닌 일반 기업이라는 점입니다.

예를 들어 A회사가 B회사에 100억 원을 빌려주기로 결정했다고 가정해 보겠습니다.

  • A회사: 돈을 빌려주는 회사
  • B회사: 돈을 빌리는 회사
  • 대여금액: 100억 원
  • 대여이율: 연 5%
  • 대여기간: 1년

B회사가 1년 뒤 원금과 이자를 정상적으로 상환한다면 A회사는 원금 100억 원과 이자 5억 원을 받게 됩니다.

물론 이 계산은 100억 원 전액을 1년 동안 빌려주고 단리로 이자를 계산하는 경우를 가정한 것입니다.

즉, 금전대여는 회사 입장에서 자금을 빌려주고 이자수익을 얻을 수 있는 거래입니다.

하지만 원금을 돌려받지 못할 위험도 함께 존재합니다.


2. 회사는 왜 다른 회사에 돈을 빌려줄까요?

일반적인 기업은 물건을 판매하거나 서비스를 제공해 돈을 벌지만, 때로는 다른 회사에 자금을 빌려주기도 합니다.

대표적인 이유는 다음과 같습니다.

자회사나 계열사의 운영자금 지원

가장 쉽게 이해할 수 있는 사례입니다.

A회사가 해외에 새로운 자회사를 설립했다고 가정해 보겠습니다.

해외 자회사는 공장을 건설하거나 제품을 생산하기 위해 많은 돈이 필요합니다.

이때 모회사인 A회사가 직접 자금을 빌려줄 수 있습니다.

외부 은행에서 자금을 조달하는 대신 그룹 내부에서 자금을 지원하는 방식입니다.

신규 사업을 위한 자금 지원

기업이 새로운 사업을 진행하면서 관련 회사나 공동사업 법인에 자금을 빌려주는 경우도 있습니다.

예를 들어 발전소 건설, 부동산 개발, 해외 공장 증설 등에 필요한 자금을 대여할 수 있습니다.

사업이 성공적으로 진행된다면 회사는 이자수익을 얻거나 사업 협력관계를 강화할 수 있습니다.

금융수익 확보

회사가 보유한 여유자금을 다른 기업에 빌려주고 이자를 받는 경우도 있습니다.

다만 이 경우에는 대여 상대방의 신용도와 회수 가능성을 반드시 확인해야 합니다.

단순히 이율이 높다고 좋은 거래라고 판단할 수는 없습니다.


3. 금전대여결정은 주가에 어떤 영향을 줄까요?

금전대여결정 공시가 나오면 주가가 오를 수도 있고 떨어질 수도 있습니다.

중요한 것은 금전대여의 목적과 규모입니다.

긍정적으로 볼 수 있는 경우

자회사가 성장하기 위한 자금을 지원하는 경우입니다.

예를 들어 해외 공장 증설을 위해 자회사에 100억 원을 빌려줬다고 가정하겠습니다.

자회사가 공장을 완공하고 매출과 이익을 늘린다면 모회사에도 긍정적인 영향을 줄 수 있습니다.

또 자금을 빌려준 회사는 이자수익도 기대할 수 있습니다.

이처럼 사업 확장을 위한 금전대여라면 중장기적으로 긍정적인 의미가 있을 수 있습니다.

부정적으로 볼 수 있는 경우

반대로 자금사정이 좋지 않은 회사에 반복적으로 돈을 빌려주는 경우에는 주의해야 합니다.

특히 다음과 같은 상황이라면 위험할 수 있습니다.

  • 돈을 빌린 회사가 지속적으로 적자를 기록하는 경우
  • 기존 대여금을 갚지 못해 만기를 계속 연장하는 경우
  • 돈을 빌려준 회사의 현금이 부족한 경우
  • 대여금액이 회사 규모에 비해 지나치게 큰 경우
  • 담보나 보증이 충분하지 않은 경우

이런 상황에서는 돈을 빌려준 회사가 원금을 회수하지 못할 가능성도 있습니다.

따라서 금전대여결정을 단순한 이자수익 기회로만 생각해서는 안 됩니다.


4. 금전대여결정과 유상증자는 무엇이 다를까요?

앞서 유상증자에 대해 알아봤다면 두 개념을 비교하면 이해하기 쉽습니다.

유상증자는 회사가 새로운 주식을 발행해 투자자로부터 돈을 받는 것입니다.

반면 금전대여결정은 회사가 자신이 보유한 돈을 다른 곳에 빌려주는 것입니다.

구분유상증자금전대여결정

돈의 이동 투자자 → 회사 회사 → 대여 상대방
새로운 주식 발행 있음 없음
주요 목적 자금조달 자금지원·이자수익
회사의 현금 증가 가능 대여 실행 시 감소
주요 위험 지분 희석 대여금 미회수
투자자가 확인할 것 자금 사용 목적 대여 상대방과 상환능력

쉽게 기억하면 다음과 같습니다.

유상증자 = 회사가 돈을 마련하는 방법

금전대여결정 = 회사가 다른 곳에 돈을 빌려주는 결정

물론 유상증자로 확보한 자금을 다시 자회사에 빌려주는 경우도 있습니다.

따라서 두 가지 공시가 함께 나오는 경우에는 실제 자금의 이동 경로를 확인하는 것이 중요합니다.

반응형

5. 금전대여결정 공시를 읽는 방법

금전대여결정 공시에는 여러 항목이 등장합니다.

처음에는 복잡해 보이지만 몇 가지만 이해하면 됩니다.

다음은 이해를 돕기 위한 가상의 공시 사례입니다.

공시 항목가상 사례

대여 상대방 A회사의 해외 자회사
대여금액 100억 원
자기자본 500억 원
자기자본 대비 20%
대여이율 연 5%
대여기간 2026년 11월~2027년 10월
금전대여 목적 해외 공장 건설자금
금전대여 총잔액 150억 원

대여 상대방

돈을 누구에게 빌려주는지 확인하는 항목입니다.

상대방이 자회사인지, 관계회사인지, 외부 기업인지 살펴봐야 합니다.

특히 외부 기업에 큰돈을 빌려주는 경우라면 어떤 사업적 관계가 있는지 확인할 필요가 있습니다.

대여금액

이번에 빌려주기로 결정한 금액입니다.

단, 공시에 표시된 금액이 실제로 한꺼번에 지급됐다는 뜻은 아닐 수 있습니다.

대여 가능한 한도를 정해놓고 필요할 때 나눠서 지급하는 경우도 있습니다.

자기자본 대비 비율

주식 초보자가 특히 중요하게 봐야 할 항목입니다.

자기자본은 쉽게 말하면 회사 자산에서 부채를 뺀 순자산에 해당합니다.

예를 들어 자기자본이 500억 원인 회사가 100억 원을 빌려준다면 자기자본 대비 비율은 20%입니다.

자기자본의 20%에 해당하는 규모의 거래이므로 회사 입장에서는 결코 작은 금액이 아닙니다.

다만 이 비율은 대여금액을 자기자본과 비교한 값이지, 회사가 보유한 현금의 20%를 빌려줬다는 뜻은 아닙니다.

대여이율

돈을 빌려주는 대가로 받는 이자율입니다.

연 5%라면 일반적으로 연간 대여원금의 5%에 해당하는 이자가 발생할 수 있습니다.

하지만 이율이 높다고 반드시 좋은 거래는 아닙니다.

대여 상대방의 신용위험이 높아 높은 이율을 적용하는 경우도 있기 때문입니다.

대여기간

돈을 빌려주는 기간입니다.

대여기간이 길수록 회사의 자금이 오랫동안 묶일 수 있습니다.

특히 만기가 다가왔을 때 실제로 상환되는지 확인하는 것이 중요합니다.

금전대여 총잔액

이번 대여뿐 아니라 회사가 빌려준 금액의 전체 잔액을 확인할 수 있는 항목입니다.

예를 들어 이번 대여금액은 100억 원이지만 총잔액이 150억 원이라면 기존 대여금도 존재한다는 의미일 수 있습니다.

이때는 기존 대여금의 상환 현황을 함께 살펴보는 것이 좋습니다.


6. 금전대여결정에서 가장 주의해야 할 것은 만기 연장입니다

금전대여결정 공시를 보다 보면 '기존 대여금의 기간 연장'이라는 표현을 발견할 수 있습니다.

이것은 새로운 돈을 빌려주는 것이 아니라 이전에 빌려줬던 돈의 상환기한을 늘려주는 것입니다.

예를 들어 A회사가 B회사에 100억 원을 빌려줬는데, B회사가 약속한 날짜까지 돈을 갚지 못했다고 가정해 보겠습니다.

이때 A회사는 돈을 즉시 회수하는 대신 상환기간을 1년 연장할 수 있습니다.

기간 연장 자체가 반드시 나쁜 것은 아닙니다.

사업 일정이 늦어져 합의에 따라 연장하는 경우도 있기 때문입니다.

하지만 대여 상대방의 재무상태가 좋지 않고 만기가 반복적으로 연장된다면 원금을 회수하지 못할 위험을 의심해 볼 필요가 있습니다.

따라서 금전대여결정 공시에서 '신규 대여'인지 '기존 대여금의 연장'인지를 반드시 구분해야 합니다.


7. 금전대여결정을 하면 회사의 재무제표는 어떻게 달라질까요?

조금 더 알아보겠습니다.

회사가 100억 원을 빌려줬다고 해서 그 순간 100억 원의 손실이 발생하는 것은 아닙니다.

일반적으로 회사의 현금은 100억 원 줄어들지만, 대신 돌려받을 권리인 대여금이라는 자산이 생깁니다.

쉽게 표현하면 다음과 같습니다.

기존: 현금 100억 원

대여 후: 현금은 감소하고 대여금 100억 원이 발생

따라서 정상적인 대여라면 돈을 빌려준 것만으로 회사의 전체 자산이 곧바로 감소하지는 않습니다.

하지만 상대방이 돈을 갚지 못할 가능성이 높아지면 문제가 달라집니다.

회사는 대여금에 대해 손실충당금을 설정해야 할 수도 있고, 실제 손실이 발생하면 순이익과 재무상태에 부정적인 영향을 줄 수 있습니다.

또 한 가지 알아둘 점이 있습니다.

자회사에 대여한 경우 연결재무제표에서는 그룹 내부의 대여금과 차입금이 상계 제거될 수 있습니다.

따라서 금전대여가 발생한 회사의 개별재무제표와 연결재무제표를 함께 확인하는 것이 좋습니다.


8. 금전대여결정은 무조건 악재일까요?

그렇지는 않습니다.

가장 중요한 것은 자금의 사용 목적과 회수 가능성입니다.

예를 들어 두 가지 경우를 비교해 보겠습니다.

A회사

해외 자회사가 신규 공장을 건설하는 데 필요한 자금을 빌려줬습니다.

자회사는 이미 안정적인 매출을 기록하고 있고, 신규 공장이 완공되면 생산능력이 확대될 것으로 예상됩니다.

이 경우 금전대여는 성장 투자를 지원하는 성격이 강합니다.

B회사

지속적으로 적자를 기록하는 관계회사에 돈을 빌려줬습니다.

하지만 기존 대여금도 상환되지 않았고, 만기가 여러 차례 연장되고 있습니다.

이 경우에는 대여금 회수 위험을 더 주의 깊게 확인해야 합니다.

같은 금전대여결정이라도 기업의 상황에 따라 의미는 완전히 달라질 수 있습니다.


9. 주식초보가 금전대여결정 공시를 보면 확인할 것

공시를 모두 이해하기 어렵다면 다음 다섯 가지만 우선 확인해 보세요.

  1. 누구에게 빌려주는가? 자회사인지 외부 기업인지 확인합니다.
  2. 얼마나 빌려주는가? 자기자본과 보유 현금 대비 규모를 살펴봅니다.
  3. 왜 빌려주는가? 사업 확장인지, 운영자금 부족을 메우기 위한 것인지 확인합니다.
  4. 언제 돌려받는가? 대여기간과 만기 연장 여부를 살펴봅니다.
  5. 돌려받을 가능성은 충분한가? 상대방의 재무상태, 담보와 보증 여부를 확인합니다.

특히 자기자본 규모가 작은 기업이 큰 금액을 빌려주거나, 동일한 상대방에 대한 대여기간을 반복적으로 연장한다면 조금 더 신중하게 살펴볼 필요가 있습니다.


정리

금전대여결정은 회사가 다른 회사나 개인 등에게 자금을 빌려주기로 결정했다는 의미입니다.

유상증자처럼 새로운 주식을 발행하는 것도 아니고, 무상증자처럼 주주에게 주식을 나눠주는 것도 아닙니다.

기업이 보유한 자금을 다른 곳에 빌려주는 거래입니다.

금전대여는 자회사 성장을 지원하거나 이자수익을 얻는 긍정적인 목적일 수도 있습니다.

하지만 대여 상대방의 재무상태가 나쁘다면 회사의 자금이 장기간 묶이거나 회수하지 못할 위험도 있습니다.

그래서 금전대여결정 공시를 발견하면 가장 먼저 생각해야 할 것은 다음 두 가지입니다.

“회사는 왜 이 돈을 빌려주는 걸까?”

“빌려준 돈을 약속한 날짜에 돌려받을 수 있을까?”

이 두 질문만 기억해도 금전대여결정이라는 공시를 훨씬 쉽게 이해할 수 있습니다.

주식투자는 기업의 주가만 보는 것이 아니라, 회사가 자금을 어디에 사용하고 있는지 확인하는 과정이기도 합니다.

금전대여결정은 이러한 기업의 자금 흐름을 이해하는 데 도움이 되는 공시라고 생각합니다.

 

 


이 글은 공개된 공시자료와 일반적인 기업 재무 원리를 바탕으로 작성한 정보 제공 목적의 콘텐츠입니다. 특정 종목에 대한 매수·매도 권유가 아니며, 투자 판단과 그에 따른 책임은 투자자 본인에게 있습니다.

 

 

 

 

 

 

유상증자와 무상증자 차이, 주식초보도 쉽게 이해하기

유상증자와 무상증자의 차이를 주식초보도 이해하기 쉽게 정리했습니다. 주가가 왜 움직이는지, 지분 희석과 무상증자의 의미까지 사례로 알아봅니다.주식 뉴스를 보다 보면 자주 등장하는 단

incurio.tistory.com

 

반응형
반응형
유상증자와 무상증자의 차이를 주식초보도 이해하기 쉽게 정리했습니다. 주가가 왜 움직이는지, 지분 희석과 무상증자의 의미까지 사례로 알아봅니다.

돈 내고 받기 vs 무료로 받기

주식 뉴스를 보다 보면 자주 등장하는 단어가 있습니다.

바로 유상증자와 무상증자입니다.

이름이 비슷해서 처음에는 헷갈리기 쉽지만, 핵심만 이해하면 생각보다 어렵지 않습니다.

가장 간단하게 구분하면 다음과 같습니다.

유상증자 = 투자자가 돈을 내고 새 주식을 받는 것
무상증자 = 기존 주주가 돈을 내지 않고 새 주식을 받는 것

둘 다 회사가 새로운 주식을 발행한다는 공통점은 있지만, 회사로 새로운 돈이 들어오느냐는 점에서 큰 차이가 있습니다.


증자란 무엇일까요?

먼저 ‘증자’라는 단어부터 이해하면 쉽습니다.

증자는 회사가 새로운 주식을 발행해 자본금을 늘리는 것을 의미합니다.

예를 들어 어떤 회사의 주식이 총 100만 주 있었는데 새롭게 20만 주를 발행하면 총주식 수는 120만 주가 됩니다.

이처럼 기존에 없던 새로운 주식을 발행하는 것이 증자입니다.

증자는 크게 두 가지로 나눌 수 있습니다.

  • 유상증자
  • 무상증자

유상증자란?

유상증자는 회사가 새로운 주식을 발행하고, 투자자가 그 주식을 돈을 내고 사는 방식입니다.

쉽게 생각하면 회사가 투자자에게 다음과 같이 이야기하는 것입니다.

“사업을 위해 자금이 필요합니다. 새로운 주식을 발행할 테니 투자해 주세요.”

투자자는 돈을 내고 새 주식을 받고, 회사는 그 돈을 확보합니다.

예를 들어 보겠습니다.

A회사가 새로운 공장을 짓기 위해 100억 원이 필요하다고 가정해 보겠습니다.

회사는 새 주식을 발행해 투자자들에게 판매합니다.

투자자들이 주식을 사면서 낸 돈은 회사로 들어가고, 회사는 이 자금을 공장 건설이나 연구개발 등에 사용할 수 있습니다.

즉, 유상증자는 회사 입장에서 자금을 조달하는 방법 중 하나입니다.


회사는 왜 유상증자를 할까요?

유상증자를 한다는 사실만으로 무조건 좋다거나 나쁘다고 판단하기는 어렵습니다.

가장 중요한 것은 왜 돈을 마련하는가입니다.

성장 투자를 위한 유상증자

다음과 같은 목적으로 유상증자를 한다면 장기적으로 긍정적으로 평가될 수도 있습니다.

  • 신규 공장 건설
  • 생산설비 확대
  • 신사업 투자
  • 연구개발
  • 다른 기업 인수
  • 해외시장 진출

회사가 유상증자를 통해 확보한 자금으로 매출과 이익을 늘릴 수 있다면 기업가치도 함께 성장할 수 있습니다.

재무상태가 좋지 않아 하는 유상증자

반대로 다음과 같은 경우에는 주의해서 볼 필요가 있습니다.

  • 지속적인 적자 보전
  • 운영자금 부족
  • 대규모 부채 상환
  • 반복적인 유상증자

특히 실적 개선 없이 계속 새로운 주식을 발행해 운영비를 충당하는 기업이라면 기존 주주에게 부담이 될 수 있습니다.


유상증자를 하면 왜 주가가 떨어질까요?

유상증자 발표 이후 주가가 하락하는 경우가 많습니다.

가장 대표적인 이유는 주식 수가 늘어나기 때문입니다.

예를 들어 회사의 기존 주식이 100주라고 가정해 보겠습니다.

내가 그중 10주를 가지고 있다면 회사의 10%를 보유한 셈입니다.

그런데 회사가 새로운 주식 100주를 발행하면 총주식 수는 200주가 됩니다.

내가 여전히 10주만 가지고 있다면 지분율은 기존 10%에서 5%로 줄어들게 됩니다.

이러한 현상을 지분 희석이라고 합니다.

또 유상증자 신주는 현재 주가보다 할인된 가격에 발행되는 경우도 많습니다.

이 때문에 기존 주가에 부담이 생기고 단기적으로 투자심리가 나빠질 수 있습니다.


그렇다면 유상증자는 무조건 악재일까요?

그렇지는 않습니다.

주식시장에서는 종종

“유상증자 = 악재”

라고 단순하게 생각하는 경우가 있습니다.

하지만 실제로는 자금을 어떻게 사용하는지가 더 중요합니다.

성장성이 높은 기업이 생산시설을 확대하기 위해 유상증자를 하고, 이후 매출과 영업이익이 크게 늘어난다면 결과적으로 기업가치가 증가할 수 있습니다.

반대로 적자를 메우기 위해 반복적으로 유상증자를 한다면 주식 수만 계속 늘어날 수도 있습니다.

따라서 유상증자 공시를 봤다면 가장 먼저 다음 질문을 해보는 것이 좋습니다.

“회사는 이 돈을 어디에 사용할까?”

반응형

무상증자란?

무상증자는 회사가 새로운 주식을 발행하지만, 기존 주주가 돈을 내지 않고 주식을 받는 방식입니다.

예를 들어 A회사가 1주당 1주의 무상증자를 결정했다고 가정해 보겠습니다.

내가 기존에 A회사 주식 100주를 가지고 있다면 새 주식 100주를 추가로 받게 됩니다.

결과적으로 보유 주식은

100주 → 200주

가 됩니다.

이 때문에 처음 주식을 접한 투자자는 이렇게 생각할 수도 있습니다.

“주식이 두 배가 됐으니 내 돈도 두 배가 되는 것 아닌가?”

하지만 그렇지는 않습니다.


무상증자를 하면 돈을 버는 걸까요?

예를 들어 주가가 2만 원인 주식을 100주 가지고 있다고 가정해 보겠습니다.

보유 주식의 가치는

2만 원 × 100주 = 200만 원

입니다.

이 회사가 1주당 1주의 무상증자를 실시하면 주식 수는 200주로 늘어납니다.

하지만 이론적으로 주가는 절반 수준인 1만 원으로 조정됩니다.

따라서

1만 원 × 200주 = 200만 원

이 됩니다.

결국 보유 주식 수는 두 배로 증가했지만 전체 가치는 동일합니다.

쉽게 생각하면 피자의 크기가 커진 것이 아니라 같은 피자를 더 많은 조각으로 나눈 것과 비슷합니다.


무상증자는 왜 하는 걸까요?

무상증자를 하면 회사에 새로운 돈이 들어오는 것은 아닙니다.

회사가 이미 가지고 있던 자본 항목 일부를 자본금으로 옮기고, 그만큼 새로운 주식을 발행하는 방식입니다.

대표적인 목적은 다음과 같습니다.

  • 주식 유통량 확대
  • 주가 단위 조정
  • 거래 활성화
  • 주주 친화적인 이미지 강화

주가가 너무 높거나 유통주식 수가 적은 기업은 무상증자를 통해 거래를 조금 더 활발하게 만들기도 합니다.


무상증자 발표 후 주가가 오르는 이유는?

무상증자는 기업가치를 직접적으로 높이는 행위는 아닙니다.

그런데도 무상증자 발표 이후 주가가 크게 오르는 경우가 있습니다.

대표적인 이유는 투자심리입니다.

예를 들어 10만 원이던 주식이 무상증자 이후 5만 원 수준으로 조정되면 투자자 입장에서는 상대적으로 저렴해 보일 수 있습니다.

또 무상증자 자체가 시장의 관심을 끌면서 거래량이 급증하는 경우도 있습니다.

하지만 중요한 점이 있습니다.

주식 수가 늘어났다고 회사의 매출이나 영업이익이 늘어나는 것은 아닙니다.

따라서 무상증자라는 이유만으로 기업가치가 상승했다고 판단해서는 안 됩니다.


유상증자와 무상증자 차이 한눈에 보기

구분 유상증자 무상증자
새로운 주식 발행 O O
투자자가 돈을 냄 O X
회사에 새로운 돈이 들어옴 O X
주식 수 증가 O O
주요 목적 자금 조달 주식 수 확대·자본구조 변경
기존 주주 지분 희석 가능성 있음 비례 배정 시 제한적
단기 주가 반응 부정적인 경우가 많음 긍정적으로 반응하기도 함
기업가치 자동 증가 X X

가장 중요한 차이는 이것입니다.

유상증자 → 회사에 새로운 돈이 들어옵니다.

무상증자 → 회사에 새로운 돈이 들어오지 않습니다.


유상증자 공시가 나오면 무엇을 확인해야 할까요?

주식초보라면 모든 내용을 이해하려고 하기보다 몇 가지 핵심만 확인해도 충분합니다.

먼저 자금 사용 목적을 확인해야 합니다.

사업 확장을 위한 것인지, 적자를 메우기 위한 것인지에 따라 의미가 크게 달라집니다.

다음으로 증자 규모를 확인해야 합니다.

기존 주식 수와 비교해 새로 발행하는 주식이 지나치게 많다면 지분 희석 부담도 커질 수 있습니다.

그리고 신주 발행가격도 중요합니다.

현재 주가보다 얼마나 낮은 가격으로 새 주식이 발행되는지 확인해야 합니다.

마지막으로 누구에게 주식을 발행하는지도 봐야 합니다.

기존 주주에게 배정하는 방식도 있고, 특정 기업이나 투자자에게 발행하는 제3자배정 방식도 있습니다.

전략적 투자자가 들어오는 경우라면 단순 자금조달 이상의 의미가 있을 수도 있습니다.


무상증자 공시가 나오면 무엇을 확인해야 할까요?

무상증자는 먼저 1주당 몇 주를 받는지 확인하면 됩니다.

그다음에는 회사의 실적을 살펴봐야 합니다.

매출과 영업이익이 성장하는 기업인지, 단순히 무상증자 이슈만으로 주가가 오르고 있는지를 구분해야 합니다.

또 무상증자 발표 이전에 주가가 이미 크게 상승했다면 기대감이 상당 부분 반영됐을 가능성도 있습니다.

결국 중요한 것은 무상증자 자체가 아니라 회사가 실제로 성장하고 있는가입니다.


정리

유상증자와 무상증자는 이름은 비슷하지만 의미는 상당히 다릅니다.

유상증자는 회사가 투자자에게 새로운 주식을 판매해 자금을 확보하는 방식입니다.

따라서 가장 먼저 봐야 할 것은

“왜 돈이 필요한가?”

입니다.

반면 무상증자는 기존 주주에게 새로운 주식을 무료로 나눠주는 방식입니다.

주식 수는 증가하지만 회사의 자산과 기업가치가 자동으로 증가하는 것은 아닙니다.

따라서 무상증자를 볼 때는

“주식 수가 늘어난 것 외에 회사의 실질적인 가치가 달라진 것이 있는가?”

를 생각해볼 필요가 있습니다.

주식시장에서는 흔히 유상증자는 악재, 무상증자는 호재라고 단순하게 이야기합니다.

하지만 실제 투자에서는 증자의 이름보다 그 이유와 이후 회사의 실적 변화를 확인하는 것이 훨씬 중요합니다.

이 두 가지 질문만 기억해도 증자 관련 뉴스를 이해하기가 훨씬 쉬워집니다.

유상증자 → 회사는 이 돈을 어디에 사용할까?

무상증자 → 회사의 실제 가치가 달라진 것이 있을까?





반응형
반응형

지난 글에서는 RTX 5070 Ti 환경에서 Conda와 PyTorch를 설치하고, Python으로 여행 사진을 전처리하는 과정을 진행했습니다.

이번에는 본격적으로 AI 모델을 이용해 사진 속 특정 객체를 추출하는 작업을 진행했습니다.

사용한 모델은 Meta에서 공개한 SAM 2.1(Segment Anything Model 2) 입니다.

최종 목표는 여행 사진에서 장소의 특징을 추출하고, 이를 추상화된 일러스트로 변환해 하나의 여행 포스터를 만드는 것입니다.

이번 실습에서는 여행 중 촬영한 전통 정자 사진을 이용해 건축물의 영역을 추출하고, 배경이 투명한 PNG 이미지로 저장하는 것까지 진행했습니다.

설치 과정에서 예상하지 못했던 문제와 Python 코드 오류도 발생했는데, 해결 과정을 함께 정리해 보겠습니다.


1. SAM 2란 무엇일까?

SAM 2는 Meta에서 공개한 이미지 및 동영상 분할(Segmentation) 모델입니다.

이미지 분할은 사진에서 특정 객체가 차지하는 영역을 픽셀 단위로 구분하는 기술입니다.

예를 들어 정자가 있는 사진에서 정자를 선택하면, AI 모델이 정자에 해당하는 영역을 추출합니다.

일반적인 객체 탐지(Object Detection)가 객체의 위치를 사각형으로 표시한다면, 이미지 분할은 객체의 실제 형태에 가까운 마스크를 생성한다는 차이가 있습니다.

이번에는 SAM 2.1 Large 모델을 사용했습니다.

항목 개발환경
운영체제 Ubuntu
GPU NVIDIA RTX 5070 Ti 16GB
Python 3.11
AI 프레임워크 PyTorch
모델 SAM 2.1 Large
이미지 처리 OpenCV, Pillow, NumPy

SAM 2.1 Large는 약 2억 2,440만 개의 파라미터를 가진 모델입니다.

모바일에서 직접 실행하기에는 부담이 있을 수 있지만, 현재는 이미지 품질이 우선이므로 데스크탑에서 Large 모델부터 실험하기로 했습니다.

2. SAM 2.1 설치하기

GitHub 저장소 다운로드

먼저 기존 Conda 가상환경을 활성화합니다.

프로젝트 폴더로 이동해 SAM 2 공식 저장소를 다운로드합니다.

cd ~/project/travel-illustration-ai

mkdir -p external

cd external

git clone https://github.com/facebookresearch/sam2.git

다운로드한 소스는 external/sam2 디렉터리에서 관리합니다.

SAM 2 설치

SAM 2 디렉터리로 이동합니다.

cd sam2

다음 명령어로 설치를 진행했습니다.

SAM2_BUILD_CUDA=0 python -m pip install -e .

SAM2_BUILD_CUDA=0 옵션은 SAM 2의 선택적인 CUDA 확장 기능을 컴파일하지 않도록 지정하는 설정입니다.

GPU 추론 자체를 비활성화하는 것은 아닙니다. 다만 CUDA 확장에서 제공하는 일부 마스크 후처리 기능은 사용할 수 없게 됩니다.

이번 실습에서는 복잡한 CUDA 빌드 환경을 구성하지 않고 먼저 모델 추론에 성공하는 것을 목표로 했습니다.

설치 중 아무런 반응이 없었던 문제

설치 명령어를 실행했는데 한동안 콘솔에 새로운 메시지가 출력되지 않았습니다.

처음에는 설치가 멈춘 것으로 생각했습니다.

프로세스 상태를 확인하기 위해 다른 터미널에서 다음 명령어를 실행했습니다.

ps aux | grep -E 'pip|python|gcc|ninja' | grep -v grep

실행 중인 프로세스에서 다음과 같은 명령을 확인할 수 있었습니다.

python -m pip install -e .

pip install --prefix /tmp/pip-build-env-...
setuptools>=61.0 torch>=2.5.1

pip이 격리된 빌드 환경을 생성하고 의존성 패키지를 설치하는 과정이었습니다.

CPU 상태도 확인했습니다.

top

CPU 사용률은 거의 0%였지만, 이것만으로 설치가 중단되었다고 판단할 수는 없었습니다.

실제로 설치 명령어를 종료하지 않고 확인해 보니 정상적으로 설치가 완료되었습니다.

이번에 알게 된 점은 pip 설치 과정에서 콘솔 출력이 없거나 CPU 사용량이 낮다고 해서 반드시 프로그램이 멈춘 것은 아니라는 사실입니다.

비슷한 상황이 발생한다면 무조건 설치를 중단하기보다 현재 실행 중인 프로세스와 네트워크 상태를 먼저 확인하는 것이 좋겠습니다.

참고로 빌드 격리 때문에 문제가 발생하는 환경에서는 다음 옵션을 검토할 수 있습니다.

SAM2_BUILD_CUDA=0 python -m pip install \
  --no-build-isolation \
  -v \
  -e .

--no-build-isolation은 기존 Python 환경을 사용해 빌드하도록 하고, -v는 상세한 설치 로그를 출력합니다.

단, 이번에는 해당 명령어로 재설치하지 않고 기존 설치가 정상적으로 완료되었습니다.

설치 결과 확인

다음 명령어로 SAM 2가 정상적으로 설치되었는지 확인했습니다.

python -c "from sam2.sam2_image_predictor import SAM2ImagePredictor; print('SAM2 설치 성공')"

실행 결과:

SAM2 설치 성공

이것으로 모델을 실행하기 위한 첫 번째 준비가 끝났습니다.


3. SAM 2.1 Large 모델 다운로드

SAM 2를 설치했다고 해서 학습된 모델 가중치까지 모두 준비되는 것은 아닙니다.

모델을 실행하려면 사전 학습된 가중치 파일이 필요합니다.

SAM 2.1 Large 모델의 가중치를 다운로드했습니다.

cd ~/project/travel-illustration-ai/external/sam2
wget -c \
  https://dl.fbaipublicfiles.com/segment_anything_2/092824/sam2.1_hiera_large.pt \
  -O checkpoints/sam2.1_hiera_large.pt

다운로드한 모델은 다음 경로에 저장됩니다.

external/sam2/checkpoints/sam2.1_hiera_large.pt

모델 설정 파일은 다음 경로를 사용합니다.

configs/sam2.1/sam2.1_hiera_l.yaml

모델 설정 파일은 신경망 구조를 정의하고, .pt 파일은 학습된 파라미터를 저장합니다.

두 파일이 서로 대응하는 모델이어야 정상적으로 가중치를 불러올 수 있습니다.


4. Python으로 이미지 객체 추출하기

이제 실제 여행 사진에서 정자 영역을 추출해 보겠습니다.

입력 이미지는 이전 글에서 전처리한 파일을 사용합니다.

datasets/processed/DSC05133.png

이번 실습에 사용한 이미지 크기는 다음과 같습니다.

(1024, 576, 3)

NumPy 이미지 배열은 (높이, 너비, 채널) 순서이므로 가로 576픽셀, 세로 1024픽셀의 RGB 이미지입니다.

SAM 2 모델 불러오기

파일 위치: src/inference/segment_image.py

먼저 필요한 라이브러리를 불러옵니다.

from pathlib import Path

import cv2
import numpy as np
import torch

from PIL import Image

from sam2.build_sam import build_sam2
from sam2.sam2_image_predictor import SAM2ImagePredictor

모델 경로와 설정 파일을 지정합니다.

PROJECT_ROOT = Path(__file__).resolve().parents[2]

MODEL_PATH = (
    PROJECT_ROOT
    / "external/sam2/checkpoints/sam2.1_hiera_large.pt"
)

MODEL_CONFIG = "configs/sam2.1/sam2.1_hiera_l.yaml"

모델 로드 함수는 다음과 같이 작성했습니다.

def load_model():

    device = "cuda" if torch.cuda.is_available() else "cpu"

    print("사용 장치:", device)

    if device != "cuda":
        raise RuntimeError(
            "CUDA GPU를 사용할 수 없습니다."
        )

    model = build_sam2(
        MODEL_CONFIG,
        str(MODEL_PATH),
        device=device
    )

    return SAM2ImagePredictor(model)

PyTorch에서 CUDA 사용 가능 여부를 확인하고 SAM 2 모델을 GPU에 로드합니다.

이번에는 RTX 5070 Ti에서 정상적으로 모델이 실행되었습니다.

마우스로 객체 영역 선택

SAM 2는 점이나 박스 등의 정보를 이용해 분할할 객체를 지정할 수 있습니다.

이번에는 OpenCV의 selectROI()를 이용했습니다.

파일 위치: src/inference/segment_image.py

def select_object(image):

    image_bgr = cv2.cvtColor(
        image,
        cv2.COLOR_RGB2BGR
    )

    x, y, w, h = cv2.selectROI(
        "Select Object",
        image_bgr,
        showCrosshair=True,
        fromCenter=False
    )

    cv2.destroyAllWindows()

    if w == 0 or h == 0:
        raise ValueError("영역이 선택되지 않았습니다.")

    return np.array(
        [x, y, x + w, y + h],
        dtype=np.float32
    )

프로그램을 실행하면 이미지 선택 창이 나타납니다.

마우스로 정자 전체를 감싸는 사각형을 선택하고 Enter를 누르면 선택한 좌표가 반환됩니다.

실제 실행 결과는 다음과 같았습니다.

 

선택 영역: [111. 357. 570. 650.]

이 좌표는 이미지 안에서 선택한 사각형의 좌측 상단과 우측 하단 위치를 나타냅니다.



SAM 2 이미지 분할 실행

선택한 영역을 모델에 전달해 실제 이미지 분할을 실행합니다.

파일 위치: src/inference/segment_image.py

with torch.inference_mode():
    with torch.autocast(
        device_type="cuda",
        dtype=torch.bfloat16
    ):

        predictor.set_image(image)

        masks, scores, logits = predictor.predict(
            box=box,
            multimask_output=True
        )

best_index = np.argmax(scores)

best_mask = masks[best_index]

torch.inference_mode()는 추론 과정에서 불필요한 그래디언트 계산을 비활성화합니다.

torch.autocast()는 GPU에서 일부 연산에 BF16을 활용하도록 설정합니다.

multimask_output=True는 여러 후보 마스크를 생성하도록 하는 옵션입니다.

각 마스크에는 모델이 추정한 품질 점수가 함께 반환됩니다.

이번에 출력된 점수는 다음과 같았습니다.

사용 장치: cuda
마스크 점수: 0.82421875

이 점수가 실제 객체 추출 정확도 82.4%를 의미하는 것은 아닙니다.

SAM 2가 예측한 마스크 품질에 대한 추정 점수이므로 실제 결과물과 비교하는 과정이 필요합니다.


5. 이미지 저장 과정에서 발생한 IndexError

모델 추론은 정상적으로 완료되었지만, 결과 이미지를 저장하는 과정에서 오류가 발생했습니다.

오류 메시지는 다음과 같았습니다.

IndexError: arrays used as indices must be
of integer (or boolean) type

문제가 발생한 코드는 다음 부분이었습니다.

파일 위치: src/inference/segment_image.py

overlay[mask] = (
    0.6 * image[mask]
    + 0.4 * np.array([255, 0, 0])
).astype(np.uint8)

여기서 문제는 image[mask]입니다.

NumPy 배열에서 마스크를 이용해 특정 픽셀을 선택할 때는 불리언 배열이나 정수 인덱스를 사용해야 합니다.

그런데 전달된 마스크가 해당 인덱싱에 적합한 자료형이 아니어서 오류가 발생한 것입니다.

해결 방법

마스크를 명시적으로 Boolean 자료형으로 변환했습니다.

mask = np.asarray(mask) > 0

수정 후에는 해당 부분이 정상적으로 실행되었습니다.

다만 이 코드는 0과 1로 표현된 이진 마스크를 전제로 합니다. 마스크가 연속적인 확률값이나 로짓이라면 적절한 임계값을 별도로 지정해야 합니다.

수정한 결과 저장 코드

파일 위치: src/inference/segment_image.py

def save_results(image, mask):

    OUTPUT_DIR.mkdir(
        parents=True,
        exist_ok=True
    )

    # Boolean 마스크로 변환
    mask = np.asarray(mask) > 0

    # 마스크를 이미지 저장용 값으로 변환
    mask_uint8 = mask.astype(np.uint8) * 255

    # 1. 마스크 이미지 저장
    Image.fromarray(mask_uint8).save(
        OUTPUT_DIR / "mask.png"
    )

    # 2. 원본 이미지에 마스크 표시
    overlay = image.copy()

    overlay[mask] = (
        0.6 * image[mask]
        + 0.4 * np.array([255, 0, 0])
    ).astype(np.uint8)

    Image.fromarray(overlay).save(
        OUTPUT_DIR / "overlay.png"
    )

    # 3. 투명 배경 이미지 생성
    rgba = np.dstack(
        [image, mask_uint8]
    )

    Image.fromarray(rgba).save(
        OUTPUT_DIR / "subject.png"
    )

처음에는 모델 추론에 문제가 있는 것으로 생각할 수 있지만, 실제로는 AI 모델의 문제가 아니라 NumPy 배열의 자료형 문제였습니다.

모델 개발에서는 추론 과정과 결과 후처리 과정을 구분해서 확인해야 한다는 점을 알 수 있었습니다.


6. OpenCV에서 발생한 Qt 폰트 경고

이미지 선택 창을 실행할 때 다음 메시지도 반복해서 출력되었습니다.

QFontDatabase: Cannot find font directory
...
Note that Qt no longer ships fonts.

OpenCV의 GUI에서 사용하는 Qt 라이브러리가 폰트 디렉터리를 찾지 못해 발생하는 경고입니다.

이번 환경에서는 이미지 선택 창이 정상적으로 표시되었고 마우스 입력도 가능했습니다.

따라서 SAM 2의 이미지 분할 기능에는 직접적인 영향을 주지 않았습니다.

경고 메시지가 나타난다고 해서 반드시 프로그램 실행이 실패한 것은 아닙니다.

문제가 발생한 기능과 경고 메시지의 관련성을 먼저 확인하는 것이 중요하겠습니다.


7. SAM 2 이미지 분할 실행 결과

오류를 수정한 후 프로그램을 다시 실행했습니다.

cd ~/project/travel-illustration-ai

conda activate travel-ai

python src/inference/segment_image.py

정상적으로 실행되었고, 다음 세 가지 결과 파일이 생성되었습니다.

outputs/
└── segmentation/
    ├── mask.png
    ├── overlay.png
    └── subject.png

① mask.png — 객체 영역 마스크

마스크 이미지는 AI가 추출한 객체의 영역을 흑백으로 나타냅니다.

  • 흰색: 추출한 정자 영역
  • 검은색: 배경 영역

 

② overlay.png — 분할 영역 확인

원본 이미지 위에 추출한 영역을 붉은색으로 표시합니다.

마스크가 실제 정자의 지붕과 기둥, 난간을 얼마나 잘 포함하는지 확인할 수 있습니다.

 

③ subject.png — 배경이 투명한 이미지

마스크를 Alpha 채널로 사용해 객체를 제외한 영역을 투명하게 처리했습니다.

 

이 이미지는 이후 여행 포스터에 들어갈 독립적인 그래픽 요소로 활용할 수 있습니다.

실제로 세 파일 모두 정상적으로 생성되었고, 결과물을 확인했을 때 이번 실습의 목적에 맞는 이미지가 만들어졌습니다.

아직 최종 목표인 추상화 일러스트는 아니지만, 사진 속 주요 피사체를 AI로 분리하는 첫 번째 과정에 성공한 것입니다.


8. 이번 실습을 마치며

이번에는 공개 AI 모델인 SAM 2.1을 직접 설치하고, GPU를 이용해 여행 사진에서 정자 영역을 추출했습니다.

진행하면서 두 가지 문제를 경험했습니다.

첫 번째는 설치 과정에서 콘솔 출력이 멈춘 것처럼 보였던 현상입니다.

실제로는 pip이 의존성 패키지를 설치하고 있었으며, 결과적으로 설치가 정상 완료되었습니다.

두 번째는 이미지 저장 과정에서 발생한 NumPy IndexError입니다.

마스크를 Boolean 자료형으로 변환해 해결할 수 있었습니다.

처음 사용하는 AI 모델이다 보니 설치부터 실행까지 모든 과정이 익숙하지는 않았지만, 실제 코드를 실행하고 오류를 해결하면서 모델의 동작 방식을 조금씩 이해할 수 있었습니다.

특히 이번 실습을 통해 다음과 같은 처리 구조를 확인했습니다.

여행 사진
    ↓
객체 영역 선택
    ↓
SAM 2 이미지 분할
    ↓
객체 마스크 생성
    ↓
배경 분리
    ↓
투명 PNG 이미지 저장

다음 단계에서는 추출한 객체를 바탕으로 색상과 형태를 단순화하는 이미지 추상화(Image Abstraction) 작업을 진행할 예정입니다.

최종 목표는 단순한 배경 제거가 아니라 사진의 특징을 유지하면서도 간결하고 통일감 있는 일러스트를 만드는 것입니다.

앞으로 공개 이미지 생성 모델도 비교해 보면서 여행 사진에 적합한 추상화 모델을 직접 만들어 보고자 합니다.


참고 자료

 

 

 

 

RTX 5070 Ti로 시작하는 AI 이미지 모델 개발 - Conda·PyTorch 환경 구축과 이미지 전처리

AI를 활용한 서비스를 개발하다 보면 공개된 모델이나 외부 API를 사용하는 경우가 많습니다. 하지만 이번에는 직접 모델을 학습하고 모바일 기기에 탑재하는 프로젝트를 진행해 보려고 합니다.

incurio.tistory.com

 

반응형
반응형

The giant 12,000% Mega BE@RBRICK inside BE@RBRICK CONNECT in Paju.

If you are a BE@RBRICK fan visiting Korea, there is an interesting place outside central Seoul that may be worth adding to your itinerary.

BE@RBRICK CONNECT is located in Paju, Gyeonggi-do, close to Paju Book City and the outlet area. It combines a café, gallery, shop, and BE@RBRICK-themed experiences in one space.

I visited BE@RBRICK CONNECT during a trip to Paju, and it turned out to be much more than just a character café.

BE@RBRICK CONNECT: Quick Information

Address:
6 Simhaksan-ro, Paju-si, Gyeonggi-do, South Korea
경기도 파주시 심학산로 6

Opening hours:
Tuesday–Sunday: 11:00–20:00
Monday: Closed

Phone:
+82 31-8070-5230

Instagram:
@bearbrick_connect

The current address and opening hours are also listed by MEDICOM TOY's official store information.

For navigation in Korea, I recommend copying the Korean address — 경기도 파주시 심학산로 6 — into Naver Map or KakaoMap.

BE@RBRICK CONNECT is near Paju's outlet and Book City area, so it is easier to visit as part of a Paju day trip rather than making the journey only for the café.

What Is BE@RBRICK CONNECT?

BE@RBRICK CONNECT opened in Paju in April 2026 as a cultural space built around the BE@RBRICK universe.

The complex brings together a café lounge, gallery, store, and a space where visitors can experience BE@RBRICK HEROES.

So even if you are not a serious collector, there is plenty to look at.

When you enter, the space is roughly divided into two directions: the exhibition area on one side and the café on the other.

And one thing is very hard to miss.

The Giant BE@RBRICK Is the Highlight

Inside the café area stands an enormous mechanical-style BE@RBRICK.

It is much larger than it looks in photos.

The sculpture is officially recognized by Guinness World Records as the largest BE@RBRICK in the world, measuring 8.47 meters tall. It is a 12,000% scale realization of the Mega BE@RBRICK character from BE@RBRICK HEROES.

You can see it from the lower floor, but I also recommend looking at it from the upper level because the different viewing angle makes its size even more impressive.

If you enjoy photography, this is probably the first place you will want to take out your camera.

Café and Bakery

The café is not separated from the BE@RBRICK experience. Figures and displays are placed throughout the space, so you continue looking around even while having a drink.

When I visited, there was a small bakery selection near the entrance.

I chose an egg tart and salt bread.

The bakery selection was not huge, but it was enough for a short café break. The drink menu was also relatively compact.

I would think of the café as part of the overall BE@RBRICK experience rather than visiting only for food.

BE@RBRICK Displays Everywhere

One of the most enjoyable parts of BE@RBRICK CONNECT is simply walking around and discovering figures.

There are BE@RBRICK displays throughout the café, and the exhibition space contains much more.

The passage leading to the exhibition area even has small details such as astronaut-style and shoe footprints on the floor.

I personally like details like this because they make the space feel more carefully designed than a simple toy store.

Gallery and Rare BE@RBRICK Pieces

The gallery is probably the most interesting area for collectors.

There are many different BE@RBRICK designs, including collaborations with artists and well-known characters.

I also found a BE@RBRICK inspired by Pikotaro, known internationally for "PPAP."

Some pieces were clearly much more valuable than the regular collectible releases.

One that particularly caught my attention was a BE@RBRICK decorated with traditional Korean mother-of-pearl inlay.

There were also collaborations with famous creators and brands.

And personally, I was happy to see an Optimus-themed BE@RBRICK that I had wanted for a while.

Even if you do not plan to buy anything, the gallery makes the visit worthwhile if you are interested in designer toys, character design, or pop culture.

You Can Also Try BE@RBRICK HEROES

There is also an area where visitors can experience the BE@RBRICK HEROES game.

When I visited, I saw another couple playing it and it looked interesting.

I skipped it because participation required signing up, but if you are more interested in the BE@RBRICK universe rather than just collecting the figures, it may be worth trying.

The game experience is one of the features officially included in the BE@RBRICK CONNECT concept.

Buying BE@RBRICK Figures

Of course, there is also a shop.

During my visit, both the café and exhibition area had BE@RBRICK products for sale, including 100% Series 51 and Series 52 figures and Mickey & Friends collaboration items.

I was mainly interested in Series 52, so I ended up buying three boxes.

At the time of my visit, one Series 52 blind box cost KRW 8,800.

Because BE@RBRICK products are blind boxes, whether you get the character you want is another question.

I am usually not particularly lucky with random boxes, so opening them later was part of the fun.

Prices and available series can change, so treat this as my experience rather than a guaranteed current price.

Check for Events Before You Visit

There was also a review event when I visited.

Visitors who completed the review/SNS requirements could receive two coins for a BE@RBRICK capsule-style draw.

I tried twice and unfortunately did not win anything.

Events like this can change or end, so I recommend checking @bearbrick_connect before your visit rather than expecting the same promotion to be available.

Tips for Foreign Visitors

BE@RBRICK CONNECT is in Paju, not central Seoul, so I would plan it as a half-day or full-day Paju trip.

A few things I would recommend for first-time international visitors:

Save the Korean address.
Use 경기도 파주시 심학산로 6 in your Korean navigation app.

Check the closing day.
The current regular closing day is Monday.

Check Instagram before going.
Special events, product releases, or promotions may change.

Do not expect only a café.
The interesting part is the combination of café, exhibition, BE@RBRICK displays, game experience, and shopping.

Allow time to look around.
Collectors will probably spend much longer here than visitors who only want coffee.

Combine it with other places in Paju.
The location is near the Paju outlet area and Paju Book City, making it easier to build a full day around the visit.

Is BE@RBRICK CONNECT Worth Visiting?

If you already like BE@RBRICK, designer toys, character art, or collectibles, I think the answer is easy: yes.

The combination of the giant BE@RBRICK, gallery displays, shop, and café makes it more interesting than visiting a regular toy store.

Even if you are not a collector, the Guinness World Record BE@RBRICK and the unusual interior make it a fun stop if you are already visiting Paju.

I would not necessarily travel all the way from central Seoul just for a cup of coffee, but as part of a Paju Book City or outlet day trip, BE@RBRICK CONNECT is an easy place to recommend.

And if you collect 100% BE@RBRICK figures like I do, there is a good chance you will leave with a few boxes in your bag.


BE@RBRICK CONNECT

6 Simhaksan-ro, Paju-si, Gyeonggi-do
경기도 파주시 심학산로 6

Tuesday–Sunday: 11:00–20:00
Closed Monday

Instagram: @bearbrick_connect

반응형
반응형

AI를 활용한 서비스를 개발하다 보면 공개된 모델이나 외부 API를 사용하는 경우가 많습니다. 하지만 이번에는 직접 모델을 학습하고 모바일 기기에 탑재하는 프로젝트를 진행해 보려고 합니다.

제가 만들려는 서비스는 여행 사진을 분석하고, 사진 속 장소의 특징을 추출해 간결한 일러스트로 변환하는 AI 애플리케이션입니다.

여행지에서 촬영한 여러 장의 사진을 하나의 포스터로 구성하고, 인스타그램과 같은 SNS에 공유하는 것이 최종 목표입니다.

이번 글에서는 AI 모델을 학습하기에 앞서 NVIDIA RTX 5070 Ti 환경에서 Conda와 PyTorch를 설정하고, Python으로 첫 번째 여행 사진을 전처리하는 과정까지 정리해 보겠습니다.

 

1. 여행 사진 추상화 AI 프로젝트

프로젝트에서 구현하려는 기능은 단순한 이미지 필터와는 조금 다릅니다.

예를 들어 전통 정자를 촬영한 사진이 있다면 AI가 기와지붕의 곡선, 기둥의 배치, 주변 풍경과 같은 특징을 추출하는 것입니다.

그다음 불필요한 질감과 복잡한 배경을 제거하고, 핵심 형태만 남긴 일러스트로 변환하려고 합니다.

최종적으로는 다음과 같은 흐름을 생각하고 있습니다.

여행 사진 선택
      ↓
이미지 특징 분석
      ↓
주요 피사체 추출
      ↓
이미지 추상화
      ↓
여행 포스터 생성
      ↓
Android 앱에서 SNS 공유

개발 방향은 다음과 같이 결정했습니다.

구분 개발 방향
첫 출시 플랫폼 Android
개발 및 학습 환경 Ubuntu + RTX 5070 Ti
AI 프레임워크 PyTorch
가상환경 Conda
우선순위 이미지 품질
최종 목표 Android 온디바이스 AI

모델을 처음부터 학습하는 것도 가능하겠지만, 우선 공개된 AI 모델을 활용해 원하는 결과물을 구현할 수 있는지 확인하려고 합니다.

필요하다면 추후 LoRA 등의 기술을 활용해 파인튜닝하는 방향으로 진행할 예정입니다.

2. RTX 5070 Ti GPU 환경 확인

딥러닝 모델을 학습하려면 GPU 환경부터 확인해야 합니다.

현재 사용 중인 개발 PC에는 NVIDIA GeForce RTX 5070 Ti가 장착되어 있습니다.

Ubuntu 터미널에서 다음 명령어를 실행합니다.

nvidia-smi

실행 결과 주요 정보는 다음과 같습니다.

NVIDIA-SMI 595.99.02
Driver Version: 595.99.02
CUDA Version: 13.2

GPU: NVIDIA GeForce RTX 5070 Ti
Memory: 16303 MiB

GPU는 정상적으로 인식되었고, 약 16GB의 VRAM을 사용할 수 있는 것을 확인했습니다.

여기서 한 가지 궁금했던 점은 CUDA 버전입니다.

CUDA 13.2인데 PyTorch는 CUDA 12.8을 사용해도 될까?

nvidia-smi에 표시되는 CUDA 버전은 NVIDIA 드라이버가 지원하는 CUDA 버전입니다.

반면 PyTorch 패키지에서 사용하는 CUDA 버전은 해당 패키지가 빌드된 CUDA 환경을 의미합니다.

일반적으로 최신 NVIDIA 드라이버는 이전 CUDA 버전으로 빌드된 프로그램도 실행할 수 있습니다.

따라서 현재 환경에서는 CUDA 12.8 기반 PyTorch 패키지로 시작하기로 했습니다.

다만 드라이버가 GPU를 인식하는 것과 PyTorch가 실제 GPU 연산을 수행하는 것은 별개의 문제이므로 설치 후 확인이 필요합니다.

3. Conda 가상환경 생성

Python으로 AI 프로젝트를 진행할 때 가상환경을 사용하는 이유는 프로젝트마다 필요한 라이브러리와 버전이 다르기 때문입니다.

특히 PyTorch, CUDA 관련 패키지는 버전 호환성이 중요합니다.

이번 프로젝트에서는 Python 3.11을 사용했습니다.

먼저 Conda가 설치되어 있는지 확인합니다.

conda --version

Conda가 설치되어 있다면 프로젝트 전용 가상환경을 생성합니다.

conda create -n travel-ai python=3.11 -y

가상환경을 활성화합니다.

conda activate travel-ai

정상적으로 활성화되면 터미널에 다음과 같이 표시됩니다.

(travel-ai) user@ubuntu:~$

Python 버전도 확인합니다.

python --version
Python 3.11.x

마지막으로 pip을 업데이트합니다.

python -m pip install --upgrade pip

이렇게 하면 AI 프로젝트에 사용할 독립적인 Python 환경이 준비됩니다.

4. PyTorch 설치

PyTorch는 딥러닝 모델을 개발하고 학습할 때 사용하는 오픈소스 프레임워크입니다.

텐서 연산과 자동 미분 기능을 제공하며, CUDA를 활용해 GPU에서 연산을 수행할 수 있습니다.

이번 프로젝트에서는 CUDA 12.8 기반 PyTorch 패키지를 사용합니다.

python -m pip install \
  torch==2.10.0 \
  torchvision==0.25.0 \
  --index-url https://download.pytorch.org/whl/cu128

설치가 완료되면 다음 코드로 확인할 수 있습니다.

import torch

print("PyTorch:", torch.__version__)
print("CUDA:", torch.version.cuda)
print("GPU 사용 가능:", torch.cuda.is_available())

torch.cuda.is_available()가 True를 반환하면 PyTorch가 CUDA 장치를 사용할 수 있다는 의미입니다.

GPU 이름도 확인할 수 있습니다.

print(torch.cuda.get_device_name(0))

예상 결과는 다음과 같습니다.

NVIDIA GeForce RTX 5070 Ti

GPU에서 실제 연산이 수행되는지도 확인할 수 있습니다.

a = torch.rand(1024, 1024, device="cuda")
b = torch.rand(1024, 1024, device="cuda")

c = torch.matmul(a, b)

torch.cuda.synchronize()

print(c.shape)
print(c.device)

이 코드는 GPU 메모리에 두 개의 행렬을 생성한 뒤 행렬 곱셈을 수행합니다.

연산이 정상적으로 완료되고 cuda:0이 출력되면 GPU 연산이 정상적으로 실행된 것입니다.

참고: 이 GPU 연산 테스트는 환경 검증용 코드입니다. 실제 테스트 결과를 블로그에 기록할 때는 실행한 PC에서 확인한 출력값을 사용하는 것이 좋겠습니다.

반응형

5. 이미지 처리 라이브러리 설치

모델 학습에 앞서 여행 사진을 불러오고 전처리할 수 있어야 합니다.

이번에는 다음 라이브러리를 설치했습니다.

python -m pip install \
  opencv-python \
  pillow \
  numpy \
  matplotlib

 

각 라이브러리는 다음과 같은 용도로 사용합니다.

라이브러리 용도
OpenCV 이미지 처리 및 특징 분석
Pillow 이미지 파일 읽기 및 저장
NumPy 이미지 배열 연산
Matplotlib 이미지 및 분석 결과 시각화

아직 AI 모델을 학습하는 단계가 아니므로 이번에는 Pillow를 이용한 기본 이미지 전처리부터 구현했습니다.

6. AI 프로젝트 디렉터리 구성

프로젝트 이름은 travel-illustration-ai로 정했습니다.

앞으로 모델 학습, 이미지 처리, 추론, Android 모델 변환 등을 진행할 예정이므로 기능별로 디렉터리를 구분했습니다.

travel-illustration-ai/
│
├── datasets/
│   ├── raw/
│   ├── processed/
│   └── targets/
│
├── outputs/
│   ├── preprocessing/
│   └── illustrations/
│
├── models/
│
├── src/
│   ├── preprocessing/
│   ├── inference/
│   └── training/
│
├── configs/
│
└── docs/

datasets/raw에는 원본 사진을 보관하고, datasets/processed에는 전처리된 이미지를 저장합니다.

datasets/targets는 향후 모델 학습에 사용할 목표 일러스트 이미지를 관리하기 위한 디렉터리입니다.

src에는 Python 코드를 기능별로 구분해 작성할 예정입니다.

초기 프로젝트이므로 지나치게 복잡하게 구성하지 않고, 개발하면서 필요한 구조를 추가하려고 합니다.

7. Python으로 여행 사진 전처리하기

이제 실제 사진을 처리해 보겠습니다.

이번에 사용할 사진은 여행 중 촬영한 전통 정자 사진입니다.

원본 이미지 파일은 다음 위치에 저장했습니다.

원본 이미지 경로

datasets/raw/DSC05133.JPG

이미지 전처리 과정에서는 다음 작업을 수행합니다.

  1. 원본 이미지 불러오기
  2. EXIF 방향 정보 적용
  3. RGB 색상 형식으로 변환
  4. 이미지 비율을 유지하면서 크기 조정
  5. PNG 파일로 저장

이미지 전처리 코드

파일 위치: src/preprocessing/prepare_image.py

from pathlib import Path
from PIL import Image, ImageOps

PROJECT_ROOT = Path(__file__).resolve().parents[2]

INPUT_PATH = (
    PROJECT_ROOT
    / "datasets/raw/DSC05133.JPG"
)

OUTPUT_PATH = (
    PROJECT_ROOT
    / "datasets/processed/DSC05133.png"
)

MAX_SIZE = 1024


def prepare_image():

    if not INPUT_PATH.exists():
        raise FileNotFoundError(
            f"원본 이미지가 없습니다: {INPUT_PATH}"
        )

    with Image.open(INPUT_PATH) as source:

        image = ImageOps.exif_transpose(source)

        image = image.convert("RGB")

        print("원본 이미지 크기:", image.size)

        image.thumbnail(
            (MAX_SIZE, MAX_SIZE),
            Image.Resampling.LANCZOS
        )

        print("변환 이미지 크기:", image.size)

        OUTPUT_PATH.parent.mkdir(
            parents=True,
            exist_ok=True
        )

        image.save(OUTPUT_PATH)

    print("전처리 완료")
    print("저장 위치:", OUTPUT_PATH)


if __name__ == "__main__":
    prepare_image()

이미지 전처리에서 고려한 부분

첫 번째는 이미지 방향입니다.

스마트폰이나 카메라로 촬영한 사진에는 EXIF 회전 정보가 포함될 수 있습니다.

ImageOps.exif_transpose()를 사용하면 해당 방향 정보를 적용할 수 있습니다.

두 번째는 이미지 크기입니다.

원본 사진을 그대로 모델에 입력하면 이미지 크기가 커서 메모리 사용량과 처리 시간이 증가할 수 있습니다.

따라서 이번에는 긴 변이 최대 1024픽셀이 되도록 설정했습니다.

image.thumbnail(
    (MAX_SIZE, MAX_SIZE),
    Image.Resampling.LANCZOS
)

thumbnail()은 가로세로 비율을 유지하면서 이미지 크기를 조정합니다.

또한 원본이 이미 지정한 크기보다 작다면 불필요하게 확대하지 않습니다.

세 번째는 색상 형식입니다.

이미지를 RGB로 변환해 이후 모델 입력 과정에서 색상 형식 차이로 발생할 수 있는 문제를 줄였습니다.

마지막으로 PNG 형식으로 저장했습니다.

PNG는 무손실 압축을 지원하므로 이번 전처리 과정에서 추가적인 JPEG 압축 손실을 피할 수 있습니다.

다만 크기 조정 자체로 인한 세부 정보 손실까지 없어지는 것은 아닙니다.

8. 이미지 전처리 실행 결과

프로젝트 루트 디렉터리에서 Python 파일을 실행합니다.

python src/preprocessing/prepare_image.py

실행 과정에서 처음에는 다음 오류가 발생했습니다.

[Errno 2] No such file or directory

이 오류는 Python 실행 파일이나 참조하는 이미지 경로가 일치하지 않을 때 발생할 수 있습니다.

따라서 현재 작업 디렉터리와 파일 경로를 확인했습니다.

pwd
ls -l src/preprocessing/
ls -l datasets/raw/

현재 작업 위치와 파일 경로를 확인한 후 다시 실행했고, 이미지가 정상적으로 처리되는 것을 확인했습니다.

결과 파일은 다음 경로에 생성됩니다.

datasets/processed/DSC05133.png

이번 전처리에서는 이미지 방향과 비율을 유지하면서 크기와 색상 형식을 정규화했습니다.

아직 AI가 사진의 특징을 추출하거나 일러스트로 변환한 것은 아닙니다.

하지만 이후 모델을 적용하기 위한 첫 번째 이미지 처리 환경을 구축했다는 점에 의미를 두고 싶습니다.

9. 첫 번째 개발 단계를 마치며

이번 작업에서는 AI 모델을 학습하기 위한 개발 환경을 구성하고, 실제 여행 사진을 Python으로 처리했습니다.

현재까지 진행한 작업은 다음과 같습니다.

  • NVIDIA RTX 5070 Ti 및 CUDA 환경 확인
  • Conda 가상환경 구성
  • PyTorch 개발 환경 준비
  • OpenCV, Pillow 등 이미지 처리 라이브러리 설치
  • AI 프로젝트 디렉터리 구성
  • Python 이미지 전처리 구현 및 실행

모델을 직접 학습한다는 것이 처음에는 어렵게 느껴졌지만, 우선 개발 환경을 준비하고 작은 기능부터 구현하는 방식으로 진행하고 있습니다.

앞으로 중요한 것은 단순히 이미지를 변환하는 것이 아니라 사진 속 장소의 특징을 얼마나 잘 보존하면서 단순한 일러스트로 표현할 수 있는가입니다.

다음 단계에서는 공개 이미지 분할 모델인 SAM 2를 활용해 사진에서 주요 피사체를 추출해 볼 예정입니다.

전통 정자 사진에서 지붕과 기둥을 포함한 건축물 영역을 분리하고, 추출한 결과를 바탕으로 이미지 추상화 과정을 발전시켜 보겠습니다.

최종적으로는 직접 학습하거나 최적화한 모델을 Android 기기에 탑재하는 것까지 진행할 계획입니다.


참고 자료

 

 

 

SAM 2.1 이미지 분할 실습: RTX 5070 Ti로 객체 추출하고 오류 해결하기

지난 글에서는 RTX 5070 Ti 환경에서 Conda와 PyTorch를 설치하고, Python으로 여행 사진을 전처리하는 과정을 진행했습니다.이번에는 본격적으로 AI 모델을 이용해 사진 속 특정 객체를 추출하는 작업을

incurio.tistory.com

 

반응형
반응형

일년에 두어번 밤마을에 밤빵 사러 들리는 공주인데

이번엔 백제문화재도 구경할겸 부여와 공주를 둘러보며 하루를 보내기로 합니다.

첫번째 일정으로 식사를 위해 허영만의 백반기행에 소개되었던 연잎담을 가기로 했는데

궁남지 주차장에 주차 후 주변을 구경할 겸 걸어가기로 했습니다.

 

한끼 먹자고 걸어가기엔 가까운 거리는 아니므로 식당까지 차를 타고 가시는걸 추천합니다.

병원 뒷편에 위치해서 주차장이 넓습니다.

 

여기가 맞나 싶은 입구와 간판입니다.

반응형

 

실내를 들어가면 첫 인상은 정돈이 안되어 있다와 통일성이 없다 입니다.

테이블이 다 다르게 생겨서 그런것도 있고 테이블위에 노트나 볼펜들이 많아서 여기 앉아도 되는건란 생각이 들 정도 였습니다.

 

저흰 전통 한옥문을 테이블로 만든 자리에 앉았습니다.

앉아서 보니 노트는 손님들 방명록이였네요.

방명록도 있고 스케치북도 있는데 아이들 그림이 많았습니다.

 

연잎담 이름의 의미인데 요즘은 이런거 읽어보는게 좋습니다.

나이가 들어가면서 바뀌는 점  중에 하나네요.

 

저흰 선화밥상 연잎밥떡갈비를 주문했습니다.

영수증 리뷰 이벤트도 하는데 이런건 귀찮아 하는 편이라 하진 않았지만 음료수 1병이니 해보는것도 좋겠네요.

 

식전 메뉴로 샐러드와 연근이 들어간 전이 나옵니다.

전은 어떻게 먹어도 맛있습니다.

 

반찬은 전반적으로 입맛에 잘 맞았습니다.

반찬의 재료는 모르는것들이 있었지만 시골 밥상 느낌이였어요.

 

너무 좋아하는 떡갈비

예전엔 담양에 먹으러 갔었는데 여기도 나쁘지 않았습니다.

식감이 완전 다른데 연잎담의 떡갈비는 속이 굉장히 부드럽고 쫄깃한 느낌이 납니다.

처음 베어 물면 안익은건가라고 오해할 정도였으니 참고하세요.

같이 나오는 호박잎에 싸먹는것도 맛있습니다.

 

연잎밥과 된장국

된장국은 심플 오브 심플 입니다. 하지만 맛은 시골된장으로 만든 듯 진한 맛이 납니다.

연잎밥집가면 반으로 잘라서 쓰는 곳도 있는데 여긴 한장을 다 써서인지 엄청 큽니다.

 

연잎을 펼치면 나오는 찰진 연잎밥

연잎향이 가득 느껴집니다.

대통밥과는 확실히 다른 향입니다.

담양의 떡갈비 대통밥도 좋지만 연잎담에 떡갈비 연잎밥도 괜찮은 선택이 되겠네요.

떡갈비 없이 좀 더 저렴한 가격에 연잎밥 정식이 있어도 좋지 않을까란 생각도 해봅니다.

반응형

+ Recent posts