令和3年度 秋期 応用情報技術者試験 午後 問題 問7 海上生け簀の養殖を支援する給餌装置と残餌検知システムの仕組み
テクノロジ組込み・IoT
学習ガイド
海上の生け簀にIoT機器を導入し、養殖魚への適切な餌やりを自動化するシステムの事例です。カメラで撮影した動画データのサイズの計算や、餌の食べ残しを検知するセンサのカウント値を用いた給餌終了の判定ロジックが問われます。システムの構成図と各装置の機能の説明からデータの流れを把握し、フローチャートの条件分岐が実際の生け簀内の状況とどうリンクしているかを読み解きます。
この記事で押さえる論点
- 動画データや水質データをサーバに送信して分析するIoTシステムの構成を説明できる
- 撮影条件から動画データのサイズを計算し、フラッシュメモリに保存するために必要な処理を述べられる
- カウント値を読み込む前に単位時間待つ理由と、Ct値で給餌の終了を判断する条件を説明できる
- 給餌処理フローの空欄と、食べた餌の重量を求める式を完成できる
出題情報
- 出題
- 2021(R3)秋 応用情報技術者 午後 問7
- 配点
- 20点満点
- 模範解答
- 公表(設問ごとに掲載)
出題趣旨・採点講評(IPA 公表)
食料の安定供給を目指し,農業,畜産業及び飼育漁業において,IoTやAIを導入して良質な食料を安定的に確保するための試みが始まっている。
本問では,IoTを利用して良質な養殖魚を育成し,安定供給するシステムを題材に,システムの仕様を把握する能力,仕様に応じたソフトウェア設計の能力を問う。
問7では,IoTを利用した良質な養殖魚を育成して安定供給するためのスマート生け簀を題材に,仕様の把握,ソフトウェア設計について出題した。全体として正答率は平均的であった。
問題本文
問7 IoTを利用した養殖システムに関する次の記述を読んで,設問1〜3に答えよ。
G社は,海上の生け簀の中で良質な養殖魚の育成を支援する,IoTを利用した養殖システム(以下,スマート生け簀という)を開発している。
〔スマート生け簀のシステム構成〕
スマート生け簀の概観を図1に,スマート生け簀のシステム構成を図2に示す。

図の説明テキスト
海面の様子と海中の生け簀の構成が描かれた模式図。
海面には左右に「ブイ」が浮かび、網はブイからつるされている。海面の上方中央に「給餌部」があり、その右上に「無線通信」の稲妻形の記号、楕円形の「インターネット」、「サーバ」が並び、インターネットとサーバは線で接続されている。
海中にはブイから吊るされた「網」で作られた生け簀があり、中に「養殖魚」が描かれている。
生け簀の左右の網付近には「水質センサ」があり、右側の網付近には「水中ステレオカメラ」が配置されている。
生け簀の底は漏斗状の「集餌コーン」になっており、その下端に「残餌検知部」があり、「残餌センサ」が設置されている。

