Raspberry Piで
準リアルタイム
オブジェクト検出
    
    
      ざっくり言うと
      
        YOLOを参考に、ラズパイのCPUでも準リアルタイムでObject Detectionを行えるCNN物体検出器を作った
      
    
    
      デモ
      
        
          - ノートPCで著作権フリーの動画を再生
 
          - PCの画面をUSB Webカメラで撮影
 
          - ラズパイで物体検出
 
          - ラズパイに繋いだディスプレイに結果描画
 
        
       
    
    
    
    
      3物体検出(高FPS版): 4.4FPS
      
        赤=乗り物,
        緑=動物,
        青=人
      
      
    
    
      3物体検出(低遅延版): 3.5FPS
      
        赤=乗り物,
        緑=動物,
        青=人
      
      
    
    
      どうやって作ったのか説明
      の前に
      ラズパイの性能紹介
    
    
      Raspberry Pi 3 Model B
      
        
          - 名刺サイズのシングルボードコンピュータ
 
          - Linuxが動く
 
          - CPU ARMv8 4Core
 
          - Memory 1GB
 
          - Disk 16GB(microSD)
 
        
       
    
    
    
    
      このCPU性能でリアルタイム処理をするためには
      
        
1. 外部APIを叩く!!
        2. モデル軽量化!!
      
    
    
      モデル選択
      
        YOLOをベースに作ることにした
        
          - RCNN系
            
          
 
          - SSD
            
              - ノード数を減らしたら成立しなくなりそう
 
              - 複雑で実装できる自信がなかった
 
            
           
          - YOLO
            
              - パラメータを削っても成立しそう
 
              - 実装できそうと思った(v1なら)
 
            
           
        
       
    
    
      YOLO
      
    
    
      今回作ったやつ
      
    
    
      今回作ったやつのCNN部
      
        - MobileNetベース
 
        - 元のフィルタ数は全て32の倍数
=> 全中間層のフィルタ数をn/32に変更して軽量化 
        - chainerで実装
 
      
     
       | n | モデルサイズ | 
       | 32(MobileNet Original) | 7.2MB | 
       | 3(顔検出) | 132KB | 
       
| 6(3物体検出) | 366KB | 
     
    
    
      学習データ
      
        - Pascal VOC 2007全データ + 2012学習データ
 
        - 顔検出: "head"を含む画像全てと、
含まない画像からランダムに選んだ2%を使用 
        - 3物体検出: 全画像を使い、オブジェクトをグループ化
          例: catもdogもhorseも全て"animal"として1ラベルに
         
        - データ拡張: 左右反転、ランダムクロップ
 
      
    
    
      GPUの活用
      
        - これだけ軽いモデルでも、GPUのほうが学習が速い
 
        - モデルが軽いため、GPUがコアもメモリもダダ余り
 
        - バッチサイズをガンガン上げる! => 精度が落ちた...
 
        - パラメータを少しずつ変えた学習ジョブを並列で実行し、最善パターンを採用
 
      
    
    
      デモのシステム構成(高FPS版)
      
      
        - worker processで分散処理し、CPUを使い切る
 
        - 検出結果をバッファし、撮影時刻でソートしてから描画する必要があることが遅延の一因になっている
 
      
    
    
      デモのシステム構成(低遅延版)
      
      
        - カメラ内バッファをbusy loopで捨て続ける
 
        - 検出完了が遅れたフレームは描画せず捨てる
 
        - 遅延は減る(1.54=>0.90)がFPSも落ちる(4.4=>3.5)
 
      
    
    
      今後
      
        - 
          
精度
          もうちょっと頑張る
         
        - 
          
Javascriptに移植
          
             - 
               Keras.jsかTensorFlow.jsに移植して
               スマホサイトに組み込み、
               ブラウザでリアルタイム処理させたい
              
            - ギガが減る心配なく配れるサイズ
 
            - GPU支援が効くらしい