スポンサーサイト
カテゴリ: スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
編集 / --.--.-- / コメント: - / トラックバック: - / PageTop↑
活動報告 No.152 今年もありがとうございました! & 'C'と'CUDA'で自作ディープラーニング!!
カテゴリ: 通常

どうもおはこんばんにちは!
1週間の間にC&CUDAとJavaScriptとPythonでそれぞれ違うプロジェクトの為にプログラミングをしていた2年のマエダです。


〜〜〜

今年も残すところあと1日ほどとなってしまいましたねぇ〜。このヒュー研ブログの今年初めての記事は、1月5日の「活動報告No113 (近藤科学の)サーボホーンの話」という記事ですね。この記事は私の1つ上の学年の先輩の記事です。記事内でサーボホーンを持った骨(ボーン)が登場するのですが、ダジャレかと思ったら最初はそんなつもりなかったそうな。


んで、そのあと1月15日のが今年初の私の記事です。(活動報告No114 Webサイトを作ってみよう 1/3 ~学習編~)
懐かしいなあ。。結局ヒュー研の公式ホームページはこのようになりましたが、当時の私はコーディングスキルはあってもユーザビリティの概念が欠如していたので、なんとも幼稚なページを作成していた頃です。


現在は表向きのページは特にいじっていなくて、ヒュー研主催の関東学生2足歩行ロボットの初開催にむけての準備が進んできたら、そのページを新規で作ろうかなって思っているところです。


定期的に自分からWEB制作の案件というかその類をボランティアでやってWEBコーディングの技術を損なわないように努力してきたのですが、最近はまぁディープラーニングの方でCとCUDAばかり触っていることもあり、コーダーとしての自信を失いつつあります(笑)。来年の3月くらいに特に使用用途もないWEBサイト作ってみようかなと思っています。どこかから依頼があればそっちやりますが。


〜〜〜

話がWEBの方に行ってしまいましたが、今年はWEB系だけでなく、部活動を通して面白い体験などしました。後続にディープラーニングの記事が控えているので端的にまとめますが、去年と比べて大会や講演会等のイベントで多くの人とお話する機会がありました。ま、こういう言い方すると語弊がありますが、去年はそんな機会がなかったのではなく自分から作りに行ってなかっただけなんです。。


多くの人の中には何年もロボット製作に関わっている人であったり、最近始めた学生さん、ロボットをパートナーとした芸人さん、起業したエンジニアの方、研究室の先生などなど、、いち大学生としても、部の広報としても有意義な交流ができたんじゃないかと思いました。(だから他の部員たちも名刺作ろう)


〜〜〜

そういえば今年私が書いた記事はこれで23個目ですっ!来年も元気していたらちゃんとブログ書くはずなので、来年もどうぞよろしくお願いします!


それでは、良いお年を!(^∇^)ノ






なんかもう完全に締めな雰囲気ですが、ここからは興味のある人はどうぞご覧になってください。


今からやることは、以下の 画像1 に対して、ディープラーニングを用いて 画像2 のようにロボットを検出してもらおう!というプロジェクトです。



robo.jpeg 

画像 1



robo.jpg 

画像 2





今回作成したニューラルネットのコードは、擬似乱数生成のxorshift方式(論文はコチラ)以外は全て自分で書きました。

使用した言語はC言語とCUDAです。CUDAはNVIDIAのグラフィックボードを並列演算機として動作させるためのプログラムです。

C言語では標準で擬似乱数生成関数がありますし、より高品質と言われるメイセンヌツイスタも選択肢としてあった中でxorshiftをあえて選んだ理由は特にないです、ハイ。。計算が排他的論理和とビットシフトだけで「これだけ?」と思えるコードで十分実用的な擬似乱数を吐き出してくれるのを見て何か使いたいなあと思っただけです。


ニューラルネットはもちろん物体検出用のです。全体構造は完全畳み込みNNで出力テンソルが画像のグリッドに相当し、同層の各チャンネルがそれぞれグリッドの相対中心座標、画像全体の相対サイズ、物体の有無を表す信頼度、そして分類表示を持っています。知っている人は知っていますが、YOLOですね。ただ、私の作ったNNは完全なYOLOではなく、収束や精度に関する少々複雑な構造を取っ払ったシンプルなものです。そのため収束遅いし精度そんなよくないです。


