Skip to content

Commit

Permalink
91-99基本完成。我溜了,我要去写毕业论文和复习修士考试了。第一百个问题……就留着有书念了再翻译吧!
Browse files Browse the repository at this point in the history
  • Loading branch information
郭子睿 authored and 郭子睿 committed Mar 26, 2019
1 parent 57a4bcb commit db314f7
Showing 1 changed file with 83 additions and 93 deletions.
176 changes: 83 additions & 93 deletions Question_91_100/README.md
Original file line number Diff line number Diff line change
@@ -1,31 +1,32 @@
# Q. 91 - 100

## Q.91. K-meansによる減色処理 (Step.1) 色の距離によるクラス分類
## Q.91. 利用 k-平均聚类算法进行减色处理第一步----按颜色距离分类

*imori.jpg*をK-meansを用いた減色処理せよ
`imori.jpg`利用 k-平均聚类算法进行减色处理

減色処理はQ.6でも扱ったが、Q.6では予め決めた色に減色した。ここで扱うのはK-meansを用いて動的に減色する色を決定する
在问题6中涉及到了减色处理,但是问题6中事先确定了要减少的颜色。这里,k-平均聚类算法用于动态确定要减少的颜色

アルゴリズムは,
1. 画像からランダムにK個のRGB成分をサンプリングする。(これをクラスと呼ぶことにする。)
2. 画像のそれぞれの画素に対して色の距離が最小となるクラスのインデックスを割り振る。
算法如下:

1. 从图像中随机选取 K 个 RGB 分量(这我们称作类别)。
2. 将图像中的像素分别分到颜色距离最短的那个类别的索引中去,色彩距离按照下面的方法计算:

