Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

AI study/potato's PJT (in dongguk)

[Speech AI] ์ฒญ๊ฐ์žฅ์• ์ธ์„ ์œ„ํ•œ ์‚ฌ์šฉ์ž ๋งž์ถคํ˜• ์†Œ๋ฆฌ ๋ถ„๋ฅ˜ ์‹œ์Šคํ…œ ๊ฐœ๋ฐœ

๊ฐ์ž ๐Ÿฅ” 2021. 4. 29. 13:32
๋ฐ˜์‘ํ˜•

์‹œ์ž‘ํ•˜๋ฉฐ

2019๋…„ AI๊ด€๋ จ ์ˆ˜์—…์„ ์ˆ˜๊ฐ•ํ•˜๋ฉฐ computer vision์— ๋Œ€ํ•ด์„œ ๋ฐฐ์› ๋‹ค. ์ด ์ดํ›„, ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์š•์‹ฌ์ด ์ƒ๊ธฐ๊ธฐ ์‹œ์ž‘ํ–ˆ์œผ๋ฉฐ 3ํ•™๋…„ ์ฃผ์ œ์— 4ํ•™๋…„์ด ์กธ์—…ํ”„๋กœ์ ํŠธ๋กœ ๋‚˜๊ฐ€๋Š” ํ•™์ˆ ๋Œ€ํšŒ์— ์ฐธ์—ฌ๋ฅผ ๋„์ „ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. 4ํ•™๋…„์˜ ์กธ์—…ํ”„๋กœ์ ํŠธ๋Š” ๊ธฐ์—…์—ฐ๊ณ„ ํ”„๋กœ์ ํŠธ๋กœ ์‹ค์ œ๋กœ ๊ธฐ์—… ํ˜„์ง์ž๋“ค๊ณผ ํ•จ๊ป˜ํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋“ค ์ด์—ˆ๋‹ค.

์ด ์‚ฌ๊ฑด์„ ๊ณ„๊ธฐ๋กœ, ๋งŽ์€ ๋Œ€ํšŒ์— ์ฐธ์—ฌํ•˜๋Š” ์šฉ๊ธฐ๋ฅผ ์–ป๊ฒŒ๋œ๋‹ค :) ๋˜, ๋ˆ๊ธฐ์žˆ๊ฒŒ ๋„์ „ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฌผ์„ ๋งŒ์กฑ์Šค๋Ÿฝ๊ฒŒ ๋ฝ‘์•„๋‚ธ ๊ฒฐ๊ณผ ๋‚ด ์ธ์ƒ ์ฒ˜์Œ์œผ๋กœ ํฐ ๋Œ€ํšŒ์—์„œ ์ƒ์„ ๋ฐ›๊ฒŒ ๋œ๋‹ค. ๊ทธ ์ข‹์€ ๊ธฐ์–ต์„ ๋– ์˜ฌ๋ฆฌ๋ฉฐ, ์šฐ๋ฆฌํŒ€์ด ๋งŒ๋“ค์—ˆ๋˜ ์‹œ์Šคํ…œ์„ ๋ฆฌ๋ทฐํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค .

 

1. ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

1.1 ํ”„๋กœ์ ํŠธ ์ฃผ์ œ ์„ ์ • ๋ฐฐ๊ฒฝ

์ฒญ๊ฐ์žฅ์• ์ธ์ด ์†Œ๋ฆฌ๋ฅผ ๋“ฃ์ง€๋ชปํ•ด ๊ฒฉ๋Š” ๋ฌธ์ œ ์ •์˜

โ‘  ์œ„ํ—˜ ๊ฐ์ง€ ์–ด๋ ค์›€

  • ์ฐจ ๊ฒฝ์ ์†Œ๋ฆฌ, ์‚ฌ์ด๋ Œ ์†Œ๋ฆฌ ๋“ฑ ์œ„ํ—˜ ๊ฐ์ง€ ์š”์†Œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ์†Œ๋ฆฌ๋ฅผ ํŒŒ์•…ํ•˜์ง€ ๋ชปํ•˜์—ฌ ์œ„ํ—˜ ๋…ธ์ถœ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค.
  • ์‹ค์ œ ์‚ฌ๋ก€) ์ฒญ๊ฐ์žฅ์• ์ธ์˜ ํ˜„์‹ค๊ณผ ์š”๊ตฌ์‚ฌํ•ญ
 

‘๋ณด์ฒญ๊ธฐ’๋ฟ์ธ ์ฒญ๊ฐ์žฅ์• ๋ณด์กฐ๊ธฐ ์‹œ์žฅ์— ์ƒˆ๋ฐ”๋žŒ ์ผ์œผํ‚จ ็”ท

“๋„Œ ์™œ ๋งจ๋‚  ๋ฒฝ์— ๋ถ™์–ด๋‹ค๋‹ˆ๋ƒ?”์–ด๋Š ๋‚  ์„ ๋ฐฐ๊ฐ€ ๋‚ด๊ฒŒ ๋ฌผ์—ˆ๋‹ค. “๋’ค์—์„œ ์ฐจ๊ฐ€ ๋นต๋นต ๊ฑฐ๋ฆฌ๋Š” ๊ฑธ ๋“ค์„ ์ˆ˜ ์—†์œผ๋‹ˆ๊นŒ์š”. ํ•œ ๋ฒˆ์€ ๊ธฐ๋‹ค๋ฆฌ๋˜ ์šด์ „์ž๊ฐ€ ์„ธ๊ฒŒ ๋ฐ•์•„์„œ ํ—ˆ๋ฆฌ๊ฐ€ ๋‚˜๊ฐˆ ๋ป”ํ•œ ์ ๋„ ์žˆ๊ณ ์š”.” ๋ณด

brunch.co.kr

โ‘ก ์ฒญ๊ฐ ๋ณด์กฐ๊ธฐ๊ธฐ์˜ ๋†’์€ ๊ฐ€๊ฒฉ

  • ํŠน์ • ์†Œ๋ฆฌ๋ฅผ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋†’์€ ๊ฐ€๊ฒฉ์˜ ์ฒญ๊ฐ๋ณด์กฐ๊ธฐ๊ธฐ๋ฅผ ๊ตฌ๋งคํ•ด์•ผ ํ•œ๋‹ค. ์ •๋ถ€ ์ง€์›๊ธˆ ์ œ๋„๊ฐ€ ์žˆ์œผ๋‚˜ ์ด๋ฅผ ์ง€์› ๋ฐ›์ง€ ๋ชปํ•˜๋Š” ์žฅ์• ์ธ์ด ๋‹ค์ˆ˜์˜€๋‹ค.
  • ์‹ค์ œ ์‚ฌ๋ก€) ๋ณด์ฒญ๊ธฐ ๋ณด์กฐ๊ธˆ์˜ ํ˜„์‹ค
 

‘์ตœ๋Œ€ 131๋งŒ์›’ ๋ณด์ฒญ๊ธฐ ๋ณด์กฐ๊ธˆ, ์ ˆ์ฐจ์™€ ์ž๊ฒฉ์กฐ๊ฑด TIP

โ‘  ์ตœ๋Œ€ 131๋งŒ์›๊นŒ์ง€ ์ง€์› =์šฐ์„  ๋ณด์ฒญ๊ธฐ ๋ณด์กฐ๊ธˆ ๋Œ€์ƒ์ž๋Š” 2~6๋“ฑ๊ธ‰ ์ฒญ๊ฐ์žฅ์• ํŒ์ •์„ ๋ฐ›์€ ๋‚œ์ฒญ์ธ์— ํ•œํ•˜๋ฉฐ, ๋“ฑ๊ธ‰๋ณ„ ๊ฐ€๊ฒฉ ์ฐจ์ด ์—†์ด ๋ณด์ฒญ๊ธฐ ์ง€์›๊ธˆ ์ตœ๋Œ€ ์•ก์ˆ˜๋Š” 131๋งŒ์›์ด๋‹ค. ์ด๋ฐ–์— ๋ณด์ฒญ๊ธฐ ๊ตฌ์ž…๋ถ€ํ„ฐ

news.joins.com

