웹 인식 툴킷을 사용한 시각적 검색

사용하기 쉬운 실시간 상호작용

Joe Medley
Joe Medley
사용자가 카메라를 사용하여 사이트를 검색할 수 있다면 얼마나 좋을까요? 상상해 보세요. 고객님의 사이트는 Razor McShaveyface입니다. 고객이 재주문할 때 면도기에 맞는 카트리지를 찾는 데 어려움을 겪고 있다고 말합니다. 제품 검색에 적합한 키워드를 모릅니다. 솔직히 말해서 아마도 절대 해결되지 않을 것입니다.

절대 필요하지 않다면 어떻게 해야 할까요? 휴대전화 카메라를 제품 패키지의 UPC 코드에 가져가면 사이트에서 적절한 카트리지와 커다란 빨간색 '재주문' 버튼을 표시할 수 있다면 어떨까요?

사이트에서 카메라를 사용할 수 있는 다른 방법을 생각해 보세요. 매장 가격 확인을 지원하는 사이트를 예로 들어 보겠습니다. 박물관 전시물이나 역사적 기념물에 대한 정보를 얻는다고 가정해 보겠습니다. 숨겨진 보물 찾기나 보물 찾기 게임과 같은 게임에서 실제 랜드마크를 식별하는 것을 상상해 보세요.

웹 인식 도구 키트를 사용하면 이러한 카메라 기반 시나리오를 실행할 수 있습니다. 경우에 따라 코드를 작성하지 않고도 환경을 만들 수 있습니다.

기본 원리

오픈소스 Web Perception Toolkit을 사용하면 웹사이트에 시각적인 검색 기능을 추가할 수 있습니다. '타겟'이라고 하는 실제 객체를 사이트의 콘텐츠에 매핑하는 감지기 모음을 통해 기기 카메라 스트림을 전달합니다. 이 매핑은 사이트의 구조화된 데이터 (JSON-LD)를 사용하여 정의됩니다. 이 데이터를 사용하면 맞춤설정 가능한 UI에 적절한 정보를 표시할 수 있습니다.

작동 방식을 맛보기에 충분하도록 보여드리겠습니다. 자세한 설명은 시작하기 가이드, 툴킷 참조, I/O Sandbox 데모, 샘플 데모를 참고하세요.

구조화된 데이터

툴킷은 카메라 뷰에서 임의의 대상을 찾을 수 없습니다. 인식하려는 타겟의 연결된 JSON 데이터를 제공해야 합니다. 이 데이터에는 사용자에게 표시될 타겟에 관한 정보도 포함됩니다.

이 데이터만 있으면 아래 이미지와 같은 사용자 환경을 만들 수 있습니다. 아무것도 하지 않으면 웹 인식 도구 키트가 타겟을 식별한 후 데이터에 제공된 정보를 기반으로 카드를 표시하거나 숨길 수 있습니다. artifact-map 데모를 사용하여 직접 사용해 보세요.

연결된 데이터만 사용하여 기본 인터페이스를 사용할 수 있습니다.
기본 인터페이스입니다.

<script> 태그와 "application/ld+json" MIME 유형을 사용하여 포함된 JSON 연결 데이터 파일로 사이트에 데이터를 추가합니다.

<script type="application/ld+json" src="//path/to/your/sitemap.jsonld">

파일 자체는 다음과 같이 표시됩니다.

[
  {
    "@context": "https://schema.googleapis.com/",
    "@type": "ARArtifact",
    "arTarget": {
      "@type": "Barcode",
      "text": "012345678912"
    },
    "arContent": {
      "@type": "WebPage",
      "url": "http://localhost:8080/demo/artifact-map/products/product1.html",
      "name": "Product 1",
      "description": "This is a product with a barcode",
      "image": "http://localhost:8080/demo/artifact-map/products/product1.png"
    }
  }
]

사용자 경험

기본 사용자 환경보다 더 많은 기능을 원한다면 어떻게 해야 하나요? 툴킷을 사용하면 수명 주기 이벤트, 이러한 이벤트를 중심으로 사용자 환경을 만드는 카드 및 버튼 객체, 카드 스타일을 지정하는 간단한 방법을 사용할 수 있습니다. 시작하기 가이드를 기반으로 한 코드를 사용하여 이를 간단히 보여드리겠습니다.

가장 중요한 수명 주기 이벤트는 타겟이 발견될 때마다 실행되는 PerceivedResults입니다. 타겟은 실제 물체이거나 바코드나 QR 코드와 같은 마커일 수 있습니다.

