SwiftOCR在手機(jī)號(hào)/數(shù)字識(shí)別App中的應(yīng)用

SwiftOCR在手機(jī)號(hào)/數(shù)字識(shí)別App中的應(yīng)用

數(shù)字識(shí)別的基本過程

數(shù)字識(shí)別的基本過程
數(shù)字識(shí)別的基本過程

在第一,二步圖像獲取與預(yù)處理后

步驟三使用 Connected-component labeling 技術(shù)實(shí)現(xiàn)了文字的分割,這是識(shí)別前關(guān)鍵的一步.

步驟四,對(duì)圖片進(jìn)行縮放 轉(zhuǎn)換為16x20的二進(jìn)制數(shù)組 做為神經(jīng)網(wǎng)絡(luò)輸入前的準(zhǔn)備

步驟五,對(duì)這組數(shù)據(jù)跑神經(jīng)網(wǎng)絡(luò)

步驟六,輸出運(yùn)算結(jié)果 98.99的可能性是數(shù)字1.

SwiftOCR簡(jiǎn)介

SwiftOCR是一個(gè)由Swift編寫的快速簡(jiǎn)單的光學(xué)字符識(shí)別庫,使用FFNN神經(jīng)網(wǎng)絡(luò)進(jìn)行圖像識(shí)別.針對(duì)0~9 A~Z的目標(biāo)字符進(jìn)行識(shí)別.

SwiftOCR的作者對(duì)為什么使用SwiftOCR代替經(jīng)典的Tesseract 有如下論述:

If you want to recognize normal text like a poem or a news article, go with Tesseract, but if you want to recognize short, alphanumeric codes (e.g. gift cards), I would advise you to choose SwiftOCR because that's where it exceeds.

Tesseract is written in C++ and over 30 years old. To use it you first have to write a Objective-C++ wrapper for it. The main issue that's slowing down Tesseract is the way memory is managed. Too many memory allocations and releases slow it down.

改造過程

首先業(yè)務(wù)目標(biāo): 識(shí)別印刷體的手機(jī)號(hào).

第一步,重新訓(xùn)練數(shù)據(jù)訓(xùn)練集,使用程序生成各種系統(tǒng)字體的0~9的數(shù)字進(jìn)行訓(xùn)練,輸出新的OCR-Network文件.

第二步,圖像輸入改為視頻流.

第三步,優(yōu)化--提高幀率.

優(yōu)化邏輯與具體代碼

1?? 經(jīng)過測(cè)試 識(shí)別算法運(yùn)行中,仍然會(huì)有數(shù)據(jù)的到達(dá).如果算法正在運(yùn)行,則直接返回.

2?? 識(shí)別算法在對(duì)數(shù)字串進(jìn)行分割處理時(shí),會(huì)調(diào)用比較重的由GPUImage庫提供的Connected-component labeling,性能消耗較大.

所以首先調(diào)用iOS 9提供的文字檢測(cè)API,判斷輸入圖像中是否有文字.

有則識(shí)別文字,無則返回.

func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!) {

    // 識(shí)別中 則返回
    if self.viewModel.isOCRRecognizing {
        return   
    }

    // 截取圖片
    self.imgToRecognize = XGCameraScanWrapper.cropImageFromSampleBuffer(using: sampleBuffer, croppedSizeInScreen: (self.qRScanView?.getRetangeSize())!)

    // 調(diào)用 iOS 9 文字檢測(cè)API. 若沒有檢測(cè)到文字 => 則返回 不跑數(shù)字識(shí)別算法
    if #available(iOS 9.0, *) {
        let ciDetector = CIDetector(ofType: CIDetectorTypeText, context: nil, options: nil)
        guard let ciImgToRecognize = self.convertUIImageToCIImage(uiImage: self.imgToRecognize!) else {
            return
        }

        let features = ciDetector?.features(in: ciImgToRecognize)

        if (features?.isEmpty)! {
            self.recognizedImgView?.isHidden = true
            return
        } else {
            self.recognizedImgView?.image = self.imgToRecognize
            self.recognizedImgView?.isHidden = false
        }
    }

    // 識(shí)別圖像
    self.viewModel.isOCRRecognizing = true
    self.xgDigitalRecognizeService?.recognize(self.imgToRecognize!) { recognizedString in

        if recognizedString.utf16.count >= 11 {  // 簡(jiǎn)單通過識(shí)別結(jié)果的長(zhǎng)度進(jìn)行輸出判斷 實(shí)際可通過正則限制結(jié)果的輸出
            DispatchQueue.main.async {
                self.viewModel.phoneNumStr = recognizedString
                self.resultLablePhoneNum?.text = "手機(jī)號(hào): " + self.viewModel.phoneNumStr
            }
        }

        self.viewModel.isOCRRecognizing = false
    }
}

Other

手寫字體的機(jī)器識(shí)別是一個(gè)很久遠(yuǎn)經(jīng)典的問題.

也有一個(gè)近30年的標(biāo)準(zhǔn)訓(xùn)練集MNIST

可否支持手寫字體的識(shí)別? 單個(gè)手寫字體的識(shí)別不難,有興趣可參考下面Tensorflow on iOS這篇文章.

難點(diǎn)是如何處理連筆書寫的數(shù)字,此時(shí)通過 Connected-component labeling 技術(shù)進(jìn)行文字的分割已經(jīng)失效.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末胀滚,一起剝皮案震驚了整個(gè)濱河市躬贡,隨后出現(xiàn)的幾起案子脐雪,更是在濱河造成了極大的恐慌肾砂,老刑警劉巖领追,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忽冻,死亡現(xiàn)場(chǎng)離奇詭異卧须,居然都是意外死亡创淡,警方通過查閱死者的電腦和手機(jī)痴晦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來琳彩,“玉大人誊酌,你說我怎么就攤上這事÷斗Γ” “怎么了碧浊?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)瘟仿。 經(jīng)常有香客問我箱锐,道長(zhǎng),這世上最難降的妖魔是什么劳较? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任驹止,我火速辦了婚禮,結(jié)果婚禮上观蜗,老公的妹妹穿的比我還像新娘臊恋。我一直安慰自己,他們只是感情好墓捻,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布抖仅。 她就那樣靜靜地躺著,像睡著了一般砖第。 火紅的嫁衣襯著肌膚如雪撤卢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天梧兼,我揣著相機(jī)與錄音放吩,去河邊找鬼。 笑死羽杰,一個(gè)胖子當(dāng)著我的面吹牛屎慢,可吹牛的內(nèi)容都是我干的瞭稼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼腻惠,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼环肘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起集灌,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤悔雹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后欣喧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腌零,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年唆阿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了益涧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡驯鳖,死狀恐怖闲询,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情浅辙,我是刑警寧澤扭弧,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站记舆,受9級(jí)特大地震影響鸽捻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜泽腮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一御蒲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧诊赊,春花似錦厚满、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽摘能。三九已至续崖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間团搞,已是汗流浹背严望。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逻恐,地道東北人像吻。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓峻黍,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親拨匆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子姆涩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容