โ‘ข ํ˜„์‹ค์  ๋Œ€์•ˆ ๋ถ€์กฑ

  • ์ฒญ๊ฐ์žฅ์• ์ธ์ด ํ˜„์‹ค์ ์œผ๋กœ ์š”๊ตฌํ•˜๋Š” ํ•ญ๋ชฉ์— ๋ถ€ํ•ฉํ•˜๋Š” ์ œํ’ˆ์ด ๊ฑฐ์˜ ์—†๋‹ค.
  • ์‹ค์ œ ์‚ฌ๋ก€) ํ™”์žฌ๊ฒฝ๋ณด๊ธฐ ์„ค์น˜ ํ˜„ํ™ฉ
 

"์ฒญ๊ฐ์žฅ์• ์ธ์šฉ ๊ฒฝ๋ณด์žฅ์น˜, ๋ชจ๋“  ๊ฑด๋ฌผ์— ์„ค์น˜ ์˜๋ฌดํ™” ํ•ด์•ผ" - ๋น„๋งˆ์ด๋„ˆ

์ฒญ๊ฐ์žฅ์• ์ธ์šฉ ์žฌ๋‚œ ๊ฒฝ๋ณด์žฅ์น˜๋ฅผ ๋ชจ๋“  ๊ฑด์ถ•๋ฌผ์— ์˜๋ฌด์ ์œผ๋กœ ์„ค์น˜ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ฃผ์žฅ์ด ์ œ๊ธฐ๋˜์—ˆ๋‹ค. '(๊ฐ€)์žฅ์• ์˜ ๋ฒฝ์„ ํ—ˆ๋ฌด๋Š” ์‚ฌ๋žŒ๋“ค(์•„๋ž˜ ์žฅ๋ฒฝํ—ˆ์‚ฌ)'์€ ์ง€๋‚œ 6์ผ ๊ฒฝ๊ธฐ๋„ ํ™”์„ฑ์—์„œ ๋ฐœ์ƒํ•œ ํ™”์žฌ๋กœ 60๋Œ€

www.beminor.com

 

1.2 ๋ชฉํ‘œ ์ •์˜

์ฒญ๊ฐ์žฅ์• ์ธ์„ ์œ„ํ•œ ์‚ฌ์šฉ์ž ๋งž์ถคํ˜• ์†Œ๋ฆฌ ์•Œ๋ฆผ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†Œ๋ฆฌ๋ฏธ์ œ์•ˆ

  • ์Šค๋งˆํŠธํฐ ์ง„๋™ ์•Œ๋ฆผ ์–ดํ”Œ์„ ๊ตฌํ˜„ํ•จ์œผ๋กœ์จ ์ฒญ๊ฐ์žฅ์• ์ธ๋“ค์ด ๋Š๋ผ๋Š” ์ฒญ๊ฐ ๋ณด์กฐ๊ธฐ๊ตฌ์˜ ๊ฐ€๊ฒฉ์— ๋Œ€ํ•œ ๋ถ€๋‹ด์„ ์ค„์ด๊ณ , ์‚ฌ์šฉ๋ฐฉ๋ฒ•์ด ๊ฐ„๋‹จํ•˜๋ฉฐ, ์ธ์‹ํ•˜๊ณ  ์‹ถ์€ ์†Œ๋ฆฌ๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์„ ํƒํ•˜์—ฌ ์›ํ•˜๋Š” ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ํ•จ

 

1.3 ๋ฒ”์œ„ ์ •์˜

ํ”„๋กœ์ ํŠธ์˜ ๋ฒ”์œ„๋ฅผ ์ •์˜ํ•จ์œผ๋กœ์จ ํ”„๋กœ์ ํŠธ์˜ ์ƒ์„ธํ•œ ์œค๊ณฝ์„ ์žก์•„๋ณด๊ณ , ์ถ”ํ›„ ํ•ด๋‹น ์ฃผ์ œ๋ฅผ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๋„๋ก ๋ฏธ๋ฆฌ ๋ฒ”์œ„๋ฅผ ์ •์˜ํ•ด๋‘๊ณ  ์‹œ์ž‘ํ–ˆ๋‹ค. ์‹ค์ œ๋กœ ๋ณธ ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ• ๋•Œ, ์‚ฌ์šฉ์ž๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€, ์™œ ์ด ์‹œ์Šคํ…œ์„ ๊ฐœ๋ฐœํ•ด์•ผ ํ•˜๋Š”์ง€ ํ—ท๊ฐˆ๋ฆฌ๊ฑฐ๋‚˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ์ƒ๊ฐ์„ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข… ์ƒ๊ฒผ๋Š”๋ฐ ๋ฒ”์œ„ ์„ค์ •์„ ํ•ด๋‘์–ด์„œ ์ฃผ์ œ๋ฅผ ๋‹ค์‹œ ๋‹ค์žก๊ณ  ํŒ€ ํšŒ์˜๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ์ข‹์€ ์—ญํ• ์„ ํ•ด์ฃผ๊ธฐ๋„ ํ•˜์˜€๋‹ค. 

 

2. ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„

2.1 ํ”„๋กœ์ ํŠธ ์„ค๊ณ„

2.1.1 Activity Diagram

Activity Diagram์„ ๊ทธ๋ ค๋ด„์œผ๋กœ์จ ํ”„๋กœ๊ทธ๋žจ์˜ ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ์ •์˜๋ฅผ ํ•˜๊ณ , ์„ค๊ณ„์— ๋Œ€ํ•œ ๋Œ€๋žต์ ์ธ ๊ทธ๋ฆผ์„ ๊ทธ๋ ค๋ณด์•˜๋‹ค.

 

 

2.1.2 AS-IS, TO-BE ๋ถ„์„

AS-IS, TO-BE ๋ถ„์„์„ ํ†ตํ•ด ๋ณธ ์‹œ์Šคํ…œ ๊ตฌํ˜„์„ ํ†ตํ•ด ์–ด๋–ค ์ ์ด ํ•ด๊ฒฐ๋˜๋Š”์ง€, ๊ธฐ์กด ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ํŒŒ์•…ํ•ด๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์กŒ๋‹ค.

โ‘  AS-IS ๋ถ„์„ ๋ฐ ๋ฌธ์ œ ์ •์˜

โ‘ก TO-BE ๋ถ„์„

 

2.1.3 User Journey Map

ํ•ด๋‹น ์‹œ์Šคํ…œ์ด ๊ตฌํ˜„๋˜์—ˆ์„ ๋•Œ, ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฐ˜์‘ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์‹œ๊ฐํ™” ํ•˜์—ฌ ํ‘œํ˜„ํ•จ์œผ๋กœ์จ ๋ณธ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ํ•„์š”์„ฑ์„ ๋”์šฑ ๊ฐ•์กฐํ–ˆ๋‹ค.

์ด user journey map์„ ์‚ดํŽด๋ณด์•„๋„, ์‚ฌ์šฉ์ž์˜ ๋‹ˆ์ฆˆ๊ฐ€ ๋งค์šฐ ๋‹ค์–‘ํ•จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด ๋ชจ๋“  ์‚ฌ์šฉ์ž์˜ ๋‹ˆ์ฆˆ๋ฅผ ์ถฉ์กฑ์‹œ์ผœ์ฃผ๋Š” ์‹œ์Šคํ…œ์ธ ์‚ฌ์šฉ์ž ๋งž์ถคํ˜• ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜์—ฌ Installed Base๋ฅผ ํ™•๋ณดํ•˜๋Š” ๊ฒƒ์„ ์ตœ์ข… ๋ชฉํ‘œ๋กœ ๋‘์—ˆ๋‹ค.

 

2.2 ํ”„๋กœ์ ํŠธ ๊ตฌํ˜„

2.2.1 ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘

๋‘๊ฐ€์ง€์˜ ๋ฐ์ดํ„ฐ ์…‹์„ ์‚ฌ์šฉํ–ˆ๋‹ค. 

