ファイルの読み込みとモード
f = open('sample.txt','r') #ファイルを開く
text = f.read() #内容を読み込む
モード
r:ファイルの読み込み
w:ファイルへの上書き
a:ファイルへの追記
ファイルを1行ずつ読み込む
ファイルを閉じる
f = open('sample.txt','r')
for line in f:
line = line.rstrip()
f.close()
ファイルに書き込む
f = open('sample.txt','w')
f.write('new\n') #\nは改行コード
f.close
ファイルに追記する
f = open('sample.txt','a')
f.write('new\n')
f.close
withを用いてファイル処理
with open('sample.txt','w') as f:
f.write('new\n')
ファイルのエンコーディング
f = open('test.txt','r',encoding='utf-8)
text = f.read()
GUIプログラムのインポート
import tkinter (as tk)
ウィンドウの表示
タイトルの設定
import tkinter as tk
win = tk.Tk()
win.title('title')
win.minsize(320,240) #(x,y)
win .mainloop()
tkオブジェクトのメソッド
ウィンドウの破棄
ウィンドウの幅と高さ、位置
タイトルの左とタスクバーに表示されるアイコン
サイズ変更が可能か
destroy()
geometry('幅*高さ+x+y')
iconbitmap(ICO ファイル名)
#ICOはウィンドウズで使用するアイコンの画像ファイル
resizable(幅,高さ) #returnはTrue or Flase(True,False)
ラベルの配置
import tkinter as tk
win = tk.Tk()
label. = tk.label(win,text = 'テスト',bg = 'white')
label.place(x = 5,y=5)
win.mainloop()
ボタンの配置
import tkinter as tk
def push():
print('押された')
win = tk.TK()
btn = tk.Button(win,text='push',command = push)
btn.place(x=0,y=0)
win .mainloop()
四角形を描画する
"import tkinter as tk
win = tk.TK()
c = tk.Canvas(win,bg = 'lightgray')
c.place(x = 0,y = 30)
c.create_rectangle(10,10,60,60,fill = 'write') # 四角形を描画
win .mainloop()"
図形描画のメソッド
直線
楕円
四角形
多角形
画像
文字列を描画
描画した図形の消去
create_line(x1,y1,x2,y2,tag='タグ名')
create_oval(x1,y1,x2,y2,tag='タグ名')
create_rectangle(x1,y1,x2,y2,tag=''タグ名)
create_polygon(x1,y1,x2,y2,x3,y3...,tag='タグ名')
create_image(x,y,image='読み込んだ画像',tag='タグ名)
create_text(x,y,text='文字列',fill='文字色',tag='')
delete(削除したい図形のタグ)
チェックボックスの配置
import tkinter as tk
def check():
print('犬',v1.get(),'猫',v2get())
v1 = tk.BooleanVar()
v2 = tk.BooleanVar()
v1.set(False)
v2.set(True)
cb1 = tk.Checkbutton(win,text='犬',variable=v1)
cb2 = tk.Checkbutton(win,text='犬',variable=v1)
cb1.place(x=30,y=0)
cb2.place(x=30,y=0)
win = tk.TK()
btn = tk.Button(win,text='push',command = check)
btn.place(x=0,y=0)
win .mainloop()
スライダを使う
import tkinter as tk
def size():
print('slider:',v)
win = tk.TK()
s = tk.Scale(win,orient = 'h',command = size) # スライダの生成
s.place(x=0,y=0)
win .mainloop()
1行入力
import tkinter as tk
win = tk.TK()
e = tk.Entry(win,width=16)# エントリー部品の生成
e.place(x=0,y=0)
e.get() #エントリー部品の値を取り出す
e.delete(0,tk.END) #エントリー部品を空にする
win.mainloop()
bind
e.bind('<Return>',draw) #Enterキーが押されたらdraw関数を実行する
bindのイベント
<Button-1>:左マススボタンが押された時
<Button-3>:右マウスボタンが押された時
<Double-Button-1>:左マウスボタンがダブルクリックされた時
<Double-Button-3>:右マウスボタンがダブルクリックされた時
<Enter>:マウスポインタがその部品に入った時
<BackSpace>:BackSpaceが押された時
<Tab>:tabが押された時
<Left>,<Right>:左or右矢印が押された時
<UP>,<Down>:上,下矢印が押された時
<space>:スペースが押された時
<Return>:エンターが押された時
<Key>:なんらかのキーが押され時
イベントオブジェクトの変数
def draw(event):
wdget:イベントを受け取った部品
x:マウスポインタのx座標
y:マウスポインタのy座標
char:押されたキーの文字
keycode:押されたキーコード
num:押されたマウスボタンの番号
type:イベントの種類
テキスト部品
import tkinter as tk
import tkinter.scrolledtext as tkst
win = tk.TK()
t = tkst.text(win)
t.place(x=0,y=0)
f = open('sample.txt','r',encording='utf'-8')
for line in f:
t.insert(tk.END,line)
#t.delete(index1,index2) :1~2までの文字列を削除
#t.serch(text,index):index以降にtextで指定した文字列があるか探す
win.mainloop()
メッセージボックス
import tkinter as tk
from tkinter import messagebox
win = tk.TK()
ret = messagebox.askyesno(title='確認',message='終了しますか?')
if ret==True:
win.destroy()#ウィンドウを破棄する
win.mainloop()
グラフ描画ライブラリのインポート
import matplotlib.pyplot as plt
折れ線グラフを書く
import matplotlib.pyplot as plt
data = [6,3.1,4.5,2.4,5,7,4,8]
plt.plot(data)
plt.show()
マーカ
plt.plot(data,marker='o')
o:circle
x:x
D:diamond
+:+
.:point
s:square
グリッドの追加
plt.grid(True)
ラベルとタイトル
plt.title('タイトル')
plt.xlabel('横軸')
plt.ylabel('縦軸')
複数のデータを一つに描画
import matplotlib.pyplot as plt
x = [10,20,30,40,50]
y1 = [1.20,1.61,1.54,1.57,1.69]
y2 = [1.25,1.37,1.28,1.21,1.19]
y3 = [1.22,1.60,1.18,1.13,1.08]
plt.plot(x,y1)
plt.plot(x,y2)
plt.plot(x,y3)
plt.show()
色の指定をする
汎用を指定する
plt.plot(data,marker='o',color='red')
color='blue','green'
plt.legemd(loc='upper left')
upper left
center center
lower lower
線種を指定する
plt.plot(data,marker='o',color='red',linestyle = '--')
--:実践
-:破線
-.:1点破線
::点線
散布図
plt.scatter(x1,y1,marker='o',color='red')
plt.scatter(x2,y2,marker='^',color='blue')
縦棒グラフ
横棒グラフ
積み上げ棒グラフ
plt.bar(x,data)
plt.barh(x,data)
plt.bar(x,data,bottom=dat1+data2,color='orange')
複数グラフを並べて表示
plt.subplot(1,2,1) #1行2列で表示し、1つ目という意味
plt.plot(x,data1)
plt.subplot(1,2,2) #1行2列で表示し、1つ目という意味
plt.plot(x,data2)
スクレイピングのライブラリ
pip install beautifulsoup4
import bs4
スクレイピング<li>
import bs4
html = open('index.html','r',encoding='utf-8')
soup = bs4.BeautifulSoup(html,'html.perser')
li = soup.find_all('li')
print(li)
スクレイピング文字列だけ取り出す
import bs4
html = open('index.html','r',encoding='utf-8')
soup = bs4.BeautifulSoup(html,'html.perser')
list = []
for li in soup.find_all(li):
list.append(li.string)
print(li)
入れ子要素の取得
import bs4
html = open('index.html','r',encoding = 'utf-8')
soup = bs4.BeautifulSoup(html,'html.perser')
list = []
for ol in soup.find_all('ol'):
for li in ol.find_all('li'):
list.append(li.string)
print(list)
条件を指定して要素を取得する
import bs4
html = open('index.html','r',encoding = 'utf-8')
soup = bs4.BeautifulSoup(html,'html.perser')
list = []
for ol in soup.find_all('ol',class_ = 'dessert'):
for li in ol.find_all('li'):
list.append(li.string)
print(list)
URLにアクセスしてHTMLを取得する
import bs4
import requests #HTTP通信
import time
URL = 'http://www.otsuma.ac.jp/news'
r = requests.get(URL)
s = bs4.BeautifulSoup(r.content,'html.perser')
list = []
for i in s.find_all('span',class_ = 'sub'):
list.append(i.string)
time.sleep(3600) # 3600秒待機
print(list)
複数ページにアクセスする
import bs4
import requests #HTTP通信
import time
URL = 'http://example.com/news/page'
for count in range(1,10):
r = requests.get(URL+str(count))
s = bs4.BeautifulSoup(r.content,'html.perser')
list = []
for i in s.find_all('span',class_ = 'sub'):
list.append(i.string)
time.sleep(3600) # 3600秒待機
time.sleep(5)
print(list)
データベースのimport
基本パターン
import sqlite3
con = sqlite3.connect('data.db') #データベースに接続する
c = con.cursor() #Cursor帯ジェクトを作成する
sql = 'SELECT * FROM users'
c.execute(sql)
con.commit()
con.close()
SQLの基本命令
CREATE:テーブルの作成
INSERT:テーブルへのデータの登録や挿入
SELECT:データの検索・表示
UPDATE:データの更新
DELETE:データの削除
テーブルの作成プログラム
import sqlite3
con = sqlite3.connect('data.db')
c = con.cursor()
sql = 'CREATE TABLE users(id INTEGER,name TEXT)'
c.execute(sql)
con.commite()
con.close()
テーブルの作成
メソッド
CREATE TABLE テーブル名(カラム名 データ型,...)
INTEGER:整数
NUMERIC:整数または小数
REAL:小数
TEXT:テキスト
BLOB:バイナリーデータ(画像,動画など)を格納
データベース名/data.db
テーブル名/uses
カラム名/id:INTEGER型
カラム名/name:TEXT型
データの挿入
INSERT INTO テーブル名(カラム1,カラム2,...) VALUES(値1,値2,...)
sql = 'INSERT INTO users(id, name) VALUES(1,"おおつま")'
c.execute(sql)
データの検索
SELECT 取得するカラム名 FROM テーブル名
sql = 'SELECT * FROM users'
for row in c.execute(sql):
print(row)
検索の条件を指定する
SELECT * FROM users WHERE id = 1
id >= 3
=:等しい
<>:等しくない
>:より大きい
>=:以上
<:より小さい
<=:以下
AND,OR演算子
あいまい検索
SELECT * FROM users WHERE name LIKE 'お%'
nameカラムの値が「お」で始まるデータが抽出
%き%:中間にきがある
結果表示をソートする
SELECT * FROM users ORDER BY id DESC #降順,高い→小さい
結果表示件数を制限する
SELECT * FROM users LIMIT 3
データの更新
UPDATE テーブル名 SET 更新データ WHERE 条件
sql = 'UPDATE users SET name ="さやま" WHERE id = 2'
c.execute(sql)
データの削除
DELETE FROM テーブル名 WHERE 条件
sql = 'DELETE FROM users WHERE id = 3'
自然言語処理を使えるようにする
pip install janome
from janome.tokenizer import Tokenizer
形態素解析をする
from janome.tokenizer import Tokenizer
t = Tokenizer()
tokens = t.tokenize('私の名前は真梨子です')
for token in tokens:
print(token)
形態素解析の変数7
surface:表層系
part_of_speech:品詞
infl_type:活用型
infl_form:活用形
base_fprm:基本形
reading:読み:読み
phonetic:発音:発音
listの結果
from janome.tokenizer import Tokenizer
t = Tokenizer()
tokens = t.tokenize('私の名前は真梨子です')
print(list(tokens))
結果
['私','の','名前','は','真梨子','です']
単語の出現回数を数える
from janome.tokenizer import Tokenizer
t = Tokenizer()
tokens = t.tokenize('私の名前は真梨子です')
count = 0
for token in tokens:
pos = token.part_of_serch
pos = pos.split(',')x
if pos[0] == '名詞':
print(token)
単語の出現回数を数える
analyzer
from janome.tokenizer import Tokenizer
t = Tokenizer()
text = '私の名前は真梨子です'
tf = [POSKeepFilter('名詞'),TokenCountFilter()]
a = Analyzer(token_filters = tf)
results = a.analyze(text)
for w,c in results: #フィルターを通過した単語と個数
print(w,c)
単語の出現回数を数える
from janome.tokenizer import Tokenizer
f = open('test.txt','r',encoding = 'shift_jis')
text = f.read
tf = [POSKeepFilter('名詞'),TokenCountFilter()]
a = Analyzer(token_filters = tf)
results = a.analyze(text)
s = sorted(results,key=lambda x:x[1],reverse = True)
for i,wc in enumerate(s): #フィルターを通過した単語と個数
print((i+1),':' ,wc)
HTMLからタグを外す,ユーザー辞書,フィルタの作り方
飛ばす
クライアントサーバモデル
クライアントプログラム:サーバプログラムが提供するサービスを利用する人(ユーザ)が使うプログラム
サーバプログラム:ユーザが利用するサービスを提供するプログラム
クライアントサーバモデルのメリットデメリット
各クライアントプログラムは自分以外のプログラムがどこで動いているか知る必要がない
クライアントプログラムを管理しやすい
サーバが停止しすると全システムが停止してしまう
サーバへ処理が集中するためシステム負荷が高くなる
相手の指定方法
IPアドレスで指定
windows:ipcongifコマンド→IPv4アドレス:IPアドレス
ポート番号
プログラムがサーバで2つ動いているときにクライアント側がどちらのプログラムにアクセスするかを指定するための番号
プログラムの基本パターン
クライアント
ライブラリのインポート
サーバプログラムと通信用のsocketを用意
IPアドレスとポート番号を指定する
サーバにデータを送信、サーバからデータの受信
プログラムの基本パターン
サーバ
必要なプログラムをインポートする
クライアントと通信用のsocketを用意
自分のポート番号を登録
1度に接続できるクライアントの数を設定
クライアントの接続を受ける
クライアントにデータの送受信をする
クライアントの最も短いプログラム
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('127.0.0.1',5555))
msg = input('メッセージ: ')
s.send(bytes(msg,encoding='utf-8'))
data = s.recv(1024)
print('server: ',str(data,encoding='utf-8'))
アドレスファミリーとソケットタイプ
AF_LOCAL:同一コンピュータ内の通信
AF_INET:インターネットプロトコルIPv4による別のコンピュータ間での通信
AF_INET6:インターネットプロトコルIPv6による別のコンピュータ間での通信
SOCK_STREAM:ストリーム型通信。順序と信頼性のある接続型(電話みたいな)の通信方式。低速
SOCK_DGRAM:データグラム型の通信。順序と信頼性のない非接続型(手紙みたいな)の通信方式。高速
サーバのプログラム
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print('server start')
s.bind(('',5555))
s.listen(10)
c,addr = s.accept()
print('connected')
data = c.recv(1024)
print('client: ',str(data,encoding='utf-8'))
c.send(bytes('メッセージを受け取りました',encoding='utf-8'))
s.close()
複数のクライアントと何度も通信できるようにする
エコーサーバ
#エコーサーバ
import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(('',5555))
s.listen(10)
c,addr = s.accept()
while True:
data = c.recv(1024)
c.send(data)
#クライアント
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('127.0.0.1',5555))
while True:
msg = input('メッセージ: ')
s.send(bytes(msg,encoding='utf-8'))
data = s.recv(1024)
print('server: ',str(data,ecoding='utf-8'))
print('server: ',str(data,encoding='utf-8'))
セレクト処理
import socket
import select
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(('',5555))
s.listen(10)
socks = [svr]
while True:
r,w,x = select.select(sockes,[],[])
for s in r:
if s is svr:
c,addr = svr.accept()
socks.append(c)
else:
msg = s.recv(1024)
if len(msg) != 0:
print(str(msg,encoding='utf-8'))
s.send(msg)
else:
socks.remove(s)
s.close()
チャットプログラムを製作する
サーバ
import socket
import select
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(('',5555))
s.listen(10)
socks = [svr]
while True:
r,w,x = select.select(sockes,[],[])
for s in r:
if s is svr:
c,addr = svr.accept()
socks.append(c)
else:
msg = s.recv(1024)
txt = str(msg,encoding='utf-8')
if txt != 'bye':
for c in socks:
if c is not svr:
c.send(msg)
else:
print('切断要求')
s.send(msg)
socks.remove(s)
s.close()
チャットプログラム
クライアント
終了処理
webアプリケーション
Django
pip install django
Djangoプロジェクトを作成する
> django-admin startproject mysite
>cd mysite
>python manage.py migrate
>python manage.py runserver
設定ファイルの変更
mysite/settings.py
106 LANGUAGE_CODE = 'ja'
109 TIME_ZONE = 'Asia/Tokyo'
Djangoアプリケーションを作成する
>cd ...mysite
>django-admin startapp hello
mtsite/settings.py
34 INSTALLED_APPS = [
'hello', #追加する
hello/views.py に下記を追加
from django.http.response import HttpResponse
def hello_world(request):
return HttpResponse('<H1>こんにちは!</H1>')
mysite/urls.py に下記を追加
17 from django.urls import path, include
urlpatterns = [
path('admin/',admin.siteurls),
path('hello/',include('hello.urls')),
]
hello/urls.pyを作成
from django.urls import path
from . import views
urlpatterns = [
path('',views.hello_world),
]
動作確認
>python manage.py runserver
テンプレートを使う
hello/templates/hello/ここにhtmlファイルを作成(index.html)
index.html:テンプレート特有の操作
<h1>{{text}}</h1>
今日のラッキーナンバーは{{num}}です
hello/views.py
ここでtextとnumの数値を設定
下記を追加
def index(request):
params = {'text':'これがテンプレートです',
'num':random.randint(1,10)}
return render(request,'hello/index.html',parms)
hello/urls.py
urlpatterns = [
path('',views.hello_world),
path('index',views.index),
]
テンプレートでif
html文
{% if age >= 20}
{{age}}歳:お酒は大丈夫です!
{% else %}
{{age}}歳:お酒は20歳になってから
{% endif %}
{% タグ名 引数 %}
or
{% タグ名 引数 %}
:
:
{% endタグ名 %}
静的ファイル
html文
{% load static %}
...
<img src="{% static 'hello/sky.png' %} alt="表示できません">
...
<img src="{% static pic %} alt="表示できません">の場合
hello/views.py
def png(request):
params = {'pic':'hello/sky.png',
return render(request,'hello/png.html',parms)
入力されたデータを処理する
form.html
...
<form action="" method="post">
{% csrf_token % }
{{form}}
<input type="submit" value="送信">
</form>
<p>{{result}}</p>
...
hello/forms.py#作成
from django import forms
class HelloForm(forms.Form):
name = formsCharField(label = '名前')
age = fofrms.InteferField(label = '年齢')
hello/views.py #追加する分だけを書く
...
from .forms import HelloForm
...
def form(request):
parms = {'form':None,'result':''}
if(request.method != 'POST')
parms['form'] = HelloForm()
parms['result'] = '入力された名前,年齢を表示'
else:
parms['form'] = HelloForm(request.POST)
parms['result'] = '名前:' + request.POST['name'] + ', ' + request.POST['age']
return render(request,'hello/form.html',parms)
hello/urls,py
...
urlpatterns = [
path('form',views.form)
]
数値計算ライブラリ
Numpy
pip install numpy
行列の作り方
import numpy as np
a = np.array([1,2,3]) #((1,2,3))でも可
print(a[0],a[-1]) #1 3
print(a[a >= 2]) # [2 3]
print(a[a % 2 == 0]) #2
a = np.array([[1,2,3],[4,5,6]])
a[0][0]
部分配列へのアクセス
a = np.array([1,2,3,4,5,6])
print(a[3:6]) # 4 5 6
print(a[::3]) # 1 4
print(a[::-1]) # 6 5 4 3 2 1
加減、スカラー倍、乗除算
a = np.array([1,2,3])
b = np.array([4,5,6])
print(a + b) # 5 7 9
print(a - b) # -3 -3 -3
print(a * 2) # 2 4 6
a / 2 0.5 1 1.5
a * b #4 10 18
a / b #0.25 0.4 0.5
加減、スカラー倍、乗除算
2列
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
a+b = [[6 8] [10 12] ]
a-b = [[-4 -4] [-4 -4]]
a*b = [[5 12] [21 32]]
a/b = [[0.2 0.333..] [0.4285 0.5]]
内積、行列同士の積
行列の計算は[サイズ]の一致
(行*列)= (m*a) * (a*n)
aの位置が一致していないと計算できない
ベクトルの外積
a = np.array([1,2,3])
b = np.array([4,5,6])
np.linalg.norm(a) #ノルム
np.cross(a,b) #外積
numpy配列の置換
a = np.array([1,2,3,4,5,6])
a = v.reshape(2.3) # 2行3列の行列へ
a # [[1,2,3],[4,5,6]]
型変換
a = np.array([1,2,3],dtype=no.float32)
a #1.2.3.
データ型
int8:符号あり8ビット整数型
int16:符号あり16ビット整数型
int32:符号あり32ビット整数型
int64:符号あり64ビット整数型
uint8:符号なし8ビット整数型
uint16:符号なし16ビット整数型
uint32:符号なし32ビット整数型
uint64:符号なし64ビット整数型
float16:半精度浮動小数点型
float32:単精度浮動小数点型
float64:倍精度浮動小数点型
bool:ブール型,True or False
csvファイルの読み込み
a = np.loadtxt('sample.txt',delimiter=',')
連立一次法的式の解法
ax + by = c
dx + ey = f
([[a,b],[d,e]]) * ([x,y]) = ([c,f])
A = np.array([[a,b],[d,e]])
v = np.array([x,y])
if np.linalg.det(A) !=0: #0ではないのでAは逆行列を持つ
B=np.linalg.inv(A)
print(np.dot(B,v)) #行列*行列
else:
print('解は存在しません')
Numpyの関数リスト
np.astype(a,dtype=型):aの要素の型を指定した方に変更する
np.append(a,b,axis = n):Numpy配列aにリストbを追加する命令。n=0を指定すると行に,n=1を指定するとれつに追加される
np.insert(a,m,b,axis=n):Numpy配列aのm成分目にリストbを挿入する.axisの働きはappendと同じ
np.delete(a,m,axis=n):Numpy配列aのm成分目の値を削除するaxisの働きはappendと同じ
a.sum(n):n=0なら各列の合計,n=1は各行の合計
a.max(n):n=0なら各列の最大,n=1は各行の最大
a.min(n):n=0なら各列の最小,n=1は各行の合計
a.mean(n):n=0なら各列の平均,n=1は各行の平均
np.arrange(n,m,k,dtype=型):nから始まり,kずつ増え、m未満までの数列を成分に持つNumpy配列を生成する
np.linspace(n,m,k,dtype=型):nから始まり,kずつ増え、m分割して得られる数列を成分に持つNumpy配列を生成する
np.empty((n,m),dtype=型):全成分が0である、サイズ(n,m)のNumpy配列を生成する。
np.zeros((n,m),dtype=型):全成分が0である、サイズ(n,m)のNumpy配列を生成する。
np.ones((n,m),dtype=型):全成分が1である、サイズ(n,m)のNumpy配列を生成する。
np.identity(n,dtype=型):体格成分が1である、サイズ(n,n)のNumpy配列(単位行列)を生成する
np.eye(n,dtype=型):identityと同様
np.loadtxt('ファイル名',delimiter='',dtype=型):指定したファイル名のファイルを読み込み,Numpy配列を生成する
np.where(x>10):Numpy配列xに対し徐見識を満たす成分の添え字を戻す
np.where(x>10,y,z):Numpy配列に対する条件式(x>10)に対し、条件式を満たす添え字の成分をy,条件式を満たさない成分をzと置き換える
画像処理ライブラリ
pip install opencv-python
pip install opencv-contrib-python
画像を表示する
import cv2
img = cv2.imread('sky.png')
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
ネガポジ反転
import cv2
img = cv2.imread('sky.png')
img = 255 - img
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
ピクセルの値を調べる
import cv2
img = cv2.imread('sky.png')
c = img[5,10]
print('BGR: ',c[0],c[1],c[2]) #BGR順であることに注意
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
グレースケール化する
import cv2
img = cv2.imread('sky.png')
height,width,d = img.shape #高さ,幅、深さ
for y in range(height):
for x in range(weight):
c = img[y,x]
gray = 0.3 * c[2] + 0.59 * c[1] + 0.11 * c[0]
img[y,x] = [gray.gray,gray]
#関数を使う場合
#gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
二値化処理
画像の色を0(黒)と1(白/255)の2段階に変化する
import cv2
img = cv2.imread('sky.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
r,b = cv2.threshold(gray,90,255,cv2.THRESH_BINARY) #閾値が90以上のものを255
#r,b = cv2.threshold(gray,0,cv2.THRESH_OTSU)#閾値が自動的に計算される
cv2.imshow('image',b)
cv2.waitKey(0)
cv2.destroyAllWindows()
フィルタ処理
畳み込み演算:線形フィルタ
filter = np.array([[1/9,1/9,1/9],
[1/9,1/9,1/9],
[1/9,1/9,1/9]])
dst = cv2.filter2D(img,-1,filter)
cv2.imshow('image'dst)
平滑化フィルタ
dst = cv2.blur(img,(3,3)) #平滑化フィルタ 3*3
dst = cv2.medianBlur(img,3) #メディアンフィルタ処理(3*3)
dst = cv2.Canny(img,thresholdl=90,threshold2=110) #エッジの抽出 微分処理
物体検出
テンプレートマッチング
import numpy as np
r = cv2.matchTemplate(target,temp,cv2.TM_CCOEFF_NORMED)
loc = np.where(r >= 0.85) #結果から類似度の高い位置を取得
for top_left in zip(*loc[::-1]):
bottom_right=(top_left[0] + temp.shape[1],top_left[1] + temp.shape[0] #右下の座標
cv2.rectangle(target,top_left,bottom_right,(0,0,255),2)
特徴点を用いた物体検出
d = cv2.AKAZE_create()
kpI,desI = d.detectANDCompute(img,None)
kpT,desT = d.detectAndCompute(target,None)
bf = cv2.BFMatcher()
matches = bf.natch(desI,desT)
顔検出
cas = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_alt.xml')
faces = cas.detctMultiScale(img,minSize=(100,100))
動画の表示
import cv2
v = cv2.VideoCapture('ball.mp4')
while True:
ret,frame = v.read()
if ret == False: break
cv2.imshow('image',frame)
if cv2.waitKey(10)==27: break
v.release()
cv2.destroyAllWindows()
動物体検出
import cv2
back = cv2.imread('background.png')
back = cv2.cvtColor(back,cv2.COLOR_BGR2GRAY)
v = cv2.VideoCapture('ball.mp4')
while True:
ret,frame = v.read()
if ret == False: break
frame = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
diff = cv2.absdiff(frame,back)
cv2.imshow('image',frame)
if cv2.waitKey(10)==27: break
v.release()
cv2.destroyAllWindows()
機械学習ライブラリ
畳み込みニューラルネットワーク
pip install scikit-learn
pip install tensorflow
pip install keras
学習
#学習器の作成
mlp = MLPClassifier(hidden_layer_sizers=(128,),activation='relu',verbose=True)
#訓練データで学習
mlp.fit(x_train,y_train)
#モデルの保存
joblib.dump(mlp,'model.pkl',compress = True)
#モデルのロード
mlp = joblib.load('model.pkl)
#予測
mlp.predict([a])
モデルの定義
model = Sequential()#モデルの構築
model.add(Dense(128,input_shape=(28*28,),activation='relu')) #層の追加
#model.add(Dense(128,activation='relu')) # 層をさらに追加
model.add(Dense(10,activation='softmax')) #出力層
model.summary() #モデルの表示
model.save('model_test') #モデルの保存
過学習とドロップアウト
ドロップアウト(結合をランダムに断つこと)で過学習の抑制ができる
model = Sequential()#モデルの構築
model.add(Dense(128,input_shape=(28*28,),activation='relu')) #層の追加
model.add(Dropout(0.3)) # ドロップアウト
model.add(Dense(10,activation='softmax')) #出力層
畳み込みニューラルネットワークのモデルの定義
model = Sequential() #モデルの作成
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1))) #畳み込み層:線形フィルター
model.add(MaxPooling2D(pool_size=(2,2))) #プーリング層:情報の圧縮:ある範囲から平均、最大のものを取り出す
model.add(Flatten()) #全結合層に渡すための1次元化
model.add(Dense(128,activation='relu')) #全結合層
model.add(Dense(10,activation='softmax')) #出力層
ファインチューニング
学習済みのモデルの持つパラメータの一部だけを学習しなおす