| import * as fs from 'fs'; | |
| import * as cv from '../../'; | |
| import { | |
| lccs, | |
| centerLetterInImage, | |
| saveConfusionMatrix | |
| } from './OCRTools'; | |
| const trainDataPath = '../../data/ocr/traindata'; | |
| const testDataPath = '../../data/ocr/testdata'; | |
| const outPath = '../../data/ocr'; | |
| const SVMFile = 'lcletters.xml'; | |
| const hog = new cv.HOGDescriptor({ | |
| winSize: new cv.Size(40, 40), | |
| blockSize: new cv.Size(20, 20), | |
| blockStride: new cv.Size(10, 10), | |
| cellSize: new cv.Size(10, 10), | |
| L2HysThreshold: 0.2, | |
| nbins: 9, | |
| gammaCorrection: true, | |
| signedGradient: true | |
| }); | |
| const svm = new cv.SVM({ | |
| kernelType: cv.ml.SVM.RBF, | |
| c: 12.5, | |
| gamma: 0.50625 | |
| }); | |
| const computeHOGDescriptorFromImage = (img: cv.Mat, isIorJ: boolean) => { | |
| let im = img; | |
| if (im.rows !== 40 || im.cols !== 40) { | |
| im = im.resize(40, 40); | |
| } | |
| // center the letter | |
| im = centerLetterInImage(img, isIorJ); | |
| if (!img) { | |
| return null; | |
| } | |
| return hog.compute(im); | |
| }; | |
| const trainSVM = (trainDataFiles: string[][], isAuto: boolean = false) => { | |
| // make hog features of trainingData and label it | |
| console.log('make features'); | |
| const samples: number[][] = []; | |
| const labels: number[] = []; | |
| trainDataFiles.forEach((files, label) => { | |
| files.forEach((file) => { | |
| const img = cv.imread(file); | |
| const isIorJ = label === 8 || label === 9; | |
| const desc = computeHOGDescriptorFromImage(img, isIorJ); | |
| if (!desc) { | |
| return; | |
| } | |
| samples.push(desc); | |
| labels.push(label); | |
| }); | |
| }); | |
| // train the SVM | |
| console.log('training'); | |
| const trainData = new cv.TrainData( | |
| new cv.Mat(samples, cv.CV_32F), | |
| cv.ml.ROW_SAMPLE, | |
| new cv.Mat([labels], cv.CV_32S) | |
| ); | |
| svm[isAuto ? 'trainAuto' : 'train'](trainData); | |
| }; | |
| const data = lccs.map((letter) => { | |
| const trainDataDir = `${trainDataPath}/${letter}`; | |
| const testDataDir = `${testDataPath}/${letter}`; | |
| const train = fs.readdirSync(trainDataDir).map(file => `${trainDataDir}/${file}`); | |
| const test = fs.readdirSync(testDataDir).map(file => `${testDataDir}/${file}`); | |
| return ({ train, test }); | |
| }); | |
| const trainDataFiles = data.map(classData => classData.train); | |
| const testDataFiles = data.map(classData => classData.test); | |
| const numTrainImagesPerClass = trainDataFiles[0].length; | |
| const numTestImagesPerClass = testDataFiles[0].length; | |
| console.log('train data per class:', numTrainImagesPerClass); | |
| console.log('test data per class:', numTestImagesPerClass); | |
| trainSVM(trainDataFiles, false); | |
| svm.save(`${outPath}/${SVMFile}`); | |
| svm.load(`${outPath}/${SVMFile}`); | |
| // compute prediction error for each letter | |
| const errs = Array(26).fill(0); | |
| testDataFiles.forEach((files, label) => { | |
| files.forEach((file) => { | |
| const img = cv.imread(file); | |
| const isIorJ = label === 8 || label === 9; | |
| const desc = computeHOGDescriptorFromImage(img, isIorJ); | |
| if (!desc) { | |
| throw new Error(`Computing HOG descriptor failed for file: ${file}`); | |
| } | |
| const predictedLabel = svm.predict(desc); | |
| if (label !== predictedLabel) { | |
| errs[label] += 1; | |
| } | |
| }); | |
| }); | |
| console.log('prediction result:'); | |
| errs.forEach((err, l) => console.log(lccs[l], err, 1 - (err / numTestImagesPerClass))); | |
| console.log('average: ', 1 - (errs.reduce((e1, e2) => e1 + e2) / (lccs.length * numTestImagesPerClass))); | |
| saveConfusionMatrix( | |
| testDataFiles, | |
| (img, isIorJ) => svm.predict(computeHOGDescriptorFromImage(img, isIorJ)), | |
| numTestImagesPerClass, | |
| `${outPath}/confusionmatrix.csv` | |
| ); |
2017通訊大賽「聯發科技物聯網開發競賽」決賽團隊29強出爐!作品都在11月24日頒獎典禮進行展示 LIS 發表於 2017年11月16日 10:31 收藏此文 2017通訊大賽「聯發科技物聯網開發競賽」決賽於11月4日在台北文創大樓舉行,共有29個隊伍進入決賽,角逐最後的大獎,並於11月24日進行頒獎,現場會有全部進入決賽團隊的展示攤位,總計約為100個,各種創意作品琳琅滿目,非常值得一看,這次錯過就要等一年。 「聯發科技物聯網開發競賽」決賽持續一整天,每個團隊都有15分鐘面對評審團做簡報與展示,並接受評審們的詢問。在所有團隊完成簡報與展示後,主辦單位便統計所有評審的分數,並由評審們進行審慎的討論,決定冠亞季軍及其他各獎項得主,結果將於11月24日的「2017通訊大賽頒獎典禮暨成果展」現場公佈並頒獎。 在「2017通訊大賽頒獎典禮暨成果展」現場,所有入圍決賽的團隊會設置攤位,總計約為100個,展示他們辛苦研發並實作的作品,無論是想觀摩別人的成品、了解物聯網應用有那些新的創意、尋找投資標的、尋找人才、尋求合作機會或是單純有興趣,都很適合花點時間到現場看看。 頒獎典禮暨成果展資訊如下: 日期:2017年11月24日(星期五) 地點:中油大樓國光廳(台北市信義區松仁路3號) 我要報名參加「2017通訊大賽頒獎典禮暨成果展」>>> 在參加「2017通訊大賽頒獎典禮暨成果展」之前,可以先在本文觀看各團隊的作品介紹。 決賽29強團隊如下: 長者安全救星 可隨意描繪或書寫之電子筆記系統 微觀天下 體適能訓練管理裝置 肌少症之行走速率檢測系統 Sugar Robot 賽亞人的飛機維修輔助器 iTemp你的溫度個人化管家 語音行動冰箱 MR模擬飛行 智慧防盜自行車 跨平台X-Y視覺馬達控制 Ironmet 菸消雲散 無人小艇 (Mini-USV) 救OK-緊急救援小幫手 穿戴式長照輔助系統 應用於教育之模組機器人教具 這味兒很台味 Aquarium Hub 發展遲緩兒童之擴增實境學習系統 蚊房四寶 車輛相控陣列聲納環境偵測系統 戶外團隊運動管理裝置 懷舊治療數位桌曆 SeeM智能眼罩 觸...
留言
張貼留言