FSD Kaggle 2018 Kaggle ๋Œ€ํšŒ๋ฅผ ์œ„ํ•ด Google AudioSet์—์„œ ๋ฐœ์ทŒํ•œ ๋ฐ์ดํ„ฐ์…‹์œผ๋กœ,
18873๊ฐœ์˜ ์‚ฌ์šด๋“œ ๋ฐ์ดํ„ฐ๋ฅผ 41๊ฐœ์˜ ํด๋ž˜์Šค๋กœ ๋ผ๋ฒจ๋งํ•œ ๋ฐ์ดํ„ฐ
Urbansound8K ๋„์‹œ ์˜์ƒ์—์„œ ์ถ”์ถœํ•œ ์‚ฌ์šด๋“œ๋กœ ๊ตฌ์„ฑ๋œ ๋ฐ์ดํ„ฐ์…‹์œผ๋กœ,
8732๊ฐœ์˜ ์‚ฌ์šด๋“œ ๋ฐ์ดํ„ฐ๋ฅผ 10๊ฐœ์˜ ํด๋ž˜์Šค๋กœ ๋ผ๋ฒจ๋งํ•œ ๋ฐ์ดํ„ฐ

์—ฌ๊ธฐ์— ์žˆ๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋Š” ์•Š์•˜๊ณ , ํ”„๋กœ์ ํŠธ ์ฃผ์ œ์— ์ ํ•ฉํ•œ 8๊ฐœ์˜ ํด๋ž˜์Šค๋งŒ ์ผ๋ถ€ ์ถ”์ถœํ•˜์—ฌ ์‚ฌ์šฉํ–ˆ๋‹ค.
ํด๋ž˜์Šค ๋ถˆ๊ท ํ˜• ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ์•„๋ž˜ ํด๋ž˜์Šค์—์„œ๋„ ๋„ˆ๋ฌด ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์œ ํ•œ ๋ฐ์ดํ„ฐ์˜ ๊ฒฝ์šฐ๋„ ์ตœ๋Œ€ 500๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋งŒ ์‚ฌ์šฉํ–ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด 8๊ฐœ์˜ ํด๋ž˜์Šค๋กœ ๋ผ๋ฒจ๋ง ๋œ 2721๊ฐœ์˜ ์‚ฌ์šด๋“œ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ–ˆ๋‹ค.

์‚ฌ์šฉ๋œ 8๊ฐœ์˜ ํด๋ž˜์Šค Knock, Cough, Meow, Chime, Engine_idling, Dog-bark, Siren, Car-horn
print(metadata.class_name.value_counts())


2.2.2 ๋ฐ์ดํ„ฐ ํ˜•ํƒœ ์‹œ๊ฐํ™”

 

์†Œ๋ฆฌ ๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋“  ํ˜•ํƒœ์™€ ํŒŒํ˜•์ด ๋‹ค์–‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐํ™”ํ•˜์—ฌ ๊ทธ ๋ชจ์Šต์„ ์‚ดํŽด๋ณด์•˜๋‹ค.

filename = 'c:/code/dataset/kaggle_sample/00fbb28b.wav'
plt.figure(figsize = (12, 4))
data.sample_rate = librosa.load(filename)
_ = librosa.display.waveplot(data, sr = sample_rate)

ํด๋ž˜์Šค ๋ณ„ ํŒŒํ˜•์€ ์ด๋ ‡๊ฒŒ ๋‚˜ํƒ€๋‚ฌ๋‹ค.

 

2.2.3 ๋ฐ์ดํ„ฐ ์†์„ฑ ๋ถ„์„

โ‘  Audio Channels

  • ์˜ค๋””์˜ค๋Š” ์Šคํ…Œ๋ ˆ์˜ค, ๋ชจ๋…ธ ๋‘ ๊ฐ€์ง€์˜ ํƒ€์ž…์œผ๋กœ ์กด์žฌ
  • ์Šคํ…Œ๋ ˆ์˜ค๋Š” ๋‘๊ฐœ์˜ ์ฑ„๋„, ๋ชจ๋…ธ๋Š” ํ•œ ๊ฐœ์˜ ์ฑ„๋„์„ ๊ฐ€์ง

  • ์ˆ˜์ง‘๋ฐ์ดํ„ฐ๋Š” ๋‘ ๊ฐ€์ง€์˜ ํƒ€์ด์ด ํ˜ผ์žฌ๋˜์–ด ์žˆ๋Š” ํ˜•ํƒœ๋กœ ๋ณด์ž„

โ‘ก Sample Rate

  • ์ด์‚ฐ์ ์ธ ์‹ ํ˜ธ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ ์—ฐ์†์ ์ธ ์‹ ํ˜ธ์—์„œ ์–ป์–ด์ง„ ๋‹จ์œ„๋‹น (์ฃผ๋กœ ์ดˆ) ์ƒ˜ํ”Œ๋ง ํšŸ์ˆ˜
  • ์ˆ˜์ง‘๋ฐ์ดํ„ฐ์˜ Sample Rate๋Š” 96K ~ 11K๋กœ ๋‹ค์–‘
print(audiodf.sample_rate.value_counts(normalize = True))

 

โ‘ข Bit Depth

  • ์˜ค๋””์˜ค๋ฅผ ์„ธ๋ถ„ํ™”ํ•˜์—ฌ ํ‘œํ˜„ํ•˜๋Š” ์ •๋„, ๋น„ํŠธ์˜ ์‹ฌ๋„๋ผ๊ณ  ๋ถ€๋ฆ„.
  • ์ˆ˜์ง‘ ๋ฐ์ดํ„ฐ์˜ Bit Depth ๋˜ํ•œ ๋งค์šฐ ๋‹ค์–‘ํ•˜๊ฒŒ ๋ถ„ํฌํ•จ.
print(audiodf.bit_depth.value_counts(normalize = True))

 

2.2.4 ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ

โ‘  ํ•˜๋‚˜์˜ ์ฑ„๋„๋กœ ํ†ตํ•ฉ

  • ์Šคํ…Œ๋ ˆ์˜ค ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‘ ์ฑ„๋„์˜ ํ‰๊ท ๊ฐ’์„ ์ด์šฉํ•˜์—ฌ ํ•˜๋‚˜๋กœ ๋ณ‘ํ•ฉํ•˜๊ณ , ๋ชจ๋…ธ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•ด ์ฃผ์—ˆ๋‹ค.
import matplotlib.pyplot as plt

# ์›๋ž˜ original ๋ฐ์ดํ„ฐ์˜ ํ˜•ํƒœ
plt.figure(figsize=(12, 4))
plt.plot(scipy_audio)

# ํ•ฉ์ณ์ง„ ์ฑ„๋„
plt.figure(figsize=(12, 4))
plt.plot(librosa_audio)

โ‘ก Sample Rate ๊ฐ’๋“ค์˜ ํ‘œ์ค€ํ™”

  • ๋‹ค์–‘ํ•˜๊ฒŒ ๋ถ„ํฌํ–ˆ๋˜ Sample Rate ๊ฐ’๋“ค์„ ํ‘œ์ค€ํ™” ์‹œ์ผœ์ฃผ๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ๋‹ค.
  • Sample-rate conversion ๊ธฐ์ˆ ์„ ํ™œ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ Sample Rate๋“ค์„ ํ‘œ์ค€ํ™” ์‹œ์ผฐ๋‹ค.
    • Sample-rate conversion? ์ด์‚ฐ์‹ ํ˜ธ์˜ ์ƒ˜ํ”Œ๋ง ์†๋„๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ๊ธฐ๋ณธ ์—ฐ์† ์‹ ํ˜ธ์˜ ์ƒˆ๋กœ์šด ์ด์‚ฐ ํ‘œํ˜„์„ ์–ป๋Š” ๊ณผ์ •
  • Librosa ๋ชจ๋“ˆ์˜ load ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋“ค์˜ Sample Rate๋ฅผ 22.05KHz๋กœ ๋ณ€ํ™˜ํ–ˆ๋‹ค.
    • librosa.load(filename, sr=None) ์ด ํ˜•ํƒœ, sr์„ None์œผ๋กœ ์„ค์ •ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ์ž๋™์œผ๋กœ resampling์ด ์ง„ํ–‰๋จ
    • ๋ณธ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ง€์ •ํ•ด์ฃผ์ง€ ์•Š์•˜๊ธฐ ๋–„๋ฌธ์— resampling์ด ์ง„ํ–‰๋์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Œ.
    • resampling๋œ ๋ฐ์ดํ„ฐ์˜ ๋ถ„ํฌ๋Š” -1๊ณผ 1์‚ฌ์ด๋กœ ์ •๊ทœํ™”๋จ
    • ์ฐธ๊ณ ๋งํฌ
import librosa 
from scipy.io import wavfile as wav

import numpy as np

filename = 'UrbanSound_Dataset_sample/audio/102857-5-0-0.wav' 

