空飛ぶロボットのつくりかた

ロボットをつくるために必要な技術をまとめます。ロボットの未来についても考えたりします。

Hough変換で直線、円検出をやってみる

確率的ハフ変換による直線検出

f:id:robonchu:20170821152747j:plain

import cv2
import numpy as np

img = cv2.imread('dave.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
minLineLength = 100
maxLineGap = 10
lines = cv2.HoughLinesP(edges,1,np.pi/180,10,minLineLength,maxLineGap)
for x1,y1,x2,y2 in lines[0]:
    cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)

cv2.imwrite('houghlines.jpg',img)

f:id:robonchu:20170821152839j:plain

参考:ハフ変換による直線検出 — OpenCV-Python Tutorials 1 documentation

円検出

f:id:robonchu:20170821162945j:plain

circles = cv2.HoughCircles(image, cv2.HOUGH_GRADIENT, dp=2, minDist=20, param1=20, param2=20, minRadius=6, maxRadius=20 )

パラメータ

dp ・・・ 処理するときに元画像の解像度の倍率.1だとそのままの画質で処理

minDist ・・・ 検出される円と円の最小距離

param1 ・・・ 低いほどいろんなエッジを検出

param2 ・・・ 低いほど円じゃないものも検出

minRadius ・・・ 最小半径

maxRadius ・・・ 最大半径

動作確認用雑なコード↓

import cv2
import numpy as np

cap = cv2.VideoCapture(0)

while(1):
    # Take each frame
    _, frame = cap.read()

    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    lower_light_pink = np.array([168, 50, 50])
    upper_light_pink = np.array([188, 255, 255])
    mask = cv2.inRange(hsv, lower_light_pink, upper_light_pink)

    circles = cv2.HoughCircles(mask,cv2.HOUGH_GRADIENT,1,20,
                                param1=50,param2=20,minRadius=0,maxRadius=0)

    if circles is None:
        cv2.imshow('frame',frame)
        k = cv2.waitKey(5) & 0xFF
        if k == 27:
            break
        pass
    else:
        circles = np.uint16(np.around(circles))

        circle = []
        x = []
        y = []

        for i in circles[0,:]:
            x.append(i[0])
            y.append(i[1])
            circle.append(i[2])

        idx = circle.index(max(circle))
        cv2.circle(frame,(x[idx],y[idx]),circle[idx],(0,255,0),2)
http://www.digifie.jp/blog/archives/1438
        cv2.imshow('frame',frame)
        k = cv2.waitKey(5) & 0xFF
        if k == 27:
            break

cv2.destroyAllWindows()

f:id:robonchu:20170821163010j:plain

所感

円検出のパラメータ調整難しい…

参考: 円の検出 - TB-code

Python cv2.HoughCircles で円検出 – LLC DigiFie

c++とframe rateの高いカメラを使えばもう少し円検出の速度が挙げれるみたい。。。

マーカーを用いたカメラ位置姿勢推定(OpenCV+ArUco)

ArUcoのマーカー種類

  • SingleMarker
  • Board
  • ChessBoard
  • Diamond

Single

マーカの一辺の長さを指定。 マーカとカメラ間の位置関係を求める。

Board

マーカの一辺の長さとマーカ間の長さを指定。 ボードとカメラ間の位置関係を求める。 単一マーカより精度は良い。

Chess

四角形の一辺の長さとマーカの一辺の長さを指定。 チェッカの交点を求める。

Diamond

四角形の一辺の長さとマーカの一辺の長さを指定。 ダイアモンドとカメラ間の位置関係を求める

参考: すごくわかりやすい↓

OpenCVarucoマーカ - プログラム関連の個人的メモ

ArUcoを使った位置姿勢推定

手順

  1. cameraのキャリブレーション
  2. マーカー作成・検出
  3. 位置姿勢推定

OpenCV: Detection of ArUco Markers

OpenCV: ArUco Marker Detection

キャリブレーション

ArUcoで姿勢推定を行うにはカメラの内部パラメータと歪パラメータ(cameraMatrix,distCoeffs)が必要

OpenCVでのカメラキャリブの説明

cameraMatrix and distCoeffs are the camera calibration parameters that need to be known a priori.