ネットワークは以下の通りです。

層種 入力サイズ 入力チャンネル フィルタサイズ 出力サイズ 出力チャンネル
Conv 416 3(RGB) 3 416 32
MaxPool 416 32 2 208 32
Conv 208 32 3 208 64
MaxPool 208 64 2 104 64
Conv 104 64 3 104 128
MaxPool 104 128 2 52 128
Conv 52 128 3 52 256
MaxPool 52 256 2 26 256
Conv 26 256 3 26 512
MaxPool 26 512 2 13 512
Conv 13 512 3 13 1024
Conv 13 1024 3 13 12(BOX*5 + CLASS)

たったの12層しかないNNなので、計算量削減のための1x1畳み込み層は使っていません。あと、最大値プーリングの後でチャンネル数を倍にしています。

畳み込み層のストライドは1、最大値プーリング層のストライドは2です。各グリッドの持つアンカーボックスは2つとし、2クラス分類を考えるので、2*5+2=12が出力層のチャンネル数になります。


各畳み込み層の流れは以下の通りです。


順伝播データ

畳み込み

Leaky ReLU (slope=0.05)

バッチ正規化

addバイアス



各最大値プーリングのアップサンプリングは、順伝播時に記憶した最大値の場所を元に、誤差データをその場所に配置して、他は全て0になる方法を使いました。ちなみに本家YOLO(Darknet)はより正確な検出精度を出すために下層の誤差データを用いた(多分独自の)アップサンプリングをしています。


畳み込みとバイアスの更新および誤差データの算出はともかく、バッチ正規化の逆伝播が気になりますよね!(ますよね!)


別に私が解説する訳ではないですが、計算グラフを使って解いている人がいたので、そちらを見るとわかりやすいかと。めっちゃ丁寧に解説してくれていて好きです。


Bacth Normalization Backpropagation:

https://kratzert.github.io/2016/02/12/understanding-the-gradient-flow-through-the-batch-normalization-layer.html


上記のサイトではPythonとその強力なライブラリであるNumpyを用いて実装されています。記述量見ているとやっぱPythonいいよなぁ。PythonとPython用の機械学習ライブラリをそのままVHDLとかに落とし込めれば最高なのに。たまに変数がリストなのか何なのかわからなくなりますが(笑)。



じゃ、構造のあらかた提示したところでアノテーションを作っていきましょう。

アノテーションはDarknet方式とします。私は以前にDarknet専用のアノテーション作成補助ツールをGitHubにて公開したので、そちらを使います。


BB-Engine-forDarknet:

https://github.com/ShimizuMizu/BB-Engine-forDarknet


しかし今回はC言語で画像をリサイズする機能を実装していないので、アノテーション作成時に補助ツールがリサイズするようにします。また、読み込み形式はBMP形式です。BMP形式は素直にBGR値を保持しているので、データ容量が大きいというデメリットを除けば初心者には扱いやすい画像形式です!


任意にリサイズして保存するには、BB-Engine-forDarknet.pyの261行目を書き換えます。


# 変更前
shutil.copy(annotation_img_path, self.w_folder + "/" + annotation_img)

# 変更後
img = Image.open(annotation_img_path)
img_resize = img.resize((416, 416), Image.LANCZOS)
img_resize.save(write_img_path, 'bmp')



今回学習に使う画像データは冒頭に載せた、千葉工SKKさんのささペロリン(左)とヒュー研のテオ(右)の画像です。



tk_001.jpg tk_002.jpg


アノテーションは以下のように無事生成されました。


annotations_004.jpg robo-txt.jpg

ro.png 


ちゃんと画像が416x416にリサイズされました。今回はささペロリンを0番、テオを1番にラベル付けしました。

そして、今回は0番にラベル付けされた、ささペロリンのみを学習、検出しようと思います。



それじゃ早速...


教師データ_006 

教師データを書き込んで...


繧ソ繝シ繝溘リ繝ォ CMakeでMakefile生成してmakeでビルドして、いざ実行!!



言い忘れましたが、損失関数は残差平方和です。物体の大きさ、中心座標で一つの残差平方和を共有し、物体の有無に関する信頼は単体で、そして分類は全分類で一つの関数を共有しています。分類は収束を考えてsoftmax関数だか交差エントロピー誤差だかを使った方がいいのかもですね。


そんで、以下が損失の推移です。


