忍者ブログ

設備のマニアどっとこむ

設備、電子工作、DIYのブログ!

05/12

Sun

2019

OpenCVとAWSで庭に来た猫の写真をアップロードする。

うちの庭には猫がしょっちゅう来るので来たらAWSのS3へアップロードするようなカメラを作ってみました。



まずはOpenCVで猫を認証できるようにします。 →こちらの記事参考にお願いします。
猫の学習モデルから画像を認識して画像を保存、AWSへアップロードしていきます。
→AWSの設定、アップロードはこちら


コード例としてはこんな具合です。
import sys
import cv2
import subprocess
import time
if __name__ == '__main__':
    try:
      
        #cascade_path = "/home/pi/opencv-3.1.0/data/haarcascades/haarcascade_frontalface_default.xml" 顔
        cascade_path = "/home/pi/opencv-3.1.0/data/haarcascades/cascade.xml"#ネコ
        cascade = cv2.CascadeClassifier(cascade_path)
        capture = cv2.VideoCapture(0)
        if capture.isOpened() is False:
            raise IOError("VideoCapture could not open.")
       
        while True:
           
            ret, image = capture.read()
            if ret == False:
                continue
           
            facerect = cascade.detectMultiScale(image, scaleFactor=1.2, minNeighbors=2, minSize=(10, 10))
           
            color = (255, 255, 255)     
            for rect in facerect:
                cv2.rectangle(image, tuple(rect[0:2]),tuple(rect[0:2] + rect[2:4]), color, thickness=2)
                #GPIO.output(18, True)
                time.sleep(1)
                #GPIO.output(18, False)
                cv2.imwrite("img.png", image);
                subprocess.check_call(['python3','file2.py'])
                break
            
            cv2.imshow("FaceDetection", image)
            cv2.waitKey(1)
    except KeyboardInterrupt  :         
        print("\nCtl+C")
    except Exception as e:
        print(str(e))                   
    finally:
        capture.release()              
        cv2.destroyAllWindows()         
        for i in range (1,5):
            cv2.waitKey(10)             
        print("\nexit program")         
  
OpenCVで猫を認識したら画像を保存すると同時にfile2.pyというpythonファイルを実行しています。
 
subprocess.check_call(['python3','file2.py'])

冒頭でimport subprocessという一文も忘れないでください。

ちなみにfile2.pyはこうです。
import sys
import threading
import boto3
BUCKET_NAME = '*********************'
class ProgressCheck(object):
    def __init__(self, filename):
        self._filename = filename
        self._size = int(os.path.getsize(filename))
        self._seen_so_far = 0
        self._lock = threading.Lock()
    def __call__(self, bytes_amount):
        with self._lock:
            self._seen_so_far += bytes_amount
            percentage = (self._seen_so_far / self._size) * 100
            sys.stdout.write(
                    "\r%s / %s (%.2f%%)" % (
                        self._seen_so_far, self._size,
                        percentage))
            sys.stdout.flush()
def UploadToS3():
    # S3Connection
    s3 = boto3.resource('s3')
    s3.Object(BUCKET_NAME, 'img.png').upload_file('img.png')
   
UploadToS3()  
BUCKET_NAMEはS3のバゲットの名前です。

ファイル名はここで入力します
s3.Object(BUCKET_NAME, 'img.png').upload_file('img.png')
このファイルfile2.pyはOpenCVと同じフォルダに入れてください。

これで猫を認識したと同時にアップロードされます。S3のバゲットを公開していればどこからでも
ブラウザでチェックできます。

AWSを使うと簡単にラズパイと連携できます。おススメですよ!










拍手[0回]

PR

03/05

Tue

2019

AWSでラズパイの位置情報を公開する

前回、前々回でラズパイからAWSへ温湿度と画像データのアップロードができたので今度は位置情報の公開にチャレンジします。

以前購入したGPSモジュールで座標を取得してCSVでAWSへアップロード、Googleマップにピンを入れるようにします。

→GPSモジュールのセットアップについての記事はこちら


↑こんな感じです



まずはラズパイ上に位置情報CSVを作成します。
micropyGPSだけはここからmicropyGPS.pyをダウンロードして同じディレクトリにいれてください。
import serial
import micropyGPS
import threading
import time
import math
import csv
gps = micropyGPS.MicropyGPS(9, 'dd') 
                                     
