ハードウェア技術者のスキルアップ日誌

某家電メーカーの技術者がスキルアップのために勉強したことを記録するブログです

Keras/Tensorflow - h5/hdf5からckptへの変換方法

以前、ckptからpbへの変換方法をブログに書きましたが、今回はKerasのh5/hdf5形式からckptへ変換する方法を調べましたので、ここにメモしておきます。

masaeng.hatenablog.com

 

変換方法

私の環境でうまくいったサンプルコードです。

from keras import backend as K
from keras.models import load_model
import tensorflow as tf

K.clear_session()
K.set_learning_phase(0)

model = keras.models.load_model("xxx.h5")
sess = keras.backend.get_session()

saver = tf.train.Saver()
save_path = saver.save(sess, "xxxx.ckpt")

上のリンクのckptからpbへ変換する方法と組み合わせるとh5/hdf5形式からpb形式に変換することができます。

また、こちらの手法では直接h5/hdf5からpbに変換することができます。
1回で済むのでこちらの方が手軽かもしれません。

from keras import backend as K
from keras.models import load_model
import tensorflow as tf

def freeze_session(session, keep_var_names=None, output_names=None, clear_devices=True):

    from tensorflow.python.framework.graph_util import convert_variables_to_constants
    graph = session.graph
    with graph.as_default():
        freeze_var_names = list(set(v.op.name for v in tf.global_variables()).difference(keep_var_names or []))
        output_names = output_names or []
        output_names += [v.op.name for v in tf.global_variables()]
        # Graph -> GraphDef ProtoBuf
        input_graph_def = graph.as_graph_def()
        if clear_devices:
            for node in input_graph_def.node:
                node.device = ""
        frozen_graph = convert_variables_to_constants(session, input_graph_def,
                                                    output_names, freeze_var_names)
        return frozen_graph


def main():
    model = load_model('xxx.h5')
    frozen_graph = freeze_session(K.get_session(),
                            output_names=[out.op.name for out in model.outputs])

    # Save pb file
    tf.train.write_graph(frozen_graph, "SAVE_PATH", "xxxx.pb", as_text=False)

if __name__ == '__main__':
    main()

 

参考サイト

https://stackoverflow.com/questions/52650842/how-to-convert-hdf5-to-tensorflow-checkpoint

https://www.dlology.com/blog/how-to-convert-trained-keras-model-to-tensorflow-and-make-prediction/

5Gの規格を勉強して分かった、理解する上での前提知識と誤解していたこと

仕事で5Gを扱うことになり、いろいろな文献を読み漁って5Gの規格を調査しました。これだけ話題となっている技術で、すでにサービスが開始されようとしている段階で今更感があるのですが。。。

前置き:どのようにして調査したか

初めは英語の規格書にチャレンジするも、膨大すぎてどこが自分に関係があるところかすらよくわからない。

日本語のサイトを探してもニュース記事程度の簡単なものばかりで、技術的な詳細な解説は少ない。5Gはこれまでの移動通信システム規格と異なり、キャリヤや基地局、携帯端末メーカー以外の幅広い分野での活用が期待されているため、専門家でなくても理解できるように優しく書かれている記事が多い印象です。ですが、端末を開発するのは全く不十分。

docomoがジャーナルにて技術解説を公開してくれていますが、これまでの規格を知っていることが前提で書かれています。例えば、4Gからどう変わったかという差分の説明がメインです。今まで移動通信に携わっていない本当の初心者がこの説明だけを読んで理解するのはほぼ不可能だと思います。

www.nttdocomo.co.jp

今回、以下の文献をメインに4Gの規格に遡って勉強しました。

インプレス標準教科書シリーズ 5G教科書 ―LTE/ IoTから5Gまで―

インプレス標準教科書シリーズ 5G教科書 ―LTE/ IoTから5Gまで―

 

規格の調査を通して、5Gの規格を理解する上で、ある程度の前提知識が必要だと感じました。無線端末や基地局を扱う方にとっては当然の内容ですが、前述したようなニュース記事ではあまり触れられていないことをまとめておきたいと思います。

また、5Gについてよく言われていることで、個人的に誤解していたこともいくつかありました。これらについて正しくはどうなのかを書いていきたいと思います。

 

5Gの規格を理解するための前提知識

3GPP, ITU-R

5Gの規格を調べていると3GPPITU-Rという単語がよく出てきます。ともに規格団体のようで、それぞれで5Gの規格をリリースするスケジュールになっており、関係性がわかりませんでした。

図3 3GPPリリース15と2019年末のリリース16のロードマップ 引用:https://sgforum.impress.co.jp/article/4880

Wikipediaで調べると、3GPPは移動通信システムの標準化作業を行うプロジェクト、ITU-Rは電気通信分野における国際連合の専門機関である国際電気通信連合(ITU: International Telecommunication Union)の無線通信部門とのことです。