損失の推移 


うん、まぁ。フィルタとバイアスの初期値はさっき紹介したxorshift方式を採用して -0.5〜0.5 の間で擬似乱数を生成していたので、それを考えるとちゃんと勾配を認識してくれたんじゃないかなと思います。


上のグラフからは読み取れないですが、一番最後の損失は 1.633719 でした。でかい!!



ほんじゃもっと詳細に見ていきましょうか。まずは物体の位置に関する出力テンソルです。


物体の存在可能性数値領域 



...とは言ってもこれだけではぱっと見わかりづらいですよね。


という訳で、出力が 0.5以上のマスを黄色 にします。


物体の存在可能性領域_スコア0,5以上 



確かにさっきのささペロリン君の位置に近いですね。


お次は中心グリッドです。


最も数値の大きいセル_物体の中心 


中心グリッドは閾値とかじゃなく、この169マスでもっとも大きな数値を黄色にしました。


さらに上の中心グリッドが保有する中心座標と物体の大きさを一気お見せします。


上_x_下_y 

▲ 上がx座標、下がy座標 ▲


上_width_下_height 

▲ 上が横幅、下が縦幅 ▲




以上の数値を可視化します。



出力可視化 


赤実線枠:物体の大きさ

赤破線枠:物体の中心が含まれているグリッド

赤丸:物体の中心点

黄色領域:物体のグリッド別領域(人間の方から閾値を設定可能)

と、こんな感じで、無事にそれっぽい場所をニューラルネットが予測(というか学習)してくれました。


見てもらった通り、中心座標や閾値で絞り込める領域についてはいい結果を出しているものの、物体の大きさを表す数値がイマイチですね。これはそもそも今回自作したニューラルネットが本家Darknetと比べて簡素化された学習であること、そして、12層しかネットワークを深くしていないことによる損失の収束の遅延が影響しているものと思われます。


人間の画像識別率を超えたというMicrosoft発ディープニューラルネットは156層もの階層構造になっているので、たった12層しかないのに場所と分類まで大まかにできたことを考えると、まあ上出来かなと思います。


この微妙な精度をどうにかするために、ニューラルネットの改善をこれから続けていこうと思います。学習途中には損失だけでなく、逆伝播毎のフィルタ・バイアスの最大・最小誤差の推移を観察していました。データとして残している訳ではありませんが、ちょくちょく見ていて、何となく上位層へ誤差を伝播しきれていない様子でした。上位層に行けば行くほど、誤差が小さいのです。


上位層ほど誤差が少なくなっている原因としては、最大値プーリング層のアップサンプリングに原因があると考えています。サイズ2のストライド2で順伝播をやると、最大値をそのまま返した場合、単純に考えると誤差は4分の1に減少してしまいます。本ニューラルネットでは高解像度の画像から13x13という比較的精細なグリッドに持ちこみ、物体検出をして見たいと思って先に紹介したような12層NNになったので、プーリング層の操作は学習にかなりの影響が出てきます。これについてはプーリング層を平均値プーリングにするか、最大値以外は0以上1未満の定数で商をとって逆伝播するか、と色々対策を考えています。



以上で長い後段の記事は終わりです。


今年中に自作ディープニューラルネットワークの結果報告ができてよかったです。今後はもっとCとCUDAと深層学習の勉強を続けてROBO-ONE autoにでも出てみたいですね!



てなことで、前段と重なりますが、みなさん良いお年を。


ほんじゃ、まったのぉ〜♪(/・ω・)/ ♪


スポンサーサイト
編集 / 2017.12.30 / コメント: 0 / トラックバック: 0 / PageTop↑
活動報告 No.151 ROBOT GENERATION 12に参加してきました!
カテゴリ: 大会


どうもおはこんばんにちは、分身が2体ほど欲しい2年のマエダです。あまり詳しいことを言える段階でないのですが、今年末から来年度初めにかけてヒュー研内部が大きく変わりそうです。一部からはお怒りの声が届きましたが、ヒュー研をより良くしていくためのプロジェクトなので、数か月後にココで良いお知らせができたらなぁと思います。



さて、先日、12月17日(日)に明治大学生田キャンパスで開催された理科サークルフェスタの一環として行われた法政大学さん主催のROBOT GENERATION(ロボット・ジェネレーション)に参加してきました。(長い…)

