반응형

지난 글에서는 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병이니 해보는것도 좋겠네요.

 

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

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

 

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

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

 

너무 좋아하는 떡갈비

예전엔 담양에 먹으러 갔었는데 여기도 나쁘지 않았습니다.

식감이 완전 다른데 연잎담의 떡갈비는 속이 굉장히 부드럽고 쫄깃한 느낌이 납니다.

처음 베어 물면 안익은건가라고 오해할 정도였으니 참고하세요.

같이 나오는 호박잎에 싸먹는것도 맛있습니다.

 

연잎밥과 된장국

된장국은 심플 오브 심플 입니다. 하지만 맛은 시골된장으로 만든 듯 진한 맛이 납니다.

연잎밥집가면 반으로 잘라서 쓰는 곳도 있는데 여긴 한장을 다 써서인지 엄청 큽니다.

 

연잎을 펼치면 나오는 찰진 연잎밥

연잎향이 가득 느껴집니다.

대통밥과는 확실히 다른 향입니다.

담양의 떡갈비 대통밥도 좋지만 연잎담에 떡갈비 연잎밥도 괜찮은 선택이 되겠네요.

떡갈비 없이 좀 더 저렴한 가격에 연잎밥 정식이 있어도 좋지 않을까란 생각도 해봅니다.

반응형
반응형

1년에 명절 두번과 집안 행사가 있을때만 내려오는 속초입니다.

보통은 본가로 바로 가는데 제사 장을 먼저 보고 가려다 보니 아침은 먹어야기에 해장국을 먹기로 해봅니다.

엑스포 공원에서 농구하고 자주 가던 청진동 해장국을 먼저 갔는데 닫혀 있더라고요.

휴일인지 폐업인지 겉보기엔 판단이 안되서 다른 곳을 찾아봅니다.

근처에 양평해장국집이 있어서 이곳으로 결정

 

7시부터 영업 시작입니다.

저는 8시쯤 방문했는데 손님이 꽤 계셨습니다.

 

신발은 벗을 필요가 없습니다.

깔끔하고 테이블 사이가 넓어 쾌적했습니다.

 

양평해장국집에 왔으니 저는 양평해장국, 짝꿍은 뼈다귀해장국을 주문했습니다.

양평해장국은 현재 살고 있는 인천보다  1~2천원 비싼 듯 합니다.

 

특별한건 없는 양평해장국과 뼈해장국 입니다.

그래서 마음에 더 드네요. 

요즘은 기본도 못하는 식당들도 꽤 되니까요.

속초에 맛집도 많다지만 저에겐 특별하지않고

회사 점심시간에도 많이 먹을 수 있는 평범한 음식이지만

어렸을때 친구들과 놀고 밥 먹었던 곳에서 먹으니 더 특별하게 느껴집니다.

 

엑스포공원 농구장에서 많은 시간을 보냈는데 울산바위가 이렇게 잘 보인다는걸 처음 알았습니다.

늘 제자리에 있지만 나이가 들어서야 보이는게 있네요. 

 

 

 

 

 

 

짧아서 아쉬운 어릴적 추억 여행

결혼 이후 명절에만 가고 제사준비할때만 나와보는 속초 시내를 걷고 싶었습니다.요즘 인스타에 현지인 맛집이라고 올라오는 릴스가 많던데 어릴적 알던 속초가 아니구나 싶어 구경삼아 걸어

incurio.tistory.com

 

반응형
반응형

다이캐스트에 관심을 갖기 시작하니 엄청 다양한 회사가 존재 함을 알게 됩니다. 

기존엔 토미카와 핫휠말고는 몰랐는데 말이죠.

이번 BM Creations의 미쓰비시 파제로를 구매했습니다.

 

현대의 갤로퍼로 알려진 1세대 파제로인줄 알고 구매했는데 3세대 파제로 였네요.

그래도 최근의 파제로는 아니여서 나쁘지는 않았습니다.

 

구성품은 본체와 갈아끼울 수 있는 타이어입니다.

리미티드 에디션이라고 하는데 디자인일까요? 타이어가 들어있어서 일까요?

 

앞좌석 양쪽문은 열리게 되어 있습니다. 그외의 문은 열리지가 않네요

마감은 조금 거친편입니다. 

