dondakeshimoの丸太

データサイエンス/Webアプリケーション/

JavaScriptに入門し始めたからまとめていくわ[part2]

went-went-takkun135.hatenablog.com

上記の続きです!

基本仕様後半戦!

ここからが難しいところなのでしょうね。 気合をいれて臨みたいと思います。 まじで早くNode.jsまでたどり着きたい!

変数とオブジェクト

代入

  • 基本型のリテラルは値を代入
  • それ以外のオブジェクトは参照を代入

だけとりあえず覚えておけば良さそう! バイト先でオブジェクトの値コピー方法を何回もググってる気がするけど、 未だにどれが正解かわかっていない。

オブジェクト

めちゃくちゃ長くて、 ちょっと難しすぎたから割と読み飛ばしてしまった。 おそらく著者が言いたかったことのエッセンスは

  • 基本型以外のものは全てオブジェクト
  • オブジェクトそれ自体には名前がなく、 名前がある変数などに参照を代入することで固有の名前を得る
  • オブジェクトは内部にプロパティを持ち、 アクセスはドットかブラケット
  • 連想配列としての使い方もある
  • this参照には注意が必要
  • 実質のクラスとしても使用可能
  • クラスの継承みたいなのはプロトタイプ継承というものによって行われる
  • 型判定やプロパティの列挙は汎用性が高すぎるせいで多少面倒

大変だった5章

この章めちゃくちゃ長くて力入れてるのがひしひしと伝わってきたものの、 めちゃくちゃ意味不でめちゃくちゃ眠かった(2,3回じゃないほどの寝落ち)。 しかし頑張っていきたいと思います。。

関数とクロージャ

スコープ

クロージャ

言葉遣いは難解だったけど、 過去最高にわかりやすかった気がする。

function() {
  var cnt = 0;
  return function() { return ++cnt; }
}

var fn = f();
fn();  // 1
fn();  // 2
fn();  // 3

上記コードのように関数呼び出し時に関数を返すようにすると、 関数呼び出し時に生成されるCallオブジェクトなるものが 消去できなくなるため、ずっと同様のCallオブジェクトで この関数オブジェクトが呼び出されることとなり、 関数内の情報が保存されるという仕組みらしい。

モジュールがない

モジュールっぽい概念が言語仕様上はないらしいです。 一つのプロジェクトのグローバル変数が共有されるので、 大事故につながる恐れがあります。 そのため、一つのファイルをクラスのように括ってしまうなどの 対策が迫られるらしいのですが、それでもprivateな変数は作れません。 そこでクロージャ!みたいな感じの話でした。

データ処理

についての記載があった。 配列に関してはものすごく詳しく書かれていたが、 実用上はそれほど細かい知識は必要なさそうなので割と目を通した程度。
JSONはeval関数を使わないこと。
Date関数はクライアントサイドで使うと面倒なことと、 実行環境に依存すること。
正規表現リテラル表現が存在し、

var reg = /^\s+/;  // 先頭文字が空白
var reg = new RegExp('^\\s+');

のように記述する。他にもStringオブジェクト側から、 引数に正規表現を用いる技法も存在するが、 ここの難点は主に正規表現そのものなので、 JavaScript側で難しいことはそれほどないと思う。

まとめ

これでJavaScript基本仕様については終了! らしいがこれで実際にコードちゃんと読めるかは微妙なラインな気がする。 理由としては、 コード規約自体は簡単なのに、変なイディオムとか メソッドチェーンとかコールバック関数とか見慣れない使い方が多い みたいな感じやと思う。

つまり、結論

慣れが大事。

次回からはクライアントサイドの説明をしてくれるそうです!

JavaScriptに入門し始めたからまとめていくわ[part1]

JavaScript始めました

本当はインターンでずっと使ってたんですけど、 一切体系的に学んでおらず、 なぁなぁでコーディングをそろそろ脱却せねばと一念発起いたしました。