librosa_audio, librosa_sample_rate = librosa.load(filename) 
scipy_sample_rate, scipy_audio = wav.read(filename) 

print('Original sample rate:', scipy_sample_rate) 
print('Librosa sample rate:', librosa_sample_rate) 

โ‘ข Bit Depth ๊ฐ’๋“ค์˜ ์ •๊ทœํ™”

  • librosa ๋ชจ๋“ˆ์˜ load ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜์—ฌ ๊ฐ ๋ฐ์ดํ„ฐ๋“ค์˜ Bit Depth๋ฅผ -1 ๊ณผ 1 ์‚ฌ์ด์˜ ๊ฐ’์„ ๊ฐ–๋„๋ก ์ •๊ทœํ™” ์‹œ์ผœ์ฃผ์—ˆ๋‹ค.
print('Original audio file min~max range:', np.min(scipy_audio), 'to', np.max(scipy_audio))
print('Librosa audio file min~max range:', np.min(librosa_audio), 'to', np.max(librosa_audio))

 

2.2.5 ๋ฐ์ดํ„ฐ ํŠน์„ฑ ์ถ”์ถœ

์†Œ๋ฆฌ๋ฐ์ดํ„ฐ๋Š” ๋‹ค๋ฅธ ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ์ฃผํŒŒ์ˆ˜ ๋ฐ ์‹œ๊ณ„์—ด์˜ ํŠน์„ฑ์„ ๋ชจ๋‘ ๋ถ„์„ํ•œ feature๊ฐ€ ํ•„์š”ํ–ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ฒˆ์˜ ์‹คํŒจ๋ฅผ ๋ง›๋ณด๊ณ , ํŒ€์›๋“ค๊ณผ ์—ด์‹ฌํžˆ ๊ณต๋ถ€ํ•œ ๊ฒฐ๊ณผ MFCC ์•๋ฆฌ์ฆ˜์„ ํ™œ์šฉํ•ด์„œ Feature๋ฅผ ์ถ”์ถœํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. MFCC ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ํฌ์ŠคํŒ…์€ ๋‚˜์ค‘์— ํ•˜๋„๋ก ํ•˜๊ณ , ํ”„๋กœ์ ํŠธ์— ํ•„์š”ํ•œ ๊ฐ„๋‹จํ•œ ์ง€์‹๊ณผ ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ๋ณธ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งˆ์ € ์—…๋กœ๋“œ ํ•ด๋ณด๊ฒ ๋‹ค.

  • MFCC (Mel-Frequency Cepstral Coefficients)
    • ์†Œ๋ฆฌ๋ฐ์ดํ„ฐ๋ฅผ ์ผ์ • ๊ตฌ๊ฐ„์œผ๋กœ ๋‚˜๋ˆ„์–ด ํ•ด๋‹น ๊ตฌ๊ฐ„์— ๋Œ€ํ•œ ์ŠคํŽ™ํŠธ๋Ÿผ์„ ๋ถ„์„ํ•˜์—ฌ ํŠน์ง•์„ ์ถ”์ถœํ•ด์ฃผ๋Š” ๋Œ€ํ‘œ์ ์ธ ์Œ์„ฑ์ธ์‹ ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • ์Œ์ •์ด ๋ณ€ํ•ด๋„ MFCC๊ฐ€ ์ผ์ •ํ•˜๊ฒŒ ์œ ์ง€๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ™œ์šฉ๋ฒ”์œ„๊ฐ€ ์ƒ๋‹นํžˆ ๋„“์Œ์„ ์•Œ ์ˆ˜์žˆ๋‹ค.
    • ์†Œ๋ฆฌ์˜ ์ฃผํŒŒ์ˆ˜ ๋ฐ ์‹œ๊ฐ„์˜ ํŠน์„ฑ๊นŒ์ง€ ๋ชจ๋‘ ๋ถ„์„ํ•ด์ค€๋‹ค.
    • ์†Œ๋ฆฌ๋Š” ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์˜ ํŠน์„ฑ๊นŒ์ง€ ๋ถ„์„์ด ํ•„์š”ํ–ˆ๊ณ , ์ฃผ๋ณ€์˜ ์ผ์ •ํ•˜์ง€ ์•Š์€ ์†Œ๋ฆฌ๋ฅผ ์ธ์‹ํ•˜๊ณ , ์Œ์ •์ด ๋‹ฌ๋ผ๋„ ๊ฐ™์€์†Œ๋ฆฌ๋กœ ์ธ์‹ํ•ด์ฃผ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— MFCC ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ๋กœ ํ•œ๋‹ค.
import librosa 
import numpy as np
import pandas as pd
import os

max = 0

def extract_features(file_name):
   
    try:
        audio, sample_rate = librosa.load(file_name, res_type='kaiser_fast') 
        mfccs = librosa.feature.mfcc(y=audio, sr=sample_rate, n_mfcc=40)
#         print(mfccs.shape) # ์ด๊ฑฐ ์ถ”๊ฐ€ํ•ด๋ด„
        mfccsscaled = np.mean(mfccs.T,axis=0)
        global max
        if mfccs.shape[1] > max:
            max = mfccs.shape[1]
#             print(max)

    except Exception as e:
        print("Error encountered while parsing file: ", file_name)
        return None 
     
    return mfccsscaled
    
    
# ๋ฐ์ดํ„ฐ์…‹ path ์ง€์ •
fulldatasetpath = 'C:/code/cap_sound/dataset/final_dataset_500/'

metadata = pd.read_csv('C:/code/cap_sound/dataset/final_500.csv')

features = []

# ๊ฐ ์†Œ๋ฆฌ์— ๋Œ€ํ•ด feature๋ฅผ ์ถ”์ถœ
for index, row in metadata.iterrows():
    
    file_name = os.path.join(os.path.abspath(fulldatasetpath)+'/'+str(row["slice_file_name"]))
    
    class_label = row["class_name"]
    data = extract_features(file_name)
    
    features.append([data, class_label])

# df๋กœ ๋งŒ๋“ค๊ธฐ
featuresdf = pd.DataFrame(features, columns=['feature','class_label'])

print('Finished feature extraction from ', len(featuresdf), ' files') 
print('Max :',max)

 

์š”์•ฝํ•ด์„œ ์ถ”์ถœ๋œ feature๋ฅผ ์‚ดํŽด๋ณด๋ฉด

mfccs = librosa.feature.mfcc(y = librosa_audio, sr = librosa_sample_rate, n_mfcc = 40)
print(mfccs.shape)

import librosa.display
librosa.display.specshow(mfccs, sr = librosa_sample_rate, x_axis = 'time')

 

2.2.6 ๋ชจ๋ธ ๊ตฌ์ถ•

๋ฐฐ์šด ์ง€์‹์„ ํ™œ์šฉํ•ด๋ณด๊ณ ์ž ์„ธ ๊ฐ€์ง€์˜ ๋ชจ๋ธ์„ ๊ตฌ์ถ•ํ–ˆ๊ณ , ๊ฐ ๋ชจ๋ธ ๋ณ„ Accuracy๋ฅผ ๋ณด๊ณ  ์ตœ์ข… ๋ชจ๋ธ์„ ๊ฒฐ์ •ํ•˜์˜€๋‹ค. 

โ‘  ๋ฐ์ดํ„ฐ ๋ถ„ํ•  ๋ฐ ์ €์žฅ

  • ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ๋ฐ ๋ผ๋ฒจ ์ธ์ฝ”๋” ์ ์šฉ
    • Sklearn์˜ labelEncoder๋ฅผ ์ ์šฉํ–ˆ๋‹ค.
    • ๋ฒ”์ฃผํ˜• ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์น˜ํ˜• ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ
from sklearn.preprocessing import LabelEncoder
from keras.utils import to_catagorical

x = np.array(featuresdf.feature.tolist())
y = np.array(featuresdf.class_label.tolist())

le = LabelEncoder()
yy = to_categorical(le.fit_transform(y))

 

โ‘ก ๋ฐ์ดํ„ฐ ๋ถ„ํ• 

  • sklearn์˜ train_test_split์„ ์ ์šฉํ•˜์—ฌ train:test = 8:2๋กœ ๋ถ„ํ• ํ–ˆ๋‹ค.
from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(X, yy, test_size = 0.2, random_state = 42)

 