図の説明テキスト
システム構成を表すブロック図。
左側に大きな横長の長方形で「給餌部」があり、その下に並んで「水中ステレオカメラ」、「残餌検知部」、「水質センサ」の3つの長方形の枠がある。これら3つの枠からは上に向かって線が伸び、「給餌部」に接続されている。
「給餌部」の右上に「無線通信」の稲妻形の記号があり、その右に楕円形の「インターネット」、さらに右側の「サーバ」の枠が線で接続されている。「水質センサ」の枠は複数が重なった形で描かれている。
スマート生け簀は,網をつるすためのブイに接続された水質センサ,水中ステレオカメラ,残餌検知部,及び給餌部で構成される。給餌部は,海中への餌の投入(以下,給餌という)を行う。残餌検知部は,養殖魚が食べ残して沈んでいく餌(以下,残餌という)を収集する集餌コーン及び残餌センサで構成される。給餌部は,残餌検知部で取得した残餌の量を用いて求めた食べた餌の重量,水質センサの計測データ(以下,水質データという),及び水中ステレオカメラで撮影された動画(以下,動画データという)をサーバに送信する。サーバは,蓄積したデータを基にAIで分析し,与える餌の重量(以下,給餌重量という),及び餌を与える日時(以下,給餌日時という)を決定し,給餌部に送信する。
〔給餌部の動作概要〕
(1) 給餌部は,定期的に動画データ及び水質データを受信してフラッシュメモリに保存する。保存した動画データ及び水質データをサーバに送信する。
(2) 給餌部は,給餌重量及び給餌日時をサーバから受信する。指示された給餌日時になると,給餌部は,給餌重量を基に,給餌を行う回数(以下,給餌予定回数という),1回当たりの餌の重量を求める。さらに,給餌の終了判断に用いるしきい値を決定し,次の動作を開始する。
- 給餌部は,1回目の給餌を開始するとともに,残餌検知部を動作させる。
- 残餌は,集餌コーンによって集められる。残餌センサは,通過する残餌を1個ずつカウントし,その値をカウント値とする。カウント方法は,アップカウントとする。
- 給餌部は,5分間隔でカウント値を読み込み,単位時間当たりのカウント値(以下,Ct値という)を求める。Ct値がしきい値より少ないときは,養殖魚が餌を食べ続けていると判断する。Ct値がしきい値以上のときは,養殖魚が餌を食べなくなったと判断する。
- 給餌部は,Ct値がしきい値より少ないときは,給餌予定回数に達するまで給餌を繰り返す。
- 給餌予定回数に到達したとき,又はCt値がしきい値以上のとき,給餌を終了する。終了直前で読み込んだカウント値を,給餌終了時のカウント値とする。
- 給餌部は,給餌を行った回数を基に,実際に給餌した餌の重量を求める。求めた値を用いて,食べた餌の重量を求める。ここで,給餌を行う1個の餌の重量は均一とする。
- 給餌部は,食べた餌の重量をサーバに送信する。
〔サーバの動作概要〕
サーバは,動画データを基に,養殖魚の大きさ・形状・推定個体数を抽出し,水質データと食べた餌の重量を併せて蓄積する。サーバは,蓄積したデータを基にAIで分析し,良質な養殖魚を育成する上で適した給餌重量及び給餌日時を決定して,給餌部に送信する。
〔装置の機能〕
スマート生け簀の構成要素の概要を表1に示す。

図の説明テキスト
| 構成要素名 | 機能概要 |
|---|---|
| 給餌部 | ・給餌重量及び給餌日時をサーバから受信する。 ・給餌重量を基に,給餌予定回数,1回当たりの餌の重量を求める。 ・給餌の終了判断に用いるしきい値を決定し,給餌を行う。 ・動画データ及び水質データを受信すると,フラッシュメモリに保存し,サーバに送信する。 ・給餌終了時のカウント値を用いて,食べた餌の重量を求め,サーバに送信する。 |
| 残餌検知部 | ・集餌コーンで残餌を収集し,残餌センサのカウンタで残餌を1個ずつカウントする。 |
| 水中ステレオカメラ | ・養殖魚を定期的に撮影し,動画データとして給餌部に送信する。 |
| 水質センサ | ・水温,海中の酸素濃度,塩分濃度を計測し,水質データとして給餌部に送信する。 |
| サーバ | ・動画データを基に,養殖魚の大きさ・形状・推定個体数を抽出する。 ・水質データ,食べた餌の重量,及び養殖魚の大きさ・形状・推定個体数を蓄積する。 ・蓄積したデータを基にAIで分析し,給餌重量及び給餌日時を決定して給餌部に送信する。 |
給餌日時になったときの給餌処理フローを図3に示す。