def rungps(): 
    s = serial.Serial('/dev/serial0', 9600, timeout=10)
    s.readline() 
    while True:
        sentence = s.readline().decode('utf-8') 
        if sentence[0] != '$': 
            continue
        for x in sentence: 
            gps.update(x)
gpsthread = threading.Thread(target=rungps, args=()) 
gpsthread.daemon = True
gpsthread.start() 
#logger_latitude = 3540.8061
decimal, integer = math.modf(gps.timestamp[1]/100.0)
gps_latitude = integer + decimal / 60.0 * 100.0
decimal2, integer2 = math.modf(gps.timestamp[2]/100.0)
gps_latitude2 = integer2 + decimal2 / 60.0 * 100.0
while True:
    if gps.clean_sentences > 20: 
        h = gps.timestamp[0] if gps.timestamp[0] < 24 else gps.timestamp[0] - 24
        print('%2d:%02d:%04.1f' % (h, gps.timestamp[1], gps.timestamp[2]))
        print('緯度経度: %2.8f, %2.8f' % (gps.latitude[0], gps.longitude[0]))
        print('海抜: %f' % gps.altitude)
        print(gps.satellites_used)
        print('衛星番号: (仰角,方位角, SN比)')
        for k, v in gps.satellite_data.items():
            print('%d: %s' % (k, v))
        print(gps.latitude[0])
        if  gps.latitude[0] > 0:
         with open('gps.csv','a') as f:
           writer = csv.writer(f)
           #writer.writerow([h,gps.timestamp[1],gps.timestamp[2],gps.latitude[0],gps.longitude[0]])
           writer.writerow([h, gps.timestamp[1], gps.timestamp[2],gps.latitude[0],gps.longitude[0]])
    time.sleep(3.0)

これでCSVが作成されます。
GPSがつかまらない場合は追記しません。 if  gps.latitude[0] > 0: としています。

あとはこの記事を参照にAWSのS3へアップロードしていきます。


ブラウザでGPSのデータを読み込むのにjavascriptを使う必要があります。
CSV値の後ふたつの値をとります。
<!DOCTYPE html>
<html lang="ja">
<head>
<title>test</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<style>
html,body {
margin: 0;
padding: 0;
overflow: hidden;
}
</style>
</head>
<body>
    <a id="map">地図</a>
<script type="text/javascript">
function getCSV(){
    var req = new XMLHttpRequest();
    req.open("get", "gps.csv", true);
    req.send(null);
    req.onload = function(){
convertCSVtoArray(req.responseText);
    }
}
 
function convertCSVtoArray(str){
    var tmp = str.split("\n");
    var val = tmp.slice(-2)[0];
    var lat = val.split(',').slice(-2)[0];
    var lng = val.split(',').slice(-1)[0];
    
    var link = document.getElementById('map');
    link.setAttribute('href', 'https://maps.google.co.jp/maps?q='+lat+','+lng);
}
 
getCSV();
</script>
</body>
</html>
位置がずれたりちょっと不安定な動きをしますが、屋外にラズパイをもっていくとGooglmap
ピンがささり、位置情報を公開することができました。

ちなみに・・。


モバイルバッテリーは必須です!! wi-fiはテザリングでなんとかなりますが…










拍手[0回]

02/24

Sun

2019

ラズパイからAWSへ温湿度CSVのアップロード

今回はかなりオーソドックスなIoTをやってみようかと思います。前回はAWSへの画像のアップロードだけだったんですが、今度はHPまで作ってそこからCSVをダウンロードできるようにしてみます。 

DHT11を使いました。3本足はそれぞれ5V、GND、14ピンに接続します。


ラズパイからCSVファイルを出力できるようにします。
import time
import datetime
import dht11
import RPi.GPIO as GPIO
import csv
Temp_sensor=14
def main():
  GPIO.setwarnings(False)
  GPIO.setmode(GPIO.BCM)       
  instance = dht11.DHT11(pin = Temp_sensor)
  while True:
       
        result = instance.read()
        print"Temperature =",result.temperature,"C"," Humidity = ",result.humidity,"%"
        time.sleep(2)
        with open('dht.csv','a') as f:
           if result.temperature > 0:
            writer = csv.writer(f)
            writer.writerow([datetime.datetime.now(),result.temperature,result.humidity])
           
        f.close()
print('done. see dht.csv')
            
