アプリとサービスのすすめ

アプリやIT系のサービスを中心に書いていきます。たまに副業やビジネス関係の情報なども気ままにつづります

初心者がクラウドソーシング(ランサーズ)でゼロからお金を稼ぐまでの具体的かつ実践的なstepをまとめてみた

クラウドソーシングサイトで「月5万稼ぐ・副業にする」とはよく言われますが、実際はクラウドソーシングで稼ぐにはコツがあります。今回は

クラウドソーシングを副業にする
または
クラウドソーシングを使って稼ぐスキルを身につける

ためにやるべき、実践的なstepを個人的な体験からまとめていきます。目次ですが、この記事の実践stepは以下のようになってます。


Step.1 稼ぐために必要な仕事・スキルを決める
Step.2 スキルの基礎的な勉強をする
Step.3 具体的にクラウドソーシングで仕事をしてみる
Step.4 月5万円を目標に作品のクオリティを上げ続ける


キーポイントは
クラウドソーシングは「お金を稼ぐスキルアップのために利用する」

ということ。クラウドソーシングに限定されず、一般的にお金を稼ぐためには、「誰でもできることはやらず、できる人が少ない単価の高い仕事をする」必要があります。

クラウドソーシングでも同じことが言えるわけで、誰でも簡単にできる仕事ではなく、専門的なスキルを持つ人しかできない(難しめの)仕事ができることが目標。今回はこの目標を達成するための実践的なやり方(step)を紹介していきます。




Step.1 稼ぐために必要な仕事・スキルを決める
f:id:trafalbad:20171005121150j:plain



やりたい分野の仕事を決める

クラウドソーシングには様々な分野の仕事があります。その中で仕事にする分野を選ぶ必要があるんですが、まず選ぶ基準としては

・好きでやりたい分野の仕事

を決めた方がいい
理由はイヤイヤやるより、好きな方が挫折もしづらいし、スキルも身につきやすいから。
例えばクラウドソーシング大手の「ランサーズ」を見てみると、ザッと


・翻訳
・デザイン
・動画・写真
・web作成
システム開発
・ライティング
・大量作業



の7項目の仕事があります。細かく分けるとさらにあります。別にランサーズでなくてもいいけど、大まかにこの中から自分のやりたい分野を決めます。

そして、クラウドソーシングで稼げる仕事というのは、「単価が高く、誰でもできそうもない仕事」です。逆に単価が低く、すぐに定員オーバーの分野は稼げません。



例えば「ライティング」という分野は絶対にダメ。これは誰でもできる仕事であり、単価も安く、競争率が高い。とにかく”少ないパイを奪い合う世界”です。ライティングをやるなら、いっそブログを書き、稼げる能力を身につけた方が絶対に市場価値はあります。

要は「誰でも簡単にできない難しめな仕事」が狙いなので、もしあなたがなんのスキルもないなら、すぐにできそうな仕事は絶対に選んではいけない




単価が高く、難しそうな仕事を選ぶ

稼げる仕事を選ぶコツは「単価が高く、難しそうに見える仕事」です。個人的にランサーズでこの類に該当する分野は以下の通りです。

・翻訳
・デザイン
・動画・写真
・web作成
システム開発


まず、この中から自分のやりたい仕事を選ぶ。一見、表示されてる仕事(タスクやプロジェクト)を見ると、できないと萎縮してしまいます。しかし難しい仕事でも、この記事のstepにそっていけば糸口がつかめます。




Step.2 スキルの基礎的な勉強をする
f:id:trafalbad:20171005121221j:plain


分野が決まったら身につけるスキルを理解する

やりたい仕事の分野が決まったら、次はその仕事で必要なスキルを理解します。
例えば「動画作成」だとしたら、必要なスキルは「簡単な動画ソフトが使えること」です。


となります。クラウドソーシングのために身につけるスキルは少ないですが、初心者でいきなりできる人はいません。この出来る出来ないの差が稼げる能力の境界線です。


大抵は分野ごとに必要なスキル情報はネットに転がってるので、このスキル調査は徹底的にして下さい。

たこの記事のコメント欄でコメントしていただければ、場合によっては分野に特化した記事を書きますので、コメントしてもらえると嬉しいです。




スキルの勉強方法

スキルの勉強方法は本当に分野ごとに異なるのですが、大抵は書籍がベストです。各分野ごとのスキルは専門性が高いので、必ず書籍は売ってます。そして基礎を理解したら仕事をやってみる。その際、細部はネット上の情報を頼りに理解していくというのが理想です。


例えば、動画作成で動画ソフト(adobe premiere Pro)を使うなら
①書籍を購入し、ソフトを使えるようにする

②仕事をしながらネットや書籍を使いながら細部を理解する

書籍にはソフトのインストール方法から、使い方まで細かく書いてある。全部理解しなくて良いので、とりあえず動画を作るのに必要な知識は理解します。

そして、だいたいソフトが使いこなせる段階まできら実際に作品を作ったり、仕事してみます。後はネット上の使い方サイトなどを参照して、試行錯誤していけば、クラウドソーシングの仕事はできます。




基礎を理解したら、簡単でいいので作品を作ってみる

次にだいたいのスキルを理解したなら、その分野の作品を簡単でいいので1〜2こ作ってみます。
例えば
・動画なら
→動画作品ソフトで動画を作ってみる

・プログラミングや翻訳なら
→専門的なサイトのpaizaなどの問題に挑戦する、アメリアなどの翻訳専門サイトで問題を解いてみる

などいろいろです。自分でとりあえず、ダメもとでいいのでなんでもやってみる。


別にどんなダメダメな作品でも、最初は作ってみることが大切。作品のスキルはクラウドソーシングでプロジェクトをこなしていくうちに上がっていきますので、今は「まず作ってみる」ことをしてみて下さい。

とりあえず、2〜3作品くらい作ってみると自信がつくと思います。





Step.3 具体的にクラウドソーシングで仕事をしてみる
f:id:trafalbad:20171005121246j:plain

仕事(プロジェクト)にチャレンジしてみる

step2まで終わってとりあえず作品も作ったなら、クラウドソーシングで仕事(プロジェクト)にチャレンジします。単価の高い仕事というのは、ほとんどプロジェクトなので、クライアントと交渉する必要がありますが、とにかく最初の目標は仕事をもらい、稼ぐ体験をすること。


分野ごとでもレベルの低い仕事から高い仕事までピンキリです。
感覚でいいので、これができそうという仕事にチャレンジする。応募して多少、大げさでもいいので、自分のスキルをアピールして仕事を受注するまで粘ります。


仕事の受注率を上げる方法は実績以外にもポートフォリオなどのいろいろありますので、いろいろ工夫。まずは仕事を受注するまで粘って下さい。



最大限のクオリティで仕事をこなす

仕事を受注できたら、雑にこなすのではなく、今できる最大のクオリティで仕上げます。作品のクオリティを上げる方法は分野ごとに異なりますが、書籍やネットで調べたり、何度も直したり、考え時間をかけることが必要です。


面倒ですが、これらはスキルアップに必要ですし、やってると次第に慣れてきて仕事が早くこなせるようになります。


はじめのうちはクオリティを追求して、限界まで力を絞って仕事をこなさないといつまでたっても難しい仕事ができない、つまり稼ぐ能力が上がらない。



フィードバックを得る

仕事を終わったら、クライアントからフィードバックをもらって下さい。フィードバックというのは作品に対する良い悪いの評価です。フィードバックを得ておくと、自分の作品のダメな点、良い点の反省ができます。


例えば、クラウドソーシングはクライアントから評価をもらえるはずで、ランサーズなら5段階評価で感想ももらえる。
まず「ここがこう悪い、よかった」など具体的な評価はもらえません。単純によい、悪いの反応だけです。そういう時のフィードバックの活用法は、