今年の参加はヒュー研から5機体、千葉工さんのSKKから1機体、そして開催元である法政さんから2機体の計8機体でした。機体目は以下の通りです。

1・グレンジ (法政)
2・釣式 (電大)
3・墨 (電大)
4・ニマビ (電大)
5・テオ (電大)
6・メビウスK (電大)
7・ささペロリン (千葉工)
8・代理 (法政)

(敬称略)


千葉工さんはウチの元部長がニソコンでけしかけたのもあってか4機体エントリーだったそうなんですが、前日故障等重なり当日は1機体のみの参加だったそうな。


ロボジェネ12(2017_12_17)_10


釣り式(手前)




ロボジェネ12(2017_12_17)_21





ロボジェネ12(2017_12_17)_15


ニマビ




ロボジェネ12(2017_12_17)_23


テオ




ロボジェネ12(2017_12_17)_22


メビウスK




競技は全部で3種類、「障害物競走」・「ポイントアタック」・「バトル」の3つでした。






障害物競争


コースの概要は以下の通りです。

ロボジェネ12(2017_12_17)_19


~ 結果 〜



1・グレンジ 〜 回転バーまで
2・釣式 〜 残りタイム 0:13:36
3・墨 〜 残りタイム 1:54:13
4・ニマビ 〜 赤ペットボトルまで
5・テオ 〜 残りタイム 0:49:00
6・メビウスK 〜 残りタイム 0:24:62
7・ささペロリン 〜 残りタイム 1:09:48
8・代理 〜 回転バーまで



秒数は全て残りタイムなので、大きければその分早くゴールできたということです。今回の機体たちの中だと墨が一番早いですね。さすがです。

ニマビというのはヒュー研の今年の1年生が製作した(一応)小型機体なのですが、コース半分までしか行きませんでした。。ロボワンを考えるなら次回から予選あることだし歩行を洗練していきたいところですね。


ロボジェネ12(2017_12_17)_18


ロボジェネ12(2017_12_17)_17


ロボジェネ12(2017_12_17)_16






ポイントアタック


色々な形のスポンジたちを自陣に持っていくことでポイントが加算されて、最終的な合計点を競う競技です。



~ 結果 ~


試合

結果

第1試合

釣式 VS テオ
× - ○

第2試合

墨 VS ニマビ
○ - ×

第3試合

グレンジ VS ささペロリン
× - ○

第4試合

メビウスK VS 代理
○ - ×



ロボジェネ12(2017_12_17)_9


ロボジェネ12(2017_12_17)_11






バトル


いつも通りのバトル競技です。ルールは部内戦よりガバっていましたがガチというよりかは交流的な意味でやっている気持もあるので楽しめたらそれで良いでしょう。



~ 結果 ~


順位

機体

第1位

テオ

第2位

釣式

第3位以下

未決定




ロボジェネ12(2017_12_17)_8


ロボジェネ12(2017_12_17)_6

↑ エキシビションマッチ ↑






~ 最終結果 ~


第 1 位  テオ

第 2 位  墨

第 3 位  ささペロリン




最終結果は上のようになりました。おめでとうございます!




ロボジェネ12(2017_12_17)_4






次お会いするのはKONDOバトルかロボジャパンかROBO-ONEですかね。年をまたいでとなりますが、来年も元気にバトれること期待しています! 私は今年度のレポートが残り1つとなったので、ヒュー研の技術開発を加速させて、来年こそは自律機体を製作したいです。


今年はこれが最後のブログかな...?あと1つあるかな...?