ITU-Rは各国の代表が集まった国際機関であるのに対し、3GPPは企業が集まった団体です。移動通信の国際規格はITU-Rで決定するのですが、ITU-Rは自ら規格を作成せず、世界から案を募集しています。3GPPはこの提案書を作成する目的で結成されています。

ですのでスケジュールとしては3GPPが仕様案をリリースし、それをITU-Rが確認して仕様策定という流れとなります。正式仕様はITU-Rがリリースするものとなりますが、技術者としては3GPPの動きを注目する必要がありますね。

3GPPで検討された規格はリリース○○という形でリリースされます。リリース15以降が5Gの規格に相当します。一方、ITU-Rで策定する5G相当の規格はIMT-2020という名称です。

 参考サイト
https://sgforum.impress.co.jp/article/4880
http://www.rf-world.jp/bn/RFW37/samples/p079-080.pdf

 

3GPPのリリースと移動通信規格の世代との関係

3GPPは1,2年おきにバージョンアップした機能をリリースしています。一方で、よく耳にする"3G", "4G"という呼び方は移動通信の機能が大きく変わるタイミングで切り替わっており、3GPPの複数のリリースを指しています。具体的には以下のようになります。

f:id:masashi_k:20200321000538p:plain


③リリース15から5Gの規格を規定

②でも少し触れましたが、3GPPのリリース15から5Gの規格が規定されています。このリリース15には従来のLTE/LTE-Advancedと互換性がある高度化LTEと、これまでとは全く異なる周波数帯を用いる新たな無線技術New Radio(NR)の大きく2つの規格が含まれています。NRは従来のLTE/LTE-Advancedとは互換性がありません。

通常、"5G"と言うときに指しているのはNew Radioの技術だと思いますが、正式には高度化LTEも含めてリリース15以降で規定されている移動通信システムを5Gと呼びます。


引用:https://www.edn.com/what-is-5g-nr/

 

移動体通信システムの構成

移動体通信システムは端末と基地局が電波で接続されており、さらに交換局を通してインターネットや別の端末に接続されるという構成から成っています。

「携帯電話 基地局 インターネット」の画像検索結果引用:https://time-space.kddi.com/au-kddi/20190514/2627

今となっては当然のことですが、当時はこの構成が頭に入ってなく、この構成を意識することで文献の内容がよく理解できるようになったことがあります。

例えば、スタンドアローン(SA)方式、ノンスタンドアローン(NSA)方式。
基地局、交換局(コアネットワーク)は4G, 5G(NR)で別のものが必要となるので、早期にサービスを提供するために4Gの設備を流用して運用する方式(NSA)が取られます。


引用:https://www.soumu.go.jp/main_content/000593247.pdf

 

5Gについて誤解していたこと

①導入スケジュール

 5Gの3つの特徴は「超高速・大容量」、「低遅延」、「同時多接続」と言われていますが、5Gが導入されてからすぐにこれらすべての特徴が利用できるわけではありません。ニュース記事ではよくこれらが同列で扱われているため、誤解を招いていると思っています。

5Gの検討スケジュールは以下のように2ステップとなっています。
 フェーズ1:”超高速・大容量”を中心に2020年に実現する5Gの基本仕様の策定
 フェーズ2:2020年以降の実現を念頭に、”低遅延”、”多接続”を含む5Gのフルスペックの策定

5Gのロードマップ。2018年6月に、5Gのフェーズ1の仕様策定が完了する見込みだ(クリックで拡大) 出典:IHS Markit Technology引用:IHS Markit Technology

 

上図ではリリース16は19年12月に策定完了となっていますが、実際は3ヶ月遅れて2020年3月に完了予定です。

20年3月にdocomoが5Gのサービスをスタートするそうですが、そのサービスは「超高速・大容量」ということですね。「低遅延」、「同時多接続」が利用できるようになるのは2022年以降と言われています。これは5Gの導入当初は、先ほど述べたノンスタンドアローン方式でサービスが提供されることに起因します。5Gのフルスペックを実現するには交換局(コアネットワーク)も5G用のものにする必要があります。

 

②ローカル5G

5Gに関するニュース記事ではローカル5Gというワードもよく目にします。当初このワードを見たときに、LoRaのように自営で基地局を設置し、専用のネットワークを構築できると思ってしまいました。

しかし、ローカル5GはLoRaと異なり、基地局を立てて自営網を構築するにも無線局免許を取得する必要があります。LoRaはアンライセンスバンドを使用するため、免許不要でしたが、5Gはそうではないため、自営網だとしても免許が必要ということですね。

また、ローカル5Gの導入メリットについても、誤解していた点がありました。LoRaの場合、自拠点内に端末を多数設置する場合、端末1台ごとにサービス利用料を払うよりは自前で通信網を作る方がランニングコストがなくなるため、通信コストを削減できるというメリットがあったと思います。

しかし、ローカル5Gに関しては別のところに導入する意義があります。

5Gのスケジュールのところに記載しましたが、5Gのフルサービスが提供されるのは2022年以降となる見込みです。また、キャリアが設備を設置するのは利用者が多い都市部が最初で、人口が少ない地方は導入がさらに後になる可能性が高いです。

