機械学習メモ


基礎

データフォーマット

  • NHWC
    • TensorFlow
    • 普通の画像 (OpenCVのmatとか)
  • NCHW
    • TensorRT
    • OpenCV(cv::dnn::blobFromImageで変換)
    • ncnn(ncnn::Mat::from_pixelsで変換)
width=3,height=2,3色の場合
# NHWC
R00 G00 B00 R01 G01 B01 R02 G02 B02
R10 G10 B10 R11 G11 B11 R12 G12 B12

# NCHW
R00 R01 R02
R10 R11 R12
G00 G01 G02
G10 G11 G12
B00 B01 B02
B10 B11 B12

Google Colaboratory

アイドルタイムアウト回避

ブラウザ上で回避

ブラウザのデバッグツール->Consoleで以下を実行

function ConnectButton(){
    console.log("Connect"); 
    document.querySelector("#top-toolbar > colab-connect-button").shadowRoot.querySelector("#connect").click();
    // document.querySelector("#connect").click()
    // document.querySelector("colab-toolbar-button#connect").click()
    // document.querySelector("colab-connect-button").click()
}
setInterval(ConnectButton,60*1000);

ラズパイなどから定期的にブラウザで開くことで回避

while true
do
        timeout 60 firefox https://colab.research.google.com/drive/1sdxxxxxx
        sleep 10m
done

Googleドライブマウント、ファイルのアップロードとダウンロード

from google.colab import drive 
drive.mount("/content/drive")

from google.colab import files
files.download( "./test.h5")
uploaded = files.upload()

サンプル

TensorFlow推論、TensorFlow Lite変換と推論、TensorFlow Lite 量子化変換と推論

Keras(h5) -> tflite (tf2.5)

import tensorflow as tf

loaded_model = tf.keras.models.load_model("model.h5", custom_objects={'tf': tf})
converter = tf.lite.TFLiteConverter.from_keras_model(loaded_model)
tflite_model = converter.convert()
open("model.tflite", "wb").write(tflite_model)

custom_objects={'tf': tf} がないとname 'tf' is not defined というエラー発生

ONNX (onnx-runtimeとOpenCV(cv2.dnn)) 推論

モデル変換: TensorFlow(NHWC) to ONNX(NCHW)

モデル変換: ONNX(NCHW) to Keras(NHWC) to TensorFlow(NHWC)

モデル変換: ONNX(NCHW) to OpenVINO(NCHW) to TensorFlow(NHWC) using openvino2tensorflow ( https://github.com/PINTO0309/openvino2tensorflow )

※↑はGoogle Colabから使用していますが、Dockerを使用することが推奨されています。

モデル変換 TensorFlow Hubのモデル -> tflite

import tensorflow as tf
import tensorflow_hub as hub 
model = hub.load("https://tfhub.dev/tensorflow/efficientdet/d0/1")

concrete_func = model.signatures[tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY]
concrete_func.inputs[0].set_shape([1, 320, 320, 3])
concrete_func.outputs[0]

converter = tf.lite.TFLiteConverter.from_concrete_functions([concrete_func])
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_model = converter.convert()
open("efficientdet_d0_320x320.tflite", "wb").write(tflite_model)

interpreter = tf.lite.Interpreter("efficientdet_d0_320x320.tflite")
interpreter.allocate_tensors()
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()

↑だと一部outputのshapeが[1, 1, ...] になってしまう

PyTorch(pkl) -> onnx

Object Detection モデル再学習の環境 (as of 2020/03/27)

  • AttributeError: module 'tensorflow' has no attribute 'contrib' 対策
%tensorflow_version 1.x
import tensorflow as tf
print(tf.__version__)
!pip install pycocotools

!git clone --depth 1 https://github.com/tensorflow/models
%cd models/research/
!protoc object_detection/protos/*.proto --python_out=.
!pip install .
%cd /content

# Modify python path and check script
# %set_env PYTHONPATH=$PYTHONPATH:models/research:models/research/slim
import os
os.environ["PYTHONPATH"] = "/content/models/research:/content/models/research/slim:" + os.environ["PYTHONPATH"]
!echo $PYTHONPATH
!python models/research/object_detection/builders/model_builder_test.py

その他

int8量子化モデルへの入力

推奨は↓らしいけど、値範囲が-128~127を超える可能性があるので単に-128するだけでいいかも。

for(uint i=0; i< input->bytes;i++){
    input->data.int8[i] = input->data.uint8[i] + input->params.zero_point - 128; 
}

法律