ほんじゃまったの~(*・`ω´・)ゞ



編集 / 2017.12.22 / コメント: 0 / トラックバック: 0 / PageTop↑
活動報告 No.150 完全畳み込みニューラルネットワーク(仮)をC言語で実装する際にやってしもたミスとその他 for ROBO-ONE auto
カテゴリ: 未分類

どうも、おはこんばんにちは。キャンパーレベル24の2年マエダです。
ポケ森と全然関係ないんですが、先日の東京ビッグサイトで開催された国際ロボット展に行きました。私は初日に参加しましたが平日というだけあって99%はビジネスマンだったので、学生に対してビラ配り的なやつは大抵無視でしたorz。
ま、しゃーない。

んでんで、私が更新するブログは1ヶ月ぶりですかね。ここ数週間はヒュー研内部で来年度に向けての云々やらタイトル通りのことをやっておりました。
完全畳み込みニューラルネットワークでよくやってしもたミスを上げて行くので、全結合層については何もありません。畳み込み層と最大プーリング層についてだけです。
あと、今回も機体は登場しません、ごめんなさい。次の日曜日にロボジェネレーションという大会があるので、来週か再来週はそれに関連してちゃんとロボットの画像載せます。
ロボジェネレーションのリンク:
http://denken.ws.hosei.ac.jp/robot_generation/




ちょっと前置き...

私はPythonを使ってきた身なので、ニューラルネットワークなんて大規模なCプログラムを書いてきたことはありません。2ヶ月ほど前に物体検出の勉強を論文や解説サイト等でやり始め、実際にCプログラムで構築し始めたのはほんの数週間前です。

Cを本格的に使い始めてちょっと経ちますが、Pythonより文法というか面倒なお約束事が多いのでサクサク記述できない所を不満に思います。しかし計算問題に関してはPythonより覚えること少なくて、「こんな記述初めて見た!」なところが少ないと思いました。Pythonはライブラリ関連が超強力ですが、それらがブラックボックスと化しているのでこう思うのも必然ですかね。





ミス1:mallocの初期値


mallocは配列に使用されるメモリの量をこちらで指定して確保する際に使います。たとえば、


#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int num = 10;
double *array = (double *)malloc(sizeof(double) * 10);

for (int i = 0; i < num; i++) {
printf("%f ", array[i]);
}

return 0;
}

てな感じでstdlib.hを宣言してからmallocを使うと上の例では要素数10の配列を確保できます。
私はトライ&エラーな人間なので、書き方だけどこかのサイトで見たらあとは自習していくスタイルなので、とりあえず実行してみました。結果は以下です。


no150-1.png 

!?!?


全部 0 でした。当時の私はこう思いました。

「あ、mallocって宣言したら全部 0 で初期化されるんだ、便利だなぁ〜」
...実際はそんなことありません。上のように解釈して数週間もこの違う事実に気づかなかったせいで地獄のコアダンプ不回避事件が起きました。


複数回コンパイル&実行を繰り返すとわかるのですが、


no150-2.png no150-3.png 

このように不特定な数が出ることもあります。ニューラルネットには数千万、ときには億単位もの要素が必要とされるので、、、


Layer *l;
l = (Layer *)malloc(sizeof(Layer) * LAYER_NUM);
for (i = 0; i < LAYER_NUM; i++) {
l[i].input_data = (double *)malloc(sizeof(double)
* CFG[i][0] * CFG[i][0] * CFG[i][1]);
l[i].filter = (double *)malloc(sizeof(double)
* CFG[i][2] * CFG[i][2] * CFG[i][1] * CFG[i][4]);
l[i].bias = (double *)malloc(sizeof(double)
* CFG[i][1] * CFG[i][4]);
l[i].output_data = (double *)malloc(sizeof(double)
* CFG[i][3] * CFG[i][3] * CFG[i][4]);
}

※ 横幅が入るように変なところで改行しています。


もうこれLAYER_NUMが156層だったりしたらえらいことですよ。まあ数層でもえらいことになりますが。。



というわけで...

mallocも通常配列同様に初期化しよう。





ミス2:プーリング層で逆伝播用配列の要素数を間違えた


ネットワークを構成する際、以下の様に層番号と層における処理の種類、入出力サイズ、フィルタサイズの情報を配列に格納し、それをもとに順伝播と逆伝播をfor文で回しています。

あと、出力テンソルのサイズがアレなのは物体検出アルゴリズムのYOLOを参考にしているからです。


// { 0 , 1 , 2 , 3 ,
// { number, type, input_size, input_channel,
// 4 , 5 , 6 }
// filter_size, output_size, output_channel }
// type : 0 = convolition, 1 = max_pooling
int LAYER_INFO[LAYER_NUM][7] = {
    { 0, 0, 416, 3, 3, 416, 32 },

    { 1, 1, 416, 32, 0, 208, 32 },

    { 2, 0, 208, 32, 3, 208, 64 },

    { 3, 1, 208, 64, 0, 104, 64 },

    { 4, 0, 104, 64, 3, 104, 128 },
    { 5, 0, 104, 128, 1, 104, 64 },
    { 6, 0, 104, 64, 3, 104, 128 },

    { 7, 1, 104, 128, 0, 52, 128 },

    { 8, 0, 52, 128, 3, 52, 256 },
    { 9, 0, 52, 256, 1, 52, 128 },
    { 10, 0, 52, 128, 3, 52, 256 },

    { 11, 1, 52, 256, 0, 26, 256 },

    { 12, 0, 26, 256, 3, 26, 512 },
    { 13, 0, 26, 512, 1, 26, 256 },
    { 14, 0, 26, 256, 3, 26, 512 },
    { 15, 0, 26, 512, 1, 26, 256 },
    { 16, 0, 26, 256, 3, 26, 512 },

    { 17, 1, 26, 512, 0, 13, 512 },

    { 18, 0, 13, 512, 3, 13, 1024 },
    { 19, 0, 13, 1024, 3, 13, 512 },
    { 20, 0, 13, 512, 3, 13, 1024 },
    { 21, 0, 13, 1024, 3, 13, 512 },
    { 22, 0, 13, 512, 3, 13, 1024 },
    { 23, 0, 13, 1024, 3, 13, 1024 },
    { 24, 0, 13, 1024, 3, 13, 1024 },
    { 25, 0, 13, 1024, 3, 13, (BBOX * 5 + CLASS) }
};


このとき逆伝播用の配列の要素数は LAYER_INFO[][5] * LAYER_INFO[][5] * LAYER_INFO[][6] で決定されます。畳み込み層は。。


私は畳み込み層しか見ていなかったのでプーリング層にも上の法則を適用してしまいました。そのため、上位層に伝播できる誤差が本来の4分の1となってしまい、うまく学習できませんでした。

というわけで...

プーリングを挟んだ畳み込み付近で間違いを犯しやすいので、怪しい挙動をみせたら誤差をちゃんと上位層に伝播できているのか、配列要素数のレベルから見直そう。




ミス(というかオススメ)3:ノート、大切


ライブラリや小規模プログラムしかしていなかった人間なので、その場で考えながらポチポチとコードを組んでいると多チャンネル対応の畳み込みでfor文回す際や順伝播・逆伝播の変数と関数の引数との関係が意味わからなくなります。

IMG_0245 (1) 

上は左側が下位層、右側が上位層で逆伝播をしています。薄く囲ってある範囲が各層のパラメータの塊です。下位層からの誤差データと上位層からの順伝播データを用いてフィルタの勾配を求め、誤差データと転置フィルタを用いて上位層へ伝播する誤差データを生成します。


実際の問題は上の画像のように単純ではなくて、畳み込み・活性化関数・バッチ正規化・バイアス加算を経ているので、逆伝播用の関数内はえらい関数の羅列になり、各関数の引数を考えると、とても頭の中だけでどうこう出来るお話にはなりません(たぶん)。






なんか題名の割に内容薄くてスミマセン。。あと1つか2つくらい書こうかなと思いましたが、早く家に帰りたいのでこれまでにします。
冒頭でも触れた通り、明日はロボジェネがあるので来週か再来週にはその記事を書こうと思います。


昨年まではヒュー研の部内戦的な何かでしたが、今年は元部長がニソコンで声掛けした結果なのか千葉工さんから4台ほど出場すると聞きました。盛んになるといいっすなぁ。


ロボジェネ終わった後ですが、最近CUDAプログラミングに手を出したので、今後もその点などコアなお話が続くと思います。
なんかこう、技術的なお話よりも雑談の方が得意なので、ヒュー研ブログではその雑談が多くなっちゃうと思います。技術的なお話しは私の個人ブログの方で勘弁してください。「シミズさんのたわごと」でググれば多分出てきます。ヤホーはわかりません。

ほんじゃまったのー(=゚ω゚)ノ



編集 / 2017.12.16 / コメント: 0 / トラックバック: 0 / PageTop↑
プロフィール

ヒュー研の中の人

Author:ヒュー研の人
このブログは東京電機大学理工学部ヒューマノイド研究部の公式ブログです。2012年から部に昇格しました!
その日の活動や大会の記録をできるだけ更新していきたいです!!

☆だいたい金曜日前後に更新します☆

FC2カウンター
カレンダー
11 | 2017/12 | 01
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 - - - - - -
リンク
ブロとも申請フォーム
携帯でみるには↓
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。