・自分でここが悪かったと具体的に改善点の仮説を立てること、そして次の作品に活かす


できるだけ思いつく限り書き出してメモして、忘れないように残しておきます。
次に仕事をするときに、メモした改善点をすべて改善し、仕事をこなしてみます。出来上がったときには必ず、前よりも作品のクオリティも上がっているし、クライアントからの評価も上がってるはずです。



具体的なフィードバックがもらえなかったら

具体的なフィードバックがもらえなかったら、ネット上からフィードバックを得る方法があります。
例えば


youtubeニコニコ動画などの動画サイトにアップしてアクセス数をみる

Twitterに作品を投稿する

・質問サイトに投稿して意見をもらう



などSNS、ネットを使えば、その方法は無限にあります。ネットは不特定多数のユーザーからの反応が得られるので、一人のクライアントの評価よりももっと広い視点での意見、評価がもらえる。

「ネット上に自分の作品をアップする」ことはフィードバックを得る方法として、とても現実的なので、可能な限りこっちをオススメします




Step.4 月5万円を目標に作品のクオリティを上げ続ける
f:id:trafalbad:20171005121508j:plain

なぜ月5万円なのか
なぜ目標が月5万円なのかという理由を挙げると


・理想のスキルの単価の最低ラインが1〜3万円
・月5万円というのは副業としての合格ライン


というのがあります。
まず、クラウドソーシングで理想的なレベルのスキルの仕事は単価が高めで、1万円以上。この仕事をこなせるレベルになると、スキルはかなり上がった証拠です。ここまでくるとスキルはクラウドソーシング以外の専門的なバイトでも、かなり通用します




2つめに副業として理想のレベルが、単価高めの仕事を2、3ここなして月五万円を達成することだから。

スピード勝負の低単価の仕事をこなす量勝負ではなく、量は少なくても質の高い仕事で5万を稼いだ方が、副業としてのスキルとして理想的です

まず、1〜3この仕事をこなして、月五万円稼ぐと言う目標が理想



作品のクオリティを上げ続ける

またstep3でも述べましたが、作品のクオリティを上げ続けることが、稼ぐ能力をこなすために必要です。
クオリティが上がれば上がるほど、いろんな場所で稼げるようになります。例えば、webデザイナーの独立する方法に

クラウドソーシングで稼げるようになってから、フリーとしてやってみる


という現実的な方法があります。

クラウドソーシング以外で仕事を得る理由としては、クラウドソーシングはクライアントが相場より安い値段で仕事を設定してることが多く、稼げる金額に限界がきてしまうからです。

クオリティが上がれば、クラウドソーシングを辞めても、マネタイズの方法も無限に広がるし、クラウドソーシングとは違う市場で稼ぐことができる。つまり仕事の選択肢が広がるからですね。


フリーになると会社員よりも給与が上がりやすいと言われてますが、これと全く同じこと。クラウドソーシングはスキルアップの道具として使って、ある程度までスキルが上がったら他のところで稼ぐことをオススメします。





クラウドソーシング以外の収入源を探す
f:id:trafalbad:20171005121526j:plain
クラウドソーシングでスキルが上がり、給与に限界を感じたり、他に稼げる方法を見つけたいなんてときは、

・マネタイズの方法を探す
・専門的なバイトを探してみる


などたくさんあります。マネタイズの方法はネットから収益を得る方法がよくある方法ですが、これは特定の媒体に特化した集客や知識が必要であり、よりハードルは上がります。

それよりも理想的なのは、複数の収入源を作ること。クラウドソーシングで副業レベルまで稼げるということは、専門的なバイトでも通用します。ましてクライアントから高評価をもらっていた場合は、現場でも十分通用する証拠。




クラウドソーシングだと仕事が限られたり、単価に上限があったりと何かと不安定。もし時間に余裕がある場合は、バイトや派遣など身につけたスキルが通用する仕事をやってみることもオススメです。

今回はクラウドソーシングで実際に副業レベルまで稼げるようになるステップを紹介してきました。
翻訳とかでも「会社でスキルアップしてから独立」なんて方法がありますが、クラウドソーシングを使っても同じことができます。クラウドソーシングで稼げないという人は、是非参考にしてみて下さい。

VGGNetを参考にしたCNN(tensorflow)でマンション関連の画像を分類してみる

マンション関連の画像をCNNで分類する試みをしてみた。普通のcifar-10のモデルだと正解率が低かったが、VGGNet(Visual Geometry Group Networks)と呼ばれる高性能のCNNを実装しているサイト(すぎゃーんメモ)があったので、試しに実装してみたところ正解率87.8%を達成することができた。今回はそのログとして詳細を書いていこうと思う。

使ったコードはGithubにあげてあります。


目次
1.画像の内訳
2.CNN
3.ラベル毎の正解率



1.画像の内訳

まず、訓練とテストに使った画像の枚数と、その内容の内訳は次の通りだ。


訓練画像→ 合計 25300枚
Label 0
玄関 50, 廊下 50, リビング 150, 寝室 100, クローゼット 100 (増幅して6300枚)

Label 1
キッチン 300 (増幅して6000枚)

Label 2
トイレ 400, 風呂 150, 洗面化粧室 150 (増幅して7000枚)

Label 3
眺望 300枚 (増幅して6000枚)



テスト画像→合計 540枚
Label 0
玄関 30, 廊下 30, リビング 30, 寝室 30, クローゼット 30 (150枚)

Label 1
キッチン 115(115枚)

Label 2
トイレ 80, 風呂 40, 洗面化粧室 40 (160枚)

Label 3
眺望 115 (115枚)

ラベル0〜3までの4種類で訓練画像は25300枚、テスト画像は540枚。
下にラベル毎の画像の一部を抜粋した。96pxで、左からラベル順になっている。

f:id:trafalbad:20170930083205p:plain

元画像は少ないものの、画像をうまく増幅させた(increacing_images.py)。画質に変化を加えるのは原則一回として、画質にあまり影響のない範囲で増幅させた。


元画像→ガンマ変換→コントラスト→.......→左右変換→角度変換

#左右変換
flip_img=[]
for i in seen5000:
    flip_img.append(cv2.flip(i, 1))

#角度変換
rad=np.pi/90 # circumference ratio
# distance to move to x-axis
move_x = 0
# distance to move to x-axis
move_y = 96 * -0.000000005
 
matrix = [[np.cos(rad),  -1 * np.sin(rad), move_x], [np.sin(rad),   np.cos(rad), move_y]]
 
affine_matrix3 = np.float32(matrix)
afn_90=[]
for i in gaikan:
    afn_90.append(cv2.warpAffine(i, affine_matrix3, size, flags=cv2.INTER_LINEAR))

”ガンマ変換”や”コントラスト”は元画像に一回しか適用できない。例えば”ガンマ変換”した画像にさらに”コントラスト”を適用すると画質がやばくなる。

しかし、”左右変換”と”角度変換”は”ガンマ変換やコントラスト”に適用しても画質は変換しないので、単純に全画像数を2倍にできる。最後にこの2つを持ってくることで効率よく画像を水増しできる。

”角度変換”は値を変えれば何回でも使えるので増幅にはおすすめだ。





2.CNN

元々はcifar-10のモデルで正解率を出したが、70%くらいだったので、もっといいのはないかと探していたところ、アイドル画像分類というサイト(すぎゃーんメモ)でVGGNetを参考にしたモデルが紹介されていた。かなりの精度だったので、今回はこれを適用してみた。


結果は87.8%というかなり精度の高い結果。cifar-10のシンプルなものよりも確実に上がっている。もっと層を厚くすれば正解率は上がりそうな気もするけど、精度としては十分なので、これを使った。


ただ唯一違うのはバッチノーマライゼーションを適用してる点だ。別に適用しなくても正解率はほとんど変わらないが、プーリング層だけのモデルと比較して2%ほど正解率が上昇した。

