티스토리 뷰

반응형

 

 

✓ 해당 포스트는 이전 포스팅(https://0urtrees.tistory.com/75)에서 다루는 예제앱을 활용하며 이어지는 내용입니다.

 


Create Vision Requests
Vision Requests의 생성


앞서 보았던 예제(상기 포스팅 링크 참고)의 주요 코드를 보도록 하겠습니다.
먼저, 처리될 이미지와 함께 VNImageRequestHandler 객체를 생성합니다. 

performVisionRequest 메서드 내에서 VNImageRequestHandler 객체를 생성하고 있습니다. 

 

 

만약 동일한 이미지로부터 다수의 요청을 한다면 ex) 얼굴 감지 뿐만아니라 얼굴의 특징까지 감지하는 경우 이미지 요청 핸들러로 전달하기 위한 모든 요청들을 생성하고 묶습니다. Vision은 각각의 요청을 실행하고 현재 스레드에서 완료 핸들러(completion handler)를 실행합니다.

당신은 Vision이 모든 요청들을 끝낸 이후 요청에 대한 특정 코드를 실행하기 위해 각각의 요청들에 대하여 완료 핸들러(completion Handler)를 쌍으로 둘 수 있습니다.
 샘플앱을 보면 요청 타입에 따라 다르게 직사각형 박스를 그려줍니다. 이는 코드가 각각의 요청마다 다르게 작동하는 것을 보여줍니다. 각각의 요청을 초기화할 때, 완료 핸들러(completion Handler)를 구체화 하십시오.

 

 

모든 요청을 생성한 이 후 이 요청들을 요청 핸들러의 동기적인 메서드, perform(_:) 으로 배열 형식으로 전달하세요. 
 Vision의 계산은 자원과 시간을 소비할 수 있습니다. 그러므로 메인 큐의 Blocking을 방지하기 위해 이를 실행할 때 백그라운드 큐(background Queue)를 사용하시기 바랍니다.

perform은 동기적인 메서드로, 이를 실행할 때 백그라운드큐를 사용해야 blocking을 방지할 수 있습니다.

 

 


감지 결과 해석하기


메서드, perform(_:) 은 요청이 성공했는지, 에러가 발생했는지에 따라 Bool값을 반환합니다. 만약 요청이 성공한다면, 프로퍼티, results는 관측 or 추적한 데이터를 포함합니다. 예를들면 감지한 객체의 위치나 경계상자등이 있습니다.

당신은 두 가지 방법으로 results에 접근할 수 있습니다.

◼︎ perform(_:) 메서드가 호출 된 이후 results 프로퍼티를 확인하는 방법으로 접근할 수 있습니다. 

◼︎ VNImageBasedRequest 객체의 완료 핸들러에서, 콜백의 관측 (observation) 매개변수를 사용해서 감지한 정보를 추출할 수 있습니다. 콜백 결과는 다수의 관측 정보를 포함할 수 있습니다. 그러므로 각각의 처리를 위해 루프문 등을 사용해서 관측 값 배열(observations array)을 처리하세요.


예를들어, 샘플 앱에서는 얼굴 관측과 이들의 랜드마크 경계상자를 사용해서 특징들을 찾고 이들 주변에 직사각형을 그려줍니다.

백그라운드 스레드 상에서 Vision이 completion handler를 호출할때에도 경로를 그리는 코드와 같은 UI 호출들은 메인스레드로 전달됩니다. UIKit, AppKit & 리소스에 대한 접근은 반드시 serialized 해야만 합니다. 그러므로 앱의 즉각적인 외관 등에 영향을 주는 변화는 메인스레드에서 작동되어야만 합니다.

 

 

얼굴 관측결과를 확인하고 감지 된 내용에 대한 직사각형을 그려줍니다.

얼굴 경계 요청에 대해서, 감지기는 VNFaceObservation results를 통해 NVFaceLandmarkRegion2D와 같이 더 자세하게 제공하고 있습니다.

 

 


텍스트 관측을 위해서, 당신은 개별적인 문자들을 characterBoxes 프로퍼티를 통해서 찾을 수 있습니다.

 

그 외 바코드 관측을 위해서 지원되는 symbologies는 payloadStringValue 프로퍼티 내에서 페이로드 정보를 포함하고 있습니다. 해당 정보는 감지한 바코드에 대한 구문분석을 가능하게 해줍니다. 슈퍼마켓 스캐너와 유사하게 말입니다. 바코드 감지는 하나의 이미지 당 하나의 바코드를 찾는것에 최적화 되어있습니다.

완료 핸들러 (completion handler)를 빠져나오기 전 관측 정보로 부터 얻은 데이터를 저장 및 사용하는 것은 당신에게 달려있습니다. 샘플앱에서 경로를 그린 것 대신, 당신의 커스텀 코드를 구현해서 앱이 각각에 대해 어떤 것을 필요로 하는지 판단하고 추출할 수 있습니다.

 

 


Follow Best Practices
모범 사례 준수하기


불필요한 계산을 줄이기 위해서 동일한 이미지에 대한 요청을 여러번 생성하고 제출하지 말아야 합니다. 대신, Vision을 쿼리하기 전, 모든 요청들을 만들고 요청 배열 (requests array) 안에 묶어 사용하십시오. 그리고 이를 난 한번의 호출로서 제출하여 사용하십시오.

이미지와 관계없이, 다수의 감지를 수행하기 위해서 각각의 이미지를 위한 개별적인 이미지 핸들러를 만든 후 개별적인 스레드 상에서 각각의 핸들러를 위한 요청을 만드십시오. 그렇게 하면 그들은 평행적으로 동시에 작동합니다.
 각각의 이미지 요청 핸들러는 추가적인 시간과 메모리를 소모합니다. 그러므로 이들을 메인스레스에서 작동하지 말고, 추가적인 백그라운드 스레드 상에 해당 핸들러들을 전달하고 호출해야하며, 이미지나 경로가 업데이트 되는 등 UI가 변화할때만 메인스레드에서 실행하시기 바랍니다.

해당 예제 앱에서 소개하는 이미지 기반 핸들러는 여러개의 이미지를 감지하기 위해 작동하고 있지만, 객체를 추적하지는 않습니다. 객체 추적을 수행하고 싶다면, NVSequenceRequestHandler 객체를 대신 사용하십시오. 객체 추적에 대한 더 자세한 정보를 원하신다면, 실시간으로 사용자의 얼굴 추적하기(Tracking the User's Face in Real Time) 를 참고하시기 바랍니다.

 

 

관련 애플 공식 개발자 문서 링크 ▼
Detecting Objects in Still Images

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함