エッジ検出

画像からモノの輪郭だけを抽出することをエッジ検出という
エッジとは、ピクセル値が極端に変わった箇所を強調して抽出するが、より高度な処理が必要
その中でも特に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は色変換の規格ってことか?

5G周波数割り当てとソケット通信の仕組み

– 5Gでは低い周波数(VHF帯)から高い周波数(ミリ波帯)の複数の周波数帯を組み合わせて利用し、場所、時間、アプリケーションなどにより最適な使い方を採用
– 10Gbps + 高速移動対応
– 電波(Hz=1秒間の振動数)とは電磁波。電波を使って通信を行う場合、変調という操作を行い、伝達したい情報を載せる

27.00GHz 〜 27.40GHz 楽天
27.40GHz 〜 27.80GHz NTTドコモ
27.80GHz 〜 28.20GHz au
29.10GHz 〜 29.50GHz ソフトバンク
※4GではドコモにはLowにあたる3,480MHz~3,520MHz、KDDIには3,520MHz~3,560MHz、ソフトバンクは3,560MHz~3,600MHz

周波数帯(バンド)は機種によって事なる
高い周波数帯の電波は回り込みにくいため、屋内やビル街で繋がりにくい可能性がある

1.周波数利用効率のさらなる向上
L Non-Orthogonal Multiple Access:電力ドメインを使って複数ユーザーの信号を重畳することで、さらなるスループットを向上させる
L Massive MIMO: 100以上のアンテナ素子を使い指向性の高いアクティブアンテナを用いて、ビームフォーミングによる干渉回避と、多数のユーザーの同時接続を可能にするMIMO技術であり、20GHz帯など、高い周波数と相性がよく、容量不足の解消につなげる

2. ネットワークの高密度化
L HetNet (Heterogeneous Network):セル半径の異なるシステムを同一エリア内に混在させ、これらを協調して動作させ、ネットワーク全体のキャパシティを大幅に改善する技術
L デュアルコネクティビティ(C/U分離): 端末と基地局は、接続を制御する「C-plane」(制御信号)と、実際のデータが流れる「U-plane」(ユーザーデータ信号)の2つの信号を送受している。広範囲をカバーするマクロセルでC-Planeを、速度を稼ぎやすいスモールセルでU-planeを別々に通信する「C/U分離」方式により、ネットワークを高密度化

パケット制御技術を使っている。パケット通信では、1本の回線で同時に複数の通信が可能(回線交換方式は回線を占有してしまう)
1パケットは128バイト
Packet Assembly and Disassemblyとはパケットの組立/分解装置の事
データはTCPヘッダ、IPヘッダと共に送信される
通信データはOSのTCP処理で行う

TCP/IP階層: プロトコル
アプリケーション層: HTTP, SMTP, POP, FTP
トランスポート層: TCP, UDP
インターネット層: IP
ネットワークインターフェイス層: イーサネット、無線LAN, PPP…

IPアドレスとはネットワークアドレスとホストアドレスに別れる
16.42.0.9で、16.42をネットワークアドレス、0.9をホストアドレス(サブネットとホストアドレスに分割できる)とする
IPアドレスの変換は/etc/hostsで行うか、DNSサーバで変換
IPパケットはgatewayに送信される

Ethernet Frame(イーサネット規格に従って通信する時のデータ): Destination Ethernet address, Source ethernet address, Protocol, Data, Checksum
IP Packet: Length, Protocol, Checksum, Source IP address, Destination IP address, Data
TCP Packet: Source TCP address, Destination TCP address, SEQ, ACK, Data

登録済みのポートは/etc/servicesにある
$ sudo cat /etc/services

http            80/tcp          www www-http    # WorldWideWeb HTTP
http            80/udp          www www-http    # HyperText Transfer Protocol
http            80/sctp                         # HyperText Transfer Protocol

ネットワーク接続一覧の確認
$ netstat -a

パケット送信の流れ
1. Raw Socket作成
2. IPヘッダー作成
3. UDPヘッダー作成
4. 送信

payloadとはデータ送信における正味のデータ部分
Linuxでは、socket()関数を利用してソケットを作成できる
サーバ側はソケットを作成し、接続待ちをするIPアドレスとポートを設定し、接続を受け付け通信を行う
クライアント側はソケットを作成し、接続相手を設定し通信を行う

socket()-> bind() -> listen() -> accept() -> read()/write() -> close()
apacheの場合、不特定多数のクライアントとやり取りするので、子プロセスで複数のaccept()の状態を作る

つまり様々なデータはsocket化して基本的にTCP/IPで、変調して電磁波で送受信して、クライアントとサーバでやり取りしてるってことね。
そして1パケットは128バイトってことは、リクエストに応じたパケットを作成しているのね。
この辺、義務教育で勉強したかったな。しかし、subnetやgatewayはawsの概念と一緒だな。Linux研究せなあかん。

OpenCVの機能と構成

OpenCV : https://opencv.org/
Github: opencv/opencv

### OpenCVの画像処理アルゴリズム
– GUI(Graphical User Interface)と入出力(画像、ビデオファイル、カメラ映像など)
– 画像の基本構造(構造体)と操作(配列操作、統計、数学関数など)
– 画像処理(エッジ抽出、空間フィルタリング、ヒストグラムなど)
– 構造解析(輪郭抽出、特徴点抽出、矩形領域抽出など)
– 動き解析と物体追跡(オプティカルフロー、モーションテンプレートなど)
– パターン認識(訓練データに基づく物体検出)
– カメラ校正と3次元再構築(カメラキャリブレーション、姿勢推定、エピポーラ幾何など)