```bash
色の距離 dis = sqrt( (R-R')^2 + (G-G')^2 + (B-B')^2)
```
3. 各インデックスに対応する色成分の平均をRGBそれぞれに対して取り、新たなクラスとする。
4. 元のクラスと新しいクラスが全く同じならK-meansを終了する。そうでなければ、新しいクラスを元クラスとして2-3を繰り返す。
5. 元画像の各画素で色の距離が最小となるクラスのRGBを割り当てる
3. 计算各个索引下像素的颜色的平均值,这个平均值成为新的类别;
4. 如果原来的类别和新的类别完全一样的话,算法结束。如果不一样的话,重复步骤2和步骤3;
5. 将原图像的各个像素分配到色彩距离最小的那个类别中去
ここでは1-2を実装せよ
- クラス数はk=5とする
- ここでは画像をreshape((HxW, 3))にreshapeすると扱いやすくなる。
- 1においてはnp.random.seed(0)として、np.random.choice(np.arrange(画像のWxH), 5, replace=False)
- まずは3-5のループを考えずに実装せよ
在这里完成步骤1和步骤2
- 类别数K=5;
- 在这里使用`reshape((HW, 3))`来改变图像大小之后图像将更容易处理;
- 步骤1中,对于`np.random.seed(0)`,使用`np.random.choice(np.arrange(图像的HW), 5, replace=False)`;
- 现在先不考虑步骤3到步骤5的循环。
```bash
# 最初に選べれた色
# 最初选择的颜色
[[140. 121. 148.]
[135. 109. 122.]
[211. 189. 213.]
Expand All @@ -42,22 +43,22 @@
答案 >> [answers/answer_91.py](https://github.com/yoyoyo-yo/Gasyori100knock/blob/master/Question_91_100/answers/answer_91.py)
## Q.92. K-meansによる減色処理 (Step.2) 減色処理
## Q.92. 利用 k-平均聚类算法进行减色处理第二步----减色处理
ここではアルゴリズム3-5も実装せよ
在这里实现算法的第3到5步
```bash
# 選ばれた色
# 选择的颜色
[[182.86730957 156.13246155 180.24510193]
[156.75152588 123.88993835 137.39085388]
[227.31060791 199.93135071 209.36465454]
[ 91.9105835 57.94448471 58.26378632]
[121.8759613 88.4736557 96.99688721]]
```
減色処理したもの。塗り絵イラスト風な画像にできる。k=10にすればある程度の色を保持しながらもイラスト風に減色できる
减色处理可以将图像处理成手绘风格。如果k=10,则可以在保持一些颜色的同时将图片处理成手绘风格
また、k=5にして*madara.jpg*にも試してみよ
现在,k=5的情况下试着将`madara.jpg`进行减色处理
| 输入 (imori.jpg) | 输出(answers/answer_92.jpg) | k=10(answers/answer_92_k10.jpg) | 输入2 (madara.jpg) | 输出(answers/answer_92_m.jpg) |
| :--------------: | :-------------------------: | :-----------------------------: | :----------------: | :---------------------------: |
Expand All @@ -66,23 +67,22 @@
答案 >> [answers/answer_92.py](https://github.com/yoyoyo-yo/Gasyori100knock/blob/master/Question_91_100/answers/answer_92.py)
## Q.93. 機械学習の学習データの用意 (Step.1) IoUの計算
## Q.93. 准备机器学习的训练数据第一步----计算 IoU
ここから機械学習で用いる学習データの準備を行う
从这里开始我们准备机器学习用的训练数据
最終的にはイモリの顔か否かを判別する識別器を作りたい。そのためにはイモリの顔の画像とイモリの顔以外の画像が必要になる。それらを用意するためのプログラムを作成する
最终,我想创建一个能够判断图像是否是蝾螈的脸的判别器。为此,我们需要蝾螈的脸部图像和非蝾螈脸部的图像是。それらを用意するためのprogramを作成する
そのためにはイモリの顔周辺を一枚の画像から切り抜く必要がある。
そこで一つの矩形を設定して(GT: Ground-truth, 正解と呼ぶ)、ランダムに切り抜いた矩形がGTとある程度重なっていれば、イモリの顔となる。
为此,有必要从单个图像中用矩形框出蝾螈头部(即 Ground-truth),如果随机切割的矩形与 Ground-truth在一定程度上重合,那么这个矩形框处就是蝾螈的头。
その重なり具合を計算するのが、IoU: Intersection over unionであり、次式で計算される。
重合程度通过检测评价函数(Intersection over Union)来判断。通过下式进行计算:
```bash
R1...Ground-truthの領域 , R2...切り抜いた矩形 , Rol...R1とR2の重なっている領域
R1...Ground-truth的范围 , R2...随机框出来的矩形 , Rol...为R1和R2重合的范围
IoU = |Rol| / |R1 + R2 - Rol|
```
ここでは、以下の2つの矩形のIoUを計算せよ。
在这里计算以下两个矩形的 IoU 吧!
```python
# [x1, y1, x2, y2] x1,y1...矩形の左上のx,y x2,y2...矩形の右下のx,y
Expand All @@ -98,32 +98,30 @@ b = np.array((60, 60, 170, 160), dtype=np.float32)
```
答案 >> [answers/answer_93.py](https://github.com/yoyoyo-yo/Gasyori100knock/blob/master/Question_91_100/answers/answer_93.py)
## Q.94. 機械学習の学習データの用意 (Step.2) ランダムクラッピング
## Q.94. 准备机器学习的训练数据第一步----随机裁剪(Random Cropping)
下面,通过从`imori1.jpg`中随机裁剪图像制作训练数据。
次に、*imori_1.jpg*からランダムに画像を切り抜いて(cropping, クラッピングと呼ぶ)学習データを作成する
这里,从图像中随机切出200个60 x 60的矩形
ここでは画像から60x60のサイズの矩形をランダムに200個切り抜け。
并且,满足下面的条件:
ただし、以下の条件を満たせ。
1. np.random.seed(0)として、切り抜く矩形の左上のx1 = np.random.randint(W-60), y1=np.random.randint(H-60)で求めよ。
2. GT (gt = np.array((47, 41, 129, 103), dtype=np.float32))とのIoUが0.5以上の時はその矩形に教師ラベル1, 0.5未満の場合はラベル0を与えよ。
1. 使用`np.random.seed(0)`,求出裁剪的矩形的左上角座标`x1 = np.random.randint(W-60)`和`y1=np.random.randint(H-60)`;
2. 如果和 Ground-truth (`gt = np.array((47, 41, 129, 103), dtype=np.float32)`)的 IoU 大于 0.5,那么就打上标注 1,小于 0.5 就打上标注 0。
答案は、ラベル1の矩形を赤、ラベル0の矩形を青、GTを緑にしている。
これでイモリの顔の画像、それ以外の画像を簡易的に用意できた。
答案中,标注 1 的矩形用红色画出,标注 0 的矩形用蓝色的线画出,Ground-truth 用绿色的线画出。在这里我们简单地准备蝾螈头部和头部以外的图像。
| 输入 (imori_1.jpg) | 输出(answers/answer_94.jpg) |
| :----------------: | :-------------------------: |
| ![](imori_1.jpg) | ![](answers/answer_94.jpg) |
答案 >> [answers/answer_94.py](https://github.com/yoyoyo-yo/Gasyori100knock/blob/master/Question_91_100/answers/answer_94.py)
## Q.95. ニューラルネットワーク (Step.1) ディープラーニングにする
## Q.95. 神经网络(Neural Network)第一步----深度学习(Deep Learning)
ここでは識別器としてニューラルネットワークを用いる。
これは現在流行っているディープラーニングである。
在这里将神经网络作为分类器,这就是现在流行的深度学习。
输入層、中間層(ユニット数:64)、输出層(1)のネットワークは次のようにプログラムできる。これは、排他的論理和を実現するネットワークである。プログラムに関しては https://towardsdatascience.com/how-to-build-your-own-neural-network-from-scratch-in-python-68998a08e4f6 を参照せよ。
下面的代码是包含输入层、中间层(Unit 数:64)、输出层(1)的网络。这是实现异或逻辑的网络。网络代码参照了[这里](https://towardsdatascience.com/how-to-build-your-own-neural-network-from-scratch-in-python-68998a08e4f6):
```python
import numpy as np
Expand Down Expand Up @@ -181,10 +179,9 @@ for j in range(4):
print("in:", x, "pred:", nn.forward(x))
```
ここでは、中間層(ユニット数:64)をもう一層増やし、学習・テストを行え。
在这里,我们可以再增加一层中间层进行学习和测试。
答案
答案
```bash
in: [0. 0.] pred: [0.03724313]
Expand All @@ -195,63 +192,60 @@ in: [1. 1.] pred: [0.03937037]
答案 >> [answers/answer_95.py](https://github.com/yoyoyo-yo/Gasyori100knock/blob/master/Question_91_100/answers/answer_95.py)
## Q.96. ニューラルネットワーク (Step.2) 学習
## Q.96. 神经网络(Neural Network)第二步----训练
在这里,将问题94中准备的200 个训练数据的 HOG 特征值输入到问题94​中的神经网络中进行学习。
ここでは、Q.94で用意した学習データ200のHOG特徴量を输入として、Q.95で作成したニューラルネットを学習せよ。
在这里,对于输出大于 0.5 的打上标注 1,小于 0.5 的打上标注 0,对训练数据计算准确率。训练参数如下:
ここでは、学習データに対してAccuracyを計算せよ。ただし、输出(予測確率)が0.5以上で予測ラベルが1、0.5未満で予測ラベルは0としてAccuracyを計算せよ。
学習のハイパーパラメータは、下記の通り。
- 学習率 lr= 0.01
- 学習回数 epch=10000
- 切り抜いた画像を32x32にリサイズして、HOG特徴量を取得せよ。(HOGは8x8を1セルとする。)
- 学习率:lr=0.01;
- epoch=10000​;
- 将裁剪的图像调整为32 x 32,并计算 HOG 特征量(HOG 中1个 cell 的大小为8 x 8)。
```bash
Accuracy >> 1.0 (200.0 / 200)
```
答案 >> [answers/answer_96.py](https://github.com/yoyoyo-yo/Gasyori100knock/blob/master/Question_91_100/answers/answer_96.py)
## Q.97. 簡単な物体検出 (Step.1) スライディングウィンドウ + HOG
## Q.97. 简单物体检测第一步----滑动窗口(Sliding Window)+HOG
ここから物体検出を行う。
从这里开始进行物体检测吧!
物体検出とは、画像中でどこに何が写っているかを输出するタスクである。
例えば、画像の[x1, y1, x2, y2]の位置に犬がいるなど。
このような物体を囲む矩形のことをBounding-box(バウンディングボックス)と呼ぶ。
物体检测是检测图像中到底有什么东西的任务。例如,图像在[x1, y1, x2, y2]处有一只狗。像这样把物体圈出来的矩形我们称之为 Bounding-box。
ここでは簡単な物体検出のアルゴリズムを作成する。
下面实现简单物体检测算法:
1. 画像の左上からスライディングウィンドウを行う。
2. 各画像の位置について、注目位置を中心に複数の矩形を用意する。
3. それぞれの矩形に対応する画像を切り抜いて、特徴抽出(HOG, SIFTなど)を行う。
4. 識別機(CNN, SVMなど)に掛けて各矩形が物体か否かを判別する
1. 从图像左上角开始进行滑动窗口扫描;
2. 对于每个图像位置,以目标位置为中心准备多个矩形;
3. 裁剪出每个矩形对应的图像,并对图像提取特征(HOG,SIFT等);
4. 使用分类器(CNN,SVM等)以确定每个矩形是否包含目标
これである程度の物体と矩形の座標が得られる。現在は物体検出はディープラーニングによる手法(Faster R-CNN, YOLO, SSDなど)が主流であるが、ディープラーニングが流行る前まではこのようなスライディングウィンドウの手法が主流であった。今回は検出の基礎を学ぶため、スライディングウィンドウを扱う
これである程度の物体と矩形の座標が得られる。目前,物体检测主要通过深度学习(Faster R-CNNYOLO、SSD等)进行,但是这种滑动窗口方法在深度学习开始流行之前已成为主流。为了学习检测的基础知识我们使用滑动窗口来进行检测
ここでは1-3を実装する
在这里我们实现步骤1至步骤3
*imori_many.jpg*に対してイモリの顔検出を行う。
条件は以下。
- 矩形は下記のものを用いる。
在`imorimany.jpg`上检测蝾螈的头吧!条件如下:
- 矩形使用以下方法表示
```python
# [h, w]
recs = np.array(((42, 42), (56, 56), (70, 70)), dtype=np.float32)
```
- スライドは4ピクセルおきに行う。(1ピクセルでもいいが、計算が多くなって処理が長くなってしまう。)
- 矩形が画像サイズをはみ出る場合は、はみ出ないように変形する。
- 矩形部分を切り抜いたら、その部分を32x32にリサイズする。
- HOG特徴量の取得は8x8を1セルとする
- 滑动步长为4个像素(每次滑动一个像素固然是好的,但这样需要大量计算,处理时间会变长);
- 如果矩形超过图像边界,改变矩形的形状使其不超过图像的边界;
- 将裁剪出的矩形部分大小调整为32 x 32;
- 计算 HOG 特征值时 cell 大小取8 x 8
答案 >> [answers/answer_97.py](https://github.com/yoyoyo-yo/Gasyori100knock/blob/master/Question_91_100/answers/answer_97.py)
## Q.98. 簡単な物体検出 (Step.2) スライディングウィンドウ + NN
## Q.98. 简单物体检测第二步----滑动窗口(Sliding Window)+ NN
*imori_many.jpg*に対して、ここではQ.97で求めた各矩形のHOG特徴量を输入として、Q.96で学習したニューラルネットでイモリの顔か否かを識別せよ
对于`imorimany.jpg`,在这里将问题97中求得的各个矩形的 HOG 特征值输入问题96中训练好的神经网络中进行蝾螈头部识别
ここでスコア(予測確率)が0.7以上の矩形を描画せよ
在此,绘制预测概率大于0.7的矩形
答案
検出された矩形 [x1, y1, x2, y2, score]
下面的答案内容为检测矩形的[x1, y1, x2, y2, score]:
```bash
[[ 27. 0. 69. 21. 0.74268049]
Expand Down Expand Up @@ -291,24 +285,21 @@ recs = np.array(((42, 42), (56, 56), (70, 70)), dtype=np.float32)
解答 >> [answers/answer_98.py](https://github.com/yoyoyo-yo/Gasyori100knock/blob/master/Question_91_100/answers/answer_98.py)
## Q.99. 簡単な物体検出 (Step.3) Non-Maximum Suppression
## Q.99. 简单物体检测第三步----非极大值抑制(Non-Maximum Suppression
Q.97であらかたの検出はできたが、このままではBrounding-boxの数が多すぎて、ここから何かしらの処理に繋げるには不便である。
そこで、NMS: Non-maximum suppressionという手法を用いて矩形の数を減らす。
虽然使用问题97中的方法可以粗略地检测出目标,但是 Bounding-box 的数量过多,这对于后面的处理流程是十分不便的。因此,使用非极大值抑制((Non-Maximum Suppression))减少矩形的数量。
NMSとはスコアの高いBounding-boxのみを残す手法であり、アルゴリズムは以下の通り。
NMS 是一种留下高分 Bounding-box 的方法,算法如下:
1. Boundinb-boxの集合Bをスコアが高い順にソートする。
2. スコアが最大のものをb0とする。
3. b0と他のBounding-boxのIoUを計算する。IoUが閾値t以上のBounding-boxをBから削除する。B0は输出する集合Rに加え、Bから削除する
4. 2-3をBがなくなるまで行う。
5. Rを输出する
1. 将 Bounding-box 的集合 B 按照分数从高到低排序;
2. 分数最高的记为 b0;
3. 计算 b0和其它 Bounding-box 的 IoU。从 B 中删除高于 IoU 阈值 t的 Bounding-box。将 B0 添加到输出集合 R 中,并从 B 中删除
4. 重复步骤 2 和步骤 3 直到 B 中没有任何元素;
5. 输出 R
Q.98にNMS(閾値t=0.25)を組み込み、输出を描画せよ。
解答では検出の左上にスコアも加えている。
在问题98的基础上增加 NMS(阈值 t=0.25),并输出图像。请在答案中 Bounding-box 的左上角附上分数。
精度はともあれ、これで検出の一連の流れが完了した。
ニューラルネットの学習を増やしたりすることで、検出の精度は更に向上ができる。
不管准确度如何,这样就完成了图像检测的一系列流程。通过增加神经网络,可以进一步提高检测精度。
| 输入 (imori_many.jpg) | NMS前(answers/answer_98.jpg) | NMS後(answers/answer_99.jpg) |
| :-------------------: | :--------------------------: | :--------------------------: |
Expand All @@ -317,14 +308,13 @@ Q.98にNMS(閾値t=0.25)を組み込み、输出を描画せよ。
解答 >> [answers/answer_99.py](https://github.com/yoyoyo-yo/Gasyori100knock/blob/master/Question_91_100/answers/answer_99.py)
## Q.100. 簡単な物体検出 (Step.4) 評価 Precision, Recall, F-score, mAP
## Q.100. 简单物体检测第三步----评估 Precision, Recall, F-score, mAP
ついに100問目!!
最后是第100个问题! !
ここでは検出の評価指標を実装する
在这里我们对检测效果作出评估
検出はBounding-boxとそのクラスの2つが一致していないと、精度の評価ができない。
検出の評価指標には、Recal, Precision, F-score, mAPなどが存在する。
如果 Bounding-box 和其两个类不匹配,则无法评估检测的准确性。对于检测效果的评价指标,我们有Recal、Precision、F-score、mAP等。
### Recall ... 正解の矩形がどれだけ検出できたか。正解をどれだけ網羅できたかを示す。[0,1]の範囲を取り、1が最高。
Expand Down

0 comments on commit db314f7

Please sign in to comment.