def cnn(x):
    BATCH_SIZE = 128
    def _variable_with_weight_decay(name, shape, stddev, wd):
        var = tf.get_variable(name, shape=shape, initializer=tf.truncated_normal_initializer(stddev=stddev))
        if wd is not None:
            weight_decay = tf.multiply(tf.nn.l2_loss(var), wd, name='weight_loss')
            tf.add_to_collection('losses', weight_decay)
        return var

    def _activation_summary(x):
        tensor_name = x.op.name
        tf.summary.histogram(tensor_name+'/activations', x)
        tf.summary.scalar(tensor_name + '/sparsity', tf.nn.zero_fraction(x))

    with tf.variable_scope('conv1') as scope:
        kernel = _variable_with_weight_decay('weights', shape=[3, 3, 3, 32], stddev=0.1, wd=0.0)
        conv = tf.nn.conv2d(x, kernel, [1, 1, 1, 1], padding='SAME')
        biases = tf.get_variable('biases', shape=[32], initializer=tf.constant_initializer(0.0))
        bias = tf.nn.bias_add(conv, biases)
        conv1 = tf.nn.relu(bias, name='conv1')
        _activation_summary(conv1)
    pool1 = tf.nn.max_pool(conv1, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding='SAME', name='pool1')
    norm1 = tf.nn.lrn(pool1, 4, bias=1.0, alpha=0.001 / 9.0, beta=0.75, name='norm1')
    
    with tf.variable_scope('conv2') as scope:
        kernel = _variable_with_weight_decay('weights',shape=[3, 3, 32, 64],stddev=0.1,wd=0.0)
        conv = tf.nn.conv2d(norm1, kernel, [1, 1, 1, 1], padding='SAME')
        biases = tf.get_variable('biases', shape=[64], initializer=tf.constant_initializer(0.0))
        bias = tf.nn.bias_add(conv, biases)
        conv2 = tf.nn.relu(bias, name='conv2')
        _activation_summary(conv2)
    pool2 = tf.nn.max_pool(conv2, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding='SAME', name='pool2')
    norm2 = tf.nn.lrn(pool2, 4, bias=1.0, alpha=0.001 / 9.0, beta=0.75, name='norm1')
    
    with tf.variable_scope('conv3') as scope:
        kernel = _variable_with_weight_decay('weights',shape=[3, 3, 64, 128],stddev=0.1,wd=0.0)
        conv = tf.nn.conv2d(norm2, kernel, [1, 1, 1, 1], padding='SAME')
        biases = tf.get_variable('biases', shape=[128], initializer=tf.constant_initializer(0.0))
        bias = tf.nn.bias_add(conv, biases)
        conv3 = tf.nn.relu(bias, name='conv3')
        _activation_summary(conv3)
    pool3 = tf.nn.max_pool(conv3, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding='SAME', name='pool3')
    norm3 = tf.nn.lrn(pool3, 4, bias=1.0, alpha=0.001 / 9.0, beta=0.75, name='norm1')
    
    with tf.variable_scope('conv4') as scope:
        kernel = _variable_with_weight_decay('weights',shape=[3, 3, 128, 256],stddev=5e-2,wd=0.0)
        conv = tf.nn.conv2d(norm3, kernel, [1, 1, 1, 1], padding='SAME')
        biases = tf.get_variable('biases', shape=[256], initializer=tf.constant_initializer(0.0))
        bias = tf.nn.bias_add(conv, biases)
        conv4 = tf.nn.relu(bias, name='conv4')
        _activation_summary(conv4)
    pool4 = tf.nn.max_pool(conv4, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding='SAME', name='pool4')
    norm4 = tf.nn.lrn(pool4, 4, bias=1.0, alpha=0.001 / 9.0, beta=0.75, name='norm1')
    
    with tf.variable_scope('fc5') as scope:
        dim = 1
        for d in pool4.get_shape()[1:].as_list():
            dim *= d
        reshape = tf.reshape(pool4, [BATCH_SIZE, dim])
        weights = _variable_with_weight_decay('weights', shape=[dim, 1024],stddev=0.02, wd=0.005)
        biases = tf.get_variable('biases', shape=[1024], initializer=tf.constant_initializer(0.0))
        fc5 = tf.nn.relu(tf.nn.bias_add(tf.matmul(reshape, weights), biases), name='fc5')
        _activation_summary(fc5)

    with tf.variable_scope('fc6') as scope:
        weights = _variable_with_weight_decay('weights', shape=[1024, 256],stddev=0.02, wd=0.005)
        biases = tf.get_variable('biases', shape=[256], initializer=tf.constant_initializer(0.0))
        fc6 = tf.nn.relu(tf.nn.bias_add(tf.matmul(fc5, weights), biases), name='fc6')
        _activation_summary(fc6)

    with tf.variable_scope('fc7') as scope:
        weights = _variable_with_weight_decay('weights', [256, NUMCLASS], stddev=0.02, wd=0.0)
        biases = tf.get_variable('biases', shape=[NUMCLASS], initializer=tf.constant_initializer(0.0))
        fc7 = tf.nn.bias_add(tf.matmul(fc6, weights), biases, name='fc7')
        _activation_summary(fc7)

    return fc7   # shape=(BATCH_SIZE, NUMCLASS)

すぎゃーんメモではアイドル画像という単体の物体に適用していたが、今回はマンション関連の画像を対象にしたところがキー。どこが違うのかというと、マンション関連の画像は結構いろいろな関係ない物体が写っているので、

トイレ=トイレ
キッチン=キッチン

とキレイに分類できないところで、CNNも上手く分類できないのではないか心配だった。

しかし、ラベル設定を適切にして、ラベルを貼る人間がこれは「キッチンだな」とか「室内やな」みたいに確信を持って言えるほど混乱しない画像なら、CNNでも高い正解率は叩き出せるっぽい。

各ラベル毎の正解率は次にまとめた。





3.ラベル毎の正解率

各ラベル毎の正解率は以下の通り


Label 0 96.1%

Label 1 77.3%

Label 2 92.5%

Label 3 93.9%

トータルの正解率は87.8%だけど、ラベル毎の正解率を見てみるとやっぱり、キッチン画像がかなり正解率が低い。





→理由を考えてみる


室内 (Label 0)
→とりあえずベットとか天井とかあるので、室内とはわかる

キッチン (Label 1)
→基準が「コンロと水面台が写ってること」なので、それ以外にもいろいろ写ってるとわかりにくい

トイレ (Label 2)
→便器があればとりあえずわかる

眺望 (Label 3)
→景色の一部が画像の大半を占めているので、多分一番わかりやすい



キッチンは「コンロと水面台が写っている」を基準にした。しかし、他に別なものが写ってる確率が高いキッチンは、ラベル0の”室内”にカウントされてしまうっぽい。

下の画像はキッチンの画像だけど、人間でも「室内」といわれれば、そう見えなくもない感じなので、機械にも分類しにくいんだなと考えられる。


f:id:trafalbad:20170930141735p:plain



これが多分、正解率が下がった原因。ここは明確にキッチンとわかる画像を選べばいいんだけど、汎用性が高くないと意味がない。結局、慈悲は無粋だなというわけで、ちょっとわかりにくいのを配置してみたら結果的に正解率が微妙になった。


今回はマンション関連の画像を分類してみた。なんかいろいろとCNNの分類例はある。

けど、動物や顔だったりの単体の物体ばっかりで、鍋料理みたいにいろいろ入ってるマンション画像を分類する例はあまりないのではと思った。けどまあ、適切にラベル設定をして、ラベル付する人間でも迷わない範囲の画像ならCNNでも高い精度は出た。