上司の方にこの本とかがいいんじゃない?と言われ、 即購入、その間30秒。 失敗したのは当日暇だったので 普通に大学で買えば当日から始められたのにということですね!
もう一つ失敗を付け加えると、この本は めっちゃJava学んでる前提で話進めてくる んですけど、筆者はまったくJavaに触ったことないことくらいですね!
ということで、今読んでる最中なのですが、 入門書に関しては読んだ後にレビューではなくて、 要点を読みながら書いた方が絶対いい気がするので、 章が終わるたびに書き足して行っています!

JavaScriptの概要

ブラウザ戦争とかいうものがあって、 ブラウザの独自拡張が繰り返された時代があったそうな、 JavaScriptもその戦争のせいか、 はたまた醜い人間たちの性か、 独自拡張性が高い言語になってしまったそうな。 これでは非常に使いづらいということで、ECMAScriptなる規格が発足。 現状では、JavaScriptが新しい機能を備えたバージョンを開発していき、 それに対してECMAScriptが順次それを規格化していくという流れだったような。 とりあえずは規格化されたECMAScriptを使っていれば安心ってことなのだな?

JavaScriptの基本仕様

JavaScriptの型について

JavaScriptの基本型

上記の5つが基本型となり、その他を全てオブジェクト型という。

基本型のオブジェクト型

適切な表現が思いつかなかったので意味不明な題名。 上記5つの基本型に対応するオブジェクト型、クラスが存在する。 しかし、暗黙の型変換(基本型 <=> オブジェクト型) によってその存在は認識していなくても 実質問題ないっぽい。 ので、頭の片隅にしまいながら、 基本的には忘れていて大丈夫っぽいというか、 積極的に忘れて暗黙の型変換を使っていくのがベストプラクティスなのだとか。

型変換(数値型 <=> 文字列型)のイディオム

クライアントにjsファイルをぶん投げる際、 なるだけ短い文章で書いた方が通信量が抑えられて良いということから、 暗黙の型変換を使った最短表記がしばしば用いられるそうな。 可読性は低そうだけどよく使うなら慣れておかねばだ。

// 数値から文字列
var n = 3;
n+'';

// 文字列から数値
var s = '3';
+s;

JavaScriptの式と文

式式文文式文文 む〜ら〜さ〜ぁき
どこかの歌手が頭から離れない章名。

呪文でしょうか、いいえ誰でも。。?

文の種類

基本的に文は;で区切られた一区画を指す。その種類として

  • ブロック文(複合文)({}で囲まれたもの)
  • 変数宣言文
  • 関数宣言文
  • 式文
  • 空文
  • 制御文
    • if-else文
    • switch-case文
  • 繰り返し文
    • while文
    • do-while文
    • for文
    • for in文
    • for each in文(JavaScript独自拡張)
  • break文
  • continue文
  • return文
  • 例外(throw)

基本的に意味不明で特殊なものはないかな? (for inとfor each inはなんか注意点いっぱいで使うの怖い)

式の種類

文と同じようにまずは列挙して同値演算子だけあとで取り上げます。 式はオペランド演算子に分けられるらしく、 その式を特徴付けるのは演算子なので実質演算子列挙になります!

同値演算子

JavaScriptの同値演算子のやばいポイントは、

  • ==

と、二種類の演算子があることに尽きる。
==だと暗黙の型変換込みでの同値演算子
===だと型も含めて同値であるかの判定を行うらしいぞ!

機械学習の勉強を真面目に始めましたわ[part2]

went-went-takkun135.hatenablog.com

続き行きます!主にCNNの話と用語解説になると思います!!

畳み込みニューラルネットワーク(CNN)

主に画像に用いられるニューラルネットワーク。 昔のモデル(ここまで考えてきたモデル)では、 Affineレイヤで前層の出力を全結合していたが、 その部分をConvolutionレイヤで置き換え、 必要に応じて、活性化関数適用後の出力にPoolingレイヤを挟むことで Affineレイヤの形状無視と言う欠点を補う。

