파이썬을 사용하다보면은 성능에 대한 생각을 자주 하게된다. 느린 언어이지만 개발의 편의성 때문에 파이썬을 버릴수도 없기에 계속 사용을 하게 되는 뫼비우스의 띠를 직접 몸으로 겪는다. 이에 대한 여러가지 나름의 해결책들이 있기에 그것들에 대한 정리의 필요성을 느끼게 되었다.
동시성과 병렬성이라는 단어의 뜻부터 알아보자.
동시성이라는 것은 여러개의 일들을 동시에 진행되는 것처럼 하는 것이다. 예를들어 우리가 한꺼번에 일을 처리를 하는것을 들수가 있다. n잡러들에게는 여러개의 일을 같이 진행을 하는데, 이것이 현실상의 동시성을 얘기를 하는것이라고 생각이 든다. 프로그래밍에서는 io-bound의 문제들을 일컫는다.
병렬성이라는 것은 동시성과는 다르게 하나일을 여러가지 코어가 나누어서 집중적으로 진행한다는 것이다. 하나의 큰 작업 ( ex: 고시공부) 를 공부할때에, 오전에는 A과목을, 오후에는 B과목을.. 등등 하나의 큰 목표를 위해 그 작업을 잘게 쪼개서 진행을 한다. 이것을 병렬성이라고 생각할수 있음. 프로그래밍에서는 cpu-bound의 문제를 말한다.
문제
예시
전략
멀티쓰레딩
멀티프로세싱
Asyncio
IO-BOUND
이미지 다운로드
동시성
O
△
O
CPU-BOUND
행렬계산
병렬성
X(GIL)
O
X
여기서 잠깐 동기식(synchronous)과 비동기식(asynchronous)라는 단어도 자주 나오는데, 개념을 알고가야지 해당부분에 대한 헷갈림이 덜해진다
비동기식은 : 완전히 독립적으로 진행이 되고, 대기하지 않아도 되는 작업들을 말한다.
동기식은 서로 데이터들을 주기적으로 모아주고, 공유하는 작업을 진행을 할때에 말한다.
동시성이나 병렬성을 구현을 할때에 비동기식과 동기식으로 둘다 구현이 가능하지만, 당연히 비동기식으로 구현하는게 효율이 더 좋다. 하지만 풀려는 문제에 따라서 알고리즘을 동기식으로 구현을 해야할수도 있다는 것을 알아두어야 한다.
스위츠랩 (이하 회사)는 「개인정보 보호법」 제30조에 따라 이용자의 개인정보를 보호하고 이와 관련한 고충을 신속하고 원활하게 처리할 수 있도록 하기 위하여 다음과 같이 개인정보 처리방침을 수립 및 공개합니다.
제1조 (개인정보의 처리목적)
회사는 다음의 목적을 위하여 개인정보를 처리하며, 처리하고 있는 개인정보는 다음의 목적 이외의 용도로는 이용되지 않습니다. 이용 목적이 변경되는 경우에는 「개인정보 보호법」 제18조에 따라 별도의 동의를 받는 등 필요한 조치를 이행할 예정입니다.
또한 회사는 만 14세 이상의 이용자를 대상으로 서비스를 제공하며, 만 14세 미만 아동의 개인정보가 수집된 사실을 인지하는 경우 해당 정보를 지체없이 삭제하겠습니다
회원 가입 및 관리
회원 가입의사 확인과 회원제 서비스 제공에 따른 회원자격 유지 및 관리, 서비스 부정이용 방지, 각종 고지와 통지, 고충처리 목적으로 개인정보를 처리합니다.
서비스 제공
서비스 및 콘텐츠, 광고를 포함한 맞춤형 서비스 제공을 목적으로 개인정보를 처리합니다.
고충처리
이용자의 신원 확인, 문의사항 확인, 사실조사를 위한 연락, 통지, 처리결과 통보의 목적으로 개인정보를 처리합니다.
개인정보 (TrueDepth API)
TrueDepth API를 이용한 사용자 얼굴인식 정보를 이용해 사용자들의 더욱 원활한 서비스 이용을 하도록 처리합니다
제2조 (개인정보의 처리 및 보유기간)
① 회사는 법령에 명시되어 있거나 이용자로부터 개인정보 수집 시 동의 받은 개인정보의 보유 및 이용기간 내에서 개인정보를 처리 및 보유합니다.
② 각각의 개인정보 처리 및 보유 기간은 다음과 같습니다.
회원 가입 및 관리 : 회원 탈퇴 시까지
TrueDepthAPI : 별도의 저장없이 데이터 정보만 처리. 즉시 폐기.
다만, 다음의 사유에 해당하는 경우에는 해당 사유 종료 시까지
1) 관계 법령 위반에 따른 수사, 조사 등이 진행 중인 경우에는 해당 수사, 조사 종료 시까지
2) 서비스 이용에 따른 채권, 채무관계 잔존 시에는 해당 채권, 채무관계 정산 시까지
서비스 제공 : 서비스 공급 완료 또는 서비스 이용 종료 시까지
고충처리 : 고충 처리 완료 시까지
다만, 다음의 사유에 해당하는 경우에는 해당 기간 종료 시까지
관련법령
수집정보
보유기간
통신비밀보호법
서비스 이용 관련 정보(접속로그)
3개월
전자상거래 등에서의 소비자 보호에 관한 법률
소비자의 불만 또는 분쟁처리에 관한 기록
3년
계약 또는 청약철회 등에 관한 기록
5년
대금결제 및 재화 등의 공급에 관한 기록
5년
제3조 (개인정보의 제3자 제공)
① 회사는 이용자의 개인정보를 제1조(개인정보의 처리 목적)에서 명시한 범위 내에서만 처리하며, 정보주체의 동의, 법률의 특별한 규정 등 「개인정보 보호법」 제17 조 및 제18조에 해당하는 경우에만 개인정보를 제3자에게 제공합니다.
② 회사는 제3자에게 개인정보를 제공하지 않으며, 제공하게 될 경우 이용자에게 동의를 받겠습니다 .
제4조 (개인정보처리의 위탁)
① 회사는 개인정보 관리를 위탁하지 않습니다
제5조 (이용자와 법정대리인의 권리•의무 및 행사방법)
① 이용자는 회사에 대해 언제든지 개인정보 열람, 정정, 삭제, 처리정지 요구 등의 권리를 행사할 수 있습니다.
② 개인정보 열람 및 처리정지 요구는 개인정보보호법 제35조 제4항, 제37조 제2항에 의하여 이용자의 권리가 제한될 수 있습니다.
③ 개인정보의 정정 및 삭제 요구는 다른 법령에서 그 개인정보가 수집 대상으로 명시되어 있는 경우에는 그 삭제를 요구할 수 없습니다.
④ 회사는 이용자 권리에 따른 열람의 요구, 정정·삭제의 요구, 처리정지의 요구 시 열람 등 요구를 한 자가 본인이거나 정당한 대리인인지를 확인할 수 있습니다.
⑤ 제4항에 따른 권리행사 주체가 대리인(이용자의 법정대리인이나 위임을 받은 자)인 경우 “개인정보 처리 방법에 관한 고시(제2020-7호)” 별지 제11호 서식에 따른 위임장을 제출하셔야 합니다.
제6조 (처리하는 개인정보 항목)
① 회사는 다음의 개인정보 항목을 처리하고 있습니다.
구분
수집·이용목적
필수/선택
수집 및 이용항목
마케팅
맞춤형 광고
선택
광고식별자, 서비스 이용기록, 쿠키
TrueDepthAPI
서비스 이용
필수
TrueDepth API 데이터
② 서비스 이용과정에서 아래 개인정보 항목이 자동으로 생성되어 수집될 수 있습니다.
IP주소, 쿠키, 서비스 이용기록, 광고식별자, 방문기록, 기기 정보(유형, 모델명, OS 버전, APP 버전, 기기 식별자, 언어 및 국가)
③ 회사의 서비스를 이용하여 사진을 찍거나 사진을 편집하는 경우 이용자의 사진(또는 갤러리)에 접근할 수는 있지만 이용자의 사진을 복사하거나 회사의 서버로 전송하지 않습니다.
제7조 (개인정보의 파기)
① 회사는 이용자로부터 동의 받은 개인정보의 보유기간이 경과하거나 처리목적을 달성하여 더 이상 개인정보가 필요하지 않게 된 경우 지체없이 해당 개인정보를 파기합니다.
② 제1항 해당됨에도 불구하고 다른 법령에 따라 개인정보를 계속 보존하여야 하는 경우에는, 해당 개인정보를 별도의 데이터베이스(DB)로 옮기거나 보관장소를 달리하여 보존합니다. (법령에 따른 보관 기간은 제2조를 참조하시기 바랍니다)
③ 개인정보 파기의 절차 및 방법은 다음과 같습니다.
파기절차
1) 개인정보 도용 등으로 인한 피해 발생 시 복구와 피해자 보호 등을 위하여 회원가입 시 수집한 개인정보를 14일 동안 임시로 보관할 수 있습니다.
2) 회사는 파기 사유가 발생한 개인정보를 선정하고, 회사의 개인정보 보호책임자의 승인을 받아 개인정보를 파기합니다.
파기방법
1) 전자적 파일의 형태 : 복구 및 재생이 되지 않도록 기술적인 방법 이용
2) 종이 문서 : 분쇄기로 분쇄하거나 소각
제8조 (개인정보의 안전성 확보조치)
회사는 개인정보의 안전성 확보를 위해 다음과 같은 조치를 취하고 있습니다.
관리적 조치
내부관리계획 수립 및 시행, 정기적 임직원 교육, 정기적인 접속기록 점검, 수탁사 점검 등
기술적 조치
개인정보처리시스템 등의 접근권한 관리, 접근통제시스템 설치, 내부 관리계획에 따른 암호화 (전송구간 및 저장 시), 보안프로그램 설치
물리적 조치
데이터센터, 자료보관실 등의 접근통제
제9조 (개인정보 자동 수집 장치의 설치∙운영 및 거부에 관한 사항)
회사는 이용자들에게 적합하고 보다 유용한 서비스와 광고 서비스(맞춤형 광고 포함)를 제공하기 위해서 이용자의 광고 식별자와 분석 소프트웨어를 사용하고 있습
제10조 (개인정보 보호책임자)
① 회사는 개인정보 처리에 관한 업무를 총괄하고 개인정보 처리와 관련한 이용자의 불만처리 및 피해구제 등을 위하여 아래와 같이 개인정보 보호책임자를 지정하고 있습니다.
이름
소속
직위
연락처
양인황
스위츠랩
대표
sweetz.ceo@gmail.com
② 이용자께서는 회사의 서비스를 이용하시면서 발생한 개인정보 보호 관련 문의, 불만처리, 피해구제 등에 관한 사항에 대하여 개인정보 보호책임자에게 문의하실 수 있으며, 문의하신 내용은 빠른 시일 내에 답변 및 처리해드릴 예정입니다. 다만, 부득이한 사유로 지연이 될 경우 이용자께 다시 안내 드리겠습니다.
제11조 (권익침해 구제방법)
이용자는 개인정보 침해에 대한 피해구제나 상담 등이 필요하신 경우에 아래의 기관에 문의하실 수 있습니다
① 본 개인정보처리방침은 회사가 제공하는 모든 서비스(웹사이트 및 APP 포함)에 적용되지만, 서비스의 특성이 상이한 경우, 서비스별로 특화된 개인정보처리방침이 적용될 수 있습니다.
② 회사 서비스에 링크되어 있는 다른 회사의 웹사이트를 방문하거나, 방문하신 웹사이트에서 개인정보를 수집하는 경우 본 개인정보처리방침이 적용되지 않습니다.
제13조 (개인정보 처리방침의 변경 및 고지)
① 본 개인정보처리방침의 내용 추가, 삭제 및 수정이 있을 경우 개정 최소 7일 전에 ‘공지사항’을 통해 사전 공지를 하겠습니다. 다만, 수집하는 개인정보의 항목, 이용목적의 변경 등과 같이 이용자 권리의 중대한 변경이 발생할 때에는 최소 14일 전에 공지하며, 필요 시 이용자 동의를 다시 받을 수도 있습니다
iOS 기기에서 처음 LiDAR 스캐너를 탑재 한 iPad Pro의 발매와 동시에 출시 된 ARKit 3.5에서는 LiDAR를 이용하여 reconstraction 한 3D 메쉬는 얻을 수 있었지만, 그 계산에 이용되고있는 것 뎁스 (깊이) 데이터에 액세스 할 수 없었다.
이후 발표 된 ARKit 4 / iOS 14 (/ iPadOS 14)에서 드디어 LiDAR에서 측정 한 깊이를 얻을 수있게되었다. 기존의 깊이와 구별하기 위해 "장면 깊이 (Scene Depth) '이라고도하는 것 같다.
LiDAR 깊이의 취득 방법
LiDAR 유래의 깊이 데이터는 ARWorldTrackingConfiguration 이용시 frameSemantics 속성에 .sceneDepth 옵션을 지정하여 검색 가능하게된다.
let session = ARSession()
let configuration = ARWorldTrackingConfiguration()
// sceneDepth 옵션을 사용할 수 있는지 확인
if type(of: configuration).supportsFrameSemantics(.sceneDepth) {
// Activate sceneDepth
configuration.frameSemantics = .sceneDepth
}
session.run(configuration)
ARFrame에 새롭게 추가 된 sceneDepth 속성보다 LiDAR에서 측정 한 깊이 데이터를 얻을 수있다.
func session(_ session: ARSession, didUpdate frame: ARFrame) {
guard let depthData = frame.sceneDepth else { return }
// Use depth data
}
사용 가능한 구성
ARConfiguration 프로토콜에 정의 된 frameSemantics 속성에 sceneDepth을 설정하기 때문에 API으로 사용할 수는 있지만, API 레퍼런스의 sceneDepth 절에 설명보기 한 월드 추적 이외의 구성에서 사용할 수없는스러운
If you enable this option on a world-tracking configuration's frameSemantics, ARKit includes depth information for regions of the current frame's capturedImage. The world-tracking configuration exposes depth information in the sceneDepth property that it updates every frame.
하드웨어적인 제약
마찬가지로 sceneDepth 참조 페이지를 보자.
ARKit supports scene depth only on LiDAR-capable devices
칩이 A12 이상이나 조건은 아닌 것 같다. (LiDAR이 실리 → 필연적으로 고성능 칩이기 때문 일까)
estimatedDepth는 frameSemantics에 personSegmentationWithDepth 옵션을 지정한 경우에 얻을 수있는 것으로, 듀얼 카메라와 True-Depth 카메라 유래의 깊이가 아니라 그 속성 이름에서 알 수 있듯이 추정 깊이 데이터이다. 요 A12 칩 이상.
sceneDepth는 상술 한 바와 같이 frameSemantics에 sceneDepth를 지정한 경우에 취득 할 수있어 AR 구성으로는 월드 추적에만 장치로 LiDAR를 탑재하고있을 필요가있다
프레임 레이트 / 생성 알고리즘의 차이
capturedDepthData는 True-Depth 카메라 유래의 깊이 데이터이기 때문에 ARFrame 컬러 데이터 (capturedImage 속성)보다 업데이트 빈도가 낮고, 깊이를 이용한 효과 등을 걸고있는 피사체 (페이스 트래킹이므로 자신)이 빨리 움직일 경우에 추종 할 수없는 것이 있었다. 한편 estimatedDepth은 기계 학습 기반으로 추정되며, A12 이후의 고성능 칩을 조건으로하고 있기 때문에 카메라 프레임과 동일한 프레임 속도로 업데이트된다. sceneDepth도 LiDAR로 취득한 깊이 데이터와 광각 카메라에서 가져온 컬러 데이터를 기반으로 기계 학습 알고리즘을 이용하여 생성된다. 60fps로 동작하는, 즉 이쪽도 ARFrame를 얻을 때마다 업데이트되고있다. (WWDC 2020의 "Explore ARKit 4"세션에서)
The colored RGB image from the wide-angle camera and the depth ratings from the LiDAR scanner are fused together using advanced machine learning algorithms to create a dense depth map that is exposed through the API. (광각 카메라의 컬러 RGB 이미지와 LiDAR 스캐너에서 심도 정격이 고급 기계 학습 알고리즘을 사용하여 융합 된 API를 통해 공개되는 고밀도의 깊이 맵이 생성됩니다.) This operation runs at 60 times per second with the depth map available on every AR frame. (이 작업은 초당 60 번 실행되며 AR 프레임마다 깊이 맵을 사용할 수 있습니다.)
형식의 차이
capturedDepthData는AVDepthData형,
estimatedDepth는CVPixelBuffer형,
그리고sceneDepth는ARDepthData형얻을 수있다.
<ARDepthData>
상술 한 바와 같이 sceneDepth 속성에서 얻을 수 LiDAR 유래의 깊이 데이터는 ARDepthData 형 얻을 수있다. 이곳은 iOS 14에 추가 된 새로운 클래스.
이것을 잘 이용한 공식 샘플이 나와 있으므로 자세한 설명은 샘플을 읽으면서 다른 기사에 쓴다.
LiDAR의 정확도 / 측정 가능한 거리는?
WWDC 2020은 아니지만, ARKit 3.5 릴리스되었을 때 "Advanced Scene Understanding in AR"라는 Tech Talk가 공개되어 있으며, 그 중 LiDAR의 정확성에 대해 언급했다.
The new iPad Pro comes equipped with a LiDAR Scanner. This is used to determine distance by measuring at nanosecond speeds how long it takes for light to reach an object in front of you and reflect back. This is effective up to five meters away and operates both indoors and outdoors.
(새로운 iPad Pro는 LiDAR 스캐너가 탑재되어 있습니다. 이것은 눈앞의 물체에 빛이 도달하여 반사되어 돌아올 때까지의 시간을 나노초의 속도로 측정하여 거리를 판단 하는 데 사용됩니다. 이것은 5 미터까지 유효, 실내에서도 야외에서도 사용할 수 있습니다.)
LiDAR에서 몇 미터 앞까지 측정 할 것인가라는 질문을받은 적이 몇 번 있지만, 이런 것은 공식적으로 언급되지 않은 느낌 이었기 때문에, "샘플에서 실제로 시도해 보면 좋아요"라고 답변을했다. 기준해라 귀중한 공식 정보가 있으므로 참고.
personSegmentationWithDepth과 장면 깊이
ARConfiguration의 frameSemantics 속성에 personSegmentationWithDepth 옵션을 지정하는 경우, 씬 깊이를 얻을 수있는 장치라면 자동으로 장면 깊이를 얻을 수있는 것 같다.
let session = ARSession()
let configuration = ARWorldTrackingConfiguration()
// Set required frame semantics
let semantics: ARConfiguration.FrameSemantics = .personSegmentationWithDepth
// Check if configuration and device supports the required semantics
if type(of: configuration).supportsFrameSemantics(semantics) {
// Activate .personSegmentationWithDepth
configuration.frameSemantics = semantics
}
session.run(configuration)
게다가 추가 전력 비용도 들지 않는 것.
Additionally if you have an AR app that uses people occlusion feature, and then search the personSegmentationWithDepth frameSemantic, then you will automatically get sceneDepth on devices that support the sceneDepth frameSemantic with no additional power cost to your application.
smoothedSceneDepth
상술 한 sceneDepth은 WWDC 2020 개최 시점 (iOS 14 beta 1 때) 이미 공개되어 있었지만, iOS 14 beta 5에서 갑자기 smoothedSceneDepth되는 API가 추가되었다.
이 때 (2020 년 8 월) 문서를 바로 보러 갔는데 자세한 내용은 아무것도 쓰여지지 않았다. 지금 보러 가면 제대로 설명이 적혀있어 sceneDepth의 차이도 명기되어있다. DeepL 이용의 일본어 번역을 병기하여 여기에 정리해 둔다.
An option that provides the distance from the device to real-world objects, averaged across several frames. (장치에서 실제 객체 사이의 거리를 제공하는 옵션으로 여러 프레임에서 평균화됩니다.)
Declaration
static var smoothedSceneDepth: ARConfiguration.FrameSemantics { get }
Discussion
Enable this option on a world-tracking configuration (ARWorldTrackingConfiguration) to instruct ARKit to provide your app with the distance between the user’s device and the real-world objects pictured in the frame's capturedImage. ARKit samples this distance using the LiDAR scanner and provides the results through the smoothedSceneDepth property on the session’s currentFrame.
(월드 추적 설정 (ARWorldTrackingConfiguration)에서이 옵션을 사용하면 사용자의 장치 및 프레임 캡처 사진에 찍혀있는 실제 객체와의 거리를 응용 프로그램에 제공하도록 ARKit에 지시합니다 .ARKit은 LiDAR 스캐너를 사용하여이 거리를 샘플링 세션 currentFrame의 smoothedSceneDepth 속성을 통해 결과를 제공합니다.)
LiDAR 스캐너를 사용할 수 여기에 명기되어있다.
To minimize the difference in LiDAR readings across frames, ARKit processes the data as an average. The averaged readings reduce flickering to create a smoother motion effect when depicting objects with depth, as demonstrated in Creating a Fog Effect Using Scene Depth. Alternatively, to access a discrete LiDAR reading at the instant the framework creates the current frame, use sceneDepth
(프레임 간의 LiDAR 측정 값의 차이를 최소화하기 위해 ARKit은 데이터를 평균으로 처리합니다. 평균화 된 판독 값은 "장면 깊이를 사용한 안개 효과 만들기"에서 입증 된 같이 깊이있는 개체를 묘사 할 때 깜박임을 줄이고 더 부드러운 모션 효과를 만들어냅니다. 또한 프레임 워크가 현재의 프레임을 만든 순간에 개별 LiDAR 판독 값에 액세스하려면 sceneDepth를 사용합니다.)
여기가 제일 중요하다. sceneDepth의 차이가 명기되어 있으며, 장점과 구분도 적혀있다.
ARKit supports scene depth only on LiDAR-capable devices, so call supportsFrameSemantics( :) to ensure device support before attempting to enable scene depth.
(ARKit은 LiDAR 지원 장치에서만 장면 심도를 지원하고 있기 때문에, 장면 심도를 사용하기 전에 supportsFrameSemantics (:)을 호출 해 디바이스의 지원을 확인하십시오.)
smoothedSceneDepth: ARDepthData
ARFrame의 smoothedSceneDepth 속성
An average of distance measurements between a device's rear camera and real-world objects that creates smoother visuals in an AR experience. (장치의 후면 카메라와 실제 객체 사이의 거리 측정의 평균치에서 AR 체험으로 더 부드러운 영상을 만들 수 있습니다.)
Declaration
var smoothedSceneDepth: ARDepthData? { get }
Discussion
his property describes the distance between a device's camera and objects or areas in the real world, including ARKit’s confidence in the estimated distance. This is similar to sceneDepth except that the framework smoothes the depth data over time to lessen its frame-to-frame delta
(이 속성은 장치의 카메라와 실제 객체와 지역과의 거리를 설명합니다. 이것은 sceneDepth와 비슷하지만 프레임 워크는 프레임 간의 차이를 줄이기 위해 심도 데이터를 시간이 지남 부드럽게합니다.)
This property is nil by default. Add the smoothedSceneDepth frame semantic to your configuration’s frameSemantics to instruct the framework to populate this value with ARDepthData captured by the LiDAR scanner.
(이 속성은 기본적으로 nil입니다. 프레임 워크에 LiDAR 스캐너에 의해 캡처 된 ARDepthData에서이 값을 입력하도록 지시하기 위해 설정 frameSemantics에 smoothedSceneDepth 프레임 시맨틱을 추가합니다.)
Call supportsFrameSemantics(:) on your app’s configuration to support smoothed scene depth on select devices and configurations.
(앱 설정에서 supportsFrameSemantics (:)을 호출하여 선택한 장치 설정에서 평활화 된 장면 심도를 지원합니다.)