2.2.6.1 MLP (Multi-Layer Perception)

  • ๋ชจ๋ธ ์„ ์ • ์ด์œ 
    • ์‹ ๊ฒฝ๋ง์˜ ๊ธฐ๋ณธ์ด ๋˜๋Š” ๋ชจ๋ธ๋กœ์„œ, ์ž…๋ ฅ์ธต, ์€๋‹‰์ธต, ์ถœ๋ ฅ์ธต์˜ ๋‹จ์ˆœํ•œ ๊ตฌ์กฐ๋กœ ๊ตฌํ˜„์ด ์šฉ์ดํ•˜์—ฌ ํ•™์Šต ์†Œ์š”์‹œ๊ฐ„์ด ์งง์œผ๋ฏ€๋กœ ์ฑ„ํƒ
    • ์ง€๋„ํ•™์Šต์ด ํ•„์š”ํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ, ์Œ์„ฑ์ธ์‹ ํ˜น์€ ์ด๋ฏธ์ง€ ์ธ์‹์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ
  • ๋ชจ๋ธ ๊ตฌํ˜„
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Convolution2D, MaxPooling2D
from keras.optimizers import Adam
from keras.utils import np_utils
from sklearn import metrics 

num_labels = yy.shape[1]
filter_size = 2

# Construct model 
model = Sequential()

model.add(Dense(256, input_shape=(40,)))
model.add(Activation('relu'))
model.add(Dropout(0.5))

model.add(Dense(256))
model.add(Activation('relu'))
model.add(Dropout(0.5))

model.add(Dense(num_labels))
model.add(Activation('softmax'))
  • ์™„์ „ ์—ฐ๊ฒฐ ๊ณ„์ธต 3์ธต์œผ๋กœ ๊ตฌ์„ฑ
  • ํ™œ์„ฑํ™” ํ•จ์ˆ˜๋Š” ๊ฐ layer ๋งˆ๋‹ค ReLU, ReLU, softmax ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ
  • Batch 256 / epoch ๋Š” 100, 150,,,, 1000 ๊นŒ์ง€ ๋‹ค์–‘ํ•˜๊ฒŒ ํ•™์Šต ์ง„ํ–‰
  • ํ•™์Šต ์ง„ํ–‰
from keras.callbacks import ModelCheckpoint 
from datetime import datetime 

num_epochs = 1000
num_batch_size = 32

# ์–˜ ์›๋ž˜ ์žˆ๋Š” ๋ชจ๋ธ์„ ์“ฐ๋Š”๊ฒŒ ๋งž๋Š”์ง€
checkpointer = ModelCheckpoint(filepath='C:/code/cap_sound/save_models/weights.best.basic_mlp.hdf5', 
                               verbose=1, save_best_only=True)
start = datetime.now() 

model.fit(x_train, y_train, batch_size=num_batch_size, epochs=num_epochs, validation_data=(x_test, y_test), callbacks=[checkpointer], verbose=1)


duration = datetime.now() - start
print("Training completed in time: ", duration)
  • ์‹คํ–‰๊ฒฐ๊ณผ ํ•™์Šต์‹œ๊ฐ„์ด ๋งค์šฐ ์งง๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์—ˆ์Œ. (epoch 1000 ์ผ๋•Œ ํ•™์Šต ์†Œ์š” ์‹œ๊ฐ„ ์•ฝ 38์ดˆ)
  • ์ „์ฒ˜๋ฆฌ ๋ฐ MFCC ๋ฅผ ์ ์šฉํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋”ฐ๋กœ ๋ณ€ํ˜•์—†์ด ๋ฐ”๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ ์ด ํŽธ๋ฆฌํ–ˆ์Œ.

 

2.2.6.2 CNN (Convolutional Nural Network)

  • ๋ชจ๋ธ ์„ ์ • ์ด์œ 
    • ๋ณธ์งˆ์ ์œผ๋กœ๋Š” ๋‹จ์ˆœํ•œ MLP์˜ ํ™•์žฅ์ด์ง€๋งŒ, ์ž…๋ ฅ์ธต, ์ปจ๋ณผ๋ฃจ์…˜์ธต, ํด๋ง์ธต, ์™„์ „์—ฐ๊ฒฐ๊ณ„์ธต์ด ๊ฒฐํ•ฉ๋œ ํ˜•ํƒœ๋กœ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ MLP๋ณด๋‹ค ๋” ์ข‹์€ ์„ฑ๋Šฅ์„ ๋ฐœํœ˜ํ•˜๊ธฐ์— ์ฑ„ํƒ

โ‘  ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ, ํŠน์ง• ์ถ”์ถœ, ์ œ๋กœํŒจ๋”ฉ ์ˆ˜ํ–‰

# extract feature ํ•จ์ˆ˜ ์žฌ์ •์˜
import numpy as np
max_ped_len = 1287
test_num = 0

def extract_features(file_name):
	try:
      audio, sample_rate = librosa.load(file_name, res_type = 'kaiser_fast')
      mfccs = librosa.feature.mfcc(y=audio, sr = sample_rate, n_mfcc = 40)
      pad_width = max_pad_len - mfcc.shape[1]
      mfccs = np.pad(mfccs, pad_width = ((0, 0), (0, pad_width)), mode = 'constant')
    
    except Exception as e:
    	print("Error ๋ฐœ์ƒ: ", file_name)
        return None
	
    return mfccs
import pandas as pd
import os
import librosa

