傾き補正

撮影時のカメラの傾きから、画像自体が傾いて撮られる事が良くある
そのような場合、ハフ変換で直線を得た後に、その傾きの角度から画像を補正する事ができる
文字認識の前処理としてよく使われる

二値化 -> エッジ検出 -> ハフ変換 -> 傾き補正 -> 文字認識 の流れか?
回転させながら行検出するアルゴリズムもあるみたいですね。

傾いている対象が長方形の場合、輪郭を走査して、最小二乗法の直線近似で、誤差のある点を除きながら直線を求めることもできる。反復法で誤差を収束させるので、速度に難がある

補正する対象が何かや、求めるパフォーマンスによって、採用するアルゴリズムが変わってくるというのは面白い
OpenCVと機械学習はかなり繋がっていますね。

ハフ(Hough)変換

ハフ変換(Hough)は、画像から直線や曲線を抽出し、それを数式で表現したい時に用いられるアルゴリズム
通常はエッジ検出を行った後の画像に対してハフ変換を行う(二値化した後にゴミを除去し、細線化処理を行う)
OpenCVには、直線を検出するcvHoughLine2や、円を検出するcvHoughCirclesが用意されている

### ハフ変換のアルゴリズム
– 座標軸を変換する
– ρ=x∗cosθ+y∗sinθとしてρとθで表す。ρかθのどちらかの値が決まれば、直線を求めることができる
– θは0≦θ<π
– 元画像に存在する点の数の中で、多く交差する箇所が求めたい直線になる

– 円を検出したい場合は(x−p)^2+(y−q)^2=r^2を使用する

エッジ検出した点それぞれのρ、θをプロットした曲線のうち、多くの線が重なり合っている点(ρ、θが同じ)の中から、最も直線が存在する可能性が高い組み合わせを探す処理を行っている

なるほど、θが同じだから、直線とみなすわけですね。
角度が同じものを直線とみなすので、抽出する直線の数が多ければ、実態の直線よりも幾何学的なアウトプットになりそうです。

エッジ検出

画像からモノの輪郭だけを抽出することをエッジ検出という
エッジとは、ピクセル値が極端に変わった箇所を強調して抽出するが、より高度な処理が必要
その中でも特にCannyアルゴリズムが性能が高いと言われている

imagefilter ( $image , IMG_FILTER_EDGEDETECT );
imagefilter ( $image , IMG_FILTER_BRIGHTNESS , 20 );
imagefilter ( $image , IMG_FILTER_CONTRAST , -255 );

### measure of overall sharpness and generating a score
imagecolorat — ピクセルの色のインデックスを取得

chicks.jpg

cherry.jpg

function getBlurAmount($image){
	$size = getimagesize($image);
	$image = ImageCreateFromJPEG($image);
	imagefilter($image, IMG_FILTER_EDGEDETECT);
	$blur = 0;
	for ($x = 0; $x < $size&#91;0&#93;; $x++){
		for ($y =0; $y< $size&#91;1&#93;; $y++){
			$blur += imagecolorat($image, $x, $y) & 0xFF;
		}
		return $blur;
	}
}

$e1 = getBlurAmount("chicks.jpg");
$e2 = getBlurAmount("cherry.jpg");
echo "relative blur of first image is" . $e1 / min($e1, $e2) .", and relative blur of second image is" . $e2 / min($e1, $e2) . ".<br>";
echo $e1. "<br>";
echo $e2;

relative blur of first image is1.0578699268003, and relative blur of second image is1.
55206
52186

### Cannyアルゴリズム
1. ノイズ削減
-> 画像を平滑化してノイズ削減
2. 画像の輝度勾配を見つける
-> 平滑化された画像からSobelフィルタを使って縦方向(G_y)と横方向(G_x)の1次微分を取得、2つの微分画像からにエッジの勾配と方向を求める
3. 非極大値の抑制
 -> エッジと関係ない画素を取り除く(勾配方向に対して極大値であるか確認)
4. Hysteresisを使った閾値処理
 -> minVal と maxVal を使って、正しいエッジとそうでないエッジを区分する
OpenCVではcv2.Canny() を使う

エッジ検出単体でというより、組み合わせて使うイメージか・・・

2値化

2値化とは、画像のある範囲のピクセル値を0か1など2つの値に変換することを指す
物体の輪郭を明確にしたい時などに使用する
2値のどちらに振り分けるかを決定する値を閾値といいう

例:
モノクロモデルで色が0〜255までの256階調の画像を0〜127の値は0に、128〜255の値は255に変換する

OpenCVおよびPythonはUbuntuで開発したいので、18.04を起動してlampを構築し、php-gdを入れます。

