Movidius Neural Compute Stickを䜿甚しおビデオの顔を怜出する

少し前たで、USBむンタヌフェむスを備えたニュヌラルネットワヌク甚のハヌドりェアアクセラレヌタであるMovidius Neural Compute StickNCSデバむスがリリヌスされたした。 私はロボット工孊の分野でのデバむスの朜圚的な䜿甚に興味があったので、私はそれを買っお、ある皮のニュヌラルネットワヌクを立ち䞊げるこずに決めたした。 ただし、NCSの既存の䟋のほずんどは画像分類の問題を解決するので、他の䜕か、぀たり顔怜出を詊しおみたかったです。 この出版物では、このような実隓䞭に埗られた経隓を共有したいず思いたす。



すべおのコヌドはGitHubにありたす 。



画像








NCSの詳现



Neural Compute Stickは、掚論段階でニュヌラルネットワヌク䞻に畳み蟌みを高速化するように蚭蚈されたデバむスです。 NCSをロボットたたはドロヌンに接続し、これに十分なコンピュヌティングリ゜ヌスがない堎所でニュヌラルネットワヌクを実行できるずいう考え方です。 たずえば、NCSはRaspberry Piに接続できたす。



このデバむスのフレヌムワヌク別名NCSDK には、PythonおよびC ++のAPIに加えお、ニュヌラルネットワヌクをNCSが理解できる圢匏にコンパむルし、各レむダヌでの蚈算にかかる時間を枬定し、ネットワヌクが機胜しおいるこずを確認できる䟿利なナヌティリティが含たれおいたす。 CaffeたたはTensorFlow圢匏の事前孊習枈みのニュヌラルネットワヌクを初期デヌタずしお䜿甚できたす。



モデル遞択



さお、顔怜出の問題を解決したいず思いたす。 発芋タスクには、Fast-RCNN / Faster-RCNNずYOLOずいう2぀の非垞に䞀般的なニュヌラルネットワヌクアヌキテクチャがありたす。 この段階でモデルをトレヌニングしたくなかったので、完成したモデルを探すこずにしたした。



難点は、NCSDKがCaffeおよびTensorFlowで利甚可胜なすべおの機胜をサポヌトしおいないため、任意のアヌキテクチャが単にコンパむルされない可胜性があるこずです。 たずえば、すべおのタむプのレむダヌがサポヌトされおいるわけではなく、アヌキテクチャヌには入力レむダヌが1぀だけ必芁ですCaffeの制限およびサポヌトされおいるレむダヌの完党なリストに぀いおは、 こちらを参照しおください 。 私が芋぀けた最初の顔怜出モデルFaster-RCNNは、䞡方の芁件を満たしおいたせんでした。



それから、 YOLOアヌキテクチャの蚓緎されたモデルに出䌚いたした。 唯䞀の問題は、アヌキテクチャ自䜓がNCSに適しおいるように芋えたものの、ニュヌラルネットワヌクがDarknet圢匏であったため、ニュヌラルネットワヌクをCaffe圢匏に倉換するずいうアむデアが浮䞊したした。



モデル倉換



モデルを倉換するために、 このプロゞェクトを䜿甚するこずにしたした 。これにより、Darknet、Pytorch、およびCaffe圢匏を切り替えるこずができたす。



コンバヌタヌをDockerコンテナヌで実行したす。これは、NCSDKによっおむンストヌルされたCaffeのバヌゞョンがコンバヌタヌを奜たなかったために珟れたトリックであり、システム構成には觊れたくありたせんでした。



sudo docker run -v `pwd`:/workspace/data \ -u `id -u` -ti dlconverter:latest bash -c \ "python ./pytorch-caffe-darknet-convert/darknet2caffe.py \ ./data/yolo-face.cfg ./data/yolo-face_final.weights \ ./data/yolo-face.prototxt ./data/yolo-face.caffemodel"
      
      





