無料で学べるスキルアップAIキャンプ
https://www.skillupai.com/skillupai-camp/
2021年3月24日開催の
「RaspberryPiで始めよう AIとIoT」
で、久しぶりに RaspPi いじってみよう。
カメラ使って、AI使って、それっぽいことできそうだ。
子供のころ、映画「STARWARS」 を観てワクワクし、ガンプラにドキドキしていた。時間が経つのも忘れてしまう、そんな時間をもう一度、取り戻すために、Raspberry pi を使って、オヤジがロボット作りに挑戦する!
# pull out "price" from 価格.com
from bs4 import BeautifulSoup
import urllib as req
url="http://kakaku.com/item/J0000024058"
res=req.urlopen(url)
soup=BeautifulSoup(res, "html.parser")
price=soup.select_one(".colorprice")
price=price.encode('utf_8')
price=price.split('<span>')
price=price[1].split('</span>')
取り敢えず、これでやりたかったことはできた。今は簡単にできてしまう。# Notification to LINE
import requests
token="XXXXXXXXXXXXXXXXXXXXXXXXX"
url="https://notify-api.line.me/api/notify"
msg="HP Specre x360: "
payload={"message": msg + price[0]}
headers={"Authorization": "Bearer " + token}
line_notify=requests.post(url, headers=headers, params=payload)
$ python -m googlesamples.assistant.auth_helpers --client-secrets /home/pi/client_secret_XXXX.json
#
#import pdb; pdb.set_trace()
import sysimport numpy as npimport pandas as pd
length_of_sequences = 5
def convert_data(values): returns = pd.Series(values).pct_change() #returns = pd.DataFrame(values).pct_change() ret_index = (1 + returns).cumprod() ret_index[0] = 1.0 return ret_index
def create_train_data(values,samples): train_x = [] train_y = []
for i in np.arange(0, (len(values) - samples - 1)): s = i + samples feature = values.iloc[i:s] if feature[s - 1] < values[s]: #if feature.loc[s - 1] < values.loc[s]: train_y.append([1]) # up else: train_y.append([0]) # down train_x.append([[x] for x in feature.values])
return np.array(train_x),np.array(train_y)
file_name = 'stock_yasukawa.csv'#adj_end = pd.read_csv(file_name,usecols=[6])adj_end = pd.read_csv(file_name)adj_end = adj_end['5']adj_end = convert_data(adj_end)#print adj_end
X,Y = create_train_data(adj_end,length_of_sequences)
split_pos = int(len(X) * 0.8)train_x = X[:split_pos]train_y = Y[:split_pos]test_x = X[:split_pos]test_y = Y[:split_pos]
# keras/tensorflow で、LSTM
from keras.models import Sequentialfrom keras.layers import Dense, Activation, Dropoutfrom keras.layers.recurrent import LSTM
hidden_neurons = 128in_out_neurons = 1
def create_model():
model = Sequential() model.add(LSTM(hidden_neurons,batch_input_shape=(None,length_of_sequences,in_out_neurons))) model.add(Dropout(0.5)) model.add(Dense(in_out_neurons)) model.add(Activation("sigmoid"))
return model
model = create_model()model.compile(loss="binary_crossentropy",optimizer="adam",metrics=['accuracy'])history = model.fit(train_x,train_y,batch_size=10,verbose=1)
# evaluation
score = model.evaluate(test_x,test_y,batch_size=10,verbose=1)print("score: ",score)
preds = model.predict(test_x)correct = 0for i in range(len(preds)): p = 0 if preds[i][0] < 0.5 else 1 t = test_y[i][0] if p == t: correct += 1
print("correct rate: ",correct/len(preds))
# -*- coding: utf-8 -*-import sslssl._create_default_https_context = ssl._create_unverified_context
from bs4 import BeautifulSoupimport urllib2import timeimport numpy as npimport pandas as pd
page_num = 90 #適当に多めのページ数stock_temp = []
# Code# 6506.T : yasukawa
for i in range(page_num): url = "https://info.finance.yahoo.co.jp/history/?code=6506.T&sy=2016&sm=4&sd=1&ey=2017&em=5&ed=1&tm=d&p=" + str(i+1)
html = urllib2.urlopen(url) soup = BeautifulSoup(html,"lxml")
table = soup.find_all("table",{"class":"boardFin yjSt marB6"})[0] stock_extract = [value.get_text() for value in table.find_all("td")] stock_temp.extend(stock_extract)
time.sleep(0.4)
stock_temp = np.array(stock_temp)
stock = stock_temp.reshape(int(len(stock_temp)/7), 7) #取得データは7項目stock = pd.DataFrame(stock[:,1:8],index=stock[:,0])#stock = pd.DataFrame(stock[:,1:8],columns=["date","start","high","low","end","volumns","adjusted"], index=stock[:,0])
# 取得した株価データのカンマ , を外す作業。ほんとに必要?
for i in range(6): stock.ix[:,i] = stock.ix[:,i].astype(str) stock.ix[:,i] = stock.ix[:,i].str.replace(",","").astype(float)
# Save to csv file.stock.to_csv('stock_yasukawa.csv',encoding='UTF-8')
# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.finance as mpf
from matplotlib.dates import date2num
fig = plt.figure()ax = plt.subplot()
# indexとして使う日付を、matplotlib.finance.candlestick_ohlc関数で使えるようにtype変換する
# 日本語がなければ、pandas.read_csv の parse_dates で変換できたそうだ。
# Japanese date (string) -> Timestamp datefmt='%Y年%m月%d日'my_parser=lambda date: pd.datetime.strptime(date,fmt)df=pd.read_csv('stock_yasukawa.csv',index_col=0,parse_dates=0,date_parser=my_parser)df=df.sort_index(ascending=True)
# mpf.candlestick_ohlc use "datetime"xdate = [x.date() for x in df.index] # Timestamp -> datetimeohlc = np.vstack((date2num(xdate),df.values.T)).Tmpf.candlestick_ohlc(ax,ohlc,width=0.7,colorup='g',colordown='r')
ax.grid()ax.set_xlim(df.index[0].date(),df.index[-1].date()) # range of X-axisfig.autofmt_xdate()
$sudo apt-get install python-empy
$sudo apt-get install libconsole-bridge0.2 libconsole-bridge-dev
$sudo apt-get install libtinyxml-dev
$sudo apt-get install liblz4-1 liblz4-dev
$sudo apt-get install libgtest-dev
$sudo apt-get install libbz2-dev
make[1]: *** [CMakeFiles/roscpp.dir/all] Error 2
Makefile: 138: recipe for target 'all' failed
make: *** [all] Error 2
<== Failed to process package 'roscpp':
sudo vi /etc/dphys-swapfile
CONF_SWAPSIZE=1024
$ sudo systemctl stop dphys-swapfile
$ sudo systemctl start dphys-swapfile
$ free -h 増えたのを確かめる。 $ rosinstall_generator turtlesim --rosdistro indigo --deps --wet-only --exclude roslisp --tar > indigo-custom_ros.rosinstall
$ wstool merge -t src indigo-custom_ros.rosinstall
$ wstool update -t src
$ rosdep install --from-paths src --ignore-src --rosdistro indigo -y -r --os=debian:jessie
import cv2
cv2.namedWindow("monitor")
vc=cv2.VideoCapture(0)
if vc.isOpened():
rval, frame = vc.read()
else:
rval = False
while rval:
cv2.imshow("monitor", frame)
rval, frame = vc.read()
key = cv2.waitKey(10)
if key == 27:
break
cv2.destroyWindow("monitor")
最後の touch は、/var/log/samba/log.smbd にエラー吐いたので。$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install samba
$ cd /etc/samba
$ sudo cp smb.conf smb.conf_org
$ sudo vi smb.conf
[global]
printing = bsd
[homes]
browseable = yes
path = /home/pi/REC
read only = no
create mask = 0664
directory mask = 0775
$ sudo touch /etc/printcap
$ sudo smbpasswd -a pi
New SMB password: ←RaspPi3の pi アカウントのパスワードを。
Retype new SMB password:
Added user pi.
$ crontab -e
:
10 09 * * 1,2,3,4,5 ~/bin/rec_nhk.sh NHK2 5 ~/REC enjoy_english
30 16 * * 7 ~/bin/rec_nhk.sh NHK2 75 ~/REC conversation
pi@rasp$ date2016年 1月 11日 月曜日 10:01:39 JSTpi@rasp$ uname -aLinux raspberrypi 4.1.14-v7+ #828 SMP PREEMPT Thu Dec 10 13:22:08 GMT 2015 armv7l GNU/Linux
pi@rasp$pi@rasp$ sudo rpi-update*** Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS and Dom*** Performing self-update*** Relaunching after update*** Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS and Dom#############################################################This update bumps to rpi-4.1.y linux treeBe aware there could be compatibility issues with some driversDiscussion here:https://www.raspberrypi.org/forums/viewtopic.php?f=29&t=113753##############################################################*** Downloading specific firmware revision (this will take a few minutes)% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed100 168 0 168 0 0 224 0 --:--:-- --:--:-- --:--:-- 306100 47.9M 100 47.9M 0 0 1107k 0 0:00:44 0:00:44 --:--:-- 1158k*** Updating firmware*** Updating kernel modules*** depmod 4.1.15-v7+*** depmod 4.1.15+*** Updating VideoCore libraries*** Using HardFP libraries*** Updating SDK*** Running ldconfig*** Storing current firmware revision*** Deleting downloaded files*** Syncing changes to disk*** If no errors appeared, your firmware was successfully updated to 12f0636cd11ebd7ec189534147ea23ce4f702e90*** A reboot is needed to activate the new firmware
pi@rasp$pi@rasp$ sudo reboot
<再起動後>pi@rasp$ uname -aLinux raspberrypi 4.1.15-v7+ #830 SMP Tue Dec 15 17:02:45 GMT 2015 armv7l GNU/Linuxpi@rasp$
pi@rasp$ sudo apt-get update:pi@rasp$ sudo apt-get upgradeパッケージリストを読み込んでいます... 完了依存関係ツリーを作成しています状態情報を読み取っています... 完了以下のパッケージは保留されます:iceweasel iceweasel-l10n-ja lxpanel lxpanel-data minecraft-pi nuscratchraspberrypi-ui-mods以下のパッケージはアップグレードされます:libraspberrypi-bin libraspberrypi-dev libraspberrypi-doc libraspberrypi0libsmbclient libwbclient0 libxml2 libxml2-utils python-libxml2python-rpi.gpio python3-rpi.gpio raspberrypi-bootloader samba-commonsmbclientアップグレード: 14 個、新規インストール: 0 個、削除: 0 個、保留: 7 個。71.6 MB のアーカイブを取得する必要があります。この操作後に追加で 795 kB のディスク容量が消費されます。続行しますか [Y/n]? y取得:1 http://archive.raspberrypi.org/debian/ wheezy/main python-rpi.gpio armhf 0.6.1~wheezy-1 [47.9 kB]取得:2 http://mirrordirector.raspbian.org/raspbian/ wheezy/main libxml2 armhf 2.8.0+dfsg1-7+wheezy5 [825 kB]:
:libraspberrypi-bin (1.20151118-1) を設定しています ...pi@rasp$
<再起動>pi@rasp$ uname -aLinux raspberrypi 4.1.13-v7+ #826 SMP PREEMPT Fri Nov 13 20:19:03 GMT 2015 armv7l GNU/Linuxpi@rasp$