物體檢測(cè)4:Android上應(yīng)用物體監(jiān)測(cè)(TF1)

tf

在上一章節(jié)訓(xùn)練一個(gè)物體檢測(cè)器,
我們將訓(xùn)練后的模型導(dǎo)出成了pb文件尸变,用在PC側(cè)tensorflow物體監(jiān)測(cè);本章節(jié)减俏,我們嘗試在Android手機(jī)上轉(zhuǎn)化我們訓(xùn)練好的模型召烂,供手機(jī)端tensorflow-lite使用

生成pb和pbtxt文件

#~/tensorflow/models/research/object_detection$ 
python export_tflite_ssd_graph.py \
    --pipeline_config_path=/home/jiadongfeng/tensorflow/dataset/raccoon_dataset/jdf_config/ssd_mobilenet_v1_raccoon.config  \
    --trained_checkpoint_prefix=/home/jiadongfeng/tensorflow/dataset/raccoon_dataset/jdf_train/model.ckpt-62236 \
    --output_directory=/home/jiadongfeng/tensorflow/dataset/raccoon_dataset/jdf_train \
    --add_postprocessing_op=true

輸出結(jié)果為:

(base) jiadongfeng@jiadongfeng:~/tensorflow/dataset/raccoon_dataset/jdf_train$ ls | grep tflite_graph
tflite_graph.pb
tflite_graph.pbtxt



pb文件轉(zhuǎn)化成tflite

運(yùn)行以下命令:

#~/anaconda2/lib/python2.7/site-packages/tensorflow/lite
toco  \
 --graph_def_file=/home/jiadongfeng/tensorflow/dataset/raccoon_dataset/jdf_train/tflite_graph.pb \
 --output_file=/home/jiadongfeng/tensorflow/dataset/raccoon_dataset/jdf_train/detect.tflite \
 --input_shapes=1,300,300,3 \
 --input_arrays=normalized_input_image_tensor \
 --output_arrays='TFLite_Detection_PostProcess','TFLite_Detection_PostProcess:1','TFLite_Detection_PostProcess:2','TFLite_Detection_PostProcess:3'  \
 --inference_type=QUANTIZED_UINT8 \
 --mean_values=128 \
 --std_dev_values=128 \
 --change_concat_input_ranges=false \
 --allow_custom_ops 

會(huì)提示以下錯(cuò)誤:

 F tensorflow/lite/toco/tooling_util.cc:1709] Array FeatureExtractor/MobilenetV1/MobilenetV1/Conv2d_0/Relu6, which is an input to the DepthwiseConv operator producing the output array FeatureExtractor/MobilenetV1/MobilenetV1/Conv2d_1_depthwise/Relu6, is lacking min/max data, which is necessary for quantization. If accuracy matters, either target a non-quantized output format, or run quantized training with your model from a floating point checkpoint to change the input graph to contain min/max information. If you don't care about accuracy, you can pass --default_ranges_min= and --default_ranges_max= for easy experimentation.
Aborted (core dumped)

錯(cuò)誤解決方案一:
使用非量化的轉(zhuǎn)換,需要將inference_type=QUANTIZED_UINT8 改為—inference_type=FLOAT并添加:
--default_ranges_min
--default_ranges_max

Quantized模型里面的權(quán)重參數(shù)用1個(gè)字節(jié)的uint8類型表示娃承,模型大小是Float版本的四分之一奏夫;后續(xù)我們?cè)僦v解怎么生成Quantized的模型文件

最后運(yùn)行以下命令:

toco  \
 --graph_def_file=/home/jiadongfeng/tensorflow/dataset/raccoon_dataset/jdf_train/tflite_graph.pb \
 --output_file=/home/jiadongfeng/tensorflow/dataset/raccoon_dataset/jdf_train/detect.tflite \
 --input_shapes=1,300,300,3 \
 --input_arrays=normalized_input_image_tensor \
 --output_arrays='TFLite_Detection_PostProcess','TFLite_Detection_PostProcess:1','TFLite_Detection_PostProcess:2','TFLite_Detection_PostProcess:3'  \
 --inference_type=FLOAT \
 --mean_values=128 \
 --std_dev_values=128 \
 --change_concat_input_ranges=false \
 --allow_custom_ops \
 --default_ranges_min=0\
 --default_ranges_max=6