그냥 보기에도 퀄리티는 미니GT나 팝레이스 급은 아닌거 같고 토미카와 비슷한거 같네요.

 

이 제품에 들어있는 타이어는  둘레는 동일하지만 폭이 다릅니다.

기본 타이어와 다르게 측면에 텍스트가 프린팅 되어 있는데 없는게 더 낫지 않을까 싶네요.

반대로 돌려서 텍스트가 안쪽으로 들어가게 꽂아도 되니 흠은 아닙니다.

타이어의 트레드도 다릅니다. 여분이 아닌 다른 컨셉의 타이어가 들어 있는 거네요.

 

순정타이어와 교체한 타이어입니다.

텍스트 문구는 마음에 안들지만 그래도 오프로드 느낌은 드네요.

미니 GT를 보다가 이 제품을 보면 퀄리티 갭이 크게 느껴지지만

SUV에 오프로드용이라고 놓고 본다면 썩 나쁘지는 않습니다.

다만 책상에 하나의 제품만 놓고 싶다면 추천하기엔 부족해 보입니다.

 

반응형
반응형

자동차를 좋아하다 보면 한 번쯤 실제 자동차를 그대로 축소해 책상이나 장식장에 놓아두고 싶다는 생각을 하게 됩니다.

다이캐스트 미니카에는 정말 많은 브랜드가 있지만, 그중에서도 최근 1/64 스케일을 수집하는 사람들에게 빼놓기 어려운 브랜드가 MINI GT(미니지티) 입니다.

MINI GT는 TSM-Model 계열의 1/64 모델카 브랜드로 2017년 등장했습니다. 브랜드가 직접 내세우는 특징 역시 가격과 품질 사이의 균형입니다.

 

MINI GT의 가장 큰 매력은 균형

MINI GT를 처음 손에 올려놓으면 일반적인 완구형 미니카와는 조금 다른 느낌을 받게 됩니다.

차체의 비율이나 휠 디자인, 라이트와 그릴 같은 작은 부분까지 실제 차량의 특징을 비교적 충실하게 표현하면서도, 고가의 레진 모델처럼 쉽게 접근하기 어려운 가격대까지 올라가지는 않습니다.

그래서 MINI GT는 단순히 가지고 노는 미니카보다는 작은 자동차 모형을 수집한다는 느낌에 더 가깝습니다.

 

MINIGT.com – Welcome to the World of 1:64!

TSM-Model

minigt.tsm-models.com

 

차종이 많아 수집하는 재미가 있다

MINI GT의 또 다른 장점은 다양한 차종입니다.

현재 공식 라인업에는 BMW, Porsche, Lamborghini, Nissan, Toyota, Honda뿐 아니라 Hyundai, Bugatti, Pagani 등 다양한 자동차 브랜드가 포함되어 있습니다. 여기에 LB Works, Pandem, Top Secret, VeilSide와 같은 튜닝카, SUPER GT와 IMSA 같은 모터스포츠 차량까지 만나볼 수 있습니다.

덕분에 수집 방향을 잡기도 쉽습니다.

포르쉐만 모을 수도 있고, 일본 JDM 차량을 중심으로 구성할 수도 있으며, 슈퍼카나 레이싱카를 하나의 테마로 만들 수도 있습니다.

순정차부터 튜닝카와 레이싱카까지

과거 MINI GT가 순정 차량의 정교한 축소 모형이라는 이미지가 강했다면 지금은 영역이 훨씬 넓어졌습니다.

2026년에는 Fast & Furious 컬렉션과 Tokyo Xtreme Racer 협업 등 자동차 문화를 활용한 제품군도 계속 확대되고 있습니다.

따라서 실제 자동차를 좋아하는 사람은 물론이고 JDM, 튜닝카, 모터스포츠를 좋아하는 사람도 충분히 자신의 취향에 맞는 모델을 찾을 수 있습니다.

MINI GT는 이런 사람에게 추천

다이캐스트를 처음 수집하는 사람에게 MINI GT는 상당히 좋은 출발점입니다.

너무 완구 같지는 않았으면 좋겠지만 처음부터 지나치게 비싼 모델을 구입하기는 부담스럽고, 여러 자동차를 하나둘씩 모으면서 컬렉션을 만들고 싶은 사람에게 특히 잘 맞습니다.

