#解決したいこと
以下事象のようなエラー事象が発生する「原因特定」、「解決方法の理解」
#エラー事象
The app “testCoreML” on "実機端末名称" quit unexpectedly.
Domain: IDEDebugSessionErrorDomain
Code: 4
Failure Reason: Message from debugger: Terminated due to memory issue
System Information
macOS Version 11.1 (Build 20C69)
Xcode 12.4 (17801) (Build 12D4e)
Timestamp: 2021-04-18T09:41:33+09:00
ソース
https://github.com/d-ike99/PoseNet_sample/tree/tmp/testCoreML
問題発生の流れ
1. 本アプリを立ち上げ「読込」ボタンを押下すると、写真アプリを立ち上げる
2. 任意の動画を選択すると、選択した動画に対する「骨格検出の処理」を呼び出す
該当ソース:37行目
補足:poseNet.predict(imageRef)の部分
swift
1 // poseNetによる解析 2 do { 3 for time_i in (0..<time.value) { 4 /// 画像初期化 5 let imageRef: CGImage 6 7 /// 取得対象の画像指定 8 tmp_time.value = min(time.value, time_i) 9 imageRef = try imageGenerator.copyCGImage(at: tmp_time, actualTime: nil) 10 11 /// PoseNet解析時(delegateで、poseBuilder生成時)用に、一時画像を保存 12 self.tmpCGImage = imageRef 13 14 /// 予測(結果は、delegateにて処理を委譲) 15 poseNet.predict(imageRef) 16 17 /// 解析状況通知 18 if time_i % progress_time == 0 { 19 let progress_per: Double = Double(time_i) / Double(time.value) * 100 20 print("(String(format: "%.2f%", progress_per))/ % 解析完了 ") 21 } 22 } 23 } catch { 24 throw APIError.generateImage("画像変換失敗") 25 }
3.骨格検出の解析を行う ←これの実施中に、「エラー事象」が発生する
該当ソース:51行目
補足: print("predict delegate called")が呼ばれていない
swift
1 func predict(_ image: CGImage) { 2 3 DispatchQueue.global(qos: .userInitiated).async { 4 5 // Wrap the image in an instance of PoseNetInput to have it resized 6 // before being passed to the PoseNet model. 7 let input: MLFeatureProvider = PoseNetInput(image: image, size: self.modelInputSize) 8 9 // 予測結果を格納する(prediction) 10 guard let prediction: MLFeatureProvider = try? self.poseNetMLModel.prediction(from: input) else { 11 return 12 } 13 14 let poseNetOutput = PoseNetOutput(prediction: prediction, 15 modelInputSize: self.modelInputSize, 16 modelOutputStride: self.outputStride) 17 18 DispatchQueue.main.async { 19 print("predict delegate called") 20 self.delegate?.poseNet(self, didPredict: poseNetOutput) 21 } 22 } 23 }
#補足
swift1年半で今更かもですが、先日メモリ管理においてweak(弱参照)が重要ということを知りました。
"3.骨格検出の解析を行う"でのソースが、メモリリークに該当する部分なのかな?
と思いつつもそこから何を調べていけば良いのか?わからない状況です。
もし、上記だけでは検討つけられない場合、調査方法などご提示いただくだけでも助かります。
回答1件
あなたの回答
tips
プレビュー