๐ŸฎJellymodi (Jelly mood diary)

logo


icon ย Jellymodi (Jelly mood diary)

๋จธ์‹ ๋Ÿฌ๋‹ ์‚ฌ๋ฌผ์ธ์‹ ํ”„๋กœ์ ํŠธ

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


ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๋‚˜์˜ ์—ญํ•  โ†’ โ€œ๋ณด๋Ÿฌ๊ฐ€๊ธฐ๐Ÿ‘€โ€


๐Ÿ”—์‹œ์—ฐ์˜์ƒ


jellymodi


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

2022-06-02 ~ 2022-06-13


์ฃผ์š” ๊ธฐ๋Šฅ

  1. JWT๋ฅผ ์ด์šฉํ•œ ๋กœ๊ทธ์ธ
  2. ์‚ฌ์šฉ์ž๊ฐ€ ์—…๋กœ๋“œํ•œ ์‚ฌ์ง„์—์„œ OpenCV๋ฅผ ์ด์šฉํ•ด ์–ผ๊ตด์„ ์ธ์‹ํ•˜๊ณ , ํ‘œ์ • ๋ฐ์ดํ„ฐ๋ฅผ ํ•™์Šต์‹œํ‚จ ๋ชจ๋ธ์„ ํ†ตํ•ด ํ‘œ์ •์„ ํŒ๋ณ„ํ•˜์—ฌ ํ•ด๋‹นํ•˜๋Š” ๊ฐ์ • ์ด๋ชจํ‹ฐ์ฝ˜์œผ๋กœ ์ž๋™ ๋ณ€ํ™˜
  3. ์ ค๋ฆฌ๋ชจ๋””๋งŒ์˜ ๊ท€์—ฌ์šด ๊ฐ์ • ํ‘œํ˜„ ์ด๋ชจํ‹ฐ์ฝ˜
    ์ ค๋ฆฌํ‹ฐ์ฝ˜
    • ๊ฐ ๊ฐ์ •์˜ 4๋ฒˆ ์ด๋ชจํ‹ฐ์ฝ˜ ์ œ์ž‘ ๋‹ด๋‹น

    ์ ค๋ฆฌํ‹ฐ์ฝ˜

  4. MongoDB Atlas๋ฅผ ์ด์šฉํ•œ ์ผ๊ธฐ CRUD
  5. ์ด๋ชจํ‹ฐ์ฝ˜์„ ์›”๋ณ„๋กœ ๋ฌถ์–ด ๋ฆฌ์ŠคํŠธ๋กœ ๋ณด์—ฌ์ฃผ์–ด ๋‚˜์˜ ๊ฐ์ • ์ถ”์ด๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ํ™•์ธ
  6. Midea Query๋ฅผ ์ด์šฉํ•œ ๋ฐ˜์‘ํ˜• ํŽ˜์ด์ง€


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

๐Ÿ”—Github
๐Ÿ”—Starting Assignment (tistory)


ํŒ€ ๊ตฌ์„ฑ ๋ฐ ์—ญํ• 

์ด๋ฆ„ ์—ญํ•  ๊นƒํ—ˆ๋ธŒ
์ด์ •์•„ย ย ย ย  ๋ฉ”์ธ ํŽ˜์ด์ง€, ๋”ฅ๋Ÿฌ๋‹ ๐Ÿ”—zeonga1102
๋…ธ ์„ ๊ธฐ์ˆ™์‚ฌ ๋ณ„ ํŽ˜์ด์ง€ ๐Ÿ”—minkkky
์ดํ˜„๊ฒฝ ๊ฐœ์ธ ํŽ˜์ด์ง€ ๐Ÿ”—LULULALA2
๊น€๋™๊ทผ ๋กœ๊ทธ์ธ ๋ฐ ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€, AWS ๋ฐฐํฌย ย ย ย  ๐Ÿ”—yinmsk


์Šคํ‚ฌ ๋ฐ ์‚ฌ์šฉํˆด