$ vagrant init ubuntu/bionic64
$ vagrant up
$ vagrant ssh
$ uname -a
Linux ubuntu-bionic 4.15.0-96-generic #97-Ubuntu SMP Wed Apr 1 03:25:46 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

// install tasksel
$ sudo apt install tasksel
// lamp install
$ sudo tasksel install lamp-server
$ apachectl -v
Server version: Apache/2.4.29 (Ubuntu)
$ mysql --version
mysql  Ver 14.14 Distrib 5.7.29, for Linux (x86_64) using  EditLine wrapper
$ php --version
PHP 7.2.24-0ubuntu0.18.04.3 (cli) (built: Feb 11 2020 15:55:52) ( NTS )
$ sudo service apache2 start

// gd install
$ apt-cache search gd | grep php
$ sudo apt-get install php7.2-gd
header ("content-type: image/png");

$filename = "chicks.jpg";
$image = ImageCreateFromJPEG ( $filename );

imagefilter ( $image , IMG_FILTER_EDGEDETECT );
imagefilter ( $image , IMG_FILTER_GRAYSCALE );
imagefilter ( $image , IMG_FILTER_SMOOTH , 8 );
imagefilter ( $image , IMG_FILTER_BRIGHTNESS , 20 );
imagefilter ( $image , IMG_FILTER_CONTRAST , -255 );

imagepng ( $image );
imagedestroy ( $image );

IMG_FILTER_EDGEDETECT: 画像の輪郭抽出
IMG_FILTER_GRAYSCALE:REC.601 luma (Y’) の計算と同じ係数を使い、 重み付けを赤、緑、青のコンポーネントごとに変えることで、 画像を白黒
IMG_FILTER_SMOOTH:画像を滑らかにする
IMG_FILTER_BRIGHTNESS:画像の輝度
IMG_FILTER_CONTRAST:画像のコントラスト

EDGEDETECTをなくすと、こうなる

BRIGHTNESSとCONTRASTで2値化している。

grayscaleのアルゴリズム

線形RGB空間において重み合計(英語版)を計算しなければならない。それはつまり、ガンマ圧縮関数は最初にガンマ拡張によって取り除かれるということである
...
光度は3つの線形的な光の強さの値の重み合計として計算

REC.601 luma

The Rec. 601 signal can be regarded as if it is a digitally encoded analog component video signal, and thus the sampling includes data for the horizontal and vertical sync and blanking intervals. Regardless of the frame rate, the luminance sampling frequency is 13.5 MHz. The samples are uniformly quantized using 8 or 10 bit PCM codes in the YCbCr domain.

For each 8 bit luminance sample, the nominal value to represent black is 16 and the value for white is 235. Eight-bit code values from 1 through 15 provide footroom, and can be used to accommodate transient signal content such as filter undershoots. Similarly, code values 236 through 254 provide headroom and can be used to accommodate transient signal content such as filter overshoots. The values 0 and 255 are used to encode the sync pulses and are forbidden within the visible picture area. The Cb and Cr samples are unsigned and use the value 128 to encode the neutral color difference value, as used when encoding a white, grey or black area.

REC 601は色変換の規格ってことか?

物体追跡・エゴモーション

物体追跡とは?
-> 与えられた動画像から、指定した対象が画像上でどのように移動するかをステイする
-> デジカメで、被写体が移動しても自動的にフォーカスを合わせ続ける
 –> 顔検出と肌色追跡を組み合わせた人間の追跡やカラー情報による物体の追跡
-> 被写体の対象が初期位置x0から移動量Δxを順方向に探索する
-> フレーム処理が高速であれば、リアルタイムに被写体の追跡処理が可能となる

探索領域
– テンプレートマッチングは全探索するため、計算量が多くなる欠点がある
– アクティブ探索法、Mean Shift、確率的に次の物体位置を推定するParticle Filterなどがある

物体追跡はカメラと連動して動く標的を追跡したいときに有効そうですね。
合わせて、カメラや映像検知の基礎知識も絶対的に必要そう。

物体同定

よく似た画像の組みが、元々同じものを写したものか、似たものだけども違うものを写したものなのかを判別し、判別の確信度も統計的に評価する

### 物体同定の仕組み
– 画像の特徴量の隔たりを求める(色調、空間周波数分布など)
– 最もよく近似する関数をロジスティック回帰分析で求める
– 新たに画像が与えられた時、特徴量空間にプロットして関数の値を求める

メルカリの写真からカテゴリー自動抽出も物体同定と同じアルゴリズムを使っているのでしょうか?
Computer Visionだとどの分野でも「特徴値」がキーワードになっているように見えます。

ジェスチャ認識

