質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

775閲覧

im2colのC言語のプログラムをJavascript に移植

teefpc

総合スコア111

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/06/24 02:28

編集2018/06/24 05:14

前提・実現したいこと

im2colというC言語のプログラムをJavascript に移植してみました。しかし、正しく動いていないような出力が得られました。実際は、JSコードでのサンプルデータでの場合、9x9の行列だと思うのですが、よろしくお願いします。

移植元のC言語
https://github.com/pjreddie/darknet/blob/master/src/im2col.c

欲しい出力(JSのサンプルデータの場合)
[
[1,1,1,2,2,2,3,3,3],
[1,1,1,2,2,2,3,3,3],
[1,1,1,2,2,2,3,3,3],
[2,2,2,3,3,3,4,4,4],
[2,2,2,3,3,3,4,4,4],
[2,2,2,3,3,3,4,4,4],
[3,3,3,4,4,4,5,5,5],
[3,3,3,4,4,4,5,5,5],
[3,3,3,4,4,4,5,5,5],
]

発生している問題・出力結果

(81) [Array(5), undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined]

該当のソースコード JavaScript

<html> <script> // Image data for debug var data_im=[ [ [1,1,1,1,1],[2,2,2,2,2],[3,3,3,3,3],[4,4,4,4,4],[5,5,5,5,5] ] ]; var channels = 1; // Number of channel. 1:mono 3:color var height = 5; // Image height var width = 5; // Image width var ksize = 3; // Filter size (width or height) var stride = 1; // Filter movement width var pad = 0; // Padding of output image var data_col = im2col_cpu(data_im, channels, height, width, ksize, stride, pad); console.log(data_col); /* * float *im, * int height, * int width, * int channels, * int row, * int col, * int channel, * int pad */ function im2col_get_pixel(im, height, width, channels, row, col, channel, pad) { row -= pad; col -= pad; if (row < 0 || col < 0 || row >= height || col >= width) return 0; var out = im[col + width*(row + height*channel)]; return out; } /* * float* data_im * int channels, * int height, * int width * int ksize, * int stride, * int pad, * float* data_col */ function im2col_cpu(data_im, channels, height, width, ksize, stride, pad) { var c,h,w; var height_col = (height + 2*pad - ksize) / stride + 1; var width_col = (width + 2*pad - ksize) / stride + 1; var data_col = []; var channels_col = channels * ksize * ksize; for (c = 0; c < channels_col; ++c) { var w_offset = c % ksize; var h_offset = (c / ksize) % ksize; var c_im = c / ksize / ksize; for (h = 0; h < height_col; ++h) { for (w = 0; w < width_col; ++w) { var im_row = h_offset + h * stride; var im_col = w_offset + w * stride; var col_index = (c * height_col + h) * width_col + w; data_col[col_index] = im2col_get_pixel(data_im, height, width, channels, im_row, im_col, c_im, pad); } } } return data_col; } </script>

試したこと

変数のデータ型の宣言以外は、C言語とおなじだと思います。
本来ならば、投入データに、画像の数値データが入りますが、わかりやすくするために、整数値を用意しました。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/06/24 03:25

タイトルが一部削れてしまってますよ
teefpc

2018/06/24 03:59

ご指摘ありがとうございます。「im2colのC言語のプログラムをJavascript に移植」でした。
teefpc

2018/06/24 07:47

どうも、投入データが1次元のようです。つまり、このコードのサンプルの場合、要素が25個の1次元配列であるのが前提ではないかと気づきました。
guest

回答3

0

投稿2018/06/24 03:07

oikashinoa

総合スコア2826

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

C言語の入力と出力の両方が、自分の期待値と異なっていました。以下の修正で、正しく取得できました。みなさんありがとうございました。

"Add" の部分が修正部分です

<html> <script> // Image data for debug var data_im=[ [ [1,1,1,1,1],[2,2,2,2,2],[3,3,3,3,3],[4,4,4,4,4],[5,5,5,5,5] ] ]; var channels = 1; // Number of channel. 1:mono 3:color var height = 5; // Image height var width = 5; // Image width var ksize = 3; // Filter size (width or height) var stride = 1; // Filter movement width var pad = 0; // Padding of output image var data_col = im2col_cpu(data_im, channels, height, width, ksize, stride, pad); console.log(data_col); /* * float *im, * int height, * int width, * int channels, * int row, * int col, * int channel, * int pad */ function im2col_get_pixel(im, height, width, channels, row, col, channel, pad) { row -= pad; col -= pad; if (row < 0 || col < 0 || row >= height || col >= width) return 0; var out = im[col + width*(row + height*channel)]; return out; } /* * float* data_im * int channels, * int height, * int width * int ksize, * int stride, * int pad, * float* data_col */ function im2col_cpu(data_im, channels, height, width, ksize, stride, pad) { // Add data_im = im_3dTo1d(data_im, channels, height, width); var c,h,w; var height_col = (height + 2*pad - ksize) / stride + 1; var width_col = (width + 2*pad - ksize) / stride + 1; var data_col = []; var channels_col = channels * ksize * ksize; for (c = 0; c < channels_col; ++c) { // Add data_col[c] = []; var w_offset = c % ksize; // var h_offset = (c / ksize) % ksize; // var c_im = (c / ksize) / ksize; // Add var h_offset = parseInt(c / ksize) % ksize; var c_im = parseInt(parseInt(c / ksize) / ksize); for (h = 0; h < height_col; ++h) { for (w = 0; w < width_col; ++w) { var im_row = h_offset + h * stride; var im_col = w_offset + w * stride; var col_index = (c * height_col + h) * width_col + w; // data_col[col_index] = im2col_get_pixel(data_im, // height, width, channels, im_row, im_col, c_im, pad); // Add data_col[c][col_index] = im2col_get_pixel(data_im, height, width, channels, im_row, im_col, c_im, pad); } } } return data_col; } // Add function im_3dTo1d(data_im, channels, height, width){ var out = []; // Channel for (var c = 0; c < channels ; c++){ for (var h = 0; h < height ; h++){ for (var w = 0; w < height ; w++){ out.push(data_im[c][h][w]); } } } return out; } </script>

投稿2018/06/24 08:45

編集2018/06/24 08:49
teefpc

総合スコア111

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

var data_im=[
[
[1,1,1,1,1],[2,2,2,2,2],[3,3,3,3,3],[4,4,4,4,4],[5,5,5,5,5]
]
];

2次元配列の想定でしょうか?↑だと[]が多くて3次元配列です。

function im2col_get_pixel(im, height, width, channels, row, col, channel, pad)
{
(略)
var out = im[col + width*(row + height*channel)];

imが2次元配列(の想定)なのに、1次元としてアクセスしているからです。(C言語の時はこのやり方でもいいけど。)

下を動かすと、解ると思います
var data_im=[
[9,8,7,6,5],[2,2,2,2,2],[3,3,3,3,3],[4,4,4,4,4],[5,5,5,5,5]
];

console.log(data_im[0][0]);
console.log(data_im[0][1]);
console.log(data_im[0][2]);
console.log(data_im[0][3]);
console.log(data_im[0][4]);
console.log(data_im[0][5]);

console.log(data_im[0]);

投稿2018/06/24 04:59

oikashinoa

総合スコア2826

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

teefpc

2018/06/24 06:18

ご指摘、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問