### 画像処理関数には様々なものがある
– 空間フィルタリング ぼかし、Prewitt, Sobel, Laplacian, 2D、中央値フィルタ、最大値・最小値フィルタ
– カラーモデル変換 カラー、グレースケール、白黒2値、アルファチャンネル、HLS, HSV、CIELab(XYZ), CIELUV, YUVm YCrCb, カラーツイスト、ビット深度、DIB
– 変換 DCT、DFT
– ジオメトリ計算 ズーム、間引き、回転、ミラーリング、シアー、アフィン変換、投影変換、理マッピング、サブピクセル
– モーフィング モルフォロジー変換、トップハット変換、ブラックハット変換
– ポイント処理 T閾値、コントラスト強調、ヒストグラムのイコライズ計算
– 画像統計 モーメント、ノルム、MSE
– 算術演算、論理演算 加乗、減算、シフト、二乗、スケーリング、論理積、論理和、排他的論理和、Alpha合成、IsGreater、IsEqual、IsLess、ベクトル集合の主成分分析、透視投影変換、線形代数
– 図形・テキスト描画 線分、矩形、円、楕円、ポリゴン、テキスト

対象範囲が広く感じるな。
ある程度作りたいものを明確にして、それから逆算して必要な分野から勉強していくって方が良さそうだな。ジェスチャ認識、物体追跡などカメラなどのハードウェアが必要なものもはハードルが上がるから、最初は顔認識、画像認識から始めた方が良さそうか。

モバイルロボティクス(AGV)

配送、配達など自動搬送するロボット
– 自分で最適なルートを考え、障害物も避ける
– AGV(Automatic Guided Vehicle)
– 従来は、床面に貼られた磁気テープなどで誘導を行い無人走行していた
– 現在はセンサーを使って自由に動ける
– 物流業界を中心に活用されている
– 産業用ロボット(部品組み立てなど)も同じ分野

### 仕組み
SLAM(Simultaneous Localization and Mapping)
レーザースキャナ、ジャイロセンサー、カメラなどの入力装置と組み合わせる

### 対象範囲
回路設計、ディジタル信号処理、組込みシステム、計測工学、アナログ電子回路、計算機制御、知能ロボット、統計的機械学習、群知能、画像情報処理、人工知能、メカトロニクス、ロボット工学など

ハードウェア側の知識も大分求められますね

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

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

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

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

物体同定

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

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

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

バイオメトリクス認証

バイオメトリクス認証は、指紋など固有性の高い人間の身体的特徴をデータ化して本人確認に用いる認証方式

### バイオメトリクス認証とは?
– センサーで表面の模様を読み取って、図形的な特徴を符号化し、記録された本人のものと照合する
– 指紋の他にも、目の模様や手の静脈認証、音声認証、顔認証などがある
– 電子サインもバイオメトリクス認証の一種

### 指紋認証の仕組み
– センサーの保護板に直接触れた凸部の下にある電極にたくさんの電荷がたまる
– この電荷が溜まっている電極の位置をマッピングすれば、指紋の画像データが出来がある
– 指紋の比較は、指紋の特徴点が指紋の中心点からどの位置にあるかをデータ化する
– 指紋認証による決済サービスや、指紋認証リーダなども増えている

### 声認証の仕組み
– 声認証は声から話者固有の特徴を抽出し、話者を特定する技術
– 音声入力 -> 信号処理によるノイズ処理 -> 音波から音素を特定(パターンマッチング) -> 音素の並びを単語に変換 -> 単語の並びを文に変換し、テキスト出力

### 顔認証
目、鼻、口など特徴点の位置や顔領域の位置、大きさを元に照合を行う

BiometricsはNECがかなり進んでいる印象。
なるほどね、そりゃー医療に進出するわけだ。最初は、なんで?って思ったけど、確かに最新テクノロジーと親和性が極めて高く、事業戦略に沿ってますね。大手町のPFNも医療開発に力入れてますし。
GAFAがどれだけ医療分野の研究開発を行なっているかわかりませんが、当然やってるでしょうな。

ジェスチャ認識

### 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は求められる知識領域が広いなー。。

対話型操作の仕組み

### 対話型操作の例
– Siri(Apple)
– pepper(Softbank)
– Line りんな(Microsoft)
– チャットボット(IBM Watson, 富士通、OKWeb、ユーザローカル、SYNALIO、ドコモ、NTTコミュ、KDDI、SCSKなど)

-> NLP(自然言語処理)を活用して、対話システムを構築している

### 対話システムの歴史
– ELIZA(MIT, パターンマッチング)・・・決まった入力を仮定して、それに対して対応するため、人工無脳と言われる
– エキスパートシステム・・・ある特定分野に絞る
– Siri・・米国防高等研究計画局の人工知能プロジェクトとしてスタートしAppleに売却

### Retrieval model(Rules-Based)
ルールベースで対話を構築する
人工無脳に近い

### Generative model(general AI)
スクラッチから回答を自動生成するアプローチ
マルコフ過程を利用した単語から単語への状態遷移を予想して回答やニューラルネットワークのLSTMの利用などがある
機械翻訳と同じ技術が使われる

最近では、声のトーンから感情推定を行うなどの研究開発が盛んになってきている

とりあえず、順番にアプローチってところか?