To perform camera pose estimation you need to know the calibration parameters of your camera. This is the camera matrix and distortion coefficients. If you do not know how to calibrate your camera, you can take a look to the calibrateCamera() function and the Calibration tutorial of OpenCV. You can also calibrate your camera using the aruco module as it is explained in the Calibration with aruco tutorial. Note that this only need to be done once unless the camera optics are modified (for instance changing its focus).

やり方

  1. キャリブしたいカメラでチェスボードを用いて20枚くらいの写真を取る

  2. その写真を用いて以下のようなスクリプトを実行

opencv/samples/cpp at master · kipr/opencv · GitHub ←ここのsample画像を用いて試してみる

import numpy as np
import cv2
import glob

# termination criteria
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)

# prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0)
objp = np.zeros((6*7,3), np.float32)
objp[:,:2] = np.mgrid[0:7,0:6].T.reshape(-1,2)

# Arrays to store object points and image points from all the images.
objpoints = [] # 3d point in real world space
imgpoints = [] # 2d points in image plane.

images = glob.glob('left*.jpg')

for fname in images:
    img = cv2.imread(fname)
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

    # Find the chess board corners
    ret, corners = cv2.findChessboardCorners(gray, (7,6),None)

    # If found, add object points, image points (after refining them)
    if ret == True:
        objpoints.append(objp)

        corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
        imgpoints.append(corners2)

        # Draw and display the corners
        img = cv2.drawChessboardCorners(img, (7,6), corners2,ret)
        cv2.imshow('img',img)
        cv2.waitKey(500)

ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1],None,None)

#cameraMatrix -> mtx , distCoeffs -> dist
print mtx, dist

cv2.destroyAllWindows()

結果:

mtx = [[ 534.07088318    0.          341.53407683]
 [   0.          534.11914504  232.94565267]
 [   0.            0.            1.        ]]

dist =  [[ -2.92971622e-01   1.07706883e-01   1.31038412e-03  -3.11032204e-05  4.34799808e-02]]

Calibrationの結果を今後も再利用したければ,Numpyの関数(np.savez, np.savetxt 等)を使ってカメラ行列とレンズ歪みパラメータを保存できる。

参考:

OpenCVのundistort(レンズ歪み補正)で端っこが欠けてしまうのをなんとかする - Qiita

カメラ校正 - Qiita

カメラキャリブレーション — OpenCV-Python Tutorials 1 documentation

OpenCV: Camera Calibration and 3D Reconstruction

マーカー作成・検出

#encoding:utf-8
import cv2
aruco = cv2.aruco

# DICT_4X4_50は4x4の格子でマーカ作成、ID50個
# drawMarker(dictionary, marker ID, marker_size[pix])
dictionary = aruco.getPredefinedDictionary(aruco.DICT_4X4_50)
marker = aruco.drawMarker(dictionary, 4, 100)

cv2.imwrite('ar_marker.png', marker)

img = cv2.imread('ar_marker.png')
img = cv2.resize(img, None, fx=0.05, fy=0.05)

corners, ids, rejectedImgPoints = aruco.detectMarkers(img, dictionary)

aruco.drawDetectedMarkers(img, corners, ids, (0,255,0))
cv2.imwrite('DetectedMarkers.png', img)

位置姿勢推定(TODO:pytho化)

参考になるコード