Python, Django, BeautifulSoup, Selenium,Colab, MeCab, Doc2Vec


ERD

186601476-8fe8385d-8390-4747-9240-915795ca906c



ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๋‚˜์˜ ์—ญํ•  ๋ฐ ๊ฒฝํ—˜

๋‚˜์˜ ์—ญํ• 


ํ•œ๊ตญ์ธ ๊ฐ์ •์ธ์‹ ๋ฐ์ดํ„ฐ์…‹ ์ „์ฒ˜๋ฆฌ ๋ฐ ๋ชจ๋ธ ์ „์ดํ•™์Šต

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

๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ ํ›„์— ๋งŒ๋“ค์–ด์ง„ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ์…‹์œผ๋กœ ์ฝ”๋žฉ์—์„œ InceptionV3 ๋ชจ๋ธ์„ ์ „์ดํ•™์Šตํ•˜์—ฌ ์ •ํ™•๋„ ์•ฝ 0.90์˜ ๊ฐ์ •๋ถ„๋ฅ˜ ๋ชจ๋ธ์„ ์ œ์ž‘ํ–ˆ๋‹ค.

(์ฝ”๋žฉ : https://colab.research.google.com/drive/1HKmdTvZSvowDDntpqg81ZUiUrp3hg4IY?usp=sharing)

from tensorflow.keras.applications.inception_v3 import InceptionV3

input = Input(shape=(224, 224, 3))
base_model = InceptionV3(weights='imagenet', include_top=False, input_tensor=input, pooling='max')

x = base_model.output
x = Dropout(rate=0.25)(x)
x = Dense(64, activation='relu')(x)
x = Dense(256, activation='relu')(x)
x = Dense(64, activation='relu')(x)
x = Dense(32, activation='relu')(x)
x = Dense(8, activation='relu')(x)
output = Dense(4, activation='softmax')(x)

model = Model(inputs=base_model.input, outputs=output)
model.compile(loss='categorical_crossentropy', optimizer=Adam(lr=0.001), metrics=['acc'])



๐ŸงจTroubleShooting

๋ชจ๋ธํ•™์Šต์„ ์œ„ํ•œ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ๊ณผ์ •

๋ชจ๋ธํ•™์Šต์ด ์›ํ™œํ•˜๊ฒŒ ์ด๋ฃจ์–ด์ง€๋„๋ก ๊ฐ์ •์ธ์‹๋ฅ ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด์„œ ์ด๋ฏธ์ง€์—์„œ ์‚ฌ๋žŒ ์–ผ๊ตด ๋ถ€๋ถ„๋งŒ ๊ฒ€์ถœํ•˜์—ฌ ๊ฐ™์€ ํฌ๊ธฐ๋กœ ์ž˜๋ผ ์ €์žฅํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์น˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ํ•œ๊ฐ€์ง€ ๊ฐ์ •๋‹น 1์ฒœ์žฅ ์ •๋„๋ฅผ ๋ผ๋ฒจ๋ง ํ•ด๋†“์•˜๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ด์ฌ์œผ๋กœ ๊ฐ„๋‹จํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค์–ด ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ–ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜๋ฅผ ์•„๋ž˜์— ์ •๋ฆฌํ•˜์˜€๋‹ค.


1. ์–ผ๊ตด์ด ์•„๋‹Œ ๊ฒƒ์„ ์–ผ๊ตด๋กœ ์ธ์‹ํ•˜๋Š” ๋ฌธ์ œ

์ฑ… ํ‘œ์ง€๋‚˜ ํฌ์Šคํ„ฐ ๋“ฑ ์–ผ๊ตด์ด ์•„๋‹Œ ๊ฒƒ์„ ์–ผ๊ตด๋กœ ์ธ์‹ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.
์‚ฌ์ง„ ์†์˜ ์–ผ๊ตด ํฌ๊ธฐ ํ‰๊ท ์น˜๋ฅผ ๊ณ„์‚ฐํ•ด์„œ ์–ผ๊ตด ๊ฒ€์ถœ ์‚ฌ์ด์ฆˆ๋ฅผ ํ‰๊ท ํฌ๊ธฐ ์ด์ƒ์œผ๋กœ ํ•œ์ •์‹œ์ผœ์„œ ์–ผ๊ตด์ด ์•„๋‹Œ ๊ฒƒ์„ ์–ผ๊ตด๋กœ ์ธ์‹ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ๋Œ€๋ถ€๋ถ„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

faces = face_cascade.detectMultiScale(gray, 1.2, minSize=(75,75))


2. ์‚ฌ์ง„์—์„œ ์–ผ๊ตด๋งŒ ์ž˜๋ผ ์ €์žฅํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ณ„์† ์˜ค๋ฅ˜ ๋ฐœ์ƒ

๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ๊ณผ์ •์—์„œ ์‚ฌ์ง„์—์„œ ์–ผ๊ตด๋งŒ ์ž˜๋ผ ์ €์žฅํ•ด ๋ชจ๋ธ์„ ํ•™์Šต์‹œํ‚ค๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ํŠน์ • ์‚ฌ์ง„์€ ์–ผ๊ตด์ธ์‹๋„ ์ œ๋Œ€๋กœ ๋˜์ง€ ์•Š๊ณ , ๋‹ค์Œ ์‚ฌ์ง„์œผ๋กœ๋„ ๋„˜์–ด๊ฐ€์ง€ ์•Š๊ณ  ๊ณ„์† ์˜ค๋ฅ˜๋กœ ๋ฉˆ์ถ”๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

# ์ฝ”๋“œ ์ˆ˜์ • ์ „

import cv2
import glob

# haarcascade ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

images = glob.glob('images\*')
for image in images:
    # ์ด๋ฏธ์ง€ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
    img = cv2.imread(image)
    img = cv2.resize(img, dsize=(0, 0), fx=0.3, fy=0.3, interpolation=cv2.INTER_AREA)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # ์–ผ๊ตด ์ฐพ๊ธฐ
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)
    for (x, y, w, h) in faces:
        img_x1 = x
        img_x2 = x + w
        img_y1 = y
        img_y2 = y + h

    img = img[img_y1:img_y2, img_x1:img_x2]

    try:
        print(f'face/{image}')
        cv2.imwrite(f'face/{image}', img)
    except:
        pass