Convolutionレイヤ

形状を考えるために、入力データに対して、 フィルター(カーネル) を用いた結合を行う。 フィルターは入力データと同じチャンネル数で、任意のサイズを持つ。 フィルターのサイズと、 入力データに対する パティング 、フィルターの ストライド によって 出力データのサイズが決定する。 一つのフィルターに対して、出力データのチャンネル数は常に1つのため、 複数のフィルターを用意して、出力データのチャンネル数を調整する。

Poolingレイヤ

サイズを小さくするための演算。 ある範囲の最も大きな値のみ抽出していくMaxPoolingが画像処理の分野では主流である。 Poolingレイヤの特徴は以下の3つに代表される。

  • 学習するパラメータがない
  • チャンネル数は変化しない
  • 微小な位置変化に対してロバスト

CNNの特徴?

フィルターが前半の層では低次元のエッジなどを抽出していくのに対し、 後半のフィルターは高次元の犬の顔などを抽出し始めるらしい。 これは層を多くすることによって、出力までの下準備をそれまでのレイヤで 丹念にできることに起因するとかしないとか。

代表的なCNN

LeNet

1998年初めてのCNN?基本的な構造は今使われているものと同じだが、 PoolingレイヤでMaxPoolingを行なっているわけではないらしいのと、 活性化関数がSigmoid関数らしい。

AlexNet

2012年に彗星のごとくコンペティションに現れ、 圧倒的な成績でトロフィーと話題をさらっていったAlexNetさんです。 機械学習ブームの火付け役をしてくれたらしいですね。LeNetと比べると

  • 活性化関数にReLU関数を用いる
  • LRNと言う局所的正規化を行う関数を挟む
  • Dropoutを使用する

松尾教授の書籍を読んだ時、うろ覚えですが、確かこのDropoutが 革新的だったといっていたような気がします。うろ覚えなので突っ込まないでください。

ディープラーニング

層を厚くすると言うこと

  • 表現力の増加
  • 表現するために必要な学習パラメタの減少
  • 学習時間は増加

こんな感じのメリットデメリットがあるらしい。 表現力の増加とあるが、実際、MNISTの認識では2層くらいのモデルが 最も高精度らしく、表現力がどの程度必要なのかも考えなければならない。 ちなみに2015年のクラス分類コンペティションの優勝モデルは 150層とか言う馬鹿げたレベルのディープさだったそうな。

有名なネットワーク

VGG

CNNの基本型らしい。3x3の小さなフィルターでなんども畳み込むそうな。

GoogleLeNet

基本的に層をディープにするといったら、伝播方向っぽいんだけど、 Googleさんは横方向にも伸ばしてしまったそうな。 インセプション構造 と呼ぶらしく、複数のサイズのフィルターで たたみ込んでその結果を結合するそうな。

ResNet

GoogleがきてMSが来ないわけがない。 これがさっき言ったアホみたいに層を深くした150層ネットワーク。 レイヤを通した出力とレイヤを通す前の入力の合計をその層の出力とする スキップ構造と呼ばれるものを用いることで、 勾配消失問題を克服して、層をものごっつ厚くできたそうな。

転移学習

すでに学習済みのパラメタをそのまま初期値として用いて、 次の学習を行う手法のこと。少ないデータセットしか手元にない時とかいいらしい。

最近ディープラーニングで行われていること

  • 物体検出(物体認識の適用範囲検索と物体認識の結合)
  • セグメンテーション(ピクセルレベルでのクラス分類)
  • 画像キャプション生成(CNNとRNNの結合)
  • 画像スタイル変換(中間出力とのloss)
  • 画像生成(DCGAN)

強化学習

エージェント(computer)が環境から得られる報酬を 最大化するように動いていくのかな? ゲームとかでやってるらしい。 パックマンをコンピューターにやらせたらもう人は勝てないらしい。 とりあえず強化学習にはまた独自のアルゴリズムがあるっぽくて(Q学習?) それとCNNを融合させることでDeep Q-Networkとか言うすごい奴が生まれたらしい。

