alert-lib
Alert-lib
は、カメラレイヤーの上に構築されたユーティリティを含むライブラリ で、距離の推定、速度の計算、警告、 AR オーバーレイに関連する機能を提供します。
距離の推定
距離フィルターは、カメラからの物体の距離を推定します。
は StaticDistanceEstimator
、想定された幅 / 高さおよびカメラのプロパティを使用して、オブジェクトからのカメラの距離を決定します。 概算見積書は、デフォルトでは車や歩行者に使用されますが、ユースケースに他の物体が必要な場合は延長されることがあります。 デフォルト値の距離はメートル単位です。 カスタム値の場合、距離の単位は指定したサイズと同じになります。
次のリストでは、メソッドのパラメータについて説明します。
-
recognitions
- 処理する認識のリスト。 -
frameSize
- 0 回の回転で認識された画像のサイズ。 -
sensorRotation
- 各フレームの自然な向きに 90 度の倍数で時計回りに回転します。 -
focalLength
- キャプチャカメラの焦点距離 ( ミリメートル単位 ) 。 -
sensorSize
- 物理カメラセンサーのサイズ ( ミリメートル単位 ) 。
カメラのピクセルバッファの焦点距離は、次のコードを使用して取得できます。
extension CMSampleBuffer {
/// Extracts the metadata dictionary from a `CMSampleBuffer` extension.
/// (for example, EXIF: `Aperture`, `Brightness`, `Exposure`, `FocalLength`, etc)
///
/// - Parameter sampleBuffer: represents the sample buffer to be processed.
/// - Returns: Returns the metadata dictionary from the provided sample buffer.
public func metadata() -> [String : Any]? {
if let cfmetadata = CMCopyDictionaryOfAttachments(allocator: kCFAllocatorDefault, target: self, attachmentMode: kCMAttachmentMode_ShouldPropagate) {
if let metadata = cfmetadata as? [String : Any] {
return metadata
}
}
return nil
}
}
let staticDistance = LSDStaticDistanceEstimator()
var recognitions : [LSDRecognizedObject] = [LSDRecognizedObject]()
let objectRecognition = LSDRecognizedObject()
objectRecognition.uuid = UUID()
objectRecognition.label = "type"
objectRecognition.bbox = CGRect(x: 100, y: 100, width: 250, height: 250)
recognitions.append(objectRecognition)
let sensorSize = CGSize(width: 5.6, height: 4.2)
staticDistance.estimateDistance(recognitions: recognitions, frameSize: CGRect(x: 0, y: 0, width: 640, height: 480), sensorRotation: 0, focalLength: 3.99, sensorSize: sensorSize)
注
の距離の値 Recognition
は、すでに ML モデルから使用できる場合があります。
ROI - 関心領域
関心領域 (ROI) は、ソースイメージの領域を定義して、イメージ内の場所に基づいて検出をフィルタリングできるようにします。 たとえば、車両前方の検知のみが関連する場合、反対側の検知を削除できます。
SDK では、次のタイプのリージョンが定義されています。
- プライマリ : このリージョンタイプは通常、エゴレーンを表します
- セカンダリ : このリージョンタイプは通常、エゴレーンの両側に隣接するレーンを含むリージョンを表します
SDK では、次の方法で ROI を生成できます。
-
makeStaticRoi
: 静的 ROI は、アプリケーションによって定義された頂点に基づいて生成されます 注
静的 ROI の検証は、次の制約を満たす必要があります。
- 頂点は凸多角形を形成する必要があります
- 各頂点の x および y には、イメージの幅と高さの割合を表す 0.0 ~ 1.0 の値を指定する必要があります
-
makeLaneRoi
: レーン ROI は道路車線モデルの出力に基づいて生成されます - プライマリリージョンは、 2 つのエゴレーンのマークで定義されます
- セカンダリ領域は、隣接する車線標示がある場合はそれによって定義されている
アラート
Live Sense SDK は LSDAlertManager
、このクラスを介して複数の種類のアラートをサポートしています。
入力します
エントリアラートは、検出が最初にプライマリ ROI リージョンに入ったときにアプリケーションに信号を送ります。
これらの警告は歩行者を支援し、歩行者が道路に入ったときにドライバーに警告し、車両は別の車両が自我レーンに合流したことを警告する。
レーンデパーチャー
車線逸脱警告は、対象車両が自我レーンを出発し、隣接する地域に侵入していることを示します。
レーンデパーチャーアラートには、次の 2 つの重大度があります。
-
WARNING
: 対象車両は意図的に車線を変更するのではなく、車線から逸脱している可能性があります。 -
INFO
: 対象車両が車線を逸脱しました
注
レーンデパーチャーワーニングの場合、 SDK は以下を想定しています。
- カメラは車両の中央にあり、まっすぐ前方に向いています。
- カメラを車両の一方の側に近づけると、 SDK が誤検知警告を発することがあります。
- カメラの視野は、スマートフォンの広角カメラに似ています
TTC - 衝突までの時間
Live Sense SDK は、ユーザー / ドライバーに 衝突までの時間を警告する機能を提供します。 この機能は、事故を防ぎ、ドライバーの安全を確保するのに役立ちます。 この機能は、車両の想定された経路での車両、カーブレーキライトオン、および歩行者の検知に適用されます。 衝突までの時間( TTC )は、次のように計算されます。
Time to Collision (T) = -1 * d / ( Δd / Δt ) when Δd < 0
- d = オブジェクトまでの距離
- Δ D = 処理されたフレーム間のオブジェクトまでの距離の変更
- Δ T = 処理されたフレーム間の時間の変化
各検出と視点の間の距離が計算さ alertDistance
れ、指定した距離を超えるとアラートが送信されます。
この計算は、オブジェクトまでの距離が減少している場合にのみ適用されます。 それ以外の場合、 TTC は無限であり、アラートは生成されません。
LSDAlertManager
経路に潜在的な危険性があることをユーザーに警告するための追加のヒューリスティックが含まれています。 これには、主要車両との衝突までの時間と、車両の直行ルートに入る人々が含まれます。
次の一覧に、 TTC 値に基づいたアラートのさまざまな重大度を示します。
-
INFO
- T >2.5 秒 -
WARNING
-1.8 秒未満の場合 <T<=2.5 秒 -
ALERT
- T<=1.8 秒の場合
これらはデフォルトで設定されている値です。 警告および警告の値は、の次のプロパティによって変更でき LSDAlertSettings
ます。
-
timeToCollisionAlert
(デフォルトは 1.8s) -
timeToCollisionWarning
(デフォルトは 2.5s)
が LSDAlertManager
完全に機能するには、次の入力が必要です。
-
LSDAlertSettings
- この方法の詳細については 、 API リファレンス を参照してください - 通常はデバイスの位置情報サービスによって提供
currentSpeed
される車両の現在の速度が、経由で継続的に供給されます。 LSDRecognizedObject
連続的にフィードされたの最新コレクション。 determineAlerts()
// Setup alertManager
let alertManager : LSDAlertManager = LSDAlertManager()
let entryTypes : [String] = ["car-brake-light-on", "pedestrian", "car"]
var recognitions : [LSDRecognizedObject] = [LSDRecognizedObject]()
// Enable entry alerts for test
let alertSettings : LSDAlertSettings = LSDAlertSettings()
alertSettings.useOnEntry = true
alertManager.alertSettings = alertSettings
//Set Roi
var roiFilter : ROI = ROI()
let defaultRoiPoints = [
Point2f(x: 0.10, y: 0.95),
Point2f(x: 0.46, y: 0.15),
Point2f(x: 0.54, y: 0.15),
Point2f(x: 0.90, y: 0.95)
]
let currentPixelHeight = pixelBufferWidth
let currentPixelWidth = pixelBufferHeight
if let roi = roiFilter.makeStaticRoi(withWidth: Int32(currentPixelWidth), frameHeight: Int32(currentPixelHeight), primaryPoints: defaultRoiPoints, secondaryPoints: defaultRoiPoints){
//Pass RoI to alertManager
alertManager.setRoi(roi: roi)
}
let objectRecognition = LSDRecognizedObject()
objectRecognition.uuid = UUID()
objectRecognition.label = "type"
objectRecognition.bbox = CGRect(x: 100, y: 100, width: 250, height: 250)
objectRecognition.frameTimeStamp = Date()
recognitions.append(objectRecognition)
// Add camera properties
let sensorSize = CGSize(width: 5.6, height: 4.2) //DISCLAIMER : iPhone XR/ 11
let cameraProperties = LSDCameraProperties(lensFacing: 0, sensorOrientation: UIDevice.current.orientation.isLandscape ? 90 : 0, sensorSize:sensorSize ,focalLength: Float(3.99), horizontalFov: 0.0, verticalFov: 0.0)
alertManager.cameraProperties = cameraProperties
// Entry type alerts
let alerts : [LSDAlert] = alertManager.determineAlerts(recognitions: recognitions, frameWidth: 640, frameHeight: 480, datetime: 1)