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の利用などがある
機械翻訳と同じ技術が使われる

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

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

Kotlin _4

### ジェネリクス
型を汎用化する
class使用時にデータ型を指定する

class MyData<T> {
    fun getThree(x: T){
        println(x)
        println(x)
        println(x)
    }
}

fun main(args: Array<String>) {
	val mi = MyData<Int>()
    mi.getThree(55)
}

### data class

data class Point(val x: Int, val y: Int)

fun main(args: Array<String>) {
	val p1 = Point(3, 5)
    val p2 = Point(3, 5)
    
    println(p1)
    println(if (p1 == p2) "same" else "not same")
}

### Collection
List: 順番を持つデータの集合(Immutable/Mutable)、Set: 順番を持たない|重複を許さないデータの集合(Immutable/Mutable)、Mapはkeyと値でデータを管理(Immutable/Mutable)
– Immutableなデータを作る
– listはlistOfで使う。変更する場合は、mutableListOfで使用する

fun main(args: Array<String>) {
	val sales: List<Int> = listOf(20, 30, 40)
    println(sales[1])
}

– setはsetOf
– 変更する場合は、mutableSetOfで使用する

fun main(args: Array<String>) {
	val answers: Set<Int> = setOf(5, 3, 8, 5)
    println(answers)
    println(answers.contains(3))
    
    val set1 = setOf(1, 3, 4, 8)
    val set2 = setOf(3, 5, 7, 9)
    println(set1.intersect(set2))
    println(set1.union(set2))
}

– mapはmapOf
– mutableMap

fun main(args: Array<String>) {
	val users: Map<String, Int> = mapOf("yamada" to 10, "tanaka" to 20, "sato" to 30)
    println(users["yamada"])
    println(users.size)
	println(users.keys)
    println(users.values)
    println(users.entries)
}

### map
コレクションを処理するための命令にmap, filter, forEachなどが使える

fun main(args: Array<String>) {
	val prices = listOf(53.2, 48.2, 32.8)
    prices
    	.map{ n -> n * 1.08} // 引数 ->処理
        .filter { n -> n > 50}
        .forEach { println(it)}
}

### 例外処理
try & catch

class MyException(message: String): Throwable(message){
    
}

fun div(a: Int, b: Int){
    try {
        if(b < 0){
            throw MyException("not minus!")
        }
        println(a / b)
    } catch(e: ArithmeticException){
        println(e.message)
    }
}

fun main(args: Array<String>) {
	div(3, 0)
}

### Nullable
nullになりそうな型は、型の後ろに「?」を付ける

fun main(args: Array<String>) {
	val s: String = null
    println(s)
}

Null can not be a value of a non-null type String

fun main(args: Array<String>) {
	val s: String? = null
    println(s)
    
    if(s != null){
        println(s.length)
    } else {
        println(null)
    }
}

Kotlin _3

### class

class User {
    var name = "Me!"
    fun sayHi(){
        println("hi $name")
    }
}

fun main(args: Array<String>){
	val user = User()
    println(user.name)
    user.sayHi()
    
    user.name = "steve"
    println(user.name)
    user.sayHi()  
}

constructor
->classの引数の渡し方はmethodと同様に型を指定する

class User(var name: String) { // constructor
    var team = "red"
    init {
        println("instance created: name: $name, team: $team")
    }
    fun sayHi(){
        println("hi $name")
    }
}

fun main(args: Array<String>){
	val tom = User("tom")
    println(tom.name)
    tom.sayHi()
}

instance created: name: tom, team: red
tom
hi tom

### getter, setter

    // getter
//     get(){
//         return field.toUpperCase()
//     }
    get() = field.toUpperCase()
    // setter
    set(value) {
        if(value != ""){
            field = value
        }
    }

### override
継承される側はopenを付ける

class AdminUser(name: String): User(name){
    fun sayHello(){
        println("hello $name")
    }
    override fun sayHi(){
        println("[admin] hi $name")
    }
    
}

open class User(var name: String){
    open fun sayHi(){
        println("hi $name")
    }
}

fun main(args: Array<String>) {
    val bob = AdminUser("bob")
    println(bob.name)
    bob.sayHello()
    bob.sayHi()
}

### アクセス修飾子
public:どこからでも、protected: そのクラス+サブクラス、private:そのクラスのみ
-> アクセスをcontrollすることで安全なプログラムを書ける

### 拡張

fun User.sayHi(){
    println("[ext] hello $name")
}

val User.myName: String
 get() = "I am $name"

open class User(var name: String){
    fun sayHi(){
        println("hi $name")
    }
}

fun main(args: Array<String>) {
    val bob = User("bob")
    println(bob.name)
    bob.sayHi()
}

### 抽象クラス・具象クラス
抽象クラスはabstractとする

abstract class User{
    abstract fun sayHi()
}

class Japanese: User() {
    override fun sayHi(){
        println("こんにちは!")
    }
}

class American: User() {
    override fun sayHi(){
        println("Hi!")
    }
}


fun main(args: Array<String>) {
	val tom = American()
    val aki = Japanese()
    tom.sayHi()
    aki.sayHi()
}

### Interface
抽象プロパティ、抽象メソッド、メソッド

interface Sharable {
    val version: Double
    fun share()
    fun getInfo(){
        println("Share I/F ($version)")
    }
}

class User: Sharable {
    override val version = 1.1
    override fun share(){
        println("Sharing ...")
    }
}

fun main(args: Array<String>) {
	val user = User()
    user.share()
    user.getInfo()
}