一方、産業界において、低遅延など5Gの特徴を生かしたい工場や建設現場などは地方にあることが多く、キャリアによる5Gのサービス導入を待つと非常に時間がかかってしまします。サービスを利用したい企業自らが自拠点に通信網を早期に構築し、5Gの特徴を生かしてビジネスを展開できる方法がローカル5Gです。

 

まとめ

5Gの規格を勉強する中で、前提知識として知っておけば理解が速いと思ったこと、勉強前に誤解をしてしまっていたことをまとめてきました。

移動体無線通信の初心者が1から規格を勉強するのはなかなかハードルが高かったですが、同様のことをされる方がこの記事によって少しでもスムーズに規格を習得できればと思います。

 

経験値ゼロのハードウェアエンジニアがAIを理解して動かすことができるようになるまで

前回の更新からだいぶ間が開いてしまいましたが、また勉強したことのアウトプットを再開していきます。

今回は今までとはちょっとテイストが変わりますが、表題の通り、AIに関して何も知らなかった私がどのようにAIを勉強して理解できるようになったかを書いていきたいと思います。これからAIやDeep Leaningを始めたいという方の参考になれば幸いです。

背景知識

まず、AIを始める前にやっていたことをご紹介します。

職業は家電メーカーのハードウェアエンジニア。主な担当は電気回路設計やデジタル信号処理。ソフトウェアは大学の時に授業でC言語を習った程度で、実務で使ったことはほとんどなし。

上司からの無茶ぶり

約2年前、突然、当時の上司から「うちの商品にAIを乗せたい。どうすれば作れるか調べて動くものを作れ」という無茶ぶりを受ける。当時開発部隊の中にAIが分かる人は誰もおらず、どこから手をつければいいかも分からない状態。

AIの勉強をとりあえず始める

①通信講座を受ける

会社の研修システムを調べたところ、e-LearningでDeep Leaningの講座が受けられることが分かり、まず手始めに受けてみることに。内容は大学の先生が機械学習からDeep learningまで基本的な内容を講義されているものでした。一方的に講義を聴くだけで演習はなし。

ついていくのに苦労したが、結果としてDeep Leaningの概論を効率的に学ぶことができた。後から考えると、この講座によって系統立ててDeep Leaningを理解でき、このような講座を会社経由で受けられたのは幸運だったと思います。

 

②画像処理を勉強

今回、AIでやりたかったことは画像認識です。しかし、当時画像処理に関してほとんど何も知らなかったので、テキストを購入して画像処理の勉強を開始。

結構ボリュームがある本ですが、同僚と一緒に毎週勉強会をして何とか完遂。Pythonで画像を扱う際、画像処理の知識が大いに役に立ちました。やってて損はないです。

ディジタル画像処理[改訂新版]

ディジタル画像処理[改訂新版]

 

 

OpenCVの講座を受講

画像処理を勉強していた時に友人にOpenCVというソフトウェアライブラリがあることを初めて知る。(恥ずかしながら知りませんでした。。。)

②で勉強したことを実際に試すのによいと思い、①の講座と同様に会社経由で外部セミナーを受講。期間は1日、演習もほとんどなく座学ばかりだったが、OpenCVでどんなことができるのか概要は理解できた。会社でいろいろOpenCVを試したいと受講後は思ったが、結局この時はやらずじまい。

面倒な環境構築をセミナー内で済ますことができたのはよかったです。

 

演習ができる環境を探す

④「ゼロから作るDeep Leaning」を読む

 通信講座で何となくDeep Leaningがどういうものかはわかったのですが、どうやって作ったらいいか見当もつかないという状態。通信講座には演習がないのが原因だと思い、自分で手を動かせるものを求めてこちらの本をやってみました。

いろんなところで紹介されていますが、はっきり言って名著です。

学習、推論それぞれで具体的にどのような計算をしているか数学的な計算とPythonでの実装が記されていて、講座で学んだことの理解がさらに深まりました。

一方、演習を求めて始めたという点では物足りない内容。ネットから本に書かれているソースコードをダウンロードでき、自分のPCで動かすことが可能。しかし、与えられたものをPythonで実行するだけという感じで、やり終えても自分で作れる感じは全くなし。

また、この本で初めてPythonを使う。Pythonに関しては必要なところだけ説明されているだけなので、読後感は「Python何となくわかった気がする」という感じ。(実際は全くわかってない!)

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

  • 作者:斎藤 康毅
  • 発売日: 2016/09/24
  • メディア: 単行本(ソフトカバー)
 

 

Aidemyの講座を受ける

このあたりからブログを始めて勉強した内容をアップすることにしたので詳細は記事を見ていただければと思います。

広告で見かけたAidemyというAIの学習サービスの「コードを書きながら学べる」という所に惹かれて、手始めに無料講座を受けてみる。

aidemy.net

動画で学んだことを使ってコードを入力するという形式だったが、問題が穴埋めだったり、形式的なもので、やはり自分でできる気はせず。すぐに次を探し始める。

 

