ãã¹ãŠã®ã³ãŒãã¯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ã¢ãŒããã¯ãã£ïŒäžåºŠã ãèŠãïŒã§ã¯ãç»åã¯ãµã€ãºã®ã°ãªããã«ãã£ãŠãããã¯ã«åå²ãããŸã ïŒãã®å Žå ïŒãããã³åãããã¯ã«ã€ããŠäºæž¬ãããŸã
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ãšã®å¯Ÿè©±ãéå§ããã«ã¯ãããã€ãã®ã¢ã¯ã·ã§ã³ãå®è¡ããå¿ èŠããããŸãã
- mvncGetDeviceNameãåŒã³åºããŠãNCSåãååŸããŸã
- mvncOpenDeviceã䜿çšããŠååã§ããã€ã¹ãéã
- ã°ã©ããã¡ã€ã«ã®å 容ããããã¡ã«ããŒãããŸãïŒãã®ããã®ç¹å¥ãªæ©èœã¯ãããŸãããç¬èªã®æ©èœã䜿çšããå¿ èŠããããŸãïŒ
- mvncAllocateGraphã䜿çšããŠèšç®ã°ã©ããé 眮ãã
ããŒã¿ãããŒãããŠçµæãååŸããã«ã¯ããããã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ã§å®è¡ã§ããããšã瀺ããŠããŸãã