*one-hot表現について
参考にしたすぎゃーんメモでは損失関数のところでone-hotを適用してたけど、cifar-10形式では特に必要ないらしい。ただしラベルは0から始めないといけないらしく、出力層(NUMCLASS)が4でもラベルは0〜3にしないといけない。これで一回ハマったので、注意。



本当はDCGANでデータセットを作ってから分類させようとしたんだけど、諸々の事情でCNNを先に試しました。DCGANは上手くいったらまた別記事で書く予定。

一週間7000円以内で安い食材を使った飽きがこない節約メニューまとめ【一人暮らし用食材】

今、将来のインフラスキルを身につけるため修行中で、結構収入が限られているため、節約生活をしています。そこで安くて、旨い、かつ飽きがこないという内容で、7000円以内で済む一週間のメニューをまとめておきます。
約1年半かけて思考錯誤したメニューなので、妄想上のメニューではないため、効果のほどは個人的に確認済みです。

目次
・今回のメニュー配分の特徴
・一週間分の食料一覧
・一週間分の献立とメニュー解説

f:id:trafalbad:20170928210859j:plain


今回のメニュー配分の特徴

今、ノマドライフという生活を送りたいので、インフラとなるスキルを得るためにフリーランスをしながら働いてます。

しかし、息抜きは必要で、趣味とかでお金が結構飛ぶ。そういうわけでどうしても出費を抑えなければならない。あと数ヶ月でこの生活も目処がつくんですが、約1年半かけて実行してきた「なるべく安く、旨く、しかも飽きがこないメニュー」というのを記録として残しておこうと思ったわけです。




「多分、安いメニューは思いつく。けど、毎回同じ食材だと飽きがくるから、外食は増えるから結局意味ない」

なんてことありませんか?自分もその泥沼に陥ったので、なるべく「安く、飽きがこない食材」で一週間分のメニューを思考錯誤して作ってきました。

総額にして約7000円。一週間で28000円なわけで、食費としては十分節約と呼べる範囲内だと思います。

もちろんたまには発散として外食に行きます。が、それは人と遊んだり、贅沢をするときに限定してます。平日はなるべく今回紹介するメニューを品を変えて食べ続けてきました。

今回紹介するのはあくまでそういった類のメニューの1つとして、参考にしてもらえたらと思います。スーパーを回って安い食材で、旨いメニューを考えるといろいろ思いつくし、面白い。





一週間分の食料一覧


米(13合)あきたこまち×1 1000円
パン8枚入り×5 80×5=400円
×3 140円×3=420円
肉(一食分)×1 298円
卵6こ入り×1 150円
チャーハンの素×1 110円
おかずになる缶詰×4 130×4=520円
野菜-チップレタス×2 70×2=140
野菜-100円サラダ×2 200円
ソーセージ×4 228×4=612円
カップ麺(一平ちゃん大盛り)×1 200円
炊き込みご飯の素×2 245×2=490円
スライスチーズ×1 262円
おかず用惣菜×8 70×8=560円
キャノーラのサラダ油×1 394円
ヨーグルト×1 140円

合計総額(税込) 約6300円

価格参考サイト→ヤフーショッピング

醤油、ソース、マヨネーズ等の調味料は1ヶ月以上長持ちするので、ここではすでに買ってあるものとしてカウントしてません。だいたいの食料は、ヤフーショッピングで手に入るもの、地元のスーパーなら手に入るものを選んであります。


ここでメインの主食としてるのは
・米
・パン

の2つです。

f:id:trafalbad:20170928210941j:plain


米はおかずメインで食べ、パンはチーズやウインナー、惣菜なんかを挟んで食べます。

一週間で考えると
米→5日
パン→2日

です。もちろんあくまで配分は自分の好みで変えます。この2つはまとめ買いしておくと安いので、メニューのメイン(主食)として食べるのがお腹を満たし、かつ食費を節約するポイント。主食が決まってると、無駄にいろいろ買わなくて済みます。




一週間分の献立とメニュー解説

それでは上のメニューをもとに一週間分のメニューを作ってみます。わかりにくいところは解説いれてます。


1日目 主食-米
朝 ソーセージ ヨーグルト
昼 缶詰
夜 魚 野菜

→主食は米なんでもちろん米は炊きます。ソーセージでもチーズ入りソーセージとか、トッピングでマヨネーズをかけるだけでも充分美味しい。缶詰は単体でもおかずになるものを買って下さい。

おかずのトッピングとしてマヨネーズや醤油などの調味料はあると、グッとバリエーションが広がります。野菜は健康のために入れてあります。



2日目 主食-米(炊き込みの具使用)
朝 ソーセージ
昼 カップ麺
夜 魚 野菜

→この日は、炊き込みの素を使ってお米を炊きます。食がすすむし、米ばかりだと飽きがくると仮定して、昼はカップ麺にしました。魚はもちろん焼きますので、加熱用の魚です。



3日目 主食-米
朝 ソーセージ
昼 惣菜
夜 チャーハン(卵使用) 缶詰

→チャーハンの素を使うので、卵を使います。惣菜は単品でも充分おかずになります。



4日目 主食-パン
朝 卵(目玉焼き)
昼 ソーセージ チーズ
夜 惣菜 ハム

→主食はパン。基本的にパンに挟んで食べます。チーズはパンに挟んで使う。チーズは貴重なので、あまり無駄つかいしないことがポイント。朝のメニューの目玉焼きは卵を焼いて作り、パンに挟み、サルサソースなんかをぶっかけて食べます。




5日目 主食-パン
朝 卵(目玉焼き)
昼 ソーセージ
夜 チーズ 惣菜

→これも4日目と同じですね。




6日目 主食-米(炊き込みの具使用)
朝 ソーセージ
昼 缶詰
夜 肉 野菜

→2日目と同じで炊き込みの素を使ってます。夜のメニューの肉はパックに入ってるものを買いますので、油で焼いて調理。調味料はお好みで。




7日目 主食-米
朝 缶詰
昼 ソーセージ
夜 チャーハン(卵使用) 野菜

→これも3日目と同じです。

食材の価格参考サイトはヤフーショッピングですが、米やその他の食材の相場は、高級なものでなければほぼ同じ。なので、他の店で代用可です。




飽きがこない工夫

同じ料金内であれば、飽きがこない工夫はできます。例えば


・主食をパスタにする
・トッピングをから揚げとか冷凍食品などにする
・かける調味料の種類を増やす

要は考えよう。個人的に凝ったのは「主食をメニューのメインに置いてる」ところですね。


主食を決めずにいると、腹が満ちるまで手当たり次第買ってしまう傾向があるので、メニューの主食を決めておくとだいぶ安くなります。あと繰り返しですが、サブのメニューは工夫次第。

あと食材は基本買いだめです。一週間分買っておくと食費の管理がしやすいと思います。


今回は少ない出費で、飽きがこない、長続きするメニューを紹介しました。ずっとこんな生活が続くのは嫌ですが、スキルとかを得る修行?期間はどうしても出費を抑える必要があります(というか普段から抑えるべきですが)。今回はその一端として安く済むメニューを紹介しました。

機械学習(ディープラーニング)画像認識・処理のための画像データ数値化&増やし方

今回は機械学習ディープラーニング)で画像データを収集し、それを増やす方法について書きます。

最終的にはDCGANで何かしら作成することを考えており、今回はDCGANのデータセットとして「より少ない手間で、よりたくさんのデータを作成する」をモットーに、画像データ収集法とそのデータを増やす方法(人工データ合成)をまとめておこうと思います。

目次
・画像データ収集方法
・画像のリサイズとラベル付け
・画像データを増やす方法

f:id:trafalbad:20170705152452j:plain



画像データ収集方法
画像のURLを集める
まず画像を集めるために、どっかしらのサイトからwebスクレイピングで画像のURLを収集します。一般的なサイトから画像のURLを取得する方法で、方法はいくつかある。
1.手作業で集める
2.サイトからスクレイピングする
3.Google Custom Search APIで画像を取得する

