1

3x6 セル配列である MATLAB 変数があります。cell 配列の列の 1 つは、最大 150 ~ 200 個の小さな RGB イメージ (16x20 ピクセル サイズなど) を保持します (これも最大)。残りの列は次のとおりです。

  • 3 文字または 4 文字の文字列である同数のラベル

  • 約 350x200 のイメージ マスク

  • 3 つの整数

なんらかの理由で、このオブジェクトの保存に非常に長い時間がかかっているか、少なくともオブジェクトのサイズの分だけ時間がかかっています。既に 10 分が経過しています (これはそれほど悪くはありませんが、オブジェクトのサイズを拡張して数千の小さな画像を保持する予定です)、MATLAB は何の進歩もしていないようです。実際、変数を含むディレクトリを開くと、そのサイズは 0 バイトから約 120kB の間で循環しています。(つまり、30 または 40 kB ずつ 120 まで増加してから再起動します)。

これは正常な動作ですか?MATLAB 変数は常に保存に時間がかかりますか? 何が起きてる?

間違い: AllDataSVM 変数ではなく、 を保存しています。AllData実際の SVM 自体と 1 つの整数を除いて、SVM キーパーと同じデータを持ちます。

これを解決するために、コードのどの特定のポイントを示すのに役立ちますか? コード自体は数百行で、いくつかの関数に分かれています。これをトラブルシューティングするために考慮すべき重要なことは何ですか? 変数はいつ作成されますか? いつ保存されますか?小さな画像を作成する方法は?

デスクトップの写真を撮る初心者になるのは嫌いです。しかし、私が作業しているマシンにはスクリーンショットを撮るのに問題があります。とにかく、ここにあります

Alldata/curdataは 3x7 配列のサブセットにすぎません...実際には 3x8 ですが、最後のint.

興味深い点: 保存プロセスを中断したところ、変数は正常に保存されたように見えました。svm保存されたデータで新しいトレーニングを行ったところ、問題なく動作しました。今後は絶対にしないでいただきたいのですが。 ワークスペースの内容

whos の使用:

Name                               Size                 Bytes  Class      Attributes

AllData                            3x6                 473300  cell                 
Image                            240x352x3             253440  uint8                
RESTOREDEFAULTPATH_EXECUTED        1x1                      1  logical              
SVMKeeper                          3x8                2355638  cell                 
ans                                3x6                 892410  cell                 
curData                            3x6                 473300  cell                 
dirpath                            1x67                   134  char                 
im                               240x352x3            1013760  single               
s                                  1x1                 892586  struct   

更新情報: 1.これは常に発生しますか、それとも 1 回だけですか?

- それはいつも起こる

2.別の(ローカル)ドライブに保存する場合、同じ時間がかかりますか?

-そのコンピューターに戻ったら、これをさらに調査します

3.500kb のマトリックスをそのフォルダに保存するのにどのくらいの時間がかかりますか?

-ほぼ瞬時に

4.上で尋ねられたように、あなたが使用する関数呼び出しは何ですか?

- 以下にコードを追加

(Image is a rgb image)

MaskedImage(:,:,1)=Image(:,:,1).*Mask;
MaskedImage(:,:,2)=Image(:,:,2).*Mask;
MaskedImage(:,:,3)=Image(:,:,3).*Mask;
MaskedImage=im2single(MaskedImage);
....


(I use some method to create a bounding box around my 16x20 image)
(this is in a loop of that occurs about 100-200 times)

 Misfire=input('is this a misfire?','s');
 if (strcmpi(Misfire,'yes'))
    curImageReal=MaskedImage(j:j+Ybound,i:i+Xbound,:);
    Training{curTrainingIndex}=curImageReal;  %Training is a cell array of images
    Labels{curTrainingIndex}='ncr';
    curTrainingIndex=curTrainingIndex+1;
 end


  (the loop ends)...


SaveAndUpdate=input('Would you like to save this data?(say yes,definitely)','s');
undecided=1;
while(undecided)
if(strcmpi(SaveAndUpdate,'yes,definitely'))
   AllData{curSVM,4}=Training;
   AllData{curSVM,5}=Labels;
   save(strcat(dirpath,'/',TrainingName),'AllData'); <---STUCK HERE
   undecided=0;
else
   DontSave=input('Im not going to save. Say YESNOSAVE to NOT SAVE','s')
   if(strcmpi(DontSave,'yesnosave'))
      undecided=0;
   else
      SaveAndUpdate=input('So... save? (say yes,definitely)','s');
   end
end
end
4

2 に答える 2

0

カスタムファイルの保存を行っているかどうかは少し不明です。初めての場合は、保存ループが非常に遅く、おそらくハードウェアに問題があると思います。MATLAB のsave関数を使用してデータを保存してみてください。

tic
save('test.mat', 'AllData')
toc

それがうまく機能する場合は、そこから自分のやり方で作業してみてください。たとえば、一度に 1 つの要素を保存するなどです。

を使用してコードをプロファイリングprofilerし、コマンドでコードを開き、profile viewerプロファイリングするコード、スクリプト、または関数を入力テキスト フィールドに入力できます。

于 2012-11-29T13:19:35.110 に答える
0

これは素晴らしい答えではありませんが、問題は、イメージを単一に変換した後にイメージのバージョンを保存していたことにあるようです。なぜこれが劇的な速度低下を引き起こすのかわかりません(このコード行を削除した後、すぐに機能しました)。

于 2012-11-29T15:54:37.797 に答える