まとめ

特殊な用語がたくさん出てきたので、 とりあえずこの分野に入るときには一回真面目に入門書を読むべきと感じました。

機械学習の勉強を真面目に始めましたわ[part1]

機械学習の勉強を真面目にはじめました!

今回しっかりと基礎から見直そうと思い、入門書を精読することにしました。 具体的には上記の本を精読し、しっかりとゼロから作っていこうかと。 なんとなく難しかったところとかを適当にまとめたり、シンプルに要約したりしてる(つもり)です。とりあえず長くなりそうだったので、畳み込みニューラルネットワークの手前まで!機械学習の基本事項までですかね?

ニューラルネットワークの構成要素

入力ネットワークの構造

入力層、隠れ層、出力層に分けられる。 入力層は例えば、28x28の画像であれば、28x28=784の入力。 隠れ層は何層重ねてもよく、さらにどれだけ縮小しても拡大しても良い。 出力層はクラス分類問題であれば、クラスの数となる。 行列計算と非常に相性が良い構造である。

活性化関数

これらを回帰問題か分類問題かなどに応じて使い分ける。 主に、重みを付与しながらの層から層への情報伝播の後、 各層で行われる処理はこのような関数による変換。

バッチ処理

一回に入力する量を増やす処理。 画像であれば、何枚もの画像を別次元に格納する。 この処理により高速化の恩恵が得られる。

データの学習に関する主な手法

損失関数

損失関数とは機械学習における目標値である。 損失関数から出力される値を最小化することを目標に機械は学習を行う。 主に用いられる関数として下記のものがあげられる。

勾配法

極小値にハマり学習の進まないプラトーという状況に陥ることに注意。
毎回の学習の更新量を定めるパラメタを 学習率 と呼ぶ。 学習率は人間があらかじめ設定する必要があるため ハイパーパラメタ と呼ばれる。

ここまでのまとめ

まとめてみると学習の流れは

  1. ミニバッチ
  2. 勾配の算出
  3. パラメタの更新

これらを繰り返すことになる。この流れを確率的勾配降下法と呼ぶ。 また、ミニパッチ一回分の繰り返しを 1epoch と呼ぶ

テクニック的なものも多分に含む様々な手法

過学習

学習に用いたデータセットに特化した学習を行ってしまい汎化能力が失われた状態。 この状態を避けるために学習データとテストデータを分け、 定期的にテストデータの認識精度も測ることで、 両方の認識精度が向上していることを確認する必要がある。

誤差逆伝播(backpropagation)

微分値によってパラメタを進める方向、量を決めるが、 微分は一般的に重たい計算のため、高速化するために誤差逆伝播法を用いる。 これは各計算を分解、独立化し、chain ruleによって、 独立した計算それぞれに対する微分を考えていくことで、 行列計算として微分計算を行えると言う利点がある。
隠れ層での行列の形状を変化させる計算をAffineレイヤと呼び、 Affineレイヤを含む、上記の活性化関数それぞれに対し、 独立して計算済みのレイヤを実装していくことで、 部品を組み立てるようにニューラルネットワークを実装することができ、 かつ高速に微分計算を行うことができる。

勾配確認

実装の難しい誤差逆伝播法のバリデーションのため、 実装の簡単な数値微分の結果と比較すること。

最適化手法

パラメタの更新のことを最適化と呼ぶ。

上記の4つをこの書籍では取り上げていた。

SGD

最もシンプルな手法。 勾配に学習率をかけたものを次のパラメタ更新に用いる。 欠点として、最小値までの傾斜が等方的でない場合、 ジグザグな動きをすることとなり、学習スピードが遅くなる。

Momentum

前回の学習スピードを保持することで、 同じ方向に進むときは加速度的に進み、 ジグザグな動きをするときはSGDと比べて減速するようにした。

AdaGrad