自分は手作業で集めました。スマホでポンポン保存して、AirDropでPCに送った。2のサイトからスクレイピングは限定的なので、3のGoogle Custom Search APIでのGoogle検索した画像をスクレイピングする方法がメジャーなようです。


ただ画像に著作権がある場合は、慎重になった方が良さそうです。

今回はスクレイピングした画像のURLを取得するケースを考えます。URLから画像を一括で取得するので、フォルダにURLの一覧を保存して、まとめておきます。



URLを画像に戻す
次はターミナルコマンドでフォルダのURLを画像に戻します。ターミナルから、

ls  
cd [保存場所]

でフォルダの場所に移行したら、下記のコマンドを入力します。

cat フォルダ名 | wget -I -

これでフォルダ内のURLが画像に変換され、downloadsに保存されます。一枚一枚保存されますので、新たなフォルダを作って保存し直します。


画像のリサイズとラベル付け


macで画像のリサイズ
次は画像の大きさがバラバラなので、縦、横を同じの正方形にして、好きなサイズにリサイズ。

今回は見やすさも考えて、128×128pxにしました。opencvpythonでリサイズもできますが、mac OSにフォルダ内のデータを一括してリサイズする機能が付属していますので、こちらを使います。

詳しくはこの記事を参照
これでフォルダ内の画像は一括してリサイズされます。



画像のラベル付けについて
画像にラベル付けする作業はとても面倒くさいので、それを簡単にする方法がいくつかあります。

方法1.ruby on railsのアプリを用いた方法
ruby on railsで画像を見ながらラベルをつけるアプリを作成しました。

trafalbad.hatenadiary.jp


画像を確認しながらラベル情報を入力するというのは普通は無理なんですが、それ用のrailsアプリを作った。

画像収集のレギュラーな方法としては、webスクレイピング→ラベル付けの順番でやるのが普通だと思います。


方法2.DCGANで同一カテゴリの画像を生成する方法
これはイレギュラーな方法です。今度試そうと思ってるんですが、DCGANでラベルのカテゴリ毎の画像を作成させる方法です。ラベルの種類が10個あったら、カテゴリ毎にDCGANに画像(つまり10種類の画像)を生成させ、データを増やそうと言うわけです。

まず少量のデータセットをカテゴリ別に作り、次にDCGANでカテゴリ別の画像を大量に作成させます。




こちらは実際にやってる人は見たことないんですが、DCGANの使い方としては非常に有能ではないかと思ってます。なぜなら、ラベル付けも必要ないし、データ収集も少量で済むからです。

本記事ではこの方法は触れませんが、別記事でDCGANの活用方法としてデータセットを増やすことについて触れたいと思ってます。



画像データを増やす方法
画像のデータが集まったら画像を増やしていきます。具体的にはopencvで左右反転させたり、色彩を淡くしたりする方法。画像をベクトルに変換することで、機械学習のデータとしては十分、学習データに値するものになります。


opencvで画像を数値化
まず、opencvのインストール(方法はこちらを参照)。フォルダ内の相対パスを取得して、画像を数値に変換します。

from PIL import Image
import os
import _pickle as cPickle
import os
import sys
import pickle
import numpy as np
import cv2, matplotlib
import numpy as np
import matplotlib.pyplot as plt

path1="フォルダパス"
images = os.listdir(path1)#画像の読み込み
img_batch=[]
for i in images:
    img_batch.append(cv2.imread(path1+'/'+i))#フォルダ内の画像を数値化

今回は変換した画像は300枚。各画像は(128, 128, 3)の形式です。画像を表示するときには、そのまんまmatplotlibで表示できます。



画像の増やす
変換した画像300枚を元手に画像を増やして行きます。今回はQiitaの画像水増しテクニックを使います。opencvで淡くしたり、することもできますが、画質が粗くなるケースがあるので、画像の質を保ちながら画像を増やすテクニックを使います。

方法はねずみ算式に増やしていきます。まず素画像300枚に反転をかけ、600枚に増やします。次に600枚にコントラスト調整をかけ、1200枚にします。この方法でねずみ算式に増やし、200枚の画像を、5000枚に増やすことができました。

本当はもっと増やせたんですが、128pxだと見易さの兼ね合いから平滑化など、の処理は省きました。
画像が見やすいものならQiitaの記事の通りにやって次のようにねずみ算式に300枚の画像を18000枚に増やして問題ないはずです。

コントラスト調整(300×2)
Salt&Pepperノイズ(600×2)
ガンマ変換(1200×2)
平滑化(2400×2)
ガウス分布に基づくノイズ(4800×2)
反転(9600×2)

最後に「反転」をかけるのがコツです。こうすることで、より多くの画像の鮮明度を保持することが可能になります。
ちなみに「角度変換」をかけることで「反転」と同じ効果が得られます。「角度変換」は値を変えると何回も使えるので2倍に増やすには本当に便利。

rad=np.pi/220 # 角度変換
# distance to move to x-axis
move_x = 0
# distance to move to x-axis
move_y = 96 * -0.00000000000000006
 
matrix = [[np.cos(rad),  -1 * np.sin(rad), move_x], [np.sin(rad),   np.cos(rad), move_y]]
 
affine_matrix3 = np.float32(matrix)
px_size=(96,96)
afn=[]
for i in seen10000:
    afn.append(cv2.warpAffine(i, affine_matrix3, px_size, flags=cv2.INTER_LINEAR))


matplotlibで64枚を可視化してみる

tensorflowでも複数の画像をまとめて表示する方法があります。今回はそれを真似てnumpyとmatplotlibを使って可視化。


今回は元画像64枚一気に表示します。



f:id:trafalbad:20170930141735p:plain


今のところはどんな画像かを確認するためのもの。なので、そんなに凝らなくていいと思ったので64枚一気に表示させてみました。

iti=t_image[160:230]
col=8
rows = []
for i in range(8):
    rows.append(np.hstack(iti[col * i + 0:col * i + col]))
plt.imshow(np.vstack(rows))
plt.show() #淡くしたの64枚可視化



今回は画像のデータを収集&増やす方法を書きました。まあopencvを使えば簡単なのですが、案外まとめてあるサイトがなかったのでまとめました。


この画像を元にDCGANで何かしてみようと思ってます。特にデータセットを増やすことができたら、かなり有用性があるのではと思いますが。そこら辺も含めてDCGANについてはまた別記事で書くつもり。

医薬翻訳で使える英文フレーズ18選-英訳・日英翻訳例文集

日英翻訳(英訳)は英借文とも呼ばれるように、どれだけ良質の英文を覚えてるかが重要になる。特に医薬翻訳のような定式的な文章には、借文の効果はかなり高い。
参考書の英文もいいが、今回は市販では出回ってない翻訳試験の”TQE”と、翻訳学校のテキストの中から「日英翻訳に使える秀逸な表現」が載ってる良質な英文をまとめていく。

英訳する際の表現の幅を広げるのに使えるはずだ。

f:id:trafalbad:20170703143530j:plain


前置詞形から始める文章

1

For effective treatment of chronic pain in cancer patients with analgesics, physicians must follow the basic principles shown in Table 4

がん患者の持続性の痛みを鎮痛薬によって効果的に治療するには、表4に示す基本原則を守らなければならない


文頭を前置詞から初めて、主文を後につなげる表現。主語を節約できるので、極めて効果的だ。forだけでなく、現在進行系、withなど、文頭で使える前置詞は多い。こうした文頭を前置詞から始める表現はかなり使えるので、ぜひ覚えておきたい。




命令文から始まる文

2

Ensure that measures to prevent the adverse effects caused by analgesics are put in place

鎮痛薬の副作用に対する防止策を確実に実施する