⑥からあげさんのnoteを購入

いろいろ調べた結果、からあげさんのこちらのnoteに行きつきました。
自分で画像を集めて学習し、その結果を評価するという一連の流れの手法を知ることができるということで、思い切って購入しました。価格は500円。

note.com

このチュートリアルをなぞることで実際のAIモデル開発でどのようなことをするかイメージできるようになりました。また、このチュートリアルを応用して、自分の「カメラ」を認識するモデルを作ってみたりしました。

Githubで公開されているモデルを動かす

YOLO, SSDなど有名なDeep learningのモデルを動かしてみた

もう少し自分でコードをいじるために、Githubで公開されているものを動かしてみることに。有名どころのモデルはすでに日本語のマニュアルを作ってくださっている方がいるので、とっつきやすいです。それに従って画像の推論をやってみました。

マニュアル通りにやるだけでは面白くないので、こうしたらどうなるだろう?ということがいろいろ浮かんでくる。しかし、Pythonのコードがスムーズに読めない。「ゼロから作るDeep Leaning」の範囲内の知識では太刀打ちできないことを知る。

 

Pythonを体系立てて勉強

「みんなのPython」を購入して1冊通して勉強しました。

読み終えたころにはオブジェクト指向が何となくわかり、Githubのコードも読めるように!また、Pythonに関して困ったことがあってもネットで調べれば自力で大体解決できるようになった。

みんなのPython 第4版

みんなのPython 第4版

  • 作者:柴田 淳
  • 発売日: 2016/12/22
  • メディア: 単行本
 

 

Githubのモデルを動かす

⑦で行き詰ったことに再度チャレンジ。いろんなモデルに対して、USBカメラで取得した映像をモデルに入力してリアルタイムに推論するコードを自作しました。

画像の前処理、後処理にOpenCVを使うことが多く、うまくいかない時に試行錯誤することでOpenCVのことも大体使えるように。

からあげさんのnoteで動かしたフレームワークがTensorflow/Kerasだったので、Tensorflow/Kerasのモデルを探して、異なるモデルで同じことを繰り返しました。これにより、フレームワークの基本の型のようなものも習得できた。

全て公開されている学習済みモデルを使っているので、学習プロセスは経験できないものの、Deep Leaningの推論に関してはある程度の経験値を得られたと思います。

 

習得したものを社内で共有

平行して進めたことも含めて、ここまで約一年でDeep Leaningの理論を習得して、実際に動かすことができるようになりました。習得したものをまとめて、社内の関係者に勉強会という形で発表しました。人に説明するには、あいまいなところがあっていはいけないので、文献を読み直すなどして知識を整理することが必要になります。この発表により、さらに自分の理解を深めることができました。

結局、人に教えることが一番自分の勉強になります。

 

まとめ

上司に無茶ぶりをされたことをきっかけに、Deep Leaningを習得するために取り組んできたことを書いてきました。今から約2年前のことですが、振り返ってみると約1年間でかなりのスキルアップができたのだと感じます。

改めてポイントだったと感じることは
・学問的知識、理論を知っておくことは重要
 いきなり演習にチャレンジするよりまず理論を勉強するほうが近道
・実際にコードを触って動かすことが一番理解が深まる
・社内に教えてもらえる人がいなかったので、知り合いのつてを辿ったり、有料研修を利用
・理解したことを説明できればさらに定着する

 

私もDeep Leaningの技術者としてはまだまだで、できることは非常に限定的です。今も仕事やプライベートで勉強を重ねている身ですが、この記事がこれからDeep Leaningの勉強を始める方の一助となれば幸いです。

struct2depth(距離推定)を動かしてみた

久しぶりにGITHUBで公開されているDeep Learningのネットワークを動かしてみました。今回はtensorflowのソース内にあるstruct2depthです。慣れていればどうってことないのでしょうか、初見でつまずいてしまったので、手順を記録しておきます。

struct2depthとは?

Google Brainが開発した、単眼カメラから深度とエゴモーション(カメラ自身の動き)を推定する手法です。取得するのが難しい、距離の正解情報を必要とせずに距離推定器を学習させることができるのが特徴です。

プロジェクトサイト

https://sites.google.com/view/struct2depth

動作環境

 ● OS : Windows 10 Home (64bit)

 ● Python 3.5

 ● Anaconda 4.2.0

 ● Tensorflow 1.12.0

手順

GITHUBからレポジトリをクローンする

https://github.com/tensorflow/models
struct2depthはツリーの中のresearch/struct2depthにあります。

②struct2depthフォルダ内にinput, output, modelというフォルダを作る

f:id:masashi_k:20190925230058p:plain

③学習済みモデル(ckptファイル)をダウンロードし、modelフォルダに格納する

KITTIで学習したモデル
Cityscapesで学習したモデル

※KITTI, Cityscapesは車載カメラで撮影した画像と距離情報を含むデータセット

④推論したい画像をinputフォルダに格納する