// if at least one marker is detected
if (ids.size() > 0){
  // single marker
  if (markerType == ARUCO_SingleMarker){
    // draw id
    cv::aruco::drawDetectedMarkers(undistImage, corners, ids);

    // pose estimation
    rvecsSingle.clear(); tvecsSingle.clear();
    cv::aruco::estimatePoseSingleMarkers(corners, markerSingleSize,
      intrinsic, distortion, rvecsSingle, tvecsSinge);

    // draw axis
    for (int ii = 0; ii < ids.size(); ii++)
      cv::aruco::drawAxis(undistImage, intrinsic, distortion,
        rvecsSingle[ii], tvecsSingle[ii], 0.1);    
  }
  // board
  else if (markerType == ARUCO_Board){
    cv::aruco::drawDetectedMarkers(undistImage, corners, ids);
    int valid = cv::aruco::estimatePoseBoard(corners, ids, 
      markerBoard, intrinsic, distortion, rvecBoard, tvecBoad);

    // if at least one board marker detected
    if (valid > 0)
      cv::aruco::drawAxis(undistImage, intrinsic, distortion,
        rvecBoard, tvecBoard, 0.1);
  }

Single

cv::aruco::estimatePoseSingleMarkers

マーカの位置推定を行う。 rvecs, tvecsにそれぞれのマーカとの位置関係が入っている。

rが回転成分、tが直進成分。回転成分に関してはrodrigues。 http://opencv.jp/opencv-2svn/cpp/camera_calibratio…

Board

cv::aruco::estimatePoseBoard

見つけたマーカ全部の情報を使ってボードの位置推定を行う。 マーカがある程度隠れていてもOKで精度も良い。

参考:

OpenCVarucoマーカ - プログラム関連の個人的メモ

全体参考

ArUco マーカーの検出 - Qiita

arucoモジュール を試す - 機械学習備忘録

OpenCV: ArUco Marker Detection

arucoモジュールでマーカーを検出する · atinfinity/lab Wiki · GitHub

開発メモ その59 OpenCV 3.2 with ContribモジュールでArUcoを使用する - A certain engineer "COMPLEX"

OpenCVarucoマーカ - プログラム関連の個人的メモ

物体追跡をやってみる(ピンクのボールを追いかける)

やりたいこと:ピンクボールの追跡

f:id:robonchu:20170819115402j:plain

OpenCV-Python tutorial

OpenCV-Pythonチュートリアル — OpenCV-Python Tutorials 1 documentation

OpenCVでのHSVの扱い

OpenCVでのHSV色空間lower,upperの取り扱い - Qiita

ピンクの色相の検出

lightsalmon : 255,160,167

lower_pink = np.array([168, 100, 100])

upper_pink = np.array([188, 255, 255])

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(1):
    _, frame = cap.read()
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    lower_light_pink = np.array([168, 100, 100])
    upper_light_pink = np.array([188, 255, 255])
    mask = cv2.inRange(hsv, lower_light_pink, upper_light_pink)

    res = cv2.bitwise_and(frame,frame, mask= mask)

    cv2.imshow('frame',frame)
    cv2.imshow('mask',mask)
    cv2.imshow('res',res)
    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break

cv2.destroyAllWindows()

参考:色名称付色見本[赤、ピンク、茶系] – コピペで出来る!簡単ホームページ作成入門

【Python/OpenCV】カラートラッキング(色追跡)で移動物体の検出

最大矩形を追跡

作成したmaskの中で、一番大きいものだけを追跡する(矩形で囲む)

ROI:Region Of Interest

以下を上記のスクリプトに追加↑

    image, contours, hierarchy  = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    rects = []
    for contour in contours:
        approx = cv2.convexHull(contour)
        rect = cv2.boundingRect(approx)
        rects.append(np.array(rect))

    if len(rects) > 0:
      rect = max(rects, key=(lambda x: x[2] * x[3]))
      cv2.rectangle(frame, tuple(rect[0:2]), tuple(rect[0:2] + rect[2:4]), (0, 0, 255), thickness=2)

参考: pythonで赤い物体を認識しよう - Qiita

camshiftで追跡

ヒストグラムとは

ヒストグラムとは画像中の画素値の全体的な分布を知るためのグラフやプロットとみなせます.

ヒストグラム その1: 計算して,プロットして,解析する !!! — OpenCV-Python Tutorials 1 documentation

ヒストグラム逆投影法

各画素が対象物体に属している確率を表す.入力画像と同じサイズで単相の画像を作成します.

ヒストグラム その4: ヒストグラムの逆投影法 — OpenCV-Python Tutorials 1 documentation

パラメータ

  • cv2.TERM_CRITERIA_EPS - 指定された精度(epsilon)に到達したら繰り返し計算を終了する.

  • cv2.TERM_CRITERIA_MAX_ITER - 指定された繰り返し回数(max_iter)に到達したら繰り返し計算を終了する.

かなり適当なコード(TODO:リファクタ、マウスでクリックした箇所のHSV値の利用)

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

print raw_input("please set the tracking object and input key")

# Need adjustment
lower_light_pink = np.array([168, 100, 100])
upper_light_pink = np.array([188, 255, 255])

_LOWER_COLOR = lower_light_pink
_UPPER_COLOR = upper_light_pink

print _LOWER_COLOR[0]

def find_rect_of_target_color(image):
  hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

  # Threshold the HSV image to get only pink colors
  mask = cv2.inRange(hsv, _LOWER_COLOR, _UPPER_COLOR)
  image, contours, hierarchy  = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

  rects = []
  for contour in contours:
    approx = cv2.convexHull(contour)
    rect = cv2.boundingRect(approx)
    rects.append(np.array(rect))
  return rects

def get_max_rect(rects):
    if len(rects) > 0:
      rect = max(rects, key=(lambda x: x[2] * x[3]))
      return rect
    else:
      return None

def get_track_info(rect):
    # setup initial location of window
    r, h, c, w = rect[1], rect[3], rect[0], rect[2]
    track_window = (c,r,w,h)

    # set up the ROI for tracking
    roi = frame[r:r+h, c:c+w]
    hsv_roi =  cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
    mask = cv2.inRange(hsv_roi, _LOWER_COLOR, _UPPER_COLOR)
    
    # Need adjustment
    roi_hist = cv2.calcHist([hsv_roi],[0],mask,[int(_UPPER_COLOR[0])],[0,int(_UPPER_COLOR[0])])
    cv2.normalize(roi_hist,roi_hist,0,255,cv2.NORM_MINMAX)

    # Setup the termination criteria, either 10 iteration or move by atleast 1 pt
    term_crit = ( cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1 )
    return roi_hist, track_window, term_crit

# Set Initial Value
while(1):
  # take first frame of the video
  ret,frame = cap.read()
  rects = find_rect_of_target_color(frame)
  rect = get_max_rect(rects)
  if rect is not None:
    roi_hist, track_window, term_crit = get_track_info(rect)
    break

# Start Tracking
while(1):
    ret ,frame = cap.read()

    if ret == True:
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)        
        dst = cv2.calcBackProject([hsv],[0],roi_hist,[0,180],1)

        # apply camshift to get the new location
        # ret = ([x,y],[width,height],deg) ex: [640, 480],[10,10],30
        ret, track_window = cv2.CamShift(dst, track_window, term_crit)

        # Draw it on image
        pts = cv2.boxPoints(ret)
        pts = np.int0(pts)
        img = cv2.polylines(frame,[pts],True, 255,2)
        cv2.imshow('img',img)

        print pts
        # origin is upper left
        frame_size = frame.shape
        print "position_x_rate"
        print (pts[0][0]+pts[2][0])/2.0/frame_size[1]
        print "position_y_rate"
        print (pts[0][1]+pts[2][1])/2.0/frame_size[0]

        k = cv2.waitKey(60) & 0xff
        if k == 27:
            break
        else:
            cv2.imwrite(chr(k)+".jpg",img)
    else:
        break

