Home - Marvic1130/BlinkingRecognitionProject GitHub Wiki

220915 ํšŒ์˜ ๋‚ด์šฉ ๋ฐ ์ง„ํ–‰์ƒํ™ฉ

ํšŒ์˜ ๋‚ด์šฉ

  1. ๊ฐ์ž ์•„์ด๋””์–ด๋ฅผ ํ•˜๋‚˜์”ฉ ๊ฐ€์ ธ์˜ค๊ธฐ๋กœ ํ•ด์„œ ์•„์ด๋””์–ด ํšŒ์˜ ํ›„ ๊ฐ€์žฅ ์ธ๊ธฐ๊ฐ€ ์ข‹์•˜๋˜ ์•„์ด๋””์–ด์ธ "์ธ๊ณต์ง€๋Šฅ์„ ์ด์šฉํ•œ ๋ˆˆ ๊นœ๋นก์ž„ ํšŸ์ˆ˜๋ฅผ ํ†ตํ•ด ์ง‘์ค‘๋„๋ฅผ ๊ฒ€์ถœํ•˜๋Š” ํ”„๋กœ์ ํŠธ" ์„ ์ •

  2. ์นด๋ฉ”๋ผ๋กœ ์‚ฌ๋žŒ์˜ ๋ˆˆ ๊นœ๋ฐ•์ž„ ํšŸ์ˆ˜๋‚˜ ๋ˆˆ์„ ๊ฐ๊ณ  ์žˆ๋Š” ์‹œ๊ฐ„๋“ฑ์„ ์ธก์ •ํ•˜์—ฌ ์ˆ˜์—… or ๊ฐ•์˜์˜ ์ง‘์ค‘๋„๋ฅผ ์›น์— ๋ฐ์ดํ„ฐ๋กœ ํ‘œ์‹œํ•˜๋Š” ํ”„๋กœ์ ํŠธ

์ง„ํ–‰ ์ƒํ™ฉ

๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ -> ์ „์ฒ˜๋ฆฌ -> ๋ผ๋ฒจ๋ง -> ํ•™์Šต ์ˆœ์„œ๋กœ ์ง„ํ–‰ ์˜ˆ์ •

๋จผ์ € ๋ˆˆ ๊นœ๋นก์ž„์„ ํ•™์Šต์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๋ˆˆ์„ ๋œฌ ์‚ฌ์ง„๊ณผ ๋ˆˆ์„ ๊ฐ๊ณ ์žˆ๋Š” ์‚ฌ์ง„์„ ๊ฐ๊ฐ ํ•™์Šต์‹œ์ผœ์•ผ ํ•œ๋‹ค.

๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด Open Cv๋ฅผ ์ด์šฉํ•˜์—ฌ ์‚ฌ์ง„ or ์˜์ƒ์—์„œ ์–ผ๊ตด์„ ์ธ์‹ํ•˜์—ฌ ์–ผ๊ตด ๋ถ€๋ถ„์„ ํฌ๋กญํ•ด์„œ ์ €์žฅํ•ด์•ผํ•œ๋‹ค.

1์ฃผ์ฐจ์— ์‚ฌ์šฉํ•œ ์ฝ”๋“œ์—์„œ๋Š” haarcascade๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ๋งˆ์Šคํฌ๋ฅผ ์“ฐ๊ณ  ์žˆ์œผ๋ฉด ์–ผ๊ตด๋กœ ์ธ์‹ํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.


220928 ํšŒ์˜ ๋‚ด์šฉ ๋ฐ ์ง„ํ–‰์ƒํ™ฉ

ํšŒ์˜ ๋‚ด์šฉ

์ด๋ฒˆ ์ฃผ๋Š” ํŽ˜์ด์ง€ ๋ ˆ์ด์•„์›ƒ์„ ๊ฐ™์ด ๋””์ž์ธํ–ˆ๋‹ค. ์•ž์œผ๋กœ๋Š” ์•„์ง ๋ฏธ์™„์„ฑ์ธ ํŽ˜์ด์ง€ ๋ ˆ์ด์•„์›ƒ์„ ๋‹ค๋“ฌ๊ณ  ์–ผ๊ตด์ธ์‹์ด ๋˜์–ด ๋‚˜์˜จ ์‚ฌ์ง„ ํŒŒ์ผ๋“ค์„ ๋ผ๋ฒจ๋ง ํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์— ํ•™์Šต ์‹œํ‚ฌ ๊ณ„ํš์ด๋‹ค.

์ง„ํ–‰ ์ƒํ™ฉ

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

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-09-29 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 9 09 02

