2021年1月20日 星期三

如何提高CNN準確度

markdown 主要從網路上心得做整理 * 增加更多Data * 參考[data imbalance-資料不均勻問題與處理方式](https://ny20201209blog.blogspot.com/2020/12/data-imbalance.html)中的data Oversampling * [更換CNN架構](https://ny20201209blog.blogspot.com/2021/01/kerascnn.html) * 使用預訓練(pretrained)的卷積層 * tune parameter * 提高epoch * learning rate
* 觀察是Overfitting還是Underfitting * Underfitting * 提高epoch、增加訓練時間 * 增加更多特徵 * 減少 regularization * Data augmentation * Overfitting * 減少特徵(無用的特徵)、降維(特徵工程) * L2 regularization * 讓網路變淺(減少層數)、減少隱藏層 * 確保訓練與測試資料來自同一個資料分布 * Drop out * Early Stopping

2021年1月11日 星期一

在Keras上使用經典的CNN架構

markdown CNN架構選擇一直是deep learning中很重要的一部分,從早期LeNet-5用來手寫字元辨識
F-CNN、resnet、vgg19...
一開始心中都會有個疑問,到底這些層數是怎麼決定出來的
後來大概理解就像是hyperparameter一樣吧,透過不斷的實驗而得出來的最佳化結果
通常這類的CNN架構,還會包含預先訓練好的conv layer
讓你在訓練新的data時收斂速度更快

在keras中,只要簡單的指令就可以快速的把這些經典的CNN模型架起來
並且可以修改輸入的影像尺寸、增減模型的層數
```=python # 定義你的輸入影像尺寸 custom_input_shape =(128, 128, 3) # 定義你的data類別總數 classes = 6 # 從tf.keras.applications載入CNN架構 base_model=MobileNetV2(weights='imagenet', input_shape=custom_input_shape) x=base_model.output x=GlobalAveragePooling2D()(x) x=Dense(1024,activation='relu')(x) #增加dense層讓model可以學習更複雜的分類 x=Dense(1024,activation='relu')(x) #dense layer 2 x=Dense(512,activation='relu')(x) #dense layer 3 preds=Dense(classes,activation='softmax')(x) #最後一層需填入dataset的類別總數 model=keras.Model(inputs=base_model.input,outputs=preds) #宣告model, 指定輸入和輸出 model.summary() # 用文字方式顯示CNN架構 ``` 想看keras有甚麼經典模型可以看這裡Module: tf.keras.applications 參考:Keras with MobilenetV2 for Deep Learning

2021年1月5日 星期二

在C#上使用emgucv中的image stitching(影像拼接)功能

markdown 測試資料下載:test data 安裝emgucv方法參考連結 ```=C# //載入影像到image array中 string[] dirs = Directory.GetFiles(@"你的影像路徑資料夾", "*.jpg"); Image[] sourceImages = new Image[dirs.Length]; for (int i = 0;i(dirs[i]); } Stitcher stitcher = new Stitcher(); //選擇特徵演算法 Emgu.CV.Features2D.SIFT finder = new Emgu.CV.Features2D.SIFT(); WarperCreator warper = new SphericalWarper(); stitcher.SetFeaturesFinder(finder); stitcher.SetWarper(warper); VectorOfMat vm = new VectorOfMat(); Mat result = new Mat(); vm.Push(sourceImages); //紀錄拼接時間 Stopwatch watch = Stopwatch.StartNew(); //拼接開始 Stitcher.Status stitchStatus = stitcher.Stitch(vm, result); watch.Stop(); if(stitchStatus == Stitcher.Status.Ok) { Bitmap img = result.ToBitmap(); img.Save("save.bmp"); } ``` 結果


 可依使用需求修改拼接演算法
 EX:影像角度旋轉量較大的用SIFT 
想要運算速度快一點的可以用ORB

AOI產業職涯規畫相關文章