学習率を定数ではなく変数にする。 過去全ての更新量を記憶し、そのぶん学習率を小さくしていく。 欠点として、学習に長時間かかった場合、学習率が0に近づき、 学習が進まなくなることが挙げられるが、それを改善したRMSProp と言う手法も存在する。

Adam

直感的にはMomentumとAdaGradを組み合わせたようなものらしい

重みの初期値

1を標準偏差としたガウス分布

0と1にアクティベーション(各レイヤの出力)が固まることから 勾配消失が起きているとわかる。

0.001を標準偏差としたガウス分布

0.5付近に固まるため、勾配消失は怒っていないが、 その代わり表現力が小さくなっている。 ある値にアクティベーションが集まると、 単一のレイヤで全てのレイヤを表現できてしまうと言う問題や、 学習が効率よくいかない問題が挙げられる。

Xavierの初期値

前層のノードの数に準じて初期値を小さくする手法。 活性化関数が線形関数(線形関数に近似される関数)の際に用いられる。

Heの初期値

Xavierに2倍の広がりをもたせたもの。 非線形関数に用いられる。

Batch Normalization

データを綺麗な分布にならす手法。 Affineレイヤと活性化関数レイヤの間に Batch Normalizationレイヤを入れて使用する。

  • 学習スピードの増加
  • 初期値に対する依存度の減少
  • 過学習の抑制

などの効果がある。

正則化

過学習を抑制するための手法

Weight decay(荷重減衰)

損失関数に重みに準じた量を加算することで、 大きな重みを持つことにペナルティを課す。

Dropout

確率で、ノードを消去することで何かうまいこと過学習が抑制されるらしい。

昔のgitがやばいらしかったからupdateしたわ

Gitの脆弱性 ( CVE-2017-1000117 )対策 | 東京エンジニア

gitがやばいらしい

どうやら昔のgitに脆弱性が見つかったらしい。さすがに脆いギットとか怖すぎて使ってられないからupdateすることにした。

homebrewでgit

デフォルトのgitを使っていたが、updateしたり管理したりするのにhomebrewのgitを使った方が楽らしいから再インストールすることにした。

$ brew install git

これでいけるのかと思いきや、どうやらhomebrewの方のgitにpathが通っていないっぽい。ということで.zshrcを開いて毎度のごとくpathを通す

export PATH="/usr/local/bin:$PATH"

これで確認したら

$ git --version
git version 2.14.1

オッケーっぽい! 脆弱性についてはあんまり調べてないけどとりあえずこれでオッケなのかな?笑

atom最高なんだけど日本語入力できない話するわ

atomは最高

went-went-takkun135.hatenablog.com

この記事で、atomに乗り換えたことをお伝えしたと思いますが、どんどんぞっこんになっています。この時から割とatom扱えるようになり、

  • TeX環境
  • Markdown環境
  • Jupyter環境
  • PDF参考書を片側に表示した勉強環境

等々の環境を整備いたしました!UIもめっちゃ綺麗だし、ほんとatom最高ですわ!!デメリットとしてはやっぱりshell環境とのコネクトが少し悪くなったことでしょうかね。

今回の記事について

上記のように非常に楽しくatom生活を送らせていただいてるというか、非常に楽しくなるようにちゃんと整備したというかで、これらについての記事も書きたいのですが、とりあえず困ってることを書きたいです

なんか日本語入力おかしくなったくない??

というのが今回の記事内容です。
日本語入力してもカーソル移動しないんですよね。なんか少し前にもバグったことあるっぽくてその時はatomのアップデートで解消されたみたいだったので、今回もアップデート待ちなのでしょうか。

現環境

Mac OSX 10.12.6 atom 1.19.0

解決した人いたら教えてください

調べても明らかな対処法が見えないので、とりあえず待っています。TeX書くときとか、Markdown書くときとか絶望的なので早く治ってくれないかなーと。

書いた直後の追記(8/16)

書いた直後にお祈りしながらアップデート確認したらニューバージョンリリースされてて、アップデートしたら無事日本語入力元どおりになりました!よかったよかった。。

