ããã³ããšã³ãã«ãããã³ã³ãã¥ãŒã¿ããžã§ã³ã®åœ¢ç¶æ€åºãããã©ãŒãã³ã¹ã«äžãã圱é¿ãæ¢ããŸããåŠçãªãŒããŒããããæé©åæŠç¥ãå¹ççãªWebã¢ããªæ§ç¯ã®ãã¹ããã©ã¯ãã£ã¹ã解説ã
ããã³ããšã³ãåœ¢ç¶æ€åºã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ïŒã³ã³ãã¥ãŒã¿ããžã§ã³åŠçã®ãªãŒããŒããããçè§£ãã
ã³ã³ãã¥ãŒã¿ããžã§ã³æ©èœãããã³ããšã³ãã®Webã¢ããªã±ãŒã·ã§ã³ã«çµ±åããããšã§ãæ¡åŒµçŸå®äœéšããã€ã³ããªãžã§ã³ããªãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãŸã§ãåºæ¿çãªå¯èœæ§ã®äžçãåºãããŸãããã³ã³ãã¥ãŒã¿ããžã§ã³ã®äžæ žçãªã¿ã¹ã¯ã®äžã€ã«åœ¢ç¶æ€åºããããŸããããã¯ãç»åããããªã¹ããªãŒã å ããç¹å®ã®å¹ŸäœåŠç圢ç¶ãèå¥ããäœçœ®ãç¹å®ããããã»ã¹ã§ããå¿çšç¯å²ã¯åºå€§ã§ãããåœ¢ç¶æ€åºã®èšç®èŠæ±ã¯ããã³ããšã³ãã®ããã©ãŒãã³ã¹ã«å€§ããªåœ±é¿ãäžããå¯èœæ§ããããŸãããã®ããã°èšäºã§ã¯ããã®åŠçãªãŒããŒãããã®è€éããæãäžãããã®åå ãçµæããããŠéçºè ããã®åœ±é¿ã軜æžããããã«æ¡çšã§ããæŠç¥ã«ã€ããŠæ¢ããŸãã
ããã³ããšã³ãã³ã³ãã¥ãŒã¿ããžã§ã³ã®å°é
åŸæ¥ãè€éãªã³ã³ãã¥ãŒã¿ããžã§ã³ã¿ã¹ã¯ã¯ããã®èšå€§ãªåŠçèŠä»¶ã®ããã«ã匷åãªããã¯ãšã³ããµãŒããŒã«å§ããããŠããŸããããããããã©ãŠã¶æè¡ã®é²æ©ããã匷åãªã¯ã©ã€ã¢ã³ãããã€ã¹ã®æ®åããããŠæé©åãããJavaScriptã©ã€ãã©ãªãWebAssemblyã®ç»å Žã«ãããããã³ããšã³ãã®ã³ã³ãã¥ãŒã¿ããžã§ã³ã¯æ°äž»åãããŸããããã®å€åã«ããã以äžã®ããšãå¯èœã«ãªããŸãïŒ
- ãªã¢ã«ã¿ã€ã ã®ã€ã³ã¿ã©ã¯ãã£ããã£ïŒã¢ããªã±ãŒã·ã§ã³ã¯ãããã¯ãŒã¯ã®é å»¶ãªããèŠèŠçãªæãããã«å³åº§ã«å¿çã§ããŸãã
- ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®åäžïŒããæ²¡å ¥æã®ããçŽæçãªã€ã³ã¿ã©ã¯ã·ã§ã³ãå¯èœã«ãªããŸãã
- ãã©ã€ãã·ãŒãšã»ãã¥ãªãã£ïŒæ©å¯æ§ã®é«ãèŠèŠããŒã¿ãããŒã«ã«ã§åŠçã§ãããããå€éšã«éä¿¡ããå¿ èŠæ§ãæžå°ããŸãã
- ãªãã©ã€ã³æ©èœïŒã€ã³ã¿ãŒãããæ¥ç¶ããªããŠããäž»èŠãªã³ã³ãã¥ãŒã¿ããžã§ã³æ©èœãåäœããŸãã
åœ¢ç¶æ€åºã¯ããããã®ã¢ããªã±ãŒã·ã§ã³ã®å€ãã«ãšã£ãŠåºç€çãªèŠçŽ ã§ããã€ã³ã¿ã©ã¯ã·ã§ã³ã®ããã®ãã¿ã³ã®èå¥ãã²ãŒã ã®ããã®ãªããžã§ã¯ã远跡ãã¢ã¯ã»ã·ããªãã£ããŒã«ã®ããã®èŠèŠå ¥åã®åæãªã©ããã®æ£ç¢ºã§å¹ççãªå®è£ ãæãéèŠã§ãã
åœ¢ç¶æ€åºãšã¯äœãããªãèšç®è² è·ãé«ãã®ãïŒ
åœ¢ç¶æ€åºã¢ã«ãŽãªãºã ã¯ãç»åå ã§äºåã«å®çŸ©ããã幟äœåŠç圢ç¶ïŒäŸïŒåãæ£æ¹åœ¢ãé·æ¹åœ¢ãæ¥åïŒããããè€éãªèŒªéã«å¯Ÿå¿ãããã¿ãŒã³ãèŠã€ããããšãç®çãšããŠããŸãããã®ããã»ã¹ã«ã¯éåžžãããã€ãã®æ®µéãå«ãŸããŸãïŒ
- ç»åååŸïŒã«ã¡ã©ãããã¬ãŒã ããã£ããã£ããããç»åãèªã¿èŸŒã¿ãŸãã
- ååŠçïŒãã€ãºãªãã¯ã·ã§ã³ïŒäŸïŒã¬ãŠã·ã¢ã³ãã©ãŒïŒãè²ç©ºé倿ïŒäŸïŒã°ã¬ãŒã¹ã±ãŒã«åïŒãã³ã³ãã©ã¹ã匷調ãªã©ã®æè¡ãé©çšããŠãç»åã®å質ãåäžãããé¢é£ããç¹åŸŽã匷調ããŸãã
- ç¹åŸŽæœåºïŒåœ¢ç¶ã圢æããå¯èœæ§ãé«ãé¡èãªç¹ããšããžããŸãã¯é åãèå¥ããŸããããã§ã¯CannyãSobelãªã©ã®ãšããžæ€åºã¢ã«ãŽãªãºã ãäžè¬çã«äœ¿çšãããŸãã
- 圢ç¶ã®è¡šçŸãšãããã³ã°ïŒæœåºãããç¹åŸŽããæ¢ç¥ã®åœ¢ç¶ã¢ãã«ãšæ¯èŒã§ãã衚çŸã«å€æããŸããããã«ã¯ããã倿ã茪éè§£æããŸãã¯æ©æ¢°åŠç¿ã¢ãã«ãªã©ã®æè¡ãå«ãŸããå ŽåããããŸãã
- åŸåŠçïŒèª€æ€åºãé€å€ããæ€åºããã圢ç¶ãã°ã«ãŒãåãããããã®ããããã£ïŒäŸïŒäœçœ®ããµã€ãºãåãïŒã決å®ããŸãã
ãããã®å段éãç¹ã«ç¹åŸŽæœåºãšåœ¢ç¶ã®è¡šçŸ/ãããã³ã°ã¯ãããªãã®æ°ã®æ°åŠçæŒç®ã䌎ãå¯èœæ§ããããŸããäŸãã°ã次ã®ããã«ãªããŸãïŒ
- ç³ã¿èŸŒã¿æŒç®ïŒãšããžæ€åºããã©ãŒåŠçã¯ç³ã¿èŸŒã¿ã«å€§ããäŸåããŠãããç¹ã«é«è§£å床ç»åã§ã¯èšç®ã³ã¹ããé«ããªããŸãã
- ãã¯ã»ã«åäœã®æäœïŒã°ã¬ãŒã¹ã±ãŒã«å€æããããå€åŠçããã®ä»ã®å€æã§ã¯ãç»åå ã®ãã¹ãŠã®ãã¯ã»ã«ãå埩åŠçããå¿ èŠããããŸãã
- è€éãªæ°åŠç倿ïŒç·ãåãæ€åºããããã®äžè¬çãªææ³ã§ãããã倿ã¯ãç»åç¹ããã©ã¡ãŒã¿ç©ºéã«å€æããå¿ èŠããããèšç®è² è·ãé«ããªãå¯èœæ§ããããŸãã
- å埩ã¢ã«ãŽãªãºã ïŒå€ãã®ç¹åŸŽæœåºããã³ãããã³ã°ã¢ã«ãŽãªãºã ã¯ãç»åããŒã¿ã«å¯ŸããŠå€æ°ã®ãã¹ãå¿ èŠãšããå埩ããã»ã¹ãæ¡çšããŠããŸãã
ãããã®æäœãé£ç¶çãªãããªãã¬ãŒã ã¹ããªãŒã ã«å¯ŸããŠå®è¡ããããšããã®æ°ã¯åå¢ããã¯ã©ã€ã¢ã³ãããã€ã¹ã«å€§ããªåŠçãªãŒããŒãããããããããŸãã
ããã³ããšã³ãåœ¢ç¶æ€åºã«ãããããã©ãŒãã³ã¹ã®ããã«ããã¯
åœ¢ç¶æ€åºã®åŠçãªãŒããŒãããã¯ãããã³ããšã³ãã§ããã€ãã®ããã©ãŒãã³ã¹ããã«ããã¯ãšããŠçŸããŸãïŒ
1. é«ãCPU䜿çšç
ã»ãšãã©ã®JavaScriptããŒã¹ã®ã³ã³ãã¥ãŒã¿ããžã§ã³ã©ã€ãã©ãªã¯ããã®ã¢ã«ãŽãªãºã ãã¡ã€ã³ã¹ã¬ãããŸãã¯Web Workerå ã§å®è¡ããŸããåœ¢ç¶æ€åºãå®è¡ãããŠãããšããç¹ã«ãªã¢ã«ã¿ã€ã ã®å ŽåãCPUã®åŠçèœåã®å€§éšåãæ¶è²»ããå¯èœæ§ããããŸããããã«ããã以äžã®ãããªäºæ ã«ã€ãªãããŸãïŒ
- å¿çããªããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ïŒUIã®ã¬ã³ããªã³ã°ããŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ïŒã¯ãªãã¯ãã¹ã¯ããŒã«ãã¿ã€ãã³ã°ïŒãæ åœããã¡ã€ã³ã¹ã¬ãããåŠçã§è©°ãŸã£ãŠããŸããŸããããã«ãããã¢ãã¡ãŒã·ã§ã³ãã«ã¯ã€ãããããŠãŒã¶ãŒå ¥åãžã®å¿çãé ããããå šäœçã«åäœãéããšã¯ã¹ããªãšã³ã¹ã«ãªããŸãã
- ããŒãžèªã¿èŸŒã¿æéã®é·æåïŒæåã®åœ¢ç¶æ€åºããžãã¯ãéãå ŽåãããŒãžã®ã€ã³ã¿ã©ã¯ãã£ããªæ®µéãé ããå¯èœæ§ããããŸãã
- ããããªãŒã®æ¶èïŒã¢ãã€ã«ããã€ã¹ã§ã®ç¶ç¶çãªé«ãCPU䜿çšçã¯ãããããªãŒå¯¿åœãèããæ¶èãããŸãã
2. ã¡ã¢ãªæ¶è²»éã®å¢å
ç»åãäžéããŒã¿æ§é ã®åŠçã«ã¯ãããªãã®ã¡ã¢ãªãå¿ èŠã§ãã倧ããªç»åãæéçåæã®ããã®ã¡ã¢ãªå ã®è€æ°ãã¬ãŒã ãç¹åŸŽè¡šçŸã®ããã®è€éãªããŒã¿æ§é ã¯ãå©çšå¯èœãªRAMãæ¥éã«æ¶è²»ããå¯èœæ§ããããŸããããã¯ã以äžã®ãããªäºæ ã«ã€ãªããå¯èœæ§ããããŸãïŒ
- ãã©ãŠã¶ã®ã¯ã©ãã·ã¥ãŸãã¯é床äœäžïŒã¡ã¢ãªå¶éãè¶ ãããšããã©ãŠã¶ã®ã¿ããŸãã¯ãã©ãŠã¶å šäœãäžå®å®ã«ãªãå¯èœæ§ããããŸãã
- ä»ã®ã¢ããªã±ãŒã·ã§ã³ãžã®åœ±é¿ïŒã¢ãã€ã«ããã€ã¹ã§ã¯ãWebã¢ããªã±ãŒã·ã§ã³ã«ããéå°ãªã¡ã¢ãªäœ¿çšããå®è¡äžã®ä»ã®ã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããŸãã
3. ãã¬ãŒã ã¬ãŒãã®äœäž
ãããªã¹ããªãŒã ïŒäŸïŒã©ã€ãã«ã¡ã©ãã£ãŒãïŒã«äŸåããã¢ããªã±ãŒã·ã§ã³ã§ã¯ãç®æšã¯ãã°ãã°æ»ãããªãã¬ãŒã ã¬ãŒãïŒäŸïŒæ¯ç§30ãã¬ãŒã 以äžïŒãéæããããšã§ããåœ¢ç¶æ€åºã®åŠçãåäžãã¬ãŒã ã«å²ãåœãŠãããæéãããé·ãããããšããã¬ãŒã ã¬ãŒãã¯äœäžããŸããããã«ããã以äžã®ãããªçµæã«ãªããŸãïŒ
- ã«ã¯ã€ããããªåçïŒæ åãéåãéåãã§äžèªç¶ã«èŠããŸãã
- 粟床ã®äœäžïŒãã¬ãŒã ã¬ãŒããäœãããã«åœ¢ç¶ãæ£çºçã«ããæ€åºãããªãå Žåãã¢ããªã±ãŒã·ã§ã³ã®æå¹æ§ãäœäžããŸãã
- ã€ãã³ãã®èŠéãïŒãã¬ãŒã éã§éèŠãªèŠèŠçå€åãèŠéãããå¯èœæ§ããããŸãã
4. ãããã¯ãŒã¯ãžã®åœ±é¿ïŒéæ¥çïŒ
åœ¢ç¶æ€åºèªäœã¯ã¯ã©ã€ã¢ã³ããµã€ãã®ããã»ã¹ã§ãããéå¹ççãªå®è£ ã¯éæ¥çã«ãããã¯ãŒã¯äœ¿çšéã«åœ±é¿ãäžããå¯èœæ§ããããŸããäŸãã°ãã¢ããªã±ãŒã·ã§ã³ãç»åãååã«éãåŠçã§ããªãããã«åžžã«ç»åããããªã¹ããªãŒã ãåèŠæ±ããå ŽåããåŠçã®ããã«çã®ç»åããŒã¿ããµãŒããŒã«éä¿¡ãããã©ãŒã«ããã¯ãå¿ èŠã«ãªãå Žåããããã¯ãŒã¯ãªãœãŒã¹ãäžå¿ èŠã«æ¶è²»ãããŸãã
ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããèŠå
ããã³ããšã³ãã®åœ¢ç¶æ€åºã®å šäœçãªããã©ãŒãã³ã¹ãžã®åœ±é¿ã«ã¯ãããã€ãã®èŠå ãå¯äžããŸãïŒ
1. ç»åã®è§£å床ãšãµã€ãº
å ¥åç»åã倧ãããè§£å床ãé«ãã»ã©ãåŠçããå¿ èŠã®ãããã¯ã»ã«ãå€ããªããŸãã1080pã®ç»åã¯540pã®ç»åã®4åã®ãã¯ã»ã«æ°ãæã£ãŠããŸããããã¯ãã»ãšãã©ã®ã¢ã«ãŽãªãºã ã§èšç®è² è·ãçŽæ¥çã«å¢å ããŸãã
2. ã¢ã«ãŽãªãºã ã®è€éã
åœ¢ç¶æ€åºã¢ã«ãŽãªãºã ã«ãã£ãŠèšç®ã®è€éãã¯ç°ãªããŸããåºæ¬çãªèŒªéæ€åºã®ãããªåçŽãªã¢ã«ãŽãªãºã ã¯é«éãããããŸãããå ç¢æ§ã«æ¬ ããäžæ¹ããã£ãŒãã©ãŒãã³ã°ããŒã¹ã®ç©äœæ€åºïŒåœ¢ç¶æ€åºã«ã䜿çšå¯èœïŒã®ãããªããè€éãªææ³ã¯éåžžã«æ£ç¢ºã§ãããã¯ããã«èŠæ±ãé«ããªããŸãã
3. æ€åºãã圢ç¶ã®æ°ãšçš®é¡
åäžã®æç¢ºãªåœ¢ç¶ãæ€åºããããšã¯ãè€æ°ã®ããŸããŸãªåœ¢ç¶ã®ã€ã³ã¹ã¿ã³ã¹ãåæã«èå¥ãããããè² è·ãå°ãªãã§ãããã¿ãŒã³ãããã³ã°ãšæ€èšŒã¹ãããã®è€éãã¯ãæ±ãããã圢ç¶ã®æ°ãšå€æ§æ§ãšãšãã«å¢å ããŸãã
4. ãããªã®ãã¬ãŒã ã¬ãŒããšã¹ããªãŒã å質
é«ãã¬ãŒã ã¬ãŒãïŒäŸïŒ60 FPSïŒã§é£ç¶ãããªã¹ããªãŒã ãåŠçããã«ã¯ãåãã¬ãŒã ã®åœ¢ç¶æ€åºãã€ãã©ã€ã³ãéåžžã«çãæéäºç®ïŒãã¬ãŒã ãããçŽ16msïŒå ã«å®äºãããå¿ èŠããããŸãããããªã¹ããªãŒã ã®ç §æãæªããã¢ãŒã·ã§ã³ãã©ãŒããªã¯ã«ãŒãžã§ã³ãªã©ãæ€åºãè€éã«ããåŠçæéãå¢å ãããå¯èœæ§ããããŸãã
5. ããã€ã¹ã®èœå
ãŠãŒã¶ãŒã®ããã€ã¹ã®åŠçèœåãå©çšå¯èœãªRAMãã°ã©ãã£ãã¯ã¹èœåãæ±ºå®çãªåœ¹å²ãæãããŸãããã€ãšã³ãã®ãã¹ã¯ãããã³ã³ãã¥ãŒã¿ã¯ãäœäŸ¡æ Œåž¯ã®æºåž¯é»è©±ãããã¯ããã«ããŸãåœ¢ç¶æ€åºã¿ã¹ã¯ãåŠçããŸãã
6. å®è£ èšèªãšã©ã€ãã©ãª
ããã°ã©ãã³ã°èšèªïŒJavaScript察WebAssemblyïŒã®éžæãšã䜿çšãããã³ã³ãã¥ãŒã¿ããžã§ã³ã©ã€ãã©ãªã®æé©åã¬ãã«ã¯ãããã©ãŒãã³ã¹ã«å€§ãã圱é¿ããŸãããã€ãã£ãã³ã³ãã€ã«ãããã³ãŒãïŒWebAssemblyïŒã¯äžè¬çã«ãèšç®éçŽçãªã¿ã¹ã¯ã«ã¯ã€ã³ã¿ããªã¿åã®JavaScriptãããåªããŠããŸãã
ããã³ããšã³ãåœ¢ç¶æ€åºã®ããã©ãŒãã³ã¹ãæé©åããããã®æŠç¥
åœ¢ç¶æ€åºã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ã軜æžããã«ã¯ãã¢ã«ãŽãªãºã ã®å¹çæ§ãããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã®æŽ»çšããããŠèšç®ãªãœãŒã¹ã广çã«ç®¡çããããšã«çŠç¹ãåœãŠãå€é¢çãªã¢ãããŒããå¿ èŠã§ãã
1. ã¢ã«ãŽãªãºã ã®æé©å
a. é©åãªã¢ã«ãŽãªãºã ã®éžæ
ãã¹ãŠã®åœ¢ç¶æ€åºåé¡ãæãè€éãªè§£æ±ºçãå¿ èŠãšããããã§ã¯ãããŸãããã¢ããªã±ãŒã·ã§ã³ã®ç¹å®ã®ããŒãºãè©äŸ¡ããŠãã ããïŒ
- åçŽãªåœ¢ç¶ïŒæ£æ¹åœ¢ãåã®ãããªåºæ¬çãªå¹ŸäœåŠç圢ç¶ã«ã¯ããã倿ã茪éããŒã¹ã®ææ³ïŒäŸïŒOpenCVã®`cv2.findContours`ãJSçšã«ã©ããããããã®ïŒãå¹ççã§ãã
- è€éãŸãã¯å€æ§ãªåœ¢ç¶ïŒããè€éãªããŸãã¯ãªããžã§ã¯ãã®ãããªåœ¢ç¶ã«ã¯ãç¹åŸŽããŒã¹ã®ãããã³ã°ïŒäŸïŒSIFTãSURF - ãããã¯èšç®ã³ã¹ããé«ãå ŽåããããŸãïŒãã粟床ãæãéèŠã§ããã°è»œéãªäºååŠç¿æžã¿ãã¥ãŒã©ã«ãããã¯ãŒã¯ãæ€èšããŸãã
b. ååŠçã®æé©å
ååŠçã¯é倧ãªããã«ããã¯ã«ãªãå¯èœæ§ããããŸããå¿ èŠãªååŠçã¹ãããã®ã¿ãéžæããŠãã ããïŒ
- ããŠã³ãµã³ããªã³ã°ïŒæ¥µç«¯ãªè©³çްãå¿ èŠãªãå Žåã¯ãåŠçåã«ç»åãããå°ããè§£å床ã«ãªãµã€ãºããããšã§ãåæãããã¯ã»ã«æ°ãåçã«æžããããšãã§ããŸãã
- è²ç©ºéïŒå€ãã®å Žåãã°ã¬ãŒã¹ã±ãŒã«ãžã®å€æã§ååã§ãããRGBãšæ¯èŒããŠããŒã¿ã®è€éãã軜æžããŸãã
- é©å¿çãããå€åŠçïŒç §æã®å€åã«ææãªã°ããŒãã«ãããå€åŠçã®ä»£ããã«ãé©å¿çãªææ³ã¯ããå°ãªãå埩ã§ããè¯ãçµæãçã¿åºãããšãã§ããŸãã
c. å¹ççãªèŒªéæ€åº
茪éããŒã¹ã®ææ³ã䜿çšããå Žåãæé©åãããå®è£ ã䜿çšããŠããããšã確èªããŠãã ãããã©ã€ãã©ãªã§ã¯ã茪éç¹ã®æ°ãšåŠçæéãåæžã§ããååŸã¢ãŒããè¿äŒŒæ¹æ³ãæå®ã§ããããšããããããŸããäŸãã°ãå€éšèŒªéã®ã¿ãååŸããããããªãŽã³è¿äŒŒã䜿çšãããããããšã§ãèšç®ãç¯çŽã§ããŸãã
2. ããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã®æŽ»çš
a. WebAssembly (Wasm)
ããã¯ãããããCPUããŠã³ããªã¿ã¹ã¯ã«ãšã£ãŠæã圱é¿åã®ããæŠç¥ã§ããOpenCVãFLANNããŸãã¯ã«ã¹ã¿ã C++ã³ãŒããªã©ã®é«æ§èœã³ã³ãã¥ãŒã¿ããžã§ã³ã©ã€ãã©ãªãWebAssemblyã«ã³ã³ãã€ã«ããããšã§ããã©ãŠã¶å ã§ã»ãŒãã€ãã£ãã®é床ã§å®è¡ã§ããŸããããã«ãããã€ã³ã¿ããªã¿åJavaScriptã®ããã©ãŒãã³ã¹äžã®å¶éã®å€ããåé¿ããŸãã
- äŸïŒC++ã®åœ¢ç¶æ€åºã¢ãžã¥ãŒã«ãWebAssemblyã«ç§»æ€ãããšãçŽç²ãªJavaScriptå®è£ ãšæ¯èŒããŠ10åãã100åã®ããã©ãŒãã³ã¹åäžãåŸãããå ŽåããããŸãã
b. WebGL/GPUã¢ã¯ã»ã©ã¬ãŒã·ã§ã³
ã°ã©ãã£ãã¯ã¹ããã»ãã·ã³ã°ãŠãããïŒGPUïŒã¯äžŠååŠçã«éåžžã«åªããŠãããã³ã³ãã¥ãŒã¿ããžã§ã³ã§äžè¬çãªç»åæäœãæ°åŠçæŒç®ã«çæ³çã§ããWebGLã¯JavaScriptã«GPUãžã®ã¢ã¯ã»ã¹ãæäŸããŸãã
- ã³ã³ãã¥ãŒãã·ã§ãŒããŒïŒç»å Žãã€ã€ããæè¡ïŒïŒæ±çšèšç®ã«ã¯ãŸã æ®éçã«ãµããŒããããŠããŸããããã³ã³ãã¥ãŒãã·ã§ãŒããŒã®ããã®æ°ããæšæºããã©ãŠã¶APIã¯ãCVã¿ã¹ã¯ã«å¯ŸããŠããã«çŽæ¥çãªGPUã¢ã¯ã»ã¹ãæäŸããã§ãããã
- ã©ã€ãã©ãªïŒTensorFlow.jsãPyodideïŒOpenCVãã€ã³ãã£ã³ã°ã®ãããªPythonã©ã€ãã©ãªãå®è¡å¯èœïŒããŸãã¯ç¹æ®ãªWebGL CVã©ã€ãã©ãªã®ãããªã©ã€ãã©ãªã¯ãèšç®ãGPUã«ãªãããŒãã§ããŸããåçŽãªç»åãã£ã«ã¿ãŒã§ãããWebGLã·ã§ãŒããŒã䜿çšããŠå¹ççã«å®è£ ã§ããŸãã
3. ãªãœãŒã¹ç®¡çãšéåæåŠç
a. Web Workers
ã¡ã€ã³ã¹ã¬ãããããªãŒãºããã®ãé²ããããåœ¢ç¶æ€åºã®ãããªèšç®éçŽçãªã¿ã¹ã¯ã¯Web Workersã«ãªãããŒããã¹ãã§ãããããã¯UIããããã¯ããããšãªãæäœãå®è¡ã§ããããã¯ã°ã©ãŠã³ãã¹ã¬ããã§ããã¡ã€ã³ã¹ã¬ãããšã¯ãŒã«ãŒéã®éä¿¡ã¯ã¡ãã»ãŒãžããã·ã³ã°ãä»ããŠè¡ãããŸãã
- å©ç¹ïŒåœ¢ç¶æ€åºãããã¯ã°ã©ãŠã³ãã§å®è¡ãããŠããéãUIã¯å¿çæ§ãä¿ã¡ãŸãã
- èæ ®äºé ïŒã¹ã¬ããéã§å€§éã®ããŒã¿ïŒç»åãã¬ãŒã ãªã©ïŒã転éãããšããªãŒããŒããããçºçããå¯èœæ§ããããŸããå¹ççãªããŒã¿ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ãšè»¢éãéµãšãªããŸãã
b. ã¹ããããªã³ã°ãšãããŠã³ã¹
åœ¢ç¶æ€åºããŠãŒã¶ãŒã®ã¢ã¯ã·ã§ã³ãé »ç¹ãªã€ãã³ãïŒäŸïŒããŠã¹ã®åãããŠã£ã³ããŠã®ãªãµã€ãºïŒã«ãã£ãŠããªã¬ãŒãããå Žåãã€ãã³ããã³ãã©ãã¹ããããªã³ã°ãŸãã¯ãããŠã³ã¹ããããšã§ãæ€åºããã»ã¹ã®å®è¡é »åºŠãå¶éã§ããŸããã¹ããããªã³ã°ã¯é¢æ°ãæå®ãããééããšã«æå€§1ååŒã³åºãããããšãä¿èšŒãããããŠã³ã¹ã¯éã¢ã¯ãã£ããªæéã®åŸã«ã®ã¿åŒã³åºãããããšãä¿èšŒããŸãã
c. ãã¬ãŒã ã¹ããããšé©å¿åãã¬ãŒã ã¬ãŒã
ãããªã¹ããªãŒã ãããã¹ãŠã®ãã¬ãŒã ãåŠçããããšãã代ããã«ãç¹ã«æ§èœã®äœãããã€ã¹ã§ã¯ããã¬ãŒã ã¹ããããæ€èšããŠãã ãããNçªç®ããšã®ãã¬ãŒã ãåŠçããŸãããããã¯ãé©å¿åãã¬ãŒã ã¬ãŒãå¶åŸ¡ãå®è£ ããŸãïŒ
- ãã¬ãŒã ã®åŠçã«ãããæéãç£èŠããŸãã
- åŠçã«æéãããããããå Žåã¯ããã¬ãŒã ãã¹ãããããããåŠçè§£å床ãäžããŸãã
- åŠçãéãå Žåã¯ãããå€ãã®ãã¬ãŒã ãåŠçããããããé«ãå質ã§åŠçãããããäœè£ããããŸãã
4. ç»åãšããŒã¿ã®åãæ±ãã®æé©å
a. å¹ççãªç»å衚çŸ
ç»åããŒã¿ãå¹ççã«è¡šçŸããæ¹æ³ãéžæããŠãã ããããã©ãŠã¶ã§`ImageData`ãªããžã§ã¯ãã䜿çšããã®ã¯äžè¬çã§ãããããããã©ã®ããã«æäœãããããèæ ®ããŠãã ãããTyped ArraysïŒ`Uint8ClampedArray`ã`Float32Array`ãªã©ïŒã¯ãçã®ãã¯ã»ã«ããŒã¿ãæ±ãéã«ããã©ãŒãã³ã¹ã«ãšã£ãŠéèŠã§ãã
b. ROIïŒé¢å¿é åïŒã®éžæ
圢ç¶ãçŸããããªå€§ãŸããªé åãããã£ãŠããå Žåã¯ãæ€åºããã»ã¹ããã®ç»åã®ç¹å®ã®é åã«éå®ããŸããããã«ãããåæãå¿ èŠãªããŒã¿éãåçã«åæžããŸãã
c. ç»åã®ã¯ãããã³ã°
ROIãšåæ§ã«ãéçãŸãã¯åçã«å ¥åç»åãé¢é£ããèŠèŠæ å ±ã®ã¿ãå«ãããã«ã¯ãããã§ããã°ãåŠçã®è² æ ãå€§å¹ ã«è»œæžããŸãã
5. ããã°ã¬ãã·ããšã³ãã³ã¹ã¡ã³ããšãã©ãŒã«ããã¯
ã¢ããªã±ãŒã·ã§ã³ãããã°ã¬ãã·ããšã³ãã³ã¹ã¡ã³ãã念é ã«çœ®ããŠèšèšããŸããé«åºŠãªã³ã³ãã¥ãŒã¿ããžã§ã³ã«èŠåŽããå¯èœæ§ã®ããå€ããŸãã¯æ§èœã®äœãããã€ã¹ã§ããã³ã¢æ©èœãå©çšå¯èœã§ããããšã確èªããŠãã ããããã©ãŒã«ããã¯ãæäŸããŠãã ããïŒ
- åºæ¬æ©èœïŒããåçŽãªæ€åºæ¹æ³ããèŠæ±ã®å°ãªãæ©èœã»ããã
- ãµãŒããŒãµã€ãåŠçïŒéåžžã«è€éãªã¿ã¹ã¯ã«ã¯ãåŠçããµãŒããŒã«ãªãããŒããããªãã·ã§ã³ãæäŸããŸãããããã«ã¯é å»¶ãçºçãããããã¯ãŒã¯æ¥ç¶ãå¿ èŠã§ãã
ã±ãŒã¹ã¹ã¿ãã£ãšåœéçãªäºäŸ
ãããã®ååãçŸå®äžçã®ã°ããŒãã«ãªã¢ããªã±ãŒã·ã§ã³ã§ã©ã®ããã«é©çšãããŠããããèŠãŠã¿ãŸãããïŒ
1. ã€ã³ã¿ã©ã¯ãã£ãã¢ãŒãã€ã³ã¹ã¿ã¬ãŒã·ã§ã³ïŒäžçäžã®çŸè¡é€šïŒ
å€ãã®çŸä»£ã¢ãŒãã€ã³ã¹ã¿ã¬ãŒã·ã§ã³ã¯ãã€ã³ã¿ã©ã¯ãã£ããªäœéšãåµãåºãããã«ã¢ãŒã·ã§ã³æ€åºã圢ç¶èªèã䜿çšããŠããŸããäŸãã°ãã€ã³ã¹ã¿ã¬ãŒã·ã§ã³ã蚪åè ã®åãã圌ããäœã§åœ¢æãã圢ç¶ã«åå¿ããããšããããŸããããŸããŸãªèšªåè ã®ããã€ã¹èœåããããã¯ãŒã¯ç¶æ³ïŒããšãã³ã¢åŠçãããŒã«ã«ã§ãã£ãŠãïŒã§ã¹ã ãŒãºãªã€ã³ã¿ã©ã¯ã·ã§ã³ã確ä¿ããããã«ãéçºè ã¯ãã°ãã°æ¬¡ã®ããã«ããŸãïŒ
- ç»åãã£ã«ã¿ãªã³ã°ãšåæã®ç¹åŸŽæ€åºã«WebGLã䜿çšããŸãã
- è€éãªèŒªéè§£æãšåœ¢ç¶ãããã³ã°ãWeb Workersã§å®è¡ããŸãã
- éãåŠçãæ€åºãããå Žåã¯ããããªãã£ãŒããå€§å¹ ã«ããŠã³ãµã³ããªã³ã°ããŸãã
2. æ¡åŒµçŸå®ïŒARïŒæž¬å®ã¢ããªïŒè€æ°ã®å€§éžïŒ
ãŠãŒã¶ãŒãæºåž¯é»è©±ã®ã«ã¡ã©ã䜿ã£ãŠçŸå®äžçã®è·é¢ãè§åºŠã枬å®ã§ããã¢ããªã¯ãå¹³é¢ãç¹åŸŽã®æ€åºã«å€§ããäŸåããŠããŸããã¢ã«ãŽãªãºã ã¯ãäžçäžã§èŠãããããŸããŸãªç §ææ¡ä»¶ããã¯ã¹ãã£ã«å¯ŸããŠå ç¢ã§ããå¿ èŠããããŸãã
- æé©åïŒãããã®ã¢ããªã¯ãã³ã¢ãšãªãARãã©ããã³ã°ãšåœ¢ç¶æšå®ã®ããã«ãé«åºŠã«æé©åãããC++ã©ã€ãã©ãªãWebAssemblyã«ã³ã³ãã€ã«ããŠäœ¿çšããããšããããããŸãã
- ãŠãŒã¶ãŒã¬ã€ãã³ã¹ïŒãŠãŒã¶ãŒã«ã«ã¡ã©ãå¹³ããªé¢ã«åããããæ¡å ãã广çã«é¢å¿é åãå®çŸ©ããŠæ€åºåé¡ãåçŽåããŸãã
3. ã¢ã¯ã»ã·ããªãã£ããŒã«ïŒå°åãåããïŒ
èŠèŠé害ã®ãããŠãŒã¶ãŒãæ¯æŽããããã«èšèšãããWebã¢ããªã±ãŒã·ã§ã³ã¯ãUIèŠçŽ ãèå¥ãããããªããžã§ã¯ãã®èª¬æãæäŸãããããããã«åœ¢ç¶æ€åºã䜿çšããå ŽåããããŸãããããã®ã¢ããªã±ãŒã·ã§ã³ã¯ãåç±³ã®ãã€ãšã³ãã¹ããŒããã©ã³ãããã¢ãžã¢ãã¢ããªã«ã®äžéšã§èŠãããããäºç®ã«é æ ®ããããã€ã¹ãŸã§ãå¹ åºãããã€ã¹ã§ç¢ºå®ã«åäœããå¿ èŠããããŸãã
- ããã°ã¬ãã·ããšã³ãã³ã¹ã¡ã³ãïŒåºæ¬çãªã¹ã¯ãªãŒã³ãªãŒããŒæ©èœããã©ãŒã«ããã¯ãšãªããããã€ã¹ã«èœåãããå Žåã¯ãåœ¢ç¶æ€åºãèŠèŠçãªã¬ã€ã¢ãŠããç¹å®ã®ã€ã³ã¿ã©ã¯ãã£ããªåœ¢ç¶ãèå¥ããããšã§ããã匷åããŸãã
- å¹çæ§ãžã®éäžïŒã©ã€ãã©ãªã¯ãã°ã¬ãŒã¹ã±ãŒã«ã§ããã€æå°éã®ååŠçã§ã®ããã©ãŒãã³ã¹ãåºæºã«éžã°ããŸãã
4. Eã³ããŒã¹ã®ç»åæ€çŽ¢ïŒã°ããŒãã«ãªå°å£²æ¥è ïŒ
å°å£²æ¥è ã¯ããŠãŒã¶ãŒã補åã®ç»åãã¢ããããŒãããŠé¡äŒŒååãèŠã€ããããšãã§ããç»åæ€çŽ¢ãæš¡çŽ¢ããŠããŸããããã¯å€ãã®å ŽåãµãŒããŒãããŒã§ããããµãŒããŒã«ããŒã¿ãéä¿¡ããåã«ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåäžãããããã«ãã¯ã©ã€ã¢ã³ããµã€ãã§äœããã®äºåçãªåæãç¹åŸŽæœåºãè¡ãããããšããããŸãã
- ã¯ã©ã€ã¢ã³ããµã€ãã§ã®äºååæïŒãŠãŒã¶ãŒãã¢ããããŒãããç»åã®äž»èŠãªåœ¢ç¶ãããŒãšãªãç¹åŸŽãæ€åºããããšã§ãæ€çŽ¢ã¯ãšãªãäºåã«ãã£ã«ã¿ãªã³ã°ãŸãã¯åé¡ãããµãŒããŒã®è² è·ã軜æžããŠå¿çæéãæ¹åããã®ã«åœ¹ç«ã¡ãŸãã
ããã³ããšã³ãåœ¢ç¶æ€åºã®ãã¹ããã©ã¯ãã£ã¹
ããã³ããšã³ãã®åœ¢ç¶æ€åºå®è£ ãããã©ãŒãã³ã¹ã«åªããããžãã£ããªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããããã«ã¯ã以äžã®ãã¹ããã©ã¯ãã£ã¹ã«åŸã£ãŠãã ããïŒ
- ãããã¡ã€ã«ããããã¡ã€ã«ããããã¡ã€ã«ïŒãã©ãŠã¶ã®éçºè ããŒã«ïŒããã©ãŒãã³ã¹ããã«ïŒã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³ãã©ãã§æãæéãè²»ãããŠããããç¹å®ããŸããããã«ããã¯ãã©ãã«ããããæšæž¬ããã®ã§ã¯ãªããæž¬å®ããŠãã ããã
- ã·ã³ãã«ã«å§ããå埩ããïŒèŠä»¶ãæºããæãåçŽãªåœ¢ç¶æ€åºã¢ã«ãŽãªãºã ããå§ããŸããããã©ãŒãã³ã¹ãäžååãªå Žåã¯ãããè€éãªæé©åãããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ãæ€èšããŸãã
- WebAssemblyãåªå ããïŒèšç®éçŽçãªCVã¿ã¹ã¯ã«ã¯ãWebAssemblyã第äžã®éžæè¢ãšãã¹ãã§ããWasmã³ã³ãã€ã«ãããã©ã€ãã©ãªã®ç§»æ€ãŸãã¯äœ¿çšã«æè³ããŠãã ããã
- Web WorkersãæŽ»çšããïŒã¡ã€ã³ã¹ã¬ããã空ããŠããããã«ãåžžã«éèŠãªåŠçãWeb Workersã«ãªãããŒãããŠãã ããã
- ç»åå ¥åãæé©åããïŒæ£ç¢ºãªæ€åºãå¯èœãªç¯å²ã§ãã§ããã ãå°ããç»åè§£å床ã§äœæ¥ããŠãã ããã
- 倿§ãªããã€ã¹ã§ãã¹ãããïŒããã©ãŒãã³ã¹ã¯å€§ããç°ãªããŸããäœäŸ¡æ Œåž¯ããé«äŸ¡æ Œåž¯ãŸã§ãããŸããŸãªã¿ãŒã²ããããã€ã¹ãç°ãªããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ããã©ãŠã¶ã§ã¢ããªã±ãŒã·ã§ã³ããã¹ãããŠãã ãããã°ããŒãã«ãªãŠãŒã¶ãŒå±€ãèæ ®ããŠãã ããã
- ã¡ã¢ãªã«æ³šæããïŒç»åãããã¡ãäžéããŒã¿æ§é ã®ããã®ã¬ããŒãžã³ã¬ã¯ã·ã§ã³æŠç¥ãå®è£ ããŸãã倧ããªããŒã¿ã®äžå¿ èŠãªã³ããŒãé¿ããŠãã ããã
- èŠèŠçãªãã£ãŒãããã¯ãæäŸããïŒåŠçã«æéãããã£ãŠããå Žåã¯ãã¢ããªã±ãŒã·ã§ã³ãåäœããŠããããšã瀺ãèŠèŠçãªæãããïŒäŸïŒããŒãã£ã³ã°ã¹ãããŒãããã°ã¬ã¹ããŒãäœè§£å床ã®ãã¬ãã¥ãŒïŒããŠãŒã¶ãŒã«æäŸããŠãã ããã
- ã°ã¬ãŒã¹ãã«ãã°ã©ããŒã·ã§ã³ïŒãŠãŒã¶ãŒã®ããã€ã¹ã«ãšã£ãŠåœ¢ç¶æ€åºã³ã³ããŒãã³ãã®èŠæ±ãé«ãããå Žåã§ããã¢ããªã±ãŒã·ã§ã³ã®ã³ã¢æ©èœãã¢ã¯ã»ã¹å¯èœã§ããããšãä¿èšŒããŠãã ããã
- ææ°æ å ±ãä¿ã€ïŒãã©ãŠã¶APIãšJavaScriptãšã³ãžã³ã¯åžžã«é²åããŠãããããã©ãŒãã³ã¹ã®åäžãæ°ããæ©èœïŒæ¹åãããWebGLãµããŒããæ°ããã³ã³ãã¥ãŒãã·ã§ãŒããŒAPIãªã©ïŒããããããŸããã©ã€ãã©ãªãšèªèº«ã®ç¥èãææ°ã®ç¶æ ã«ä¿ã£ãŠãã ããã
ããã³ããšã³ãåœ¢ç¶æ€åºããã©ãŒãã³ã¹ã®æªæ¥
ããã³ããšã³ãã®ã³ã³ãã¥ãŒã¿ããžã§ã³ã®ç¶æ³ã¯çµ¶ããé²åããŠããŸããç§ãã¡ã¯ä»¥äžãäºæž¬ã§ããŸãïŒ
- ãã匷åãªWeb APIïŒããŒããŠã§ã¢ãžã®ããäœã¬ãã«ã®ã¢ã¯ã»ã¹ãæäŸããæ°ããAPIãæœåšçã«ã¯GPUã§ã®ç»ååŠçãèšç®ã®ããã®ãã®ãç»å Žããã§ãããã
- WebAssemblyã®é²æ©ïŒWasmã©ã³ã¿ã€ã ãšããŒã«ã®ç¶ç¶çãªæ¹åã«ãããè€éãªèšç®ãããã«é«æ§èœã§äœ¿ãããããªãã§ãããã
- AIã¢ãã«ã®æé©åïŒãšããžããã€ã¹ïŒã²ããŠã¯ãã©ãŠã¶ïŒåãã«ãã£ãŒãã©ãŒãã³ã°ã¢ãã«ãæé©åããæè¡ãåäžããè€éãªAIé§åã®åœ¢ç¶æ€åºãã¯ã©ã€ã¢ã³ããµã€ãã§ããå®çŸå¯èœã«ãªããŸãã
- ã¯ãã¹ãã©ãããã©ãŒã ãã¬ãŒã ã¯ãŒã¯ïŒWebAssemblyãWebGLã®è€éãã®äžéšãæœè±¡åããéçºè ãããç°¡åã«CVã³ãŒããæžããããã«ãããã¬ãŒã ã¯ãŒã¯ãç»å Žããã§ãããã
çµè«
ããã³ããšã³ãã®åœ¢ç¶æ€åºã¯ããã€ãããã¯ã§ã€ã³ããªãžã§ã³ããªWebäœéšãåµé ããããã® immense ãªå¯èœæ§ãç§ããŠããŸãããããããã®åºæã®èšç®èŠæ±ã¯ãæ éã«ç®¡çãããªããšé倧ãªããã©ãŒãã³ã¹ãªãŒããŒãããã«ã€ãªããå¯èœæ§ããããŸããããã«ããã¯ãçè§£ããã¢ã«ãŽãªãºã ãæŠç¥çã«éžæã»æé©åããWebAssemblyãWebGLãéããŠããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã掻çšããWeb Workersã®ãããªå ç¢ãªãªãœãŒã¹ç®¡çæè¡ãå®è£ ããããšã§ãéçºè ã¯é«æ§èœã§å¿çæ§ã®é«ãã³ã³ãã¥ãŒã¿ããžã§ã³ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸããäžçäžã®èŠèŽè ã¯ã·ãŒã ã¬ã¹ãªäœéšãæåŸ ããŠããããããã®èŠèŠåŠçã¿ã¹ã¯ã®ããã©ãŒãã³ã¹æé©åãžã®æè³ã¯ããŠãŒã¶ãŒã®ããã€ã¹ãå Žæã«é¢ãããããããã®æåŸ ã«å¿ããããã«äžå¯æ¬ ã§ãã