図の説明テキスト
フローチャート: 図3 給餌処理フロー
- ノード: 開始 (端子)
- ノード: 残餌検知部の動作を開始する。
- ノード: 残餌センサのカウンタをゼロクリアする。
- 処理ループの始点(下からのループが合流)
- ノード: 1回分の給餌を行う。
- ノード: 単位時間(5分)待つ。
- ノード: a を読み込む。
- ノード: Ct値を求める。
- 条件分岐: Ct値が b か。
- Yes の場合: 右側の終了処理ルートへ進む
- No の場合: 次の条件分岐へ進む
- 条件分岐: 給餌予定回数に到達したか。
- Yes の場合: 右側の終了処理ルートへ進む
- No の場合: 処理ループの始点へ戻る
- 終了処理ルート(上記2つの Yes 分岐から合流)
- ノード: 給餌終了時の a を用いて食べた餌の重量を求める。
- ノード: 残餌検知部の動作を終了する。
- ノード: 食べた餌の重量をサーバに送信する。
- ノード: 終了 (端子)
設問と解答・解説
設問1
スマート生け簀の動作について,(1),(2)に答えよ。
サーバは良質な養殖魚を育成するために,AIで分析を行って養殖魚を管理している。AIの分析に用いるデータ中には,水質データ,食べた餌の重量,養殖魚の大きさ・形状・推定個体数がある。これらのデータをサーバに蓄積するときに付加すべきデータを答えよ。
模範解答
日時データ
採点基準
- 2点: 「日時データ」「時刻」「タイムスタンプ」など、時間に関するデータが付加すべきものとして明確に記載されている。
- 1点: 時間に関するデータであることが推測できる記述であるが、表現が不正確または不十分である。
- 0点: 時間に関するデータが記載されていない。
- 1点: 要求されたデータの種類が、簡潔かつ適切に表現されている。
- 0点: 要求に対する回答として不適切な形式・内容である。
解説
- サーバは、水質データや食べた餌の重量、養殖魚の情報を蓄積し、AIで分析して「給餌日時」や「給餌重量」を決定します(表1「サーバ」の機能概要)。
- また、給餌部は「定期的に動画データ及び水質データを受信して」(本文〔給餌部の動作概要〕(1))サーバへ送信する仕様となっています。
- これら定期的に収集されるデータを時系列データとして分析し、適切な「日時」を判断するためには、各データが「いつ」取得されたかを示す情報が必要です。
- したがって、蓄積するデータには取得した時刻を示す日時データを付加する必要があります。
高得点のポイント
- データの蓄積および時系列での分析において、時間に関する情報が必要であることを理解し、「日時」や「時刻」といったキーワードを含めていること。
- 回答として簡潔にデータの種類を示す名詞表現になっていること。
給餌部が給餌を開始してから,カウント値を読み込むまでに単位時間待つ必要がある。その理由を30字以内で述べよ。
模範解答
残餌が残餌センサに到達するまでに時間を要するから
採点基準
- 2点: 投入された餌が沈降し、残餌センサに到達するまでに時間を要することが明確に記載されている。
- 1点: 餌が沈むことやセンサまでの距離に関する言及はあるが、到達に時間がかかるという直接的な理由の記述が不十分である。
- 0点: 残餌センサまでの到達時間に関する記述がない。
- 1点: 「〜だから」「〜ため」など、理由を説明する文として論理的に構成されている。
- 0点: 理由を説明する文の構造になっていない。
解説
- 図1「スマート生け簀の概観」を見ると、給餌部は海面の近くにあり、残餌センサは生け簀の底(集餌コーンの下端)に設置されています。
- 本文〔スマート生け簀のシステム構成〕には、「残餌検知部は,養殖魚が食べ残して沈んでいく餌(以下,残餌という)を収集する」と記載されています。
- 給餌部から海面付近に投入された餌が海中を沈降し、生け簀の底にある残餌センサに到達するまでには、物理的な移動時間を要します。
- したがって、給餌を開始してすぐに残餌センサのカウント値を読み込んでも、投入した餌はまだセンサに到達していません。餌が沈んでセンサで検知されるまでの時間経過を待つ必要があるため、単位時間待つ処理が行われます。
高得点のポイント
- 投入された餌が沈み、残餌センサに到達するまでに時間がかかるという物理的な現象を的確に捉えられていること。
- 「〜だから」「〜ため」のように、理由を論理的に説明する文末表現になっていること。
- 問題の指定通り、30字以内(句読点含む)で簡潔にまとめられていること。
設問1(2)は,正答率がやや低かった。餌を投入してから残餌センサが餌を検出するまでの餌の動きを考慮して正答を導き出してほしかった。システムの動作を正確に理解する能力を身に付けてほしい。
設問2
水中ステレオカメラの動画は,左右それぞれ20フレーム/秒であり,1フレームは800×600ピクセルの画素数で,1画素当たりのデータ長は24ビットである。1回当たり2分間の動画を撮影し,給餌部のフラッシュメモリに保存する。
この動画データについて,(1),(2)に答えよ。ここで,1Gバイト=バイトとする。
撮影1回当たりの動画データのサイズは,何Gバイトか。答えは小数第1位を四捨五入して,整数で求めよ。
模範解答
7
解説
- 撮影される動画データのサイズは、「1フレームのデータ量 × 1秒間のフレーム数 × カメラの台数 × 撮影時間」で求められます。
- 1フレームのデータ量: 1フレームの画素数は ピクセルで、1画素あたりのデータ長は ビットです。 ビット= バイトであるため、 ビットは バイトとなります。
- 1秒間のフレーム数とカメラの台数: 水中ステレオカメラは左右それぞれ フレーム/秒で撮影します。ステレオカメラとして左右2台分のデータが必要です。
- 撮影時間: 1回あたり2分間( 秒)撮影します。
- 問題文の条件「 」より、Gバイト単位に変換すると Gバイトになります。
- 最後に、小数第1位の「9」を四捨五入して、整数で と求められます。
動画データを給餌部のフラッシュメモリに保存するために,水中ステレオカメラ内で行う必要がある処理は何か。ここで,給餌部のフラッシュメモリの容量は2Gバイトとする。
模範解答
画像圧縮処理
採点基準
- 2点: 「圧縮処理」「データ圧縮」「画像圧縮」など、データの容量を削減するための処理であることが明確に示されている。
- 1点: データサイズを減らす意図は読み取れるが、「圧縮」という用語が使われていないなど表現が不正確である。
- 0点: データの圧縮に関する記述がない。
- 1点: 「〜処理」「〜圧縮」など、処理の名称として簡潔に表現されている。
- 0点: 要求された処理の名称として不適切な記述である。
解説
- 設問2(1)で計算した通り、水中ステレオカメラによる撮影1回当たりの動画データサイズは約 Gバイト(厳密には Gバイト)となります。
- 一方で、問題文の条件において「給餌部のフラッシュメモリの容量は Gバイトとする」と指定されています。
- 撮影した動画データのサイズがフラッシュメモリの容量を上回っているため、そのままのサイズでは保存することができません。
- したがって、動画データのサイズを Gバイト未満に縮小して保存するための画像圧縮処理(あるいはデータ圧縮処理)を、水中ステレオカメラ内で行う必要があります。
高得点のポイント
- データサイズがメモリ容量を超過している課題を読み取り、サイズを削減するための処理が必要であることに気づけていること。
- 回答が「圧縮処理」「データ圧縮」といった適切な処理名称として簡潔に表現されていること。
設問2(1)は,正答率が低かった。単眼のカメラが2台あるステレオカメラを用いていたが,カメラ1台分しか計算していない誤答が散見された。設問で与えられた条件を正しく理解して計算するよう心掛けてもらいたい。
設問3
給餌処理フローについて,(1),(2)に答えよ。
養殖魚が食べた餌の重量の算出方法について,次の式が与えられている。
食べた餌の重量 = ( c × d ) - ( e × f )
図3中の 空欄a に入れる適切な字句を答えよ。
模範解答
カウント値
採点基準
- 1点: 5分間隔で読み込み、Ct値の計算元となるデータが「カウント値」であることを理解している。
- 0点: 該当するデータを理解していない。
- 1点: 処理の対象として「カウント値」またはそれに類する名詞で簡潔に表現されている。
- 0点: 不適切な形式・内容である。
解説
- 図3「給餌処理フロー」において、空欄aはループ内で「空欄a を読み込む」、および終了処理で「給餌終了時の 空欄a を用いて食べた餌の重量を求める」という処理で使われます。
- 本文〔給餌部の動作概要〕の(2)に「給餌部は,5分間隔でカウント値を読み込み,単位時間当たりのカウント値(以下,Ct値という)を求める」と記述されています。これはフローチャートにおいて「単位時間(5分)待つ」の直後に行われる「空欄a を読み込む」と「Ct値を求める」処理と完全に一致します。
- さらに同段落の後半に「終了直前で読み込んだカウント値を,給餌終了時のカウント値とする」とあり、これを用いて食べた餌の重量の算出に繋げています。
- したがって、空欄aにはカウント値が入ります。
高得点のポイント
- 処理フローの文脈と本文の記述を照らし合わせ、Ct値の計算元となるデータが「カウント値」であることを正しく特定できていること。
- フローチャートの表現に合致する適切な字句として解答できていること。
図3中の 空欄b に入れる適切な字句を答えよ。
模範解答
しきい値以上
採点基準
- 1点: 終了条件が「しきい値以上」であることを正しく理解している。
- 0点: 終了条件を理解していない。
- 1点: 「しきい値以上」という比較条件の形で簡潔に表現されている。
- 0点: 不適切な形式・内容である。
解説
- 図3のフローチャートにおいて、条件「Ct値が 空欄b か。」の分岐でYesへ進むと、ループを抜けて終了処理ルートへ移行します。
- 本文〔給餌部の動作概要〕(2)には、給餌を終了する判断基準として「給餌予定回数に到達したとき、又はCt値がしきい値以上のとき、給餌を終了する」と明確に記載されています。
- フローチャートのもう一つのループ終了条件が「給餌予定回数に到達したか。」となっているため、空欄bに入るもう一方の終了条件はしきい値以上となります。
高得点のポイント
- 本文から給餌を終了するためのCt値に関する条件を正確に読み取り、意味を理解できていること。
- 条件分岐の判断文として自然に繋がるよう、「しきい値以上」という条件式の形で簡潔に表現できていること。
模範解答
選択肢イ: 1回当たりの餌の重量
選択肢ク: 給餌を行った回数
解説
- 式の前半 (c × d) は、実際に給餌した餌の重量を求める部分です。
- 〔給餌部の動作概要〕(2)に「給餌部は,給餌を行った回数を基に,実際に給餌した餌の重量を求める。」とあり、図3では「1回分の給餌を行う。」処理を繰り返します。
- したがって、実際に給餌した餌の重量は「1回当たりの餌の重量」×「給餌を行った回数」で、c・d は イ(1回当たりの餌の重量) と ク(給餌を行った回数) です。掛け算なので c・d の順序は問いません(公式解答の備考も「順不同」)。
各選択肢の解説
- ア(Ct値): 5分間隔で読み込む単位時間当たりのカウント値で、給餌の終了判断に用います。重量の計算には用いません。
- ウ(1個の餌の重量)・オ(給餌終了時のカウント値): 残餌の重量を求める式の後半(e・f)で用います。
- エ(給餌開始時のカウント値): 図3で給餌の前にカウンタをゼロクリアするので、式の要素になりません。
- カ(給餌重量): サーバが決定して送信する与える餌の重量です。途中で給餌を終了した場合は、実際に給餌した重量と異なります。
- キ(給餌予定回数): 途中で給餌を終了した場合は、実際に給餌を行った回数と異なります。
模範解答
選択肢ウ: 1個の餌の重量
選択肢オ: 給餌終了時のカウント値
解説
- 式の後半 (e × f) は、養殖魚が食べ残した餌(残餌)の重量を求める部分です。
- 〔給餌部の動作概要〕(2)に「ここで,給餌を行う1個の餌の重量は均一とする。」とあり、残餌センサは通過する残餌をアップカウントします。図3では給餌の前にカウンタをゼロクリアし、本文で「終了直前で読み込んだカウント値を,給餌終了時のカウント値とする。」と定めているので、給餌終了時のカウント値が残餌の個数です。
- したがって、残餌の重量は「1個の餌の重量」×「給餌終了時のカウント値」で、e・f は ウ(1個の餌の重量) と オ(給餌終了時のカウント値) です。掛け算なので e・f の順序は問いません(公式解答の備考も「順不同」)。
各選択肢の解説
- ア(Ct値): 5分間隔で読み込む単位時間当たりのカウント値で、残餌全体の個数ではありません。
- イ(1回当たりの餌の重量)・ク(給餌を行った回数): 実際に給餌した餌の重量を求める式の前半(c・d)で用います。
- エ(給餌開始時のカウント値): ゼロクリアした直後の値なので、残餌の個数になりません。
- カ(給餌重量)・キ(給餌予定回数): 給餌の指示・予定に関する値で、残餌の個数や重量を表しません。
設問3(1)は,正答率が平均的であった。給餌日時における給餌処理フローを完成させる問題であったが,本文で説明していない用語や機能の解答が散見された。本文で述べられた機能や処理についてよく理解した上で解答してほしい。