TensorFlow Object Detection API をしこたま教育してやるわ[TFRecord編]

TensorFlow Object Detection

went-went-takkun135.hatenablog.com

この記事の続きです。 独自のデータセットで学習を行いたいから, このモデルに学習させる方法を調べてこいとのことだったので,

github.com

上記のチュートリアルを変形しながら進めていきたいと思います。

Data setの用意

まずはデータセットを用意しなければ始まりません。 チュートリアルの通りデータをダウンロードしてもいいのですが, めちゃくちゃ時間がかかるのが難点です。 自分で用意してもいいんですが, 形式がわからないと思うので下記においておきます。 チュートリアルでダウンロード予定だったannotationsの中にあるxmlのファイルです。

<annotation>
  <folder>dataset</folder>
  <filename>shiba_inu_11.jpg</filename>
  <source>
    <annotation>OXIIIT</annotation>
  </source>
  <size>
    <width>500</width>
    <height>334</height>
    <depth>3</depth>
  </size>
  <object>
    <name>dog</name>
    <pose>Frontal</pose>
    <truncated>0</truncated>
    <occluded>0</occluded>
    <bndbox>
      <xmin>140</xmin>
      <ymin>1</ymin>
      <xmax>384</xmax>
      <ymax>235</ymax>
    </bndbox>
  </object>
</annotation>

これがshiba_inu_11.jpgの画像ファイルに1対1対応するxmlファイルになります。

  • 画像ファイルをimages/
  • xmlファイルをannotations/
  • 二つのディレクトリをdataset/

に入れておくといいと思います。 そのほかにもペットのannotationsをダウンロードしてくれば色々入ってくるんですが, とりあえずこの形式に沿っていくつかデータあれば大丈夫だと思います。 要はPythonのlxmlライブラリでこれらの値をdictionaryとして格納して, それをTFRecordとして取り出すのが今回の流れです。

create_pet_tf_record.pyの変更

置換などはvimのコマンドで書いていこうかと思います(すでにAtomに乗り換え済み)

対象変更

とりあえず,今回はpetじゃなくて人間を検出したかったため,

:%s/pet/person/gc

しました。とりあえず。笑

画像形式変更

次に,今回のデータセットで用いる画像形式がjpgではなくpngであったため

:%s/jpg/png/gc
:%s/JPEG/PNG/gc

しました。TensorFlowではjpgかpngが使えるらしいですね。

不要なデータ部分を消去

筆者の用意したデータセットには

  • difficult
  • pose
  • truncated

の3項目が入っていなかったため,既存のコードではエラーを吐かれました。そのため,該当箇所をコメントアウトする必要がありました。(データセットにそれらの情報を加えるのもありだと思いますが,めんどいとも思います)

line 109~145

for obj in data['object']:
    difficult = bool(int(obj['difficult']))
  if ignore_difficult_instances and difficult:
    continue

  difficult_obj.append(int(difficult))

  xmin.append(float(obj['bndbox']['xmin']) / width)
  ymin.append(float(obj['bndbox']['ymin']) / height)
  xmax.append(float(obj['bndbox']['xmax']) / width)
  ymax.append(float(obj['bndbox']['ymax']) / height)
  class_name = get_class_name_from_filename(data['filename'])
  classes_text.append(class_name.encode('utf8'))
  classes.append(label_map_dict[class_name])
  truncated.append(int(obj['truncated']))
  poses.append(obj['pose'].encode('utf8'))