์ง€๋‚œ์ฃผ์— ๋งˆ์Šคํฌ, ๋ชจ์ž ๋“ฑ์œผ๋กœ ์–ผ๊ตด์ด ๊ฐ€๋ ค์ง€๋ฉด ์ธ์‹์ด ์•ˆ๋˜์—ˆ๋˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์—ฌ ์ด์ œ ๋งˆ์Šคํฌ ๋ชจ์ž๋“ฑ์œผ๋กœ ์–ผ๊ตด์ด ๊ฐ€๋ ค์ ธ๋„ ์–ผ๊ตด์ธ์‹์— ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค.


221005 ํšŒ์˜ ๋‚ด์šฉ ๋ฐ ์ง„ํ–‰์ƒํ™ฉ

๊ต์ˆ˜๋‹˜์˜ ํ”ผ๋“œ๋ฐฑ

ํšŒ์˜ ๋‚ด์šฉ

์ง„ํ–‰ ์ƒํ™ฉ

  • ๋ฐฑ์—”๋“œ ์ง„ํ–‰ ์ƒํ™ฉ
    1. ์„œ๋ฒ„ ๊ตฌ์ถ•(node.js ์˜ express)
    2. mysql db ์—ฐ๋™ ๋ฐ model ๊ตฌ์กฐํ™” ์ž‘์—…
      • user model
      • class model
  • ํ”„๋ก ํŠธ ์ง„ํ–‰ ์ƒํ™ฉ
    1. ๋ฉ”์ธํŽ˜์ด์ง€ html, css ์ž‘์—…
    2. ์ž‘์—…ํ•˜๋ฉฐ ๋ ˆ์ด์•„์›ƒ ์ˆ˜์ •

์บก์Šคํ†ค1 ์บก์Šคํ†ค2


221012 ํšŒ์˜ ๋‚ด์šฉ ๋ฐ ์ง„ํ–‰์ƒํ™ฉ

์ง„ํ–‰ ์ƒํ™ฉ

  • ํ”„๋กœ์ ํŠธ ์ˆ˜์ •
    ๋ˆˆ ๊นœ๋ฐ•์ž„๊ณผ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•œ ์ง‘์ค‘๋„ ํ…Œ์ŠคํŠธ -> ๋ˆˆ ๊นœ๋ฐ•์ž„๊ณผ ์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•˜์—ฌ ๊ฐ•์˜ ํ‰๊ฐ€์˜ ์ •ํ™•์„ฑ ์ธก์ • ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•์˜ ํ‰๊ฐ€ ์‚ฌ์ดํŠธ ์ œ์ž‘
  • ๋ณ€๊ฒฝ ์ด์œ 
    ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•จ์— ์žˆ์–ด์„œ ํ™•์‹คํ•œ ๋ชฉ์ ์„ฑ์ด ์—†์–ด ํ”„๋กœ์ ํŠธ๊ฐ€ ์œ ๋™์ ์œผ๋กœ ๋ณ€ํ•˜๊ณ  ๊ทธ์— ๋”ฐ๋ผ UI๊ฐ€ ๊ณ„์†์ ์œผ๋กœ ๋ณ€ํ•ด, ํ™•์‹คํ•œ ๋ชฉ์ ์„ฑ์ด ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๋กœ ๋ณ€๊ฒฝ

ํ”„๋กœ์ ํŠธ UI

<์ดˆ๊ธฐ ํŽ˜์ด์ง€>
๋กœ๊ทธ์ธ ํŽ˜์ด์ง€2

<ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€>
๊ต์ˆ˜ ํšŒ์›๊ฐ€์ž…๊ณผ ํ•™์ƒ ํšŒ์›๊ฐ€์ž… ๋ถ„๋ฅ˜
ํ™”์›๊ฐ€์ž…2

<ํ•™์ƒ ํŽ˜์ด์ง€>
๊ธฐ๋ณธํŽ˜์ด์ง€2

์ˆ˜์—…๋“ฑ๋กํ›„ ํŽ˜์ด์ง€

๊ฐ•์˜ํ‰๊ฐ€2

<๊ต์ˆ˜ ํŽ˜์ด์ง€>

2222

์ˆ˜์—…๋“ฑ๋กํ›„ ํŽ˜์ด์ง€

์ˆ˜์—…๋“ฑ๋ก

๊ทธ๋ž˜ํ”„2

  • ๋ฐฑ์—”๋“œ ์ง„ํ–‰ ์ƒํ™ฉ
    1. ํ”„๋กœ์ ํŠธ ์ˆ˜์ •์— ๋”ฐ๋ฅธ user DB๋ชจ๋ธ ์ˆ˜์ •
    2. Routers ์ƒ์„ฑ ๋ฐ ๋ชจ๋“ˆํ™”๋ฅผ ์œ„ํ•ด Controllers์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์ž‘์„ฑ

