とか、など

プログラミングとか、画像処理とか、機械学習を勉強しようとして挫折中

あたらしい数理最適化を無料で試す

あたらしい数理最適化という本を買って,最適化を勉強しようと思ったら
Gurobiという商用のソルバを使っていて,割と無料トライアルの申請もめんどそうだったのでがっかりしていたのですが
mypulp というのがあって同じコードが動くっぽかったのでそっちを使えばいいよというだけの話です.
pip install mypulp でおけ

#線形最適化
from mypulp import *

model = Model("lo1")
x1 = model.addVar(name="x1")
x2 = model.addVar(name="x2")
x3 = model.addVar(ub=30.0, name="x3")
model.update()
model.addConstr(2*x1 + x2 + x3 <= 60)
model.addConstr(x1 + 2*x2 + x3 <= 60)
model.setObjective(15*x1 + 18*x2 + 30*x3, GRB.MAXIMIZE)
model.optimize()
print("Opt. Value = ", model.ObjVal)
for v in model.getVars():
    print(v.VarName, v.X)

#結果
#Opt. Value =  1230.0
#x1 10.0
#x2 10.0
#x3 30.0



プログラミングHaskell1-3章を読破

プログラミングHaskellを勉強中


3章の練習問題をやってみる(関数の:typeを調べるときは,先にlet で定義してやるべし)
注に書いてあるように,double, とかpalindromeとかはクラス制約がきちんと書かれている

--1.の答え
Prelude> :type ['a', 'b', 'c']
['a', 'b', 'c'] :: [Char]

Prelude>  :type ('a', 'b', 'c')
('a', 'b', 'c') :: (Char, Char, Char)

Prelude>  :type [(False, '0'), (True, '1')]
[(False, '0'), (True, '1')] :: [(Bool, Char)]

Prelude> :type ([False, True], ['0', '1'])
([False, True], ['0', '1']) :: ([Bool], [Char])

Prelude> :type [tail, init, reverse]
[tail, init, reverse] :: [[a] -> [a]]
--2.の答え
Prelude> let second xs = head (tail xs)
Prelude> :type second
second :: [a] -> a

Prelude> let swap (x, y) = (y, x)
Prelude> :type swap
swap :: (t1, t) -> (t, t1)

Prelude> let pair x y = (x, y)
Prelude> :type pair
pair :: t -> t1 -> (t, t1)

Prelude> let double x = x * 2
Prelude> :type double
double :: Num a => a -> a

Prelude> let palindrome xs = reverse xs == xs
Prelude> :type palindrome
palindrome :: Eq a => [a] -> Bool

Prelude> let twice f x = f (f x)
Prelude> :type twice
twice :: (t -> t) -> t -> t

3.は上のコード実行
4.はちょっとよくわからない.関数が全く同じものであることを示すには
すべての入力に対してすべての出力が同じにならなければいけないということ?
その場合内部のアルゴリズムの違いは気にしないでもよいのか?(クイックソートバブルソートみたいな感じで)
なんにせよ,入力の範囲が有限でなければ一般に同一であることを確かめられないから無理そう.
入出力の対応を数学的に証明できる場合は同等といえるか...



haskell はじめました

haskellを始めようと思う.これを読んで,少しおもしろそうだと思ったからです.

gihyo.jp

とはいえ,この記事途中から(具体的には3章くらいから)ついていけなくなったので.下の書籍で勉強を開始.

 

python3でgihyoの機械学習はじめようのナイーブベイズをやる

gihyoのナイーブベイズはpython2.6なので、python3でやり直してみる。

 

gihyo.jp

 

とりあえず、python3環境を用意

anacondaでpython3 - とか、など

beautifulsoupはanaconda だと元々入っているはず。。。

なければ

pip install beautifulsoup4

とする。

morphorogical.pyのimportを

import urllib
import urllib.parse
import urllib.request
from bs4 import BeautifulSoup

に変更。

urllibまわりの呼び出しを

sentence = sentence.encode("utf-8")
params = urllib.parse.urlencode({'appid':appid, 'results':results, 'filter':filter,'sentence':sentence}).encode('utf-8')
results = urllib.request.urlopen(pageurl, params)

に変更すればOK

あとは、maxintが廃止されたので