example = tf.train.Example(features=tf.train.Features(feature={
    'image/height': dataset_util.int64_feature(height),
    'image/width': dataset_util.int64_feature(width),
    'image/filename': dataset_util.bytes_feature(
        data['filename'].encode('utf8')),
    'image/source_id': dataset_util.bytes_feature(
        data['filename'].encode('utf8')),
    'image/key/sha256': dataset_util.bytes_feature(key.encode('utf8')),
    'image/encoded': dataset_util.bytes_feature(encoded_jpg),
    'image/format': dataset_util.bytes_feature('jpeg'.encode('utf8')),
    'image/object/bbox/xmin': dataset_util.float_list_feature(xmin),
    'image/object/bbox/xmax': dataset_util.float_list_feature(xmax),
    'image/object/bbox/ymin': dataset_util.float_list_feature(ymin),
    'image/object/bbox/ymax': dataset_util.float_list_feature(ymax),
    'image/object/class/text': dataset_util.bytes_list_feature(classes_text),
    'image/object/class/label': dataset_util.int64_list_feature(classes),
    'image/object/difficult': dataset_util.int64_list_feature(difficult_obj),
    'image/object/truncated': dataset_util.int64_list_feature(truncated),
    'image/object/view': dataset_util.bytes_list_feature(poses),
}))

これを↓に変更

for obj in data['object']:
  # difficult = bool(int(obj['difficult']))
  # if ignore_difficult_instances and difficult:
  #   continue

  # difficult_obj.append(int(difficult))

  xmin.append(float(obj['bndbox']['xmin']) / width)
  ymin.append(float(obj['bndbox']['ymin']) / height)
  xmax.append(float(obj['bndbox']['xmax']) / width)
  ymax.append(float(obj['bndbox']['ymax']) / height)
  class_name = get_class_name_from_filename(data['filename'])
  classes_text.append(class_name.encode('utf8'))
  classes.append(label_map_dict[class_name])
  # truncated.append(int(obj['truncated']))
  # poses.append(obj['pose'].encode('utf8'))

example = tf.train.Example(features=tf.train.Features(feature={
    'image/height': dataset_util.int64_feature(height),
    'image/width': dataset_util.int64_feature(width),
    'image/filename': dataset_util.bytes_feature(
        data['filename'].encode('utf8')),
    'image/source_id': dataset_util.bytes_feature(
        data['filename'].encode('utf8')),
    'image/key/sha256': dataset_util.bytes_feature(key.encode('utf8')),
    'image/encoded': dataset_util.bytes_feature(encoded_png),
    'image/format': dataset_util.bytes_feature('png'.encode('utf8')),
    'image/object/bbox/xmin': dataset_util.float_list_feature(xmin),
    'image/object/bbox/xmax': dataset_util.float_list_feature(xmax),
    'image/object/bbox/ymin': dataset_util.float_list_feature(ymin),
    'image/object/bbox/ymax': dataset_util.float_list_feature(ymax),
    'image/object/class/text': dataset_util.bytes_list_feature(classes_text),
    'image/object/class/label': dataset_util.int64_list_feature(classes),
  #   'image/object/difficult': dataset_util.int64_list_feature(difficult_obj),
  #   'image/object/truncated': dataset_util.int64_list_feature(truncated),
  #   'image/object/view': dataset_util.bytes_list_feature(poses),

データセットへのpath指定を細々と変更

xmlまでのpath
path = os.path.join(annotations_dir, 'xmls', example + '.xml')

上記の'xmls',が邪魔ですので消去です。 petのデータセットではannotationsの下にxmlsというディレクトリがあって, その中にxmlファイルが入っているらしいですね。

各データへのpath

line 191~192

examples_path = os.path.join(annotations_dir, 'trainval.txt')
examples_list = dataset_util.read_examples_list(examples_path)

ここを↓に変更

xml_list = os.listdir(annotations_dir)
examples_list = []
for xml_name in xml_list:
  temp_splited_name = xml_name.split(".")
  examples_list.append(temp_splited_name[0])

また,各データの名前を入れたテキストファイルも用意していなかったので, Pythonに頑張ってもらいました。

実行

多分上記の変更でTFRecord作れるようになっていると思います! 今,このTFRecord使って学習させようと奮闘中なのですが, なーんか時間かかりすぎてて絶対間違ってるなーって状態です笑

次回,奮闘の末に勝利を納めて入れば学習のセットアップまで書きます!