controllers

  • ํ”„๋ก ํŠธ ์ง„ํ–‰ ์ƒํ™ฉ
    1. ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ์ž‘์—…
    2. ์ž‘์—…ํ•˜๋ฉฐ ์ƒˆ๋กœ์šด ๋ ˆ์ด์•„์›ƒ ์ˆ˜์ • ์ง„ํ–‰์ค‘

์บก์Šคํ†ค ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€


221026 ํšŒ์˜ ๋‚ด์šฉ ๋ฐ ์ง„ํ–‰์ƒํ™ฉ

  • ํ”„๋ก ํŠธ ์ง„ํ–‰ ์‚ฌํ•ญ
    1. ํ•™์ƒ ์ˆ˜์—… ๋“ฑ๋ก ํŽ˜์ด์ง€ ์ž‘์—… ์™„๋ฃŒ (๊ต์ˆ˜์™€ ํ•™์ƒ ์ˆ˜์—… ๋“ฑ๋ก ํŽ˜์ด์ง€ ๊ตฌ๋ถ„)

ํ•™์ƒ ์ˆ˜์—… ๋“ฑ๋ก ํŽ˜์ด์ง€

ํ•™์ƒ ์ˆ˜์—… ๋“ฑ๋ก ํŽ˜์ด์ง€2

์ˆ˜์—… ๋“ฑ๋ก ํŽ˜์ด์ง€3

  • ํ”„๋ก ๋“œ ํ•ต์‹ฌ ์ฝ”๋“œ ๋ฆฌ๋ทฐ

ํ•™์ƒ ์ˆ˜์—… ๋“ฑ๋ก ํŽ˜์ด์ง€3

-> ํ‰์†Œ์—๋Š” ์ˆจ๊ฒจ์ ธ ์žˆ๋Š” ์ˆ˜์—… ๋“ฑ๋ก UI๋ฅผ +๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋‚˜ํƒ€๋‚˜๊ณ  ์ˆ˜์—…์„ ์„ ํƒํ•˜๊ณ  ๋“ฑ๋ก ์™„๋ฃŒ ๋ฒ„ํŠผ์„ ํด๋ฆฌํ•˜๋ฉด ์ˆ˜์—… ๋ชฉ๋ก์— ์ƒˆ๋กœ์šด ์—˜๋ฆฌ๋จผํŠธ๋กœ ๋ฒ„ํŠผ์ด ์ถ”๊ฐ€๋˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.


201101 ํšŒ์˜ ๋‚ด์šฉ ๋ฐ ์ง„ํ–‰์ƒํ™ฉ

branch ๊ตฌ์„ฑ

1 7 2 3 4 5 6

main branch : ํ”„๋กœ์ ํŠธ๊ฐ€ ์™„์„ฑ๋˜์—ˆ์„ ๋•Œ ์ตœ์ข…์ ์œผ๋กœ ๋ณ‘ํ•ฉํ•˜๊ธฐ ์œ„ํ•œ ๋ธŒ๋žœ์น˜
jaeyoun miji hyemi yeseong jungseok branch: ๊ฐ์ž ์ด๋ฆ„์œผ๋กœ ๋ธŒ๋žœ์น˜๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ๊ฐ์ž ์ž์‹ ์ด ๋งŒ๋“  ํŒŒํŠธ๋ณ„ ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๋Š” ๋ธŒ๋žœ์น˜
back branch : backend ๊ธฐ๋Šฅ ๊ตฌํ˜„์ด ๋ชจ๋‘ ์™„๋ฃŒ ๋˜์—ˆ์„ ๋•Œ ๋ณ‘ํ•ฉ์„ ์œ„ํ•œ ๋ธŒ๋žœ์น˜

์ตœ๊ทผ ๋ธŒ๋žœ์น˜ ์ด๋™๊ฒฝ๋กœ
KakaoTalk_20221102_154446638

- ๋ฐฑ์—”๋“œ ์ง„ํ–‰์ƒํ™ฉ

1. class ๋“ฑ๋ก api ์ƒ์„ฑ
2. ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์™„๋ฃŒ
3. token์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๋Š” middleware ์ƒ์„ฑ

1.class ๋“ฑ๋ก

const { className, professor, department, classTime, place, people } = req.body;
  
    try {
      await Class.create({
        className,
        professor,
        department,
        classTime,
        place,
        people,
      });
      return res.json({className, professor, department, classTime, place, people}).redirect("/")
    } catch (err) {
      console.log(err);};

