이미지 분류 입문 안내
이 글에서는 이미지 인식의 복잡한 주제를 다루며, CNN의 기초를 이해하는 것부터 직접 이미지 분류 모델을 구현하는 방법까지 살펴봅니다. 이 글은 AI로 번역되었습니다. 오역이 있을 경우 댓글로 알려주세요.
Created on September 15|Last edited on September 15
Comment

소개
이 글에서는 이미지 분류의 세계를 살펴보겠습니다. 먼저 이미지 분류가 무엇인지, 이진 분류와 다중 분류 같은 다양한 유형에 대해 개괄적으로 설명하겠습니다. 그다음 자율주행, 의료 영상, 검색, 얼굴 인식, 접근성 도구 등 여러 분야에서 이미지 분류가 왜 중요한지 살펴보겠습니다. 컴퓨터 비전의료 영상, 자율주행 자동차.
데이터 준비와 특징 추출부터 모델 학습과 평가까지, 이미지 분류 모델을 만드는 데 필요한 단계들을 모두 다루겠습니다. 또한 최근 수년간 널리 사용되며 여러 벤치마크에서 최고 성능을 달성��� CNN을 포함해, 이미지 분류에 활용되는 대표적인 우수 모델들도 함께 살펴보겠습니다.
또한 최근 동향으로, 이미지 분류 과제에서 뛰어난 성능을 보인 Vision Transformer와 같은 최신 기법들도 간단히 살펴보겠습니다.
초보자든 숙련된 실무자든, 이 글은 이미지 분류와 그 다양한 측면에 대해 종합적인 이해를 제공할 것입니다.
다음 내용을 다루겠습니다:
목차
소개이미지 분류란 무엇인가?이미지 분류가 중요한 이유는 무엇인가? 이미지 분류의 유형은 무엇인가요?이미지 분류는 지도 학습일까, 비지도 학습일까?이미지 분류는 어떤 절차로 이루어지나요?이미지 분류에 가장 적합한 모델은 무엇인가요?이미지 분류에 왜 CNN을 사용할까? 이미지 분류에 가장 적합한 CNN은 무엇일까? SVM 이미지 분류란 무엇인가?PyTorch를 사용한 이미지 분류 예제결론
이미지 분류란 무엇인가?
이미지 분류는 한 이미지를 미리 정의된 범주로 분류하는 기술입니다. 예를 들어 자동차와 오토바이 사진을 분류한다고 가정해 봅시다. 이 경우 모델은 자동차 사진을 한 범주로, 오토바이 사진을 다른 범주로 분류하도록 설정할 수 있습니다.
그리고 이미지 분류는 생각보다 훨씬 잘 작동합니다. 최근 몇 년 사이 컴퓨터는 체스, 체커, 오셀로 같은 보드게임에서 인간을 이겼습니다. 로봇은 자체 탑재 소프트웨어로 화성을 탐사하고 있습니다. 겉보기에는 이러한 성과들이 이미지 처리와 전혀 달라 보일 수 있지만, 공통적으로 모두 패턴 인식에 의존합니다.
이미지 분류의 경우, 컴퓨터는 사진 속에서 특정 특징(예: 물체에 바퀴나 날개가 있는지)을 찾아 그 특징들을 바탕으로 물체를 분류합니다. 이 과정을 반복하면서 컴퓨터는 바퀴나 날개처럼 어떤 특징들이 하나의 물체를 구성하는지 학습하고, 이후에는 새로운 이미지에서도 그러한 특징을 찾아내기 시작합니다.
이미지 분류가 중요한 이유는 무엇인가?