이 이벤트에 응답하는 프로세스는 이미 언급된 예외가 있는 다른 이벤트와 동일합니다. 이벤트를 구현하지 않으면 구조화된 데이터를 사용하여 사용자 인터페이스가 자동으로 생성됩니다. 이 동작을 재정의하려면 event.preventDefault()를 호출하여 이벤트 핸들러를 시작하세요.

const container = document.querySelector('.container');
async function onPerceivedResults(event) {
  // preventDefault() to stop default result Card from showing.
  event.preventDefault();
  // Process the event.
}
window.addEventListener(PerceptionToolkit.Events.PerceivedResults, onPerceivedResults);

이 사건에 대해 좀 더 자세히 살펴보겠습니다. 이벤트 자체에는 찾은 마커와 찾지 못한 마커의 배열이 포함됩니다. 씬에서 타겟이 발견되면 이벤트가 실행되고 event.found에서 발견된 객체를 전달합니다. 마찬가지로 대상이 카메라 화면에서 지나갈 때 이벤트가 다시 실행되어 event.lost에서 손실된 객체를 전달합니다. 이렇게 하면 손과 마커의 움직임을 고려할 수 있습니다. 카메라를 충분히 안정적으로 들지 못하거나 마커를 떨어뜨리는 등의 상황입니다.

async function onPerceivedResults(event) {
  // preventDefault() to stop default result Card from showing
  event.preventDefault();
  if (container.childNodes.length > 0) { return; }
  const { found, lost } = event.detail;
  // Deal with lost and found objects.
}

그런 다음 툴킷에서 찾은 내용에 따라 적절한 카드를 표시합니다.

async function onPerceivedResults(event) {
  event.preventDefault();
  if (container.childNodes.length > 0) { return; }
  const { found, lost } = event.detail;
  if (found.length === 0 && lost.length === 0) {
    // Object not found.
    // Show a card with an offer to show the catalog.
  } else if (found.length > 0) {
    // Object found.
    // Show a card with a reorder button.
  }
}

카드와 버튼을 추가하려면 인스턴스화하고 상위 객체에 추가하기만 하면 됩니다. 예를 들면 다음과 같습니다.

const { Card } = PerceptionToolkit.Elements;
const card = new Card();
card.src = 'Your message here.'
container.appendChild(card)'

마지막으로 전체 모습입니다. 사용자 환경에 추가한 편의 기능을 확인해 보세요. 마커를 찾았는지 여부와 관계없이 현재 상황에서 가장 유용하다고 생각되는 항목에 클릭 한 번으로 액세스할 수 있습니다.

async function onPerceivedResults(event) {
  // preventDefault() to stop default result Card from showing
  event.preventDefault();
  if (container.childNodes.length > 0) { return; }
  const { found, lost } = event.detail;
  const { ActionButton, Card } = PerceptionToolkit.Elements;
  if (found.length === 0 && lost.length === 0) {
    //Make a view catalog button.
    const button =  new ActionButton();
    button.label = 'View catalog';
    button.addEventListener('click', () => {
      card.close();
      //Run code to launch a catalog.
    });
    //Make a card for the button.
    const card = new Card();
    card.src = 'We wish we could help, but that\'s not our razor. Would you like to see our catalog?';
    card.appendChild(button);
    //Tell the toolkit it does not keep the card around
    // if it finds something it recognizes.
    card.dataset.notRecognized = true;
    container.appendChild(card);
  } else if (found.length > 0) {
    //Make a reorder button.
    const button = new ActionButton();
    button.label = 'Reorder';
    botton.addEventListener('click', () => {
      card.close();
      //Run code to reorder.
    })
    const card = new Card();
    card.src = found[0].content;
    card.appendChild(button);
    container.appendChild(card);
  }
}

카드 형식 지정

웹 인식 도구 키트는 기본 스타일시트를 사용하여 카드와 버튼에 기본 제공되는 서식을 제공합니다. 하지만 원하는 대로 쉽게 추가할 수 있습니다. 제공된 CardActionButton 객체에는 다양한 속성 중에서도 조직의 스타일을 디자인에 반영할 수 있는 style 속성이 포함되어 있습니다. 기본 스타일시트를 포함하려면 페이지에 <link> 요소를 추가합니다.

<link rel="stylesheet" href="//path/to/toolkit/styles/perception-toolkit.css">

결론

위에 언급했듯이 이는 웹 인식 도구 키트를 완전히 살펴본 것이 아닙니다. 웹사이트에 시각적 검색을 추가하는 것이 얼마나 쉬운지 알 수 있었기를 바랍니다. 시작하기 가이드와 샘플 데모를 통해 자세히 알아보세요. 도구 키트 문서에서 도구 키트의 기능을 자세히 알아보세요.