image

image

  1. ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ
module.exports.find = async (req, res) => {
  const { keyword } = req.query;
  try {
    const item = await Class.findAll({
      where: {
        [Op.or]: [
          {
            className: {
              [Op.like]: `%${keyword}%`,
            },
          },
          {
            professor: {
              [Op.like]: `%${keyword}%`,
            },
          },
        ],
      },
    });
    if (item.length === 0) {
      return res.status(401).json({ message: "์ผ์น˜ํ•˜๋Š” ์ˆ˜์—…์ด ์—†์Šต๋‹ˆ๋‹ค!" });
    }
    return res.json({ item });
  } catch (err) {
   ; console.log(err)
  }
};

image

3.token์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๋Š” middleware

if(req.headers.authorization){
        //Request์˜ header์˜ Authorization์—์„œ ํ† ํฐ์„ ์ถ”์ถœ
        let header = req.headers["authorization"]
        
        //Authorization์—์„œ 'Bearer'๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ split ์‚ฌ์šฉ!!
        let token = header && header.split("")[1]
        
        //์œ ํšจ์„ฑ๊ฒ€์‚ฌ
        jwt.verify(token, process.env.ACCESS_SECRET, (err,user)=>{
            if(err) {
                res.status(404).json(err)
            }else{
                req.user = user;
                next();
            }
    })
    }else{
        res.status(401).json({error: "Auth Error"})
    }
   //class๋ฅผ ๋“ฑ๋กํ• ๋•Œ token์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ• ์ˆ˜ ์žˆ๋„๋ก middleware ์„ค์ •ํ•˜๊ธฐ
   classRouter.route("/register").all(authToken).post(classes.register)

->accessToken์ด ๋งŒ๋ฃŒ๋˜์—ˆ์„๋•Œ ์žฌ๋ฐœํ–‰ํ•˜๋Š” ์ฝ”๋“œ ํ•„์š”!

- ํ”„๋ก ํŠธ ์ง„ํ–‰์ƒํ™ฉ

1. ํ”„๋กœํŠธ ํŽ˜์ด์ง€ ๊ตฌ์กฐ๋„

2. ๋ฐฑ์—”๋“œ์™€ ์—ฐ๊ฒฐํ•˜์—ฌ ๋กœ๊ทธ์ธ ๋ฐ ํšŒ์›๊ฐ€์ž… ๊ตฌํ˜„

-> ๋กœ์ปฌ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅ ํšŒ์›๊ฐ€์ž…์‹œ ๋กœ์ปฌ DB์— ํšŒ์›์ •๋ณด๊ฐ€ ์ €์žฅ๋˜๊ณ  ์ˆ˜์—… ๋ชฉ๋ก ํŽ˜์ด์ง€๊ฐ€ ๋œธ

3. ๊ฐ•์˜ํ‰๊ฐ€ ํŽ˜์ด์ง€ ์ œ์ž‘

๊ฐ•์˜ํ‰๊ฐ€ํŽ˜์ด์ง€

  1. html
    <!-- ์ˆ˜์—… ๋“ฑ๋ก -->
    <div class="registration-container">
      <div class="classBox">
        <h1 class="title">๊ฐ•์˜ํ‰๊ฐ€</h1>
        <div class="formBox">
          <!-- <form method="POST"> -->
          <label for="classTitle" id="titleLabel"
            >1. ๊ฐ•์˜์— ์–ผ๋งˆ๋‚˜ ์ง‘์ค‘ ํ–ˆ๋‚˜์š”?</label
          ><br />
          <!-- ์ „์ฒด ์˜์—ญ -->
          <div class="progress1">
            <!-- ํ”„๋กœ๊ทธ๋ž˜์Šค ๋ฐ” -->
            <div class="state1"><span id="percentage1"></span></div>
          </div>

          
          <label for="classTime" id="timeLabel">
            2. ๊ฐ•์˜์—์„œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ ์ด ์žˆ์—ˆ๋‚˜์š”?</label
          ><br />
          <!-- ์ „์ฒด ์˜์—ญ -->
          <div class="progress2">
            <!-- ํ”„๋กœ๊ทธ๋ž˜์Šค ๋ฐ” -->
            <div class="state2"><span id="percentage2"></span></div>
          </div>

          <label for="department" id="departmentLabel">
            3. ๊ฐ•์˜๊ฐ€ ๋งŒ์กฑ์Šค๋Ÿฌ์› ๋‚˜์š”?</label
          ><br />
          <!-- ์ „์ฒด ์˜์—ญ -->
          <div class="progress3">
            <!-- ํ”„๋กœ๊ทธ๋ž˜์Šค ๋ฐ” -->
            <div class="state3"><span id="percentage3"></span></div>
          </div>

          <button id="registrationBtn">์ œ์ถœํ•˜๊ธฐ</button>
          <!-- </form> -->
        </div>
      </div>
    </div>
  1. css