fulldatasetpath = 'C:/AI/final_dataset_500/'
metadata = pd.read_csv("C:/AI/final_500.csv')
features = []

for index, row in metadata.iterrows():
	file_name = os.path.join(os.path.abspath(fulldatasetpath) + '/' + str(row["slice_file_name"]))
    
    class_label = row['class_name']
    data = extract_features(file_name)
    
    features.append([data, class_label])

featuresdf = pd.DataFrame(features, columns = ['feature', 'class_label'])

print("Finished feature extraction from ', len(featuresdf), ' files')    

โ‘ก ํ•™์Šต ๋ฐ์ดํ„ฐ reshape

num_rows = 40
num_columns = 1287
num_channels = 1

prnt("train data shape")
print(x_train.shape)
print(x_test.shape)

x_train = x_train.reshape(x_train.shape[0], num_rows, num_columns, num_channels)
x_test = x_test.reshape(x_test.shape[0], num_rows, num_columns, num_channels)

print("\ntrain data reshape ๊ฒฐ๊ณผ")
print(x_train.shape)
print(x_test.shape)

โ‘ข ๋ชจ๋ธ ๊ตฌํ˜„

import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Convolution2D, MaxPooling2D, GlobalAveragePooling2D
from keras.optimizers import Adam
from keras.utils import np_utils
from sklearn import metrics

num_labels = yy.shape[1]
filter_size = 2

#CNN๋ชจ๋ธ ๊ตฌํ˜„
model = Sequential()
model.add(Conv2D(filters = 16, kernel_size = 2, input_shape = (num_rows, num_columns, num_channels), activation = 'relu'))
model.add(MaxPooling2D(pool_size = 2))
model.add(Dropout(0.2))

model.add(Conv2D(filters = 32, kernel_size = 2, activation = 'relu'))
model.add(MaxPooling2D(pool_size = 2))
model.add(Dropout(0.2))

model.add(Conv2D(filters = 64, kernel_size = 2, activation = 'relu'))
model.add(MaxPooling2D(pool_size = 2))
model.add(Dropout(0.2))

model.add(Conv2D(filters = 128, kernel_size = 2, activation = 'relu'))
model.add(MaxPooling2D(pool_size = 2))
model.add(Dropout(0.2))
model.add(GlobalAveragePooling2D())

model.add(Dense(num_labels, activation = 'softmax'))


#์ปดํŒŒ์ผ
model.compile(loss = 'categorical_crossentropy'
				, metrics = ['accuracy']
                , optimizer = 'adam')
                
model.summary()
score = model.evaluate(x_test, y_test, verbose = 1)
accuracy = 100 * score[1]

print('Pre-training accuracy: %.4f%%' % accuracy)
  • ๋ชจ๋ธ ์„ค๋ช…
    • 4๊ฐœ์˜ convolution ๊ณ„์ธต๊ณผ 4๊ฐœ์˜ Max pooling ๊ณ„์ธต์œผ๋กœ ๊ตฌ์„ฑ
    • ๊ฐ layer์˜ ํ™œ์„ฑํ™”ํ•จ์ˆ˜๋Š” ReLUํ•จ์ˆ˜, ์ถœ๋ ฅ์ธต์€ softmaxํ•จ์ˆ˜๋ฅผ ์ด์šฉ
    • drop out ๊ฐ’์€ 0.2
  • ํ•™์Šต ์ง„ํ–‰
    • batch 256
    • epoch๋Š” 100, 150,,, 1000 ๊นŒ์ง€ ๋‹ค์–‘ํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•ด๋ด„
  • ํŠน์ด์‚ฌํ•ญ
    • CNN๋ชจ๋ธ์—์„œ๋Š” ์ธํ’‹ ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๊ฐ€ (3์ฐจ์›)์œผ๋กœ ๋ชจ๋‘ ๋™์ผํ•ด์•ผํ•จ
    • ๊ทธ๋Ÿฌ๋‚˜ MFCC ์ „์ฒ˜๋ฆฌ๊ฐ€ ์ ์šฉ๋œ ๋ฐ์ดํ„ฐ์˜ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์œผ ๋ชจ๋‘ ๋‹ค์–‘ํ•œ shape์„ ๋ณด์œ ํ•˜๊ธฐ์— ๋ชจ๋‘ ๋™์ผํ•œ ํ˜•ํƒœ๋กœ reshape์ด ๋”ฐ๋กœ ํ•„์š”ํ–ˆ์Œ. 

MFCC ์ „์ฒ˜๋ฆฌ๋œ ๋ฐ์ดํ„ฐ์˜ ๋‹ค์–‘ํ•œ shape

  • ๋”ฐ๋ผ์„œ max len = 1287๋กœ ์ œ๋กœํŒจ๋”ฉ์„ ์ˆ˜ํ–‰ํ•ด์ฃผ์—ˆ์Œ.
  • ๊ฒฐ๋ก ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ shape๋Š” ์•„๋ž˜ ํ‘œ ์ฒ˜๋Ÿผ ๋ณ€ํ™”ํ•จ

 

2.2.6.3 LSTM (Long Short-Term Memory)

  • ๋ชจ๋ธ ์„ ์ • ์ด์œ 
    • RNN์˜ ์•ฝ์ ์œผ๋กœ ์ง€์ ๋˜๋Š” Vanishing Gradient Problem์„ ๊ฐœ์„ ํ•œ ๋ชจ๋ธ๋กœ, ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์—์„œ RNN๋ณด๋‹ค ์ข‹์€ ์„ฑ๋Šฅ์„ ๋ณด์ด๋ฏ€๋กœ ์ฑ„ํƒ

โ‘  ํ•™์Šต๋ฐ์ดํ„ฐ reshape

print("train data shape")
print(x_train.shape)
print(x_test.shape)

#x_train=x_train.reshape(2176,40,1)
x_train = np.reshape(x_train, (len(x_train), len(x_train[0]), -1))
x_test = np.reshape(x_test, (len(x_test), len(x_test[0]), -1))

#print(y_train.shape)
#print(y_test.shape)

print("\ntrain data reshape ๊ฒฐ๊ณผ")
print(x_train.shape)
print(x_test.shape)

 

โ‘ก ๋ชจ๋ธ ๊ตฌํ˜„

import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Convolution2D, Conv2D, MaxPooling2D, GlobalAveragePooling2D
from keras.layers import GRU, LSTM, Embedding               # RNN
from keras.optimizers import Adam
from keras.utils import np_utils
from sklearn import metrics 

num_labels = y_train.shape[1]

#LSTM ๋ชจ๋ธ ๊ตฌํ˜„
model = Sequential()    
model.add(LSTM(256,input_shape=(40,1),return_sequences=False))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))
	#model.add(TimeDistributed(Dense(vocabulary)))
model.add(Dense(num_labels, activation='softmax'))

model.compile(loss='categorical_crossentropy', metrics=['accuracy'], optimizer='adam')
# Display model architecture summary 
model.summary()
  •  ๋ชจ๋ธ ์„ค๋ช…
    • LSTM ๋ชจ๋ธ์— ์™„์ „์—ฐ๊ฒฐ๊ณ„์ธต 5๊ฐœ ์—ฐ๊ฒฐ
    • ๊ฐ ๊ณ„์ธต์—์„œ ReLUํ•จ์ˆ˜, ์ถœ๋ ฅ๊ณ„์ธต์—์„œ softmaxํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ
    • 5๊ฐœ์˜ Dense
    • drop out 0.2
  • ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•™์Šต ์ง„ํ–‰
    •  Batch 256
    • epoch๋Š” 100, 150,,,,, 1000 ๊นŒ์ง€ ๋‹ค์–‘ํ•˜๊ฒŒ ์ง„ํ–‰ํ•ด๋ด„
  • ํŠน์ด์‚ฌํ•ญ
  • LSTM๋ชจ๋ธ์„ ์ž์—ฐ์–ด ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉ์‹œ, ์ธํ’‹๋ฐ์ดํ„ฐ๋ฅผ ์ˆซ์ž ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ์œ„ํ•ด ์ฃผ๋กœ ์›-ํ•ซ์ธ์ฝ”๋”ฉ์„ ์ ์šฉํ•œ๋‹ค.
  • ์•ž์„œ MLP๋ชจ๋ธ์—์„œ ์ •์˜ํ•œ ์ „์ฒ˜๋ฆฌํ•จ์ˆ˜ (Extract_feature) ์—์„œ MFCC์ ์šฉ์„ ํ†ตํ•ด ์ธํ’‹๋ฐ์ดํ„ฐ๋ฅผ ์ˆซ์ž๋กœ ๋ณ€ํ™˜ํ•˜์˜€๊ธฐ์— ๋ณ„๋„์˜ ์ธ์ฝ”๋”ฉ์€ ์ง„ํ–‰ํ•˜์ง€ ์•Š์•˜๋‹ค. ๋‹ค๋งŒ, ๋ฐ์ดํ„ฐ์˜ shape๋งŒ ์‚ด์ง ๋ฐ”๊พธ์–ด ์ฃผ์—ˆ๋‹ค.

 

2.2.7 ๋ชจ๋ธ ์ •ํ™•๋„ ๋น„๊ต ๋ฐ ๋ชจ๋ธ ์„ ํƒ

MLP, CNN, LSTM ๊ฐ๊ฐ epoch 300, eopch 300, eopch 600์—์„œ accuracy ๊ฐ€ ๊ฐ€์žฅ ๋†’๊ฒŒ ๋‚˜ํƒ€๋‚ฌ๋‹ค. ์ •ํ™•๋„๋Š” CNN > MLP > LSTM ์ˆœ์œผ๋กœ ๋†’์•˜๊ณ , ํ•™์Šต ์‹œ๊ฐ„์€ MLP, LSTM, CNN ์ˆœ์œผ๋กœ ์งง์•˜๋‹ค. LSTM์€ ์ •ํ™•๋„๊ฐ€ 85% ๋ฏธ๋งŒ์ด๊ณ , ํ•™์Šต์‹œ๊ฐ„์€ MLP ๋Œ€๋น„ ๊ธธ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋ธ ์ฑ„ํƒ์—์„œ ์ œ์™ธํ•˜๊ณ , ์„ฑ๋Šฅ์ด ์ข‹์ง€๋งŒ ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ฆฌ๋Š” CNN๊ณผ ์„ฑ๋Šฅ์ด ๋‹ค์†Œ ๋–จ์–ด์ง€์ง€๋งŒ ํ•™์Šต์‹œ๊ฐ„์ด ์งง์€ MLP ์ค‘์— ๋ชจ๋ธ์„ ์„ ํƒํ•˜๊ธฐ๋กœ ํ•œ๋‹ค.

2.2.7.1 MFCC ๋ณ€๊ฒฝ