モデルは倉換されおいたすが、Crop、Dropout、Detectionなどのレむダヌが認識されないずいう譊告が衚瀺されるため、コンバヌタヌはそれらをスキップしたす。 これらのレむダヌを省くこずができたすか それはあなたができるこずが刀明したした。 Darknet コヌドをよく芋るず、次のこずがわかりたす。



クロップのようなレむダヌは、トレヌニング段階でのみ必芁です。 圌は、画像をランダムな角床で回転させ、そこからランダムな断片を切り取っお、遞択範囲を広げるこずに取り組んでいたす。 アプリケヌションの段階では、必須ではありたせん。



ドロップアりトはもう少し面癜いです。 ドロップアりトレむダヌは、䞻にトレヌニング段階でも必芁ですドロップアりトレむダヌは、ニュヌロンの出力を確率でリセットしたす 再トレヌニングを回避し、モデルの䞀般化胜力を高めるため。 適甚段階では、これを削陀できたすが、次の局の入力での倀の期埅倀が倉わらないようにニュヌロンの出力をスケヌリングする必芁がありたす。そのため、モデルの動䜜は保持されたす分割  Darknetコヌドを芋るず、ドロップアりトレむダヌが䞀郚の出力をリセットするだけでなく、他のすべおの出力をスケヌリングするため、ドロップアりトレむダヌを安党に削陀できるこずがわかりたす。



怜出局に぀いおは、最埌の局であり、最埌から2番目の局からの出力をより読みやすい圢匏に倉換し、トレヌニング段階での損倱関数も考慮したす。 損倱関数を考慮する必芁はありたせんが、結果を読み取り可胜な圢匏に倉換するず䟿利です。 最終的には、Darknetの最埌のレむダヌわずかに線集したの関数を䜿甚するこずにし、そこからNMS非最倧抑制-過剰な境界ボックスの削陀の関数を䜿甚したした。 それらはdetection_layer.cおよびdetection_layer.hファむルにありたす。



ここでは、最埌から2番目のレむダヌの機胜に぀いおコメントする䟡倀がありたす。 YOLOアヌキテクチャ䞀床だけ芋るでは、画像はサむズのグリッドによっおブロックに分割されたす 回 この堎合 、および各ブロックに぀いお予枬されたす 500䞇ドル+ cドル 倀 -各ブロックの境界ボックスの数、および -クラスの数。 倀自䜓は次のずおりです。それぞれの座暙、幅、高さ、および信頌倀 フレヌム぀たり、5぀の倀のみ、および各クラスのこのブロックでオブゞェクトを芋぀ける確率。 わかった  倀。 怜出レむダヌは、異なるデヌタ型のみを分離し、構造化された方法でそれらをもたらしたす。



1぀の問題が残っおいたす。コンバヌタヌは、NCSDKが解析できない入力レむダヌ圢匏の.prototxtファむルを生成したす。 違いはもっぱら装食的なものです。コンバヌタヌは、入力レむダヌのサむズを次の圢匏で蚘録したす。



 input_dim: x input_dim: y input_dim: z input_dim: w
      
      





そしお、ニュヌラルネットワヌクを理解可胜なNCSファむルにコンパむルする必芁があるmvNCCompileナヌティリティは、フォヌマットを衚瀺したいず考えおいたす。



 input_shape { dim: x dim: y dim: z dim: w }
      
      





Pythonスクリプトutils / fix_proto_input_format.pyは、この問題を解決するように蚭蚈されおいたす自分で実行するのではありたせん。



モデルのコンパむル



モデルがCaffe圢匏に倉換されたので、コンパむルできたす。 これは非垞に簡単に行われたす



 mvNCCompile -s 12 -o graph -w yolo-face.caffemodel yolo-face-fix.prototxt
      
      





このコマンドは、NCSが理解できる圢匏の蚈算グラフであるバむナリグラフファむルを生成する必芁がありたす。



画像の前凊理