/* ํ”„๋กœ๊ทธ๋ž˜์Šค ๋ฐ” */
.progress1, .progress2, .progress3 {
  width: 75%;
  height: 50px;
  position: relative;
  top: 0;
  left: 0;
  overflow-x: hidden;
  cursor: pointer;
  border: 1px solid black;
  margin: 0 auto;
  border-radius: 2px;
}

.state1, .state2, .state3 {
  width: 0;
  height: 50px;
  position: absolute;
  top: 0;
  left: 0;
  background-color: #448593;
}

#percentage1, #percentage2, #percentage3 {
  line-height: 50px;
  vertical-align: middle;
}
  1. javascript
$(document).ready(function () {
  //ํ”„๋กœ๊ทธ๋ž˜์Šค ๋ฐ”๋ฅผ ํด๋ฆญ
  $(".progress1").click(function (e) {
    // ๋ณ€์ˆ˜ x๋Š” .progress์˜ left๊ฐ’์—์„œ ํด๋ฆญํ•œ ์œ„์น˜์˜ X๊ฐ’์„ ๋บ€๋‹ค.
    // e.pageX๋Š” ํ™”๋ฉด์—์„œ ํด๋ฆญํ•œ X์˜ ์œ„์น˜๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
    var x = e.pageX - $(".progress1").offset().left;
    //๋ณ€์ˆ˜ clickPercentage๋Š” ๋ณ€์ˆ˜ x / .progress.๋„ˆ๋น„
    clickPercentage = x / $(".progress1").width();
    //.state์˜ ๋„ˆ๋น„๋Š” (.progress์˜ ๋„ˆ๋น„์—์„œ ๋ณ€์ˆ˜ clickPercentage๋ฅผ ๊ณฑํ•œ ๊ฐ’);
    $(".state1").width($(".progress1").width() * clickPercentage);
    var percentage = clickPercentage * 100;
    //Math.floor() ์†Œ์ˆ˜์  ๋ฒ„๋ฆผ, ์ •์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
    $("#percentage1").text(Math.floor(percentage));
  });
});

- ๋จธ์‹ ๋Ÿฌ๋‹ ํŒŒํŠธ ์ง„ํ–‰์ƒํ™ฉ

Learning Early Stopping

์Šคํฌ๋ฆฐ์ƒท 2022-11-01 ์˜คํ›„ 8 16 23

ํ•™์Šต์„ ์ง„ํ–‰ํ•  ๋•Œ ๋„ˆ๋ฌด ๋งŽ์€ epoch๋Š” overfitting์„ ์ผ์œผํ‚ค๊ณ  ๋„ˆ๋ฌด ์ ์€ epoch๋Š” underfitting์„ ์ผ์œผํ‚ค๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Early Stopping์„ ์‚ฌ์šฉํ•œ๋‹ค.

์Šคํฌ๋ฆฐ์ƒท 2022-11-01 ์˜คํ›„ 8 17 45

early_stopping_calback = EarlyStopping(monitor='loss', patience=10)
checkpointer = ModelCheckpoint(filepath=modelpath, monitor='loss', verbose=0, save_best_only=True)

hist = model.fit(X_train, Y_train, batch_size=64, epochs=200, callbacks=[early_stopping_calback, checkpointer])

patience=10

์Šคํฌ๋ฆฐ์ƒท 2022-11-01 ์˜คํ›„ 8 34 27 ์Šคํฌ๋ฆฐ์ƒท 2022-11-01 ์˜คํ›„ 8 34 39

patience=5 ์Šคํฌ๋ฆฐ์ƒท 2022-11-01 ์˜คํ›„ 8 48 20 ์Šคํฌ๋ฆฐ์ƒท 2022-11-01 ์˜คํ›„ 8 48 43

patience=3 ์Šคํฌ๋ฆฐ์ƒท 2022-11-01 ์˜คํ›„ 8 51 00 ์Šคํฌ๋ฆฐ์ƒท 2022-11-01 ์˜คํ›„ 8 51 12

patience=1 ์Šคํฌ๋ฆฐ์ƒท 2022-11-01 ์˜คํ›„ 8 53 55 ์Šคํฌ๋ฆฐ์ƒท 2022-11-01 ์˜คํ›„ 8 54 04