이미지 분류의 중요성은 의학, 자율주행, 보안, 교육 등 다양한 분야에서의 폭넓은 활용과 실질적인 응용 사례에서 잘 드러납니다. 이러한 응용의 예로는 다음과 같은 것들이 있습니다:
- 객체 검출 이미지 분류는 주변 차량, 보행자, 교통 표지, 도로 표시 등 차량 주변 환경의 객체를 탐지하고 분류하는 데 사용됩니다. 이렇게 얻은 정보는 차량의 속도와 주행 경로를 결정하는 데 활용됩니다.
- 의료 영상 분석 - 이미지 분류는 의료 영상에서 암이나 심혈관 질환과 같은 질병을 탐지하고 진단하는 데 활용될 수 있습니다.
- 웹 검색 엔진 - Google 이미지 검색은 이미지 분류 기법을 사용하여 이미지 검색 시 관련성 높은 결과를 제공합니다.
- 안면 인식 - 소프트웨어는 이미지 분류 기법을 통해 얼굴을 식별하고 이름, 나이, 성별 등의 정보를 제공하도록 학습될 수 있습니다.
- 시각 ��애인의 접근성 향상 - 이미지를 실시간으로 설명하여 콘텐츠를 전달합니다.
이미지 분류의 유형은 무엇인가요?