生成detect.tflite文件:

base) jiadongfeng@jiadongfeng:~/tensorflow/dataset/raccoon_dataset/jdf_train$ ls | grep detect
detect.tflite

生成的文件達(dá)到22MB,而原生的支持80個(gè)物種監(jiān)測(cè)的tflite文件(Quantized類型)相機(jī)集成物體監(jiān)測(cè)历筝,僅僅為3MB左右酗昼;

解決方案二:
使用量化轉(zhuǎn)換,將inference_type和input_data_type設(shè)置為QUANTIZED_UINT8 梳猪;
參數(shù)default_ranges_min和default_ranges_max也需要設(shè)置

toco  \
 --graph_def_file=/home/jiadongfeng/tensorflow/dataset/raccoon_dataset/jdf_train/tflite_graph.pb \
 --output_file=/home/jiadongfeng/tensorflow/dataset/raccoon_dataset/jdf_train/detect.tflite \
 --input_shapes=1,300,300,3 \
 --input_arrays=normalized_input_image_tensor \
 --output_arrays='TFLite_Detection_PostProcess','TFLite_Detection_PostProcess:1','TFLite_Detection_PostProcess:2','TFLite_Detection_PostProcess:3'  \
 --inference_type=QUANTIZED_UINT8 \
 --input_data_type=QUANTIZED_UINT8 \
 --mean_values=128 \
 --std_dev_values=128 \
 --change_concat_input_ranges=false \
 --allow_custom_ops \
 --default_ranges_min=0\
 --default_ranges_max=6

此種方案生成的tflite文件麻削,比非量化模式減少了四倍,精度稍有下降

tflite集成到相機(jī)中

集成浣熊監(jiān)測(cè).png
  • 然后匿沛,原生的監(jiān)測(cè)模型是量化后的模型扫责,而我們的是float類型的模型;所以需要將TF_OD_API_IS_QUANTIZED 改為false
    private static final boolean TF_OD_API_IS_QUANTIZED = true;

    detector =
          TFLiteObjectDetectionAPIModel.create(
                            cameraActivity.getAssets(),
                            TF_OD_API_MODEL_FILE,
                            TF_OD_API_LABELS_FILE,
                            TF_OD_API_INPUT_SIZE,
                            TF_OD_API_IS_QUANTIZED);
  • 最后俺祠,集成后的監(jiān)測(cè)效果圖為:
浣熊識(shí)別.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末公给,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蜘渣,更是在濱河造成了極大的恐慌,老刑警劉巖肺然,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蔫缸,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡际起,警方通過查閱死者的電腦和手機(jī)拾碌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門吐葱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人校翔,你說我怎么就攤上這事弟跑。” “怎么了防症?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵孟辑,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我蔫敲,道長(zhǎng)饲嗽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任奈嘿,我火速辦了婚禮貌虾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘裙犹。我一直安慰自己尽狠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布叶圃。 她就那樣靜靜地躺著晚唇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盗似。 梳的紋絲不亂的頭發(fā)上哩陕,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音赫舒,去河邊找鬼悍及。 笑死,一個(gè)胖子當(dāng)著我的面吹牛接癌,可吹牛的內(nèi)容都是我干的心赶。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼缺猛,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼缨叫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起荔燎,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤耻姥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后有咨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體琐簇,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年座享,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了婉商。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片似忧。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖丈秩,靈堂內(nèi)的尸體忽然破棺而出盯捌,到底是詐尸還是另有隱情,我是刑警寧澤蘑秽,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布饺著,位于F島的核電站,受9級(jí)特大地震影響筷狼,放射性物質(zhì)發(fā)生泄漏瓶籽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一埂材、第九天 我趴在偏房一處隱蔽的房頂上張望塑顺。 院中可真熱鬧,春花似錦俏险、人聲如沸严拒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽裤唠。三九已至,卻和暖如春莹痢,著一層夾襖步出監(jiān)牢的瞬間种蘸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工竞膳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留航瞭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓坦辟,卻偏偏與公主長(zhǎng)得像刊侯,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子锉走,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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