๋ชจ๋ธ ํ‰๊ฐ€

ํ•™์Šต๋œ ๋ชจ๋ธ์„ ํ‰๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

์Šคํฌ๋ฆฐ์ƒท 2022-11-01 ์˜คํ›„ 7 51 39
  • ์ •ํ™•๋„(Accuracy)

์ „์ฒด ๋ฐ์ดํ„ฐ ์ค‘์— ์ •ํ™•ํ•˜๊ฒŒ ์˜ˆ์ธกํ•œ ๋ฐ์ดํ„ฐ์˜ ์ˆ˜

ACC = TP + TN / TP + TN + FP + FN

  • Log Loss

์‹ค์ œ ๋‹ต์•ˆ์— ํ•ด๋‹นํ•˜๋Š” ํ™•๋ฅ  ๊ฐ’์„ ์Œ์˜ ๋กœ๊ทธ๋ฅผ ์ทจํ•œ ํ›„ ๋ชจ๋‘ ๋”ํ•œ ๊ฐ’์˜ ํ‰๊ท 

100%์˜ ํ™•๋ฅ (ํ™•์‹ )๋กœ ๋‹ต์„ ๊ตฌํ•œ ๊ฒฝ์šฐ log loss๋Š” -log(1.0) = 0, 80% ํ™•๋ฅ ์˜ ๊ฒฝ์šฐ์—๋Š” -log(0.8) = 0.22314, 60% ํ™•๋ฅ ์˜ ๊ฒฝ์šฐ์—๋Š” -log(0.6) = 0.51082 ์ด ๊ฐ’๋“ค์˜ ํ‰๊ท 

  • ์ •๋ฐ€๋„(Precison)

์–‘์„ฑ์œผ๋กœ ํŒ๋‹จํ•œ ๊ฒƒ ์ค‘ ์ง„์งœ ์–‘์„ฑ ๋น„์œจ

PREC = TP / TP + FP

  • ์žฌํ˜„์œจ(ReCall)

์ง„์งœ ์–‘์„ฑ์ธ ๊ฒƒ๋“ค ์ค‘์—์„œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์–‘์„ฑ์œผ๋กœ ํŒ๋‹จํ•œ ๋น„์œจ

ReCall = TP / TP + FN

  • F1 Score

F1 Score๋Š” ์ •๋ฐ€๋„์™€ ์žฌํ˜„์œจ์„ ๊ฒฐํ•ฉํ•˜์—ฌ ๋งŒ๋“  ์ง€ํ‘œ์ด๋‹ค. ์ •๋ฐ€๋„์™€ ์žฌํ˜„์œจ์˜ ์กฐํ™”ํ‰๊ท 

F1 Score = 2 * Prec * Recall/(Price + Recall)

print('Test accuracy:', accuracy_score(Y_test, Y_pred))
print('Test loss:', log_loss(Y_test, y_predicted))
print("F1-score: {:.2%}".format(f1_score(Y_test, Y_pred, average='macro')))

๊ฒฐ๊ณผ ํ™”๋ฉด

์Šคํฌ๋ฆฐ์ƒท 2022-11-01 ์˜คํ›„ 8 16 48


221108 ํšŒ์˜ ๋‚ด์šฉ ๋ฐ ์ง„ํ–‰์ƒํ™ฉ

- ํ”„๋ก ํŠธ ์ง„ํ–‰์ƒํ™ฉ

1. ์ˆ˜์—… ์ง‘์ค‘๋„ ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€ ๊ตฌํ˜„

๋ฐ์ดํ„ฐํŽ˜์ด์ง€

-> ์‹ค์ œ ์ˆ˜์—…์˜ ์ง‘์ค‘๋„์™€ ํ•™์ƒ์ด ๊ฐ•์˜ํ‰๊ฐ€์—์„œ ํ‰๊ฐ€ํ•œ ์ง‘์ค‘๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์น˜ํ™”ํ•ด ๊ทธ๋ž˜ํ”„๋กœ ํ‘œํ˜„

2. ์ˆ˜์—… ์ง‘์ค‘๋„ ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€ ํ•ต์‹ฌ ์ฝ”๋“œ

<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.min.js"></script>
<canvas id="canvas" style="display: inline-block; width: 450px; height: 350px; position: relative; right: 45px;"></canvas
          ><br />
          <div class="labelBoxStick">
            <label for="realDataStick" id="realDataStick">์‹ค์ œ ์ง‘์ค‘๋„</label>
            <br />
            <label for="lectureDataStick" id="lectureDataStick"
              >๊ฐ•์˜ํ‰๊ฐ€ ์ง‘์ค‘๋„</label
            ><br />
          </div>
          <div class="progress-bar-real">
            <div class="progressReal"></div>
          </div>
          <div class="progress-bar-lecture">
            <div class="progressLecture"></div>
          </div>
