스트리밍은 대부분의 브라우저와
Developer 앱에서 사용할 수 있습니다.
-
Vision 프레임워크의 Swift 관련 개선 사항 알아보기
Vision Framework API가 동시성 등의 최신 Swift 기능을 활용하도록 재구성되어, 광범위한 Vision 알고리즘을 더욱 쉽고 빠르게 앱에 통합할 수 있습니다. API 업데이트 사항을 소개하고, 샘플 코드와 모범 사례를 공유합니다. 이 프레임워크의 이점을 활용하고 코딩 업무 부담을 경감해 보세요. 또한 ‘image aesthetics', ‘holistic body pose' 등 새로운 2가지 기능의 데모를 선보입니다.
챕터
- 0:00 - Introduction
- 1:07 - New Vision API
- 1:47 - Get started with Vision
- 8:59 - Optimize with Swift Concurrency
- 11:05 - Update an existing Vision app
- 13:46 - What’s new in Vision?
리소스
관련 비디오
WWDC23
-
다운로드
안녕하세요 저는 Megan Williams이고 Vision 프레임워크 팀 소속입니다 Vision은 컴퓨터 비전 API를 제공하는 프레임워크이며 개발자가 이를 사용하여 놀라운 앱, 경험을 선사할 수 있죠 Vision 프레임워크로 할 수 있는 몇 가지 작업을 보여 드리겠습니다 Vision은 얼굴과 눈, 코, 입 같은 얼굴의 주요 부분을 감지합니다
Vision 프레임워크는 18개 언어의 텍스트를 인식할 수 있으며 한국어, 스웨덴어, 중국어 등이 포함됩니다
건강 및 피트니스 애플리케이션에서 Vision은 신체 자세와 궤적을 추적합니다
Vision에는 손 동작을 추적하는 기능도 있어서 화면을 터치하지 않고도 Apple 기기에서 완전히 새로운 방식으로 상호작용할 수 있습니다 이는 몇 가지 예시에 불과합니다 전 세계 수천 명의 개발자가 Vision을 사용하여 놀라운 앱을 구축하고 있습니다 올해는 훨씬 더 쉽게 컴퓨터 비전을 앱에 적용할 수 있습니다 새 API를 소개하게 되어 기쁘며 이제 이전만큼 강력하면서도 Swift용으로 설계된 간결한 구문이 추가되었습니다 Swift 동시성과 Swift 6에 대한 완벽한 지원을 도입하여 개발자가 지금껏 가장 성능이 좋은 앱을 작성하도록 지원합니다 이 동영상의 나머지 부분에서는 새 Swift API 시작 방법을 볼께요 그런 다음 Swift 동시성을 사용한 앱 최적화 방법을 시연해 봅니다 그리고 새 API를 사용하기 위해 기존 Vision 애플리케이션을 업데이트하는 방법을 설명합니다 마지막에는 올해 Vision의 몇 가지 새 기능을 소개하겠습니다 시작합니다! Vision에서는 모든 작업이 요청으로 시작됩니다 Vision 요청이 이미지에 대해 묻는 질문이라고 생각해 보세요 예를 들어 “이 이미지에서 얼굴은 어디에 있나요?” “이 영수증의 총금액은 얼마인가요?” “이 이미지의 피사체는 무엇인가요?”라는 질문이죠 DetectFaceRectangleRequest로 얼굴을 찾고 RecognizeTextRequest로 텍스트를 이해하며 GenerateObjectnessBasedSaliencyImageRequest로 이미지에서 중요한 피사체를 찾죠
이제 몇 가지 질문이 생겼으니 답변을 알아야겠죠 Vision은 관찰 형태로 이러한 질문에 답변을 제공하며 요청을 실행하여 답변이 생성됩니다
DetectFaceRectanglesRequest는 FaceObservations를 생성하여 얼굴 위치를 알려 줍니다 RecognizedTextObservation은 텍스트를 이해하는 데 도움이 되며 SaliencyImageObservation은 이미지에서 중요한 부분을 강조 표시할 수 있습니다
이는 몇 가지 예시에 불과합니다 Vision에는 31개의 다양한 요청이 있으며 각 요청은 이미지 분석 유형을 나타냅니다 이 동영상에서 전부 다루기에는 요청이 너무 많으므로 제가 즐겨 사용하는 몇 가지를 집중적으로 살펴봅니다 Vision에는 일반적인 컴퓨터 비전 작업 요청이 있으며 이미지 분류 텍스트 인식을 예로 들 수 있어요 Vision은 이미지에서 다양한 피사체를 감지하고 인식할 수 있고 바코드와 인물 동물 등을 인식합니다 신체 자세 추정이 가능한 API도 있으며 2D와 3D로 구현됩니다 또한 움직이는 피사체를 감지하여 여러 프레임에서 추적할 수 있어요
이제 요청이 무엇인지 알아봤으니 코드에서 예시가 어떤 모습인지 살펴보겠습니다 슈퍼마켓 애플리케이션을 구축한다고 가정해 봅니다 슈퍼마켓에서 다양한 각종 제품을 탐색할 수 있도록 제품 바코드를 스캔할 수 있어야 합니다 여기서 DetectBarcodesRequest를 사용할 수 있습니다
이 이미지의 바코드를 스캔해 보겠습니다 먼저 요청을 생성합니다 그런 다음 이미지에 대해 요청을 수행합니다
이렇게 하면 barcodeObservations가 생성되고 이미지에서 감지된 바코드마다 하나의 관찰이 수행됩니다
요청이 실패할 수 있으므로 try 문을 추가해야 합니다
또 다른 중요한 사항은 새로운 API가 비동기식이므로 앱은 작업이 완료될 때까지 기다려야 합니다 끝났습니다 단 세 줄의 코드만으로 바코드를 감지할 수 있습니다 하나의 예시에 불과하지만 모든 Vision 요청은 동일한 일반 구조를 따릅니다
바코드가 감지되면 바코드의 페이로드에서 제품 정보를 얻을 수 있습니다 이 코드로 바코드를 스캔할 수 있어요 또한 이미지에서 바코드가 어디에 있는지 파악하여 사용자에게 강조 표시할 수 있어요 바코드의 위치는 .boundingBox 속성에서 가져옵니다 Vision 관찰 결과에 포함된 좌표는 이미지에 대해 정규화되어 있으니 이 점을 참고하는 것이 중요합니다
Vision의 시스템에서 좌표는 0과 1 사이에서 정규화되고 원점은 왼쪽 하단 모서리에 위치합니다 이 점이 익숙한 다른 프레임워크와 차이가 있을 수 있습니다 예를 들어 SwiftUI는 원점이 왼쪽 상단 모서리에 위치합니다 하지만 걱정하지 마세요 올해 선보이는 새로운 API는 서로 다른 좌표 시스템 간 전환을 수행하도록 지원합니다 Vision의 정규화된 좌표에서 원본 이미지의 좌표로 전환하려면 toImageCoordinates()를 호출하고 내 이미지의 크기를 전달합니다 좌표 원점이 이미지의 왼쪽 상단 모서리나 왼쪽 하단 모서리가 되도록 지정할 수도 있습니다 저는 upperLeft를 사용하겠습니다
이렇게 하면 원점이 왼쪽 상단 모서리에 있는 이미지로 원래 좌표 공간의 바운딩 박스를 확보할 수 있습니다 이제 원본 이미지 속에서 바코드가 있는 위치를 알 수 있고 사용자를 위해 강조 표시할 수 있습니다
이제 바코드를 스캔할 수 있는 앱이 준비되었으니 몇 가지 최적화 작업을 통해 더 나은 앱을 구성해 보겠습니다 많은 요청에는 더 나은 성과를 내기 위해 세부적으로 조정할 수 있는 구성 가능한 속성이 있습니다 DetectBarcodesRequest()는 기본적으로 많은 다양한 바코드 유형을 스캔합니다 저는 슈퍼마켓 애플리케이션을 구축하고 있으므로 대신 슈퍼마켓에서 자주 접하는 바코드만 스캔할 수 있으면 됩니다
요청에 symbologies 속성을 설정해 .ean13만 스캔하도록 설정합니다 이렇게 하면 모든 바코드 유형을 스캔하는 것보다 효율적이고 더 나은 앱 성능을 누릴 수 있어요
이제 기본적인 API 사용법을 살펴봤으니 슈퍼마켓 애플리케이션의 몇 가지 고급 사용 사례에 집중하여 알아봅니다 이미지를 스캔하여 바코드를 찾을 수 있지만 제품에 바코드가 없으면 어떻게 해야 할까요? 대신 레이블상의 텍스트로 제품을 식별합니다 두 번째 요청을 수행할 텐데 이 경우에는 RecognizeTextRequest()를 사용합니다
이전처럼 요청을 생성합니다
한 번에 하나씩 요청을 수행할 수 있지만 최적의 성능을 위해 Vision에서 요청을 함께 수행하는 것이 좋아요 그러려면 ImageRequestHandler를 사용합니다
ImageRequestHandler를 이미지의 컨테이너로 생각하세요 핸들러를 사용하여 요청을 수행합니다 핸들러가 요청별로 하나의 결과를 반환합니다
이제 이미지에서 바코드를 스캔하고 동시에 모든 텍스트 레이블을 식별할 수 있습니다
한 가지 유의 사항은 이 요청으로 매개변수 팩 구문이 호출되어 임의 개수의 요청이 수행될 수 있다는 것입니다 또 다른 한 가지는 이 방법을 사용하면 모든 요청이 완료될 때까지 기다려 결과를 사용해야 합니다
일부 애플리케이션은 그래도 괜찮을 수 있습니다 하지만 슈퍼마켓 애플리케이션에서 DetectBarcodesRequest가 바코드를 감지할 경우 바코드를 스캔하기 전에 먼저 RecognizeTextRequest 완료까지 기다릴 수는 없습니다 Vision이 제공하는 대체 API performAll은 여러 요청을 함께 수행하도록 지원하고 각 요청이 끝나자마자 해당 결과를 처리합니다 performAll은 결과를 스트림으로 반환하는데 즉 요청이 완료되면 결과가 즉시 반환되면서 다른 요청은 계속 실행되고 있어요
관찰한 내용에 액세스하려면 스트림에서 결과를 기다려야 해요
이렇게 하면 바코드 관찰 결과를 즉시 사용할 수 있으며 결과를 사용할 수 있을 때 RecognizeTextRequest 완료까지 기다리지 않아도 됩니다
이제 기본 사항을 살펴봤으니 Swift 동시성을 사용한 Vision API 최적화를 알아봅니다 애플리케이션에서 여러 이미지를 처리해야 하는 경우가 많습니다 이러한 이미지는 for 루프에서 한 번에 하나씩 처리할 수 있어요 하지만 동시성을 사용하여 최적의 성능을 구현할 수 있습니다
이를 통해 이미지 배치를 가져오고 동시 처리가 가능합니다
많은 이미지가 있는 사진 보관함이 있다고 가정해 보겠습니다 격자 보기로 이미지를 표시하고 싶지만 이미지의 크기가 서로 다릅니다 첫 번째로 이미지를 정사각형으로 잘라야 합니다 목표는 이미지에서 주요 피사체를 자르는 것입니다 GenerateObjectnessBasedSaliencyImageRequest를 사용하여 이미지에서 주요 피사체의 위치를 식별하고 그 위치를 중심으로 자르기를 생성합니다
generateThumbnail 함수를 작성하고 이미지의 중요한 부분을 중심으로 자르기를 생성합니다 그런 다음 for 루프를 사용하여 보관함에 있는 이미지를 반복하고 각 사진의 썸네일을 생성합니다 각 이미지를 한 번에 하나씩 처리 중이며 속도가 줄 수 있어요 동시성을 사용하여 이 작업 속도를 높일 수 있습니다
대신 TaskGroups를 사용합니다 TaskGroups를 사용하면 병렬로 요청을 실행하는 여러 작업을 생성할 수 있습니다 이 코드를 한 번 더 조정해야 합니다
Vision 요청에서 메모리가 많이 사용될 수 있으므로 동시에 수행되는 Vision 요청의 개수를 제한하여 앱의 메모리 사용 공간을 줄이는 것이 좋습니다 이 경우 작업 개수를 5로 제한합니다
작업이 완료되면 다음 이미지 처리를 시작하는 또 다른 작업을 추가합니다 이렇게 하면 한 번에 최대 5개까지 요청을 처리합니다 애플리케이션에 대한 작업 개수를 5로 제한했기 때문이죠 하지만 다른 제한 개수가 더 효과적일 수도 있습니다
이제 애플리케이션을 새로운 API로 업데이트하는 방법을 볼께요 이전 Swift API가 종료되지는 않습니다 하지만 Swift 6과 Swift 동시성을 제대로 활용하려면 애플리케이션에 새로운 API를 채택하시기를 적극 권장합니다 시작하기 전에 별도 안내 사항 하나를 공유합니다 메모리 사용 공간을 줄이기 위해 Vision은 Neural Engine이 포함된 기기의 일부 요청에 대한 CPU와 GPU 지원을 제거할 예정입니다
이러한 기기에서 Neural Engine이 가장 성능이 뛰어난 옵션입니다
요청에서 지원하는 컴퓨팅 기기를 확인하려면 언제든 supportedComputeDevices() API를 사용하면 됩니다
새 API를 사용하도록 기존 Vision 애플리케이션의 업데이트 방법을 업데이트하는 방법을 설명합니다 세 단계만 거치면 됩니다
먼저 새로운 요청과 관찰 유형을 채택해야 합니다 이전 API의 대부분의 요청은 직접 새 API에서 동등히 적용할 수 있죠
새로운 요청이나 관찰 유형을 가져오려면 Vision 유형 이름에서 VN 접두사를 제거합니다
다음으로 Vision은 요청의 컴플리션 핸들러를 제거해 이를 async/await 구문으로 대체했습니다
마지막으로 요청에 따라 생성된 관찰된 내용이 perform() 호출에서 직접 반환됩니다 일부 코드를 업데이트해 보죠 이 코드는 이전 Vision API를 통해 이미지에서 바코드를 감지합니다
새로운 요청을 사용하도록 VN 접두사를 제거하여 VNDetectBarcodesRequest를 업데이트합니다
이전 API는 컴플리션 핸들러에서 결과를 처리했습니다 이제 결과가 perform()에서 직접 반환되므로 컴플리션 핸들러를 제거하겠습니다
대신 perform() 호출에 async/await 구문을 채택합니다
비동기식 API를 사용하려면 async 함수도 만들어야 합니다
컴플리션 핸들러에서 바코드 관찰 결과를 가져오는 대신 이제 관찰된 내용이 perform() 호출에서 직접 반환되죠 옵션 값을 더 이상 언랩할 필요가 없다는 사실을 아셨을 것입니다 마지막으로 저는 하나의 요청만 수행하고 있기 때문에 imageRequestHandler가 실제로 필요하지 않습니다 속성을 제거하여 코드를 간단하게 만듭니다
끝났습니다
새로운 API를 채택하여 코드 줄 개수가 10줄에서 단 6줄로 줄었습니다 간소화된 구문이 멋집니다 끝으로 올해 Vision에서 제공되는 두 가지 새로운 기능을 알아봅니다 CalculateImageAestheticsScoresRequest라는 새 요청이 Vision에 도입됩니다 이 요청으로 이미지 품질을 평가해 기억에 남는 사진을 찾을 수 있죠
이미지 품질을 결정하기 위해 여러 요인을 분석하게 되는데 블러와 노출을 예로 들 수 있어요 이 품질은 이미지에 할당된 전체 점수로 나타납니다
요청은 유틸리티 이미지도 식별합니다 특별히 추억할 만한 것은 아니지만 유용할 수 있는 이미지를 말하며 스크린샷이나 영수증 사진이 여기에 해당합니다 몇 가지 예를 살펴보죠
이 아름다운 풍경 이미지에는 높은 점수가 부여됩니다 잘 촬영되었고 노출도 적합하며 장면이 매우 기억에 남습니다
이 이미지는 초점이 명확하지 않습니다 우연히 찍힌 사진처럼 보이며 낮은 점수가 부여됩니다
이 나무 상자 이미지는 기술적으로 잘 촬영되었지만 친구에게 공유하고 싶을 정도로 기억에 남는 사진은 아닐 것 같죠 그렇기에 유틸리티 이미지입니다 새로운 API를 사용하려면 CalculateImageAestheticsScoresRequest를 사용하세요 이 요청이 생성하는 것은 ImageAestheticsScoresObservation이며 -1부터 1까지의 범위에서 전체 점수를 부여합니다 이미지가 얼마나 잘 찍혔는지를 나타내는 수치입니다 이 관찰된 내용에는 isUtility라는 또 다른 속성이 포함됩니다 잘 촬영된 사진에 해당하지만 추억할 만한 콘텐츠가 없는 경우입니다
올해 Vision의 새로운 기능에는 전체적인 신체 자세가 있습니다
이전에는 Vision에서 별도의 요청을 통해 신체 자세와 손 자세를 감지했어요
전체적인 신체 자세 기능을 사용해 손과 신체를 함께 감지할 수 있죠
이 기능을 위해 생성하는 것은 DetectHumanBodyPoseRequest예요
요청에서 detectsHands를 true로 설정합니다
이 요청으로 생성되는 HumanBodyPoseObservation에는 이제 두 개의 추가 속성이 포함되는데 하나는 오른손 관찰 결과이고 하나는 왼쪽입니다 여러 새로운 기능을 살펴봤으므로 요약해 보겠습니다 새로운 Swift API는 Swift 에코시스템에서 잘 작동하며 동시성과 Swift 6을 지원합니다 새 API로 Swift 애플리케이션에 Vision을 더 쉽게 채택할 수 있죠
다음 사항에 유의하세요 Vision은 앞으로 Swift에서만 새로운 기능을 소개할 예정입니다 기존 API의 지원이 중단되지는 않지만 새로운 API 채택을 적극 권장하는 바입니다 새로운 Image Aesthetics API와 Holistic Body Pose API를 사용해 애플리케이션에 새로운 기능을 추가할 수 있습니다
시청해 주셔서 감사합니다 Vision으로 만드신 근사한 앱을 하루 빨리 만나 보고 싶습니다
-
-
찾고 계신 콘텐츠가 있나요? 위에 주제를 입력하고 원하는 내용을 바로 검색해 보세요.
쿼리를 제출하는 중에 오류가 발생했습니다. 인터넷 연결을 확인하고 다시 시도해 주세요.