플라노그램(Planogram)은 매장 내 제품 배치를 시각적으로 표현한 도식입니다. 이 도식은 특정 상품이 매장 선반에서 어떻게 진열되고 배치되어야 하는지를 명확히 보여줍니다. 주로 소매업체와 벤더가 협력하여 판매 최적화를 위해 사용하며, 매출 증대와 고객 경험 개선을 목적으로 합니다. 플라노그램은 제품의 위치, 수량, 진열 방향 등을 포함하여 매장 레이아웃을 체계적으로 구성하는 데 핵심적인 도구입니다.
소매점에서 플라노그램을 사용하면 비즈니스 요구사항에 따라 매장 레이아웃의 모든 세부 사항을 정확히 반영할 수 있습니다. 이를 통해 벤더 계약 준수 여부를 확인하고, 가격 변경의 효과, 제품 제안 효과 등을 평가할 수 있습니다.
특히, 컴퓨터 비전 기술을 활용하면 소매업체와 벤더는 동적이고 확장 가능한 플라노그램을 자동으로 생성할 수 있습니다. 이렇게 생성된 플라노그램은 제품이 소매 선반에 올바르게 진열되었는지 확인할 뿐만 아니라, 실시간으로 매장의 진열 상태를 관리하고 최적화하는 데 도움을 줍니다.
이 가이드에서는 음료 자판기 이미지를 예시로 사용하여 작동 가능한 소매 플라노그램을 구현하는 방법을 안내합니다. 구체적으로, 컴퓨터 비전 모델을 구축하는 방법과 Roboflow를 이용한 간단한 워크플로우를 소개합니다. 이를 통해 다음과 같은 플라노그램 핵심 데이터를 확보할 수 있습니다:
- 각 제품의 가격
- 선반마다 배치된 음료의 수량
- 이미지에서 확인할 수 있는 할인 및 프로모션 정보
이 모든 과정은 플라노그램의 효율적 관리를 통해 매출 증대와 고객 경험을 개선하기 위한 기반을 마련하는 데 초점을 맞추고 있습니다.
이 가이드를 마치면 판매를 극대화하고 고객 경험을 향상시키는 데 도움이 되는 동적 플라노그램을 생성할 수 있게 될 것입니다.
성공적인 플라노그램 구축을 위한 단계
구체적인 구현 과정을 다음 단계에 따라 진행합니다:
- SKU(재고 관리 단위) 탐지를 위한 모델 학습
- 각 제품의 SKU를 식별할 수 있는 컴퓨터 비전 모델을 훈련시킵니다. 이를 통해 제품별 위치, 수량, 정보를 자동으로 추출할 수 있습니다.
- SKU를 탐지하는 워크플로우 생성
- 훈련된 모델을 활용해 SKU를 탐지하는 워크플로우를 만듭니다. 이 단계는 실시간 데이터 처리와 자동화를 위한 기반을 다집니다.
- SKU 위치를 Google Sheets에 업로드하는 스크립트 작성
- SKU의 위치 데이터를 Google Sheets로 업로드하는 스크립트를 작성합니다. 이를 통해 플라노그램 데이터를 쉽게 공유하고 관리할 수 있습니다.
이 가이드는 위 단계를 하나씩 설명하며 동적 플라노그램을 구축하는 과정을 안내할 것입니다. 이 과정은 제품 배치 최적화와 운영 효율성 향상에 크게 기여할 것입니다.
1단계: Roboflow 계정 생성 및 프로젝트 설정
- Roboflow 계정 생성
- Roboflow 공식 웹사이트에 접속하여 ‘Sign Up’ 버튼을 클릭합니다.
- 이메일, 구글 계정, 깃허브 계정 중 하나를 선택하여 회원가입을 진행합니다.
- 워크스페이스 생성
- 로그인 후, 워크스페이스 이름을 지정하고 요금제를 선택합니다.
- Starter Trial: 2주간 유료 버전을 체험할 수 있습니다.
- Public Plan: 일부 기능이 제한되며, 데이터셋이 공개됩니다.
- 팀원이 있다면 초대할 수 있으며, 없을 경우 ‘Skip’ 버튼을 눌러 넘어갑니다.
- 로그인 후, 워크스페이스 이름을 지정하고 요금제를 선택합니다.
- 프로젝트 생성
- ‘Create New Project’ 버튼을 클릭하여 새 프로젝트를 생성합니다.
- 프로젝트 이름과 감지할 객체의 그룹을 지정하고, 프로젝트 타입으로 ‘Object Detection’을 선택합니다.
2단계: 이미지 업로드 및 주석 달기
- 이미지 업로드
- 생성된 프로젝트에서 라벨링할 이미지를 업로드합니다.
- 이미지를 드래그 앤 드롭하거나 파일 선택을 통해 업로드한 후, ‘Save and Continue’ 버튼을 클릭합니다.
- 주석 달기(Annotation)
- ‘Assign Images’를 클릭한 후, ‘Start Annotating’ 버튼을 눌러 주석 달기를 시작합니다.
- 도구를 활용하여 각 객체에 바운딩 박스를 그린 후, 해당 객체의 라벨을 입력합니다.
- Bounding Box Tool(B): 사각형 박스를 그릴 때 사용합니다.
- Polygon Tool(P): 다각형 형태로 영역을 지정할 때 사용합니다.
- 모든 이미지에 대한 주석 달기를 완료한 후, ‘Save’ 버튼을 눌러 저장합니다.
3단계: 데이터셋 분할 및 전처리
- 데이터셋 분할
- 업로드한 이미지를 학습(Training), 검증(Validation), 테스트(Test) 세트로 분할합니다.
- 일반적으로 학습:검증:테스트의 비율을 8:1:1로 설정합니다.
- 전처리 및 증강(Augmentation)
- 이미지 크기 조정, 회전, 색상 변화 등 다양한 전처리 및 증강 기법을 적용하여 모델의 일반화 성능을 향상시킵니다.
- Roboflow에서는 이러한 작업을 손쉽게 수행할 수 있는 도구를 제공합니다.
4단계: 모델 학습 및 배포
- 모델 학습
- 전처리된 데이터셋을 활용하여 객체 감지 모델을 학습시킵니다.
- Roboflow는 자체적인 모델 학습 기능을 제공하며, 필요에 따라 외부 플랫폼과 연동하여 학습을 진행할 수 있습니다.
- 모델 배포
- 학습된 모델을 배포하여 실제 환경에서 SKU 탐지를 수행합니다.
- Roboflow는 REST API를 통해 모델을 쉽게 배포하고 통합할 수 있는 기능을 제공합니다.
이러한 단계를 통해 SKU 탐지를 위한 객체 감지 모델을 구축하고, 이를 활용하여 동적 플라노그램을 생성함으로써 판매를 극대화하고 고객 경험을 향상시킬 수 있습니다.
워크플로우 생성하기
Roboflow Workflows는 웹 기반의 대화형 컴퓨터 비전 애플리케이션 빌더입니다. Workflows를 사용하면 여러 단계를 포함하는 컴퓨터 비전 애플리케이션을 정의할 수 있으며, 이를 클라우드나 로컬 하드웨어에서 실행할 수 있습니다.
Workflows는 또한 GPT-4o와 같은 외부 비전 API를 호출할 수 있으며, 이 기능을 이번 애플리케이션에서 활용할 것입니다.
Roboflow Workflows는 컴퓨터 비전 애플리케이션을 손쉽게 설계, 구성, 실행할 수 있도록 도와주는 웹 기반 도구입니다. 일반적으로 컴퓨터 비전 애플리케이션은 데이터 준비, 모델 학습, 결과 배포와 같은 여러 단계를 포함하며, 각각의 단계가 정교하게 연결되어야 효과적으로 작동합니다. Roboflow Workflows는 이러한 복잡한 작업을 단순화하여 개발자와 사용자가 직관적으로 워크플로우를 설계할 수 있도록 지원합니다.
주요 기능 및 설명
- 웹 기반 인터페이스
- 설치가 필요 없으며, 웹 브라우저만 있으면 어디서든 접근 가능합니다.
- 시각적이고 대화형인 UI를 제공하여 복잡한 작업도 쉽게 설정할 수 있습니다.
- 다단계 워크플로우 정의
- 데이터를 업로드하고 전처리하는 단계부터, 모델 학습, 예측, 그리고 결과를 사용하는 단계를 체계적으로 연결할 수 있습니다.
- 각 단계는 사용자가 정의할 수 있으며, 비전 애플리케이션의 다양한 요구사항을 충족할 수 있도록 설계되었습니다.
- 클라우드 및 로컬 하드웨어 실행
- 클라우드에서 실행하여 강력한 컴퓨팅 리소스를 활용하거나, 자체 하드웨어에서 실행하여 비용을 절감하고 데이터 보안을 강화할 수 있습니다.
- 유연한 실행 옵션은 사용자의 환경과 요구에 따라 최적화된 선택을 제공합니다.
- 외부 API 통합
- GPT-4o와 같은 외부 비전 API와 통합할 수 있어, 복잡한 기능을 간단하게 구현할 수 있습니다.
- 이러한 통합은 AI 모델을 활용하여 더욱 고도화된 분석을 가능하게 합니다.
Roboflow Workflows의 활용 예
Roboflow Workflows를 통해 사용자는 다음과 같은 작업을 수행할 수 있습니다:
- 이미지를 자동으로 분류하거나 탐지하는 작업
- 특정 조건에 따라 데이터를 필터링하거나 결과를 가공하는 작업
- 결과를 외부 데이터베이스에 저장하거나, API를 통해 다른 애플리케이션에 전달
이러한 기능은 특히 소매 플라노그램 생성과 같은 컴퓨터 비전 프로젝트에서 매우 유용합니다. 사용자는 데이터 준비부터 결과 배포까지의 모든 단계를 통합적으로 관리할 수 있어, 작업 효율성과 생산성을 크게 향상시킬 수 있습니다.
튜토리얼이 끝나면 우리의 워크플로우는 다음과 같은 작업을 수행할 수 있게 됩니다:
- 행별로 음료 탐지
- 각 음료의 가격 탐지
- 페이지에 표시된 할인 정보 탐지
전체 워크플로우는 다음과 같은 구조를 가질 것입니다.
이 워크플로우는 음료 자판기 이미지에서 데이터를 추출하여 플라노그램 생성을 자동화하기 위한 설계입니다. 각 단계의 역할과 흐름은 다음과 같습니다:
1. Input (image)
- 역할: 입력 이미지를 제공하는 단계입니다.
- 내용: 자판기 이미지를 입력으로 받아 이후 단계에서 처리될 데이터를 준비합니다.
2. Object Detection Model
- 역할: 입력된 이미지에서 음료(제품)를 탐지하는 객체 감지 모델.
- 내용:
detection_model
은 음료 자판기용으로 학습된 모델을 사용하여 이미지의 제품(SKU)을 식별합니다.- 음료의 위치 및 개수를 감지하여 데이터를 다음 단계로 전달합니다.
3. Detections Filter
- 역할: 감지된 데이터를 필터링하여 필요한 정보만 추출합니다.
- 내용:
- 불필요한 데이터를 제거하고, 관심 있는 SKU(특정 음료나 상품)에 집중합니다.
- 예: 특정 음료 유형만 추출하거나, 조건에 맞는 데이터를 선별.
4. Dynamic Crop
- 역할: 이미지의 특정 영역을 동적으로 잘라냅니다.
- 내용:
- 필터링된 데이터에서 필요한 부분만 잘라내어 초점이 맞춰진 이미지를 생성합니다.
- 예: 특정 음료 라벨이나 가격 부분만 추출.
5. OpenAI (GPT-4o)
- 역할: 분석된 데이터를 기반으로 추가 처리를 수행.
- 내용:
- 잘라낸 이미지 데이터를 텍스트로 변환하거나, 추가적인 AI 분석을 통해 음료 유형, 가격, 할인 정보를 추출합니다.
6. Response
- 역할: 최종 결과를 출력.
- 내용:
- Type of Drink: 탐지된 음료의 종류.
- Deals: 할인이나 프로모션 정보.
- Output: 최종 결과 데이터.
전체 흐름
- 입력된 자판기 이미지는 객체 감지 모델을 통해 분석됩니다.
- 감지된 객체는 필터링과 크롭 과정을 거쳐 관심 있는 정보를 정리합니다.
- OpenAI API를 통해 세부 정보(음료명, 가격, 프로모션)를 처리 및 생성합니다.
- 최종적으로 사용자가 원하는 정보(음료 종류, 할인 정보)가 출력됩니다.
이 워크플로우는 음료 자판기의 이미지 데이터를 효과적으로 처리하여 플라노그램 생성을 돕는 유용한 프로세스를 보여줍니다.
시작하려면 Roboflow 애플리케이션의 Workflows로 이동합니다.
그런 다음, “Create Workflow”를 클릭합니다.
다음으로, **”Custom Workflow”**를 선택하고 “Create” 버튼을 클릭합니다.
그 후, “Add Block”으로 이동하여 “Object Detection”을 검색합니다.
마지막으로, Object Detection 블록을 추가합니다.
이제 사용할 특정 객체 감지 모델을 선택해야 합니다. 이를 위해 “Model” 버튼을 클릭합니다.
필요한 객체 감지 모델을 선택합니다. 해당 모델을 찾아 클릭하여 설정합니다.
다음으로 OpenAI 블록을 추가합니다. 이 블록과 프롬프트 엔지니어링을 활용하여 병(또는 음료수)을 감지할 수 있습니다.
블록을 추가한 후, **API 키(api_key)**와 **프롬프트(prompt)**를 입력합니다. 아래는 행별 탐지를 위한 샘플 프롬프트입니다:
샘플 프롬프트:
Understand that you need to output only a dictionary. In the photo, there will be Sprite, A&W, Diet Coke, Coke, or any other drink. You must output all of the drinks in the photo, but also output them in order as lists from left to right for each row. For example, if row one had Coke, Sprite, and Pepsi, you would output row_1=['Coke', 'Sprite', 'Pepsi']. However, if there are empty drinks in a row, make sure to put 'None' in that space. Add every single row list into a dictionary. Overall, the output should be a dictionary full of rows. In these rows, there are lists that contain the drinks in the row from left to right.
이 프롬프트가 하는 역할
- 목적 정의: 이미지를 분석하여 음료수를 감지하고, 행별로 정리된 데이터를 딕셔너리로 출력.
- 출력 형식:
- 각 행을 리스트로 출력.
- 리스트에는 왼쪽에서 오른쪽 순서대로 음료 이름이 포함되며, 빈 자리는
'None'
으로 표시.
- 결과 예시:
{ "row_1": ["Coke", "Sprite", "Pepsi"], "row_2": ["Diet Coke", "None", "A&W"] }
이 프롬프트를 OpenAI 블록에 입력하면, 모델이 이미지를 분석하여 필요한 데이터를 추출합니다.
워크플로우의 현재 상태
현재까지 설정한 워크플로우는 다음과 같은 단계로 구성됩니다:
- Input (이미지 입력)
- Object Detection (음료 감지)
- OpenAI 블록 (행별 음료 탐지)
다음 단계: 가격 탐지를 위한 OpenAI 블록 추가
- 새 OpenAI 블록 추가:
- 음료의 가격을 감지하기 위해 또 다른 OpenAI 블록을 추가합니다.
- 가격 탐지용 프롬프트 설정:
아래 프롬프트를 OpenAI 블록에 입력합니다:For each row and column, get the price of the item. The questions you should be asking are: What is the price of the item? What item does this correlate to? Give me an output similar to ['Redbull', $4.49]. Do not output any other text than the item and price. Make sure to output it in the list format. Do NOT include the deal prices. We assume we are buying one drink at a time. Also make sure to not repeat the same brand of drink. Thanks!
프롬프트 설명:- 각 행과 열에 있는 음료의 가격을 탐지합니다.
- 결과는 리스트 형식으로 반환됩니다. 예시:
['Redbull', $4.49]
. - 할인 가격은 포함하지 않고, 동일 브랜드의 음료는 한 번만 표시하도록 설정.
필터 블록 추가
- 필터 블록 생성:
- 모델의 결과를 특정 클래스(예: “할인 정보” 또는 “Deals”)로 필터링하기 위해 필터 블록을 추가합니다.
- 필터 조건 설정:
- 필터링할 클래스명을 설정합니다. 예를 들어, “Deals” 클래스에 대해 필터링하려면 해당 이름을 지정합니다.
최종 워크플로우 상태
- 워크플로우는 음료 탐지와 가격 감지뿐만 아니라, 특정 조건(예: 할인 정보)으로 필터링하는 기능을 포함하게 됩니다.
- 이렇게 설계된 워크플로우는 더 정확하고 세부적인 데이터를 제공하여 동적 플라노그램 생성을 지원합니다.
마지막 단계: 출력 단계 연결하기
- 출력 블록 연결
- 워크플로우에서 출력 데이터를 생성하려면, 각각의 OpenAI 블록 및 필터 블록의 결과를 Response 블록에 연결해야 합니다.
- 이를 통해 최종적으로 음료 종류, 가격, 할인 정보 등의 데이터를 구조화된 형식으로 출력할 수 있습니다.
- 블록 연결 방법
- 각 블록을 클릭하여 출력(Output) 옵션을 활성화합니다.
- 출력 데이터가 다음 단계로 전달되도록 필요한 블록 간의 연결선을 만듭니다.
- 예를 들어:
- Object Detection → OpenAI 블록: 행별 음료 탐지 결과를 전달.
- OpenAI 블록(음료 탐지) → OpenAI 블록(가격 탐지): 탐지된 음료 데이터를 바탕으로 가격을 추출.
- OpenAI 블록 및 필터 블록 → Response 블록: 최종 데이터를 사용자에게 출력.
- 마무리 확인
- 모든 블록 간 연결이 올바르게 되었는지 확인합니다.
- 각 블록의 설정과 출력 결과가 기대한 대로 작동하는지 테스트합니다.
최종 워크플로우
최종 워크플로우는 다음과 같이 구성됩니다:
- 입력 이미지 처리: Object Detection 블록을 통해 음료 탐지.
- 프롬프트 기반 데이터 추출: OpenAI 블록에서 행별 음료 탐지 및 가격 정보 추출.
- 필터링 및 추가 처리: 필터 블록으로 필요한 데이터만 추출.
- 구조화된 출력: Response 블록을 통해 음료 종류, 가격, 할인 정보 등의 데이터를 사용자에게 전달.
이 단계까지 완료하면, 워크플로우는 제공된 이미지를 분석하고, 음료와 관련된 모든 데이터를 체계적으로 추출 및 출력할 수 있습니다. 결과적으로 워크플로우는 설명된 이미지와 비슷한 구조를 갖게 됩니다.
워크플로우에서 사용된 3개의 OpenAI 블록 정리
1. 첫 번째 OpenAI 블록: 행별 음료 탐지
- 역할: 입력된 이미지에서 행(row)별로 음료를 탐지하고 정리.
- 프롬프트 내용:
Understand that you need to output only a dictionary. In the photo, there will be Sprite, A&W, Diet Coke, Coke, or any other drink. You must output all of the drinks in the photo, but also output them in order as lists from left to right for each row. For example, if row one had Coke, Sprite, and Pepsi, you would output row_1=['Coke', 'Sprite', 'Pepsi']. However, if there are empty drinks in a row, make sure to put 'None' in that space. Add every single row list into a dictionary. Overall, the output should be a dictionary full of rows. In these rows, there are lists that contain the drinks in the row from left to right.
- 출력 결과:
- 각 행을 리스트로 정리한 딕셔너리.
{ "row_1": ["Coke", "Sprite", "Pepsi"], "row_2": ["Diet Coke", "None", "A&W"] }
2. 두 번째 OpenAI 블록: 음료 가격 탐지
- 역할: 탐지된 음료 데이터를 기반으로 가격을 추출.
- 프롬프트 내용:
For each row and column, get the price of the item. The questions you should be asking are: What is the price of the item? What item does this correlate to? Give me an output similar to ['Redbull', $4.49]. Do not output any other text than the item and price. Make sure to output it in the list format. Do NOT include the deal prices. We assume we are buying one drink at a time. Also make sure to not repeat the same brand of drink. Thanks!
- 출력 결과:
- 음료와 해당 가격을 리스트로 정리.
[ ['Coke', $1.99], ['Sprite', $1.49], ['Pepsi', $1.89] ]
3. 세 번째 OpenAI 블록: 할인 정보(Deals) 탐지
- 역할: 이미지에서 할인(프로모션) 정보를 추출.
- 프롬프트 내용:
- 할인 정보를 탐지하며, 조건에 따라 필요한 데이터만 출력하도록 설정.
Detect all deals in the image. Output the deals in a list format. For example: ['Buy 1 Get 1 Free', '20% Off on Sprite'].
- 출력 결과:
- 이미지에 포함된 할인 정보 리스트.
[ "Buy 1 Get 1 Free", "20% Off on Sprite" ]
OpenAI 블록 간의 관계
- 첫 번째 블록(음료 탐지):
- 행별 음료 데이터를 정리하여 두 번째 블록(가격 탐지)에 제공.
- 두 번째 블록(가격 탐지):
- 음료 데이터와 매핑하여 가격 정보를 추출.
- 결과 데이터를 구조화하여 최종 출력 블록에 연결.
- 세 번째 블록(할인 탐지):
- 별도로 할인 정보만 탐지하여 최종 출력에 추가.
결과적으로, 3개의 OpenAI 블록은 협력하여 다음과 같은 데이터를 제공합니다:
- 음료의 종류
- 음료의 가격
- 할인 정보
이를 통해 이미지에서 유용한 정보를 체계적으로 추출하고 플라노그램 생성에 활용할 수 있습니다.