よく、マニュアルなどでは「〜する」と主語なしの文章があるが、こういうときは命令文を使う。また主語がない事実の伝達にも命令文は使えるので覚えておきたい。




非制限用法の有効活用

3

Aspirin and other NSAIDs have a peripheral analgesic effect by suppressing the biosynthesis of prostaglandins (PGs), which are pain-inducing substances produced at sites of tissue damage caused by disease or injury

疾患や外傷などによって組織損傷を受けた局所に発痛物質のプロスタグランディン(PG)が生産されるので、アスピリンや非ステロイド性抗炎症鎮痛薬がPGの生合成を抑制することにより、末梢受容レベルでの鎮痛作用を示す



これは「PG」に上手く関係代名詞の非制限用法を用いてある例。

日本語で表現すると長くなってしまう文も関係代名詞(非制限用法)で上手くまとめてあるのポイントに注目したい。よく咀嚼して訳すテクニックを盗もう。



接続詞を上手く用いた文

4

Patients generally like this method because it does not cause excessive sweating while providing a stable analgesic effect

この方法も、発汗が少なく、鎮痛効果が安定しているので、患者に好評である



文中の「この方法」は前文で命令形等で具体的に示すのが普通だ。この文ではbecauseやwhileなど、接続詞をとても上手く使って、表現している。

接続詞として使われるものは限られている。医薬分野では参考書などで体型的にまとまっているので、まとめて知っておきたい。


上手く事実系列で情報を伝達してる文

5

When metabolized in the body, 10% of codeine phosphate is converted into morphine, thereby producing its analgesic effects

体内で代謝され1/10がモルヒネとなり、効果を発揮する


「Aのあと、BしてCになる」という風に、A→B→Cと物事が順番に起こっている文を「時時系列文」というが、この文章はその表現がとてもそれが上手い。

この文の他にもAfter A, B, C and D (A〜Dは主語動詞を含む文)のように使う例もある(後述)。


日本文の1文を英語では2文で表現した例

6

At a dose of 30 mg, oral codeine has an analgesic effect almost equivalent to that of 650 mg of aspirin. The combination of the two medications produces an analgesic effect equal to or greater than 60 mg of codeine

経口コデイン30mgはアスピリン650mgとほぼ同等の鎮痛効果があり、両者を併用すると、その鎮痛効果はコデイン60mgと同等ないしそれ以上となる


この文章では、日本語では1文だが、英語では上手く2文で表現している。

日本語で長い文章を英語では、句読点で区切り、2文で書くことも多いので覚えておきたい。


共通項を上手く使った文章

7

Buprenorphine should generally be administered via the rectum to adult patients at a dose of 0.4 mg in postoperative use and at a dose of either 0.2 mg or 0.4 mg for treatment of a variety of cancers

通常、成人には、術後使用においてはブプレノルフィンとして1回0.4mg、各種がんにおいてはブプレノルフィンとして1回0.2mgまた0.4mgを直腸内に投与する


・「『通常、成人には、術後使用においては』、『を直腸内に投与する』」の部分を共通項
・その間の表現をandで繋げる部分
に分けて、上手く表現している。

この文のように「共通項の部分」と、「andで繋げる部分」を上手く分けて表現している英文は借文にもってこいだ。


「the fact that〜」を使った文章

8

The fact that the average number of reported cases per month is consistently about 50 suggests that the situation cannot be ignored in clinical practice

毎月平均50件前後が恒常的に報告されており、臨床現場で無視できない状況となっている事が示唆される

「SVであることはVである」という風に、「主語動詞を含んだ文章を主語にする」表現は珍しくない。

この文はそれを「the fact that〜」で上手くまとめている。



時時系列で情報を伝達している文その2

9

After a β(beta-)lactam antibiotic has attached to the penicillin-binding protein, the transpeptidation reaction is inhibited, peptidoglycan synthesis is blocked, and the cell dies

Bラクタム薬がペニシリン結合タンパク質に結合すると、ペプチド転移反応が阻害され、ペプチドグリカンの合成が阻害されて菌体が死滅する

こちらは、5と同じように時時系列の表現がとても上手い文だ。

事実系列の表現方法はたくさんあるが、5と9で紹介した2つはかなりよく使うので、紹介した。


無生物主語

10

This drug is generally well tolerated

本剤は一般に忍容性が良好である


医薬翻訳の無生物主語の文で、よく見かける表現。無生物主語は英語特有の表現なので、何を主語にして、動詞に何を使うかをよく考えなければならない。この文ではそれがよくわかる。
この文章は「本剤」を主語にして、「良好である」を動詞にした例。




減少値表現

11

The intravenous injection of the drug decreased the patient's urine specific gravity by 0.013 to 1.011

薬剤の静脈注射によって、患者の尿比重は0.013低下し、1.011となった


「0.013低下し、1.011となった」をby, toで上手く表現した文。このように表現が英語特有のものも多いので、見かけたら定期的にストックしておきたい。




分詞構文

12

The results of urinary protein examination indicated 3+ in the acute nephritis patients, compared with negative in the healthy humans

尿検査の結果、急性腎炎患者の蛋白は3+であったのに対し、健常人では陰性であった



分詞構文は接続詞を用いず、かつ主語を省略できるので、簡潔な文章を書きたいときは必須だ。この文章は平易ながら、分詞構文が使われているので参考にしたい。


形容詞、動詞を4つ使った連続文

13

Myocardial infarction results from occlusion or sudden blood flow decrease in the coronary artery

心筋梗塞の原因は、冠状動脈の閉塞または急激な血流減少である


「急激な血流減少」を「sudden blood flow decrease」と上手く表現している。

形容詞と動詞を並べる表現は多いが、この文は4つの単語を上手くひとまとめにしている。是非英訳の際に真似したい表現。



関係代名詞の代わりにカンマ挿入の修飾文

14

Coronary heart disease, frequently accompanied by hypertension, is responsible in more than 50 percent of cases

冠動脈性心疾患は高血圧を伴っていることが多く、50%以上の症例の原因となっている

普通なら関係代名詞を使うところだが、主語「Coronary heart disease」の後で上手くカンマで挟んで修飾している。

関係代名詞を用いる代わりに、「カンマを挟んで名詞を修飾する表現」は英訳では欠かせない。



関係代名詞を上手く使った例

15

Like enterococci that do not produce penicillinase, E.faecalis strains that produce penicillinase are not susceptible to antistaphylococcal penicillins

ペニシリナーゼを産生しない腸球菌と同様、ペニシリナーゼを産生するE.faecalis株は抗ブドウ球菌ペニシリンには感受性を示さない


これは文中に関係代名詞を2つ用いている文。関係代名詞は多用すると混乱を招くので、使うなら1文につき2つに留めておきたい。



resulting in、などの、また、等の頻出表現を用いた文

16

The covalent alkylation of DNA is mutagenic and carcinogenic, resulting in long-term serious complications including detrimental effects on spermatogenesis and oogenesis, as well as predisposing to the development of secondary leukemias

DNAの共有結合形成によるアルキル化は突然変異誘発性·発癌性であり、精子形成や卵子形成を障害するなど長期にわたる重篤な合併症を誘発し、また、二次性白血病を易発症する


文章の途中で「resulting in、including、as well as」の表現に注目してほしい。

これらは文章をつなげる上でかなり頻繁に使われる。特にresulting inは結果を表す際に接続詞の代わりに使えるので、覚えておくだけで表現の幅が大きく変わる。

文章で便利な接続表現があったら是非ストックしておこう。


toで時時系列を表現した文

17

Gene therapy is essentially the transfer of nucleic acids (DNA, RNA) into target cells to correct or disrupt a pathologie process

遺伝子治療は、本質的に、核酸(DNA, RNA)を標的細胞に導入して、疾患のプロセスを修正または阻害することである



