2020年1月16日木曜日

「モバイル ユーザビリティ」の問題が新たに 検出されました クリック可能な要素同士が近すぎます

SearchConsoleから、いつもと少し違うエラーが届きました。

モバイル ユーザビリティ
クリック可能な要素同士が近すぎます

今回はこのエラーについて対策してみます。



1.モバイルフレンドリーテスト

SearchConsole画面のモバイルユーザビリティを確認すると、サイト内のエラー情報が確認できます。
 今回のエラーは前回のクエリパラメータの問題のものと違うようです。



画像の虫眼鏡をクリックすると画面右側に詳細画面が表示されます。

詳細の「ライブページをテスト」をクリックすることで、モバイルフレンドリーテスト画面が起動します。

 
どうやら、画像の赤枠部分のリンクが近すぎるということのようです。


Bloggerの編集画面ではこんな感じ。
HTMLタグの機能を使わずに、行ごとのリンクを貼っていました。

 編集画面上部の「番号付きリスト」や「箇条書き」を選択してみます。

再度、モバイルフレンドリーテスト画面で確認すると、エラーが無くなっていることがわかります♪




2.エラーが解消されない場合

余談ですが、私の場合「箇条書き」を使用した場合はエラーが解消されましたが、「番号付きリスト」を使用した場合は以下のようにエラーが解消されませんでした。
これは「番号付きリスト」が悪いのではなく、Bloggerで使用しているテーマの設定による違いだと思います。
怪しい箇所については、モバイルフレンドリーテスト画面で確認しながら修正を行う必要があるようです。

2020年1月15日水曜日

スタイロフォーム造形の下地処理について検証してみた

スタイロフォーム造形について調べたので覚書き
今回は
  • 有機溶剤を使うとどうなるのか?
  • ジェッソ以外の下地処理は有効なのか?
について調べてみました。


スタイロフォームでの造形については以下も参考にしてください。


スタイロフォームはホームセンターなどで購入できます。
[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]
ブルースタイロフォームIB 600×300×20
価格:440円(税込、送料別) (2020/1/4時点)



1.有機溶剤を使ってみた

よく有機溶剤を使うと溶けるという記載をみるのですが、実際はどのくらい溶けるんでしょうか??
ということで、試してみました。

試したのは G17ボンド(左)とラッカーうすめ液(右)です。

G17ボンド(左)は希釈せずに、原液を塗ってみました。
半日ほど放置しておいてみましたが、写真のように黄色くなり固まっています。
スタイロフォームはほぼ溶けていません。

ラッカーうすめ液(右)は筆塗りした途端にスタイロフォームが溶けだしました。
塗った分だけスタイロフォームが溶けていきますw


2.下地処理

こちらは下地処理について検証。
下地処理としてはジェッソを利用することが多いようですが、アイロンを当てて加工したり水性シーラントを使うという話もあったので検証してみます。

写真は左半分がスタイロフォームにアイロンを当てています。
また、中心部分には下地処理として水性シーラントを塗布してあります。
塗料はすべてアクリル絵の具(黒)です。


まず、水性シーラント(中央)使用の有無ですが、塗装については違いがみられませんでした。
特に水性シーラントは利用する必要がないように思います。

つぎに、アイロンでの下地処理(左)ですが、スタイロフォームはアイロンを当てることで溶けて凹んでいます。
ただし、表面のザラザラは溶けて平面になるため、塗装はかなりしやすくなっています。

やすりがけやジェッソでの加工や下地処理の代わりにアイロンをあてるのは有効なようです♪

前回作成した歯車もアイロンでの加工を行っています。


ただし、アイロンでは細かい加工が難しいので、裁縫用コテなどがあるとより良いかなと思います。


2020年1月4日土曜日

スタイロフォームで歯車を作成


ライオンボードでの小物の作成はやったことあるんですが、スタイロフォームでの造形することになりそうなので、使い勝手を調査しました。



スタイロフォームでの造形については以下も参考にしてください。


スタイロフォームはホームセンターなどで購入できます。
[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]
ブルースタイロフォームIB 600×300×20
価格:440円(税込、送料別) (2020/1/4時点)


スタイロフォームは軽量なのでコスプレ界隈の方が大きなパーツを作るのに使用されているのですが、有機溶剤が使えないという問題があります。

なので、水溶性の木工用ボンドやアクリル絵の具のみを使用して作成してみます。


1.切断方法