# ์ฝ”๋“œ ์ˆ˜์ • ํ›„

import cv2
import glob

# haarcascade ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

images = glob.glob('images/*')
print("images =", end=""), print(images)

result_list = []

for i in images:
    temp = i.replace("\\", "/")
    result_list.append(temp)

print("result_list = ", end=""), print(result_list)

# ์ด๋ฏธ์ง€ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
for image in result_list:

    if "jpg" in image:
        print("image = ", end=""), print(image)

        ori_img = cv2.imread(image)
        ori_img = cv2.resize(ori_img, dsize=(0, 0), fx=0.4, fy=0.4, interpolation=cv2.INTER_AREA)
        gray = cv2.cvtColor(ori_img, cv2.COLOR_BGR2GRAY)

        # ์–ผ๊ตด ์ฐพ๊ธฐ
        faces = face_cascade.detectMultiScale(gray, 1.2, minSize=(75,75))
        print("faces =", end=""), print(faces)

        cnt = 0
        for (x, y, w, h) in faces:
            img_x1 = x
            img_x2 = x + w
            img_y1 = y
            img_y2 = y + h

            img = ori_img[img_y1:img_y2, img_x1:img_x2]

            image_file_name = image.split('.')
            print("image_file_name =", end=""), print(image_file_name)
            file_name = image_file_name[0]
            extension = image_file_name[1]

            file_name += str(cnt)

            filename = 'face/images/' + file_name + '.' + extension
            print("filename =", end=""), print(filename)
            cv2.imwrite(filename, img)

            cnt += 1



ํšŒ๊ณ 

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

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