蚈算グラフに読み蟌む前に、画像の凊理を適切に敎理するこずが重芁です。そうしないず、ニュヌラルネットワヌクが意図したずおりに機胜したせん。 ニュヌラルネットワヌクのデヌタずしお、OpenCVを䜿甚しお取埗したWebカメラのフレヌムを䜿甚したす。



Darknetのデモコヌドから刀断するず、画像をアップロヌドする前に、サむズに圧瞮する必芁がありたす 回 比率を心配するこずなく、セグメントに正芏化する 各ピクセルずチャネルの順序をBGRからRGBに反転したす。 䞀般に、CaffeずOpenCVでは、BGRオプションが暙準ず芋なされ、Darknet-RGBでは、コンバヌタヌはこれに぀いお䜕も認識しおいないため、チャネルを反転する必芁がありたす。



NCSぞのアクセスずデヌタのロヌド



ロボット工孊でのデバむスの䜿甚に焊点を圓おおおり、C ++ではより高い速床を達成できるず考えおいるため、PythonではなくC ++を䜿甚しおいるこずは泚目に倀したす。 このため、远加の問題が発生したす。蚈算グラフは入力を受け取り、fp16圢匏16ビット浮動小数点数でデヌタを出力したす。この実装はデフォルトではC ++では䜿甚できたせん。 NCSDKの䟋では、この問題はNumpyからプルされたfloattofp16およびfp16tofloat関数を䜿甚しお解決されるため、同じ゜リュヌションを䜿甚したす。



NCSずの察話を開始するには、いく぀かのアクションを実行する必芁がありたす。





デヌタをロヌドしお結果を取埗するには、それぞれmvncLoadTensor関数ずmvncGetResult関数が䜿甚されたす。 この堎合、デヌタず結果をfp16に、たたはその逆に倉換するこずを芚えおおく必芁がありたす。



NCSでの䜜業を停止するには、蚈算グラフに割り圓おられたリ゜ヌスを解攟しmvncDeallocateGraph、デバむスを閉じたすmvncCloseDevice。



NCSずやり取りするには非垞に倚くのアクションが必芁なため、コンストラクタヌずデストラクタヌに加えお2぀の関数のみを持぀ラッパヌクラスを䜜成したしたデバむスずグラフを初期化するload_fileず、デヌタをロヌドしお結果を取埗するload_tensorです。



プロファむラヌ



NCSDKには、各レむダヌのパフォヌマンスを評䟡するだけでなく、各芁玠の特性を瀺す蚈算グラフ図を䜜成できる䟿利なナヌティリティがありたすずころで、レむダヌの重み自䜓を転送する必芁はありたせん。



 mvNCProfile yolo-face-fix.prototxt -w yolo-face.caffemodel -s 12
      
      





結果ずしお䜕が起こったのか



最終結果は次のずおりです。



コンバヌタヌを䜿甚しお、元のモデル.cfgおよび.weightsはCaffe圢匏.prototxtおよび.caffemodelに倉換され、入力圢匏はPythonスクリプトを䜿甚しお.prototxtファむルで修正されたす。その埌、モデルはグラフファむルにコンパむルされたす。メむクファむル。



プログラム自䜓では、受信フレヌムごずに、前凊理、fp16圢匏ぞの倉換、および蚈算グラフぞのロヌドが実行されたす。 結果はfp16からfloat圢匏に倉換され、最埌の怜出レむダヌの動䜜をシミュレヌトする関数に枡されたす。 次に、非最倧抑制が適甚されたす。



デモは誇らしげに1秒あたり4.5フレヌムを生成したす-これは十分ではありたせん。 問題は、明らかに、このアヌキテクチャは、速床よりも正確さを重芖したタむプであるこずです。 Tiny YOLOのような「モバむル」アヌキテクチャを䜿甚するず、䜜業の速床を倧幅に䞊げるこずができたす。そのためには、新しいモデルを探すか、独自のトレヌニングを行う必芁がありたす。 ただし、この䟋は、Darknet圢匏のニュヌラルネットワヌクをコンパむルし、Neural Compute Stickで実行できるこずを瀺しおいたす。



All Articles