今回は歯車を作成。
試作のため、型紙がフリーハンドのため歪です。 

まず。上の写真のように、下書きより少し大きめにザックリとスタイロフォームを切り出します。
スタイロフォームの切断は、カッターや発泡スチロールカッターよりも、小学校の時に使ってそうな小刀が使いやすかったです。
カッターだと、刃が引っかかって動かなくなります。また、安い発泡スチロールカッターでは切断速度が遅すぎて、効率が悪かったです。

小刀であれば、ザクザクと切れ目を入れて、パキっとスタイロフォームを割るだけなので簡単でした♪

2.加工

一般的なスタイロフォームの加工は「やすりがけ&ジェッソなどでの下地処理」のようですが、アイロンを使って造形するという話も見かけたので、今回はアイロンで加工します。
※アイロン加工するときは換気して作業を行ってください

アイロンで表面と側面を加熱します。
アイロンはスタイロフォームに直接当てずに、クッキングシートを使っています。

下書きの形になるまで、アイロンを当てたらこんな感じに丸くなりました♪
側面だけでなく、全面と背面もアイロンを当てています。
アイロンを当てることでスタイロフォーム自体が薄くなるので、厚みが必要な場合は、使用するスタイロフォームの厚さを調整してください。

アイロンを当てることで、表面の凹凸が溶けてなくなるので、ジェッソを使わなくても塗装しやすくなります。

歯車の溝と内部の穴もアイロンあてました。
最初、細かく切らなくてもアイロンで全部できないかな?と期待してたのですが、さすがに無理で小刀で歯車の溝を作ってからアイロンをあてています。

今回はアイロンを使用しましたが、作成物のサイズによっては、アイロンは大きいので加工が難しいかなと。
可能であれば、アイロンコテを利用したほうが良いと思います。


3.塗装

金属風に塗装したいので、アクリル絵の具で黒く塗りつぶします。
スプレーなど使いたいですが、有機溶剤NGなので、筆塗りです。
先にアイロンをあてておいたので、塗装は塗りやすかったです♪

黒色が可能したら、金属色と塗布します。
今回はアクリル絵の具のシルバーを使用しています。
ドライブラシ風に塗装したいのですが、サイズが大きいので、筆は使わずにスポンジを使って塗装しました。


シルバー塗布後。
こんな感じになりました。


今回は金属風塗装ですが、以下の記事も同様の塗装方法で作成しています。

2020年1月1日水曜日

C#で画像認識(Accord.Net) 4.MulticlassSupportVectorMachineクラス

第2回までのの記事で、最低限の画像認識は動くようになると思います。
今回は「前回、よくわかんなくて曖昧にしていた」部分の追記です。

Accord.Netについては、以下の記事も参考にしてください。
C#で画像認識(Accord.Net) 


MulticlassSupportVectorMachineクラス

前回のBinarySplitクラス同様、MulticlassSupportVectorMachineクラスの名前をそのままググってもあまり良い情報が出てこず・・・

どうやらMulticlassなSupportVectorMachineということのようです。

Wiki先生によると
サポートベクターマシン(英: support vector machine, SVM)は、教師あり学習を用いるパターン認識モデルの一つである。
だそうです。

教師あり学習というのは、入力データと正解データを使った学習方法のことです。
こちらは、プロットした点に「赤色黄色青色」のような情報を追加して、区切り線を作る処理にあたるようです。

こんな感じかな

ロジックは以下の部分が該当すると思います。

 // 赤、青、黄の3分割
 var classes = 3;

 // 機械学習の実施
 var msvm = new MulticlassSupportVectorMachine<chisquare>(0, new ChiSquare(), classes);

 var teacher = new MulticlassSupportVectorLearning<chisquare>(msvm)
 {
  Learner = (param) => new SequentialMinimalOptimization<chisquare>()
  {
   UseComplexityHeuristic = true,
   UseKernelEstimation = true
  }
 };
 msvm = teacher.Learn(inputs.ToArray(), outputs.ToArray());

処理は最後の
msvm = teacher.Learn(inputs.ToArray(), outputs.ToArray());
がメインです。


そして、最後にBagOfWordsで判別したい画像のプロット位置(★マーク)を取得し、MulticlassSupportVectorMachineクラスで、どの分類に含まれるのか判定を行っています。



 // 画像の判定
 Bitmap targetBmp = new Bitmap("イチゴの画像のパス");

 var codeword = bagofVW.Transform(targetBmp);

 // イチゴは赤いので「0」が返却されるはず
 var ret = msvm.Decide(codeword);




