├── utils ├── segment │ ├── __init__.py │ ├── face_seg.py │ ├── layers.py │ ├── fcn.py │ └── hrnet.py ├── __init__.py ├── preprocess.py ├── utils.py └── face_detect.py ├── out.mp4 ├── face.mp4 ├── img ├── bg.jpg ├── bg.png ├── bag.png ├── body.png ├── face.png ├── mask.png ├── pose.png ├── alpha.png ├── face_1.jpeg ├── ticket_up.png ├── helmet_front.png ├── helmet_rear.png ├── left_elbow.png ├── left_wrist.png ├── right_elbow.png ├── right_wrist.png ├── ticket_bottom.png ├── left_wrist_takeoff.png └── right_wrist_takeoff.png ├── face_img ├── 0.jpg ├── 1.jpg ├── 10.jpg ├── 11.jpg ├── 12.jpg ├── 13.jpg ├── 14.jpg ├── 15.jpg ├── 16.jpg ├── 17.jpg ├── 18.jpg ├── 19.jpg ├── 2.jpg ├── 20.jpg ├── 21.jpg ├── 22.jpg ├── 23.jpg ├── 24.jpg ├── 25.jpg ├── 26.jpg ├── 27.jpg ├── 28.jpg ├── 29.jpg ├── 3.jpg ├── 30.jpg ├── 31.jpg ├── 32.jpg ├── 33.jpg ├── 34.jpg ├── 35.jpg ├── 36.jpg ├── 37.jpg ├── 38.jpg ├── 39.jpg ├── 4.jpg ├── 40.jpg ├── 41.jpg ├── 42.jpg ├── 43.jpg ├── 44.jpg ├── 45.jpg ├── 46.jpg ├── 47.jpg ├── 48.jpg ├── 49.jpg ├── 5.jpg ├── 50.jpg ├── 51.jpg ├── 52.jpg ├── 53.jpg ├── 54.jpg ├── 55.jpg ├── 56.jpg ├── 57.jpg ├── 58.jpg ├── 59.jpg ├── 6.jpg ├── 60.jpg ├── 61.jpg ├── 62.jpg ├── 63.jpg ├── 64.jpg ├── 65.jpg ├── 66.jpg ├── 67.jpg ├── 68.jpg ├── 69.jpg ├── 7.jpg ├── 70.jpg ├── 71.jpg ├── 72.jpg ├── 73.jpg ├── 74.jpg ├── 75.jpg ├── 76.jpg ├── 8.jpg └── 9.jpg ├── mp4 └── demo_1.mp4 ├── mp4_img ├── 0.jpg ├── 1.jpg ├── 10.jpg ├── 100.jpg ├── 101.jpg ├── 102.jpg ├── 103.jpg ├── 104.jpg ├── 105.jpg ├── 106.jpg ├── 107.jpg ├── 108.jpg ├── 109.jpg ├── 11.jpg ├── 110.jpg ├── 111.jpg ├── 112.jpg ├── 113.jpg ├── 114.jpg ├── 115.jpg ├── 116.jpg ├── 12.jpg ├── 13.jpg ├── 14.jpg ├── 15.jpg ├── 16.jpg ├── 17.jpg ├── 18.jpg ├── 19.jpg ├── 2.jpg ├── 20.jpg ├── 21.jpg ├── 22.jpg ├── 23.jpg ├── 24.jpg ├── 25.jpg ├── 26.jpg ├── 27.jpg ├── 28.jpg ├── 29.jpg ├── 3.jpg ├── 30.jpg ├── 31.jpg ├── 32.jpg ├── 33.jpg ├── 34.jpg ├── 35.jpg ├── 36.jpg ├── 37.jpg ├── 38.jpg ├── 39.jpg ├── 4.jpg ├── 40.jpg ├── 41.jpg ├── 42.jpg ├── 43.jpg ├── 44.jpg ├── 45.jpg ├── 46.jpg ├── 47.jpg ├── 48.jpg ├── 49.jpg ├── 5.jpg ├── 50.jpg ├── 51.jpg ├── 52.jpg ├── 53.jpg ├── 54.jpg ├── 55.jpg ├── 56.jpg ├── 57.jpg ├── 58.jpg ├── 59.jpg ├── 6.jpg ├── 60.jpg ├── 61.jpg ├── 62.jpg ├── 63.jpg ├── 64.jpg ├── 65.jpg ├── 66.jpg ├── 67.jpg ├── 68.jpg ├── 69.jpg ├── 7.jpg ├── 70.jpg ├── 71.jpg ├── 72.jpg ├── 73.jpg ├── 74.jpg ├── 75.jpg ├── 76.jpg ├── 77.jpg ├── 78.jpg ├── 79.jpg ├── 8.jpg ├── 80.jpg ├── 81.jpg ├── 82.jpg ├── 83.jpg ├── 84.jpg ├── 85.jpg ├── 86.jpg ├── 87.jpg ├── 88.jpg ├── 89.jpg ├── 9.jpg ├── 90.jpg ├── 91.jpg ├── 92.jpg ├── 93.jpg ├── 94.jpg ├── 95.jpg ├── 96.jpg ├── 97.jpg ├── 98.jpg └── 99.jpg ├── out_put ├── 0.png ├── 1.png ├── 10.png ├── 100.png ├── 101.png ├── 103.png ├── 104.png ├── 105.png ├── 106.png ├── 107.png ├── 108.png ├── 109.png ├── 11.png ├── 110.png ├── 111.png ├── 112.png ├── 113.png ├── 114.png ├── 115.png ├── 116.png ├── 12.png ├── 13.png ├── 14.png ├── 15.png ├── 16.png ├── 17.png ├── 18.png ├── 19.png ├── 2.png ├── 20.png ├── 21.png ├── 22.png ├── 23.png ├── 24.png ├── 25.png ├── 26.png ├── 27.png ├── 28.png ├── 29.png ├── 3.png ├── 30.png ├── 31.png ├── 32.png ├── 33.png ├── 34.png ├── 35.png ├── 36.png ├── 37.png ├── 38.png ├── 39.png ├── 4.png ├── 40.png ├── 41.png ├── 42.png ├── 43.png ├── 44.png ├── 45.png ├── 46.png ├── 47.png ├── 48.png ├── 49.png ├── 5.png ├── 50.png ├── 51.png ├── 52.png ├── 53.png ├── 55.png ├── 57.png ├── 58.png ├── 59.png ├── 6.png ├── 60.png ├── 61.png ├── 62.png ├── 63.png ├── 64.png ├── 65.png ├── 66.png ├── 67.png ├── 68.png ├── 69.png ├── 7.png ├── 72.png ├── 73.png ├── 74.png ├── 75.png ├── 76.png ├── 77.png ├── 78.png ├── 79.png ├── 8.png ├── 80.png ├── 81.png ├── 82.png ├── 83.png ├── 84.png ├── 85.png ├── 86.png ├── 87.png ├── 88.png ├── 89.png ├── 9.png ├── 90.png ├── 91.png ├── 92.png ├── 93.png ├── 94.png ├── 95.png ├── 96.png ├── 97.png ├── 98.png └── 99.png ├── images ├── QRcode.jpg ├── test1.jpeg ├── title.png ├── results.png ├── photo_test.jpg ├── data_process.jpg ├── test1_result.jpeg └── test1_result2.jpeg ├── face_img_gan ├── 0.jpg ├── 1.jpg ├── 10.jpg ├── 11.jpg ├── 12.jpg ├── 13.jpg ├── 14.jpg ├── 15.jpg ├── 16.jpg ├── 17.jpg ├── 18.jpg ├── 19.jpg ├── 2.jpg ├── 20.jpg ├── 21.jpg ├── 22.jpg ├── 23.jpg ├── 24.jpg ├── 25.jpg ├── 26.jpg ├── 27.jpg ├── 28.jpg ├── 29.jpg ├── 3.jpg ├── 30.jpg ├── 31.jpg ├── 32.jpg ├── 33.jpg ├── 34.jpg ├── 35.jpg ├── 36.jpg ├── 37.jpg ├── 38.jpg ├── 39.jpg ├── 4.jpg ├── 40.jpg ├── 41.jpg ├── 42.jpg ├── 43.jpg ├── 44.jpg ├── 45.jpg ├── 46.jpg ├── 47.jpg ├── 48.jpg ├── 49.jpg ├── 5.jpg ├── 50.jpg ├── 51.jpg ├── 52.jpg ├── 53.jpg ├── 54.jpg ├── 55.jpg ├── 56.jpg ├── 57.jpg ├── 58.jpg ├── 59.jpg ├── 6.jpg ├── 60.jpg ├── 61.jpg ├── 62.jpg ├── 63.jpg ├── 64.jpg ├── 65.jpg ├── 66.jpg ├── 67.jpg ├── 68.jpg ├── 69.jpg ├── 7.jpg ├── 70.jpg ├── 71.jpg ├── 72.jpg ├── 73.jpg ├── 74.jpg ├── 75.jpg ├── 76.jpg ├── 8.jpg └── 9.jpg ├── face_mp4 └── face2.mp4 ├── one_ticket └── one.png ├── models ├── __init__.py ├── sn.py ├── networks.py └── UGATIT_sadalin_hourglass.py ├── dataset └── README.md ├── README.md ├── .gitignore ├── test.py ├── demo.py └── utils_ └── utils.py /utils/segment/__init__.py: -------------------------------------------------------------------------------- 1 | from .face_seg import FaceSeg 2 | -------------------------------------------------------------------------------- /out.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out.mp4 -------------------------------------------------------------------------------- /face.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face.mp4 -------------------------------------------------------------------------------- /img/bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/img/bg.jpg -------------------------------------------------------------------------------- /img/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/img/bg.png -------------------------------------------------------------------------------- /utils/__init__.py: -------------------------------------------------------------------------------- 1 | from .preprocess import Preprocess 2 | from .utils import * 3 | -------------------------------------------------------------------------------- /img/bag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/img/bag.png -------------------------------------------------------------------------------- /img/body.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/img/body.png -------------------------------------------------------------------------------- /img/face.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/img/face.png -------------------------------------------------------------------------------- /img/mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/img/mask.png -------------------------------------------------------------------------------- /img/pose.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/img/pose.png -------------------------------------------------------------------------------- /face_img/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/0.jpg -------------------------------------------------------------------------------- /face_img/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/1.jpg -------------------------------------------------------------------------------- /face_img/10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/10.jpg -------------------------------------------------------------------------------- /face_img/11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/11.jpg -------------------------------------------------------------------------------- /face_img/12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/12.jpg -------------------------------------------------------------------------------- /face_img/13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/13.jpg -------------------------------------------------------------------------------- /face_img/14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/14.jpg -------------------------------------------------------------------------------- /face_img/15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/15.jpg -------------------------------------------------------------------------------- /face_img/16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/16.jpg -------------------------------------------------------------------------------- /face_img/17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/17.jpg -------------------------------------------------------------------------------- /face_img/18.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/18.jpg -------------------------------------------------------------------------------- /face_img/19.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/19.jpg -------------------------------------------------------------------------------- /face_img/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/2.jpg -------------------------------------------------------------------------------- /face_img/20.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/20.jpg -------------------------------------------------------------------------------- /face_img/21.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/21.jpg -------------------------------------------------------------------------------- /face_img/22.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/22.jpg -------------------------------------------------------------------------------- /face_img/23.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/23.jpg -------------------------------------------------------------------------------- /face_img/24.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/24.jpg -------------------------------------------------------------------------------- /face_img/25.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/25.jpg -------------------------------------------------------------------------------- /face_img/26.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/26.jpg -------------------------------------------------------------------------------- /face_img/27.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/27.jpg -------------------------------------------------------------------------------- /face_img/28.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/28.jpg -------------------------------------------------------------------------------- /face_img/29.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/29.jpg -------------------------------------------------------------------------------- /face_img/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/3.jpg -------------------------------------------------------------------------------- /face_img/30.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/30.jpg -------------------------------------------------------------------------------- /face_img/31.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/31.jpg -------------------------------------------------------------------------------- /face_img/32.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/32.jpg -------------------------------------------------------------------------------- /face_img/33.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/33.jpg -------------------------------------------------------------------------------- /face_img/34.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/34.jpg -------------------------------------------------------------------------------- /face_img/35.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/35.jpg -------------------------------------------------------------------------------- /face_img/36.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/36.jpg -------------------------------------------------------------------------------- /face_img/37.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/37.jpg -------------------------------------------------------------------------------- /face_img/38.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/38.jpg -------------------------------------------------------------------------------- /face_img/39.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/39.jpg -------------------------------------------------------------------------------- /face_img/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/4.jpg -------------------------------------------------------------------------------- /face_img/40.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/40.jpg -------------------------------------------------------------------------------- /face_img/41.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/41.jpg -------------------------------------------------------------------------------- /face_img/42.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/42.jpg -------------------------------------------------------------------------------- /face_img/43.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/43.jpg -------------------------------------------------------------------------------- /face_img/44.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/44.jpg -------------------------------------------------------------------------------- /face_img/45.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/45.jpg -------------------------------------------------------------------------------- /face_img/46.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/46.jpg -------------------------------------------------------------------------------- /face_img/47.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/47.jpg -------------------------------------------------------------------------------- /face_img/48.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/48.jpg -------------------------------------------------------------------------------- /face_img/49.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/49.jpg -------------------------------------------------------------------------------- /face_img/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/5.jpg -------------------------------------------------------------------------------- /face_img/50.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/50.jpg -------------------------------------------------------------------------------- /face_img/51.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/51.jpg -------------------------------------------------------------------------------- /face_img/52.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/52.jpg -------------------------------------------------------------------------------- /face_img/53.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/53.jpg -------------------------------------------------------------------------------- /face_img/54.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/54.jpg -------------------------------------------------------------------------------- /face_img/55.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/55.jpg -------------------------------------------------------------------------------- /face_img/56.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/56.jpg -------------------------------------------------------------------------------- /face_img/57.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/57.jpg -------------------------------------------------------------------------------- /face_img/58.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/58.jpg -------------------------------------------------------------------------------- /face_img/59.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/59.jpg -------------------------------------------------------------------------------- /face_img/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/6.jpg -------------------------------------------------------------------------------- /face_img/60.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/60.jpg -------------------------------------------------------------------------------- /face_img/61.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/61.jpg -------------------------------------------------------------------------------- /face_img/62.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/62.jpg -------------------------------------------------------------------------------- /face_img/63.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/63.jpg -------------------------------------------------------------------------------- /face_img/64.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/64.jpg -------------------------------------------------------------------------------- /face_img/65.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/65.jpg -------------------------------------------------------------------------------- /face_img/66.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/66.jpg -------------------------------------------------------------------------------- /face_img/67.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/67.jpg -------------------------------------------------------------------------------- /face_img/68.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/68.jpg -------------------------------------------------------------------------------- /face_img/69.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/69.jpg -------------------------------------------------------------------------------- /face_img/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/7.jpg -------------------------------------------------------------------------------- /face_img/70.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/70.jpg -------------------------------------------------------------------------------- /face_img/71.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/71.jpg -------------------------------------------------------------------------------- /face_img/72.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/72.jpg -------------------------------------------------------------------------------- /face_img/73.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/73.jpg -------------------------------------------------------------------------------- /face_img/74.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/74.jpg -------------------------------------------------------------------------------- /face_img/75.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/75.jpg -------------------------------------------------------------------------------- /face_img/76.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/76.jpg -------------------------------------------------------------------------------- /face_img/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/8.jpg -------------------------------------------------------------------------------- /face_img/9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img/9.jpg -------------------------------------------------------------------------------- /img/alpha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/img/alpha.png -------------------------------------------------------------------------------- /img/face_1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/img/face_1.jpeg -------------------------------------------------------------------------------- /mp4/demo_1.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4/demo_1.mp4 -------------------------------------------------------------------------------- /mp4_img/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/0.jpg -------------------------------------------------------------------------------- /mp4_img/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/1.jpg -------------------------------------------------------------------------------- /mp4_img/10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/10.jpg -------------------------------------------------------------------------------- /mp4_img/100.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/100.jpg -------------------------------------------------------------------------------- /mp4_img/101.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/101.jpg -------------------------------------------------------------------------------- /mp4_img/102.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/102.jpg -------------------------------------------------------------------------------- /mp4_img/103.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/103.jpg -------------------------------------------------------------------------------- /mp4_img/104.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/104.jpg -------------------------------------------------------------------------------- /mp4_img/105.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/105.jpg -------------------------------------------------------------------------------- /mp4_img/106.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/106.jpg -------------------------------------------------------------------------------- /mp4_img/107.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/107.jpg -------------------------------------------------------------------------------- /mp4_img/108.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/108.jpg -------------------------------------------------------------------------------- /mp4_img/109.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/109.jpg -------------------------------------------------------------------------------- /mp4_img/11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/11.jpg -------------------------------------------------------------------------------- /mp4_img/110.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/110.jpg -------------------------------------------------------------------------------- /mp4_img/111.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/111.jpg -------------------------------------------------------------------------------- /mp4_img/112.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/112.jpg -------------------------------------------------------------------------------- /mp4_img/113.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/113.jpg -------------------------------------------------------------------------------- /mp4_img/114.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/114.jpg -------------------------------------------------------------------------------- /mp4_img/115.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/115.jpg -------------------------------------------------------------------------------- /mp4_img/116.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/116.jpg -------------------------------------------------------------------------------- /mp4_img/12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/12.jpg -------------------------------------------------------------------------------- /mp4_img/13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/13.jpg -------------------------------------------------------------------------------- /mp4_img/14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/14.jpg -------------------------------------------------------------------------------- /mp4_img/15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/15.jpg -------------------------------------------------------------------------------- /mp4_img/16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/16.jpg -------------------------------------------------------------------------------- /mp4_img/17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/17.jpg -------------------------------------------------------------------------------- /mp4_img/18.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/18.jpg -------------------------------------------------------------------------------- /mp4_img/19.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/19.jpg -------------------------------------------------------------------------------- /mp4_img/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/2.jpg -------------------------------------------------------------------------------- /mp4_img/20.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/20.jpg -------------------------------------------------------------------------------- /mp4_img/21.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/21.jpg -------------------------------------------------------------------------------- /mp4_img/22.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/22.jpg -------------------------------------------------------------------------------- /mp4_img/23.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/23.jpg -------------------------------------------------------------------------------- /mp4_img/24.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/24.jpg -------------------------------------------------------------------------------- /mp4_img/25.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/25.jpg -------------------------------------------------------------------------------- /mp4_img/26.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/26.jpg -------------------------------------------------------------------------------- /mp4_img/27.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/27.jpg -------------------------------------------------------------------------------- /mp4_img/28.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/28.jpg -------------------------------------------------------------------------------- /mp4_img/29.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/29.jpg -------------------------------------------------------------------------------- /mp4_img/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/3.jpg -------------------------------------------------------------------------------- /mp4_img/30.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/30.jpg -------------------------------------------------------------------------------- /mp4_img/31.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/31.jpg -------------------------------------------------------------------------------- /mp4_img/32.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/32.jpg -------------------------------------------------------------------------------- /mp4_img/33.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/33.jpg -------------------------------------------------------------------------------- /mp4_img/34.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/34.jpg -------------------------------------------------------------------------------- /mp4_img/35.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/35.jpg -------------------------------------------------------------------------------- /mp4_img/36.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/36.jpg -------------------------------------------------------------------------------- /mp4_img/37.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/37.jpg -------------------------------------------------------------------------------- /mp4_img/38.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/38.jpg -------------------------------------------------------------------------------- /mp4_img/39.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/39.jpg -------------------------------------------------------------------------------- /mp4_img/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/4.jpg -------------------------------------------------------------------------------- /mp4_img/40.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/40.jpg -------------------------------------------------------------------------------- /mp4_img/41.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/41.jpg -------------------------------------------------------------------------------- /mp4_img/42.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/42.jpg -------------------------------------------------------------------------------- /mp4_img/43.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/43.jpg -------------------------------------------------------------------------------- /mp4_img/44.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/44.jpg -------------------------------------------------------------------------------- /mp4_img/45.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/45.jpg -------------------------------------------------------------------------------- /mp4_img/46.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/46.jpg -------------------------------------------------------------------------------- /mp4_img/47.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/47.jpg -------------------------------------------------------------------------------- /mp4_img/48.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/48.jpg -------------------------------------------------------------------------------- /mp4_img/49.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/49.jpg -------------------------------------------------------------------------------- /mp4_img/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/5.jpg -------------------------------------------------------------------------------- /mp4_img/50.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/50.jpg -------------------------------------------------------------------------------- /mp4_img/51.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/51.jpg -------------------------------------------------------------------------------- /mp4_img/52.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/52.jpg -------------------------------------------------------------------------------- /mp4_img/53.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/53.jpg -------------------------------------------------------------------------------- /mp4_img/54.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/54.jpg -------------------------------------------------------------------------------- /mp4_img/55.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/55.jpg -------------------------------------------------------------------------------- /mp4_img/56.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/56.jpg -------------------------------------------------------------------------------- /mp4_img/57.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/57.jpg -------------------------------------------------------------------------------- /mp4_img/58.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/58.jpg -------------------------------------------------------------------------------- /mp4_img/59.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/59.jpg -------------------------------------------------------------------------------- /mp4_img/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/6.jpg -------------------------------------------------------------------------------- /mp4_img/60.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/60.jpg -------------------------------------------------------------------------------- /mp4_img/61.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/61.jpg -------------------------------------------------------------------------------- /mp4_img/62.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/62.jpg -------------------------------------------------------------------------------- /mp4_img/63.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/63.jpg -------------------------------------------------------------------------------- /mp4_img/64.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/64.jpg -------------------------------------------------------------------------------- /mp4_img/65.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/65.jpg -------------------------------------------------------------------------------- /mp4_img/66.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/66.jpg -------------------------------------------------------------------------------- /mp4_img/67.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/67.jpg -------------------------------------------------------------------------------- /mp4_img/68.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/68.jpg -------------------------------------------------------------------------------- /mp4_img/69.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/69.jpg -------------------------------------------------------------------------------- /mp4_img/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/7.jpg -------------------------------------------------------------------------------- /mp4_img/70.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/70.jpg -------------------------------------------------------------------------------- /mp4_img/71.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/71.jpg -------------------------------------------------------------------------------- /mp4_img/72.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/72.jpg -------------------------------------------------------------------------------- /mp4_img/73.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/73.jpg -------------------------------------------------------------------------------- /mp4_img/74.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/74.jpg -------------------------------------------------------------------------------- /mp4_img/75.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/75.jpg -------------------------------------------------------------------------------- /mp4_img/76.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/76.jpg -------------------------------------------------------------------------------- /mp4_img/77.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/77.jpg -------------------------------------------------------------------------------- /mp4_img/78.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/78.jpg -------------------------------------------------------------------------------- /mp4_img/79.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/79.jpg -------------------------------------------------------------------------------- /mp4_img/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/8.jpg -------------------------------------------------------------------------------- /mp4_img/80.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/80.jpg -------------------------------------------------------------------------------- /mp4_img/81.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/81.jpg -------------------------------------------------------------------------------- /mp4_img/82.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/82.jpg -------------------------------------------------------------------------------- /mp4_img/83.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/83.jpg -------------------------------------------------------------------------------- /mp4_img/84.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/84.jpg -------------------------------------------------------------------------------- /mp4_img/85.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/85.jpg -------------------------------------------------------------------------------- /mp4_img/86.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/86.jpg -------------------------------------------------------------------------------- /mp4_img/87.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/87.jpg -------------------------------------------------------------------------------- /mp4_img/88.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/88.jpg -------------------------------------------------------------------------------- /mp4_img/89.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/89.jpg -------------------------------------------------------------------------------- /mp4_img/9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/9.jpg -------------------------------------------------------------------------------- /mp4_img/90.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/90.jpg -------------------------------------------------------------------------------- /mp4_img/91.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/91.jpg -------------------------------------------------------------------------------- /mp4_img/92.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/92.jpg -------------------------------------------------------------------------------- /mp4_img/93.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/93.jpg -------------------------------------------------------------------------------- /mp4_img/94.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/94.jpg -------------------------------------------------------------------------------- /mp4_img/95.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/95.jpg -------------------------------------------------------------------------------- /mp4_img/96.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/96.jpg -------------------------------------------------------------------------------- /mp4_img/97.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/97.jpg -------------------------------------------------------------------------------- /mp4_img/98.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/98.jpg -------------------------------------------------------------------------------- /mp4_img/99.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/mp4_img/99.jpg -------------------------------------------------------------------------------- /out_put/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/0.png -------------------------------------------------------------------------------- /out_put/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/1.png -------------------------------------------------------------------------------- /out_put/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/10.png -------------------------------------------------------------------------------- /out_put/100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/100.png -------------------------------------------------------------------------------- /out_put/101.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/101.png -------------------------------------------------------------------------------- /out_put/103.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/103.png -------------------------------------------------------------------------------- /out_put/104.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/104.png -------------------------------------------------------------------------------- /out_put/105.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/105.png -------------------------------------------------------------------------------- /out_put/106.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/106.png -------------------------------------------------------------------------------- /out_put/107.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/107.png -------------------------------------------------------------------------------- /out_put/108.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/108.png -------------------------------------------------------------------------------- /out_put/109.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/109.png -------------------------------------------------------------------------------- /out_put/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/11.png -------------------------------------------------------------------------------- /out_put/110.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/110.png -------------------------------------------------------------------------------- /out_put/111.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/111.png -------------------------------------------------------------------------------- /out_put/112.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/112.png -------------------------------------------------------------------------------- /out_put/113.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/113.png -------------------------------------------------------------------------------- /out_put/114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/114.png -------------------------------------------------------------------------------- /out_put/115.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/115.png -------------------------------------------------------------------------------- /out_put/116.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/116.png -------------------------------------------------------------------------------- /out_put/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/12.png -------------------------------------------------------------------------------- /out_put/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/13.png -------------------------------------------------------------------------------- /out_put/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/14.png -------------------------------------------------------------------------------- /out_put/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/15.png -------------------------------------------------------------------------------- /out_put/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/16.png -------------------------------------------------------------------------------- /out_put/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/17.png -------------------------------------------------------------------------------- /out_put/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/18.png -------------------------------------------------------------------------------- /out_put/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/19.png -------------------------------------------------------------------------------- /out_put/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/2.png -------------------------------------------------------------------------------- /out_put/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/20.png -------------------------------------------------------------------------------- /out_put/21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/21.png -------------------------------------------------------------------------------- /out_put/22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/22.png -------------------------------------------------------------------------------- /out_put/23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/23.png -------------------------------------------------------------------------------- /out_put/24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/24.png -------------------------------------------------------------------------------- /out_put/25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/25.png -------------------------------------------------------------------------------- /out_put/26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/26.png -------------------------------------------------------------------------------- /out_put/27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/27.png -------------------------------------------------------------------------------- /out_put/28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/28.png -------------------------------------------------------------------------------- /out_put/29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/29.png -------------------------------------------------------------------------------- /out_put/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/3.png -------------------------------------------------------------------------------- /out_put/30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/30.png -------------------------------------------------------------------------------- /out_put/31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/31.png -------------------------------------------------------------------------------- /out_put/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/32.png -------------------------------------------------------------------------------- /out_put/33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/33.png -------------------------------------------------------------------------------- /out_put/34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/34.png -------------------------------------------------------------------------------- /out_put/35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/35.png -------------------------------------------------------------------------------- /out_put/36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/36.png -------------------------------------------------------------------------------- /out_put/37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/37.png -------------------------------------------------------------------------------- /out_put/38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/38.png -------------------------------------------------------------------------------- /out_put/39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/39.png -------------------------------------------------------------------------------- /out_put/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/4.png -------------------------------------------------------------------------------- /out_put/40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/40.png -------------------------------------------------------------------------------- /out_put/41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/41.png -------------------------------------------------------------------------------- /out_put/42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/42.png -------------------------------------------------------------------------------- /out_put/43.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/43.png -------------------------------------------------------------------------------- /out_put/44.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/44.png -------------------------------------------------------------------------------- /out_put/45.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/45.png -------------------------------------------------------------------------------- /out_put/46.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/46.png -------------------------------------------------------------------------------- /out_put/47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/47.png -------------------------------------------------------------------------------- /out_put/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/48.png -------------------------------------------------------------------------------- /out_put/49.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/49.png -------------------------------------------------------------------------------- /out_put/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/5.png -------------------------------------------------------------------------------- /out_put/50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/50.png -------------------------------------------------------------------------------- /out_put/51.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/51.png -------------------------------------------------------------------------------- /out_put/52.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/52.png -------------------------------------------------------------------------------- /out_put/53.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/53.png -------------------------------------------------------------------------------- /out_put/55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/55.png -------------------------------------------------------------------------------- /out_put/57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/57.png -------------------------------------------------------------------------------- /out_put/58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/58.png -------------------------------------------------------------------------------- /out_put/59.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/59.png -------------------------------------------------------------------------------- /out_put/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/6.png -------------------------------------------------------------------------------- /out_put/60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/60.png -------------------------------------------------------------------------------- /out_put/61.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/61.png -------------------------------------------------------------------------------- /out_put/62.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/62.png -------------------------------------------------------------------------------- /out_put/63.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/63.png -------------------------------------------------------------------------------- /out_put/64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/64.png -------------------------------------------------------------------------------- /out_put/65.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/65.png -------------------------------------------------------------------------------- /out_put/66.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/66.png -------------------------------------------------------------------------------- /out_put/67.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/67.png -------------------------------------------------------------------------------- /out_put/68.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/68.png -------------------------------------------------------------------------------- /out_put/69.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/69.png -------------------------------------------------------------------------------- /out_put/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/7.png -------------------------------------------------------------------------------- /out_put/72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/72.png -------------------------------------------------------------------------------- /out_put/73.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/73.png -------------------------------------------------------------------------------- /out_put/74.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/74.png -------------------------------------------------------------------------------- /out_put/75.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/75.png -------------------------------------------------------------------------------- /out_put/76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/76.png -------------------------------------------------------------------------------- /out_put/77.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/77.png -------------------------------------------------------------------------------- /out_put/78.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/78.png -------------------------------------------------------------------------------- /out_put/79.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/79.png -------------------------------------------------------------------------------- /out_put/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/8.png -------------------------------------------------------------------------------- /out_put/80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/80.png -------------------------------------------------------------------------------- /out_put/81.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/81.png -------------------------------------------------------------------------------- /out_put/82.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/82.png -------------------------------------------------------------------------------- /out_put/83.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/83.png -------------------------------------------------------------------------------- /out_put/84.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/84.png -------------------------------------------------------------------------------- /out_put/85.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/85.png -------------------------------------------------------------------------------- /out_put/86.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/86.png -------------------------------------------------------------------------------- /out_put/87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/87.png -------------------------------------------------------------------------------- /out_put/88.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/88.png -------------------------------------------------------------------------------- /out_put/89.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/89.png -------------------------------------------------------------------------------- /out_put/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/9.png -------------------------------------------------------------------------------- /out_put/90.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/90.png -------------------------------------------------------------------------------- /out_put/91.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/91.png -------------------------------------------------------------------------------- /out_put/92.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/92.png -------------------------------------------------------------------------------- /out_put/93.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/93.png -------------------------------------------------------------------------------- /out_put/94.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/94.png -------------------------------------------------------------------------------- /out_put/95.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/95.png -------------------------------------------------------------------------------- /out_put/96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/96.png -------------------------------------------------------------------------------- /out_put/97.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/97.png -------------------------------------------------------------------------------- /out_put/98.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/98.png -------------------------------------------------------------------------------- /out_put/99.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/out_put/99.png -------------------------------------------------------------------------------- /images/QRcode.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/images/QRcode.jpg -------------------------------------------------------------------------------- /images/test1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/images/test1.jpeg -------------------------------------------------------------------------------- /images/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/images/title.png -------------------------------------------------------------------------------- /img/ticket_up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/img/ticket_up.png -------------------------------------------------------------------------------- /face_img_gan/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/0.jpg -------------------------------------------------------------------------------- /face_img_gan/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/1.jpg -------------------------------------------------------------------------------- /face_img_gan/10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/10.jpg -------------------------------------------------------------------------------- /face_img_gan/11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/11.jpg -------------------------------------------------------------------------------- /face_img_gan/12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/12.jpg -------------------------------------------------------------------------------- /face_img_gan/13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/13.jpg -------------------------------------------------------------------------------- /face_img_gan/14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/14.jpg -------------------------------------------------------------------------------- /face_img_gan/15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/15.jpg -------------------------------------------------------------------------------- /face_img_gan/16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/16.jpg -------------------------------------------------------------------------------- /face_img_gan/17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/17.jpg -------------------------------------------------------------------------------- /face_img_gan/18.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/18.jpg -------------------------------------------------------------------------------- /face_img_gan/19.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/19.jpg -------------------------------------------------------------------------------- /face_img_gan/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/2.jpg -------------------------------------------------------------------------------- /face_img_gan/20.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/20.jpg -------------------------------------------------------------------------------- /face_img_gan/21.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/21.jpg -------------------------------------------------------------------------------- /face_img_gan/22.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/22.jpg -------------------------------------------------------------------------------- /face_img_gan/23.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/23.jpg -------------------------------------------------------------------------------- /face_img_gan/24.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/24.jpg -------------------------------------------------------------------------------- /face_img_gan/25.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/25.jpg -------------------------------------------------------------------------------- /face_img_gan/26.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/26.jpg -------------------------------------------------------------------------------- /face_img_gan/27.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/27.jpg -------------------------------------------------------------------------------- /face_img_gan/28.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/28.jpg -------------------------------------------------------------------------------- /face_img_gan/29.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/29.jpg -------------------------------------------------------------------------------- /face_img_gan/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/3.jpg -------------------------------------------------------------------------------- /face_img_gan/30.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/30.jpg -------------------------------------------------------------------------------- /face_img_gan/31.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/31.jpg -------------------------------------------------------------------------------- /face_img_gan/32.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/32.jpg -------------------------------------------------------------------------------- /face_img_gan/33.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/33.jpg -------------------------------------------------------------------------------- /face_img_gan/34.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/34.jpg -------------------------------------------------------------------------------- /face_img_gan/35.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/35.jpg -------------------------------------------------------------------------------- /face_img_gan/36.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/36.jpg -------------------------------------------------------------------------------- /face_img_gan/37.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/37.jpg -------------------------------------------------------------------------------- /face_img_gan/38.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/38.jpg -------------------------------------------------------------------------------- /face_img_gan/39.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/39.jpg -------------------------------------------------------------------------------- /face_img_gan/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/4.jpg -------------------------------------------------------------------------------- /face_img_gan/40.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/40.jpg -------------------------------------------------------------------------------- /face_img_gan/41.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/41.jpg -------------------------------------------------------------------------------- /face_img_gan/42.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/42.jpg -------------------------------------------------------------------------------- /face_img_gan/43.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/43.jpg -------------------------------------------------------------------------------- /face_img_gan/44.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/44.jpg -------------------------------------------------------------------------------- /face_img_gan/45.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/45.jpg -------------------------------------------------------------------------------- /face_img_gan/46.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/46.jpg -------------------------------------------------------------------------------- /face_img_gan/47.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/47.jpg -------------------------------------------------------------------------------- /face_img_gan/48.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/48.jpg -------------------------------------------------------------------------------- /face_img_gan/49.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/49.jpg -------------------------------------------------------------------------------- /face_img_gan/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/5.jpg -------------------------------------------------------------------------------- /face_img_gan/50.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/50.jpg -------------------------------------------------------------------------------- /face_img_gan/51.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/51.jpg -------------------------------------------------------------------------------- /face_img_gan/52.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/52.jpg -------------------------------------------------------------------------------- /face_img_gan/53.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/53.jpg -------------------------------------------------------------------------------- /face_img_gan/54.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/54.jpg -------------------------------------------------------------------------------- /face_img_gan/55.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/55.jpg -------------------------------------------------------------------------------- /face_img_gan/56.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/56.jpg -------------------------------------------------------------------------------- /face_img_gan/57.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/57.jpg -------------------------------------------------------------------------------- /face_img_gan/58.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/58.jpg -------------------------------------------------------------------------------- /face_img_gan/59.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/59.jpg -------------------------------------------------------------------------------- /face_img_gan/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/6.jpg -------------------------------------------------------------------------------- /face_img_gan/60.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/60.jpg -------------------------------------------------------------------------------- /face_img_gan/61.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/61.jpg -------------------------------------------------------------------------------- /face_img_gan/62.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/62.jpg -------------------------------------------------------------------------------- /face_img_gan/63.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/63.jpg -------------------------------------------------------------------------------- /face_img_gan/64.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/64.jpg -------------------------------------------------------------------------------- /face_img_gan/65.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/65.jpg -------------------------------------------------------------------------------- /face_img_gan/66.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/66.jpg -------------------------------------------------------------------------------- /face_img_gan/67.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/67.jpg -------------------------------------------------------------------------------- /face_img_gan/68.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/68.jpg -------------------------------------------------------------------------------- /face_img_gan/69.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/69.jpg -------------------------------------------------------------------------------- /face_img_gan/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/7.jpg -------------------------------------------------------------------------------- /face_img_gan/70.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/70.jpg -------------------------------------------------------------------------------- /face_img_gan/71.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/71.jpg -------------------------------------------------------------------------------- /face_img_gan/72.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/72.jpg -------------------------------------------------------------------------------- /face_img_gan/73.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/73.jpg -------------------------------------------------------------------------------- /face_img_gan/74.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/74.jpg -------------------------------------------------------------------------------- /face_img_gan/75.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/75.jpg -------------------------------------------------------------------------------- /face_img_gan/76.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/76.jpg -------------------------------------------------------------------------------- /face_img_gan/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/8.jpg -------------------------------------------------------------------------------- /face_img_gan/9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_img_gan/9.jpg -------------------------------------------------------------------------------- /face_mp4/face2.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/face_mp4/face2.mp4 -------------------------------------------------------------------------------- /images/results.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/images/results.png -------------------------------------------------------------------------------- /img/helmet_front.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/img/helmet_front.png -------------------------------------------------------------------------------- /img/helmet_rear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/img/helmet_rear.png -------------------------------------------------------------------------------- /img/left_elbow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/img/left_elbow.png -------------------------------------------------------------------------------- /img/left_wrist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/img/left_wrist.png -------------------------------------------------------------------------------- /img/right_elbow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/img/right_elbow.png -------------------------------------------------------------------------------- /img/right_wrist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/img/right_wrist.png -------------------------------------------------------------------------------- /one_ticket/one.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/one_ticket/one.png -------------------------------------------------------------------------------- /images/photo_test.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/images/photo_test.jpg -------------------------------------------------------------------------------- /img/ticket_bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/img/ticket_bottom.png -------------------------------------------------------------------------------- /images/data_process.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/images/data_process.jpg -------------------------------------------------------------------------------- /images/test1_result.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/images/test1_result.jpeg -------------------------------------------------------------------------------- /images/test1_result2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/images/test1_result2.jpeg -------------------------------------------------------------------------------- /img/left_wrist_takeoff.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/img/left_wrist_takeoff.png -------------------------------------------------------------------------------- /img/right_wrist_takeoff.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siriuscy/MIXLAB_NASA_TICKET/HEAD/img/right_wrist_takeoff.png -------------------------------------------------------------------------------- /models/__init__.py: -------------------------------------------------------------------------------- 1 | from .networks import ResnetGenerator 2 | from .UGATIT_sadalin_hourglass import UgatitSadalinHourglass 3 | # 4 | -------------------------------------------------------------------------------- /dataset/README.md: -------------------------------------------------------------------------------- 1 | ``` 2 | ├── dataset 3 | └── photo2cartoon 4 | ├── trainA 5 | ├── xxx.jpg 6 | ├── yyy.png 7 | └── ... 8 | ├── trainB 9 | ├── zzz.jpg 10 | ├── www.png 11 | └── ... 12 | ├── testA 13 | ├── aaa.jpg 14 | ├── bbb.png 15 | └── ... 16 | └── testB 17 | ├── ccc.jpg 18 | ├── ddd.png 19 | └── ... 20 | ``` -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MIXLAB_NASA_TICKET 2 | mixlab 3 | 4 | 灵感来源于NASA的火星船票,我们想要使用开源的代码来定制化这一设计。 5 | 其中photo_to_cartoon 是paddle的开源代码:https://github.com/minivision-ai/photo2cartoon-paddle 6 | 也借鉴了paddle社区的优秀项目,动态剪影: https://aistudio.baidu.com/aistudio/projectdetail/764130 ,略修改了代码,将这个项目图片处理部分,用Image替代cv2,以便处理png等。 7 | 8 | 过程: 9 | 1.我们现将小组成员黄雨嫣的自拍视频,使用paddle的人体姿态检测,绑定宇航服骨骼, 10 | 2.使用photo2cartoon-paddle项目,将成员脸部提取出,作为人物头像 11 | 3.小组设计师设计了船票,留出png空白,将宇航员填入 12 | 13 | 结果: 14 | 可以用单张图片输出静态船票: 15 | ![one](https://user-images.githubusercontent.com/70752098/112250589-98b55080-8c94-11eb-9226-c8301c898eeb.png) 16 | 换脸: 17 | ![143](https://user-images.githubusercontent.com/70752098/112411108-4db04180-8d57-11eb-8ad7-22cf018ace54.png) 18 | 19 | 可以用视频输出动态船票 20 | B站:https://www.bilibili.com/video/BV16b4y1Q7vF 21 | 截屏: 22 | 截屏2021-03-26 上午11 22 50 23 | ![output_42](https://user-images.githubusercontent.com/70752098/112615970-242e0d80-8e5e-11eb-92e7-622f22551c21.gif) 24 | -------------------------------------------------------------------------------- /utils/segment/face_seg.py: -------------------------------------------------------------------------------- 1 | import os 2 | import cv2 3 | import numpy as np 4 | import paddle 5 | from .fcn import FCN 6 | from .hrnet import HRNet_W18 7 | 8 | 9 | curPath = os.path.abspath(os.path.dirname(__file__)) 10 | 11 | 12 | class FaceSeg: 13 | def __init__(self, model_path=os.path.join(curPath, 'seg_model_384.pdparams')): 14 | self.seg = FCN(num_classes=2, backbone=HRNet_W18()) 15 | para_state_dict = paddle.load(model_path) 16 | self.seg.set_state_dict(para_state_dict) 17 | self.seg.eval() 18 | 19 | def input_transform(self, image): 20 | image = cv2.resize(image, (384, 384), interpolation=cv2.INTER_AREA) 21 | image = (image / 255.)[np.newaxis, :, :, :] 22 | image = np.transpose(image, (0, 3, 1, 2)).astype(np.float32) 23 | image_input = paddle.to_tensor(image) 24 | return image_input 25 | 26 | def output_transform(self, output, shape): 27 | output = cv2.resize(output, (shape[1], shape[0])) 28 | image_output = (output * 255).astype(np.uint8) 29 | return image_output 30 | 31 | def get_mask(self, image): 32 | image_input = self.input_transform(image) 33 | with paddle.no_grad(): 34 | logits = self.seg(image_input) 35 | pred = paddle.argmax(logits[0], axis=1) 36 | pred = pred.numpy() 37 | mask = np.squeeze(pred).astype('uint8') 38 | 39 | mask = self.output_transform(mask, shape=image.shape[:2]) 40 | return mask 41 | 42 | -------------------------------------------------------------------------------- /utils/preprocess.py: -------------------------------------------------------------------------------- 1 | from .face_detect import FaceDetect 2 | from .segment import FaceSeg 3 | import numpy as np 4 | 5 | 6 | class Preprocess: 7 | def __init__(self, device='cpu', detector='dlib'): 8 | self.detect = FaceDetect(device, detector) # device = 'cpu' or 'cuda', detector = 'dlib' or 'sfd' 9 | self.segment = FaceSeg() 10 | 11 | def process(self, image): 12 | face_info = self.detect.align(image) 13 | if face_info is None: 14 | return None 15 | image_align, landmarks_align = face_info 16 | 17 | face = self.__crop(image_align, landmarks_align) 18 | mask = self.segment.get_mask(face) 19 | return np.dstack((face, mask)) 20 | 21 | @staticmethod 22 | def __crop(image, landmarks): 23 | landmarks_top = np.min(landmarks[:, 1]) 24 | landmarks_bottom = np.max(landmarks[:, 1]) 25 | landmarks_left = np.min(landmarks[:, 0]) 26 | landmarks_right = np.max(landmarks[:, 0]) 27 | 28 | # expand bbox 29 | top = int(landmarks_top - 0.8 * (landmarks_bottom - landmarks_top)) 30 | bottom = int(landmarks_bottom + 0.3 * (landmarks_bottom - landmarks_top)) 31 | left = int(landmarks_left - 0.3 * (landmarks_right - landmarks_left)) 32 | right = int(landmarks_right + 0.3 * (landmarks_right - landmarks_left)) 33 | 34 | if bottom - top > right - left: 35 | left -= ((bottom - top) - (right - left)) // 2 36 | right = left + (bottom - top) 37 | else: 38 | top -= ((right - left) - (bottom - top)) // 2 39 | bottom = top + (right - left) 40 | 41 | image_crop = np.ones((bottom - top + 1, right - left + 1, 3), np.uint8) * 255 42 | 43 | h, w = image.shape[:2] 44 | left_white = max(0, -left) 45 | left = max(0, left) 46 | right = min(right, w-1) 47 | right_white = left_white + (right-left) 48 | top_white = max(0, -top) 49 | top = max(0, top) 50 | bottom = min(bottom, h-1) 51 | bottom_white = top_white + (bottom - top) 52 | 53 | image_crop[top_white:bottom_white+1, left_white:right_white+1] = image[top:bottom+1, left:right+1].copy() 54 | return image_crop 55 | -------------------------------------------------------------------------------- /utils/segment/layers.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | import paddle 16 | import paddle.nn as nn 17 | import paddle.nn.functional as F 18 | 19 | 20 | def SyncBatchNorm(*args, **kwargs): 21 | """In cpu environment nn.SyncBatchNorm does not have kernel so use nn.BatchNorm instead""" 22 | if paddle.get_device() == 'cpu': 23 | return nn.BatchNorm(*args, **kwargs) 24 | else: 25 | return nn.SyncBatchNorm(*args, **kwargs) 26 | 27 | 28 | class ConvBNReLU(nn.Layer): 29 | def __init__(self, 30 | in_channels, 31 | out_channels, 32 | kernel_size, 33 | padding='same', 34 | **kwargs): 35 | super().__init__() 36 | 37 | self._conv = nn.Conv2D( 38 | in_channels, out_channels, kernel_size, padding=padding, **kwargs) 39 | 40 | self._batch_norm = SyncBatchNorm(out_channels) 41 | 42 | def forward(self, x): 43 | x = self._conv(x) 44 | x = self._batch_norm(x) 45 | x = F.relu(x) 46 | return x 47 | 48 | 49 | class ConvBN(nn.Layer): 50 | def __init__(self, 51 | in_channels, 52 | out_channels, 53 | kernel_size, 54 | padding='same', 55 | **kwargs): 56 | super().__init__() 57 | self._conv = nn.Conv2D( 58 | in_channels, out_channels, kernel_size, padding=padding, **kwargs) 59 | self._batch_norm = SyncBatchNorm(out_channels) 60 | 61 | def forward(self, x): 62 | x = self._conv(x) 63 | x = self._batch_norm(x) 64 | return x 65 | 66 | -------------------------------------------------------------------------------- /utils/utils.py: -------------------------------------------------------------------------------- 1 | import os 2 | import cv2 3 | import pickle 4 | import numpy as np 5 | from paddle import fluid 6 | 7 | 8 | def check_folder(log_dir): 9 | if not os.path.exists(log_dir): 10 | os.makedirs(log_dir) 11 | return log_dir 12 | 13 | 14 | def save_model(state_dicts, file_name): 15 | def convert(state_dict): 16 | model_dict = {} 17 | 18 | for k, v in state_dict.items(): 19 | if isinstance( 20 | v, (fluid.framework.Variable, fluid.core.VarBase)): 21 | model_dict[k] = v.numpy() 22 | else: 23 | model_dict[k] = v 24 | 25 | return model_dict 26 | 27 | final_dict = {} 28 | for k, v in state_dicts.items(): 29 | if isinstance(v, 30 | (fluid.framework.Variable, fluid.core.VarBase)): 31 | final_dict = convert(state_dicts) 32 | break 33 | elif isinstance(v, dict): 34 | final_dict[k] = convert(v) 35 | else: 36 | final_dict[k] = v 37 | 38 | with open(file_name, 'wb') as f: 39 | pickle.dump(final_dict, f, protocol=2) 40 | 41 | 42 | def load_test_data(image_path, size=256): 43 | img = cv2.imread(image_path, cv2.IMREAD_UNCHANGED) 44 | if img is None: 45 | return None 46 | 47 | h, w, c = img.shape 48 | if img.shape[2] == 4: 49 | white = np.ones((h, w, 3), np.uint8) * 255 50 | img_rgb = img[:, :, :3].copy() 51 | mask = img[:, :, 3].copy() 52 | mask = (mask / 255).astype(np.uint8) 53 | img = (img_rgb * mask[:, :, np.newaxis]).astype(np.uint8) + white * (1 - mask[:, :, np.newaxis]) 54 | 55 | img = cv2.resize(img, (size, size), cv2.INTER_AREA) 56 | img = RGB2BGR(img) 57 | 58 | img = np.expand_dims(img, axis=0) 59 | img = preprocessing(img) 60 | return img 61 | 62 | 63 | def preprocessing(x): 64 | x = x / 127.5 - 1 65 | return x 66 | 67 | 68 | def merge(images, size): 69 | h, w = images.shape[1], images.shape[2] 70 | img = np.zeros((h * size[0], w * size[1], 3)) 71 | for idx, image in enumerate(images): 72 | i = idx % size[1] 73 | j = idx // size[1] 74 | img[h*j:h*(j+1), w*i:w*(i+1), :] = image 75 | 76 | return img 77 | 78 | 79 | def cam(x, size=256): 80 | x = x - np.min(x) 81 | cam_img = x / np.max(x) 82 | cam_img = np.uint8(255 * cam_img) 83 | cam_img = cv2.resize(cam_img, (size, size)) 84 | cam_img = cv2.applyColorMap(cam_img, cv2.COLORMAP_JET) 85 | return cam_img / 255.0 86 | 87 | 88 | def denorm(x): 89 | return x * 0.5 + 0.5 90 | 91 | 92 | def tensor2numpy(x): 93 | return x.numpy().transpose(1, 2, 0) 94 | 95 | 96 | def RGB2BGR(x): 97 | return cv2.cvtColor(x, cv2.COLOR_RGB2BGR) 98 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by .ignore support plugin (hsz.mobi) 2 | ### Python template 3 | # Byte-compiled / optimized / DLL files 4 | __pycache__/ 5 | *.py[cod] 6 | *$py.class 7 | 8 | 9 | models/photo2cartoon_weights.pdparams 10 | utils/segment/seg_model_384.pdparams 11 | .idea/ 12 | 13 | # C extensions 14 | *.so 15 | 16 | # Distribution / packaging 17 | .Python 18 | build/ 19 | develop-eggs/ 20 | dist/ 21 | downloads/ 22 | eggs/ 23 | .eggs/ 24 | lib/ 25 | lib64/ 26 | parts/ 27 | sdist/ 28 | var/ 29 | wheels/ 30 | share/python-wheels/ 31 | *.egg-info/ 32 | .installed.cfg 33 | *.egg 34 | MANIFEST 35 | 36 | # PyInstaller 37 | # Usually these files are written by a python script from a template 38 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 39 | *.manifest 40 | *.spec 41 | 42 | # Installer logs 43 | pip-log.txt 44 | pip-delete-this-directory.txt 45 | 46 | # Unit test / coverage reports 47 | htmlcov/ 48 | .tox/ 49 | .nox/ 50 | .coverage 51 | .coverage.* 52 | .cache 53 | nosetests.xml 54 | coverage.xml 55 | *.cover 56 | *.py,cover 57 | .hypothesis/ 58 | .pytest_cache/ 59 | cover/ 60 | 61 | # Translations 62 | *.mo 63 | *.pot 64 | 65 | # Django stuff: 66 | *.log 67 | local_settings.py 68 | db.sqlite3 69 | db.sqlite3-journal 70 | 71 | # Flask stuff: 72 | instance/ 73 | .webassets-cache 74 | 75 | # Scrapy stuff: 76 | .scrapy 77 | 78 | # Sphinx documentation 79 | docs/_build/ 80 | 81 | # PyBuilder 82 | .pybuilder/ 83 | target/ 84 | 85 | # Jupyter Notebook 86 | .ipynb_checkpoints 87 | 88 | # IPython 89 | profile_default/ 90 | ipython_config.py 91 | 92 | # pyenv 93 | # For a library or package, you might want to ignore these files since the code is 94 | # intended to run in multiple environments; otherwise, check them in: 95 | # .python-version 96 | 97 | # pipenv 98 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 99 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 100 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 101 | # install all needed dependencies. 102 | #Pipfile.lock 103 | 104 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 105 | __pypackages__/ 106 | 107 | # Celery stuff 108 | celerybeat-schedule 109 | celerybeat.pid 110 | 111 | # SageMath parsed files 112 | *.sage.py 113 | 114 | # Environments 115 | .env 116 | .venv 117 | env/ 118 | venv/ 119 | ENV/ 120 | env.bak/ 121 | venv.bak/ 122 | 123 | # Spyder project settings 124 | .spyderproject 125 | .spyproject 126 | 127 | # Rope project settings 128 | .ropeproject 129 | 130 | # mkdocs documentation 131 | /site 132 | 133 | # mypy 134 | .mypy_cache/ 135 | .dmypy.json 136 | dmypy.json 137 | 138 | # Pyre type checker 139 | .pyre/ 140 | 141 | # pytype static type analyzer 142 | .pytype/ 143 | 144 | # Cython debug symbols 145 | cython_debug/ 146 | 147 | -------------------------------------------------------------------------------- /utils/face_detect.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | import math 3 | import numpy as np 4 | import face_alignment 5 | 6 | 7 | class FaceDetect: 8 | def __init__(self, device, detector): 9 | # landmarks will be detected by face_alignment library. Set device = 'cuda' if use GPU. 10 | self.fa = face_alignment.FaceAlignment(face_alignment.LandmarksType._2D, device=device, face_detector=detector) 11 | 12 | def align(self, image): 13 | landmarks = self.__get_max_face_landmarks(image) 14 | 15 | if landmarks is None: 16 | return None 17 | 18 | else: 19 | return self.__rotate(image, landmarks) 20 | 21 | def __get_max_face_landmarks(self, image): 22 | preds = self.fa.get_landmarks(image) 23 | if preds is None: 24 | return None 25 | 26 | elif len(preds) == 1: 27 | return preds[0] 28 | 29 | else: 30 | # find max face 31 | areas = [] 32 | for pred in preds: 33 | landmarks_top = np.min(pred[:, 1]) 34 | landmarks_bottom = np.max(pred[:, 1]) 35 | landmarks_left = np.min(pred[:, 0]) 36 | landmarks_right = np.max(pred[:, 0]) 37 | areas.append((landmarks_bottom - landmarks_top) * (landmarks_right - landmarks_left)) 38 | max_face_index = np.argmax(areas) 39 | return preds[max_face_index] 40 | 41 | @staticmethod 42 | def __rotate(image, landmarks): 43 | # rotation angle 44 | left_eye_corner = landmarks[36] 45 | right_eye_corner = landmarks[45] 46 | radian = np.arctan((left_eye_corner[1] - right_eye_corner[1]) / (left_eye_corner[0] - right_eye_corner[0])) 47 | 48 | # image size after rotating 49 | height, width, _ = image.shape 50 | cos = math.cos(radian) 51 | sin = math.sin(radian) 52 | new_w = int(width * abs(cos) + height * abs(sin)) 53 | new_h = int(width * abs(sin) + height * abs(cos)) 54 | 55 | # translation 56 | Tx = new_w // 2 - width // 2 57 | Ty = new_h // 2 - height // 2 58 | 59 | # affine matrix 60 | M = np.array([[cos, sin, (1 - cos) * width / 2. - sin * height / 2. + Tx], 61 | [-sin, cos, sin * width / 2. + (1 - cos) * height / 2. + Ty]]) 62 | 63 | image_rotate = cv2.warpAffine(image, M, (new_w, new_h), borderValue=(255, 255, 255)) 64 | 65 | landmarks = np.concatenate([landmarks, np.ones((landmarks.shape[0], 1))], axis=1) 66 | landmarks_rotate = np.dot(M, landmarks.T).T 67 | return image_rotate, landmarks_rotate 68 | 69 | 70 | if __name__ == '__main__': 71 | img = cv2.cvtColor(cv2.imread('3989161_1.jpg'), cv2.COLOR_BGR2RGB) 72 | fd = FaceDetect(device='cpu') 73 | face_info = fd.align(img) 74 | if face_info is not None: 75 | image_align, landmarks_align = face_info 76 | 77 | for i in range(landmarks_align.shape[0]): 78 | cv2.circle(image_align, (int(landmarks_align[i][0]), int(landmarks_align[i][1])), 2, (255, 0, 0), -1) 79 | 80 | cv2.imwrite('image_align.png', cv2.cvtColor(image_align, cv2.COLOR_RGB2BGR)) 81 | -------------------------------------------------------------------------------- /utils/segment/fcn.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | import paddle.nn as nn 16 | import paddle.nn.functional as F 17 | 18 | from .layers import ConvBNReLU 19 | 20 | 21 | class FCN(nn.Layer): 22 | """ 23 | A simple implementation for FCN based on PaddlePaddle. 24 | 25 | The original article refers to 26 | Evan Shelhamer, et, al. "Fully Convolutional Networks for Semantic Segmentation" 27 | (https://arxiv.org/abs/1411.4038). 28 | 29 | Args: 30 | num_classes (int): The unique number of target classes. 31 | backbone (paddle.nn.Layer): Backbone networks. 32 | backbone_indices (tuple, optional): The values in the tuple indicate the indices of output of backbone. 33 | Default: (-1, ). 34 | channels (int, optional): The channels between conv layer and the last layer of FCNHead. 35 | If None, it will be the number of channels of input features. Default: None. 36 | align_corners (bool): An argument of F.interpolate. It should be set to False when the output size of feature 37 | is even, e.g. 1024x512, otherwise it is True, e.g. 769x769. Default: False. 38 | pretrained (str, optional): The path or url of pretrained model. Default: None 39 | """ 40 | 41 | def __init__(self, 42 | num_classes, 43 | backbone, 44 | backbone_indices=(-1, ), 45 | channels=None, 46 | align_corners=False, 47 | pretrained=None): 48 | super(FCN, self).__init__() 49 | 50 | self.backbone = backbone 51 | backbone_channels = [ 52 | backbone.feat_channels[i] for i in backbone_indices 53 | ] 54 | 55 | self.head = FCNHead(num_classes, backbone_indices, backbone_channels, 56 | channels) 57 | 58 | self.align_corners = align_corners 59 | self.pretrained = pretrained 60 | 61 | def forward(self, x): 62 | feat_list = self.backbone(x) 63 | logit_list = self.head(feat_list) 64 | return [ 65 | F.interpolate( 66 | logit, 67 | x.shape[2:], 68 | mode='bilinear', 69 | align_corners=self.align_corners) for logit in logit_list 70 | ] 71 | 72 | 73 | class FCNHead(nn.Layer): 74 | """ 75 | A simple implementation for FCNHead based on PaddlePaddle 76 | 77 | Args: 78 | num_classes (int): The unique number of target classes. 79 | backbone_indices (tuple, optional): The values in the tuple indicate the indices of output of backbone. 80 | Default: (-1, ). 81 | channels (int, optional): The channels between conv layer and the last layer of FCNHead. 82 | If None, it will be the number of channels of input features. Default: None. 83 | pretrained (str, optional): The path of pretrained model. Default: None 84 | """ 85 | 86 | def __init__(self, 87 | num_classes, 88 | backbone_indices=(-1, ), 89 | backbone_channels=(270, ), 90 | channels=None): 91 | super(FCNHead, self).__init__() 92 | 93 | self.num_classes = num_classes 94 | self.backbone_indices = backbone_indices 95 | if channels is None: 96 | channels = backbone_channels[0] 97 | 98 | self.conv_1 = ConvBNReLU( 99 | in_channels=backbone_channels[0], 100 | out_channels=channels, 101 | kernel_size=1, 102 | padding='same', 103 | stride=1) 104 | self.cls = nn.Conv2D( 105 | in_channels=channels, 106 | out_channels=self.num_classes, 107 | kernel_size=1, 108 | stride=1, 109 | padding=0) 110 | 111 | def forward(self, feat_list): 112 | logit_list = [] 113 | x = feat_list[self.backbone_indices[0]] 114 | x = self.conv_1(x) 115 | logit = self.cls(x) 116 | logit_list.append(logit) 117 | return logit_list 118 | 119 | -------------------------------------------------------------------------------- /test.py: -------------------------------------------------------------------------------- 1 | import os 2 | import cv2 3 | import paddle 4 | import numpy as np 5 | from models import ResnetGenerator 6 | import argparse 7 | from utils import Preprocess 8 | 9 | parser = argparse.ArgumentParser() 10 | parser.add_argument('--photo_path', type=str, help='input photo path') 11 | parser.add_argument('--save_path', type=str, help='cartoon save path') 12 | args = parser.parse_args() 13 | 14 | 15 | # os.makedirs(os.path.dirname(args.save_path), exist_ok=True) 16 | 17 | class Photo2Cartoon: 18 | def __init__(self): 19 | self.pre = Preprocess() 20 | self.net = ResnetGenerator(ngf=32, img_size=256, light=True) 21 | 22 | assert os.path.exists( 23 | './models/photo2cartoon_weights.pdparams'), "[Step1: load weights] Can not find 'photo2cartoon_weights.pt' in folder 'models!!!'" 24 | params = paddle.load('./models/photo2cartoon_weights.pdparams') 25 | self.net.set_state_dict(params['genA2B']) 26 | print('[Step1: load weights] success!') 27 | 28 | def inference(self, img): 29 | # face alignment and segmentation 30 | face_rgba = self.pre.process(img) 31 | if face_rgba is None: 32 | print('[Step2: face detect] can not detect face!!!') 33 | return None 34 | 35 | print('[Step2: face detect] success!') 36 | face_rgba = cv2.resize(face_rgba, (256, 256), interpolation=cv2.INTER_AREA) 37 | face = face_rgba[:, :, :3].copy() 38 | mask = face_rgba[:, :, 3][:, :, np.newaxis].copy() / 255. 39 | face = (face * mask + (1 - mask) * 255) / 127.5 - 1 40 | 41 | face = np.transpose(face[np.newaxis, :, :, :], (0, 3, 1, 2)).astype(np.float32) 42 | face = paddle.to_tensor(face) 43 | 44 | # inference 45 | with paddle.no_grad(): 46 | cartoon = self.net(face)[0][0] 47 | 48 | # post-process 49 | cartoon = np.transpose(cartoon.numpy(), (1, 2, 0)) 50 | cartoon = (cartoon + 1) * 127.5 51 | cartoon = (cartoon * mask + 255 * (1 - mask)).astype(np.uint8) 52 | cartoon = cv2.cvtColor(cartoon, cv2.COLOR_RGB2BGR) 53 | print('[Step3: photo to cartoon] success!') 54 | return cartoon 55 | 56 | 57 | def transform_video_to_image(video_file_path, img_path): 58 | ''' 59 | 将视频中每一帧保存成图片 60 | ''' 61 | video_capture = cv2.VideoCapture(video_file_path) 62 | fps = video_capture.get(cv2.CAP_PROP_FPS) 63 | count = 0 64 | while (True): 65 | ret, frame = video_capture.read() 66 | if ret: 67 | cv2.imwrite(img_path + '%d.jpg' % count, frame) 68 | count += 1 69 | else: 70 | break 71 | video_capture.release() 72 | print('视频图片保存成功, 共有 %d 张' % count) 73 | return fps 74 | 75 | 76 | def analysis_pose(input_frame_path, output_frame_path, is_print=True): 77 | ''' 78 | 分析图片中的人体姿势, 并转换为皮影姿势,输出结果 79 | ''' 80 | file_items = os.listdir(input_frame_path) 81 | file_len = len(file_items) 82 | file_items.sort() 83 | for i in range(file_len): 84 | if is_print: 85 | print(i + 1, '/', file_len, ' ', os.path.join(output_frame_path, str(i) + '.jpg')) 86 | try: 87 | img = cv2.cvtColor(cv2.imread(os.path.join(input_frame_path, str(1) + '.jpg')), cv2.COLOR_BGR2RGB) 88 | c2p = Photo2Cartoon() 89 | cartoon = c2p.inference(img) 90 | if cartoon is not None: 91 | cv2.imwrite(os.path.join(output_frame_path, str(i) + '.jpg'), cartoon) 92 | except: 93 | continue 94 | 95 | 96 | def combine_image_to_video(comb_path, output_file_path, fps=30, is_print=False): 97 | ''' 98 | 合并图像到视频 99 | ''' 100 | fourcc = cv2.VideoWriter_fourcc(*'MP4V') 101 | 102 | file_items = os.listdir(comb_path) 103 | file_len = len(file_items) 104 | # print(comb_path, file_items) 105 | if file_len > 0: 106 | temp_img = cv2.imread(os.path.join(comb_path, file_items[0])) 107 | img_height, img_width = temp_img.shape[0], temp_img.shape[1] 108 | 109 | out = cv2.VideoWriter(output_file_path, fourcc, fps, (img_width, img_height)) 110 | 111 | for i in range(file_len): 112 | pic_name = os.path.join(comb_path, str(i) + ".jpg") 113 | if is_print: 114 | print(i + 1, '/', file_len, ' ', pic_name) 115 | img = cv2.imread(pic_name) 116 | out.write(img) 117 | out.release() 118 | 119 | 120 | if __name__ == '__main__': 121 | # 第一步:把视频切帧 122 | # fps = transform_video_to_image('./face_mp4/face2.mp4', './face_img/') 123 | # analysis_pose('./face_img/', './face_img_gan/', is_print=True) 124 | combine_image_to_video('./face_img_gan/', './face.mp4', 30) 125 | -------------------------------------------------------------------------------- /models/sn.py: -------------------------------------------------------------------------------- 1 | import math 2 | import numpy as np 3 | 4 | import paddle 5 | import paddle.nn as nn 6 | import paddle.nn.functional as F 7 | 8 | 9 | def normal_(x, mean=0., std=1.): 10 | temp_value = paddle.normal(mean, std, shape=x.shape) 11 | x.set_value(temp_value) 12 | return x 13 | 14 | 15 | class SpectralNorm(object): 16 | def __init__(self, name='weight', n_power_iterations=1, dim=0, eps=1e-12): 17 | self.name = name 18 | self.dim = dim 19 | if n_power_iterations <= 0: 20 | raise ValueError( 21 | 'Expected n_power_iterations to be positive, but ' 22 | 'got n_power_iterations={}'.format(n_power_iterations)) 23 | self.n_power_iterations = n_power_iterations 24 | self.eps = eps 25 | 26 | def reshape_weight_to_matrix(self, weight): 27 | weight_mat = weight 28 | if self.dim != 0: 29 | # transpose dim to front 30 | weight_mat = weight_mat.transpose([ 31 | self.dim, 32 | *[d for d in range(weight_mat.dim()) if d != self.dim] 33 | ]) 34 | 35 | height = weight_mat.shape[0] 36 | 37 | return weight_mat.reshape([height, -1]) 38 | 39 | def compute_weight(self, layer, do_power_iteration): 40 | weight = getattr(layer, self.name + '_orig') 41 | u = getattr(layer, self.name + '_u') 42 | v = getattr(layer, self.name + '_v') 43 | weight_mat = self.reshape_weight_to_matrix(weight) 44 | 45 | if do_power_iteration: 46 | with paddle.no_grad(): 47 | for _ in range(self.n_power_iterations): 48 | v.set_value( 49 | F.normalize( 50 | paddle.matmul(weight_mat, 51 | u, 52 | transpose_x=True, 53 | transpose_y=False), 54 | axis=0, 55 | epsilon=self.eps, 56 | )) 57 | 58 | u.set_value( 59 | F.normalize( 60 | paddle.matmul(weight_mat, v), 61 | axis=0, 62 | epsilon=self.eps, 63 | )) 64 | if self.n_power_iterations > 0: 65 | u = u.clone() 66 | v = v.clone() 67 | 68 | sigma = paddle.dot(u, paddle.mv(weight_mat, v)) 69 | weight = weight / sigma 70 | return weight 71 | 72 | def remove(self, layer): 73 | with paddle.no_grad(): 74 | weight = self.compute_weight(layer, do_power_iteration=False) 75 | delattr(layer, self.name) 76 | delattr(layer, self.name + '_u') 77 | delattr(layer, self.name + '_v') 78 | delattr(layer, self.name + '_orig') 79 | 80 | layer.add_parameter(self.name, weight.detach()) 81 | 82 | def __call__(self, layer, inputs): 83 | setattr(layer, self.name, 84 | self.compute_weight(layer, do_power_iteration=layer.training)) 85 | 86 | @staticmethod 87 | def apply(layer, name, n_power_iterations, dim, eps): 88 | for k, hook in layer._forward_pre_hooks.items(): 89 | if isinstance(hook, SpectralNorm) and hook.name == name: 90 | raise RuntimeError("Cannot register two spectral_norm hooks on " 91 | "the same parameter {}".format(name)) 92 | 93 | fn = SpectralNorm(name, n_power_iterations, dim, eps) 94 | weight = layer._parameters[name] 95 | 96 | with paddle.no_grad(): 97 | weight_mat = fn.reshape_weight_to_matrix(weight) 98 | h, w = weight_mat.shape 99 | 100 | # randomly initialize u and v 101 | u = layer.create_parameter([h]) 102 | u = normal_(u, 0., 1.) 103 | v = layer.create_parameter([w]) 104 | v = normal_(v, 0., 1.) 105 | u = F.normalize(u, axis=0, epsilon=fn.eps) 106 | v = F.normalize(v, axis=0, epsilon=fn.eps) 107 | 108 | # delete fn.name form parameters, otherwise you can not set attribute 109 | del layer._parameters[fn.name] 110 | layer.add_parameter(fn.name + "_orig", weight) 111 | # still need to assign weight back as fn.name because all sorts of 112 | # things may assume that it exists, e.g., when initializing weights. 113 | # However, we can't directly assign as it could be an Parameter and 114 | # gets added as a parameter. Instead, we register weight * 1.0 as a plain 115 | # attribute. 116 | setattr(layer, fn.name, weight * 1.0) 117 | layer.register_buffer(fn.name + "_u", u) 118 | layer.register_buffer(fn.name + "_v", v) 119 | 120 | layer.register_forward_pre_hook(fn) 121 | return fn 122 | 123 | 124 | def spectral_norm(layer, 125 | name='weight', 126 | n_power_iterations=1, 127 | eps=1e-12, 128 | dim=None): 129 | 130 | if dim is None: 131 | if isinstance(layer, (nn.Conv1DTranspose, nn.Conv2DTranspose, 132 | nn.Conv3DTranspose, nn.Linear)): 133 | dim = 1 134 | else: 135 | dim = 0 136 | SpectralNorm.apply(layer, name, n_power_iterations, dim, eps) 137 | return layer 138 | -------------------------------------------------------------------------------- /demo.py: -------------------------------------------------------------------------------- 1 | from utils_.utils import body_img_path_map, paste, img_pipline, circle, combine_image_to_video, transform_video_to_image 2 | import paddlehub as hub 3 | import matplotlib.pyplot as plt 4 | import cv2 5 | import numpy as np 6 | from PIL import Image 7 | import os 8 | 9 | pose_estimation = hub.Module(name="human_pose_estimation_resnet50_mpii") 10 | 11 | 12 | def pipline(pose_img_path): 13 | result = pose_estimation.keypoint_detection(paths=[pose_img_path]) 14 | img_flag = Image.open(body_img_path_map['background']).convert('RGBA') 15 | proportion_shoulder = (1050 - 60) / (result[0]['data']['left_shoulder'][0] - result[0]['data']['right_shoulder'][0]) 16 | 17 | # read 18 | # body_img = Image.open(body_img_path_map['body']).convert('RGBA') 19 | # body_img = body_img.resize( 20 | # (int(body_img.size[0] / proportion_shoulder), int(body_img.size[1] / proportion_shoulder))) 21 | # helmet_rear_img = Image.open(body_img_path_map['helmet_rear']).convert('RGBA') 22 | # helmet_rear_img = helmet_rear_img.resize( 23 | # (int(helmet_rear_img.size[0] / proportion_shoulder), int(helmet_rear_img.size[1] / proportion_shoulder))) 24 | # helmet_front_img = Image.open(body_img_path_map['helmet_front']).convert('RGBA') 25 | # helmet_front_img = helmet_front_img.resize( 26 | # (int(helmet_front_img.size[0] / proportion_shoulder), int(helmet_front_img.size[1] / proportion_shoulder))) 27 | # bag = Image.open(body_img_path_map['bag']).convert('RGBA') 28 | # bag = bag.resize( 29 | # (int(bag.size[0] / proportion_shoulder), int(bag.size[1] / proportion_shoulder))) 30 | # face_img = circle(body_img_path_map['face'], int(helmet_front_img.size[1])) 31 | 32 | # location 33 | # body_x = int( 34 | # (result[0]['data']['left_shoulder'][0] + result[0]['data']['ç'][0]) / 2 - (body_img.size[0] / 2)) 35 | # body_y = int(result[0]['data']['left_shoulder'][1] - 550 / 1144 * body_img.size[1]) 36 | # 37 | # helmet_x = int((result[0]['data']['left_shoulder'][0] + result[0]['data']['right_shoulder'][0]) / 2 - ( 38 | # helmet_front_img.size[0] / 2)) 39 | # helmet_y = int(result[0]['data']['left_shoulder'][1] - 1.2 * helmet_front_img.size[1]) 40 | # 41 | # face_x = int((result[0]['data']['left_shoulder'][0] + result[0]['data']['right_shoulder'][0]) / 2 - ( 42 | # face_img.size[0] / 2)) 43 | # face_y = int(result[0]['data']['left_shoulder'][1] - 1.23 * face_img.size[1]) 44 | # 45 | 46 | # test 47 | # head 48 | img_flag = img_pipline(body_img_path_map['left_elbow'], img_flag, result[0]['data']['left_shoulder'], 49 | result[0]['data']['left_elbow'], key_y_proportion=1 / 4, 50 | img_proportion=proportion_shoulder) 51 | img_flag = img_pipline(body_img_path_map['right_elbow'], img_flag, result[0]['data']['right_shoulder'], 52 | result[0]['data']['right_elbow'], key_y_proportion=1 / 3, 53 | img_proportion=proportion_shoulder) 54 | img_flag = img_pipline(body_img_path_map['body'], img_flag, result[0]['data']['upper_neck'], 55 | result[0]['data']['pelvis'], key_y_proportion=1 / 3, 56 | img_proportion=proportion_shoulder) 57 | img_flag = img_pipline(body_img_path_map['helmet_rear'], img_flag, result[0]['data']['head_top'], 58 | result[0]['data']['upper_neck'], key_y_proportion=1 / 2, 59 | img_proportion=proportion_shoulder) 60 | 61 | img_flag = img_pipline(body_img_path_map['face'], img_flag, result[0]['data']['head_top'], 62 | result[0]['data']['upper_neck'], key_y_proportion=12 / 20, 63 | img_proportion=proportion_shoulder) 64 | img_flag = img_pipline(body_img_path_map['helmet_front'], img_flag, result[0]['data']['head_top'], 65 | result[0]['data']['upper_neck'], key_y_proportion=1 / 2, 66 | img_proportion=proportion_shoulder) 67 | 68 | # img_flag = paste(bag, img_flag, body_x-13, body_y-30) 69 | 70 | # img_flag = paste(body_img, img_flag, body_x, body_y) 71 | # img_flag = paste(helmet_rear_img, img_flag, helmet_x, helmet_y) 72 | # img_flag = paste(face_img, img_flag, face_x, face_y) 73 | # img_flag = paste(helmet_front_img, img_flag, helmet_x, helmet_y) 74 | 75 | img_flag = img_pipline(body_img_path_map['left_wrist'], img_flag, result[0]['data']['left_elbow'], 76 | result[0]['data']['left_wrist'], key_y_proportion=150 / 1139, 77 | img_proportion=proportion_shoulder) 78 | img_flag = img_pipline(body_img_path_map['right_wrist'], img_flag, result[0]['data']['right_elbow'], 79 | result[0]['data']['right_wrist'], key_y_proportion=150 / 1139, 80 | img_proportion=proportion_shoulder) 81 | 82 | ticket = Image.open(body_img_path_map['ticket']).convert("RGBA") 83 | img_flag = paste(ticket, img_flag, 0, 0) 84 | return img_flag 85 | 86 | 87 | def analysis_pose(input_frame_path, output_frame_path, is_print=True): 88 | ''' 89 | 分析图片中的人体姿势, 并转换为皮影姿势,输出结果 90 | ''' 91 | file_items = os.listdir(input_frame_path) 92 | file_len = len(file_items) 93 | file_items.sort() 94 | for i in range(file_len): 95 | if is_print: 96 | print(i + 1, '/', file_len, ' ', os.path.join(output_frame_path, str(i) + '.jpg')) 97 | try: 98 | combine_img = pipline(os.path.join(input_frame_path, str(i) + '.jpg')) 99 | combine_img.save(os.path.join(output_frame_path, str(i) + '.png')) 100 | except: 101 | continue 102 | 103 | 104 | if __name__ == '__main__': 105 | # 第一步:把视频切帧 106 | # fps = transform_video_to_image('./mp4/demo_1.mp4', './mp4_img/') 107 | # 第二步:每一帧都生成一张船票 108 | # analysis_pose('./mp4_img', './out_put', is_print=True) 109 | # 第三步:做成视频: 110 | # combine_image_to_video('./out_put', './out.mp4', 30) 111 | 112 | # output one pic 113 | img = pipline('./mp4_img/17.jpg') 114 | print(img.size) 115 | img.save('./one_ticket/one.png') 116 | img.show() 117 | -------------------------------------------------------------------------------- /utils_/utils.py: -------------------------------------------------------------------------------- 1 | import os 2 | import cv2 3 | import paddlehub as hub 4 | import matplotlib.pyplot as plt 5 | from matplotlib.image import imread 6 | import numpy as np 7 | import paddlehub as hub 8 | from PIL import Image 9 | 10 | pose_estimation = hub.Module(name="human_pose_estimation_resnet50_mpii") 11 | 12 | 13 | def transform_video_to_image(video_file_path, img_path): 14 | ''' 15 | 将视频中每一帧保存成图片 16 | ''' 17 | video_capture = cv2.VideoCapture(video_file_path) 18 | fps = video_capture.get(cv2.CAP_PROP_FPS) 19 | count = 0 20 | while (True): 21 | ret, frame = video_capture.read() 22 | if ret: 23 | frame = cv2.resize(frame, (1729, 1153)) 24 | cv2.imwrite(img_path + '%d.jpg' % count, frame) 25 | count += 1 26 | else: 27 | break 28 | video_capture.release() 29 | print('视频图片保存成功, 共有 %d 张' % count) 30 | return fps 31 | 32 | 33 | def combine_image_to_video(comb_path, output_file_path, fps=30, is_print=False): 34 | ''' 35 | 合并图像到视频 36 | ''' 37 | fourcc = cv2.VideoWriter_fourcc(*'MP4V') 38 | 39 | file_items = os.listdir(comb_path) 40 | file_len = len(file_items) 41 | # print(comb_path, file_items) 42 | if file_len > 0: 43 | temp_img = cv2.imread(os.path.join(comb_path, file_items[0])) 44 | img_height, img_width = temp_img.shape[0], temp_img.shape[1] 45 | 46 | out = cv2.VideoWriter(output_file_path, fourcc, fps, (img_width, img_height)) 47 | 48 | for i in range(file_len): 49 | pic_name = os.path.join(comb_path, str(i) + ".png") 50 | if is_print: 51 | print(i + 1, '/', file_len, ' ', pic_name) 52 | img = cv2.imread(pic_name) 53 | out.write(img) 54 | out.release() 55 | 56 | 57 | def get_true_angel(value): 58 | ''' 59 | 转转得到角度值 60 | ''' 61 | return value / np.pi * 180 62 | 63 | 64 | def get_angle(x1, y1, x2, y2): 65 | ''' 66 | 计算旋转角度 67 | ''' 68 | dx = abs(x1 - x2) 69 | dy = abs(y1 - y2) 70 | result_angele = 0 71 | if x1 == x2: 72 | if y1 > y2: 73 | result_angele = 180 74 | else: 75 | if y1 != y2: 76 | the_angle = int(get_true_angel(np.arctan(dx / dy))) 77 | if x1 < x2: 78 | if y1 > y2: 79 | result_angele = -(180 - the_angle) 80 | elif y1 < y2: 81 | result_angele = -the_angle 82 | elif y1 == y2: 83 | result_angele = -90 84 | elif x1 > x2: 85 | if y1 > y2: 86 | result_angele = 180 - the_angle 87 | elif y1 < y2: 88 | result_angele = the_angle 89 | elif y1 == y2: 90 | result_angele = 90 91 | 92 | if result_angele < 0: 93 | result_angele = 360 + result_angele 94 | return result_angele 95 | 96 | 97 | def rotate_bound(image, angle, key_point_y): 98 | ''' 99 | 旋转图像,并取得关节点偏移量 100 | ''' 101 | # 转成np 102 | image = np.asarray(image) 103 | # 获取图像的尺寸 104 | (h, w) = image.shape[:2] 105 | # 旋转中心 106 | (cx, cy) = (w / 2, h / 2) 107 | # 关键点必须在中心的y轴上 108 | (kx, ky) = cx, key_point_y 109 | d = abs(ky - cy) 110 | 111 | # 设置旋转矩阵 112 | M = cv2.getRotationMatrix2D((cx, cy), -angle, 1.0) 113 | cos = np.abs(M[0, 0]) 114 | sin = np.abs(M[0, 1]) 115 | 116 | # 计算图像旋转后的新边界 117 | nW = int((h * sin) + (w * cos)) 118 | nH = int((h * cos) + (w * sin)) 119 | 120 | # 计算旋转后的相对位移 121 | move_x = nW / 2 + np.sin(angle / 180 * np.pi) * d 122 | move_y = nH / 2 - np.cos(angle / 180 * np.pi) * d 123 | 124 | # 调整旋转矩阵的移动距离(t_{x}, t_{y}) 125 | M[0, 2] += (nW / 2) - cx 126 | M[1, 2] += (nH / 2) - cy 127 | 128 | image = cv2.warpAffine(image, M, (nW, nH)) 129 | # 转成image 130 | image = Image.fromarray(image) 131 | return image, int(move_x), int(move_y) 132 | 133 | 134 | def get_distences(x1, y1, x2, y2): 135 | return ((x1 - x2) ** 2 + (y1 - y2) ** 2) ** 0.5 136 | 137 | 138 | body_img_path_map = { 139 | # "right_hip" : "./work/shadow_play_material/body.jpg", 140 | # "right_knee" : "./work/shadow_play_material/head.jpg", 141 | # "left_hip" : "./work/shadow_play_material/head.jpg", 142 | # "left_knee" : "./work/shadow_play_material/body.jpg", 143 | "left_elbow": "./img/left_elbow.png", 144 | "left_wrist": "./img/left_wrist_takeoff.png", 145 | "right_elbow": "./img/right_elbow.png", 146 | "right_wrist": './img/right_wrist_takeoff.png', 147 | "head": "./img/helmet_front.png", 148 | "body": "./img/body.png", 149 | 'helmet_rear': './img/helmet_rear.png', 150 | 'helmet_front': './img/helmet_front.png', 151 | 'face': './img/face_1.jpeg', 152 | 'background': './img/ticket_bottom.png', 153 | 'bag': './img/bag.png', 154 | 'ticket': './img/ticket_up.png' 155 | } 156 | 157 | 158 | def img_pipline(img_path, img_flag, point_a, point_b, key_y_proportion, img_proportion): 159 | ''' 160 | const:原图两个点之间间距 161 | img_proportion_width:宽度的比值,自己看着来 162 | key_y_proportion:离y的比值 163 | ''' 164 | # resize: 165 | if img_path == './img/face_1.jpeg': 166 | img = circle(img_path, 782 / 3) 167 | else: 168 | img = Image.open(img_path).convert("RGBA") 169 | img = img.resize((int(img.size[0] / img_proportion), int(img.size[1] / img_proportion))) 170 | 171 | key_y = int(key_y_proportion * img.size[1]) 172 | angle = get_angle(point_a[0], point_a[1], point_b[0], point_b[1]) 173 | img_rotated, x, y = rotate_bound(img, angle=angle, key_point_y=key_y) 174 | img_flag = paste(img_rotated, img_flag, point_a[0] - x, point_a[1] - y) 175 | return img_flag 176 | 177 | 178 | def paste(img, img_flag, zero_x, zero_y): 179 | r, g, b, a = img.split() 180 | img_flag.paste(img, (zero_x, zero_y), mask=a) 181 | return img_flag 182 | 183 | 184 | def circle(img_path, resize_num): 185 | ima = Image.open(img_path).convert("RGBA") 186 | w, h = ima.size 187 | ima = ima.crop((w / 20, 0, 19 * w / 20, h * 9 / 10)).resize((int(resize_num * 0.9), int(resize_num * 0.9))) 188 | 189 | # 白色转透明度 190 | W, H = ima.size 191 | for h in range(H): 192 | for w in range(W): 193 | if ima.getpixel((w, h))[0] > 250 and ima.getpixel((w, h))[1] > 250 and ima.getpixel((w, h))[2] > 250: 194 | ima.putpixel((w, h), (255, 255, 255, 0)) 195 | # 剪裁成圆形 196 | size = ima.size 197 | r2 = min(size[0], size[1]) 198 | if size[0] != size[1]: 199 | ima = ima.resize((r2, r2), Image.ANTIALIAS) 200 | r3 = int(r2 / 2) 201 | imb = Image.new('RGBA', (r3 * 2, r3 * 2), (255, 255, 255, 0)) 202 | pima = ima.load() 203 | pimb = imb.load() 204 | r = float(r2 / 2) 205 | for i in range(r2): 206 | for j in range(r2): 207 | lx = abs(i - r) 208 | ly = abs(j - r) 209 | l = (pow(lx, 2) + pow(ly, 2)) ** 0.5 210 | if l < r3: 211 | pimb[i - (r - r3), j - (r - r3)] = pima[i, j] 212 | return imb 213 | 214 | 215 | if __name__ == "__main__": 216 | pass 217 | -------------------------------------------------------------------------------- /models/networks.py: -------------------------------------------------------------------------------- 1 | import paddle 2 | import paddle.nn as nn 3 | import paddle.nn.functional as F 4 | from .sn import spectral_norm 5 | 6 | 7 | class ResnetGenerator(nn.Layer): 8 | def __init__(self, ngf=32, img_size=256, n_blocks=4, light=True): 9 | super(ResnetGenerator, self).__init__() 10 | self.light = light 11 | self.n_blocks = n_blocks 12 | 13 | DownBlock = [] 14 | DownBlock += [ 15 | nn.Pad2D([3, 3, 3, 3], 'reflect'), 16 | nn.Conv2D(3, ngf, kernel_size=7, stride=1, bias_attr=False), 17 | nn.InstanceNorm2D(ngf, weight_attr=False, bias_attr=False), 18 | nn.ReLU() 19 | ] 20 | 21 | DownBlock += [ 22 | HourGlass(ngf, ngf), 23 | HourGlass(ngf, ngf) 24 | ] 25 | 26 | # Down-Sampling 27 | n_downsampling = 2 28 | for i in range(n_downsampling): 29 | mult = 2 ** i 30 | DownBlock += [ 31 | nn.Pad2D([1, 1, 1, 1], 'reflect'), 32 | nn.Conv2D(ngf*mult, ngf*mult*2, kernel_size=3, stride=2, bias_attr=False), 33 | nn.InstanceNorm2D(ngf*mult*2, weight_attr=False, bias_attr=False), 34 | nn.ReLU() 35 | ] 36 | 37 | # Encoder Bottleneck 38 | mult = 2 ** n_downsampling 39 | for i in range(n_blocks): 40 | setattr(self, 'EncodeBlock'+str(i+1), ResnetBlock(ngf*mult)) 41 | 42 | # Class Activation Map 43 | self.gap_fc = nn.Linear(ngf*mult, 1, bias_attr=False) 44 | self.gmp_fc = nn.Linear(ngf*mult, 1, bias_attr=False) 45 | self.conv1x1 = nn.Conv2D(ngf*mult*2, ngf*mult, kernel_size=1, stride=1) 46 | self.relu = nn.ReLU() 47 | 48 | # Gamma, Beta block 49 | FC = [] 50 | if self.light: 51 | FC += [ 52 | nn.Linear(ngf*mult, ngf*mult, bias_attr=False), 53 | nn.ReLU(), 54 | nn.Linear(ngf*mult, ngf*mult, bias_attr=False), 55 | nn.ReLU() 56 | ] 57 | 58 | else: 59 | FC += [ 60 | nn.Linear(img_size//mult*img_size//mult*ngf*mult, ngf*mult, bias_attr=False), 61 | nn.ReLU(), 62 | nn.Linear(ngf*mult, ngf*mult, bias_attr=False), 63 | nn.ReLU() 64 | ] 65 | 66 | # Decoder Bottleneck 67 | mult = 2 ** n_downsampling 68 | for i in range(n_blocks): 69 | setattr(self, 'DecodeBlock'+str(i + 1), ResnetSoftAdaLINBlock(ngf*mult)) 70 | 71 | # Up-Sampling 72 | UpBlock = [] 73 | for i in range(n_downsampling): 74 | mult = 2 ** (n_downsampling - i) 75 | UpBlock += [ 76 | nn.Upsample(scale_factor=2), 77 | nn.Pad2D([1, 1, 1, 1], 'reflect'), 78 | nn.Conv2D(ngf*mult, ngf*mult//2, kernel_size=3, stride=1, bias_attr=False), 79 | LIN(ngf*mult//2), 80 | nn.ReLU() 81 | ] 82 | 83 | UpBlock += [ 84 | HourGlass(ngf, ngf), 85 | HourGlass(ngf, ngf, False) 86 | ] 87 | 88 | UpBlock += [ 89 | nn.Pad2D([3, 3, 3, 3], 'reflect'), 90 | nn.Conv2D(3, 3, kernel_size=7, stride=1, bias_attr=False), 91 | nn.Tanh() 92 | ] 93 | 94 | self.DownBlock = nn.Sequential(*DownBlock) 95 | self.FC = nn.Sequential(*FC) 96 | self.UpBlock = nn.Sequential(*UpBlock) 97 | 98 | def forward(self, x): 99 | bs = x.shape[0] 100 | 101 | x = self.DownBlock(x) 102 | 103 | content_features = [] 104 | for i in range(self.n_blocks): 105 | x = getattr(self, 'EncodeBlock'+str(i+1))(x) 106 | content_features.append(F.adaptive_avg_pool2d(x, 1).reshape([bs, -1])) 107 | 108 | gap = F.adaptive_avg_pool2d(x, 1) 109 | gap_logit = self.gap_fc(gap.reshape([bs, -1])) 110 | gap_weight = list(self.gap_fc.parameters())[0].transpose([1, 0]) 111 | gap = x * gap_weight.unsqueeze(2).unsqueeze(3) 112 | 113 | gmp = F.adaptive_max_pool2d(x, 1) 114 | gmp_logit = self.gmp_fc(gmp.reshape([bs, -1])) 115 | gmp_weight = list(self.gmp_fc.parameters())[0].transpose([1, 0]) 116 | gmp = x * gmp_weight.unsqueeze(2).unsqueeze(3) 117 | 118 | cam_logit = paddle.concat([gap_logit, gmp_logit], 1) 119 | x = paddle.concat([gap, gmp], 1) 120 | x = self.relu(self.conv1x1(x)) 121 | 122 | heatmap = paddle.sum(x, axis=1, keepdim=True) 123 | 124 | if self.light: 125 | x_ = F.adaptive_avg_pool2d(x, 1) 126 | style_features = self.FC(x_.reshape([bs, -1])) 127 | else: 128 | style_features = self.FC(x.reshape([bs, -1])) 129 | 130 | for i in range(self.n_blocks): 131 | x = getattr(self, 'DecodeBlock'+str(i+1))(x, content_features[4-i-1], style_features) 132 | 133 | out = self.UpBlock(x) 134 | 135 | return out, cam_logit, heatmap 136 | 137 | 138 | class ConvBlock(nn.Layer): 139 | def __init__(self, dim_in, dim_out): 140 | super(ConvBlock, self).__init__() 141 | self.dim_in = dim_in 142 | self.dim_out = dim_out 143 | 144 | self.conv_block1 = self.__convblock(dim_in, dim_out//2) 145 | self.conv_block2 = self.__convblock(dim_out//2, dim_out//4) 146 | self.conv_block3 = self.__convblock(dim_out//4, dim_out//4) 147 | 148 | if self.dim_in != self.dim_out: 149 | self.conv_skip = nn.Sequential( 150 | nn.InstanceNorm2D(dim_in, weight_attr=False, bias_attr=False), 151 | nn.ReLU(), 152 | nn.Conv2D(dim_in, dim_out, kernel_size=1, stride=1, bias_attr=False) 153 | ) 154 | 155 | @staticmethod 156 | def __convblock(dim_in, dim_out): 157 | return nn.Sequential( 158 | nn.InstanceNorm2D(dim_in, weight_attr=False, bias_attr=False), 159 | nn.ReLU(), 160 | nn.Pad2D([1, 1, 1, 1], 'reflect'), 161 | nn.Conv2D(dim_in, dim_out, kernel_size=3, stride=1, bias_attr=False) 162 | ) 163 | 164 | def forward(self, x): 165 | residual = x 166 | 167 | x1 = self.conv_block1(x) 168 | x2 = self.conv_block2(x1) 169 | x3 = self.conv_block3(x2) 170 | out = paddle.concat([x1, x2, x3], 1) 171 | 172 | if self.dim_in != self.dim_out: 173 | residual = self.conv_skip(residual) 174 | 175 | return residual + out 176 | 177 | 178 | class HourGlassBlock(nn.Layer): 179 | def __init__(self, dim_in): 180 | super(HourGlassBlock, self).__init__() 181 | 182 | self.n_skip = 4 183 | self.n_block = 9 184 | 185 | for i in range(self.n_skip): 186 | setattr(self, 'ConvBlockskip'+str(i+1), ConvBlock(dim_in, dim_in)) 187 | 188 | for i in range(self.n_block): 189 | setattr(self, 'ConvBlock'+str(i+1), ConvBlock(dim_in, dim_in)) 190 | 191 | def forward(self, x): 192 | skips = [] 193 | for i in range(self.n_skip): 194 | skips.append(getattr(self, 'ConvBlockskip'+str(i+1))(x)) 195 | x = F.avg_pool2d(x, 2) 196 | x = getattr(self, 'ConvBlock'+str(i+1))(x) 197 | 198 | x = self.ConvBlock5(x) 199 | 200 | for i in range(self.n_skip): 201 | x = getattr(self, 'ConvBlock'+str(i+6))(x) 202 | x = F.upsample(x, scale_factor=2) 203 | x = skips[self.n_skip-i-1] + x 204 | 205 | return x 206 | 207 | 208 | class HourGlass(nn.Layer): 209 | def __init__(self, dim_in, dim_out, use_res=True): 210 | super(HourGlass, self).__init__() 211 | self.use_res = use_res 212 | 213 | self.HG = nn.Sequential( 214 | HourGlassBlock(dim_in), 215 | ConvBlock(dim_out, dim_out), 216 | nn.Conv2D(dim_out, dim_out, kernel_size=1, stride=1, bias_attr=False), 217 | nn.InstanceNorm2D(dim_out, weight_attr=False, bias_attr=False), 218 | nn.ReLU() 219 | ) 220 | 221 | self.Conv1 = nn.Conv2D(dim_out, 3, kernel_size=1, stride=1) 222 | 223 | if self.use_res: 224 | self.Conv2 = nn.Conv2D(dim_out, dim_out, kernel_size=1, stride=1) 225 | self.Conv3 = nn.Conv2D(3, dim_out, kernel_size=1, stride=1) 226 | 227 | def forward(self, x): 228 | ll = self.HG(x) 229 | tmp_out = self.Conv1(ll) 230 | 231 | if self.use_res: 232 | ll = self.Conv2(ll) 233 | tmp_out_ = self.Conv3(tmp_out) 234 | return x + ll + tmp_out_ 235 | 236 | else: 237 | return tmp_out 238 | 239 | 240 | class ResnetBlock(nn.Layer): 241 | def __init__(self, dim, use_bias=False): 242 | super(ResnetBlock, self).__init__() 243 | conv_block = [] 244 | conv_block += [ 245 | nn.Pad2D([1, 1, 1, 1], 'reflect'), 246 | nn.Conv2D(dim, dim, kernel_size=3, stride=1, bias_attr=use_bias), 247 | nn.InstanceNorm2D(dim, weight_attr=False, bias_attr=False), 248 | nn.ReLU() 249 | ] 250 | 251 | conv_block += [ 252 | nn.Pad2D([1, 1, 1, 1], 'reflect'), 253 | nn.Conv2D(dim, dim, kernel_size=3, stride=1, bias_attr=use_bias), 254 | nn.InstanceNorm2D(dim, weight_attr=False, bias_attr=False) 255 | ] 256 | 257 | self.conv_block = nn.Sequential(*conv_block) 258 | 259 | def forward(self, x): 260 | out = x + self.conv_block(x) 261 | return out 262 | 263 | 264 | class ResnetSoftAdaLINBlock(nn.Layer): 265 | def __init__(self, dim, use_bias=False): 266 | super(ResnetSoftAdaLINBlock, self).__init__() 267 | self.pad1 = nn.Pad2D([1, 1, 1, 1], 'reflect') 268 | self.conv1 = nn.Conv2D(dim, dim, kernel_size=3, stride=1, bias_attr=use_bias) 269 | self.norm1 = SoftAdaLIN(dim) 270 | self.relu1 = nn.ReLU() 271 | 272 | self.pad2 = nn.Pad2D([1, 1, 1, 1], 'reflect') 273 | self.conv2 = nn.Conv2D(dim, dim, kernel_size=3, stride=1, bias_attr=use_bias) 274 | self.norm2 = SoftAdaLIN(dim) 275 | 276 | def forward(self, x, content_features, style_features): 277 | out = self.pad1(x) 278 | out = self.conv1(out) 279 | out = self.norm1(out, content_features, style_features) 280 | out = self.relu1(out) 281 | 282 | out = self.pad2(out) 283 | out = self.conv2(out) 284 | out = self.norm2(out, content_features, style_features) 285 | return out + x 286 | 287 | 288 | class SoftAdaLIN(nn.Layer): 289 | def __init__(self, num_features, eps=1e-5): 290 | super(SoftAdaLIN, self).__init__() 291 | self.norm = AdaLIN(num_features, eps) 292 | 293 | self.w_gamma = self.create_parameter([1, num_features], default_initializer=nn.initializer.Constant(0.)) 294 | self.w_beta = self.create_parameter([1, num_features], default_initializer=nn.initializer.Constant(0.)) 295 | 296 | self.c_gamma = nn.Sequential(nn.Linear(num_features, num_features, bias_attr=False), 297 | nn.ReLU(), 298 | nn.Linear(num_features, num_features, bias_attr=False)) 299 | self.c_beta = nn.Sequential(nn.Linear(num_features, num_features, bias_attr=False), 300 | nn.ReLU(), 301 | nn.Linear(num_features, num_features, bias_attr=False)) 302 | self.s_gamma = nn.Linear(num_features, num_features, bias_attr=False) 303 | self.s_beta = nn.Linear(num_features, num_features, bias_attr=False) 304 | 305 | def forward(self, x, content_features, style_features): 306 | content_gamma, content_beta = self.c_gamma(content_features), self.c_beta(content_features) 307 | style_gamma, style_beta = self.s_gamma(style_features), self.s_beta(style_features) 308 | 309 | # w_gamma_ = nn.clip(self.w_gamma, 0, 1) 310 | # w_beta_ = nn.clip(self.w_beta, 0, 1) 311 | 312 | w_gamma_, w_beta_ = self.w_gamma.expand([x.shape[0], -1]), self.w_beta.expand([x.shape[0], -1]) 313 | soft_gamma = (1. - w_gamma_) * style_gamma + w_gamma_ * content_gamma 314 | soft_beta = (1. - w_beta_) * style_beta + w_beta_ * content_beta 315 | 316 | out = self.norm(x, soft_gamma, soft_beta) 317 | return out 318 | 319 | 320 | class AdaLIN(nn.Layer): 321 | def __init__(self, num_features, eps=1e-5): 322 | super(AdaLIN, self).__init__() 323 | self.eps = eps 324 | self.rho = self.create_parameter([1, num_features, 1, 1], default_initializer=nn.initializer.Constant(0.9)) 325 | 326 | def forward(self, x, gamma, beta): 327 | in_mean, in_var = paddle.mean(x, axis=[2, 3], keepdim=True), paddle.var(x, axis=[2, 3], keepdim=True) 328 | out_in = (x - in_mean) / paddle.sqrt(in_var + self.eps) 329 | ln_mean, ln_var = paddle.mean(x, axis=[1, 2, 3], keepdim=True), paddle.var(x, axis=[1, 2, 3], keepdim=True) 330 | out_ln = (x - ln_mean) / paddle.sqrt(ln_var + self.eps) 331 | out = self.rho.expand([x.shape[0], -1, -1, -1]) * out_in + \ 332 | (1-self.rho.expand([x.shape[0], -1, -1, -1])) * out_ln 333 | out = out * gamma.unsqueeze(2).unsqueeze(3) + beta.unsqueeze(2).unsqueeze(3) 334 | 335 | return out 336 | 337 | 338 | class LIN(nn.Layer): 339 | def __init__(self, num_features, eps=1e-5): 340 | super(LIN, self).__init__() 341 | self.eps = eps 342 | self.rho = self.create_parameter([1, num_features, 1, 1], default_initializer=nn.initializer.Constant(0.)) 343 | self.gamma = self.create_parameter([1, num_features, 1, 1], default_initializer=nn.initializer.Constant(1.)) 344 | self.beta = self.create_parameter([1, num_features, 1, 1], default_initializer=nn.initializer.Constant(0.)) 345 | 346 | def forward(self, x): 347 | in_mean, in_var = paddle.mean(x, axis=[2, 3], keepdim=True), paddle.var(x, axis=[2, 3], keepdim=True) 348 | out_in = (x - in_mean) / paddle.sqrt(in_var + self.eps) 349 | ln_mean, ln_var = paddle.mean(x, axis=[1, 2, 3], keepdim=True), paddle.var(x, axis=[1, 2, 3], keepdim=True) 350 | out_ln = (x - ln_mean) / paddle.sqrt(ln_var + self.eps) 351 | out = self.rho.expand([x.shape[0], -1, -1, -1]) * out_in + \ 352 | (1-self.rho.expand([x.shape[0], -1, -1, -1])) * out_ln 353 | out = out * self.gamma.expand([x.shape[0], -1, -1, -1]) + self.beta.expand([x.shape[0], -1, -1, -1]) 354 | 355 | return out 356 | 357 | 358 | class Discriminator(nn.Layer): 359 | def __init__(self, input_nc, ndf=64, n_layers=5): 360 | super(Discriminator, self).__init__() 361 | model = [ 362 | nn.Pad2D([1, 1, 1, 1], 'reflect'), 363 | spectral_norm(nn.Conv2D(input_nc, ndf, kernel_size=4, stride=2, bias_attr=True)), 364 | nn.LeakyReLU(0.2) 365 | ] 366 | 367 | for i in range(1, n_layers-2): 368 | mult = 2 ** (i - 1) 369 | model += [ 370 | nn.Pad2D([1, 1, 1, 1], 'reflect'), 371 | spectral_norm(nn.Conv2D(ndf*mult, ndf*mult*2, kernel_size=4, stride=2, bias_attr=True)), 372 | nn.LeakyReLU(0.2) 373 | ] 374 | 375 | mult = 2 ** (n_layers-2-1) 376 | model += [ 377 | nn.Pad2D([1, 1, 1, 1], 'reflect'), 378 | spectral_norm(nn.Conv2D(ndf*mult, ndf*mult*2, kernel_size=4, stride=1, bias_attr=True)), 379 | nn.LeakyReLU(0.2) 380 | ] 381 | 382 | # Class Activation Map 383 | mult = 2 ** (n_layers-2) 384 | self.gap_fc = spectral_norm(nn.Linear(ndf*mult, 1, bias_attr=False)) 385 | self.gmp_fc = spectral_norm(nn.Linear(ndf*mult, 1, bias_attr=False)) 386 | self.conv1x1 = nn.Conv2D(ndf*mult*2, ndf*mult, kernel_size=1, stride=1, bias_attr=True) 387 | self.leaky_relu = nn.LeakyReLU(0.2) 388 | 389 | self.pad = nn.Pad2D([1, 1, 1, 1], 'reflect') 390 | self.conv = spectral_norm(nn.Conv2D(ndf*mult, 1, kernel_size=4, stride=1, bias_attr=False)) 391 | 392 | self.model = nn.Sequential(*model) 393 | 394 | def forward(self, x): 395 | x = self.model(x) 396 | 397 | gap = F.adaptive_avg_pool2d(x, 1) 398 | gap_logit = self.gap_fc(gap.reshape([x.shape[0], -1])) 399 | gap_weight = list(self.gap_fc.parameters())[0].transpose([1, 0]) 400 | gap = x * gap_weight.unsqueeze(2).unsqueeze(3) 401 | 402 | gmp = F.adaptive_max_pool2d(x, 1) 403 | gmp_logit = self.gmp_fc(gmp.reshape([x.shape[0], -1])) 404 | gmp_weight = list(self.gmp_fc.parameters())[0].transpose([1, 0]) 405 | gmp = x * gmp_weight.unsqueeze(2).unsqueeze(3) 406 | 407 | cam_logit = paddle.concat([gap_logit, gmp_logit], 1) 408 | x = paddle.concat([gap, gmp], 1) 409 | x = self.leaky_relu(self.conv1x1(x)) 410 | 411 | heatmap = paddle.sum(x, axis=1, keepdim=True) 412 | 413 | x = self.pad(x) 414 | out = self.conv(x) 415 | 416 | return out, cam_logit, heatmap 417 | 418 | 419 | class RhoClipper(object): 420 | def __init__(self, min, max): 421 | self.clip_min = min 422 | self.clip_max = max 423 | assert min < max 424 | 425 | def __call__(self, module): 426 | if hasattr(module, 'rho'): 427 | w = module.rho 428 | w = w.clip(self.clip_min, self.clip_max) 429 | module.rho.set_value(w) 430 | 431 | 432 | class WClipper(object): 433 | def __init__(self, min, max): 434 | self.clip_min = min 435 | self.clip_max = max 436 | assert min < max 437 | 438 | def __call__(self, module): 439 | if hasattr(module, 'w_gamma'): 440 | w = module.w_gamma 441 | w = w.clip(self.clip_min, self.clip_max) 442 | module.w_gamma.set_value(w) 443 | 444 | if hasattr(module, 'w_beta'): 445 | w = module.w_beta 446 | w = w.clip(self.clip_min, self.clip_max) 447 | module.w_beta.set_value(w) 448 | 449 | 450 | if __name__ == '__main__': 451 | #d = Discriminator(3) 452 | # paddle.summary(d, (4, 3, 256, 256)) 453 | #out, cam_logit, heatmap = d(paddle.ones([4, 3, 256, 256])) 454 | #print(out.shape, cam_logit.shape, heatmap.shape) 455 | 456 | g = ResnetGenerator(ngf=32, img_size=256, light=True) 457 | out, cam_logit, heatmap = g(paddle.ones([4, 3, 256, 256])) 458 | print(out.shape, cam_logit.shape, heatmap.shape) 459 | -------------------------------------------------------------------------------- /models/UGATIT_sadalin_hourglass.py: -------------------------------------------------------------------------------- 1 | import os 2 | import cv2 3 | import time 4 | import paddle 5 | import numpy as np 6 | from glob import glob 7 | from tqdm import tqdm 8 | 9 | import paddle.nn as nn 10 | from paddle.io import DataLoader 11 | from paddle.vision.transforms import transforms as T 12 | 13 | from utils import * 14 | from .networks import ResnetGenerator, Discriminator, RhoClipper, WClipper 15 | # from dataset import ImageFolder 16 | 17 | 18 | class UgatitSadalinHourglass(object): 19 | def __init__(self, args): 20 | self.light = args.light 21 | 22 | if self.light: 23 | self.model_name = 'UGATIT_light' 24 | else: 25 | self.model_name = 'UGATIT' 26 | 27 | self.result_dir = args.result_dir 28 | self.dataset = args.dataset 29 | 30 | self.iteration = args.iteration 31 | self.decay_flag = args.decay_flag 32 | 33 | self.batch_size = args.batch_size 34 | self.print_freq = args.print_freq 35 | self.save_freq = args.save_freq 36 | 37 | self.lr = args.lr 38 | self.ch = args.ch 39 | 40 | """ Weight """ 41 | self.adv_weight = args.adv_weight 42 | self.cycle_weight = args.cycle_weight 43 | self.identity_weight = args.identity_weight 44 | self.cam_weight = args.cam_weight 45 | # self.faceid_weight = args.faceid_weight 46 | 47 | """ Discriminator """ 48 | self.n_dis = args.n_dis 49 | 50 | self.img_size = args.img_size 51 | self.img_ch = args.img_ch 52 | 53 | self.resume = args.resume 54 | self.rho_clipper = args.rho_clipper 55 | self.w_clipper = args.w_clipper 56 | self.pretrained_weights = args.pretrained_weights 57 | 58 | print("##### Information #####") 59 | print("# light : ", self.light) 60 | print("# dataset : ", self.dataset) 61 | print("# batch_size : ", self.batch_size) 62 | print("# iteration per epoch : ", self.iteration) 63 | 64 | print("##### Discriminator #####") 65 | print("# discriminator layer : ", self.n_dis) 66 | 67 | print() 68 | 69 | print("##### Weight #####") 70 | print("# adv_weight : ", self.adv_weight) 71 | print("# cycle_weight : ", self.cycle_weight) 72 | # print("# faceid_weight : ", self.faceid_weight) 73 | print("# identity_weight : ", self.identity_weight) 74 | print("# cam_weight : ", self.cam_weight) 75 | print("# rho_clipper: ", self.rho_clipper) 76 | print("# w_clipper: ", self.w_clipper) 77 | 78 | ################################################################################## 79 | # Model 80 | ################################################################################## 81 | def build_model(self): 82 | """ DataLoader """ 83 | pad = int(30 * self.img_size // 256) 84 | train_transform = T.Compose([ 85 | T.RandomHorizontalFlip(), 86 | T.Resize((self.img_size + pad, self.img_size + pad)), 87 | T.RandomCrop(self.img_size), 88 | T.ToTensor(), 89 | T.Normalize(mean=0.5, std=0.5), 90 | ]) 91 | 92 | test_transform = T.Compose([ 93 | T.Resize((self.img_size, self.img_size)), 94 | T.ToTensor(), 95 | T.Normalize(mean=0.5, std=0.5) 96 | ]) 97 | 98 | self.trainA = ImageFolder('dataset/photo2cartoon/trainA', self.img_size, train_transform) 99 | self.trainB = ImageFolder('dataset/photo2cartoon/trainB', self.img_size, train_transform) 100 | self.testA = ImageFolder('dataset/photo2cartoon/testA', self.img_size, test_transform) 101 | self.testB = ImageFolder('dataset/photo2cartoon/testB', self.img_size, test_transform) 102 | 103 | self.trainA_loader = DataLoader(self.trainA, batch_size=self.batch_size, shuffle=True) 104 | self.trainB_loader = DataLoader(self.trainB, batch_size=self.batch_size, shuffle=True) 105 | self.testA_loader = DataLoader(self.testA, batch_size=1, shuffle=False) 106 | self.testB_loader = DataLoader(self.testB, batch_size=1, shuffle=False) 107 | 108 | """ Define Generator, Discriminator """ 109 | self.genA2B = ResnetGenerator(ngf=self.ch, img_size=self.img_size, light=self.light) 110 | self.genB2A = ResnetGenerator(ngf=self.ch, img_size=self.img_size, light=self.light) 111 | self.disGA = Discriminator(input_nc=3, ndf=self.ch, n_layers=7) 112 | self.disGB = Discriminator(input_nc=3, ndf=self.ch, n_layers=7) 113 | self.disLA = Discriminator(input_nc=3, ndf=self.ch, n_layers=5) 114 | self.disLB = Discriminator(input_nc=3, ndf=self.ch, n_layers=5) 115 | 116 | """ Define Loss """ 117 | self.L1_loss = nn.loss.L1Loss() 118 | self.MSE_loss = nn.loss.MSELoss() 119 | self.BCE_loss = nn.loss.BCEWithLogitsLoss() 120 | 121 | self.G_optim = paddle.optimizer.Adam( 122 | learning_rate=self.lr, beta1=0.5, beta2=0.999, weight_decay=0.0001, 123 | parameters=self.genA2B.parameters()+self.genB2A.parameters() 124 | ) 125 | self.D_optim = paddle.optimizer.Adam( 126 | learning_rate=self.lr, beta1=0.5, beta2=0.999, weight_decay=0.0001, 127 | parameters=self.disGA.parameters()+self.disGB.parameters()+self.disLA.parameters()+self.disLB.parameters() 128 | ) 129 | 130 | self.Rho_clipper = RhoClipper(0, self.rho_clipper) 131 | self.W_clipper = WClipper(0, self.w_clipper) 132 | 133 | def train(self): 134 | self.genA2B.train(), self.genB2A.train() 135 | self.disGA.train(), self.disGB.train(), self.disLA.train(), self.disLB.train() 136 | 137 | start_iter = 1 138 | if self.resume: 139 | model_list = glob(os.path.join(self.result_dir, self.dataset, 'model', '*.pdparams')) 140 | if not len(model_list) == 0: 141 | model_list.sort() 142 | start_iter = int(model_list[-1].split('_')[-1].split('.')[0]) 143 | 144 | self.load(os.path.join(self.result_dir, self.dataset, 'model'), start_iter) 145 | print(" [*] Load successfully", start_iter) 146 | 147 | if self.decay_flag and start_iter > (self.iteration // 2): 148 | self.G_optim.set_lr(self.G_optim.get_lr() - (self.lr / (self.iteration // 2)) * ( 149 | start_iter - self.iteration // 2)) 150 | self.D_optim.set_lr(self.D_optim.get_lr() - (self.lr / (self.iteration // 2)) * ( 151 | start_iter - self.iteration // 2)) 152 | 153 | if self.pretrained_weights: 154 | params = paddle.load(self.pretrained_weights) 155 | self.genA2B.set_state_dict(params['genA2B']) 156 | self.genB2A.set_state_dict(params['genB2A']) 157 | self.disGA.set_state_dict(params['disGA']) 158 | self.disGB.set_state_dict(params['disGB']) 159 | self.disLA.set_state_dict(params['disLA']) 160 | self.disLB.set_state_dict(params['disLB']) 161 | print(" [*] Load {} successfully".format(self.pretrained_weights)) 162 | 163 | # training loop 164 | print('training start !') 165 | start_time = time.time() 166 | for step in tqdm(range(start_iter, self.iteration + 1)): 167 | if self.decay_flag and step > (self.iteration // 2): 168 | self.G_optim.set_lr(self.G_optim.get_lr() - (self.lr / (self.iteration // 2))) 169 | self.D_optim.set_lr(self.D_optim.get_lr() - (self.lr / (self.iteration // 2))) 170 | d_lr = self.D_optim.get_lr() 171 | g_lr = self.G_optim.get_lr() 172 | 173 | try: 174 | real_A, _ = next(trainA_iter) 175 | except: 176 | trainA_iter = iter(self.trainA_loader) 177 | real_A, _ = next(trainA_iter) 178 | 179 | try: 180 | real_B, _ = next(trainB_iter) 181 | except: 182 | trainB_iter = iter(self.trainB_loader) 183 | real_B, _ = next(trainB_iter) 184 | 185 | # Update D 186 | self.D_optim.clear_grad() 187 | 188 | fake_A2B, _, _ = self.genA2B(real_A) 189 | fake_B2A, _, _ = self.genB2A(real_B) 190 | 191 | real_GA_logit, real_GA_cam_logit, _ = self.disGA(real_A) 192 | real_LA_logit, real_LA_cam_logit, _ = self.disLA(real_A) 193 | real_GB_logit, real_GB_cam_logit, _ = self.disGB(real_B) 194 | real_LB_logit, real_LB_cam_logit, _ = self.disLB(real_B) 195 | 196 | fake_GA_logit, fake_GA_cam_logit, _ = self.disGA(fake_B2A) 197 | fake_LA_logit, fake_LA_cam_logit, _ = self.disLA(fake_B2A) 198 | fake_GB_logit, fake_GB_cam_logit, _ = self.disGB(fake_A2B) 199 | fake_LB_logit, fake_LB_cam_logit, _ = self.disLB(fake_A2B) 200 | 201 | D_ad_loss_GA = self.MSE_loss(real_GA_logit, paddle.ones_like(real_GA_logit)) + \ 202 | self.MSE_loss(fake_GA_logit, paddle.zeros_like(fake_GA_logit)) 203 | 204 | D_ad_cam_loss_GA = self.MSE_loss(real_GA_cam_logit, paddle.ones_like(real_GA_cam_logit)) + \ 205 | self.MSE_loss(fake_GA_cam_logit, paddle.zeros_like(fake_GA_cam_logit)) 206 | 207 | D_ad_loss_LA = self.MSE_loss(real_LA_logit, paddle.ones_like(real_LA_logit)) + \ 208 | self.MSE_loss(fake_LA_logit, paddle.zeros_like(fake_LA_logit)) 209 | 210 | D_ad_cam_loss_LA = self.MSE_loss(real_LA_cam_logit, paddle.ones_like(real_LA_cam_logit)) + \ 211 | self.MSE_loss(fake_LA_cam_logit, paddle.zeros_like(fake_LA_cam_logit)) 212 | 213 | D_ad_loss_GB = self.MSE_loss(real_GB_logit, paddle.ones_like(real_GB_logit)) + \ 214 | self.MSE_loss(fake_GB_logit, paddle.zeros_like(fake_GB_logit)) 215 | 216 | D_ad_cam_loss_GB = self.MSE_loss(real_GB_cam_logit, paddle.ones_like(real_GB_cam_logit)) + \ 217 | self.MSE_loss(fake_GB_cam_logit, paddle.zeros_like(fake_GB_cam_logit)) 218 | 219 | D_ad_loss_LB = self.MSE_loss(real_LB_logit, paddle.ones_like(real_LB_logit)) + \ 220 | self.MSE_loss(fake_LB_logit, paddle.zeros_like(fake_LB_logit)) 221 | 222 | D_ad_cam_loss_LB = self.MSE_loss(real_LB_cam_logit, paddle.ones_like(real_LB_cam_logit)) + \ 223 | self.MSE_loss(fake_LB_cam_logit, paddle.zeros_like(fake_LB_cam_logit)) 224 | 225 | D_loss_A = self.adv_weight * (D_ad_loss_GA + D_ad_cam_loss_GA + D_ad_loss_LA + D_ad_cam_loss_LA) 226 | D_loss_B = self.adv_weight * (D_ad_loss_GB + D_ad_cam_loss_GB + D_ad_loss_LB + D_ad_cam_loss_LB) 227 | 228 | Discriminator_loss = D_loss_A + D_loss_B 229 | Discriminator_loss.backward() 230 | self.D_optim.step() 231 | 232 | 233 | # Update G 234 | self.G_optim.clear_grad() 235 | 236 | fake_A2B, fake_A2B_cam_logit, _ = self.genA2B(real_A) 237 | fake_B2A, fake_B2A_cam_logit, _ = self.genB2A(real_B) 238 | 239 | fake_A2B2A, _, _ = self.genB2A(fake_A2B) 240 | fake_B2A2B, _, _ = self.genA2B(fake_B2A) 241 | 242 | fake_A2A, fake_A2A_cam_logit, _ = self.genB2A(real_A) 243 | fake_B2B, fake_B2B_cam_logit, _ = self.genA2B(real_B) 244 | 245 | fake_GA_logit, fake_GA_cam_logit, _ = self.disGA(fake_B2A) 246 | fake_LA_logit, fake_LA_cam_logit, _ = self.disLA(fake_B2A) 247 | fake_GB_logit, fake_GB_cam_logit, _ = self.disGB(fake_A2B) 248 | fake_LB_logit, fake_LB_cam_logit, _ = self.disLB(fake_A2B) 249 | 250 | G_ad_loss_GA = self.MSE_loss(fake_GA_logit, paddle.ones_like(fake_GA_logit)) 251 | G_ad_cam_loss_GA = self.MSE_loss(fake_GA_cam_logit, paddle.ones_like(fake_GA_cam_logit)) 252 | G_ad_loss_LA = self.MSE_loss(fake_LA_logit, paddle.ones_like(fake_LA_logit)) 253 | G_ad_cam_loss_LA = self.MSE_loss(fake_LA_cam_logit, paddle.ones_like(fake_LA_cam_logit)) 254 | G_ad_loss_GB = self.MSE_loss(fake_GB_logit, paddle.ones_like(fake_GB_logit)) 255 | G_ad_cam_loss_GB = self.MSE_loss(fake_GB_cam_logit, paddle.ones_like(fake_GB_cam_logit)) 256 | G_ad_loss_LB = self.MSE_loss(fake_LB_logit, paddle.ones_like(fake_LB_logit)) 257 | G_ad_cam_loss_LB = self.MSE_loss(fake_LB_cam_logit, paddle.ones_like(fake_LB_cam_logit)) 258 | 259 | G_recon_loss_A = self.L1_loss(fake_A2B2A, real_A) 260 | G_recon_loss_B = self.L1_loss(fake_B2A2B, real_B) 261 | 262 | G_identity_loss_A = self.L1_loss(fake_A2A, real_A) 263 | G_identity_loss_B = self.L1_loss(fake_B2B, real_B) 264 | 265 | G_cam_loss_A = self.BCE_loss(fake_B2A_cam_logit, paddle.ones_like(fake_B2A_cam_logit)) + \ 266 | self.BCE_loss(fake_A2A_cam_logit, paddle.zeros_like(fake_A2A_cam_logit)) 267 | G_cam_loss_B = self.BCE_loss(fake_A2B_cam_logit, paddle.ones_like(fake_A2B_cam_logit)) + \ 268 | self.BCE_loss(fake_B2B_cam_logit, paddle.zeros_like(fake_B2B_cam_logit)) 269 | 270 | G_loss_A = self.adv_weight * (G_ad_loss_GA + G_ad_cam_loss_GA + G_ad_loss_LA + G_ad_cam_loss_LA) + \ 271 | self.cycle_weight * G_recon_loss_A + self.identity_weight * G_identity_loss_A + \ 272 | self.cam_weight * G_cam_loss_A 273 | G_loss_B = self.adv_weight * (G_ad_loss_GB + G_ad_cam_loss_GB + G_ad_loss_LB + G_ad_cam_loss_LB) + \ 274 | self.cycle_weight * G_recon_loss_B + self.identity_weight * G_identity_loss_B + \ 275 | self.cam_weight * G_cam_loss_B 276 | 277 | Generator_loss = G_loss_A + G_loss_B 278 | Generator_loss.backward() 279 | self.G_optim.step() 280 | 281 | # clip parameter of Soft-AdaLIN and LIN, applied after optimizer step 282 | self.genA2B.apply(self.Rho_clipper) 283 | self.genB2A.apply(self.Rho_clipper) 284 | 285 | self.genA2B.apply(self.W_clipper) 286 | self.genB2A.apply(self.W_clipper) 287 | 288 | if step % 10 == 0: 289 | print("[%5d/%5d] time: %4.4f d_loss: %.8f, g_loss: %.8f" % ( 290 | step, self.iteration, time.time() - start_time, Discriminator_loss, Generator_loss)) 291 | 292 | if step % self.print_freq == 0: 293 | train_sample_num = 5 294 | test_sample_num = 5 295 | A2B = np.zeros((self.img_size*7, 0, 3)) 296 | B2A = np.zeros((self.img_size*7, 0, 3)) 297 | 298 | self.genA2B.eval(), self.genB2A.eval() 299 | self.disGA.eval(), self.disGB.eval(), self.disLA.eval(), self.disLB.eval() 300 | with paddle.no_grad(): 301 | for _ in range(train_sample_num): 302 | try: 303 | real_A, _ = next(trainA_iter) 304 | except: 305 | trainA_iter = iter(self.trainA_loader) 306 | real_A, _ = next(trainA_iter) 307 | 308 | try: 309 | real_B, _ = next(trainB_iter) 310 | except: 311 | trainB_iter = iter(self.trainB_loader) 312 | real_B, _ = next(trainB_iter) 313 | 314 | fake_A2B, _, fake_A2B_heatmap = self.genA2B(real_A) 315 | fake_B2A, _, fake_B2A_heatmap = self.genB2A(real_B) 316 | 317 | fake_A2B2A, _, fake_A2B2A_heatmap = self.genB2A(fake_A2B) 318 | fake_B2A2B, _, fake_B2A2B_heatmap = self.genA2B(fake_B2A) 319 | 320 | fake_A2A, _, fake_A2A_heatmap = self.genB2A(real_A) 321 | fake_B2B, _, fake_B2B_heatmap = self.genA2B(real_B) 322 | 323 | A2B = np.concatenate((A2B, np.concatenate((RGB2BGR(tensor2numpy(denorm(real_A[0]))), 324 | cam(tensor2numpy(fake_A2A_heatmap[0]), self.img_size), 325 | RGB2BGR(tensor2numpy(denorm(fake_A2A[0]))), 326 | cam(tensor2numpy(fake_A2B_heatmap[0]), self.img_size), 327 | RGB2BGR(tensor2numpy(denorm(fake_A2B[0]))), 328 | cam(tensor2numpy(fake_A2B2A_heatmap[0]), self.img_size), 329 | RGB2BGR(tensor2numpy(denorm(fake_A2B2A[0])))), 0)), 1) 330 | 331 | B2A = np.concatenate((B2A, np.concatenate((RGB2BGR(tensor2numpy(denorm(real_B[0]))), 332 | cam(tensor2numpy(fake_B2B_heatmap[0]), self.img_size), 333 | RGB2BGR(tensor2numpy(denorm(fake_B2B[0]))), 334 | cam(tensor2numpy(fake_B2A_heatmap[0]), self.img_size), 335 | RGB2BGR(tensor2numpy(denorm(fake_B2A[0]))), 336 | cam(tensor2numpy(fake_B2A2B_heatmap[0]), self.img_size), 337 | RGB2BGR(tensor2numpy(denorm(fake_B2A2B[0])))), 0)), 1) 338 | 339 | for _ in range(test_sample_num): 340 | try: 341 | real_A, _ = next(testA_iter) 342 | except: 343 | testA_iter = iter(self.testA_loader) 344 | real_A, _ = next(testA_iter) 345 | 346 | try: 347 | real_B, _ = next(testB_iter) 348 | except: 349 | testB_iter = iter(self.testB_loader) 350 | real_B, _ = next(testB_iter) 351 | 352 | fake_A2B, _, fake_A2B_heatmap = self.genA2B(real_A) 353 | fake_B2A, _, fake_B2A_heatmap = self.genB2A(real_B) 354 | 355 | fake_A2B2A, _, fake_A2B2A_heatmap = self.genB2A(fake_A2B) 356 | fake_B2A2B, _, fake_B2A2B_heatmap = self.genA2B(fake_B2A) 357 | 358 | fake_A2A, _, fake_A2A_heatmap = self.genB2A(real_A) 359 | fake_B2B, _, fake_B2B_heatmap = self.genA2B(real_B) 360 | 361 | A2B = np.concatenate((A2B, np.concatenate((RGB2BGR(tensor2numpy(denorm(real_A[0]))), 362 | cam(tensor2numpy(fake_A2A_heatmap[0]), self.img_size), 363 | RGB2BGR(tensor2numpy(denorm(fake_A2A[0]))), 364 | cam(tensor2numpy(fake_A2B_heatmap[0]), self.img_size), 365 | RGB2BGR(tensor2numpy(denorm(fake_A2B[0]))), 366 | cam(tensor2numpy(fake_A2B2A_heatmap[0]), self.img_size), 367 | RGB2BGR(tensor2numpy(denorm(fake_A2B2A[0])))), 0)), 1) 368 | 369 | B2A = np.concatenate((B2A, np.concatenate((RGB2BGR(tensor2numpy(denorm(real_B[0]))), 370 | cam(tensor2numpy(fake_B2B_heatmap[0]), self.img_size), 371 | RGB2BGR(tensor2numpy(denorm(fake_B2B[0]))), 372 | cam(tensor2numpy(fake_B2A_heatmap[0]), self.img_size), 373 | RGB2BGR(tensor2numpy(denorm(fake_B2A[0]))), 374 | cam(tensor2numpy(fake_B2A2B_heatmap[0]), self.img_size), 375 | RGB2BGR(tensor2numpy(denorm(fake_B2A2B[0])))), 0)), 1) 376 | 377 | cv2.imwrite(os.path.join(self.result_dir, self.dataset, 'img', 'A2B_%07d.png' % step), A2B * 255.0) 378 | cv2.imwrite(os.path.join(self.result_dir, self.dataset, 'img', 'B2A_%07d.png' % step), B2A * 255.0) 379 | 380 | self.genA2B.train(), self.genB2A.train() 381 | self.disGA.train(), self.disGB.train(), self.disLA.train(), self.disLB.train() 382 | 383 | if step % self.save_freq == 0: 384 | self.save(os.path.join(self.result_dir, self.dataset, 'model'), step) 385 | 386 | def save(self, dir, step): 387 | params = {} 388 | params['genA2B'] = self.genA2B.state_dict() 389 | params['genB2A'] = self.genB2A.state_dict() 390 | params['disGA'] = self.disGA.state_dict() 391 | params['disGB'] = self.disGB.state_dict() 392 | params['disLA'] = self.disLA.state_dict() 393 | params['disLB'] = self.disLB.state_dict() 394 | save_model(params, os.path.join(dir, self.dataset + '_params_%07d.pdparams' % step)) 395 | 396 | def load(self, dir, step): 397 | checkpoint = paddle.load(os.path.join(dir, self.dataset + '_params_%07d.pdparams' % step)) 398 | self.genA2B.set_state_dict(checkpoint['genA2B']) 399 | self.genB2A.set_state_dict(checkpoint['genB2A']) 400 | self.disGA.set_state_dict(checkpoint['disGA']) 401 | self.disGB.set_state_dict(checkpoint['disGB']) 402 | self.disLA.set_state_dict(checkpoint['disLA']) 403 | self.disLB.set_state_dict(checkpoint['disLB']) 404 | -------------------------------------------------------------------------------- /utils/segment/hrnet.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | import math 16 | 17 | import paddle 18 | import paddle.nn as nn 19 | import paddle.nn.functional as F 20 | 21 | from .layers import ConvBNReLU, ConvBN 22 | 23 | __all__ = [ 24 | "HRNet_W18_Small_V1", "HRNet_W18_Small_V2", "HRNet_W18", "HRNet_W30", 25 | "HRNet_W32", "HRNet_W40", "HRNet_W44", "HRNet_W48", "HRNet_W60", "HRNet_W64" 26 | ] 27 | 28 | 29 | class HRNet(nn.Layer): 30 | """ 31 | The HRNet implementation based on PaddlePaddle. 32 | 33 | The original article refers to 34 | Jingdong Wang, et, al. "HRNet:Deep High-Resolution Representation Learning for Visual Recognition" 35 | (https://arxiv.org/pdf/1908.07919.pdf). 36 | 37 | Args: 38 | pretrained (str): The path of pretrained model. 39 | stage1_num_modules (int): Number of modules for stage1. Default 1. 40 | stage1_num_blocks (list): Number of blocks per module for stage1. Default [4]. 41 | stage1_num_channels (list): Number of channels per branch for stage1. Default [64]. 42 | stage2_num_modules (int): Number of modules for stage2. Default 1. 43 | stage2_num_blocks (list): Number of blocks per module for stage2. Default [4, 4] 44 | stage2_num_channels (list): Number of channels per branch for stage2. Default [18, 36]. 45 | stage3_num_modules (int): Number of modules for stage3. Default 4. 46 | stage3_num_blocks (list): Number of blocks per module for stage3. Default [4, 4, 4] 47 | stage3_num_channels (list): Number of channels per branch for stage3. Default [18, 36, 72]. 48 | stage4_num_modules (int): Number of modules for stage4. Default 3. 49 | stage4_num_blocks (list): Number of blocks per module for stage4. Default [4, 4, 4, 4] 50 | stage4_num_channels (list): Number of channels per branch for stage4. Default [18, 36, 72. 144]. 51 | has_se (bool): Whether to use Squeeze-and-Excitation module. Default False. 52 | align_corners (bool, optional): An argument of F.interpolate. It should be set to False when the feature size is even, 53 | e.g. 1024x512, otherwise it is True, e.g. 769x769. Default: False. 54 | """ 55 | 56 | def __init__(self, 57 | pretrained=None, 58 | stage1_num_modules=1, 59 | stage1_num_blocks=[4], 60 | stage1_num_channels=[64], 61 | stage2_num_modules=1, 62 | stage2_num_blocks=[4, 4], 63 | stage2_num_channels=[18, 36], 64 | stage3_num_modules=4, 65 | stage3_num_blocks=[4, 4, 4], 66 | stage3_num_channels=[18, 36, 72], 67 | stage4_num_modules=3, 68 | stage4_num_blocks=[4, 4, 4, 4], 69 | stage4_num_channels=[18, 36, 72, 144], 70 | has_se=False, 71 | align_corners=False): 72 | super(HRNet, self).__init__() 73 | self.pretrained = pretrained 74 | self.stage1_num_modules = stage1_num_modules 75 | self.stage1_num_blocks = stage1_num_blocks 76 | self.stage1_num_channels = stage1_num_channels 77 | self.stage2_num_modules = stage2_num_modules 78 | self.stage2_num_blocks = stage2_num_blocks 79 | self.stage2_num_channels = stage2_num_channels 80 | self.stage3_num_modules = stage3_num_modules 81 | self.stage3_num_blocks = stage3_num_blocks 82 | self.stage3_num_channels = stage3_num_channels 83 | self.stage4_num_modules = stage4_num_modules 84 | self.stage4_num_blocks = stage4_num_blocks 85 | self.stage4_num_channels = stage4_num_channels 86 | self.has_se = has_se 87 | self.align_corners = align_corners 88 | self.feat_channels = [sum(stage4_num_channels)] 89 | 90 | self.conv_layer1_1 = ConvBNReLU( 91 | in_channels=3, 92 | out_channels=64, 93 | kernel_size=3, 94 | stride=2, 95 | padding='same', 96 | bias_attr=False) 97 | 98 | self.conv_layer1_2 = ConvBNReLU( 99 | in_channels=64, 100 | out_channels=64, 101 | kernel_size=3, 102 | stride=2, 103 | padding='same', 104 | bias_attr=False) 105 | 106 | self.la1 = Layer1( 107 | num_channels=64, 108 | num_blocks=self.stage1_num_blocks[0], 109 | num_filters=self.stage1_num_channels[0], 110 | has_se=has_se, 111 | name="layer2") 112 | 113 | self.tr1 = TransitionLayer( 114 | in_channels=[self.stage1_num_channels[0] * 4], 115 | out_channels=self.stage2_num_channels, 116 | name="tr1") 117 | 118 | self.st2 = Stage( 119 | num_channels=self.stage2_num_channels, 120 | num_modules=self.stage2_num_modules, 121 | num_blocks=self.stage2_num_blocks, 122 | num_filters=self.stage2_num_channels, 123 | has_se=self.has_se, 124 | name="st2", 125 | align_corners=align_corners) 126 | 127 | self.tr2 = TransitionLayer( 128 | in_channels=self.stage2_num_channels, 129 | out_channels=self.stage3_num_channels, 130 | name="tr2") 131 | self.st3 = Stage( 132 | num_channels=self.stage3_num_channels, 133 | num_modules=self.stage3_num_modules, 134 | num_blocks=self.stage3_num_blocks, 135 | num_filters=self.stage3_num_channels, 136 | has_se=self.has_se, 137 | name="st3", 138 | align_corners=align_corners) 139 | 140 | self.tr3 = TransitionLayer( 141 | in_channels=self.stage3_num_channels, 142 | out_channels=self.stage4_num_channels, 143 | name="tr3") 144 | self.st4 = Stage( 145 | num_channels=self.stage4_num_channels, 146 | num_modules=self.stage4_num_modules, 147 | num_blocks=self.stage4_num_blocks, 148 | num_filters=self.stage4_num_channels, 149 | has_se=self.has_se, 150 | name="st4", 151 | align_corners=align_corners) 152 | 153 | def forward(self, x): 154 | conv1 = self.conv_layer1_1(x) 155 | conv2 = self.conv_layer1_2(conv1) 156 | 157 | la1 = self.la1(conv2) 158 | 159 | tr1 = self.tr1([la1]) 160 | st2 = self.st2(tr1) 161 | 162 | tr2 = self.tr2(st2) 163 | st3 = self.st3(tr2) 164 | 165 | tr3 = self.tr3(st3) 166 | st4 = self.st4(tr3) 167 | 168 | x0_h, x0_w = st4[0].shape[2:] 169 | x1 = F.interpolate( 170 | st4[1], (x0_h, x0_w), 171 | mode='bilinear', 172 | align_corners=self.align_corners) 173 | x2 = F.interpolate( 174 | st4[2], (x0_h, x0_w), 175 | mode='bilinear', 176 | align_corners=self.align_corners) 177 | x3 = F.interpolate( 178 | st4[3], (x0_h, x0_w), 179 | mode='bilinear', 180 | align_corners=self.align_corners) 181 | x = paddle.concat([st4[0], x1, x2, x3], axis=1) 182 | 183 | return [x] 184 | 185 | 186 | class Layer1(nn.Layer): 187 | def __init__(self, 188 | num_channels, 189 | num_filters, 190 | num_blocks, 191 | has_se=False, 192 | name=None): 193 | super(Layer1, self).__init__() 194 | 195 | self.bottleneck_block_list = [] 196 | 197 | for i in range(num_blocks): 198 | bottleneck_block = self.add_sublayer( 199 | "bb_{}_{}".format(name, i + 1), 200 | BottleneckBlock( 201 | num_channels=num_channels if i == 0 else num_filters * 4, 202 | num_filters=num_filters, 203 | has_se=has_se, 204 | stride=1, 205 | downsample=True if i == 0 else False, 206 | name=name + '_' + str(i + 1))) 207 | self.bottleneck_block_list.append(bottleneck_block) 208 | 209 | def forward(self, x): 210 | conv = x 211 | for block_func in self.bottleneck_block_list: 212 | conv = block_func(conv) 213 | return conv 214 | 215 | 216 | class TransitionLayer(nn.Layer): 217 | def __init__(self, in_channels, out_channels, name=None): 218 | super(TransitionLayer, self).__init__() 219 | 220 | num_in = len(in_channels) 221 | num_out = len(out_channels) 222 | self.conv_bn_func_list = [] 223 | for i in range(num_out): 224 | residual = None 225 | if i < num_in: 226 | if in_channels[i] != out_channels[i]: 227 | residual = self.add_sublayer( 228 | "transition_{}_layer_{}".format(name, i + 1), 229 | ConvBNReLU( 230 | in_channels=in_channels[i], 231 | out_channels=out_channels[i], 232 | kernel_size=3, 233 | padding='same', 234 | bias_attr=False)) 235 | else: 236 | residual = self.add_sublayer( 237 | "transition_{}_layer_{}".format(name, i + 1), 238 | ConvBNReLU( 239 | in_channels=in_channels[-1], 240 | out_channels=out_channels[i], 241 | kernel_size=3, 242 | stride=2, 243 | padding='same', 244 | bias_attr=False)) 245 | self.conv_bn_func_list.append(residual) 246 | 247 | def forward(self, x): 248 | outs = [] 249 | for idx, conv_bn_func in enumerate(self.conv_bn_func_list): 250 | if conv_bn_func is None: 251 | outs.append(x[idx]) 252 | else: 253 | if idx < len(x): 254 | outs.append(conv_bn_func(x[idx])) 255 | else: 256 | outs.append(conv_bn_func(x[-1])) 257 | return outs 258 | 259 | 260 | class Branches(nn.Layer): 261 | def __init__(self, 262 | num_blocks, 263 | in_channels, 264 | out_channels, 265 | has_se=False, 266 | name=None): 267 | super(Branches, self).__init__() 268 | 269 | self.basic_block_list = [] 270 | 271 | for i in range(len(out_channels)): 272 | self.basic_block_list.append([]) 273 | for j in range(num_blocks[i]): 274 | in_ch = in_channels[i] if j == 0 else out_channels[i] 275 | basic_block_func = self.add_sublayer( 276 | "bb_{}_branch_layer_{}_{}".format(name, i + 1, j + 1), 277 | BasicBlock( 278 | num_channels=in_ch, 279 | num_filters=out_channels[i], 280 | has_se=has_se, 281 | name=name + '_branch_layer_' + str(i + 1) + '_' + 282 | str(j + 1))) 283 | self.basic_block_list[i].append(basic_block_func) 284 | 285 | def forward(self, x): 286 | outs = [] 287 | for idx, input in enumerate(x): 288 | conv = input 289 | for basic_block_func in self.basic_block_list[idx]: 290 | conv = basic_block_func(conv) 291 | outs.append(conv) 292 | return outs 293 | 294 | 295 | class BottleneckBlock(nn.Layer): 296 | def __init__(self, 297 | num_channels, 298 | num_filters, 299 | has_se, 300 | stride=1, 301 | downsample=False, 302 | name=None): 303 | super(BottleneckBlock, self).__init__() 304 | 305 | self.has_se = has_se 306 | self.downsample = downsample 307 | 308 | self.conv1 = ConvBNReLU( 309 | in_channels=num_channels, 310 | out_channels=num_filters, 311 | kernel_size=1, 312 | padding='same', 313 | bias_attr=False) 314 | 315 | self.conv2 = ConvBNReLU( 316 | in_channels=num_filters, 317 | out_channels=num_filters, 318 | kernel_size=3, 319 | stride=stride, 320 | padding='same', 321 | bias_attr=False) 322 | 323 | self.conv3 = ConvBN( 324 | in_channels=num_filters, 325 | out_channels=num_filters * 4, 326 | kernel_size=1, 327 | padding='same', 328 | bias_attr=False) 329 | 330 | if self.downsample: 331 | self.conv_down = ConvBN( 332 | in_channels=num_channels, 333 | out_channels=num_filters * 4, 334 | kernel_size=1, 335 | padding='same', 336 | bias_attr=False) 337 | 338 | if self.has_se: 339 | self.se = SELayer( 340 | num_channels=num_filters * 4, 341 | num_filters=num_filters * 4, 342 | reduction_ratio=16, 343 | name=name + '_fc') 344 | 345 | def forward(self, x): 346 | residual = x 347 | conv1 = self.conv1(x) 348 | conv2 = self.conv2(conv1) 349 | conv3 = self.conv3(conv2) 350 | 351 | if self.downsample: 352 | residual = self.conv_down(x) 353 | 354 | if self.has_se: 355 | conv3 = self.se(conv3) 356 | 357 | y = conv3 + residual 358 | y = F.relu(y) 359 | return y 360 | 361 | 362 | class BasicBlock(nn.Layer): 363 | def __init__(self, 364 | num_channels, 365 | num_filters, 366 | stride=1, 367 | has_se=False, 368 | downsample=False, 369 | name=None): 370 | super(BasicBlock, self).__init__() 371 | 372 | self.has_se = has_se 373 | self.downsample = downsample 374 | 375 | self.conv1 = ConvBNReLU( 376 | in_channels=num_channels, 377 | out_channels=num_filters, 378 | kernel_size=3, 379 | stride=stride, 380 | padding='same', 381 | bias_attr=False) 382 | self.conv2 = ConvBN( 383 | in_channels=num_filters, 384 | out_channels=num_filters, 385 | kernel_size=3, 386 | padding='same', 387 | bias_attr=False) 388 | 389 | if self.downsample: 390 | self.conv_down = ConvBNReLU( 391 | in_channels=num_channels, 392 | out_channels=num_filters, 393 | kernel_size=1, 394 | padding='same', 395 | bias_attr=False) 396 | 397 | if self.has_se: 398 | self.se = SELayer( 399 | num_channels=num_filters, 400 | num_filters=num_filters, 401 | reduction_ratio=16, 402 | name=name + '_fc') 403 | 404 | def forward(self, x): 405 | residual = x 406 | conv1 = self.conv1(x) 407 | conv2 = self.conv2(conv1) 408 | 409 | if self.downsample: 410 | residual = self.conv_down(x) 411 | 412 | if self.has_se: 413 | conv2 = self.se(conv2) 414 | 415 | y = conv2 + residual 416 | y = F.relu(y) 417 | return y 418 | 419 | 420 | class SELayer(nn.Layer): 421 | def __init__(self, num_channels, num_filters, reduction_ratio, name=None): 422 | super(SELayer, self).__init__() 423 | 424 | self.pool2d_gap = nn.AdaptiveAvgPool2D(1) 425 | 426 | self._num_channels = num_channels 427 | 428 | med_ch = int(num_channels / reduction_ratio) 429 | stdv = 1.0 / math.sqrt(num_channels * 1.0) 430 | self.squeeze = nn.Linear( 431 | num_channels, 432 | med_ch, 433 | weight_attr=paddle.ParamAttr( 434 | initializer=nn.initializer.Uniform(-stdv, stdv))) 435 | 436 | stdv = 1.0 / math.sqrt(med_ch * 1.0) 437 | self.excitation = nn.Linear( 438 | med_ch, 439 | num_filters, 440 | weight_attr=paddle.ParamAttr( 441 | initializer=nn.initializer.Uniform(-stdv, stdv))) 442 | 443 | def forward(self, x): 444 | pool = self.pool2d_gap(x) 445 | pool = paddle.reshape(pool, shape=[-1, self._num_channels]) 446 | squeeze = self.squeeze(pool) 447 | squeeze = F.relu(squeeze) 448 | excitation = self.excitation(squeeze) 449 | excitation = F.sigmoid(excitation) 450 | excitation = paddle.reshape( 451 | excitation, shape=[-1, self._num_channels, 1, 1]) 452 | out = x * excitation 453 | return out 454 | 455 | 456 | class Stage(nn.Layer): 457 | def __init__(self, 458 | num_channels, 459 | num_modules, 460 | num_blocks, 461 | num_filters, 462 | has_se=False, 463 | multi_scale_output=True, 464 | name=None, 465 | align_corners=False): 466 | super(Stage, self).__init__() 467 | 468 | self._num_modules = num_modules 469 | 470 | self.stage_func_list = [] 471 | for i in range(num_modules): 472 | if i == num_modules - 1 and not multi_scale_output: 473 | stage_func = self.add_sublayer( 474 | "stage_{}_{}".format(name, i + 1), 475 | HighResolutionModule( 476 | num_channels=num_channels, 477 | num_blocks=num_blocks, 478 | num_filters=num_filters, 479 | has_se=has_se, 480 | multi_scale_output=False, 481 | name=name + '_' + str(i + 1), 482 | align_corners=align_corners)) 483 | else: 484 | stage_func = self.add_sublayer( 485 | "stage_{}_{}".format(name, i + 1), 486 | HighResolutionModule( 487 | num_channels=num_channels, 488 | num_blocks=num_blocks, 489 | num_filters=num_filters, 490 | has_se=has_se, 491 | name=name + '_' + str(i + 1), 492 | align_corners=align_corners)) 493 | 494 | self.stage_func_list.append(stage_func) 495 | 496 | def forward(self, x): 497 | out = x 498 | for idx in range(self._num_modules): 499 | out = self.stage_func_list[idx](out) 500 | return out 501 | 502 | 503 | class HighResolutionModule(nn.Layer): 504 | def __init__(self, 505 | num_channels, 506 | num_blocks, 507 | num_filters, 508 | has_se=False, 509 | multi_scale_output=True, 510 | name=None, 511 | align_corners=False): 512 | super(HighResolutionModule, self).__init__() 513 | 514 | self.branches_func = Branches( 515 | num_blocks=num_blocks, 516 | in_channels=num_channels, 517 | out_channels=num_filters, 518 | has_se=has_se, 519 | name=name) 520 | 521 | self.fuse_func = FuseLayers( 522 | in_channels=num_filters, 523 | out_channels=num_filters, 524 | multi_scale_output=multi_scale_output, 525 | name=name, 526 | align_corners=align_corners) 527 | 528 | def forward(self, x): 529 | out = self.branches_func(x) 530 | out = self.fuse_func(out) 531 | return out 532 | 533 | 534 | class FuseLayers(nn.Layer): 535 | def __init__(self, 536 | in_channels, 537 | out_channels, 538 | multi_scale_output=True, 539 | name=None, 540 | align_corners=False): 541 | super(FuseLayers, self).__init__() 542 | 543 | self._actual_ch = len(in_channels) if multi_scale_output else 1 544 | self._in_channels = in_channels 545 | self.align_corners = align_corners 546 | 547 | self.residual_func_list = [] 548 | for i in range(self._actual_ch): 549 | for j in range(len(in_channels)): 550 | if j > i: 551 | residual_func = self.add_sublayer( 552 | "residual_{}_layer_{}_{}".format(name, i + 1, j + 1), 553 | ConvBN( 554 | in_channels=in_channels[j], 555 | out_channels=out_channels[i], 556 | kernel_size=1, 557 | padding='same', 558 | bias_attr=False)) 559 | self.residual_func_list.append(residual_func) 560 | elif j < i: 561 | pre_num_filters = in_channels[j] 562 | for k in range(i - j): 563 | if k == i - j - 1: 564 | residual_func = self.add_sublayer( 565 | "residual_{}_layer_{}_{}_{}".format( 566 | name, i + 1, j + 1, k + 1), 567 | ConvBN( 568 | in_channels=pre_num_filters, 569 | out_channels=out_channels[i], 570 | kernel_size=3, 571 | stride=2, 572 | padding='same', 573 | bias_attr=False)) 574 | pre_num_filters = out_channels[i] 575 | else: 576 | residual_func = self.add_sublayer( 577 | "residual_{}_layer_{}_{}_{}".format( 578 | name, i + 1, j + 1, k + 1), 579 | ConvBNReLU( 580 | in_channels=pre_num_filters, 581 | out_channels=out_channels[j], 582 | kernel_size=3, 583 | stride=2, 584 | padding='same', 585 | bias_attr=False)) 586 | pre_num_filters = out_channels[j] 587 | self.residual_func_list.append(residual_func) 588 | 589 | def forward(self, x): 590 | outs = [] 591 | residual_func_idx = 0 592 | for i in range(self._actual_ch): 593 | residual = x[i] 594 | residual_shape = residual.shape[-2:] 595 | for j in range(len(self._in_channels)): 596 | if j > i: 597 | y = self.residual_func_list[residual_func_idx](x[j]) 598 | residual_func_idx += 1 599 | 600 | y = F.interpolate( 601 | y, 602 | residual_shape, 603 | mode='bilinear', 604 | align_corners=self.align_corners) 605 | residual = residual + y 606 | elif j < i: 607 | y = x[j] 608 | for k in range(i - j): 609 | y = self.residual_func_list[residual_func_idx](y) 610 | residual_func_idx += 1 611 | 612 | residual = residual + y 613 | 614 | residual = F.relu(residual) 615 | outs.append(residual) 616 | 617 | return outs 618 | 619 | 620 | def HRNet_W18_Small_V1(**kwargs): 621 | model = HRNet( 622 | stage1_num_modules=1, 623 | stage1_num_blocks=[1], 624 | stage1_num_channels=[32], 625 | stage2_num_modules=1, 626 | stage2_num_blocks=[2, 2], 627 | stage2_num_channels=[16, 32], 628 | stage3_num_modules=1, 629 | stage3_num_blocks=[2, 2, 2], 630 | stage3_num_channels=[16, 32, 64], 631 | stage4_num_modules=1, 632 | stage4_num_blocks=[2, 2, 2, 2], 633 | stage4_num_channels=[16, 32, 64, 128], 634 | **kwargs) 635 | return model 636 | 637 | 638 | def HRNet_W18_Small_V2(**kwargs): 639 | model = HRNet( 640 | stage1_num_modules=1, 641 | stage1_num_blocks=[2], 642 | stage1_num_channels=[64], 643 | stage2_num_modules=1, 644 | stage2_num_blocks=[2, 2], 645 | stage2_num_channels=[18, 36], 646 | stage3_num_modules=1, 647 | stage3_num_blocks=[2, 2, 2], 648 | stage3_num_channels=[18, 36, 72], 649 | stage4_num_modules=1, 650 | stage4_num_blocks=[2, 2, 2, 2], 651 | stage4_num_channels=[18, 36, 72, 144], 652 | **kwargs) 653 | return model 654 | 655 | 656 | def HRNet_W18(**kwargs): 657 | model = HRNet( 658 | stage1_num_modules=1, 659 | stage1_num_blocks=[4], 660 | stage1_num_channels=[64], 661 | stage2_num_modules=1, 662 | stage2_num_blocks=[4, 4], 663 | stage2_num_channels=[18, 36], 664 | stage3_num_modules=4, 665 | stage3_num_blocks=[4, 4, 4], 666 | stage3_num_channels=[18, 36, 72], 667 | stage4_num_modules=3, 668 | stage4_num_blocks=[4, 4, 4, 4], 669 | stage4_num_channels=[18, 36, 72, 144], 670 | **kwargs) 671 | return model 672 | 673 | 674 | def HRNet_W30(**kwargs): 675 | model = HRNet( 676 | stage1_num_modules=1, 677 | stage1_num_blocks=[4], 678 | stage1_num_channels=[64], 679 | stage2_num_modules=1, 680 | stage2_num_blocks=[4, 4], 681 | stage2_num_channels=[30, 60], 682 | stage3_num_modules=4, 683 | stage3_num_blocks=[4, 4, 4], 684 | stage3_num_channels=[30, 60, 120], 685 | stage4_num_modules=3, 686 | stage4_num_blocks=[4, 4, 4, 4], 687 | stage4_num_channels=[30, 60, 120, 240], 688 | **kwargs) 689 | return model 690 | 691 | 692 | def HRNet_W32(**kwargs): 693 | model = HRNet( 694 | stage1_num_modules=1, 695 | stage1_num_blocks=[4], 696 | stage1_num_channels=[64], 697 | stage2_num_modules=1, 698 | stage2_num_blocks=[4, 4], 699 | stage2_num_channels=[32, 64], 700 | stage3_num_modules=4, 701 | stage3_num_blocks=[4, 4, 4], 702 | stage3_num_channels=[32, 64, 128], 703 | stage4_num_modules=3, 704 | stage4_num_blocks=[4, 4, 4, 4], 705 | stage4_num_channels=[32, 64, 128, 256], 706 | **kwargs) 707 | return model 708 | 709 | 710 | def HRNet_W40(**kwargs): 711 | model = HRNet( 712 | stage1_num_modules=1, 713 | stage1_num_blocks=[4], 714 | stage1_num_channels=[64], 715 | stage2_num_modules=1, 716 | stage2_num_blocks=[4, 4], 717 | stage2_num_channels=[40, 80], 718 | stage3_num_modules=4, 719 | stage3_num_blocks=[4, 4, 4], 720 | stage3_num_channels=[40, 80, 160], 721 | stage4_num_modules=3, 722 | stage4_num_blocks=[4, 4, 4, 4], 723 | stage4_num_channels=[40, 80, 160, 320], 724 | **kwargs) 725 | return model 726 | 727 | 728 | def HRNet_W44(**kwargs): 729 | model = HRNet( 730 | stage1_num_modules=1, 731 | stage1_num_blocks=[4], 732 | stage1_num_channels=[64], 733 | stage2_num_modules=1, 734 | stage2_num_blocks=[4, 4], 735 | stage2_num_channels=[44, 88], 736 | stage3_num_modules=4, 737 | stage3_num_blocks=[4, 4, 4], 738 | stage3_num_channels=[44, 88, 176], 739 | stage4_num_modules=3, 740 | stage4_num_blocks=[4, 4, 4, 4], 741 | stage4_num_channels=[44, 88, 176, 352], 742 | **kwargs) 743 | return model 744 | 745 | 746 | def HRNet_W48(**kwargs): 747 | model = HRNet( 748 | stage1_num_modules=1, 749 | stage1_num_blocks=[4], 750 | stage1_num_channels=[64], 751 | stage2_num_modules=1, 752 | stage2_num_blocks=[4, 4], 753 | stage2_num_channels=[48, 96], 754 | stage3_num_modules=4, 755 | stage3_num_blocks=[4, 4, 4], 756 | stage3_num_channels=[48, 96, 192], 757 | stage4_num_modules=3, 758 | stage4_num_blocks=[4, 4, 4, 4], 759 | stage4_num_channels=[48, 96, 192, 384], 760 | **kwargs) 761 | return model 762 | 763 | 764 | def HRNet_W60(**kwargs): 765 | model = HRNet( 766 | stage1_num_modules=1, 767 | stage1_num_blocks=[4], 768 | stage1_num_channels=[64], 769 | stage2_num_modules=1, 770 | stage2_num_blocks=[4, 4], 771 | stage2_num_channels=[60, 120], 772 | stage3_num_modules=4, 773 | stage3_num_blocks=[4, 4, 4], 774 | stage3_num_channels=[60, 120, 240], 775 | stage4_num_modules=3, 776 | stage4_num_blocks=[4, 4, 4, 4], 777 | stage4_num_channels=[60, 120, 240, 480], 778 | **kwargs) 779 | return model 780 | 781 | 782 | def HRNet_W64(**kwargs): 783 | model = HRNet( 784 | stage1_num_modules=1, 785 | stage1_num_blocks=[4], 786 | stage1_num_channels=[64], 787 | stage2_num_modules=1, 788 | stage2_num_blocks=[4, 4], 789 | stage2_num_channels=[64, 128], 790 | stage3_num_modules=4, 791 | stage3_num_blocks=[4, 4, 4], 792 | stage3_num_channels=[64, 128, 256], 793 | stage4_num_modules=3, 794 | stage4_num_blocks=[4, 4, 4, 4], 795 | stage4_num_channels=[64, 128, 256, 512], 796 | **kwargs) 797 | return model 798 | --------------------------------------------------------------------------------