max = -sys.maxsizeに

classifierの

prob < maxは誤植だと思うので

prob > maxにする

print まわりは

words = 'ヴァンロッサム氏によって開発されました.'
print ('%s => 推定カテゴリ: %s' % (words ,nb.classifier(words)))

という感じに変更すれば、動きます。

お疲れ様でした。

 

あと、若干謎なのが、len(self.vacabularies)を足していることなんですよね。

 prob = (self.incategory(word, cat) + 1.0) / (sum(self.wordcount[cat].values()) + len(self.vocabularies) * 1.0) 

指定wordの数 / cat内の全単語数でいいと思うんですが...

 

 

macのpython3 opencv3 でcontrib(siftとかsurf)パッケージのインストール

macのpython3 opencv3環境でcontribパッケージを導入できたのでメモ

contribとはSIFTとかSURFとか研究では割と使うけど、特許の関係とか色々あるものを

分割した機能が入っているパッケージです。

anaconda環境に入れたけどvirtualenvでも一緒だと思う

とりあえず大変だった...

 

python3にopencvを入れてみる - とか、など

でcontribなしでは入れたけど、contribは入ってないため今回はcmakeでビルドして入れようと思う

 

とりあえずcmakeでビルドするのはここ

Install OpenCV 3 With Python 3 (Mac OSX) - Luis González

anaconda特有の問題(フラグの指定とかdlibの位置とかは)

osx - opencv 3.0.0 alpha with Python 3 failed to import cv2 - Stack Overflow

ここを参考に

 

 

とりあえず、新しく環境を作る

conda create -n py34cv3contrib python=3.4 anaconda

cmakeでビルドするので

GUI版のcmakeを入れておく

Download | CMake

でopencv3は

DOWNLOADS | OpenCV 

zipで落とす

contrib本体は

GitHub - Itseez/opencv_contrib: Repository for OpenCV's extra modules

からクローンするなりzipで落とすなりする。

 

で以下の設定をするわけだが、GUIでやるのを強くお勧めします。

まずsourceにさっき落としたopencvフォルダを

で次にdstをopencvフォルダの下にbuildとか作ってそこを指定

でcontribはさっき落としたcontribのフォルダのパスを

OPENCV_EXTRA_MODULES_PATH=/さっきのcontribpath/modules

を指定。

他の設定を(多分抜けはないと思うのですが...)

CMAKE_INSTALL_PREFIX=/Users/hogehoge/anaconda/envs/py34cv3contrib

PYTHON3_EXECUTABLE=/Users/hogehoge/anaconda/envs/py34cv3contrib/bin/python3

PYTHON3_LIBRARY=/Users/admin/anaconda/envs/py34cv3contrib/lib/libpython3.4m.dylib 

PYTHON3_INCLUDE_DIR=/Users/hogehoge/anaconda/envs/py34cv3contrib/include/python3.4m


PYTHON3_NUMPY_INCLUDE_DIRS=/Users/hogehoge/anaconda/envs/py34cv3contrib/lib/python3.4/site-packages/numpy/core/include


PYTHON3_PACKAGES_PATH=/Users/hogehoge/anaconda/envs/py34cv3contrib/lib/python3.4/site-packages

 

そしたら、generateとconfigureを押して完了したら

ターミナルでbuildフォルダに移動して

make -j4

終わったら

sudo make install

でpy34cv3contribの環境にがバーッとインスコされます。

 

あともう少し

最後に、cv2.soが参照するdylibの位置を教えてあげる必要があります。

自分が怒られたのはこの二つだけでした。

hogehogeは自分のユーザ名に変更してください

 

sudo install_name_tool -change libpython3.4m.dylib /Users/hogehoge/anaconda/envs/py34cv3contrib/lib/libpython3.4m.dylib /Users/hogehoge/anaconda/envs/py34cv3contrib/lib/python3.4/site-packages/cv2.so

 

sudo install_name_tool -change lib/libopencv_hdf.3.1.dylib /Users/hogehoge/anaconda/envs/py34cv3contrib/lib/libopencv_hdf.3.1.dylib /Users/hogehoge/anaconda/envs/py34cv3contrib/lib/python3.4/site-packages/cv2.so
done

 

これで、完了。お疲れさまです。