이미지 분류에는 다음과 같은 여러 유형이 있습니다.
이진 분류이미지 분류의 가장 단순한 형태로, 목표는 한 이미지를 두 개의 클래스 중 하나(예: “개” 또는 “개가 아님”)로 분류하는 것입니다.
다중 클래스 분류이미지 분류의 더 복잡한 형태로, 목표는 이미지를 여러 클래스 중 하나로 분류하는 것입니다. 예를 들어, 개의 이미지는 골든 리트리버, 라브라도 리트리버, 또는 푸들로 분류될 수 있습니다.
다중 레이블 분류다중 클래스 분류와 유사하지만 더 유연하여, 하나의 이미지가 둘 이상의 클래스에 속할 수 있습니다. 예를 들어, 모자와 안경을 착용한 사람의 이미지는 사람, 모자, 안경으로 모두 레이블될 수 있습니다.
객체 검출이미지 분류보다 더 복잡한 작업으로, 이미지 속 객체를 분류하는 것뿐 아니라 그 객체가 이미지의 어느 위치에 있는지도 찾아내는 것을 목표로 합니다.
세그멘테이션이것 역시 이미지 분류보다 더 복잡한 작업으로, 목표는 이미지 속 객체를 분류하는 것뿐 아니라 이미지 내에서 해당 객체를 분할하는 것입니다. 이는 의료 영상처럼 이미지 안에서 특정 구조를 찾아 정확히 분할해야 하는 작업에 유용합니다.
이미지 분류의 주요 유형들 중 일부입니다. 구체적인 과제와 사용 가능한 데이터의 종류에 따라 더 적합한 모델이 달라질 수 있습니다.
이미지 분류는 지도 학습일까, 비지도 학습일까?
이미지를 분류하는 방법은 매우 다양합니다. 그중 하나는 지도 학습이는 사람이 직접 범주화하고 라벨을 붙인 이미지를 활용하는 방식입니다. 그런 다음 머신러닝 시스템은 이러한 라벨을 사용해 이미지를 식별하고, 해당 이미지가 어떤 범주에 속하는지 판별합니다.
예를 들어, 친구들의 반려견 사진 수천 장에 “개”로 라벨을 붙이고, 같은 수의 사진을 “개 아님”(고양이, 새, 나무 등)으로 라벨링할 수 있습니다. 하지만 이 방식은 누군가가 모든 사진에 일일이 라벨을 달아야 하므로 시간이 많이 들고 비용도 많이 듭니다. 또한 “개”처럼 구체적인 범주에는 적용할 수 있지만, “포유류”처럼 더 일반적인 범주에는 적용하기 어렵습니다.
이미지 분류의 또 다른 접근 방식은 비지도 학습이는 컴퓨터가 스스로 패턴을 인식하도록 학습시키는 방법입니다. 비지도 방식은 라벨이 있는 이미지에 전혀 의존하지 않습니다. 대신, 대규모의 라벨 없는 이미지 데이터를 사용합니다.
비지도 이미지 분류의 한 가지 예는 클러스터링, 유사한 이미지를 서로 묶는 것이 과제인 경우입니다. 알고리즘은 색상 히스토그램이나 에지 검출 같은 이미지 특징을 추출하도록 학습한 뒤, 이러한 특징을 활용해 유사한 이미지들을 그룹화할 수 있습니다. 이미지가 그룹화된 후에는 분석가가 각 그룹을 검토하고 이미지의 내용에 따라 라벨을 부여할 수 있습니다.
비지도 학습을 사용한 이미지 분류는 명시적인 라벨을 활용하는 지도 학습과 달리 데이터에서 패턴을 스스로 발견하는 방식에 의존하므로, 일반적으로 정확도와 견고성이 더 낮다는 점을 기억하세요.
이미지 분류는 어떤 절차로 이루어지나요?
데이터 수집: 지도 학습의 경우 라벨이 있는 이미지 데이터셋을, 비지도 학습의 경우 라벨이 없는 이미지 데이터셋을 수집합니다. 예를 들어 수천 장의 동물 이미지를 모으고, 각 이미지를 동물의 종으로 라벨링하거나 아예 라벨 없이 수집할 수 있습니다.
데이터 전처리: 데이터 분석 과정에서 매우 중요한 단계입니다. 이 단계에는 데이터 정제, 데이터 변환, 유용한 정보 추출, 그리고 이후 분석을 위해 데이터를 활용 가능하게 만드는 작업이 포함됩니다. 이미지 분류의 경우, 이미지 크기 조정, 그레이스케일 변환, 픽셀 값 정규화 등이 여기에 해당할 수 있습니다.
특징 추출: 이는 데이터셋에서 관련 있는 정보를 추출하는 과정을 말합니다. 이렇게 추출된 정보를 특징이라고 하며, 보통 분류, 예측, 군집화의 기반으로 사용됩니다. 이미지에 컨볼루션을 적용하거나 방향성 기울기 히스토그램(HOG)과 같은 기법을 활용하는 것이 이에 해당될 수 있습니다.
모델 학습: 이는 알려진 예시(데이터 포인트) 목록으로 머신러닝 알고리즘을 학습시키는 과정을 말합니다. 알고리즘이 라벨이 달린 데이터셋에서 반복적으로 학습한 뒤, 그 지식을 활용해 이전에 보지 못한 새로운 데이터의 올바른 라벨을 예측하는 절차입니다. 여기에는 심층 신경망이나 서포트 벡터 머신과 같은 지도 학습 알고리즘을 사용할 수 있습니다.
모델 평가: 이는 머신러닝 파이프라인에서 모델의 성능을 측정하는 단계입니다. 학습에 사용되지 않은 테스트 이미지 집합에서 모델의 성능을 평가합니다. 정확도, 정밀도, 재현율과 같은 지표를 사용할 수 있습니다.
배포: 이는 머신러닝 파이프라인의 최종 단계로, 학습된 모델을 실제 운영 환경에 배치하는 과정입니다. 이 환경에서 모델은 새로운 실시간 데이터로 지속적으로 학습되고, 실제 데이터에 대해 예측을 지속적으로 수행합니다.
이미지 분류에 가장 적합한 모델은 무엇인가요?
이미지 분류에 가장 “적합한” 모델은 수행하려는 특정 작업과 사용 중인 데이터셋에 따라 달라집니다. 모델마다 강점과 약점이 다르므로, 해당 작업에 잘 맞는 모델을 선택하는 것이 중요합니다.
최근 몇 년간 합성곱 신경망(CNN) 이미지 분류 작업에서 표준으로 자리 잡았습니다. 합성곱 또는 심층 신경망은 우리의 뇌 신경생물학적 경로에서 영감을 받은, 서로 연결된 뉴런의 층으로 구성됩니다.
이들은 패턴을 감지하는 능력으로 잘 알려져 있어, “고양이”, “개”, “햄버거”처럼 입력 범주를 구분하도록 학습하는 분류기(클래스 분류 시스템)를 구축하는 데 이상적입니다.
이들은 과거의 경험으로부터 일반화하는 데에도 능숙합니다. 각 범주에서 몇 가지 예시만으로도 학습할 수 있으며, 이후에는 스스로 그 범주들의 새로운 사례(심지어 새로운 범주까지도)를 식별해 낼 수 있습니다.