cv2.destroyAllWindows()
cap.release()

参考: Meanshift と Camshift — OpenCV-Python Tutorials 1 documentation

パーティクルフィルタで追跡

import numpy as np
import cv2

# Need adjustment
lower_light_pink = np.array([168, 50, 50])
upper_light_pink = np.array([188, 255, 255])

_LOWER_COLOR = lower_light_pink
_UPPER_COLOR = upper_light_pink

def tracking():
    cap = cv2.VideoCapture(0)

    filter = ParticleFilter()
    filter.initialize()

    while True:
        ret, frame = cap.read()

        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

        # Threshold the HSV image to get only a color
        mask = cv2.inRange(hsv, _LOWER_COLOR, _UPPER_COLOR)

        # Start Tracking
        y, x = filter.filtering(mask)
        frame = cv2.circle(frame, (int(x), int(y)), 10, (255, 0, 0), -1)

        # origin is upper left
        frame_size = frame.shape
        print "position_x_rate"
        print x/frame_size[1]
        print "position_y_rate"
        print y/frame_size[0]

        for i in range(filter.SAMPLEMAX):
            frame = cv2.circle(frame, (int(filter.X[i]), int(filter.Y[i])), 2, (0, 0, 255), -1)
        cv2.imshow("frame", frame)

        if cv2.waitKey(20) & 0xFF == 27:
            break
    cap.release()
    cv2.destroyAllWindows()