翻訳の泉でも紹介されているが、toは「〜するため」だけではなく、「〜して、〜した」という風に時系列の表現に使われる。

ここでは「導入して〜阻害すること」といった時系列の表現に使われている。英訳の際には覚えておくとかなり便利。



コロンを用いた事実列挙

18

To date, three separate strategies have been pursued: replacement and knockout gene therapy, suicide gene therapy, and immunomodulatory gene therapy

現在のところ、置換およびノックアウト遺伝子治療、自殺遺伝子治療、免疫調節遺伝子治療の3つの戦略が進められている


コロン(:)は事例を列挙する際によく使われる。ここでは「3つの戦略」が上手くコロンの後に並んでいるのがわかると思う。

コロンは使い方を覚えてるかおくとかなり便利だ。医薬翻訳ではカッコ()やセミコロン(;)とともに多用される表現なので、是非覚えておきたい。



今回はTQEや翻訳学校のテキストから英訳で頻繁に使われる表現を載せた良質の英文を選んだ。英訳では例文を覚えておくだけで、スピードも表現の幅も全然違うので、是非借文用の英文をストックしておきたい。

医薬翻訳の必要な英文表現は下記の本にかなり詳しく書いてあるので、興味のある方は是非手にとってほしい

ruby on railsで機械学習用の画像にラベル付けするアプリを作ってみた

普段は機械学習を学んでいてpythonを使っていますが、データ画像にラベル付けをする作業がめんどいのでラベル付け専用のアプリをruby on railsで作成しました。

rails初心者ですが、Githubオープンソースから自力でアプリを動かせるまでにしたこと、またそれをいじくった部分のアプリのコードを紹介しようと思います。

目次
・アプリの概要
・実際にアプリを作ってみた
・いじくった部分のコード

f:id:trafalbad:20170630095800j:plain



アプリの概要
今回作ったのは、機械学習用のデータセット(特に画像)にラベル付けするためのアプリです。機械学習ではデータにラベルをつけていくんですが、画像の場合、画像を見ながらラベルをつけるという作業が非常に面倒くさい。

そこでアプリで画像を見ながら、ラベルを入力できるものを作成しました。

参考ソースコードhttps://github.com/ryo813/tegaki_recog


f:id:trafalbad:20170630095817p:plain

今回アプリを作るまでにやったこと


学習
ほぼオールマイティの人気サイト「ドットインストール
ruby入門(全26回)

・ruby on rails4入門 (全28回)
をやりました。一通り動画を見た。その後、アプリを作りながら、ルーティングやコマンドなどわからないところは復習する感じで何度も見ました。基礎的なことがよくわかるので、オススメです。あと書籍が一冊手元にあれば十分。自分が使ったのはこれ





パーフェクト Ruby on Railsもオススメらしいので、どちらか1つ手元にあれば、後はネット上の情報で十分です。



使用環境
ruby 2.4.0
ruby on rails5.0.0
OS:mac book pro
DB:SQlite
環境:cloud9

htmlの代わりにslimを使いました。(インストールはこちらを参照)



コードの役割理解

・各モデルの役割の理解
モデルが3つ(Image、TmpImage、TextBlock)あるので、その役割を理解。

・controllerのアクションの理解
controller内のアクションを解析すれば、そのアプリがどのようにして動くのか知れるので解読

・ルーティングの理解
名前空間とか、結構突っ込んだ内容だったので、ルーティングも必須

・viewsの理解
controllerの内容を反映するコード。メイン画面とかダウンロード画面など理解しておくのに必要


だいたいmodel、controller、views、ルーティング(routes.rb)の理解は鉄板ですね。逆にこれさえわかれば、後は雛形作ってエラーがでたら対処していけば作れるでしょう。



実際にアプリを作ってみた
実際にGithub内のコードから作ってみました。ただ欲しいのはラベル情報だけなので、画像のxとy成分のラベル情報はいらない。そこでTextBlockのx1、x2、y1、y2に関するところは削ってあります。

Dir.foreachでディレクトリから画像を持ってくると順番通りにならない。そこで画像の名前を1から始まる番号順に変えます。そうすることで、先頭から順番に表示できるように改良してあります。

*まず始めに設計図を作る
modelのテーブル、カラム、データ型はきちんと区分けしておく必要があります。設計段階でこれらがおざなりになっていると、後で誤作動が起きても「手遅れ」なんてことも多いです。



実行手順

あとは作るだけです。簡潔に手順だけまとめるとこんな感じ

1.gemfileでtherubyracerとslimをbundle install

2.modelの作成

3.controllerの作成

4.ルーティングの整理

5.viewsをいじる

6.mkdirでcontrollerとviewsにimageディレクトリを作成してimageと紐付け

7.asset内に画像を入れる


ここまでで、一通りアプリ自体は完成。
あとは
image/resetにアクセス→ラベル情報入力→image/downloadにアクセスでダウンロード→完了

で出来上がりです。
f:id:trafalbad:20170630113344g:plain

rails初心者だけど、かなり基礎から学べたので、オープンソースのみで動くアプリを作ってみると得られるものはデカイです

自分は2週間ぶっ続けでやり通しましたが、1ヶ月分のインプットとアウトプット量の学習ができた感があります。
面倒くさいけど、オープンソースから実装してみるというのは、費用対効果として非常に有益ではないかと思います。


いじくった部分のコード
3つのmodel

#Image
filename: string
is_complete: boolean
is_none: boolean

#TextBlock
image_id: integer 
text: string
image: references

#TmpImage
filename: string 
image_id: integer
#projects_controller.rb
class Image::ProjectsController < ApplicationController
    
    def index
      tmp = TmpImage.first
    @image = tmp[:filename]
    end
  
  def register
    pos = params[:pos]
    text = TextBlock.create(
      image_id: TmpImage.first[:image_id],
      text: pos[:text])
    redirect_to root_path
  end
  
  # *** 前の操作を取り消すメソッド ***
 def delete
    TextBlock.last.delete
    redirect_to root_path
 end
 
 # *** 次の画像に移動するメソッド ***
  def next
    # 現状の画像を完了に
    tmp = TmpImage.first
    image = Image.find_by(filename: tmp[:filename])
    image.update(is_complete: true)
    # 新しい画像に切り替える
    fily = Dir.foreach("app/assets/images/").to_a
    files=fily.sort_by{|x| File.basename(x, File.extname(x)).to_i}
    files.each do |file|
      next unless %w(.jpg .png .jpeg).include?(File.extname(file))
      # ファイル名が既に書き込まれていないか確認
      db_files = Image.where(filename: file)
      if db_files.empty?
        image = Image.create(filename: file)
        TmpImage.first.update(filename: file, image_id: image.id)
        break
      end
    end
    # トップページへ遷移
    redirect_to root_path
  end
  
  # *** ダウンロードページ ***
  def download
    respond_to do |format|
      format.html
      format.csv do
        filename = 'recognition_result'
        headers['Content-Disposition'] = "attachment; filename=\"#{filename}.csv\""
      end
    end
  end


  # *** リセット(初期化)用のページ ***
  def reset
    # データベースの中身を削除する
    Image.delete_all
    TmpImage.delete_all
    TextBlock.delete_all
    # 最初の画像を指定する ※ サンプル画像以外の場合はこちらを書き換え
    image = Image.create(filename:"00asfs1.jpg")
    TmpImage.create(filename:image[:filename], image_id: image.id)
    redirect_to root_path
  end
end
#download.csv.ruby
require 'csv'
CSV.generate do |csv|
  field_names = %w(id filename text )
  csv << field_names
  TextBlock.all.each do |t|
    record = field_names.map do |field_name|
      case field_name
      when "filename"
        Image.find(t.image_id).filename
      else
        t[field_name]
      end
    end
    csv << record
  end