試しにKITTIの画像データの一部を使って推論を行います。
KITTIのデータセットこちらからダウンロードできます。
今回は2011_09_26_drive_0002 を使います。
Image_03の中の画像をinputフォルダにコピーします。

f:id:masashi_k:20190925231114p:plain

⑤util.pyを修正する

このまま推論を実行すると私の環境では画像ファイルの読み込みで以下のエラーが発生しました。

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x89 in position 0: invalid start byte


以下のようにutil.pyを修正します。

def load_image(img_file, resize=None, interpolation='linear'):
  """Load image from disk. Output value range: [0,1]."""
  #im_data = np.fromstring(gfile.Open(img_file).read(), np.uint8)  #コメントアウト
  #im = cv2.imdecode(im_data, cv2.IMREAD_COLOR) #コメントアウト
  im = cv2.imread(img_file)  #追加
  im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
  if resize and resize != im.shape[:2]:
  ip = cv2.INTER_LINEAR if interpolation == 'linear' else cv2.INTER_NEAREST
  im = cv2.resize(im, resize, interpolation=ip)
  return np.array(im, dtype=np.float32) / 255.0


⑥Anacondaを起動


⑦以下のコマンドで推論を実行

python inference.py --logtostderr --file_extension png --depth --egomotion true --input_dir input --output_dir output --model_ckpt model/KITTI/model-199160

outputフォルダに推論結果(距離画像とegomotion)が出力されます。

以下は結果の一例です。
右側の自転車に乗っている人と電柱が正しく推定できていることがわかります。

f:id:masashi_k:20190925233210p:plain


カメラ入力での推論

ここまではGITHUBの情報とほぼ同じですが、USBカメラで撮影した画像を入力してリアルタイムで距離推定を行ってみました。

inference.pyの中の関数_run_inferenceを以下のように修正し、inference_webcam.pyという新しいpythonスクリプトを作ります。

import cv2  #追加

##############
# 中略
##############

  with sv.managed_session() as sess:
    saver.restore(sess, model_ckpt)
    if not gfile.Exists(output_dir):
      gfile.MakeDirs(output_dir)
    logging.info('Predictions will be saved in %s.', output_dir)

    #input camera image
    video_capture = cv2.VideoCapture(0)
    fourcc = cv2.VideoWriter_fourcc(*'MP4V')
    out = cv2.VideoWriter(output_dir + '/' + 'webcam.mp4', fourcc, 25.0, (416, 128))


    # Run depth prediction network.
    while True:
      if depth:
        im_batch = []

        ret, im = video_capture.read()
        im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
    #VGAの画像を切り出して416x128に合わせる
        ymin, ymax, xmin, xmax = [142, 339, 0, 640]
        im = im[ymin:ymax, xmin:xmax]
        im = cv2.resize(im, (416,128))
        im = np.array(im, dtype=np.float32) / 255.0

        im_batch.append(im)

        #im_batch.append(np.zeros(shape=(img_height, img_width, 3), dtype=np.float32))
        im_batch = np.stack(im_batch, axis=0)
        est_depth = inference_model.inference_depth(im_batch, sess)

        if flip_for_depth:
          est_depth = np.flip(est_depth, axis=2)
          im_batch = np.flip(im_batch, axis=2)

        color_map = util.normalize_depth_for_display(np.squeeze(est_depth))
        color_map = (color_map * 255.0).astype(np.uint8)
        color_map = cv2.cvtColor(color_map, cv2.COLOR_RGB2BGR)

        out.write(color_map)
        cv2.imshow('video', color_map)
        im_batch = []

      if cv2.waitKey(1) & 0xFF == ord('q'):
        break
    video_capture.release()
    out.release()
  cv2.destroyAllwindows()

ソースコードの中で入力画像の加工を行っています。
ネットワークの入力解像度が416x128なので、カメラで撮影したVGAの画像をクリップ、リサイズして416x128の画像を作成しています。

以下のコマンドで推論を実行します。

python inference_webcam.py --logtostderr --file_extension png --depth --egomotion false --output_dir output --model_ckpt model/KITTI/model-199160


以下の画像はノートPCについているカメラで撮った映像を入力したときの結果です。

f:id:masashi_k:20190925235756p:plain

赤で囲ったところに手をかざしているのですが、何なのかよくわからない結果となっています。また、右側の黄色っぽところは何もないのですが、この部分は距離が近いと推定されています。
車載カメラで撮影した映像とノートPCについているカメラで撮った画像では違いが大きすぎて、学習結果をそのまま使うには無理があるのでしょう。用途に合わせた再学習が必要ということですね。

まとめ

Googleが開発したstruct2depthというネットワークの動かし方とUSBカメラで撮った映像で推論する方法をまとめてみました。何かのお役に立てればと思います。

参考サイト

[DL輪読会]Depth Prediction Without the Sensors: Leveraging Structure for…

【読書記録】ー 転職と副業のかけ算

今回はmotoさんの「転職と副業のかけ算」という本を読んだので、学んだことを書いていきたいと思います。