// chart
new Chart(document.getElementById("canvas"), {
  type: "line",
  data: {
    labels: ["1", "2", "3", "4", "5", "6", "7"],
    datasets: [
      {
        label: "์ˆ˜์—… ์ง‘์ค‘๋„",
        data: [10, 3, 30, 23, 10, 5, 50],
        borderColor: "rgba(255, 201, 14, 1)",
        fill: true,
        lineTension: 0, // ์ง์„ ์„ ๊ทธ๋ฆฌ๋ ค๋ฉด 0
      },
      {
        label: "๊ฐ•์˜ํ‰๊ฐ€ ์ง‘์ค‘๋„",
        data: [1, 3, 15, 10, 25, 30, 5],
        borderColor: "skyblue",
        fill: true,
        lineTension: 0,
      },
    ],
  },
  options: {
    responsive: false, // false๋ฉด ์ฐจํŠธ ํฌ๊ธฐ ์กฐ์ • ๊ฐ€๋Šฅ
    title: {
      display: true,
      text: "์ˆ˜์—… + ๊ฐ•์˜ํ‰๊ฐ€ ์ง‘์ค‘๋„",
    },
    tooltips: {
      // ๊ทธ๋ž˜ํ”„์— ๋งˆ์šฐ์Šค ๋Œ€๋ฉด ๋ฐ์ดํ„ฐ ํ…์ŠคํŠธ๋กœ ๋ณด์—ฌ์ฃผ๋Š” ํˆดํŒ
      mode: "index", // ๋™์ผํ•œ ์ธ๋ฐ์Šค์ธ ํ•ญ๋ชฉ์„ ์ฐพ์Šต๋‹ˆ๋‹ค.
      intersect: false, // ํˆดํŒ ๋ชจ๋“œ๋Š” ๋งˆ์šฐ์Šค ์œ„์น˜๊ฐ€ ์š”์†Œ๋ฅผ ๊ต์ฐจํ•  ๋•Œ๋งŒ ์ ์šฉ
    },
    hover: {
      mode: "nearest", // ์ ๊ณผ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ฑฐ๋ฆฌ์— ์žˆ๋Š” ํ•ญ๋ชฉ๋“ค์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
      intersect: true,
    },
    scales: {
      xAxes: [
        {
          // x์ถ•
          display: true,
          scaleLabel: {
            display: true,
            labelString: "hour",
          },
        },
      ],
      yAxes: [
        {
          // y์ถ•
          display: true,
          ticks: {
            suggestedMin: 0,
          },
          scaleLabel: {
            display: true,
            labelString: "concentration",
          },
        },
      ],
    },
  },
});

// ๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„
const progressReal = document.querySelector(".progressReal");
const progressLecture = document.querySelector(".progressLecture");

let realData = 80;
let lectureData = 20;

progressReal.style.width = realData;
progressReal.innerHTML = `<span>${realData}%</span>`;

progressLecture.style.width = realData;
progressLecture.innerHTML = `<span>${lectureData}%</span>`;

3. ํ–ฅํ›„ ๊ณ„ํš

-> ๋ฐฑ์—”๋“œ์™€ ์—ฐ๊ณ„ํ•˜๋Š” ์ž‘์—…์„ ์ฃผ๋กœ ํ•  ์˜ˆ์ •์ด๊ณ  ์›นํŽ˜์ด์ง€๊ฐ€ ์™„์„ฑ๋˜๋ฉด ์ˆ˜์ง‘ํ•œ ๋ฐ์ดํ„ฐ๋กœ ํ…Œ์ŠคํŠธ ์‹œํ—˜ํ•ด ๋ณผ ์˜ˆ์ •

๋ฐฑ์—”๋“œ ์ง„ํ–‰ ์ƒํ™ฉ

1.passport ๋กœ๊ทธ์ธ ๊ตฌํ˜„ 2. ๊ฐ•์˜ ํ‰๊ฐ€ DBํ…Œ์ด๋ธ” ๊ตฌ์ถ•

const passport = require("passport");
const { Strategy: LocalStrategy } = require("passport-local");

const bcrypt = require("bcrypt");

const Student = require("../models/Student");

const passportConfig = { usernameField: "id", passwordField: "pw" };