class ParticleFilter:
    def __init__(self):
        self.SAMPLEMAX = 1000
        # frame.shape
        self.height, self.width = 480, 640

    def initialize(self):
        self.Y = np.random.random(self.SAMPLEMAX) * self.height
        self.X = np.random.random(self.SAMPLEMAX) * self.width

    # Need adjustment for tracking object velocity
    def modeling(self):
        self.Y += np.random.random(self.SAMPLEMAX) * 200 - 100 # 2:1
        self.X += np.random.random(self.SAMPLEMAX) * 200 - 100

    def normalize(self, weight):
        return weight / np.sum(weight)

    def resampling(self, weight):
        index = np.arange(self.SAMPLEMAX)
        sample = []

        # choice by weight 
        for i in range(self.SAMPLEMAX):
            idx = np.random.choice(index, p=weight)
            sample.append(idx)
        return sample

    def calcLikelihood(self, image):
        # white space tracking 
        mean, std = 250.0, 10.0
        intensity = []

        for i in range(self.SAMPLEMAX):
            y, x = self.Y[i], self.X[i]
            if y >= 0 and y < self.height and x >= 0 and x < self.width:
                intensity.append(image[int(y),int(x)])
            else:
                intensity.append(-1)

        # normal distribution
        weights = 1.0 / np.sqrt(2 * np.pi * std) * np.exp(-(np.array(intensity) - mean)**2 /(2 * std**2))
        weights[intensity == -1] = 0
        weights = self.normalize(weights)
        return weights

    def filtering(self, image):
        self.modeling()
        weights = self.calcLikelihood(image)
        index = self.resampling(weights)
        self.Y = self.Y[index]
        self.X = self.X[index]
        
        # return COG
        return np.sum(self.Y) / float(len(self.Y)), np.sum(self.X) / float(len(self.X))

if __name__ == '__main__':
    tracking()

参考:

パーティクルフィルタ組んでみた(Python) - コンピュータサイエンス系勉強ノート

Numpyによる乱数生成まとめ - Qiita

python + numpyで緑色の物体を追跡する (パーティクルフィルタ) - Qiita

Particle FilterでOpencvを使った物体追跡 - のんびりしているエンジニアの日記

Python版OpenCVのパーティクルフィルタで物体追跡

satomacoto: Pythonでパーティクルフィルタを実装してみる

particlefilter/particlefilter_py.py at master · AriYu/particlefilter · GitHub

pythonでパーティクルフィルタによる物体トラッキング - kohta blog

オプティカルフロー(Lucas-Kanade法)で追跡

cv2.goodFeaturesToTrack

コーナー検出器。8bitの画像とコーナーに関する設定を行うことでコーナーが検出される。

cv2.calcOpticalFlowPyrLK

8bitの画像を前後の二枚と検出したい点の集合(feature)やwinSizeを指定すると、後の画像上の特徴点が抽出される。

cv2.cornerSubPix

コーナー検出の高精度化。

Harrisコーナー検出 — OpenCV-Python Tutorials 1 documentation

cv2.dilate

膨張処理

Python OpenCV3で画素の膨張処理(dilation)と収縮処理(erosion) (ちょっと解説も) | from umentu import stupid

cv2.connectedComponentsWithStats

重心・面積・外接矩形の座標が得らる。

Harrisコーナー検出 — OpenCV-Python Tutorials 1 documentation

参考: qiita.com

OpenCVでオプティカルフローをリアルタイムに描画する(Shi-Tomasi法、Lucas-Kanade法) - Qiita

全体参考

毎日がロボット勉強会: 10.ロボットビジョン(応用編その1) 

モーション解析と物体追跡 — opencv 2.2 (r4295) documentation

人追跡

OpenCVで簡単リアルタイム物体検出 | AI coordinator

 Nobutobook: 【Python × OpenCV】 はじめての歩行者検知

機械の目が見たセカイ -コンピュータビジョンがつくるミライ (27) 動く人・物を追跡する(1) - OpenCVによるトラッキング | テクノロジー | マイナビニュース

顔追跡

【ライブラリ】pyFaceTracker:顔パーツ追跡「FaceTracker」のpythonラッパー... | DERiVE コンピュータビジョン ブログ

OpenCVで簡単リアルタイム物体検出 | AI coordinator

マーカー

Aruco-with-Python/aruco_testproject/build at master · JanezCim/Aruco-with-Python · GitHub