転職と副業のかけ算 生涯年収を最大化する生き方

転職と副業のかけ算 生涯年収を最大化する生き方

 

著者のmotoさんのことはtwitterで知りました。
この本が発売された直後、多くの推薦ツイートが挙げられていました。
本書は自分の最近の活動のテーマである、「会社に縛られず生きていける力をつける」ということと共通する内容であり、その成功例として研鑽の仕方、キャリアの作り方を学ばせていただきたいと思います。

 

これからの社会を生き抜くには

終身雇用、年功序列といった昭和、平成の雇用制度はこれからは期待できません。
会社の言いなりになり、言われた仕事をこなすだけの人間はいつリストラされてもおかしくありません。

これからの時代、安定的に暮らしていくには個人で稼ぐ力を身に付けていくことが必要です。会社に依存せず、いざとなったら転職できる、副業で収入を得るといった状態にしておくことが理想的でしょう。

自分の市場価値を伸ばす

いつでも転職できる状態にしておくためには、自分の市場価値を高め、企業から欲しい人材になっておくことが必要です。それは必ずしも会社内での評価とは一致しません。
あくまで転職市場での市場価値です。

市場価値が高い人とは、どんな環境であれ、組織を成長されられる人。会社に利益をもたらす人だと思います。そのような人になるために、スキルアップを図っていく必要があります。

私は結果が出ないことを周りの人や環境のせいにしてしまうところがあるのですが、市場価値の高い人はそのようなことに言い訳をしないはずです。この本を読んで考えを改めるべきと反省しました。

本業で実績を出す

スキルアップというと、社外のセミナーなどを受講するといったイメージがあるかもしれませんが、motoさんはあくまで本業で実績を出すことが大前提と言われています。

自分がやったことのない仕事は自分を成長させるチャンスです。このような機会を見逃さず、積極的に取りに行き、苦しい中でも仕事に全力を尽くすことで力がついていきます。

できるかどうかわからないことでもまずやってみる。たとえ失敗して会社の評価が下がっても、経験値を得ることが市場での評価が高まります。多くの場合、会社側もチャレンジを認めてくれるでしょうから、デメリットはそれほど多くありません。
まず手を挙げる!

そして、そのような新しい仕事を振ってもらえるようにするためには、自分がやりたいこと、実現したい姿を周りに発信することが重要。そうすれば上司も希望を叶えようとしてくれるでしょうし、自分も公言したことに対して必死になるはずです。結果として、成長が加速していきます。

 

自分株式会社

本書の中で一番印象的だったワードが「自分株式会社」というものです。
自分自身を会社に見立て、自分という会社を経営する。そのような考えに立つと、会社の利益を上げるためにはどうすべきかが見えてきます。

本業の収入UP、副業、、、どのような価値を提供すれば収入UPにつながるか。
このような意識の有り無しで、仕事の質も変わってくるように思います。

副業のノウハウ

副業は物販や投資などいろいろなやり方がありますが、motoさんが勧めるのはブログや動画などのコンテンツ配信です。本業で得た知見や人の役に立つ情報をブログで発信することで収入にします。もちろん、所属する会社の機密情報を漏らすことがないように。

ブログへの誘導はtwitterが有効です。ただ、やみくもにブログの記事のリンクを貼ってつぶやくのではなく、twitter上で自分はどういうことができる人なのか、というブランドを築いていくことが必要だそうです。motoさんの場合は「転職に詳しい人」。
自分のブランドは、自分はどういう方向にスキルを磨くのかということに大きく関わるので、自己分析をしっかりやって、やりたいことを明確にしておくことが重要です。

ブランディングのためには「自分が誰よりも詳しい情報を他の人が役立つ形で発信すること」が大切。そして、自分の意見に共感してくれるフォロワーが必要。motoさんは同じ意見の他人のツイートに対し、引用リツイートすることでフォロワーを増やされたそうです。このような戦略的なSNS活用方法は非常に参考になります。

まとめ

motoさんの「転職と副業のかけ算」という本で学んだことをまとめてきました。

自分が目指す姿を実現されているmotoさんのノウハウを知ることができ、非常に有益な内容でした。特に、本業で実績を出すための心構えはmotoさんほどではないにしろ、意識していたことであったため、今までやってきたことが正しかったと再認識できました。

このブログもマネタイズできるところまで行ければいいですが、まずは勉強したことのアウトプットの場として、記事数を増やすことを優先にしていきます。ただ、独りよがりの内容ではなく、人の役に立つ情報をお伝えできるようにこれからコンテンツを検討していこうと思っています。

私は現在転職を考えてはいないので、本業の取り組み方、副業のやり方について学ぶことが多かったですが、本書には転職ノウハウもふんだんに書かれています。転職を考えておられる方にもおすすめの本です。

転職と副業のかけ算 生涯年収を最大化する生き方

転職と副業のかけ算 生涯年収を最大化する生き方

 

  

【読書記録】ー 考具

