「G-Penパッチ/アルゴリズム比較」の編集履歴(バックアップ)一覧はこちら

G-Penパッチ/アルゴリズム比較 - (2007/08/19 (日) 20:11:24) の1つ前との変更点

追加された行は緑色になります。

削除された行は赤色になります。

*アルゴリズム比較 いくつかの方法の有効性を調べてみました。 ちなみに、このページの元データとデータ加工のためのスクリプトはこのページの最下段の「添付ファイル」にある"lines3.txt.gz"と"lines.rb"です。 #実行 ruby lines.rb 関数名 < lines3.txt > 出力ファイル名 #グラフ化 (出力ファイル=lines-move_avg.txtの場合) gnuplot > set terminal postscript eps color enhanced solid > set size square > set output 'lines3.eps' > plot 'lines3.txt' using 1:(-$2) title "base" with lines 9 > set output 'lines3-dots.eps' > plot 'lines3.txt' using 1:(-$2) title "base" with points ps 0.3 > set output 'lines-move_avg.eps' > plot 'lines-move_avg.txt' using 1:(-$2) title "moving-avg" with lines 4 > set output 'lines-move_avg-comp.eps' > plot 'lines3.txt' using 1:(-$2) title "base" with lines 9, \ 'lines-move_avg.txt' using 1:(-$2) title "moving-avg" with lines 4 とかやると結果が出てきます。単純にgnuplotの形式で"x y velocity"が並んでいるだけなので、いろいろいじってみると楽しいかもしれません。 **元絵 まずはベースとなる絵を用意します。 フリーハンドで適当に描いてみて、そのときのインクのモーションを全部ファイルに落としておきました。 &ref(lines3.png) イベントで拾った点を見てみると...... &ref(lines3-dots.png) -入りの部分は大体細かく点が並んでいます(慎重に描いているようです) -抜きの部分はゆっくりにはなりますが、入りよりは速度が速いことが多いです。 -顔の輪郭、目、頭部、腰のラインなどの形を気にするところはゆっくり描いています。 大体、ゆっくり描いたところがブレてます。力が入るから筋肉が震えてるんでしょうか。ともかく、こういうところはちゃんと補正してあげたくなります。 **単純移動平均 元絵を一番簡単な移動平均で補間するとこんな感じになります。 ***パラメータ |履歴長|20| ***結果 #image(lines-move_avg.png) #image(lines-move_avg-comp.png) いろんな方法の比較のポイントはこんなところでしょうか。 +顎のライン:手ブレをしているラインが綺麗になるか。 +後頭部のライン:手ブレをしているラインが綺麗になるか。 +右側の線:手ブレをしているラインが綺麗になるか。 +眉毛、二重まぶたの線: ちゃんと最後まで伸びているか。 +前髪:ちゃんと最後まで伸びているか。 +鼻:最後まで伸びているか。 +髪の毛の裾、服の襟:元絵の線に近いか。 単純移動平均では1〜3までは文句無しです。4〜6は惨敗です。線が遅れる感じが出てしまうのがよくわかります。特に、鼻は軽くさっと描く線なので、こういった軽く引く線は弱いようです。 また、補正が強いので、襟や髪の毛、右側の線ではカーソルの動きに合わせてカーブの山が内側に入ってしまっています。丸い線がかけるようになるので、この辺は人それぞれで好みが分かれそうです。 **重み付け移動平均。 重み付けを加えてみました。 ***パラメータ |履歴長|20| |重み関数|h(n)=20-n (n=0,1,...,19 : n個前のデータを表す)| ***結果 #image(lines-w_move_avg.png) #image(lines-w_move_avg-comp.png) 多少は良くなっているのですが...... **速度ベースの減衰関数 速度によって過去のデータを減衰させていく方法を作ってみました。 (2007-08-18版) ***パラメータ |履歴長|20| |重み関数|h(n)=Π(サンプル点iでの速度のAnnealing関数)[i=1〜n]| |Annealing係数|2.5| ***結果 #image(lines-v_move_avg.png) #image(lines-v_move_avg-comp.png) 重み付けバージョンより、髪の毛の伸びなどが良くなっています。クオリティが変わらずに追随性が良くなったように見えてきます。 **単純ガウシアン重み付け GIMP萌え絵スレの898さんのアドバイスを聞いて、ガウシアン関数での重み付けを作ってみました。 ***パラメータ |履歴長|20| |重み関数|h(n)=Gaussian(n)| |Gaussianのσ|5| ***結果 #image(lines-g_move_avg.png) #image(lines-g_move_avg-comp.png) 重み付けと比べて格段に良くなっています。追随性もかなり良いです。 ディティールが細かくなっています。細かいブレは補正するけど、大きな周波数のブレはそのまま出てしまうかもしれません。 とにかく、かなり優れています。 鼻のトレースはこの方法がもっとも良くなっています。 **速度ベースガウシアン重み付け ガウシアンの入力値を、過去の履歴のインデックスではなく、それまでの速度の総和にしてみます。速度の和にする根拠がないので、数学的にはでたらめです。 ***パラメータ |履歴長|20| |重み関数|h(n)=Gaussian(Σ(iの速度)[i=1〜n])| |Gaussianのσ|20| ***結果 #image(lines-gv_move_avg.png) #image(lines-gv_move_avg-comp.png) 追随性が良くなります。これまでの方法の中で最も良いです。補正の感じもガウシアンと同等です。線がカーソルから大きく外れないというのも良いところです。ただし、逆に言うと人によっては補正が弱いと感じるかもしれません。 この方法でガウシアンのσを50に変えるとこんな感じになります。σひとつで大きく特性が変わるので、今回の結果もあくまでも参考程度って感じですね。 #image(lines-gv_move_avg_50.png) #comment
*アルゴリズム比較 いくつかの方法の有効性を調べてみました。 ちなみに、このページの元データとデータ加工のためのスクリプトはこのページの最下段の「添付ファイル」にある"lines3.txt.gz"と"lines.rb"です。 #実行 ruby lines.rb 関数名 < lines3.txt > 出力ファイル名 #グラフ化 (出力ファイル=lines-move_avg.txtの場合) gnuplot > set terminal postscript eps color enhanced solid > set size square > set output 'lines3.eps' > plot 'lines3.txt' using 1:(-$2) title "base" with lines 9 > set output 'lines3-dots.eps' > plot 'lines3.txt' using 1:(-$2) title "base" with points ps 0.3 > set output 'lines-move_avg.eps' > plot 'lines-move_avg.txt' using 1:(-$2) title "moving-avg" with lines 4 > set output 'lines-move_avg-comp.eps' > plot 'lines3.txt' using 1:(-$2) title "base" with lines 9, \ 'lines-move_avg.txt' using 1:(-$2) title "moving-avg" with lines 4 とかやると結果が出てきます。単純にgnuplotの形式で"x y velocity"が並んでいるだけなので、いろいろいじってみると楽しいかもしれません。 **元絵 まずはベースとなる絵を用意します。 フリーハンドで適当に描いてみて、そのときのインクのモーションを全部ファイルに落としておきました。 &ref(lines3.png) イベントで拾った点を見てみると...... &ref(lines3-dots.png) -入りの部分は大体細かく点が並んでいます(慎重に描いているようです) -抜きの部分はゆっくりにはなりますが、入りよりは速度が速いことが多いです。 -顔の輪郭、目、頭部、腰のラインなどの形を気にするところはゆっくり描いています。 大体、ゆっくり描いたところがブレてます。力が入るから筋肉が震えてるんでしょうか。ともかく、こういうところはちゃんと補正してあげたくなります。 **単純移動平均 元絵を一番簡単な移動平均で補間するとこんな感じになります。 (2007-08-16版) ***パラメータ |履歴長|20| ***結果 #image(lines-move_avg.png) #image(lines-move_avg-comp.png) いろんな方法の比較のポイントはこんなところでしょうか。 +顎のライン:手ブレをしているラインが綺麗になるか。 +後頭部のライン:手ブレをしているラインが綺麗になるか。 +右側の線:手ブレをしているラインが綺麗になるか。 +眉毛、二重まぶたの線: ちゃんと最後まで伸びているか。 +前髪:ちゃんと最後まで伸びているか。 +鼻:最後まで伸びているか。 +髪の毛の裾、服の襟:元絵の線に近いか。 単純移動平均では1〜3までは文句無しです。4〜6は惨敗です。線が遅れる感じが出てしまうのがよくわかります。特に、鼻は軽くさっと描く線なので、こういった軽く引く線は弱いようです。 また、補正が強いので、襟や髪の毛、右側の線ではカーソルの動きに合わせてカーブの山が内側に入ってしまっています。丸い線がかけるようになるので、この辺は人それぞれで好みが分かれそうです。 **重み付け移動平均。 重み付けを加えてみました。 ***パラメータ |履歴長|20| |重み関数|h(n)=20-n (n=0,1,...,19 : n個前のデータを表す)| ***結果 #image(lines-w_move_avg.png) #image(lines-w_move_avg-comp.png) 多少は良くなっているのですが...... **速度ベースの減衰関数 速度によって過去のデータを減衰させていく方法を作ってみました。 (2007-08-18版) ***パラメータ |履歴長|20| |重み関数|h(n)=Π(サンプル点iでの速度のAnnealing関数)[i=1〜n]| |Annealing係数|2.5| ***結果 #image(lines-v_move_avg.png) #image(lines-v_move_avg-comp.png) 重み付けバージョンより、髪の毛の伸びなどが良くなっています。クオリティが変わらずに追随性が良くなったように見えてきます。 **単純ガウシアン重み付け GIMP萌え絵スレの898さんのアドバイスを聞いて、ガウシアン関数での重み付けを作ってみました。 ***パラメータ |履歴長|20| |重み関数|h(n)=Gaussian(n)| |Gaussianのσ|5| ***結果 #image(lines-g_move_avg.png) #image(lines-g_move_avg-comp.png) 重み付けと比べて格段に良くなっています。追随性もかなり良いです。 ディティールが細かくなっています。細かいブレは補正するけど、大きな周波数のブレはそのまま出てしまうかもしれません。 とにかく、かなり優れています。 鼻のトレースはこの方法がもっとも良くなっています。 **速度ベースガウシアン重み付け ガウシアンの入力値を、過去の履歴のインデックスではなく、それまでの速度の総和にしてみます。速度の和にする根拠がないので、数学的にはでたらめです。 (2007-08-19版) ***パラメータ |履歴長|20| |重み関数|h(n)=Gaussian(Σ(iの速度)[i=1〜n])| |Gaussianのσ|20| ***結果 #image(lines-gv_move_avg.png) #image(lines-gv_move_avg-comp.png) 追随性が良くなります。これまでの方法の中で最も良いです。補正の感じもガウシアンと同等です。線がカーソルから大きく外れないというのも良いところです。ただし、逆に言うと人によっては補正が弱いと感じるかもしれません。 この方法でガウシアンのσを50に変えるとこんな感じになります。σひとつで大きく特性が変わるので、今回の結果もあくまでも参考程度って感じですね。 #image(lines-gv_move_avg_50.png) #comment

表示オプション

横に並べて表示:
変化行の前後のみ表示:
記事メニュー
目安箱バナー