그렇다고 해서 Vision Transformer가 이미지 분류에서 널리 사용되는 또 하나의 대표 모델이라는 사실이 달라지지는 않습니다. Vision Transformer 아키텍처의 핵심 혁신은 다음을 활용한다는 점입니다. 자기어텐션 메커니즘 이미지 데이터를 처리하기 위해서
전통적인 합성곱 신경망(CNN)에서는 이미지를 여러 개의 합성곱 및 풀링 층을 통해 처리하여, 서로 다른 스케일과 위치에서 특징을 추출합니다. 그러나 Vision 트랜스포머먼저 이미지를 서로 겹치지 않는 패치로 나눈 뒤, 자기어텐션 메커니즘을 사용해 이러한 패치들 간의 관계를 계산합니다.

결국 뛰어나고 효과적인 이미지 분류 모델은 매우 많습니다. 그렇다고 해서 항상 한 가지가 정답인 것은 아닙니다. 이미지 분류에서 가장 좋은 모델은 여러분의 데이터셋과 과제에서 가장 높은 정확도를 내는 모델입니다. 다양한 모델을 시도해 보고, 적절한 평가 지표를 사용해 성능을 비교하는 것이 중요합니다.
이미지 분류에 왜 CNN을 사용할까?

CNN의 활용 분야는 매우 넓으며, 이 기술은 너무나 다양한 방식으로 쓰이고 있어서, 애초에 이미지 분류를 위해 고안된 것이라는 사실이 의외일 수 있습니다. 예를 들어, CNN에 강아지 사진을 보여주면, 그것이 강아지 이미지라는 것을 알아낼 수 있습니다.
이런 기능이 일부 응용 분야에서 얼마나 유용할지 쉽게 떠올릴 수 있습니다. 예를 들어, 자율주행 자동차가 도로 위의 다른 차량뿐 아니라 교통 표지판도 인식해 상황에 맞게 대응하도록 돕는 데 활용될 수 있습니다.
CNN이 왜 합성곱 신경망이라고 불릴까? 계층은 처리 “노드”로 구성되며, 각 노드는 이전 단계로부터 받은 정보를 특정 방식으로 변환합니다. 각 노드가 자신의 입력을 어떻게 변환할지 알기 위해, 합성곱(convolution)이라고 불리는 과정을 통해 이웃한 노드들의 출력을 참조합니다. 이는 본질적으로 모델이 집중해야 할 부분을 강조하는 필터를 만들어 내는 것입니다.
CNN은 합성곱 계층과 풀링 계층을 연속적으로 적용해, 서로 다른 스케일과 위치에서 특징을 추출합니다. 합성곱 계층은 작은 커널(“필터”라고도 함)로 이미지를 스캔하면서 이미지의 모든 부분에 동일한 변환을 적용합니다. 풀링 계층은 인접한 픽셀들의 집합에서 최대값 또는 평균값을 선택해 공간 해상도를 줄이는데, 이를 다운샘플링이라고 합니다. 이를 통해 CNN은 이미지 내에서 위치와 무관하게 패턴을 인식할 수 있고, 계산 비용도 줄일 수 있습니다.
CNN에서는 문제가 복잡해질수록 그 문제를 해결하는 데 필요한 특징의 수에 맞추기 위해 더 많은 신경망 계층이 필요합니다. 이미지 형성은 현실 세계의 빛을 하나 또는 여러 개의 렌즈를 통해 포착해 데이터를로 변환하는 것에서 시작됩니다.
이 경우 이미지 파일의 각 픽셀은 CNN의 뉴런과 같습니다. 이미지 인식용 CNN의 첫 번째 계층의 뉴런은 이미지의 작은 한 구역에 있는 모든 픽셀을 살펴봅니다. 각 픽셀은 서로 다른 값을 가지며, 이 값들은 무작위로 할당될 수도 있고, 빨강이나 파랑의 양, 객체가 관찰자와 얼마나 떨어져 있는지 등의 기준에 따라 정해질 수도 있습니다.
이미지 분류에 가장 적합한 CNN은 무엇일까?
이미지 분류용 CNN을 선택할 때는 데이터셋의 크기, 모델이 필요한 속도, 기대하는 정확도 등 여러 요소를 고려해야 합니다. 이 글에서는 널리 쓰이는 CNN 아키텍처와 그 특성을 살펴보겠습니다.
이러한 아키텍처의 예로는 AlexNet, GoogleNet, GoogLeNet, VGGNet, ResNet, Inception v3 등이 있습니다. 이들 모델은 정확도와 속도를 위해 최적화되어 있습니다.
AlexNet
AlexNet 은 가장 널리 알려진 CNN 아키텍처 중 하나로, ImageNet 벤치마크에서 테스트 오류 1%를 달성한 최초의 합성곱 신경망(CNN)으로 많은 이들이 평가합니다. ImageNet 은 컴퓨터 비전과 이미지 처리 연구를 위해 특별히 개발된, 약 1,000개 클래스에 속하는 약 100만 장의 라벨링된 이미지를 담은 데이터베이스입니다. 이 데이터베이스는 수년간 새로운 아키텍처의 기준점으로 활용되었고, 그 정확도를 개선하는 여러 다양한 모델의 개발로 이어지기도 했습니다.
ResNet
요컨대, ResNet 은 ImageNet에서 분류 정확도를 높이기 위해 설계된 합성곱 신경망(CNN) 계열입니다. ResNet 아키텍처는 입력으로부터 점진적으로 더 많은 정보를 추출하기 위해 다수의 층을 사용합니다. 이 아키텍처는 크게 잔차 블록과 합성곱 블록, 두 부분으로 구성됩니다. 두 부분 모두 여러 층으로 이루어져 있지만, 각 부분은 서로 다른 기능을 수행하며, 이들을 결합하면 어느 한 부분만 사용할 때보다 더 나은 결과를 얻을 수 있습니다.
ResNet CNN의 각 층은 2차원 이미지를 고정 차원의 특징 표현인 특징 맵으로 변환합니���. 각 특징 맵의 차원 수는 해당 층의 뉴런 수의 대략 절반 정도입니다. 이는 2차원 합성곱을 수행한 뒤 이를 1차원으로 평탄화하는 단순한 방식으로 이루어집니다.
SVM 이미지 분류란 무엇인가?
SVM은 다음을 의미합니다 서포트 벡터 머신은 이미지 분류를 위한 머신러닝 알고리즘으로, 이미지를 서로 다른 범주로 분류하고 각 이미지가 어떤 범주에 속하는지 높은 정확도로 예측할 수 있습니다.