๊ต์ˆ˜๋‹˜๊ป˜์„œ ์ธํ’‹ ๋ฐ์ดํ„ฐ์˜ ๊ธธ์ด๊ฐ€ ๊ธด ๊ฒฝ์šฐ์™€ ์งง์€ ๊ฒฝ์šฐ์˜ ๊ฒƒ์ค‘ ์–ด๋Š ๊ฒƒ์ด ๋” ์ •ํ™•๋„๊ฐ€ ๋†’์„์ง€์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์—ฐ๊ตฌ๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ์ด๋ผ๋Š” ์˜๊ฒฌ์„ ์ฃผ์…ง๋‹ค. ๋”ฐ๋ผ์„œ MFCC ์˜ ํ”„๋ ˆ์ž„ ๊ธธ์ด๋ฅผ ๋ณ€๊ฒฝํ•ด์„œ ๋ชจ๋ธ ํ•™์Šต์„ ์ง„ํ–‰ํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ MFCC์—์„œ๋Š” ์ด ํ”„๋ ˆ์ž„์˜ ๊ธธ์ด๊ฐ€ 20~40ms ์ •๋„์ด๋‹ค. ํ”„๋ ˆ์ž„์˜ ๊ธธ์ด๊ฐ€ ๋„ˆ๋ฌด ๊ธธ๋ฉด ์ฃผํŒŒ์ˆ˜ ๋ถ„์„์—์„œ ์‹ ๋ขฐ๋„๊ฐ€ ๋–จ์–ด์ง„๋‹ค. ๋˜ํ•œ ํ”„๋ ˆ์ž„์˜ ๊ธธ์ด๊ฐ€ ๋„ˆ๋ฌด ์งง์œผ๋ฉด ํ•œ ํ”„๋ ˆ์ž„ ๋‚ด ์‹ ํ˜ธ ๋ณ€ํ™”๊ฐ€ ์ปค์ง€๊ธฐ ๋–„๋ฌธ์— ์ข‹์ง€ ์•Š์•˜๋‹ค. ๊ฐ€์žฅ ์ข‹์€ ๋ชจ๋ธ MLP ์™€ CNN ๋ชจ๋ธ ์ค‘, MFCC ๊ธธ์ด์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์„œ ๋˜ ํ•™์Šต์„ ์ง„ํ•ดํ•ด ๋ณด์•˜๋‹ค. MFCC=20์ผ๋•Œ์™€ MFCC=40์ผ๋•Œ์˜ ๋ชจ๋ธ์„ ๋น„๊ตํ•˜์—ฌ ์ตœ์ข… ๋ชจ๋ธ์„ ์„ ํƒํ•  ๊ฒƒ์ด๋‹ค.

๋ชจ๋ธ ํ•™์Šต ๊ฒฐ๊ณผ, ์šฐ๋ฆฌ ํŒ€์˜ ์ตœ์ข… ๋ชจ๋ธ์€ MFCC = 40 ์ผ๋•Œ, CNN๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

2.2.8 ๊ฒฐ๊ณผ ์˜ˆ์‹œ

์ตœ์ข… ์„ ํƒ๋œ ๋ชจ๋ธ๋กœ ์†Œ๋ฆฌ๋ฅผ ๋ถ„๋ฅ˜ํ•ด ๋ณด๊ฒ ๋‹ค.

def print_prediction(file_name):
    prediction_feature = extract_feature(file_name) 

    predicted_vector = model.predict_classes(prediction_feature)
    predicted_class = le.inverse_transform(predicted_vector) 
    print("The predicted class is:", predicted_class[0], '\n') 

    predicted_proba_vector = model.predict_proba(prediction_feature) 
    predicted_proba = predicted_proba_vector[0]
    for i in range(len(predicted_proba)): 
        category = le.inverse_transform(np.array([i]))
        print(category[0], "\t\t : ", format(predicted_proba[i], '.32f') )
filename = 'UrbanSound Dataset sample/audio/100648-1-0-0.wav'
print_prediction(filename) 

์ž๋™์ฐจ ์†Œ๋ฆฌ๋ฅผ ๋ฌด์‚ฌํžˆ ์ž๋™์ฐจ ์†Œ๋ฆฌ๋ผ๊ณ  ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค!!

filename = '../Evaluation audio/siren_1.wav'
print_prediction(filename) 

๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ์…‹์„ ์‚ฌ์šฉํ•ด๋„ ๋ฌด์‚ฌํžˆ ์‚ฌ์ด๋ Œ ์†Œ๋ฆฌ๋ฅผ ์‚ฌ์ด๋ Œ ์†Œ๋ฆฌ๋กœ ๊ตฌ๋ณ„ํ•  ์ˆ˜์žˆ์—ˆ๋‹ค.
์šฐ๋ฆฌํŒ€์€ ์ผ์ • ์†Œ๋ฆฌ์œผ 

2.2.9 ํ”„๋กœํ† ํƒ€์ž… ์ œ์ž‘

์šฐ๋ฆฌ์˜ ์ฃผ์ œ๋Š” ์• ์ดˆ์— '์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜'์ด์ง€๋งŒ, ์ œํ•œ ์‹œ๊ฐ„ ์ด๋‚ด๋กœ ์•ˆ๋“œ๋กœ์ด๋“œ์™€ Java๋ฅผ ์ˆ™๋ จ์‹œ์ผœ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹ค์ œ๋กœ ์ œ์ž‘ํ•˜๊ธฐ์—” ๋ฌด๋ฆฌ๊ฐ€ ์žˆ์—ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ ํŒ€์€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๋ณด์ผ ์ˆ˜ ์žˆ๋Š” exe ํŒŒ์ผ์„ ์ œ์ž‘ํ•˜์—ฌ ํ”„๋กœํ† ํƒ€์ž…์„ ์ œ์ž‘ํ•™๋กœ ํ•˜๊ณ  ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ์—ˆ๋‹ค. python์œผ๋กœ ๊ตฌํ˜„ํ•œ ๋ชจ๋ธ๊ณผ PyQt๋ฅผ ์—ฐ๋™์‹œ์ผœ ํ”„๋กœํ† ํƒ€์ž…์„ ์ œ์ž‘ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. 

์•„๋ž˜ ๋ฐฉ๋ฒ•์œผ๋กœ ํ”„๋กœํ† ํƒ€์ž… ์ œ์ž‘์„ ์ง„ํ–‰ํ–ˆ๋‹ค.

ํ”„๋กœํ† ํƒ€์ž… pyqt ์‹คํ–‰ ์žฅ๋ฉด

 

ํ”„๋กœํ† ํƒ€์ž… ์ง„ํ–‰ ๊ณผ์ •

ํ•ด๋‹น ๋งˆ์ง€๋ง‰ ๊ณผ์ •์€ ๋‚ด๊ฐ€ ์ฐธ์—ฌํ•œ ๊ฒƒ์ด ์•„๋‹Œ ํŒ€์›์˜ ์ž‘ํ’ˆ์ด๊ธฐ์— ์ž์„ธํ•œ ์ฝ”๋“œ๋Š” ์ฒจ๋ถ€ํ•˜์ง€ ์•Š๊ณ , ์ตœ์ข… ๊ฒฐ๊ณผ๋ฌผ์„ ์—…๋กœ๋“œ ํ•ด๋ณด๊ฒ ๋‹ค.