ちなみに、前回のBinarySplitは読み込んだ画像を正解がないままで分類わけするので教師なし学習にあたるみたいです。

C#で画像認識(Accord.Net) 3.BinarySplitクラス

前回の記事で、最低限の画像認識は動くようになると思います。
今回は「前回、よくわかんなくて曖昧にしていた」部分の追記です。

Accord.Netについては、以下の記事も参考にしてください。
C#で画像認識(Accord.Net) 


BinarySplitクラス

前回の記事では以下のように記載していました
BinarySplit binarySplit = new BinarySplit(CodeWordCount);
BagOfVisualWords bagofVW = new BagOfVisualWords(binarySplit);

BinarySplit は解析のためのデータ変換するクラス(BagOfVisualWords )のインスタンス作成時の引数として指定していました。

BinarySplitだけで検索しても、あまり関係のある情報が出てこないので、放置していましたが、Binary Splitting Algorithmのことのようです。
ただ、この言葉をググっても説明が難しいので、アルゴリズムの内容はよくわかんないです・・・
機械学習の本の索引にも出てないので、いったん放置。

このクラスの定義を確認すると、KMeansクラスを継承していることがわかります。

public class BinarySplit : KMeans

このKMeansk-平均法のことのようです。
こちらについても、解説を読んでもアルゴリズムの詳細は分かりませんが、Wikiによると
k平均法(kへいきんほう、英: k-means clustering)は、非階層型クラスタリングのアルゴリズム
とのこと。
ここのキーワードの「クラスタリング」というところが重要なようです。


// BagOfWordsでデータ変換
bagofVW.Learn(bmps.ToArray());

つまり、ここの記載は「画像の一覧をクラスタリングする」ということになります。

サンプルプログラムの場合
リンゴ、伊勢海老、バナナ、青空をデータを読み込んで、座標をプロットするような処理にあたるようです。

上記のイラストでは画像を色分けしてプロットしていますが、ロジック的にこの時点では「赤色黄色青色」のような情報は与えていません。
なので、3分類に分けるような処理は行わず、純粋に与えられた画像を座標としてプロットした状態になっているんだと思います。
こんな感じで、似ている画像どうしのプロットが近くにある感じ



C#で画像認識(Accord.Net) 2.最小構成のプログラム作成

前回からの続きです。
Accord.Netを使用して、画像認識させる最低限の構成について記載します。
私自身が初心者で機械学習はサッパリなので、誤認識あったらゴメンナサイ

Accord.Netについては、以下の記事も参考にしてください。
C#で画像認識(Accord.Net) 

1.機械学習に必要なもの

私の認識では画像認識処理の登場人物は以下です
  • BagOfWords
  • VectorMachine
  • 画像のリスト
  • 入力値のリスト
  • 分類結果のリスト
  • 判定したい画像

BagOfWords
画像のリストを読み込んで解析可能なデータに変換します。
BagOfWordsによる変換結果の一覧が入力値のリストです。

分類結果のリスト
画像のリストの分類の一覧です。
分類とはユーザが決めるもので、

  • 赤い画像(0)、青い画像(1)、黄色い画像(2)
  • 人物(0)、風景(1)

などのように分類して、括弧のように数値を割り振ったリストです。

VectorMachine
機械学習のコアになるクラスです。
入力値のリストと分類結果のリストを読み込んで学習を行います。
その後、判定したい画像を読み込むことで、どの分類に属しているか判定します。
学習にはTeacherを定義します

2.処理の流れ

実際に処理をまとめると以下のようになります。
サンプルでは

  • リンゴ、伊勢海老バナナ青空」の画像を読み込み
  • 赤色黄色青色」に分類
  • イチゴ」の画像を読み込み「」グループと判別させる

イメージです。