試しに、lennaさんを落としてきて、下のを実行してみてください。

 

import cv2
import numpy as np
from matplotlib import pyplot as plt

imgOrg = cv2.imread( './lenna.png' )
imgGray = cv2.cvtColor( imgOrg, cv2.COLOR_BGR2GRAY )
sift = cv2.xfeatures2d.SIFT_create( nfeatures = 0, nOctaveLayers = 3, contrastThreshold = 0.04, edgeThreshold = 10, sigma = 1.6 )
keypoints, descriptors = sift.detectAndCompute( imgGray, None )
imgDst = np.empty_like( imgOrg )
cv2.drawKeypoints( imgOrg, keypoints, imgDst, -1, flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS )

cv2.imshow( 'hoge', imgDst )
cv2.waitKey( 0 )
cv2.destroyAllWindows()

 

こんな感じで特徴点が表示されればOKです。

ついにmac python3, opencv3でSIFTを使えるようになりました!!

誰かcontrib付きpipで入れられるようにしてくんねーかな

 

f:id:hikuIchi:20160223220800p:plain

 

 

 

 

 

PySideをanacondaで使おうとしてハマったこと

pysideでhelloworldするまでに割と時間がかかったので手順をメモ

特にImage not found に悩まされた....

 

最初に

brew install cmake

brew install qt

をして

pip install PySideする

意気揚々とtutoriの↓を実行するも

import sys
from PySide.QtCore import *
from PySide.QtGui import *

# Create a Qt application
app = QApplication(sys.argv)
# Create a Label and show it
label = QLabel("Hello World")
label.show()
# Enter Qt application main loop
app.exec_()
sys.exit()

 

Library not loaded: @rpath/libpyside.cpython-34m.1.2.dylib

Referenced from: /Users/hogehoge/anaconda/envs/py34con/lib/python3.4/site-packages/PySide/QtCore.so

  Reason: image not found

 

となる、QtCore.soのrpathの下にdylibがないと言っているので

rpathを追加してあげる。ないって言っているファイルがあるとこを探して

install_name_toolで追加、自分の場合は下の4つで動いた

install_name_tool -add_rpath /Users/hogehoge/anaconda/envs/py34con/lib/python3.4/site-packages/PySide QtGui.so

install_name_tool -add_rpath /Users/hogehoge/anaconda/envs/py34con/lib/python3.4/site-packages/PySide QtCore.so

install_name_tool -add_rpath /Users/hogehoge/anaconda/lib QtGui.so

install_name_tool -add_rpath /Users/hogehoge/anaconda/lib QtCore.so

python3 opencv3入門-ラベリング

さてさて、二値化、フィルタ、モフォロジーときたら次はラベリングですね。

 

二値化して、モフォロジーをかけたら、次は孤立領域ごとに分けたくなるというのが人情です。opencvにはconnectedComponentsという関数がありまして、これを二値画像に適応するといい感じに分離してくれます。

nLabelsにはいくつの孤立領域があるか、labelImageにはラベリング済みの画像が入ります。

 

import cv2
import numpy as np
import copy
import random
from matplotlib import pyplot as plt

img = cv2.imread('./images/test1.png', cv2.IMREAD_COLOR)#カラー画像としてよみ出し
height, width, channels = img.shape[:3]
dst = copy.copy(img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV) #白対領域となるのでINVを指定
nLabels, labelImage = cv2.connectedComponents(binary)

colors =
for i in range(1, nLabels + 1):
colors.append(np.array([random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)]))


for y in range(0, height):
for x in range(0, width):
if labelImage[y, x] > 0:
dst[y, x] = colors[labelImage[y, x]]
else:
dst[y, x] = [0, 0, 0]

print(nLabels)
plt.subplot(121), plt.imshow(img, 'gray'), plt.title('ORIGINAL')
plt.xticks(), plt.yticks()
plt.subplot(122), plt.imshow(dst, 'gray'), plt.title('LABEL')
plt.xticks(
), plt.yticks([])
plt.show()

f:id:hikuIchi:20160214154548p:plain

 

孤立領域ごとに明るさが違うのがわかりますでしょうか。

コードはここを参考にしました

[OpenCV Python]OpenCVを使ったラベリング · atinfinity/lab Wiki · GitHub