์ง„์งœ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์•„๋‹ˆ๋”๋ผ๋„ ์ด๋ ‡๊ฒŒ ํ”„๋กœํ† ํƒ€์ž…์œผ๋กœ ์ œ์ž‘ํ•˜์—ฌ ์‹ค์ƒํ™œ์—์„œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋ ์ง€ ์ง์ ‘ ๊ตฌํ˜„ํ•˜์—ฌ ๋ฐœํ‘œํ•œ ์ ์ด ํ•™์ˆ ๋Œ€ํšŒ ๊ธˆ์ƒ ์ˆ˜์ƒ์— ๊ฐ€์žฅ ํฐ ์˜ํ–ฅ์„ ๋ผ์นœ ๊ฒƒ์ด ์•„๋‹๊นŒ ์ƒ๊ฐํ–ˆ๋‹ค. ๋ณดํ†ต ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์†Œ๋ฆฌ๋ฅผ inputํ•ด์„œ, out๋˜๋Š” ๊ฒฐ๊ณผ๊ฐ’์„ ๋ณด์—ฌ์ฃผ๋Š” ๋ถ„๋ฅ˜์˜ ๊ฐ€๋Šฅ์„ฑ์„ ๋ณด์—ฌ์ฃผ์—ˆ๋Š”๋ฐ, ์šฐ๋ฆฌ ํŒ€์€ ์‹ค์ œ๋กœ ์†Œ๋ฆฌ๋ฅผ ๋“ค๋ ค์ฃผ๊ณ , ์ด๋ฅผ ๋ถ„๋ฅ˜ํ•˜๋Š” ๊ณผ์ •๊นŒ์ง€ ๋™์˜์ƒ์„ ํ†ตํ•ด ๋ณด์—ฌ์ฃผ๋ฉด์„œ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ธ์ • ๋ฐ›์„ ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ์†Œ๋ฆฌ๋ฅผ ์„ ํƒํ•˜๊ณ , ํ•ด๋‹น ์†Œ๋ฆฌ์— ์›ํ•˜๋Š” ์ง„๋™ํŒจํ„ด์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์—ˆ๋‹ค. ๋˜ํ•œ ์ฒญ๊ฐ์žฅ์• ์ธ์ด ์ด‰๊ฐ์œผ๋กœ ์†Œ๋ฆฌ๋ฅผ ๋Š๋‚„ ์ˆ˜ ์žˆ๋„๋ก ์ง„๋™์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ–ˆ์ง€๋งŒ, ๋ฐœํ‘œ๋ผ๋Š” ํŠน์„ฑ์ƒ ํ”„๋กœํ† ํƒ€์ž…์˜ ์ฒญ๊ฐ ๋ฐ ์‹œ๊ฐ์ ์ธ ํšจ๊ณผ๋ฅผ ์œ„ํ•ด ์‚--- ์†Œ๋ฆฌ๋ฅผ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„ํ•ด ๋ณด์•˜๋‹ค.

 

 

3. ๊ธฐ๋Œ€ํšจ๊ณผ ๋ฐ ์ถ”ํ›„ ์—ฐ๊ตฌ ๋ฐฉํ–ฅ

  • ๊ธฐ๋Œ€ํšจ๊ณผ
    • ๋ฒ”์ฃ„ ๋ฐœ์ƒ๋ฅ ์ด ๋†’์€ ์ง€์—ญ์— ๊ธฐ๊ธฐ๋ฅผ ์„ค์น˜ํ•˜์—ฌ ๋ฐฉ๋ฒ•์šฉ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • ์ด์–ดํฐ ์ฐฉ์šฉ์ค‘์—๋„ ์ฐจ ๊ฒฝ์  ๋ฐ ์—”์ง„์†Œ๋ฆฌ๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ์•Œ๋ฆผ์„ ์ฃผ๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๋ฐœ์ „ ๊ฐ€๋Šฅ
    • ์ฒญ๊ฐ์žฅ์• ์ธ์„ ์œ„ํ•œ ์‹œ์„ค ๋น„์šฉ์„ ์ ˆ๊ฐํ•  ์ˆ˜ ์žˆ์Œ
    • ์†Œ๋ฆฌ๋ฅผ ๋“ฃ์ง€ ๋ชปํ•ด์„œ ์ƒ๊ธฐ๋Š” ์œ„ํ—˜์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Œ.
    • ๋งž์ถคํ˜• ์†Œ๋ฆฌ ๋ถ„๋ฅ˜ ์‹œ์Šคํ…œ์œผ๋กœ ์‚ถ์˜ ์งˆ ํ–ฅ์ƒ ๊ฐ€๋Šฅ
    • ์ œ์กฐ ์‚ฐ์—…์—์„œ์˜ ์œ„ํ—˜ ์‚ฌ๊ณ  ๋ฐœ์ƒ ๊ฐ์ง€, ๊ฒŒ์ž„ ์‚ฐ์—…์—์„œ์˜ ์Œ์„ฑ์ธ์‹, ott ๋“ฑ ๋ฏธ๋””์–ด ์‚ฐ์—…์—์„œ์˜ ์Œ์„ฑ ์ธ์‹, ๊ธˆ์œต์—…์—์„œ์˜ ์ฑ—๋ด‡ ๋“ฑ ๋‹ค์–‘ํ•œ ์‚ฐ์—…์—์„œ์˜ ๋ฐœ์ „ ๊ฐ€๋Šฅ์„ฑ์ด ๋ฌดํ•œํžˆ ์กด์žฌํ•จ
  • ํ•œ๊ณ„ ๋ฐ ์ถ”ํ›„ ์—ฐ๊ตฌ ๋ฐฉํ–ฅ
    • ์†Œ๋ฆฌ ๋ถ„๋ฅ˜์˜ ์ •ํ™•๋„๋Š” ์ฃผ๋ณ€ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๊ธฐ์— ๋…ธ์ด์ฆˆ ๊ด€๋ จ ์—ฐ๊ตฌ๊ฐ€ ์ถ”๊ฐ€๋กœ ์ง„ํ–‰์ด ํ•„์š”ํ•˜๋‹ค. 
    • ์†Œ๋ฆฌ๋ฅผ ํƒ์ง€ํ•˜๋Š” ๋งˆ์ดํฌ์˜ ์„ฑ๋Šฅ๋„ ์ค‘์š”ํ•˜๊ฒŒ ์ž‘์šฉํ•œ๋‹ค.
    • ๊ฐ์ง€ํ•ด์•ผํ•  ์†Œ๋ฆฌ๊ฐ€ ๋™์‹œ๋‹ค๋ฐœ์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋ฉด, ๋ชจ๋“  ์†Œ๋ฆฌ๋ฅผ ์ธ์‹ํ•˜๊ธฐ ํž˜๋“ค๋‹ค๋Š” ํ•œ๊ณ„๊ฐ€ ์กด์žฌํ•œ๋‹ค.
    • ๋”ฐ๋ผ์„œ ๋™์‹œ๋‹ค๋ฐœ์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ์†Œ๋ฆฌ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ชจ๋ธ ์„ฑ๋Šฅ ๊ฐœ์„ ์ด ํ•„์š”ํ•˜๋‹ค.
    • ์†Œ๋ฆฌ์˜ ์ข…๋ฅ˜๋ฅผ ๋Š˜๋ ค์„œ ์ œ์กฐ, ๊ณต์ •, ๋””์ง€ํ„ธ ํ—ฌ์Šค์ผ€์–ด, ๊ธˆ์œต, ๊ฒŒ์ž„ ๋“ฑ ๋‹ค์–‘ํ•œ ์‚ฐ์—…์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋„๋ก ์—ฐ๊ตฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. 

 

 

๋งˆ์น˜๋ฉฐ ... :)

๊ธธ๊ณ  ๊ธด ํฌ์ŠคํŒ…์ด ๋๋‚ฌ๋‹ค. ๋งˆ์ง€๋ง‰์— ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์™„๋ฒฝํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜์ง€๋ชปํ–ˆ์ง€๋งŒ, ์ด๋ ‡๊ฒŒ๋ผ๋„ AI๊ฐ€ ์‚ฐ์—…์— ์–ด๋–ป๊ฒŒ ์ ์šฉ๋˜์–ด ์‚ฌ์šฉ๋˜๊ณ , ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์–ด๋–ค ๊ธฐ๋Šฅ์œผ๋กœ ์ ์šฉ๋˜๋Š”์ง€์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•ด๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค. PyQt ํˆด๋„ ์‹ ์„ ํ–ˆ๊ณ , ์ด๋ฅผ ํ†ตํ•ด ๊ฐ„๋‹จํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ๋„ ์‹ ์„ ํ–ˆ๋‹ค. 

๋งˆ์ง€๋ง‰์œผ๋กœ,,, ์ง„์งœ ์•ฝ 3๊ฐœ์›”๊ฐ„์˜ ๊ณ ์ƒ๋์— ๋ชจ๋“  ์„ ๋ฐฐ๋“ค, ๋ชจ๋“  ํŒ€๋“ค์„ ์ œ์น˜๊ณ  ์ˆ˜์ƒํ•œ ์ƒ์žฅ ์‚ฌ์ง„์„ ๋งˆ์ง€๋ง‰์œผ๋กœ ํฌ์ŠคํŒ… ๋งˆ๋ฌด๋ฆฌ์ง“๊ฒŸ๋‹ค!!!!!!!!!!! ํ–‰๋ณตํ–ˆ๋”ฐ!!!!!!!!!!

๋…ธ๋ ฅ์€ ๋ฐฐ์‹ ํ•˜์ง€ ์•Š๋Š”๋‹ค :) 

 

๋ฐ˜์‘ํ˜•