Opencvを用いたマーカー検出(仮 - Qiita

arucoモジュールでマーカーを検出する · atinfinity/lab Wiki · GitHub

軽量な AR ライブラリの ArUco について調査中 - Qiita

itouh2: OpenCV 画面上の四角の3次元座標をもとめる

GitHub - DebVortex/python-ar-markers: Detection of hamming markers for OpenCV written in python

ARタグの姿勢を取得

ROSでARマーカーを追跡するパッケージを使う: マイコン漬け

ROS勉強記録: ar_pose (ARToolKitのマーカー認識 in ROS)パッケージを使ってみる

ar-markers 0.4.1 : Python Package Index

機械学習のお勉強(ベイズ推定)

パラメトリックモデルの3つのステップ

  1. パラメータを含むモデル(数式)を設定する
  2. パラメータを評価する
  3. 最良の評価を与えるパラメータを決定する

ここで、2.においてパラメータを評価する基準として大きく2つある * 1つは誤差を定義して誤差を最小にするパラメータを決める * トレーニングセットが得られる確率である尤度関数を定義してこれを最大にするようにパラメータを決める

尤度関数(わかりやすい→):  【統計学】尤度って何?をグラフィカルに説明してみる。 - Qiita

ベイズ推定

これらとは異なる新しいパラメータの評価方法

ベイズの定理

考え方:ベイズの定理の基本的な解説 | 高校数学の美しい物語

使い方(大事!):10-6. ベイズの定理の使い方 | 統計学の時間 | 統計WEB

最尤推定ベイズ推定

  • 最尤推定は一意にパラメータを決める
  • ベイズ推定は求めたいパタメータの確率を決める(トレーニングデータ数が増えるほど、最尤推定のパラメータに近づく)

ベイズ推定は最尤推定の拡張と考えることができる。ベイズ推定は事前分布からの影響を受けない時は、最尤推定と同じになり、影響を受けるときは異なり、オーバーフィッティングを防ぐなどの効果がある。

藤井四段で学ぶ最尤推定、MAP推定、ベイズ推定 - Qiita

ベイズ推定の回帰分析への応用

(TBD)

共役事前分布

【ベイズ統計】共役事前分布とは?わかりやすく解説 | 全人類がわかる統計学

13-1. 二項分布 | 統計学の時間 | 統計WEB

13-3. ポアソン分布 | 統計学の時間 | 統計WEB

多項分布の意味と平均,分散,共分散などの計算 | 高校数学の美しい物語

機械学習のお勉強(特徴量)

TBD

Haar-Like

物体の局所的な明暗差の組み合わせにより、画像を判別する

LBP(Local Binary Pattern)

物体の局所的な輝度の分布の組み合わせにより、画像を判別する

HOG(Histogram of Oriented Gradients)

物体の局所的な輝度の勾配方向の分布の組み合わせにより、画像を判別する

SHIFT

移動、回転に加えてズーム対してロバストな特徴を持つ

SURF

SIFTは計算量が多く、低速だったため、速度を改良したアルゴリズム

ORB

移動、回転、ズームの3つに対してロバストで、計算速度も速い

AKAZE

計算量がORBよりもやや多いものの、低周波領域、高周波領域の抽出精度がORBよりも優れている

OpenCV3とPython3で特徴点を抽出する(AgastFeature, FAST, GFTT, MSER, AKAZE, BRISK, KAZE, ORB, SimpleBlob, SIFT) - Qiita

主成分分析

OpenCV3とPython3で形状のある物体の輪郭と方向を認識する(主成分分析:PCA、固有ベクトル) - Qiita

エッジ検出

OpenCVでエッジ検出してみる - Qiita

カラーヒストグラム

類似画像検索システムを作ろう - 人工知能に関する断創録

領域分割

画像を同じ特徴を持つ複数の領域に分ける方法 (1/2):CodeZine(コードジン)

pythonで画像領域分割を実装 (Union-Find) - Qiita

http://www.riken.jp/brict/Yoshizawa/Lectures/Kyuusyu/Lectures2011_05.pdf

解決済み: 画像から色指定で領域抽出する方法 - NI Community

opencv.jp - OpenCV: 画像分割,領域結合,輪郭検出(Image Segmentation, Connected Components and Contour Retrieval)サンプルコード -

複数の特徴量の組み合わせ

https://www.toshiba.co.jp/tech/review/2010/07/65_07pdf/f02.pdf

http://www.me.cs.scitec.kobe-u.ac.jp/~takigu/pdf/2009/C-03.pdf

http://www.vision.cs.chubu.ac.jp/MPRG/F_group/F074_fujiyoshi2008.pdf

参考:

深層学習 を 用いた 異常値検知 手法まとめ 〜 (Denosing) AutoEncoder, LSTM, TDA(Topological Data Analysis) + CNN - Qiita

SSD: Single Shot MultiBox Detector 高速リアルタイム物体検出デモをKerasで試す - Qiita

http://www.vision.cs.chubu.ac.jp/features/PPT/SSII2009/090610_SSII2009_Tutorial.pdf

http://www.vision.cs.chubu.ac.jp/cvtutorial/PDF/02SIFTandMore.pdf

http://www.vision.cs.chubu.ac.jp/sift/PDF/pcsjimps2008_ppt.pdf

https://www.pro-s.co.jp/engineerblog/opencv/post_6231.html

OpenCV 3とPython 3で特徴量マッチング(A-KAZE, KNN) - Qiita

機械学習のお勉強に役立つサイト↓ http://qiita.com/daxanya1/items/218f2e3b922142550ef9?utm_content=buffer40ad9&utm_medium=social&utm_source=facebook.com&utm_campaign=buffer

機械学習のお勉強(最小二乗法、最尤推定法、パーセプトロン)

最小二乗法

ex: 観測値と真値の二乗誤差を最小にするようにn次多項式を解く。

データセットがn以上あると解析的に平方根平均二乗誤差が0の多項式を導くことができる。

平方根平均二乗誤差:解いて求めた多項式から推定する値とデータセットとの値が平均的にどの程度異なっているか

パラメトリックモデルの解き方 1. パラメータを含むモデルを設定する

  1. パラメータを評価する基準を定める

  2. 最良の評価を与えるパラメータを決定する

参考:ヘッセ行列 - Wikipedia

オーバフィッティングの検証

仮説/検証を行う。

  1. 利用可能なデータセットをトレーニング用とテスト用に分ける

  2. トレーニングデータセットで仮説をたてる(モデルを作る)

  3. テストデータセットで検証を行う

これによってモデルの汎化能力がわかる。

オーバーフィッテイング:トレーニングデータセットだけに特化したチューニングが発生する状況

クロスバリデーションによる汎化性能の検証

参考: 交差確認(交差検証、Cross-Validation)の簡単な説明 - 具体例で学ぶ数学

交差検定(クロスバリデーション)など機械学習の評価方法まとめ : 新規事業のつくり方

最尤推定

データの背後にある関数に加えて、データに含まれる誤差を併せて推定する手法。

ex: データから多項式の係数と正規分布に基づいているとして標準偏差を求める

尤度関数:「トレーニングデータセットのデータが得られる確率」をパラメータ(ex1:観測値、標準偏差 , ex2:平均、標準偏差)の関数とみなしたもの

この確率が最大になるようにパラメータを決定する方法を最尤推定法と呼ぶ。

多項式の係数の推定値は最小二乗と同じになり、標準偏差の推定値は平方根平均二乗誤差と同じになる。

異なるアプローチをとったにもかかわらず同じ多項式が得られる。つまり、最小二乗法は最尤推定法の中でも、正規分布の誤差を仮定した特別な場合に対応するとみなすことができる。

定量の一致性と不偏性

  • データ数を大きくしていくことで真の値に近づいていくことを一致性と呼ぶ
  • 不偏性を持つ推定量はデータが少ない場合、真の母数から外れる可能性があるが、大きい方と小さい方にはずれる場合が均等にあるということを意味する。

参考: 18-3. 推定量の性質 | 統計学の時間 | 統計WEB

不偏推定量と一致推定量の意味 - 具体例で学ぶ数学

パーセプトロン

単純パーセプトロンからの機械学習入門 - Qiita

pandas

10分でPandasを学ぶ - Qiita

Pandas でデータフレームを作ってみよう – Python でデータサイエンス

[Python] pandasの使い方まとめ - Qiita

Pythonでpandasを使う - 計算物理屋の研究備忘録

scipy

【Python入門】絶対に知っとくべきライブラリscipyの基本的な使い方 - Qiita

1.5. Scipy: 高水準の科学技術計算 — Scipy lecture notes

問題を解きながら学ぶ

PFNさんが公開してくださっている機械学習の問題↓

GitHub - pfnet/intern-coding-tasks: Coding tasks for PFN internship

ネットワークのお勉強その2

SSIDとは

Service Set IDentifier! 

SSIDとは、無線LANのアクセスポイントを識別するための名前のこと。

参考:

SSIDとは - IT用語辞典 Weblio辞書

無線LANルーターのSSIDとは?-ELECOM WEB SITE!

アクセスポイントとは

「アクセスポイント」は、Wi-Fiの通信における”中継点”となる場所。

参考:

アクセスポイントとは - IT用語辞典

マルチSSID

マルチSSIDとは、1つのWi-Fi親機で複数のSSIDが使える機能。1つの親機が複数のアクセスポイントを持つ。

メリット

それぞれのアクセスポイントで別々の設定ができる(特に、セキュリティ方式を分けることができるのが魅力)

問題:最大何個のマルチSSIDを同時に使用できるの?

Ciscoだと最大16個までできるよ。

参考:

マルチSSIDとは - Wi-Fiの使い方初心者用ガイド

最大何個のマルチSSIDを同時に使用できますか(法人向けアクセスポイント) - アンサー詳細 | BUFFALO バッファロー

無線LAN - Cisco無線LANソリューション : 基本設計と基本構成

Wi-Fiのセキュリティ機能 - Wi-Fiの使い方初心者用ガイド

ステルスID

SSIDステルス機能とは、アクセスポイントが発信する電波にSSIDを含めないようにする機能のこと。

参考:

SSIDのステルス設定-Wi-Fi入門講座

アクティブスキャンとパッシブスキャン

アクティブスキャンをすればステルスIDにも接続することができる。

参考:

無線LAN - ビーコン、プローブ、認証、アソシエーション

http://www0.info.kanagawa-u.ac.jp/~matsuo/theses/pdf/matsuo_lab_20140202_kawashima_abst.pdf

wpa_supplicant.conf

wpa_supplicantは、無線LANアクセスポイントに対し、WPAで接続要求を行うためのコマンド。

ステルスIDに接続したい時

scan_ssid = 1 でOK!

# scan_ssid:
#       0 = do not scan this SSID with specific Probe Request frames (default)
#       1 = scan with SSID-specific Probe Request frames (this can be used to
#           find APs that do not accept broadcast SSID or use multiple SSIDs;
#           this will add latency to scanning, so enable this only when needed)
# disabled:
#   0 = this network can be used (default)
#   1 = this network block is disabled (can be enabled through ctrl_iface,
#       e.g., with wpa_cli or wpa_gui)
key_mgmt: accepted authenticated key management protocol

無線LANのステルスAPにLinux(wpa_supplicant)から接続する - Dマイナー志向

設定例:

ctrl_interface=DIR=/var/run/wpa_supplicant
update_config=1

network={
        scan_ssid=1
        key_mgmt=WPA-PSK
        ssid="xxxx"
        psk=xxxx
        disaxled=1
}

network={
        scan_ssid=1
        key_mgmt=WPA-PSK
        ssid="xxxx"
        psk=xxxx
}

参考:

WPA supplicant - ArchWiki

wpa_supplicant

http://www.cs.upc.edu/lclsi/Manuales/wireless/files/wpa_supplicant.conf

無線LANのセキュリティ パソコン初心者講座

ネットワーク管理の基本Tips:無線LANにWPAで接続するには? wpa_supplicantコマンド - @IT

wpa_cli

以下のコマンドでSSIDに接続できる

$ sudo wpa_cli select_network 0 //一番目に設定したSSIDに接続
$ sudo wpa_cli select_network 1 //二番目に設定したSSIDに接続

DNS

DNS(Domain Name System)」とは、、コンピュータ名やドメイン名などの名前を表す文字列とIPアドレスの対応を管理したり、検索したりする階層構造のサービス。

Google Public DNS「8.8.8.8」「8.8.4.4」

参考:

インターネット10分講座 - JPNIC

超入門DNS:DNSとは - @IT

DNS(Domain Name System)とは-インターネット入門ガイド

VLAN

VLANとは、「Virtual LAN」の略で以下の図のように、論理的に1台のスイッチに独立した複数のLANを持たせることが出来る機能

参考:

VLANの基礎 - ネットワークエンジニアを目指して

 ネットワーク全般

参考:

わかりやすい! ネットワークエンジニアを目指して - ネットワーク技術の解説