end.encode('CP932')
#index.html.slim
div.top-title
  div.left-button
    = link_to "前の登録を取り消し", image_delete_path, method: :delete, data: {confirm: "取り消しますか?"}, class: "btn btn-danger"
  div.right-button align="right"
    = link_to "次の画像へ", image_next_path, method: :post, class: "btn btn-warning"

div.float2
  div#main-image
    = image_tag @image, id:"image, :size => '100x100'"
    
div.float2
  div.form
    = form_for(:pos, url: image_register_path, method: :post) do |f|
      div.form-group
        = f.label :text, "3.テキスト"
        = f.text_area :text, class:"form-control", style:"height: 200px;"
      div.form-group
        = f.submit "登録", class:"btn btn-primary"

    div
      = link_to "リセット", root_path
      
javascript:
  count = 1  // ボタンで使うカウンター
  document.getElementById( "main-image" ).addEventListener( "click", function( e ) {
     // マウス位置を取得する
     var mouseX = e.pageX ;  // X座標
     var mouseY = e.pageY ;  // Y座標

    
  } ) ;
#routes.rb
Rails.application.routes.draw do

namespace :image do
    post 'register' => 'projects#register'
    post 'next'     => 'projects#next'
    get  'reset'    => 'projects#reset'
    get  'download' => 'projects#download'
    delete 'delete' => 'projects#delete'
  end
root 'image/projects#index'
end 

バドミントン上達のためには基礎スキル(基礎打ち、フットワーク、体幹)のマスターが徹底的に大事な理由をまとめていく

バドミントンに限らず、すべてのスポーツの上達に基礎のマスターは欠かせない。今回はバドミントンの上達方法としてバドミントンの基礎スキル(基礎打ち、フットワーク、体幹)について、なぜこれらを身につけることが重要なのかをまとめておこうと思う。

目次
バドミントンが上手くなるためには
バドミントンの基礎スキル習得方法
応用技について

f:id:trafalbad:20170624212418j:plain

バドミントンが上手くなるためには

バドミントンは限られたコート上で、シャトルを打ち合う競技だ。
ここで、バドミントンの無敵のプレイヤーを想像してみよう。

それは、ショットがミスなく打てて、相手がどこに打っても瞬時に動けて、安定して基礎打ち同様のショットを狙った場所に打てる人だ。(マンガ好きなら、暗殺教室の殺せんせーみたいなキャラが、バドミントンをやってることを想像してみるとわかりやすいかも)。

しかし、人間である以上、どんなショットにも対応するのは実際には不可能だ。しかし、実際には少しでもその理想に近づけたプレーをしたいところ。

これを考えたとき、バドミントン上達のために習得すべき基礎スキルは

・フットワーク
・基礎打ち
体幹

の3つだ。

バドミントンはこの3つができれば、確実に上手くなる。たいていの応用技もこなせるようになるだろう。逆にこの基礎スキルがある人とない人とでは、実力に天と地ほどの差がある。



バドミントンの基礎練について


勉強でもスポーツでもすべてに共通する汎用的な上達方法は、半年間基礎スキルを辛抱強く続けること
参考「年収10倍アップ勉強法


自分の体験談だが、バドミントンでは上手い人の技を真似ようとしても、それを実現できるだけの基礎スキルがないと上手くいかなかった。

また初心者で伸びがメッチャ早い人がいたが、基礎練をひたすらしていたし、部活の一番上手いレギュラーは基礎打ちを高校のときにひたすらやっていたらしい。

勉強でもスポーツでも、短期間で急激に伸びる人に共通することは、基礎を辛抱強く(3ヶ月〜半年)続けたことだ。

繰り返すが、バドミントンを上手くなるためには、基礎打ちがしっかり打てて、どこでも素早く動けるフットワーク、安定して基礎打ち同様ショットを打てる体幹が身についていることだ。バドミントン上達のためには、この基礎スキル(基礎打ち、フットワーク、体幹)を身につけることに専念しよう。




バドミントンの基礎スキル習得方法

基礎打ち

基礎打ちは練習でやる始めのウォーミングアップの打ち合いだ。
ドライブ、ロブ、クリア、ドロップ、プッシュ、スマッシュ、スマッシュレシーブ、ヘアピン.etc。

各打ち方の詳細な学び方は
youtubeで動画を見る
・本を読む
・コーチに教えてもらう


方法がある。

本はバドミントンのスキルが体系立ててまとめてあるので、素早く全体像を知りたいときにオススメだ。個人的にオススメなのはこの本。

基礎打ちの打ち方や、フットワークの動き方など、初心者に必要な知識が丁寧に書いてある。

基礎打ちの練習機会は相手がいないと難しい。なるべく普段の練習のときからヘアピンならヘアピン、スマッシュならスマッシュを基礎打ちの項目ごとに確実にミスなく打てるようにしよう。
手首の回内などの細かいテクニックはミスなく打てるように試行錯誤してる間に気づくし、自然に身につく。大事なのは基礎打ちの項目ごとに確実に打てる技術を身につけることだ。

個人的な基礎打ちのコツは目線を球の軌道に合わせる「直視力」と、飛んでくるシャトルに対して的確にラケットの面をつくることが参考になった。

他にも手首、回内、バランスなど各ショットを意識した手の動きは絶対に必要になってくる。練習のときは、とにかく基礎打ちがミスなく打てるようになることに専念しよう。


体幹

体幹は動いた状態、つまりフットワークをしながらでも、安定して基礎打ち同様にシャトルを打つために必要だ。

つまり基礎打ちとフットワークを結びつけるために必要といえる。体幹が身についている人は、片足で立ったままスマッシュやドライブが打てるのだ。

個人的な練習としては片足で立ちながら、スマッシュを打ち、基礎打ちのスマッシュと同じように、”ヒュン”と鳴るようにラケットを振れるようになること。個人的に10回中9回できれば、身についたことにしていた。


フットワーク練の時も、ラケットの振りを入れてみるのが有効だ。特にスマッシュのときに、基礎打ち同様の素振り音が出せるか。これを意識するだけで体幹はだいぶ変わってくる


フットワーク

フットワークは試合中には意識したくない。というのもコントロールシャトルを追うことを考えると、フットワークに全意識を集中させことは得策ではないからだ。

フットワークに意識がいっては他が疎かになってしまう。そこでフットワークは「無意識化」させるのが最終的な目標になってくる。

人間は勉強でも運動でも「何も考えずに実行できる状態」が究極のゴールと言われている。フットワークを「無意識化」できるかで、試合中に他のことに意識を向ける余裕ができるようになる。

フットワークはまず始めにやり方、つまり正確な足の動きを覚えてから、ひたすら反復練習を繰り返す。足の動きを頭で理解しているといないのとでは、練習の質がまるで違うからだ。


足の動きは動画でも本でもたくさん載ってるので、自分に合うのを身につけたい。



応用技について

応用技は上の基礎スキルの3つができるようになってからでないと、習得時間や精度などが全っく違ってしまう。まずはやるべきことは上の基礎3つを身体に染み込ませることだ。

フットワークで自在に素早く動け、体幹がしっかりしてて、正確なショットが打てるようになれば、それだけで十分強い。あとはシングルスとダブルスに合わせて、戦術を組み立てていく。

例えばシングルスはある程度、クリアを多用して後ろに飛ばすスタイルがみんな嫌いなので、自分は後ろに攻める戦術を常用している。

その他のコースの打ち分けや、上手い人の技の真似などの応用技は基礎ができてからにしよう。



バドミントンの上達方法は、徹底的に基礎スキル(フットワーク、基礎打ち、体幹)を身につけること。各スキルはyoutubeに動画とか散らばってるし、本にも詳しく書いてある。コーチが入れば教えてもらうのもいいだろう。自分にあったスタイルを見つけ、アレンジし、身につける。バドミントン上達は基礎ができてれば間違いないなく上達する。