技術者という仕事をやっていてもアイデアを求められることは常日頃あります。
そのような周りからの期待に応えたい気持ちは山々なのですが、中々いいアイデアを出せず、悔しさを感じていました。
そんな中、書店で「考具」という本を見つけたので、アイデア出しのヒントになればと思い読んでみました。

考具 ―考えるための道具、持っていますか?

考具 ―考えるための道具、持っていますか?

 

 文体が著者が語りかけてくれているような感じで非常に読みやすく、且つ、今までの自分の考えと違う気づきが多く得られました。

今回は本書を読んで学んだ、アイデアの出し方、企画の作り方をまとめていきます。

 

イデア出しにあたっての考え方、心構え

イデアを出せる人とそうでない人の違いは「意識」をしているか

普段の生活でアイデアのヒントを探しているか。
ぼーっと生きているだけではアイデアは生まれない。

イデアはまず自分がどうしたいか、欲求から生まれる

「わがまま」⇒「思いやり」
周りの意見や状況から考え始めてもありきたりなものしか生まれない。

イデアは既存の要素の組み合わせでしかない

自分が考えているその領域にとって新しければよい。
どこか別の業界のやり方を持ってきてもOK。

とにかく量を出すことが大事

大したことないと思うことでも頭の中に留めずに紙に書く。

 

イデアを生み出すための4ステップ

1.アイデアのネタ素を貯める

2.目の前の課題についての情報を仕入れる

3.貯め込んだネタ素の中から使えそうなアイデアを引っ張り出す

4.ネタ素と課題について集めた情報を組み合わせて新しいアイデアを生み出す

この方法を使い、できるだけたくさんのアイデアを出す。
少なくとも30案は必要。
絞るのは後で出来るので、この段階ではアイデアを広げる。

 

イデアを企画に落とし込む方法

イデアの組み合わせ、パーツの交換などを行い、使えそうなものに絞る

企画の全てが新しいアイデアでなくてもOK。
肝の部分が新しければ、その他の部分は従来の手法を使うこともある。

絞ったアイデアを実行可能なところまで具体化していく

実現可能なアイデアが企画。
関係先との調整など、詳細を詰めるところまでやって初めて提案できるものになる。

 

情報インプットの考具

f:id:masashi_k:20190907225045p:plain

①カラーバス

何か(色、形状、位置、音など)を意識して生活すると、意識したことが引っかかって普段はスルーしていた情報が自分の中に入ってくる。頭の中でその気づきを意識するだけで十分。いつかのアイデア出しの時に組み合わせの素になる。

②聞き耳

電車、ファミレス、喫茶店、居酒屋などで周りの人の会話に聞き耳を立てる。話の話題やその人の様子から顧客の生活を想像する。(どんなことに興味があるのか、どんなことに困っているのかなど)

③お客様の立場に立って演じる

頭の中でお客様のことを想像するだけでなく、実際にお客様の立場に立って同じことをやってみる。例えば、商品を使う、サービスを受ける、子供向けのものを考えるのであれば、目線を下げるなど。実際にやってみないとわからない気づきがある。

④現場に行く

お題となる現場に行き、できるだけ詳しく取材する。話を聞きだすコツは相手を褒めながら聞くこと。

⑤気になったら何でもメモ

気になったことを書き留める。手を動かすという行為でいざというときに思い出す。できるだけビジュアルでメモを書くとよい。

 

イデア展開のための考具

f:id:masashi_k:20190907230724p:plain

ポストイット

1枚1ネタを書き、大きな紙に貼っていく。思いついたものをそのまま書く。ネタ同士の組み合わせから別のアイデアが出てくる。

②マンダラート

テーマを9マスの真ん中に書き、アイデアを周りに入れていく。8個マスがあるため、強制力が働く。すべてのマスが埋まったらそれぞれのアイデアをマスの中心にし、さらにアイデアを広げていく。マスはすべて埋める必要はなく、膨らみそうなアイデアがあればそれを広げていけばOK。

マインドマップ

テーマを真ん中に書き、思いついたアイデアや要素を放射状に書く。マンダラート同様、各アイデアからさらにアイデアを広げていく。結びつく言葉を線でつなぎ、組み合わせでアイデアを作っていく。アイデアのヒントとなる言葉が一枚の紙の上にひしめき合って並ぶ形になる。

④連想ゲーム

お題から「~といえば」という問いかけでどんどん言葉を広げていく。頭の中の記憶を呼び起こし、それが今の課題と合わさって新しいアイデアが出る。

⑤オズボーンのチェックリスト

転用・応用・変更・拡大・縮小・代用・置換・逆転・結合
イデアを生み出すための要素の組み合わせ方の基本パターン9つ。一つの事象をいろんな角度から見ることでアイデアが生まれる可能性を何倍にも広げることができる。

全てにおいて共通していることは、テーマをいろんな切り口で深堀し、組み合わせの要素を抽出すること、そして要素同士の組み合わせで新しいアイデアを作っていくこと。型にこだわりすぎず、アイデアが膨らむところがあれば、そこを突き詰める。

 

