C++和cpu環境採用OpenVINO對facenet人臉識別模型的實際部署

相關介紹:

如何在 Keras 中加載 FaceNet 模型

有許多項目提供了用於訓練基於 FaceNet 的模型和利用預訓練模型的工具。

 

David Sandberg 的 FaceNet它提供了利用 TensorFlow 構建和訓練的 FaceNet 模型。雖然在撰寫本文時還沒有提供基於庫的安裝,也沒有提供乾淨的 API,但這個項目看起來已經成熟。有用的是,David 的項目提供了許多高性能的預訓練 FaceNet 模型,並且有許多項目可以移植或轉換這些模型,以便能夠在 Keras 中使用。

一個值得注意的例子是 Hiroki Taniai 的 Keras FaceNet,他的項目提供了一個腳本,用於將 Inception ResNet v1 模型從 TensorFlow 轉換爲 Keras。他還提供了預訓練 Keras 模型,可供隨時使用。使用 Hiroki Taniai 提供的預訓練 Keras FaceNet 模型,它是在 MS-Celeb-1M 數據集上訓練的,並要求輸入圖像是彩色的,其像素值要進行白噪化(在所有三個通道中進行標準化),並且具有 160x160 像素的正方形。

Keras FaceNet 預訓練模型 (88 MB) 下載網址如下:

https://drive.google.com/open?id=1pwQ3H4aJ8a6yyJHZkTwtjcL4wYWQb7bn

實際操作

1. keras的hdf5模型轉爲tf的pb凍結文件:

2. pb文件轉爲openvino優化後的IR文件

python mo_tf.py --input_model facenet_keras.pb --input_shape=[1,160,160,3]    --data_type FP32   --model_name facenet

 facenet fp32精度的IR文件下載地址:https://download.csdn.net/download/qq_35054151/12500493

3. openvino常規套路操作

 把圖像轉爲blob數據

主要注意的是模型輸入爲160*160*3形狀,且進行歸一化操作,同理在c++環境也需要預處理。

/** Iterating over all input blobs **/
	for (auto & item : input_info) {
		auto input_name = item.first;
		cout << "input_name:" << input_name << endl;
		/** Getting input blob **/
		auto input = infer_request.GetBlob(input_name);
		size_t num_channels = input->getTensorDesc().getDims()[1];
		size_t h = input->getTensorDesc().getDims()[2];
		size_t w = input->getTensorDesc().getDims()[3];
		size_t image_size = h*w;
		Mat blob_image;
		resize(src, blob_image, Size(h, w));

		// NCHW
		unsigned char* data = static_cast<unsigned char*>(input->buffer());
		for (size_t row = 0; row < h; row++) {
			for (size_t col = 0; col < w; col++) {
				for (size_t ch = 0; ch < num_channels; ch++) {
					data[image_size*ch + row*w + col] = (blob_image.at<Vec3b>(row, col)[ch]-100)/50;
				}
			}
		}
	}

因爲facenet輸出是一個128維度的向量,openvino轉化後預測輸出也是一個128位的數組,有了特徵向量我們只需要根據標準圖的特徵向量匹配即可;這個模型確實期望將正方形彩色圖像作爲具有形狀爲 160x160 的輸入,並將輸出一個包含 128 個元素向量的人臉嵌入,我們看下結果解析如下:

平均單張80ms在i7-8700k上,很實時有木有!

參考資料:

https://www.infoq.cn/article/4wT4mNvKlVvEQZR-JXmp

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章