private void Study()
{
 // データ変換の配列の長さ
 const int CodeWordCount = 60;

 //データ解析のアルゴリズム
 BinarySplit binarySplit = new BinarySplit(CodeWordCount); 
 BagOfVisualWords bagofVW = new BagOfVisualWords(binarySplit);

 List<bitmap> bmps = new List<bitmap>();
 List<double> inputs = new List<double>();
 List<int> outputs = new List<int>();

 // 学習用画像の読み込み
 bmps.Add(new Bitmap("リンゴの画像のパス")); // 赤色の画像
 bmps.Add(new Bitmap("伊勢海老の画像のパス")); // 赤色の画像
 bmps.Add(new Bitmap("バナナの画像のパス")); // 黄色の画像
 bmps.Add(new Bitmap("青空の画像のパス")); // 青色の画像

 // BagOfWordsでデータ変換
 bagofVW.Learn(bmps.ToArray());
 foreach (var bmp in bmps)
 {
  var wordCount = bagofVW.Transform(bmp);
  inputs.Add(wordCount);
 }

 // 読み込んだ画像の分類
 outputs.Add(0); // 赤色の画像
 outputs.Add(0); // 赤色の画像
 outputs.Add(1); // 黄色の画像
 outputs.Add(2); // 青色の画像

 // 赤、青、黄の3分割
 var classes = 3;

 // 機械学習の実施
 var msvm = new MulticlassSupportVectorMachine<chisquare>(0, new ChiSquare(), classes);

 var teacher = new MulticlassSupportVectorLearning<chisquare>(msvm)
 {
  Learner = (param) => new SequentialMinimalOptimization<chisquare>()
  {
   UseComplexityHeuristic = true,
   UseKernelEstimation = true
  }
 };
 msvm = teacher.Learn(inputs.ToArray(), outputs.ToArray());


 // 画像の判定
 Bitmap targetBmp = new Bitmap("イチゴの画像のパス");

 var codeword = bagofVW.Transform(targetBmp);

 // イチゴは赤いので「0」が返却されるはず
 var ret = msvm.Decide(codeword);

}


C#で画像認識(Accord.Net) 1.ビルドエラーが出た時の確認点

今更ですが画像の自動振り分け処理を作りたくなったので、機械学習に手を出してみました。
普通はPythonだろうけど、C#でもAccord.Netで使用可能なようなので、触ってみました。
まずはNugetでAccordやらAccord.Imagingあたりを適当にダウンロード
その後に、ネットで出回っているサンプルなどを参考にコーディングしてみたんだけど、古い情報も多く、そのまま実装できない部分がありました。
なので、動作させるまでに必要だったことを覚書として記載しておきます。

Accord.Netについては、以下の記事も参考にしてください。
C#で画像認識(Accord.Net) 



1.目標

インターネットからの画像抽出アプリで画像をダウンロードすると、広告的な画像が多く含まれていた。それらの画像を自動で除外したい

・フォルダ内の画像を探索して、類似の画像を抽出する
・抽出対象は「QRコード」と「線画」

2.機械学習の流れ

Accord.Netは初めて使用するので、機械学習の処理の流れをまとめると以下のような手順でした。

  1. BinarySplitクラスのインスタンスを作成(解析アルゴリズムの指定)
  2. BagOfVisualWordsクラスのインスタンスを作成(機械学習の本体)
  3. BagOfVisualWordsクラスのインスタンスに画像を読み込んで機械学習
  4. 学習結果で、画像を振り分け
こんな感じでしょうか

3.BagOfVisualWordsクラスの参照が見つからない

いきなり躓きました。
キモとなるであろうクラスの「BagOfVisualWordsクラス」が見つかりません・・・
BagOfVisualWordsクラスのnamespaceは「Accord.Imaging」ですが、アセンブリの参照先は「Accord.Imaging」ではなく「Accord.Vision」のようです。
なのでNugetから「Accord.Vision」のインストールが必要でした。

4.メソッドが古い形式

サンプルソースによると
BagOfVisualWords.Compute()で、学習を行わせるように記載されています
そのまま実装すると「Compute(Bitmap[])は旧型式です」という警告が表示されます。
現在はLearn()メソッドに代わっているようです。
これはメソッド名を変更するだけで、引数などは変更不要のようです。

また、学習結果での画像の判別時にはDecide()メソッドを使用するようです。
これも元々はComputeメソッドだったのかな?

同様にGetFeatureVectorメソッドはTransformメソッドに変更となったようです。


5.MulticlassSupportVectorMachineクラスが古い形式

MulticlassSupportVectorMachineクラスではなく、ジェネリッククラスのMulticlassSupportVectorMachine<TKernel>クラスに変更となったようです。
MulticlassSupportVectorMachine<ChiSquare>などに置き換えます。

同様にMulticlassSupportVectorLearningクラスも、ジェネリッククラスに変更となっています。


とりあえず、これでビルドができるようになると思います。