if __name__ == '__main__':
  try:
    main()
  except KeyboardInterrupt:
    pass
これでdht.csvというCSVファイルができました。
このファイル前回の要領でS3へアップロードしていきます。
前回は画像ファイルtest.jpgだったものをdht.csvへ変更するだけでOKです。
(同じフォルダに入れる必要があります)

今度はAWS側の設定です。

S3にindex.htmlファイルを作って公開できる設定にします。




パブリックアクセスをEvery Oneにするとだれでもアクセス可能になります。
アップロードしたファイルを同じバケットにしてhtmlで関連付けました。

こんな具合でできました。CSVがダウンロードできるはずです!


3/31 0のデータが多かったためコード修正しています。







拍手[0回]

02/17

Sun

2019

ラズパイカメラからAWS S3への写真のアップロード

データセンター業界では最近AWSって大手クラウドとしてよく聞くけど、実際サービスってどんな感じかな~ って思ってました。 1年間は無料なので今回ラズパイとの連携をやってみることにしました。
まずはAWSのアカウントを取得してください。いきなりカード番号を聞かれますが大丈夫です笑
はじめにS3というストレージサービスでバゲットを作ります。
(ここに画像データを送ります)
 
あとは右上のタブからセキュリテイ認証を選択して
アクセスキー (アクセスキー ID とシークレットアクセスキー)を取得します。
(ここでコピーしておいて下さい)
あとでラズパイ上で使います。
今度はユーザーと紐づけていきます。
AWS S3FullAccessのポリシーをアタッチしてください。
あとはラズパイの準備!
必要なパッケージをインストールしていきます。
pip install boto3
pip install awscli
あとはアクセスキー ID とシークレットアクセスキーを設定していくのですが、
ここでエラーが出ることがあります。
aws configure
AWS Access Key ID [None]: ***********
AWS Secret Access Key [None]: ***********
Default region name [None]: ***********
Default output format [None]: json
configureのコマンドが見つからないといった症状がでればこちらでインストールしてください。
pip install awscli --upgrade
画像をアップロードするコードです。
BUCKET_NAME = '*******'はS3で作成したバケット名をいれて下さい
import sys
import threading
import boto3
# boto3 (.aws/config)
BUCKET_NAME = '*******'
class ProgressCheck(object):
    def __init__(self, filename):
        self._filename = filename
        self._size = int(os.path.getsize(filename))
        self._seen_so_far = 0
        self._lock = threading.Lock()
    def __call__(self, bytes_amount):
        with self._lock:
            self._seen_so_far += bytes_amount
            percentage = (self._seen_so_far / self._size) * 100
            sys.stdout.write(
                    "\r%s / %s (%.2f%%)" % (
                        self._seen_so_far, self._size,
                        percentage))
            sys.stdout.flush()
def UploadToS3():
    # S3Connection
    s3 = boto3.resource('s3')
    s3.Object(BUCKET_NAME, 'test.jpg').upload_file('test.jpg')
UploadToS3()  
これでtest.jpgをアップロードできます。S3で確認できました。


もしエラーになることがあればこちらのコマンドでアクセスキー ID とシークレットアクセスキーを設定してみてください(自分はここでハマりました・・)
aws configure set aws_access_key_id AKIA****************
aws configure set aws_secret_access_key ***************
自動でアップロードをするなら
raspistill -w 480 -h 360 -n -o test.jpg
などと絡めてシェルスクリプトをcrontabに登録しておけば定期投稿できます。

ちなみにAWSはアプリもあるので携帯でも見れます!!
(S3などのサービスに限定されますが)


ラズパイでIotをやるならAWSは要チェックですね…
IoT coreとかも手を出していこうかと・・。
 










拍手[0回]

翻訳(Translate)

AD

シェアしてね

プロフィール

HN:
アルティメット雅史
性別:
男性
自己紹介:
製油所、データセンター、化学工場を渡り歩いた設備のマニア
最近はarduino,Raspberry pi等の電子工作にハマる。
取得資格は電験3種、消防設備士甲4、2級ボイラー技士、危険物乙4、電工2種、技術士補(電気・電子)、エネ電、フォークリフトほか

カウンター

お問い合わせ

忍者アクセスランキング

Copyright © 設備のマニアどっとこむ : All rights reserved

TemplateDesign by KARMA7

忍者ブログ [PR]