### 1.赤外線LED
概要
– 赤外線LEDの点滅を利用して人の手の重心や指の本数を抽出し、その動きによって機器の操作ができる
※赤外線LEDとは700〜1500nm程度まで近赤外線を発光する
※赤外線は赤色光よりも波長が長い電磁波。LEDはLight Emitting Diodeで光る半導体
※テレビのリモコン操作(トランジスタ駆動)、スマホのデータ通信、不法侵入監視用光源などは赤外線LED
※最近は赤外線カメラと組み合わせて使用される。IR-LEDと書く
※赤外線カメラは物体から放射される赤外線を可視化するカメラ。画像はサーモグラフティ

仕組み
– 赤外線LEDを点滅させ、画像の明暗の差分から物体を抽出
– ノイズキャンセル + 二値化(画像を2階調に変換)
– 抽出した最も大きな領域の重心を算出し、二値画像の突起物を検出(ヒストグラム作成)
– 作成したヒストグラムで指先を認識
– データ出力

### 2.任意の色領域抽出
概要
– RGB画像をHSV(Hue, Saturation, Value)空間に分割し、HSチャンネル画像を用いて肌色領域を抽出
– モフォロジー処理により、手の領域だけ抽出
– オープニング処理により、指の領域のみ抽出
– 取得した指領域の数をカウントする

なるほど、ジェスチャ認識のアプリケーション作るには、赤外線LEDと、それを検出する赤外線カメラが必要ってことか。
とりあえず赤外線LEDと赤外線カメラを買ってみた。

波長:940 nm。 放射距離:7 M
電圧:DC 1.2 - 1.3 V。 極性:アノード(長い部分) カソード(短い部分)
ヘッドサイズ:5.6 x 8.5 mm(最大D * H)
パッケージ内容:10個xエミッタダイオード+ 10個xレシーバダイオード

CVは求められる知識領域が広いなー。。

MNIST

MNISTとは?
Mixed National Institute of Standards and Technology database
手書き60000枚とテスト画像10000枚の画像データセット

MNISTのデータDL
http://yann.lecun.com/exdb/mnist/

import keras 
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, InputLayer
from keras.optimizers import RMSprop

(x_train, y_train),(x_test,y_test) = mnist.load_data()

x_train = x_train.reshape(60000, 748)
x_test = x_test.reshape(10000, 784)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)

model = Sequential()
model.add(InputLayer(input_shape=(784,)))
model.add(Dense(10, activation='softmax'))
model.compile(loss='categorical_crossentropy',optimizer='rmsprop', metrics=['accuracy'])

epochs = 20
batch_size = 128
history = model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(x_test, y_test))

score = model.evaluate(x_test, y_test, verbose=1)
print()
print('Test loss:', score[0])
print('Test accuracy:', score[1])

MNISTのデータは縦28ピクセル x 横28ピクセル = 計748ピクセル
各ピクセルRGBは 0 – 255 の256種類の整数値

ImageNet Large Scale Visual Recognition Challenge

画像認識コンペティション
ILSVRC(ImageNet Large Scale Visual Recognition Challenge)

2017年の内容
1,Object localization for 1000 categories.
2,Object detection for 200 fully labeled categories.
3,Object detection from video for 30 fully labeled categories.

ILSVRC2012では、AlexNetが優勝
5つの畳み込み層をもち、3つの全結合層
パラメータ数は、約6000万個

ん? 6000万?
畳み込み層のカーネルサイズ、畳み込み層のカーネル数を調整している?
VGGNetのパラーメータは1億4千個?

input -> stem -> 5x Inception-resnet-A -> Reduction A -> 10 x Inception-resnet-B -> Reduction-B -> 5 x Inception-resnet-C -> Average Pooling -> Drop0ut -> Softmax

本郷・水道橋にある画像認識系のスタートアップって、この画像認識のモデルアルゴリズムも設計してるんだろうか。。

Amazonの機械学習

AWSばかり目が行きますが、amazonで使われている機械学習は?
 L 需要予測
 L 商品検索のランクづけ
 L 商品のレコメンデーションや配置
 L 不正取引の検知
 L 翻訳

その他には、自動飛行ドローンが商品を配達するPrime Air
小売店舗のAmazon Goなど

Prime Airとは?
 垂直離着陸と飛行能力を完備したドローン
 飛行体と人、動物、障害物などを把握するアルゴリズム、解析能力を備える

これ、開発するのに5年くらいかかってる?しかも、配達っていっても、洗濯機、テレビなど大型家電も運べるんだろうか?頭上から落ちてきたら敵わんからな。安全上、問題がありそう。

無人店舗 Amazon Go
ローソンやJRなどがやってる無人店舗、店の中でチャージするんだが、
amazon goは棚の上にカメラがあって、棚から人が商品を取ったらチャージされる仕組みのよう。お店から出て10分くらいたってからチャージ。

機械学習の中でも画像認識はコア技術だな〜
ロジスティック回帰、computer vision、アプリってところか。