φυβλαςのβλογ
phyblas的博客



[python] ใช้ opencv (cv2) เพื่อค้นหาใบหน้าอนิเมะ
เขียนเมื่อ 2018/03/26 11:36
แก้ไขล่าสุด 2021/09/28 16:42
opencv เป็นไลบรารีสำหรับจัดการเกี่ยวกับรูปภาพ สามารถเรียกใช้ได้จากหลายภาษา รวมถึงไพธอนด้วย

ความสามารถของ opencv มีหลากหลายอย่าง แต่ในที่นี้จะแนะนำการใช้ opencv เพื่อค้นหาภาพใบหน้าตัวละครอนิเมะจากภายในรูปภาพ

สำหรับไพธอนสามารถติดตั้งได้โดย
pip install opencv-python

แต่เวลาเรียกใช้ จะต้อง import ชื่อ cv2
import cv2

cv2.CascadeClassifier เป็นคำสั่งที่ใช้ในการค้นสิ่งที่ต้องการจากรูปภาพ โดยเริ่มแรกต้องโหลดไฟล์ที่เรียกว่าไฟล์ cascade ซึ่งเป็นไฟล์ที่กำหนดลักษณะของสิ่งที่ต้องการตรวจจับ

ไฟล์ cascade สำหรับตรวจจับสิ่งต่างๆจะมีเตรียมไว้อยู่ในโฟลเดอร์ของ opencv อยู่แล้ว

แต่ว่าไม่มีไฟล์สำหรับใช้ตรวจจับใบหน้าของตัวละครในอนิเมะโดยเฉพาะ ซึ่งมันต่างจากใบหน้าคนธรรมดาอยู่พอสมควร แต่ก็ได้มีคนญี่ปุ่นทำเอาไว้ สามารถโหลดได้ที่ https://github.com/nagadomi/lbpcascade_animeface

ให้โหลดไฟล์ lbpcascade_animeface.xml มาแล้วใส่ไว้ในโฟลเดอร์เดียวกับไฟล์โปรแกรมที่จะรัน

ในที่นี้จะขอแสดงตัวอย่างโดยเขียนโค้ดให้ทดสอบภาพทั้งหมดที่อยู่ในโฟลเดอร์นึง แล้วทำการวาดกรอบส่วนที่ตรวจจับได้แล้วบันทึกภาพใหม่ ได้ดังนี้
import cv2,os
from glob import glob

cascade = cv2.CascadeClassifier('lbpcascade_animeface.xml') # เตรียมไฟล์ cascade ไว้
folder_rup = 'rupprakopwalidet' # โฟลเดอร์รูปต้นฉบับ
folder_mai = 'khonhana' # โฟลเดอร์ที่จะใส่ผลลัพธ์
if not os.path.exists(folder_mai): # ถ้ายังไม่มีก็สร้างก่อน
    os.makedirs(folder_mai)
for chue_rup in sorted(glob(os.path.join(folder_rup,'*.jpg'))):
    rup = cv2.imread(chue_rup)
    raisi = cv2.cvtColor(rup,cv2.COLOR_BGR2GRAY)
    raisi = cv2.equalizeHist(raisi)
    hachoe = cascade.detectMultiScale(raisi,1.1,5) # เริ่มค้นหา
    for x,y,w,h in hachoe:
        cv2.rectangle(rup,(x,y),(x+w,y+h),(100,0,200),2) # ใส่กรอบส่วนที่หาเจอ
    cv2.imwrite(os.path.join(folder_mai,os.path.split(chue_rup)[-1]),rup) # บันทึกภาพ

cv2.imread จะทำการอ่านรูปภาพขึ้นมา

cv2.cvtColor คือคำสั่งเปลี่ยนรูปแบบสี ในที่นี้เลือกโหมด cv2.COLOR_BGR2GRAY คือเปลี่ยนเป็นแบบขาวเทาดำ

cv2.equalizeHist เป็นตัวทำให้ความเข้มภายในภาพมีความเปรียบต่างชัดเจนยิ่งขึ้น ทำให้ตรวจจับภาพได้ง่ายขึ้น

ภาพเปรียบเทียบระหว่างภาพเดิม กับหลังเปลี่ยนเป็นไร้สี แล้วก็หลังจากใช้ cv2.equalizeHist





แล้วก็ใช้เมธอด .detectMultiScale ที่ตัว cascade โดยป้อนภาพไร้สีลงไป จะได้ค่าคืนกลับมาเป็นพิกัดของภาพทั้งหมดที่ค้นเจอ
x ตำแหน่งในแกน x
y ตำแหน่งในแกน y
w ขนาดในแกน x
h ขนาดในแกน y

ตรงนี้หากต้องการกำหนดขอบเขตขนาดภาพไม่ให้เล็กหรือใหญ่ไปก็อาจใส่คีย์เวิร์ด minSize=(x,y) หรือ maxSize=(x,y) เสริมเข้าไป แต่ในที่นี่ไม่ใส่เพราะจะลองหาภาพทุกขนาด ไม่ว่าใบหน้านั้นจะเล็กหรือใหญ่แค่ไหน

