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智能眼罩 觸...
留言
張貼留言