工学入門セミナー - Saitama...

Preview:

Citation preview

工学入門セミナーテーマ 3: 画像処理入門~顔検出のしくみ~

1 準備

実験を始める準備

実験を始める前に食べ物や飲み物は片づけておく. ※演習室は飲食禁止です.

以下の 1~3は,演習室の環境では自動で行われます.ロックがかかってしまった場合は,TAさんを呼んでで解除してもらってください.

1. ディスプレイ裏側にある PCの電源ボタンを押してコンピュータを起動する.

2. 起動イメージ選択画面になったら,「Windows 10」を選ぶ (図 1).

図 1 PCの起動 図 2 Windowsのログイン

3. Windowsが起動したら,IDとパスワードを入力してログインする (図 2).

4. 画面左下方のタスクバーにあるボタンをクリックしてWebブラウザ (Google Chrome等)を起動する.

5. 「スペース」キーの左の方の「Windows」キーを押すと,日本語入力と英語入力を切り替えられる(画面右下の「あ」と「A」が入力モードを表している).何度か押して,英語入力にする.

6. ブラウザ上方のアドレス欄(http://……と表示されている欄)をクリックして,

http://yankee.cv.ics.saitama-u.ac.jp/kunolab/fukuda/lecture/seminar/

と入力し,本テーマのWebページを開く1.

7. 配布した USBメモリを PC前面の USBスロットに挿す (一番上).

8. 配布したWebカメラを PC前面の USBスロットに挿す (上から二番目).

9. D:Yが USBメモリとなるので,この中にファイルを置いて作業する.

注意! 必ず自分の USBフラッシュメモリに保存!……パソコン本体に保存していると再起動時に消えます

注意! 作業中はこまめに保存すること!

終了時の操作

1. 各アプリケーションで「ファイル→終了」として,使用したアプリケーションをすべて終了させる.

2. タスクバー右下の USBコネクタのアイコンをクリックして,「(USBメモリの名称)の取り出し」をクリックして,安全に取り出せる事を示す表示が出てから,USBメモリを抜く.

3. Webカメラの USBコネクタを抜く.

4. 画面左下のスタートメニューから「シャットダウン」を選択する.

注意! USBメモリとWebカメラは必ず返却すること!

1もし「Not Found」と表示された場合は,おそらく入力が誤っている

1

2 プログラムの作成

本演習では,Visual Studioを使って,プログラムの作成を行います.

2.0 作業フォルダの作成

1. 演習で作成するプログラムやレポートを置いておく作業用フォルダを配布した USBメモリに作る.エクスプローラを使用し USBメモリを開く.

2. エクスプローラ上で右クリックし,新規作成→フォルダからフォルダを作成し,フォルダ名を「workspace」としておく.

2.1 Visual Studioの起動

1. タスクバー左下のスタートボタンをクリックして,プログラム欄を下の方へスクロールし,Visual Studio2017をクリックする.

2. 起動中画面が表示され,サインインを求められるので,自分のマイクロソフトアカウントでサインインする (図 3).サインインが完了すると図 4のような画面が表示される.

図 3 Microsoftアカウントへのサインイン

図 4 Visual Studio 2017の画面

2

2.2 新規プロジェクトの作成

1. 図 5のように,Visual Studio 2017のウインドウのメニューからファイル→新規作成→プロジェクトを選ぶ.

図 5 新規プロジェクトの作成

2. 図 6のような,プロジェクトの種類を選択する画面が表示されるので,左側の領域からテンプレート→「Visual C++」を選択し,中央の領域から「空のプロジェクト」を選択する.そして,ウィンドウ下方の「名前」に「test」,「場所」は適宜作業フォルダ (本実験では,「D:Yworkspace」(USBメモリ))を指定して「OK」をクリックする.

図 6 プロジェクトの種類の選択

3. 図 7 のような画面が表示される.左側の「test」という表示が,作成したプロジェクトを示している.また,右上の大きな領域がプログラムが表示される部分であり,下方はプログラムの出力結果の表示領

域である.

2.3 プログラムの作成と実行

1. メニューからプロジェクト→新しい項目の追加を選ぶと,図 8のような画面が表示される.中央から「C++ファイル (.cpp)」を選択し,下方の「名前」に「test」と入力して,右下の「追加」をクリックする.

3

図 7 プロジェクト作成後初期画面

図 8 新しい項目の追加

2. 画面の左側「ソリューションエクスプローラー」領域の「ソースファイル」の下に「test.cpp」が表示され,画面の右上のプログラム表示領域にも「test.cpp」というタブ表示され,領域が白くなっている.これは,プロジェクトに test.cppというファイルが追加され,その中身が表示されている状態である.

3. 右上の大きなウインドウにプログラムを入力する.まずは,最も簡単なプログラムとして,以下を入力してみよう.

Program 1 最も簡単なプログラムの例1 #include <stdio.h>2

3 int main(void) {4

5 printf("Hello World!\n");6

7 return 0;8 }

4. 入力が終わったら,メニューからビルド→ソリューションのビルドを選択すると,ビルドが始まる (図9).最終的に出力結果領域に「ビルドに成功しました」と表示されれば,ビルド成功で,プログラムの実行の準備ができたことになる.このとき,「ビルドに失敗しました」という表示が出ていたら,プロ

グラムがどこか間違っているので,良く見比べて修正し,再度ビルドを行う.

4

図 9 プロジェクトのビルド

5. メニューから,デバッグ→デバッグ無しで開始を選択して,プログラムを実行する.図 10のように,出てきたウィンドウに

Hello World!と表示されれば成功である2.

図 10 プロジェクトの実行

2.4 プログラムの改造

先のプログラムは画面に”Hello World!”と表示するだけだった.これだけではつまらないので,少しだけ改造してみよう.プログラムは 4行目から,6行目の間を書き換える3.まず,以下のように書き換えてみる.

Program 2 計算をするプログラムの例1 #include <stdio.h>2

3 int main(void) {4

5 int a, b, c;6

7 a = 2;8 b = 3;9

10 c = a + b;11

12 printf("Total= %d\n", c);13

14 return 0;15 }

2ウインドウが自動で消えてしまう場合は,1. ソリューションエクスプローラーで設定したいプロジェクトを右クリックしてプロパティを開き,2. 左のボックスの中から、構成プロパティ/リンカ/システムを選び,3. 右のボックスから一番上のサブシステムでコンソール (/SUBSYSTEM:CONSOLE) を選択したうえで,「デバッグなしで開始」を選択して実行する.

3前後を書き換えなければ,行数は増えても良い.

5

これは,5行目で,a,b,cという名前の整数を入れる箱を作り,7行目で aに 2を入れ,8行目で bに 3を入れている.10行目では,a+b(aと bの和の計算)の結果を cに入れている.計算結果の cは 12行目で表示している (計算結果は%dのところに入る).さらに,以下のように書き換えてみよう.

Program 3 繰り返して計算をするプログラムの例1 #include <stdio.h>2

3 int main(void) {4

5 int c, i;6

7 c = 0;8

9 for(i=0;i<10;i++){10 c = c + 2;11 }12

13 printf("Total= %d\n", c);14

15 return 0;16 }

9行目の for(i=0; i<10; i++)は,続くカッコ { }内の処理を繰り返して行うための命令である.最初にiに 0を入れて,繰り返す度に iを 1増やして,iが 10未満の間繰り返す.という意味である4.

5行目で,cに 0を入れ,forの中で 10回 c = c + 2;を繰り返す.c = c + 2;はもともと cに入っている数値に 2を足して,新しい cの値として入れろという命令である.もともと cは 0で,2を足すことを 10回行うので,このプログラムの計算結果は 20となる.

2.5 やってみよう:その1

1から 100までの整数の和を計算するプログラムを作ってみよう.

420回繰り返したければ for(i=0; i<20; i++)とすれば良い.ただし,最後の繰り返しの処理のときの iの値は,for(i=0; i<10;i++) なら 9,for(i=0; i<20; i++) なら 19 となっている.一方,for(i=1; i<=10; i++) と書くと,最初に i に 1 を入れて,繰り返す度に i を 1 増やして,i が 10 以下の間繰り返すことになる.この場合は,最後の繰り返し処理のときは,i が 10 になっている.

6

3 画像処理プログラムの作成

本実験のWebページからプログラムをダウンロードして,実行してみよう.

3.1 プログラムのダウンロードと実行

本実験のWebページからリンクを右クリックして「対象をファイルに保存」などを選び,ファイルを保存する.ここでは,デスクトップに保存したとして手順を説明する.

1. ダウンロードしたファイルを選択し,右クリックするとファイルに対する操作を選択できる.ここから展開を選択し,圧縮ファイルを解凍する.

2. 解凍されたフォルダが表示されたら,そのフォルダをコピーやドラッグアンドドロップを用いて,演習で使用している USB(D:Yworkspace以下)へデータを移動する.

3. USBに移動したフォルダを開き,SeminarEx3.slnというファイルをダブルクリックすると,Visual Studioが起動する.Visual Studioが起動したら,メニューの「ビルド → ソリューションのビルド」を選び,ビルドを行う.

4. プログラム(プロジェクト)を実行するときは,ソリューションエクスプローラの画面のプロジェクト名を右クリックし,「スタートアッププロジェクトに設定」を選択した後に,メニューバーの「デバッグ→デバッグの開始」を選択し,プログラムを実行する.

3.2 写真表示プログラム

コンピュータの画面に写真を表示するプログラムを動かしてみよう.このプログラムは,実行すると写真

が表示され,何かキーを押すと終了する.

Program 4 写真表示プログラム1 #include <stdio.h>2 #include <opencv2/opencv.hpp>3

4 int main(void)5 {6 // カラー画像を入れる入れ物 cImageResultを作る7 IplImage *cImageResult = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U , 3);8

9 // p i c t u r eという名前の入れ物に "sample.jpg" という画像ファイルを読み込んで入れる10 IplImage *picture = cvLoadImage("sample.jpg", CV_LOAD_IMAGE_COLOR);11

12 // pictureの中身をcImageResultに大きさを調整して入れる13 cvResize(picture, cImageResult , CV_INTER_LINEAR);14

15 // "My Window1"という名前のウインドウを作る16 cvNamedWindow ("My Window1", CV_WINDOW_AUTOSIZE);17

18 cvShowImage("My Window1", cImageResult); // cImageResultを"My Window1"に表示する19

20 cvWaitKey(0); // 何かキーが押されるまで待つ21

22 cvDestroyAllWindows(); // 作ったウインドウを全て閉じる23

24 return 0;25 }

OpenCVでは,プログラムリストの 7行目の cImageResultや 10行目の pictureのように,まず,画像を入れる入れ物を準備し,その中に画像を入れて,様々な処理を行う.具体的には,10行目で,pictureという名前の入れ物に ”sample.jpg” という画像ファイルを読み込んで入れている.13行目では,pictureの中身を大きさを調整して cImageの中に入れている.16行目では,画像を表示するためのウインドウを作成している.また,18行目では,作成したウインドウに画像を表示させている.さらに 20行目では,ユーザからのキー入力を待っている.

7

3.3 カメラ画像モノクロ化プログラム

カメラからの入力をモノクロ化するプログラムを動かしてみよう.このプログラムは,実行するとカメラ

映像がカラーとモノクロで表示され, q を押すと終了する.

Program 5 カメラ画像モノクロ化プログラム1 #include <stdio.h>2 #include <opencv2/opencv.hpp>3

4 int main(void)5 {6 // カラー画像を入れる入れ物 cImageを作る7 IplImage *cImage = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U , 3);8 // 白黒画像を入れる入れ物 gImageを作る9 IplImage *gImage = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U , 1);

10

11 // "My Window1"と"My Window2"という名前のウインドウを作る12 cvNamedWindow ("My Window1", CV_WINDOW_AUTOSIZE);13 cvNamedWindow ("My Window2", CV_WINDOW_AUTOSIZE);14

15 // カメラから画像を取得する準備をする16 CvCapture *capture = cvCreateCameraCapture(0);17 // カメラの画像サイズを設定する18 cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH , 640);19 cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT ,480);20

21 // 繰り返し --- ここから ---22 for(;;){23

24 // カメラから画像を一枚ずつ取得して cImageに入れる25 cImage = cvQueryFrame (capture);26

27 // cImageの画像を白黒にしてgImageに入れる28 if(cImage !=NULL)29 cvCvtColor(cImage, gImage, CV_BGR2GRAY);30

31 cvShowImage("My Window1", cImage); // cImageを"My Window1"に表示する32 cvShowImage("My Window2", gImage); // gImageを"My Window2"に表示する33

34 if (cvWaitKey(10) == ’q’) // qを入力したら終わる35 break;36 }37 // 繰り返し --- ここまで ---38

39 // カメラから画像を取得するのをやめる40 cvReleaseCapture (&capture);41

42 cvDestroyAllWindows(); // 作ったウインドウを全て閉じる43

44 return 0;45 }

このプログラムでは,動画像を扱っているが,動画像の処理の場合でも,カメラから次々に送られてくる

各フレームの画像に対する画像処理を行うことが基本なので,難しく考える必要はない.

まず,7行目と 9行目で,カラー画像用の入れ物,白黒画像用の入れ物をそれぞれ作成している.12行目と 13行目では,表示用のウインドウを 2つ作成している.16行目,18行目,19行目では,カメラからの画像をサイズを指定して取得する準備を行っている.

21行目の「繰り返し—ここから—」と 36行目の「繰り返し—ここまで—」の間の処理が,各フレームの画像に対して行われる処理である.

25行目でカメラから現在の画像を取得し cImageという入れ物に入れ,28行目でモノクロ化を行っている.

1 cvCvtColor(cImage, gImage, CV_BGR2GRAY);

という記述は,cvCvtColorという命令により,cImageに入っている画像を色変換して gImageに入れるという処理を意味している.最後の CV BGR2GRAYは色変換がモノクロ化であることを意味している.

30行目でウィンドウ”My Window1”に cImageを表示している.31行目でウィンドウ”My Window2”に gImageを表示している.

8

3.4 背景差分プログラム

ある時刻でのカメラからの入力画像を保存し,現在の入力画像との差分を表示するプログラムを動かし

てみよう.このプログラムは,実行するとカメラ映像がカラーで”My Window1”に表示される. s を押すとその時のカメラ画像がモノクロ画像で保存され,”My Window2”に表示される.そして,差分の結果が”MyWindow3”に表示される.また, p を押すと差分の結果がファイルに保存され, q を押すと終了する.

Program 6 背景差分プログラム1 #include <stdio.h>2 #include <opencv2/opencv.hpp>3

4 int main(void)5 {6 // image という名前のカラー画像を入れる入れ物を作る7 IplImage *image = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U , 3);8

9 // カラー画像を入れる入れ物を幾つか作る10 IplImage *cImageResult = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U , 3);11 // 白黒画像を入れる入れ物を幾つか作る12 IplImage *gImageFG = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U , 1);13 IplImage *gImageBG = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U , 1);14 IplImage *gImageMask = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U , 1);15

16 // "My Window1"と"My Window2"と"My Window3"という名前のウインドウを作る17 cvNamedWindow ("My Window1", CV_WINDOW_AUTOSIZE);18 cvNamedWindow ("My Window2", CV_WINDOW_AUTOSIZE);19 cvNamedWindow ("My Window3", CV_WINDOW_AUTOSIZE);20

21 // カメラから画像を取得する準備をする22 CvCapture *capture = cvCreateCameraCapture(0);23 // カメラの画像サイズを設定する24 cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH , 640);25 cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT ,480);26

27 char inputKey = ’a’;28 // 繰り返し --- ここから ---29 for(;;){30

31 // カメラから画像を一枚ずつ取得して imageに入れる32 image = cvQueryFrame (capture);33

34 if (image == NULL)35 continue;36

37 // image を"My Window1"に表示する38 cvShowImage ("My Window1", image);39

40 // sを入力したらカメラの画像を一枚保存する41 if (’s’ == inputKey){42 // imageの画像を白黒にしてgImageBGに入れる43 cvCvtColor(image, gImageBG, CV_BGR2GRAY);44 // cImageBG を"My Window2"に表示する45 cvShowImage ("My Window2", gImageBG);46 inputKey = ’a’;47 }48

49 // 保存した画像と今の画像の差を表示する50

51 // imageの画像を白黒にしてgImageFGに入れる52 cvCvtColor(image, gImageFG , CV_BGR2GRAY);53 // gImageFGとgImageBGの差をgImageMaskに入れる54 cvAbsDiff(gImageFG , gImageBG , gImageMask);55 // gImageMaskを2値化する56 cvThreshold(gImageMask , gImageMask , 20, 255, CV_THRESH_BINARY);57 // cImageResultの画像を真っ黒にする58 cvSetZero(cImageResult);59

60 // gImageMaskをマスクにしてimageの画像をcImageResultにコピーする61 cvCopy(image, cImageResult , gImageMask);62 // cImageResult を"My Window3"に表示する63 cvShowImage ("My Window3", cImageResult);64

65 // pを入力したら処理結果画像を保存する66 if (’p’ == inputKey){67 // cImageResultをファイルに出力する68 cvSaveImage("out.jpg", cImageResult);69 inputKey = ’a’;70 }71

72 inputKey = cvWaitKey(10);73 if (’q’ == inputKey) // qを入力したら終わる74 break;75 }

9

76 // 繰り返し --- ここまで ---77

78 // カメラから画像を取得するのをやめる79 cvReleaseCapture (&capture);80

81 // 作ったウインドウを全て閉じる82 cvDestroyAllWindows();83

84 return 0;85 }

まず,6行目から 14行目までで,カラー画像用の入れ物,白黒画像用の入れ物をそれぞれいくつか作成して,以降の様々な処理の準備をしている.また,17行目から 19行目でウインドウを 3つ作成している.22行目,24行目,25行目では,カメラからの画像をサイズを指定して取得する準備を行っている.

28行目の「繰り返し—ここから—」と 73行目の「繰り返し—ここまで—」の間の処理が,各フレームの画像に対して行われる処理である.

32行目でカメラから現在の画像を取得し imageという入れ物に入れ,それを 35行目で,ウインドウ”MyWindow1”に表示している.

37行目から 44行目は,キーボードで’s’が押された時の処理である.’s’が押されたときに現在のカメラ画像を背景画像 gImageBGとして保存している.白黒に (モノクロ化)しているのは,差分の抽出をしやすくするためである.

48行目からは背景差分を計算している.49行目で現在のフレーム画像をモノクロ化して,前景 gImageFGとする.そして,前景 gImageFGと背景画像 gImageBGの差分を 51行目で以下のように計算している.

1 cvAbsDiff(gImageFG , gImageBG , gImageMask);

これは,cvAbsDiffという命令により,gImageFGと gImageBGの差分を計算し gImageMaskに入れるという処理を意味している.具体的には,2つの画像の同じ位置の画素の値を引き算して,もう一つの画像のその位置にその計算結果を入れるという処理をすべての画素に対して行う.ここでは引き算の結果が負にならな

いように絶対値を計算する命令 cvAbsDiffを使っている.また,53行目では,差分の計算結果を 2値化してマスク画像を作っている.

1 cvThreshold(gImageMask , gImageMask , 20, 255, CV_THRESH_BINARY);

2値化とは,何らかの条件で,画素値を 2つに分けるもので,OpenCVでは,0と 255の 2つの画素値に分けることで 2値化画像を作成する.ここでは,前景と背景画像の各画素の値の差が 20から 255までのときに 255,それ以外の(20より小さい)ときに 0として 2値化している.

58行目では,現在のカメラからの入力画像をマスクして,差分のある部分だけの(言い換えれば,変化があった部分のみの)画像にしている.

1 cvCopy(image, cImageResult , gImageMask);

具体的には,cvCopyという命令により,imageの中身を cImageResultにコピーするが,その時,コピーする画素は,gImageMaskの画素が 255の値のところのみとしている.なお,前のフレームでの結果を消去するために,55行目で cvSetZeroという命令により,cImageResultのすべての画素値を 0にリセットしている.

3.5 やってみよう:その2

顔検出プログラムを動かして自分の顔が検出されるかどうかやってみよう.

3.6 やってみよう:その3

背景差分プログラムを改造して,以下の図 11のように,自分の好きな背景画像を使ってクロマキー合成をしてみよう.

10

図 11 クロマキー合成

11

4 レポートの作成と提出

レポートの作成

レポートはWordで作成し,PDFファイルに変換して電子メールで提出する.レポートの例を以下の図 12に示すので,項目や体裁をまねて作成すること.長い文章を描く必要は無いので,必ず読み返して,きちん

とした文章になっていることを確認して提出すること.

図 12 レポートの例

レポートの提出

課題の提出や提出後の指示は電子メールで行います.は PDFとして作成し,担当教員までメールで送信してください.また,できるだけ当日の実験時間中に課題を完成させ,提出してください.

提出期限

次週の 13:00より前.できる限り,本実験時間中の提出が望ましい.

(時間中に完成したら)  

担当教員か TAを呼び確認を受ける.「提出して結構です」と言われてから,下の提出方法にしたがって課題を提出する.

(時間中に完成できなかったら)  

各自で完成を判断し,以下の提出方法にしたがって課題を提出する.

提出方法PDFファイルの作成

レポートはWordで作成して,PDFファイルに変換し,メールで送信する.

1. ファイルメニューから「名前を付けて保存」を選択し,ファイルの種類から「PDF」を選択

2. 以下の例にならってファイル名をつける

12

• 2019年 10月 7日に本実験を受講しており,I班で,学籍番号が 18TM001であるとき 20191007-I-18TM001.pdf(すべて半角)

• 2020年 1月 6日に本実験を受講しており,F班で,学籍番号が 16TK030であるとき 20190106-F-16TK030.pdf(すべて半角)

3. 保存場所は「デスクトップ」にする

4. 「保存」をクリック

5. デスクトップにできた「○○.pdf」をダブルクリックし,内容を確認して,左上の×(赤い丸)をクリックして閉じる

※Wordのバージョンによっては,PDFの作成ができないものもあります.各自の自宅のパソコンやノートパソコンでは作成できないかもしれません.その時は,実習室の PCを利用してください.

メールの送信

冒頭で述べた本テーマのWebページから「レポート提出方法」をクリックし,書かれている指示に従う.※参考のため以下にWebページ内容を抜粋して掲載します.メールの送信は埼玉大学のWebメールシステムを利用します.このメールシステムに慣れていない場合は,何度か自分宛に送って練習してから担当教員にレポートを送信してください.

1. Webメールシステムにログインする

2. 新しいメッセージをクリックする

3. 以下のように件名を入力する

[seminar2019rep]工学入門セミナーテーマ 3レポート提出

4. 以下のように本文を入力する.本文中の■■の箇所は適宜編集する.

■■先生

工学部■■■学科■年生,学籍番号■■■■■の

■■■■と申します.

工学入門セミナーのテーマ 3のレポートを提出致します.レポートは PDFファイル形式で本メールに添付致しました.よろしくお願い致します.

–埼玉大学工学部■■■■学科■年生

学籍番号■■■■■■■

(氏名)■■■■■■■■@ms.saitama-u.ac.jp

5. 次の手順で PDFファイルを添付する.

(a) 「添付ファイル」の右の「追加」→「ファイルを選択」をクリック

(b) 上で作成した○○.pdfを選択し,「アップロード」をクリック

6. 配布プリントで指示された提出先メールアドレスを宛先欄に記入する

7. 「送信前プレビュー」をクリックし,内容を確認して,「送信」をクリックする

※提出先メールアドレスは hisato@ms.saitama-u.ac.jp

※埼玉大学のWebメールシステムに関する詳しい使い方は以下を参照してください.   http://www.itc.saitama-u.ac.jp/services/mail/CloudMail.htm

13

指示の確認

「受けとりました」という連絡が担当スタッフからあれば提出完了です.

授業中に提出できなかった場合は,確認メールが届いたら提出完了となります.

• 授業後に提出した場合で,もし〆切後一週間たっても確認メールが届かなかったら,すみやかに担当教員へ申し出てください.

• 授業後に提出した場合で,合格水準に達していなかった場合には,確認メールのかわりに個別指導のメールが届きますので,その指示にしたがってください.

いずれも,放置すると成績が 0点になることがあります.必ず提出完了を確認してください.

※メールが送信できないなど,提出に際して問題が起きた場合には,

  総合研究棟 502室情報工学科福田悠人まで連絡してください.   Tel:048-858-3585

14

Recommended