พอได้พิกัดมาแล้วก็ทำการใส่กรอบลงในภาพด้วยคำสั่ง cv2.rectangle

สุดท้ายก็บันทึกภาพด้วยคำสั่ง cv2.imwrite

ในที่นี้ได้ลองทดสอบกับภาพประกอบวลีเด็ดที่ลงในเว็บ https://hinaboshi.com

จะขอแสดงผลที่ได้จำนวนนึง (หากอยากรู้ว่าภาพนี้ประกอบวลีเด็ดอะไรให้คลิกที่ภาพเพื่อเข้าดูหน้าวลีเด็ดนั้นได้)

เริ่มจากภาพที่ยกมาเมื่อครู่ จากเรื่อง photo kano ดูแล้วมี ๕ คนแต่เจอแค่ ๓ คนเอง



ภาพนี้จาก code geass แย่กว่า เจอแค่ ๒ คน



ส่วนภาพนี้จาก shingeki no kyojin ฌ็อง อยู่ด้านหน้าหาไม่เจอ แต่หาคนข้างหลังเจอ



อันนี้จาก oremonogatari!! ทาเกโอะโดนมองข้ามไป หน้าอาจจะประหลาดไปหน่อยหรือเปล่า



ภาพนี้จาก flip flappers หาไม่เจอหลายคน แต่ด้านหลังที่มืดๆกับด้านหน้าที่ใส่แว่นอยู่กลับหาเจอได้



อันนี้ amanchu! เจอแต่ฮิการิ แต่ฟุตาบะโดนมองข้าม



จาก Re: zero อันนี้แฟริสโดนมองข้าม



จาก oregairu ฮาจิมังโดนมองข้าม




ส่วนอันนี้แปลกๆ ภาพทางซ้ายเหมือนๆกันแต่ค้นเจอแค่อันบน



แล้วอันนี้ จาก zetsuen no tempest มันไปเจอหน้าอะไรตรงเหนือคิ้วนั่น



ดูที่ค่อนข้างสำเร็จบ้างดีกว่า อย่างอันนี้ มีเท่าไหร่ก็เจอหมดเลย



จาก totori no atelier



เกม angel beats



gakkou gurashi



aoi umi no tristia



อันนี้จาก absolute duo หน้าที่ซ่อนอยู่ข้างหลังก็ยังเจอ





โดยสรุปแล้วก็ใช้งานได้ดีในระดับนึง แม้ว่าจะยังไม่สมบูรณ์ มีใบหน้ามากมายที่ตรวจจับได้ไม่สำเร็จ และมีตรวจโดนสิ่งที่ไม่ใช่ใบหน้ามาด้วยโดยมาแปลกๆไม่ทราบสาเหตุ



อ้างอิง


-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

ดูสถิติของหน้านี้

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> python
-- คอมพิวเตอร์ >> เขียนโปรแกรม >> opencv

ไม่อนุญาตให้นำเนื้อหาของบทความไปลงที่อื่นโดยไม่ได้ขออนุญาตโดยเด็ดขาด หากต้องการนำบางส่วนไปลงสามารถทำได้โดยต้องไม่ใช่การก๊อปแปะแต่ให้เปลี่ยนคำพูดเป็นของตัวเอง หรือไม่ก็เขียนในลักษณะการยกข้อความอ้างอิง และไม่ว่ากรณีไหนก็ตาม ต้องให้เครดิตพร้อมใส่ลิงก์ของทุกบทความที่มีการใช้เนื้อหาเสมอ

目录

从日本来的名言
模块
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
机器学习
-- 神经网络
javascript
蒙古语
语言学
maya
概率论
与日本相关的日记
与中国相关的日记
-- 与北京相关的日记
-- 与香港相关的日记
-- 与澳门相关的日记
与台湾相关的日记
与北欧相关的日记
与其他国家相关的日记
qiita
其他日志

按类别分日志



ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ

  查看日志

  推荐日志

ตัวอักษรกรีกและเปรียบเทียบการใช้งานในภาษากรีกโบราณและกรีกสมัยใหม่
ที่มาของอักษรไทยและความเกี่ยวพันกับอักษรอื่นๆในตระกูลอักษรพราหมี
การสร้างแบบจำลองสามมิติเป็นไฟล์ .obj วิธีการอย่างง่ายที่ไม่ว่าใครก็ลองทำได้ทันที
รวมรายชื่อนักร้องเพลงกวางตุ้ง
ภาษาจีนแบ่งเป็นสำเนียงอะไรบ้าง มีความแตกต่างกันมากแค่ไหน
ทำความเข้าใจระบอบประชาธิปไตยจากประวัติศาสตร์ความเป็นมา
เรียนรู้วิธีการใช้ regular expression (regex)
การใช้ unix shell เบื้องต้น ใน linux และ mac
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