const passportVerify = async (id, pw, done) => {
  try {
    const user = await Student.findOne({ where: { id } });
    if (!user) {
      done(null, false, { message: "์กด์žฌํ•˜์ง€ ์•Š๋Š” ์‚ฌ์šฉ์ž ์ž…๋‹ˆ๋‹ค." });
      return;
    }

    const compareResult = await bcrypt.compare(pw, user.pw);

    if (compareResult) {
      done(null, user);
      return;
    }

    done(null, false, { reason: "์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋‹ˆ๋‹ค." });
  } catch (error) {
    console.error(error);
    done(error);
  }
};

module.exports = () => {
  passport.use("local", new LocalStrategy(passportConfig, passportVerify));
};
module.exports.login = async (req, res) => {
  try {
    // ์•„๊นŒ local๋กœ ๋“ฑ๋กํ•œ ์ธ์ฆ๊ณผ์ • ์‹คํ–‰
    passport.authenticate("local", (passportError, user, info) => {
      // ์ธ์ฆ์ด ์‹คํŒจํ–ˆ๊ฑฐ๋‚˜ ์œ ์ € ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋‹ค๋ฉด ์—๋Ÿฌ ๋ฐœ์ƒ
      if (passportError || !user) {
        res.status(400).json({ message: info });
        return;
      }
      // user๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ๋กœ๊ทธ์ธ ์ง„ํ–‰
      req.login(user, { session: false }, (loginError) => {
        if (loginError) {
          res.send(loginError);
          return;
        }
        // ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ JWT์ƒ์„ฑ ํ›„ ๋ฐ˜ํ™˜
        const token = jwt.sign(
          { id: user.id, name: user.name, auth: user.auth },
          process.env.ACCESS_SECRET,
          { expiresIn: "1m", issuer: "jungseok" }
        );
        const refresh = jwt.sign(
          {
            id: user.id,
            name: user.name,
            auth: user.auth,
          },
          process.env.REFRESH_SECRET,
          { expiresIn: "10m", issuer: "jungseok" }
        );
        console.log("token: ", token);
        console.log("refresh:", refresh);
        res.redirect("/main");
      });
    })(req, res);
  } catch (error) {
    console.error(error);
    next(error);
  }
};

๋กœ๊ทธ์ธ

ํ† ํฐ

๋กœ๊ทธ์ธ ์˜ค๋ฅ˜

2.๊ฐ•์˜ํ‰๊ฐ€ DB๊ตฌ์ถ•

const Sequelize = require("sequelize");
//
module.exports = class User extends Sequelize.Model {
  static init(sequelize) {
    return super.init(
      {
        q1: {
          type: Sequelize.INTEGER(20),
          allowNull: false,
        },
        q2: {
          type: Sequelize.INTEGER(20),
          allowNull: false,
        },
        q3: {
          type: Sequelize.INTEGER(20),
          allowNull: false,
        },
        q4: {
          type: Sequelize.INTEGER(20),
          allowNull: false,
        },
        q5: {
          type: Sequelize.INTEGER(20),
          allowNull: false,
        },
        q6: {
          type: Sequelize.STRING(255),
          allowNull: false,
        },
      },
      {
        sequelize,
        timestamps: false,
        underscored: false,
        modelName: "Evaluation", // ๋ชจ๋ธ ์ด๋ฆ„์„ ์„ค์ •, ๋…ธ๋“œ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ
        tableName: "Evaluation",
        paranoid: false,
        charset: "utf8", //ํ•œ๊ธ€์„ ์ž…๋ ฅํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ •
        collate: "utf8_general_ci", //ํ•œ๊ธ€์„ ์ž…๋ ฅํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ •
      }
    );
  }

  static associate(db) {
    db.Evaluation.belongsTo(db.Class, {
      foreignKey: "CevaluationId",
      sourceKey: "id",
    });
  }
};

๊ฐ•์˜ํ‰๊ฐ€ ์งˆ๋ฌธ ๋””๋น„

๋จธ์‹ ๋Ÿฌ๋‹ ์ง„ํ–‰์ƒํ™ฉ

์ €๋ฒˆ์ฃผ์—๋Š” ์•ฝ 3000๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ํ•™์Šตํ•˜์—ฌ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

199227222-31b9f47e-a5e4-4cf0-a36b-fbb897dad66a

์ด๋ฒˆ์ฃผ์—๋Š” ์•ฝ 4000๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•™์Šตํ•˜์—ฌ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™”๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-11-09 แ„‹แ…ฉแ„’แ…ฎ 2 05 59

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-11-08 แ„‹แ…ฉแ„’แ…ฎ 11 07 14

โš ๏ธ **GitHub.com Fallback** โš ๏ธ