저 역시 MINI GT의 장점은 어느 한 부분이 압도적이라기보다 가격, 디테일, 차종, 수집성의 균형이 좋다는 점이라고 생각합니다.

1/64 다이캐스트 취미를 시작하려 한다면 한 번쯤 살펴볼 만한 브랜드입니다.

 

 

 

 

 

미니GT hyundai i20 랠리

요즘 실차 다이캐스트에 부쩍 관심이 생겼는데서울역 롯데마트에 들렸다가 미니GT를 접하게 됐습니다.견물생심이라고 했던가요토미카로 만족했었는데 미니GT의 제품을 보는 순간 토미카로는

incurio.tistory.com

 

 

미니GT i20 리어윙 셀프 보수하기

셀프 보수라고 하니 뭔가 거창하게 들리네요.사실은 떨어진 부품 다시 붙이는것 뿐인데 말이죠.아직 전시대를 구매하지 않아서 박스에 보관해둔 i20을 떨어뜨렸는데들어보니 박스안에서 안들리

incurio.tistory.com

 

반응형
반응형

카시오 포레스터 시계가 사고 싶어서 고민하다가

하나도 없는 타이맥스에 비슷한 느낌의 시계가 있었으니

타이맥스 익스페디션 캠퍼 였습니다.

디자인은 카시오 포레스터가 확실히 예쁘긴 하지만 카시오 시계는 몇개 있어 

아직 사본 적 없는 타이맥스 시계를 구매했습니다. 

 

카시오나 타이맥스나 저렴한 모델의 포장은 비슷한 느낌입니다.

무브먼트, 스트랩, 제조국이 따로 표시되어 있는건 좀 다르네요. 

타이맥스 M905무브먼트 인듯 하네요.

 

Timex M905 movement • Mastersintime.com

Part of Holland Watch Group B.V.

www.mastersintime.com

 

 

깔끔하게 생겼습니다.

방수는 50m에 나일론 스트랩이 특징인듯 합니다.

 

 

시계 배터리 정보와 먹으면 안된다는 경고 문구가 눈에 띄네요.

 

 

용두에 플라스틱 조각이 끼어 있는데 용두를 누르면 인디글로 야광이 켜지기 때문에 

방지차원으로 끼어 있는 조각이니 바로 빼시면 됩니다.

 

시계 디자인은 심플 오브 심플 입니다. 

필드워치에서 많이 보이는 디자인이죠.

케이스 사이즈는 39mm 입니다.

시, 분침이 정직한 직사각형인데 카시오 포레스터 시, 분침이 더 예쁜거 같네요.

글라스는 레진입니다. 

카시오나 타이맥스는 저렴한 모델에는 여지없이 레진이네요.

중국제 제품들이 더 저렴한 제품에도 사파이어 글라스를 쓰는데 미네랄 글라스라도 써주면 안될까 하는 아쉬움이 남네요.

 

인디글로 야광입니다.

타이맥스 인디글로 성능은 확실하네요.

인디글로가 있어서 인지 시, 분, 초 침과 다이얼에는 야광이 하나도 없습니다.

 

이 시계 선택 이유 중 첫번째인 스트랩 입니다.

두께는 얇지만 많이 뻣뻣한 편이어서 손목에 착 감기는 느낌은 없습니다.

가격 생각한다면 참고 넘어갈 정도는 됩니다.

 

다만 스트렙 안쪽 마무리가 많이 아쉽습니다.

이게 손목을 은근 긁는 문제가 있네요. 

착용하고 활동하다보면 한번씩 인상쓰게 만듭니다.

 

타이맥스 익스페디션 캠퍼는 스트랩 마감만 좋았다면 이름대로 캠핑이나 트레킹 활동에서는 쓰기 무난한 시계라고 생각했을 겁니다.

착용감에 불편함을 주니 움직임이 많은 활동보단 평소에 산책정도에서 가볍게 착용할만한 시계이지 않을까 싶네요.

물론 줄질로 해결할 수 있는 문제긴 하죠.

 

마지막으로 타이맥스 시계는 처음인데 소리가 엄청 큽니다.

소문은 들었지만 정말 정말 큽니다.

잘때는 착용하지 않는걸 추천드립니다.

 

반응형

+ Recent posts