ãã®èšäºã¯ããRaspberry Pi + Picameraã§isaaxãã¯ãããããã®å¿çšç·šãšããŠãAIã«ã¡ã©ã®ãµã³ãã«ã¢ããªã±ãŒã·ã§ã³ã䜿ã£ãŠã«ãŠã³ããã人æ°ãšãã®ç¬éã®ç»åãã£ããã£ãSlackã«éä¿¡ãããšãããŸã§ãäœéšããŸãããã³ãºãªã³ã§ã¯å¿ èŠãªã©ã€ãã©ãªããããããã€ã³ã¹ããŒã«ãããSDã«ãŒããæå ã«é ã£ãŠããã®ã§ãã¡ãã䜿ã£ãŠãã ãããæ°ããçšæããSDã«ãŒãã«åæ§ã®ç°å¢ãæ§ç¯ãããå Žåã¯èšäºã®æåŸã«ããä»é²ã確èªããŠãã ããã
倧ãŸããªæµããšããŠã
- ãµã³ãã«ããã°ã©ã ãisaaxã䜿ã£ãŠã€ã³ã¹ããŒã«
- GitHubçµç±ã§ãµã³ãã«ã«ç»åã¢ããããŒãæ©èœã远å
- Slackã«ç»åãšå ±ã«éç¥
ã®é çªã§ãã³ãºãªã³ãé²ããŠãããŸãã
ãã®ãã³ãºãªã³ã§å¿ èŠãšãªãéšæã¯äžèšã®éãã§ãã
- Raspberry Pi 2 ãŸã㯠3以äž
- SDã«ãŒã (é åžãããã®ã䜿çš)
- Picameraã¢ãžã¥ãŒã« (v1ãŸãã¯v2)
- 黿º (PCããã®çµŠé»ãå¯)
- ã€ã³ã¿ãŒãããæ¥ç¶
- SSHã䜿ããç°å¢ (WindowsãªãTeraTerm, Git Bashãªã©)
- gitã䜿ããç°å¢
- GitHubã¢ã«ãŠã³ã
- isaaxã¢ã«ãŠã³ã (åŸè¿°)
- å匷äŒçšSlackã¢ã«ãŠã³ã (åŸè¿°)
- ã€ã³ã¿ãŒãããæ¥ç¶
åŸã»ã©SSHãè¡ããããRaspberry PiãšPCã¯åãããŒã«ã«ãããã¯ãŒã¯ç°å¢äžã«æ¥ç¶ãããããã«ããŠãã ããã
å匷äŒåå è ã®æ¹ã«ã¯ããããããä»å䜿ãSlackãã£ã³ãã«ãžã®æåŸ ã¡ãŒã«ããéãããŸãããäžå³ã®ãããªã¡ãŒã«ãå±ããŠããã°ããä»ããåå ãããã¢ã«ãŠã³ããäœæããŠãã°ã€ã³ããŠãã ããã
ã¡ãŒã«ãå±ããŠããªãå Žåããã¢ã«ãŠã³ãã®äœæããŸã ã®å Žåã¯ã¹ã¿ããã«ãç¥ãããã ããã
isaaxååŒ·äŒ ç¬¬19å Slackã¯ãŒã¯ã¹ããŒã¹
Raspberry Piã«ã«ã¡ã©ãšSDã«ãŒããæç·æ¥ç¶ããå Žåã¯LANã±ãŒãã«ãæ¥ç¶ãã黿ºãæå ¥ããŠãã ããããã³ãºãªã³ã§ã¯é»æºæå ¥åŸã«IPã¢ãã¬ã¹ã調ã¹ãŸãããã®æç¹ã§Raspberry Piã®IPã¢ãã¬ã¹ãæ§ããŠããªãå Žåã¯ãã¹ã¿ããããåŒã³ãã ããã
ããã§ã¯å§ããŸããããisaaxã䜿ã£ãŠäººæ°ã«ãŠã³ããè¡ããµã³ãã«ããã°ã©ã ãRaspberry Piã«ã€ã³ã¹ããŒã«ããŸããGitHubã«ãã°ã€ã³ããŠããªãå Žåã¯ãããã§ãã°ã€ã³ããŸãããã
ãã©ãŠã¶ã§äžèšã®ãªã³ã¯ãéããå³äžã®Forkãã¿ã³ãæŒããŠãªããžããªãèªåã®ã¢ã«ãŠã³ãã«ãã©ãŒã¯ããŸãã
ãµã³ãã«ã³ãŒã - GitHub isaaxug/study-picamera-examples
次ã«ãisaaxã«GitHubã¢ã«ãŠã³ãã䜿ã£ãŠãã°ã€ã³ããŸãã
isaaxã®ããã·ã¥ããŒããéããã+ æ°èŠãããžã§ã¯ã远å ããããããžã§ã¯ããäœæããŸãã
äžå³ã®ããã«ãããžã§ã¯ããèšå®ãããä¿åããã¯ãªãã¯ããŸãã
ãããžã§ã¯ãã®äœæåŸãäžå³ã®ãããªç»é¢ã衚瀺ãããŸãããããžã§ã¯ãããŒã¯ã³ã¯ããã€ã¹ã«isaaxdãã€ã³ã¹ããŒã«ããéã«å¿ èŠãšãªããŸããã€ã³ã¹ããŒã«ã¹ã¯ãªããã¯ãã®ããŒã¯ã³ãåŒæ°ãšããŠisaaxdã®ã€ã³ã¹ããŒã«ãã¯ã³ã³ãã³ãå®è¡ããããã®ã¹ã¯ãªããã§ããäžã®æ¹ã®æååãã³ããŒããŠãã ããã
Raspberry Piã«SSHæ¥ç¶ããŸãã<>ã¯å
¥åããªãã§ãã ããã
$ ssh pi@<Raspberry Piã®IPã¢ãã¬ã¹>
ãã°ã€ã³ããããã³ããŒããæååãã©ãºãã€äžã§å®è¡ããŸããisaaxd installation completeã衚瀺ãããã°ã€ã³ã¹ããŒã«æåã§ãã
ãã©ãŠã¶ããRaspberry Piã®<IPã¢ãã¬ã¹>:5000ã«ã¢ã¯ã»ã¹ãããšPicameraã®æ åã確èªã§ããŸãããã®ã¢ããªã±ãŒã·ã§ã³ã¯ããã¬ãŒã å ã®äººã®äœçœ®ãæ°ãèªèãããã°ãšããŠäººæ°ãåºåããŸãããã®ãã°ã®æ§åã¯isaaxã®ããã·ã¥ããŒãããç»é²ããããã€ã¹ã®ããŒãžãã確èªã§ããŸãã
çŸæç¹ã§ããã¬ãŒã å ã®äººæ°ãæ°ãããšãããŸã§ã¯æåããŠããŸãããã®æ å ±ãSlackã«éç¥ããããã®æ©èœã远å ããŸãããã
ãã©ãŒã¯ãããªããžããªãèªåã®PCã«ã¯ããŒã³ããã奜ããªãšãã£ã¿ãéããŠã³ãŒãã£ã³ã°ããŠãããŸããgitã䜿ãæ
£ããŠããªãå Žåã¯GitHubäžã§çŽæ¥ã³ãŒããç·šéããŠãã ãããç·šéãããã¡ã€ã«ã¯ camera/processor/person_detector.py ã§ãã
ã¯ããã«ãäžèšã®ã¢ãžã¥ãŒã«ã远å ããŸãã
import os
import sys
import requests次ã«ãããŒã¿ãæå®ã®Slackãã£ã³ãã«ã«éãããã®æ å ±ãç°å¢å€æ°ããååŸããŸããããããã®å€ã®èšå®ã¯ä»¥éã®ã»ã¯ã·ã§ã³ã§è¡ããŸããäŸå€åŠçãšããŠãç°å¢å€æ°ãååšããªãã£ãå Žåã¯ãšã©ãŒã¡ãã»ãŒãžã衚瀺ããŠããã°ã©ã ãçµäºãããããã«ããŸãã
try:
SLACK_URL = os.environ['SLACK_URL']
SLACK_TOKEN = os.environ['SLACK_TOKEN']
SLACK_CHANNEL = os.environ['SLACK_CHANNEL']
except KeyError as e:
sys.exit('Couldn\'t find env: {}'.format(e))Slackãžã®ãã¡ã€ã«ã¢ããããŒããè¡ã颿°ãå®çŸ©ããŸããPersonDetectorã¯ã©ã¹ã®åã«èšè¿°ããŸãããã
def upload():
image = { 'file': open('hello.jpg', 'rb') }
payload = {
'filename': 'hello.jpg',
'token': SLACK_TOKEN,
'channels': [SLACK_CHANNEL],
}
requests.post(SLACK_URL, params=payload, files=image)äžã®ã³ãŒããé çªã«ã¿ãŠãããŸããimage倿°ã¯ç»åããŒã¿ããã£ã¯ã·ã§ããªåã§æ ŒçŽããŸããçµã¿èŸŒã¿é¢æ°openã®ç¬¬2åŒæ°ã«æž¡ããŠãã'rb'ã¯ããã€ããªãã¡ã€ã«ãèªã¿èŸŒãéã«äœ¿çšãããã©ã°ã§ãã
payload倿°ã¯Slackã®ãšã³ããã€ã³ãã«éãããŒã¿ã®å®äœã§ããã¢ããããŒãããéã®ãã¡ã€ã«åãAPIããŒã¯ã³ãéãå
ã®ãã£ã³ãã«ãå«ã¿ãŸãã
æåŸã®è¡ã¯requestsã¢ãžã¥ãŒã«ã䜿ã£ãPOSTãªã¯ãšã¹ãã§ããSLACK_URLã§æå®ããURLã«ãªã¯ãšã¹ããè¡ããŸãã
ããã§ã¯ãupload颿°ã®åŒã³åºãéšåãäœæããŸããããã§ã¯ãã¹ããšããŠã1åããšã«ã«ã¡ã©ã«äººãæ ã£ãå Žåã«ãã£ããã£ãäœæããŠã¢ããããŒãããããã«ããŸãã
80è¡ç®ä»è¿ã®ifãããã¯ã¯ã«ãŠã³ãã0ãã倧ããã£ãå Žåã«ãã®äººæ°ã衚瀺ããåŠçã§ãããã®ãããã¯å
ã«äžã§å®çŸ©ããupload颿°ãåŒã³åºããŸãããã
if count > 0:
print('Count: {}'.format(count))
upload()1åããšã«ç»åãéä¿¡ããããã«ãPersonDetectorã®__init__ã¡ãœããã«ããŒã¿ãéä¿¡ããæéãä¿æããããã®å€æ°ã远å ããŸãã
def __init__(self, flip = True):
self.last_upload = time.time() # ãã®è¡ãæ°ãã远å
self.vs = PiVideoStream(resolution=(800, 608)).start()
self.flip = flip
time.sleep(2.0)å ã»ã©ã®ifãããã¯ã«æ»ããæåŸã«ãã¡ã€ã«ãã¢ããããŒãããŠãã60ç§çµéããŠããå Žåã«åŠçããŠãããã¬ãŒã ã®ãã£ããã£ãäœæããéä¿¡ããããã«å€æŽããŸãã
if count > 0:
print('Count: {}'.format(count))
elapsed = time.time() - self.last_upload
if elapsed > 60:
cv2.imwrite('hello.jpg', frame)
upload()
self.last_upload = time.time()ç·šéã¯ä»¥äžã§ããæçµçãªã³ãŒãã®å šäœåã¯äžèšã®ãªã³ã¯ãã確èªããŠãã ããã
ãµã³ãã«ã³ãŒã - GitHub
倿Žãçµããããã³ããããäœæããŠãªã¢ãŒããªããžããªã«åæ ããŸããGitHubäžã§ç·šéããå Žåã¯ããŒãžäžéšã®ãCommit changesããã¿ã³ããã³ããããäœæã§ããŸãããªã¢ãŒããªããžããªã«å€æŽããããšãisaaxã¯æŽæ°éç¥ãåãåããèªåçã«å ã»ã©ç»é²ããããã€ã¹ã«å¯ŸããŠææ°ã®ã¢ããªã±ãŒã·ã§ã³ãé ä¿¡ããŸãã
isaaxã®ããã·ã¥ããŒããããã°ã確èªããŠã¿ãŸããããäžèšã®ãããªãšã©ãŒã衚瀺ãããã¯ãã§ãã
Couldn't find env: 'SLACK_URL'
çŸæç¹ã§ã¯ãå¿ èŠãªç°å¢å€æ°ãšãã®å€ãååšããªããããã®ãããªè¡šç€ºãšãªããŸããã¡ãªã¿ã«ãã®ãšã©ãŒè¡šç€ºã¯ãç°å¢å€æ°ã®èªã¿èŸŒã¿ãšäžç·ã«èšè¿°ããäŸå€åŠçãåŒã³åºãããŠããŸãã
以éã®ã»ã¯ã·ã§ã³ã§ç°å¢å€æ°ã®ã»ããã¢ããããããªããŸãã
æŽæ°ãããµã³ãã«ã¢ããªã±ãŒã·ã§ã³ãSlackã«ããŒã¿ãéä¿¡ããããã«ãã¢ããããŒãå ã®URLãšã¢ã¯ã»ã¹ããŒã¯ã³ããããŠéãå ã®ãã£ã³ãã«ãå¿ èŠãšãªããŸãããããã®æ å ±ãisaaxã®ãŠãŒã¶ãŒå€æ°ã«ç»é²ããŸãã
ãŠãŒã¶ãŒå€æ°ãšã¯isaaxã®æ©èœã®ã²ãšã€ã§ãAPIããŒã®ãããªèªèšŒæ å ±ãç°å¢ã«ãã£ãŠç°ãªããšã³ããã€ã³ããªã©ãããŒãã³ãŒãã£ã³ã°ããããªãããŒã¿ãåãåããŠãããã€ããæ©èœããããŸããisaaxã§ç»é²ãããã®ããŒã¿ã¯ããã€ã¹äžã§ç°å¢å€æ°ãšããŠã¢ã¯ã»ã¹ã§ããŸãã
ã¯ã©ã¹ã¿ãŒããŒãžãããCluster Settingsããã¯ãªãã¯ããŠããããããŠã³ãéããŸãã
ããŠãŒã¶ãŒå€æ°ãã¿ããããïŒç°å¢å€æ°è¿œå ããã¯ãªãã¯ããŸãã
å
ã»ã©è¿œå ããã³ãŒãã§ã¯ãã¢ããªã±ãŒã·ã§ã³å
ã§SLACK_URLãSLACK_TOKENãSLACK_CHANNELã®3ã€ã®ç°å¢å€æ°ãåç
§ããŠããŸããããªã®ã§ãããããšåãååã§å€æ°ã远å ããŸããããããã®å€æ°ã®å€ã¯äžèšã®éãã«ããŠãã ããã
- SLACK_URL ...
https://slack.com/api/files.upload - SLACK_TOKEN ... å匷äŒçšSlackã®generalãã£ã³ãã«ã«ãŠå ±æããŸãã
- SLACK_CHANNEL ... ããŒãã«ã«é åžããããã£ã³ãã«å
äžå³ã®ããã«å šéšã§3ã€äœæããŸãã
ç°å¢å€æ°ã®è¿œå ãåæ ããããã«ãããã€ã¹äžã®ã¢ããªã±ãŒã·ã§ã³ãåèµ·åããŸããäžå³ãåèã«ã¯ã©ã¹ã¿ãŒããŒãžã®ãrestartããã¿ã³ããåèµ·åããããªã£ãŠãã ããã
ãã©ãŠã¶ã§Raspberry Piã®ã«ã¡ã©æ åã確èªããŠããã¿ãããªããŒããããã°ãã人æ°èªèããããŸããããäžå®æéåŸãèšå®ãããã£ã³ãã«ã«äžå³ã®ããã«ç»åãã¢ããããŒããããã°æåã§ãïŒãã®ãµã³ãã«ã¢ããªã±ãŒã·ã§ã³ã§ã¯ããã©ãŠã¶ããRaspberry Piã«ã¢ã¯ã»ã¹ããŠããã¿ã€ãã³ã°ã®ã¿ç»ååŠçãè¡ãã®ã§ã¿ãã¯éãããŸãŸã«ããŠãããŠãã ããïŒã
äžèšèª²é¡ã«åãçµãã§ã¿ãŸãããã
camera/processor/person_detector.pyã§ã¯ã人ãèªèããéã«ç·è²ã®æ ç·ãæç»ããŠããŸããprocess_imageã¡ãœããå
ããcv2.rectangle()ãèŠã€ããä»»æã®è²ã§æ ç·ã衚瀺ããããã«å€æŽããŸãããã4ã€ç®ã®åŒæ°ãæç»ããè²ã瀺ããŠããŸãã
OpenCVã§ã¯ãäžè¬çã«RGBã§ã¯ãªãBGRã§è²ã®æå®ããããªããŸãã
äžèšã®ãªã³ã¯ã¯Slackã®ãã¡ã€ã«ã¢ããããŒãã«é¢ããAPIã®ããã¥ã¡ã³ãã§ãããã³ãºãªã³ã§ã¯ãã¡ã€ã«ããŒã ãããŒã¯ã³ãéãå ã®ãã£ã³ãã«ãæå®ããŸããããä»ã«ãå€ãæå®ã§ããŸããããã¥ã¡ã³ãã®Argumentsã®ã»ã¯ã·ã§ã³ãèªã¿ãSlackã«ãã¡ã€ã«ãã¢ããããŒãããéã«ã³ã¡ã³ããäžç·ã«ã€ããããã«å€æŽããŸãããã倿Žããã®ã¯ãã³ãºãªã³ã§äœæããupload颿°ã§ãã
æ°ããRaspbian liteã®OSã€ã¡ãŒãžãçŒããSDã«ãŒãã䜿ãå Žåã¯ã以äžã®ã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããŠãã ããã
$ sudo apt update && sudo apt upgrade
$ sudo apt install python3-pip
$ pip3 install picamera numpy opencv-python flask requests
$ sudo apt install libatlas-base-dev
$ sudo apt install libwebp6 libtiff5-dev libjasper-dev
$ sudo apt install libopenexr22 libilmbase12
$ sudo apt install libgstreamer1.0-dev
$ sudo apt install libavcodec-dev libavformat-dev libswscale-dev
$ sudo apt install libqtgui4 libqt4-test
äžèšã®ã³ãã³ããå®è¡ããŠãopencv-pythonã䜿ããç¶æ
ã«ãªã£ãŠããããšã確èªããŸããããŒãžã§ã³çªå·ã衚瀺ãããã°æ£ããã€ã³ã¹ããŒã«ãããŠããŸãã
$ python3 -c "import cv2; print(cv2.__version__)"
3.4.2