企画へ落とし込むための考具

5W1H

いけそうなアイデアをお題の条件(5W1H)に当てはめる。先に条件から考えないこと。あくまでアイデアができてそのあとで5W1Hを考える。最初から条件を満たすことはないので折り合いをつけていく。

②タイトル

企画に必ずタイトルをつけること。初めて聞く人に概要をわかってもらうためのもの。言葉を具体的にすることで伝わる情報が増える。

③絵で表現

プレゼンをするときはできるだけ自分のイメージを絵にして伝える。絵で表現できる=企画の詳細なイメージを自分の中で詰められているということ。詳細まで丁寧に絵で表現する。

 

感想

 タイトルの通り、アイデアの素となる情報のインプット、アイデア出し、企画の作り方までたくさんの「考具」が紹介されています。ポストイットなどはよく使っていましたが、今まで知らなかったものもあり、特にマンダラートはこれから試してみたいと思っています。

本書を読んで感じたのは、企画を生み出すためには日ごろから課題意識をもって世の中を見ることが必要だということです。そうすれば、生活の中で得られる情報も変わってくるし、自ずと新しい要素同士の組み合わせも生まれるのではと思います。

そのような意識を持った状態で考具を使って考える時間を作れば、さらにいいアイデアを生み出すことができるでしょう。斬新なアイデアを出せる人を目指して、考具を活用していきたいです。

 

ラズパイでUART通信を行う

前回、ラズパイでハードウェアを制御する方法の勉強をスタートしました。

masaeng.hatenablog.com

少し間が開いてしまいましたが、第二回目はUART通信です。
UARTはマイコンデバッグ用通信やデバイス間通信などによく使われていますね。ラズパイでUARTを使う方法を調べましたので、必要な時にすぐ使えるように整理しておきたいと思います。

UARTとは?

UARTはUniversal Asynchronous Receiver Transmitterの略で、非同期方式による通信です。UARTの信号線は送信用のTXDと受信用のRXDの2本です。

規格の詳細は割愛しますが、こちらのサイトに詳しく書かれています。

tri-s.world.coocan.jp

 

ラズパイとデバイスの接続

ラズパイでUARTを使用するにはデバイスと以下のように1対1で接続します。
ラズパイのUART端子は設定を変えることでGPIO14をTXDに, GPIO15をRXDに割り当てることができます。

   f:id:masashi_k:20190825225842p:plain

同じUARTに複数のデバイスを接続することはできませんので注意。

 

UARTを使うための設定

Rasbianのデフォルト設定ではラズパイでUARTを使うことはできません。
以下の2つの設定が必要となります。

①シリアルコンソールの設定

プログラムで使用するUARTは/dev/serial0ですが、デフォルトではOSの
シリアルコンソールが/dev/serial0を使用するようになっています。
(USBシリアル変換ケーブル経由でGPIO14,15とPCをつなぐことで
PCのターミナルソフトからラズパイにアクセスできる)

シリアルコンソールが/dev/serial0に接続しないように/boot/cmdline.txtに記載されている”console=serial0,115200”を削除する必要があります。 

f:id:masashi_k:20190825233940p:plain

②UARTの有効化

ラズパイに搭載されているSoC BCM2835は高機能なPL011 UARTと機能が限定されたmini UARTの2種類を搭載しています。デフォルトはPL011 UARTだけが有効でBluetoothモジュールに割り当てられているのでプログラムがUARTを使用することはできません。
/boot/config.txtに"enable_uart=1"を追記するとMini UARTがGPIO14,15に
マッピングされます。(図の(2))
さらに"enable_uart=1"の代わりに"dtoverlay=pi3-miniuart-bt", "core_freq=250"を追記するとPL011 UARTがGPIO14,15にマッピングされ、高機能なUART機能を使用可能になります。この時BluetoothモジュールはMiniUARTに接続されます。(図の(3))

f:id:masashi_k:20190825232040p:plain

 

UARTで通信を行うプログラム

ラズパイのpythonでUART通信を行うにはpySerialライブラリを使用します。Raspbian標準搭載されています。以下にサンプルコードを示します。

import serial
import binascii
ser = serial.Serial('/dev/serial0', 115200, timeout = 0.5)  #UART初期化

#コマンド送信
ser.write(b'\x22\x00\x00\x22') #4バイトのByte型でデータを送信
ser.write("hello")

#コマンドの結果を受信(4byte)
data = ser.read(4)
#コマンドの結果を受信
data = ser.readline()  #区切り文字0x0Aまでのデータを受信

#binデータで読み出されるので結果をhexに変換
data=binascii.b2a_hex(data)

ser.close() # ポートのクローズ

 

まとめ

ラズパイでデバイスとのUART通信を行う方法を記載しました。UARTのみをインターフェスにもつセンサーを使いたい場合は、この方法でセンサーデータを取得できると思います。今手元にデバイスがなく、実際に動作確認はできていませんが、機会があれば、動作結果を追記します。

 

参考サイト

qiita.com