이 알고리즘은 데이터 포인트를 더 높은 차원의 공간으로 사상하여, 원래의 낮은 차원 공간에서보다 더 복잡한 예측을 가능하게 합니다. 이러한 사상은 SVM 알고리즘이 내린 예측과 각 데이터 포인트의 실제 클래스 간의 차이를 최소화하는 최적화 과정을 통해 수행됩니다.
이 최적화의 목적은 모든 예제를 각자의 클래스에 가장 잘 구분하거나 분류하는 분리 초평면을 선택하는 것입니다. 더 높은 차원 공간에서는 분리 초평면이 여러 개 존재할 수 있으므로, 어떤 초평면은 특정 예제를 그들의 클래스와 분리하고, 또 다른 초평면은 다른 예제를 그들의 클래스와 분리할 수 있습니다.
단일 초평면으로 모든 점을 올바른 클래스와 분리할 수 없다면, 어떤 초평면으로도 모두를 정확히 분리할 수 없습니다. SVM 알고리즘은 두 클래스 사이의 마진이 최대가 되는 위치를 찾아 그 분리 초평면을 선택합니다.

SVM 모델에서 결정 경계는 w · x + b = 0이라는 방정식으로 정의되며, 여기서 w는 가중치 벡터, x는 입력 데이터, b는 바이어스 항입니다. 이 경계는 데이터를 두 영역으로 분리하며, 관례적으로 클래스 +1은 경계의 한쪽에, 클래스 -1은 다른 쪽에 위치합니다.
PyTorch를 사용한 이미지 분류 예제
아래에는 이미지를 분류하는 머신러닝 모델의 간단한 예제가 있습니다. PyTorch아래 코드는 수정하여 가능한 한 많은 클래스를 분류하는 데 사용할 수 있으며, 예를 들어 새, 자동차, 비행기, 동물 이미지를 포함한 데이터셋의 이미지를 분류하는 데 활용할 수 있습니다.
1단계: torch를 포함한 필요한 라이브러리를 가져옵니다. torchvision 라이브러리
import torchimport torchvision
2단계: torchvision 모델 정의하기
이 단계에서는 위에서 언급한 사전 학습된 ResNet18 모델을 torchvision 모델 저장소에서 불러옵니다.
model = torchvision.models.resnet18(pretrained=True)
3단계: 정의하기 손실 함수 그리고 옵티마이저 모델을 위해
criterion = torch.nn.CrossEntropyLoss()optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
4단계: 데이터 불러오기
데이터셋의 경로를 data_dir 변수의 경로로 설정하세요.
참고로 CIFAR-100 데이터셋도 사용할 수 있지만, 학습에 훨씬 더 오랜 시간이 걸립니다.
data_dir = "path/to/your/data"train_dataset = torchvision.datasets.ImageFolder( root=data_dir, transform=torchvision.transforms.ToTensor())train_loader = torch.utils.data.DataLoader(train_dataset,batch_size=64,shuffle=True,num_workers=4)
5단계: 모델을 10에포크 동안 학습하기
그다음 스크립트는 지정된 횟수(10)만큼 에포크 루프에 들어갑니다. 각 에포크마다 train_loader의 데이터를 순회하며, 각 배치의 이미지를 모델에 입력해 출력을 생성합니다.
for epoch in range(10):for images, labels in train_loader:optimizer.zero_grad()output = model(images)loss = criterion(output, labels)loss.backward()optimizer.step()print("Epoch: {} Loss: {:.4f}".format(epoch, loss.item()))
결론
요약하면, 이미지 분류와 컴퓨터 비전은 인공지능과 컴퓨터 과학에서 핵심 연구 분야입니다. 자율주행차, 의료 영상, 보안 시스템 등 매우 다양한 분야에 응용됩니다.
최근 몇 년간 딥러닝의 발전과 대규모 데이터의 활용 가능성 덕분에 이 분야는 크게 발전했습니다. 그러나 여전히 해결해야 할 과제가 남아 있습니다. 예를 들어, 조명과 시점 변화에 대한 모델의 견고성을 높이고, 실시간 애플리케이션을 위해 알고리즘의 효율성을 향상시키는 문제가 있습니다.
이미지 분류와 컴퓨터 비전 분야의 지속적인 연구와 개발은 여러 분야에서 우리가 주변 세계와 상호작용하는 방식에 큰 변화를 가져올 것입니다.
Add a comment