Dictation 採点アプリ開発メモ vol.10

キカガクさんの講義の一環で作る自作アプリに関するメモです。

2020.10.18(日)〜10.20(火)

正解数 / 不正解数の表示... が遅れる

なんかうまくいかないので色々調べる。右上のUILabelが推論結果と一緒に返ってこない。右上の推論結果は正解数(OKの数)をカウントしている。しかし、なぜか推論結果が1回遅れて表示される。

画像1

正解数 / 不正解数の表示... が遅れるその2

推論をさせていると思われる箇所の前後にログを出力(printで)。色々試すとどうやら非同期処理している雰囲気。そのため同期処理の方法(と思われう方法)を実施。しかし、全く改善される様子ではない。

どうしたもんか...

        //予測
       DispatchQueue.global().sync{
           print("111")
           self.predict(image)
           self.correctRate.text = "\(numOfCorrect)"
//            self.correctRate.text = "after predict"
           print("222")
       }

参考にしたサイト

正解数 / 不正解数の表示... が遅れるその3

自分だけではどうにもならないので、shu223 さんのサロンメンバに相談

夜分にも関わらず多くのアドバイスを頂きました。しかもみなさん即レスで初心者でもわかる書き方で優しい。自分の表現が下手なのでうまく表現できないのですが、もっと分かりやすい言葉でのアドバイスです!

・UI操作ではglobal ではなくmain を使う
・override func draw で正解数をカウントしない
・グローバル変数は使わない
--- 以下3つのどれかを実施する ---
1) 処理方法例 セマフォを使う
2) 関数の返り値に正解数・不正解数を利用する
3) 計算結果を表示ボタンを表示する

これらのアドバイスを元に以下を試してみたところうまく行きました。
(同期処理、セマフォは実装できる気がしなかった。)

・グローバル変数は使わない
・override func draw で正解数をカウントしない
 → class DrawView: UIView 内にもう一つdraw 関数で計算していた正解カウントを再掲

※サンプルコードがベースなのであまり掲載できず...

    //正解数 不正解数を計算する
   func countCorrect() {
       if self.objects == nil {return}
       
       print("start countCorrect func")
       //Non-maximum suppressionの適用
       objectsForCount = nonMmaximumSuppression(objects)

       //カウントリセット
       self.numOfCorrect = 0
       self.numOfIncorrect = 0
       
       //検出結果 OK or NG をカウントする
       for object in objectsForCount {
           let label = object.labels.first!.identifier

           if label == "OK" {
               self.numOfCorrect += 1
           } else if label == "NG" {
               self.numOfIncorrect += 1
           }
       }
       print("Number of Correct: \(self.numOfCorrect)")
       print("Number of Incorrect: \(self.numOfIncorrect)")
       print("finish countCorrect func")
   }

関数の呼び出しはここ。この辺の勉強は必要だと思った。できる人に取ってはもっと綺麗にかけるコードだと思うけど、ひとまず計算結果を取得できたのは良かった。

                //(4)検出結果の取得
               self.drawView.setImageSize(image.size)
               self.drawView.objects =
                       (request.results as! [VNRecognizedObjectObservation])

               //UIの更新
               print("Start updating UI")
               self.drawView.setNeedsDisplay()
               
               //正解率算出
               self.drawView.countCorrect()

別の機会に使うかもしれないサイト(ライフサイクル)

同期 / 非同期処理


この記事が気に入ったらサポートをしてみませんか?