Naokazu Yokoya

203 papers A* 19A 12B 33C 4Misc 12Journal 47Unranked 76
YearRankTypeTitle / Venue / Authors
2018 J jnl
IEICE Trans. Inf. Syst.
Mayu Otani, Atsushi Nishida, Yuta Nakashima, Tomokazu Sato, Naokazu Yokoya
2018 J jnl
J. Vis. Commun. Image Represent.
Takahiro Tanaka, Norihiko Kawai, Yuta Nakashima, Tomokazu Sato, Naokazu Yokoya
2018 J jnl
IEEE Trans. Multim.
Antonio Tejero-de-Pablos, Yuta Nakashima, Tomokazu Sato, Naokazu Yokoya, Marko Linna, Esa Rahtu
2017 J jnl
IPSJ Trans. Comput. Vis. Appl.
Takahito Aoto, Tomokazu Sato, Yasuhiro Mukaigawa, Naokazu Yokoya
2017 J jnl
IEEE Trans. Vis. Comput. Graph.
Norihiko Kawai, Tomokazu Sato, Yuta Nakashima, Naokazu Yokoya
2017 J jnl
Multim. Tools Appl.
Fabian Lorenzo Dayrit, Yuta Nakashima, Tomokazu Sato, Naokazu Yokoya
2017 A conf
ICME
Thiwat Rongsirigul, Yuta Nakashima, Tomokazu Sato, Naokazu Yokoya
2017 conf
MMM (1)
Fabian Lorenzo Dayrit, Ryosuke Kimura, Yuta Nakashima, Ambrosio Blanco, Hiroshi Kawasaki, Katsushi Ikeuchi, Tomokazu Sato, Naokazu Yokoya
2017 J jnl
CoRR
Antonio Tejero-de-Pablos, Yuta Nakashima, Tomokazu Sato, Naokazu Yokoya, Marko Linna, Esa Rahtu
2017 J jnl
Multim. Tools Appl.
Mayu Otani, Yuta Nakashima, Tomokazu Sato, Naokazu Yokoya
2016 conf
3D Image Processing, Measurement (3DIPM), and Applications
Hikari Takehara, Yuta Nakashima, Tomokazu Sato, Naokazu Yokoya
2016 J jnl
IEEE Trans. Vis. Comput. Graph.
Norihiko Kawai, Tomokazu Sato, Naokazu Yokoya
2016 J jnl
EURASIP J. Image Video Process.
Antonio Tejero-de-Pablos, Yuta Nakashima, Naokazu Yokoya, Francisco Javier Díaz Pernas, Mario Martínez-Zarzuela
2016 A conf
ICME
Antonio Tejero-de-Pablos, Yuta Nakashima, Tomokazu Sato, Naokazu Yokoya
2016 conf
ECCV Workshops (1)
Mayu Otani, Yuta Nakashima, Esa Rahtu, Janne Heikkilä, Naokazu Yokoya
2016 J jnl
CoRR
Mayu Otani, Yuta Nakashima, Esa Rahtu, Janne Heikkilä, Naokazu Yokoya
2016 conf
ISMAR Adjunct
Fumio Okura, Yuya Nishizaki, Tomokazu Sato, Norihiko Kawai, Naokazu Yokoya
2016 B conf
ICPR
Atsushi Takabe, Hikari Takehara, Norihiko Kawai, Tomokazu Sato, Takashi Machida, Satoru Nakanishi, Naokazu Yokoya
2016 J jnl
J. Inf. Process.
Yuta Tsunematsu, Norihiko Kawai, Tomokazu Sato, Naokazu Yokoya
2016 conf
ACCV (3)
Ryoichiro Nishi, Takahito Aoto, Norihiko Kawai, Tomokazu Sato, Yasuhiro Mukaigawa, Naokazu Yokoya
2016 conf
ACCV (5)
Mayu Otani, Yuta Nakashima, Esa Rahtu, Janne Heikkilä, Naokazu Yokoya
2016 J jnl
CoRR
Mayu Otani, Yuta Nakashima, Esa Rahtu, Janne Heikkilä, Naokazu Yokoya
2015 conf
ISMAR Workshops
Norihiko Kawai, Tomokazu Sato, Yuta Nakashima, Naokazu Yokoya
2015 J jnl
Virtual Real.
Yuta Nakashima, Yusuke Uno, Norihiko Kawai, Tomokazu Sato, Naokazu Yokoya
2015 J jnl
Comput. Vis. Image Underst.
Hideyuki Kume, Tomokazu Sato, Naokazu Yokoya
2015 A conf
ICME
Yuta Nakashima, Tatsuya Koyama, Naokazu Yokoya, Noboru Babaguchi
2015 J jnl
IEICE Trans. Inf. Syst.
Yusuke Hayashi, Norihiko Kawai, Tomokazu Sato, Miyuki Okumoto, Naokazu Yokoya
2015 B conf
ICIP
Yusuke Hayashi, Norihiko Kawai, Tomokazu Sato, Naokazu Yokoya
2015 J jnl
ACM Journal on Computing and Cultural Heritage
Fumio Okura, Masayuki Kanbara, Naokazu Yokoya
2015 A conf
ICME
Mayu Otani, Yuta Nakashima, Tomokazu Sato, Naokazu Yokoya
2014 J jnl
Virtual Real.
Fumio Okura, Masayuki Kanbara, Naokazu Yokoya
2014 J jnl
Inf. Media Technol.
Norihiko Kawai, Naoya Inoue, Tomokazu Sato, Fumio Okura, Yuta Nakashima, Naokazu Yokoya
2014 J jnl
IPSJ Trans. Comput. Vis. Appl.
Norihiko Kawai, Naoya Inoue, Tomokazu Sato, Fumio Okura, Yuta Nakashima, Naokazu Yokoya
2014 B conf
Intelligent Vehicles Symposium
Akitaka Oko, Tomokazu Sato, Hideyuki Kume, Takashi Machida, Naokazu Yokoya
2014 A conf
ICME
Fabian Lorenzo Dayrit, Yuta Nakashima, Tomokazu Sato, Naokazu Yokoya
2014 conf
HCI (16)
Norihiko Kawai, Tomokazu Sato, Naokazu Yokoya
2014 A* conf
ISMAR
Fumio Okura, Takayuki Akaguma, Tomokazu Sato, Naokazu Yokoya
2014 conf
VISAPP (3)
Hideyuki Kume, Tomokazu Sato, Naokazu Yokoya
2014 B conf
ICPR
Haruo Matsuo, Tomokazu Sato, Naokazu Yokoya
2013 J jnl
IPSJ Trans. Comput. Vis. Appl.
Taiki Sekii, Tomokazu Sato, Hideyuki Kume, Naokazu Yokoya
2013 A* conf
ISMAR
Yuta Nakashima, Tomokazu Sato, Yusuke Uno, Naokazu Yokoya, Norihiko Kawai
2013 B conf
ICIP
Tsunetake Kanatani, Hideyuki Kume, Takafumi Taketomi, Tomokazu Sato, Naokazu Yokoya
2013 A* conf
ISMAR
Norihiko Kawai, Tomokazu Sato, Naokazu Yokoya
2013 C conf
PSIVT
Yusuke Hayashi, Norihiko Kawai, Tomokazu Sato, Miyuki Okumoto, Naokazu Yokoya
2013 B conf
ICIP
Yuta Nakashima, Naokazu Yokoya
2013 A* conf
ISMAR
Fumio Okura, Masayuki Kanbara, Naokazu Yokoya
2013 conf
ACPR
Takahito Aoto, Tomokazu Sato, Yasuhiro Mukaigawa, Naokazu Yokoya
2013 conf
SIGGRAPH ASIA Mobile Graphics and Interactive Applications
Takayuki Akaguma, Fumio Okura, Tomokazu Sato, Naokazu Yokoya
2013 A conf
IROS
Fumio Okura, Yuko Ueda, Tomokazu Sato, Naokazu Yokoya
2012 A* conf
ISMAR
Norihiko Kawai, Masayoshi Yamasaki, Tomokazu Sato, Naokazu Yokoya
2012 A* conf
ACM Multimedia
Fumio Okura, Masayuki Kanbara, Naokazu Yokoya
2012 A conf
ICME
Fumio Okura, Masayuki Kanbara, Naokazu Yokoya
2012 B conf
ICPR
Norihiko Kawai, Naokazu Yokoya
2012 B conf
ICPR
Takahito Aoto, Takafumi Taketomi, Tomokazu Sato, Yasuhiro Mukaigawa, Naokazu Yokoya
2012 conf
Color Imaging: Displaying, Processing, Hardcopy, and Applications
Masaki Kitaura, Fumio Okura, Masayuki Kanbara, Naokazu Yokoya
2011 conf
ICCV Workshops
Tomokazu Sato, Tomás Pajdla, Naokazu Yokoya
2011 conf
SIGGRAPH Posters
Fumio Okura, Masayuki Kanbara, Naokazu Yokoya
2011 J jnl
Comput. Graph.
Takafumi Taketomi, Tomokazu Sato, Naokazu Yokoya
2011 B conf
ICIP
Norihiko Kawai, Avideh Zakhor, Tomokazu Sato, Naokazu Yokoya
2011 J jnl
Inf. Media Technol.
Norihiko Kawai, Kotaro Machikita, Tomokazu Sato, Naokazu Yokoya
2010 conf
ACCV Workshops (2)
Takafumi Taketomi, Tomokazu Sato, Naokazu Yokoya
2010 B conf
ICPR
Maiya Hori, Masayuki Kanbara, Naokazu Yokoya
2010 A* conf
ISMAR
Fumio Okura, Masayuki Kanbara, Naokazu Yokoya
2010 conf
ACCV Workshops (2)
Hideyuki Tamura, Takashi Matsuyama, Naokazu Yokoya, Ryosuke Ichikari, Shohei Nobuhara, Tomokazu Sato
2010 J jnl
J. Vis. Commun. Image Represent.
Tomokazu Sato, Naokazu Yokoya
2010 B conf
ICPR
Hideyuki Kume, Takafumi Taketomi, Tomokazu Sato, Naokazu Yokoya
2010 J jnl
Int. J. Virtual Real.
Tomokazu Sato, Hiroyuki Koshizawa, Naokazu Yokoya
2010 Misc conf
DCAI
Ismail Arai, Maiya Hori, Norihiko Kawai, Yohei Abe, Masahiro Ichikawa, Yusuke Satonaka, Tatsuki Nitta, Tomoyuki Nitta, Harumitsu Fujii, Masaki Mukai, Soichiro Horimi, Koji Makita, Masayuki Kanbara, Nobuhiko Nishio, Naokazu Yokoya
2010 conf
ACCV Workshops (2)
Maiya Hori, Hideyuki Takahashi, Masayuki Kanbara, Naokazu Yokoya
2010 J jnl
IPSJ Trans. Comput. Vis. Appl.
Norihiko Kawai, Kotaro Machikita, Tomokazu Sato, Naokazu Yokoya
2009 conf
HCI (13)
Wataru Toishita, Yutaka Momoda, Ryuhei Tenmoku, Fumihisa Shibata, Hideyuki Tamura, Takafumi Taketomi, Tomokazu Sato, Naokazu Yokoya
2009 conf
Advances in Computer Entertainment Technology
Maiya Hori, Masayuki Kanbara, Naokazu Yokoya
2009 conf
IWANN (2)
Hideki Shimada, Minoru Ikebe, Yuki Uranishi, Masayuki Kanbara, Hideki Sunahara, Naokazu Yokoya
2009 B conf
ICIP
Norihiko Kawai, Tomokazu Sato, Naokazu Yokoya
2009 J jnl
IPSJ Trans. Comput. Vis. Appl.
Naokazu Yokoya, Yasushi Yagi
2009 conf
ACCV (2)
Norihiko Kawai, Kotaro Machikita, Tomokazu Sato, Naokazu Yokoya
2009 C conf
PSIVT
Norihiko Kawai, Tomokazu Sato, Naokazu Yokoya
2009 conf
3DUI
Maiya Hori, Masayuki Kanbara, Naokazu Yokoya
2009 conf
SCIA
Yusaku Awatsu, Norihiko Kawai, Tomokazu Sato, Naokazu Yokoya
2009 A conf
ICME
Koji Makita, Masayuki Kanbara, Naokazu Yokoya
2008 conf
CIVR
Kiyoko Iwasaki, Masayuki Kanbara, Kazumasa Yamazawa, Naokazu Yokoya
2008 conf
VISAPP (1)
Norihiko Kawai, Tomokazu Sato, Naokazu Yokoya
2008 B conf
VRST
Yusuke Nakazato, Masayuki Kanbara, Naokazu Yokoya
2008 A* conf
ISMAR
Yusaku Nishina, Bunyo Okumura, Masayuki Kanbara, Naokazu Yokoya
2008 B conf
ICPR
Takafumi Taketomi, Tomokazu Sato, Naokazu Yokoya
2008 A conf
ICME
Sei Ikeda, Takafumi Taketomi, Bunyo Okumura, Tomokazu Sato, Masayuki Kanbara, Naokazu Yokoya, Kunihiro Chihara
2008 B conf
ICIP
Norihiko Kawai, Tomokazu Sato, Naokazu Yokoya
2008 conf
EGVE (Posters)
Koji Makita, Masayuki Kanbara, Naokazu Yokoya
2007 conf
3DIM
Sei Ikeda, Tomokazu Sato, Koichiro Yamaguchi, Naokazu Yokoya
2007 conf
Computational Imaging
Norihiko Kawai, Tomokazu Sato, Naokazu Yokoya
2007 conf
ICAT
Kazuki Yamanaka, Masayuki Kanbara, Naokazu Yokoya
2007 conf
SCIA
Maiya Hori, Masayuki Kanbara, Naokazu Yokoya
2007 conf
ICEIS (5)
Tomoya Ishikawa, Kazumasa Yamazawa, Naokazu Yokoya
2007 A* conf
ISMAR
Bunyo Okumura, Masayuki Kanbara, Naokazu Yokoya
2007 conf
ACCV (2)
Akihiko Iketani, Tomokazu Sato, Sei Ikeda, Masayuki Kanbara, Noboru Nakajima, Naokazu Yokoya
2006 conf
ICPR (4)
Masayuki Kanbara, Norimichi Ukita, Masatsugu Kidode, Naokazu Yokoya
2006 C conf
EGVE
Ryuhei Tenmoku, Masayuki Kanbara, Naokazu Yokoya
2006 conf
ICAT
Yusuke Nakazato, Masayuki Kanbara, Naokazu Yokoya
2006 A* conf
ISMAR
Bunyo Okumura, Masayuki Kanbara, Naokazu Yokoya
2006 conf
ACCV (1)
Yuji Yokochi, Sei Ikeda, Tomokazu Sato, Naokazu Yokoya
2006 A conf
ICME
Takashi Machida, Naokazu Yokoya, Haruo Takemura
2006 conf
SIGGRAPH Research Posters
Tomoya Ishikawa, Kazumasa Yamazawa, Naokazu Yokoya
2006 conf
ICAT
Koji Makita, Masayuki Kanbara, Naokazu Yokoya
2006 A conf
ICME
Kazumasa Yamazawa, Masaki Tawada, Naokazu Yokoya
2006 conf
ACCV (2)
Akihiko Iketani, Tomokazu Sato, Sei Ikeda, Masayuki Kanbara, Noboru Nakajima, Naokazu Yokoya
2006 Misc conf
ISWC
Akihiro Hamaguchi, Masayuki Kanbara, Naokazu Yokoya
2006 conf
ICPR (4)
Akihiko Iketani, Tomokazu Sato, Sei Ikeda, Masayuki Kanbara, Noboru Nakajima, Naokazu Yokoya
2006 conf
SIGGRAPH Sketches
Tomokazu Sato, Akihiko Iketani, Sei Ikeda, Masayuki Kanbara, Noboru Nakajima, Naokazu Yokoya
2005 conf
3DIM
Toshihiro Asai, Masayuki Kanbara, Naokazu Yokoya
2005 Misc conf
MVA
Yusuke Nakazato, Masayuki Kanbara, Naokazu Yokoya
2005 A conf
ICME
Kiyoko Iwasaki, Kazumasa Yamazawa, Naokazu Yokoya
2005 A* conf
ISMAR
Ryuhei Tenmoku, Masayuki Kanbara, Naokazu Yokoya
2005 conf
SCIA
Motoko Oe, Tomokazu Sato, Naokazu Yokoya
2005 Misc conf
MVA
Sei Ikeda, Tomokazu Sato, Masayuki Kanbara, Naokazu Yokoya
2005 conf
SCIA
Kenji Fudono, Tomokazu Sato, Naokazu Yokoya
2005 Misc conf
ISWC
Ryuhei Tenmoku, Masayuki Kanbara, Naokazu Yokoya
2005 conf
SCIA
Takashi Machida, Naokazu Yokoya, Haruo Takemura
2005 conf
CRV
Tomokazu Sato, Naokazu Yokoya
2005 A* conf
ISMAR
Tomoya Ishikawa, Kazumasa Yamazawa, Naokazu Yokoya
2005 conf
ICIP (1)
Tomoya Ishikawa, Kazumasa Yamazawa, Naokazu Yokoya
2005 Misc conf
ISWC
Yusuke Nakazato, Masayuki Kanbara, Naokazu Yokoya
2004 Misc conf
ICCVG
Toshihiro Asai, Masayuki Kanbara, Naokazu Yokoya
2004 A* conf
ISMAR
Toshihiro Asai, Masayuki Kanbara, Naokazu Yokoya
2004 conf
ICPR (4)
Sei Ikeda, Tomokazu Sato, Masayuki Kanbara, Naokazu Yokoya
2004 J jnl
Syst. Comput. Jpn.
Tomokazu Sato, Masayuki Kanbara, Naokazu Yokoya, Haruo Takemura
2004 conf
ICPR (2)
Takashi Machida, Haruo Takemura, Naokazu Yokoya
2004 Misc conf
ISWC
Yusuke Nakazato, Masayuki Kanbara, Naokazu Yokoya
2004 conf
ECCV (2)
Tomokazu Sato, Sei Ikeda, Naokazu Yokoya
2004 conf
Computational Imaging
Tomokazu Sato, Sei Ikeda, Masayuki Kanbara, Akihiko Iketani, Noboru Nakajima, Naokazu Yokoya, Keiji Yamada
2004 conf
ICPR (2)
Masayuki Kanbara, Naokazu Yokoya
2004 conf
PCM (3)
Koji Makita, Masayuki Kanbara, Naokazu Yokoya
2004 Misc conf
ICCVG
Akihiko Iketani, Tomokazu Sato, Sei Ikeda, Masayuki Kanbara, Noboru Nakajima, Naokazu Yokoya
2004 J jnl
IEICE Trans. Inf. Syst.
Steve Vallerand, Masayuki Kanbara, Naokazu Yokoya
2004 conf
PCM (3)
Kazumasa Yamazawa, Tomoya Ishikawa, Tomokazu Sato, Sei Ikeda, Yutaka Nakamura, Kazutoshi Fujikawa, Hideki Sunahara, Naokazu Yokoya
2003 conf
SCIA
Tomokazu Sato, Masayuki Kanbara, Naokazu Yokoya
2003 Misc conf
ISWC
Ryuhei Tenmoku, Masayuki Kanbara, Naokazu Yokoya
2003 A* conf
ISMAR
Ryuhei Tenmoku, Masayuki Kanbara, Naokazu Yokoya
2003 A* conf
VR
Steve Vallerand, Masayuki Kanbara, Naokazu Yokoya
2003 conf
SCIA
Kazumasa Yamazawa, Naokazu Yokoya
2003 conf
ICIP (3)
Kazumasa Yamazawa, Naokazu Yokoya
2003 J jnl
Syst. Comput. Jpn.
Hidehiko Iwasa, Nobuhiro Aihara, Naokazu Yokoya, Haruo Takemura
2003 conf
CIRA
Shinji Morita, Kazumasa Yamazawa, Naokazu Yokoya
2003 conf
SCIA
Sei Ikeda, Tomokazu Sato, Naokazu Yokoya
2003 A* conf
ICCV
Takashi Machida, Naokazu Yokoya, Haruo Takemura
2003 A* conf
ISMAR
Sei Ikeda, Tomokazu Sato, Masayuki Kanbara, Naokazu Yokoya
2002 conf
ICPR (3)
Tomokazu Sato, Masayuki Kanbara, Naokazu Yokoya, Haruo Takemura
2002 conf
Multimedia Information Systems
Noboru Babaguchi, Yoshihiko Fujimoto, Kazumasa Yamazawa, Naokazu Yokoya
2002 conf
ICPR (3)
Kaname Tomite, Kazumasa Yamazawa, Naokazu Yokoya
2002 J jnl
Int. J. Comput. Vis.
Tomokazu Sato, Masayuki Kanbara, Naokazu Yokoya, Haruo Takemura
2002 conf
ICPR (1)
Takashi Machida, Naokazu Yokoya
2002 Misc conf
MVA
Kazumasa Yamazawa, Naokazu Yokoya
2002 A* conf
ISMAR
Masayuki Kanbara, Naokazu Yokoya
2002 J jnl
Syst. Comput. Jpn.
Shinya Kadono, Minoru Etoh, Naokazu Yokoya
2002 conf
ICPR (2)
Masayuki Kanbara, Naokazu Yokoya, Haruo Takemura
2002 conf
ICME (1)
Takashi Machida, Naokazu Yokoya
2001 conf
Three-Dimensional Image Capture and Applications
Takashi Machida, Haruo Takemura, Naokazu Yokoya
2000 B conf
ICPR
Masayuki Kanbara, Haruo Takemura, Naokazu Yokoya, Hidehiko Iwasa
2000 A* conf
VR
Masayuki Kanbara, Takashi Okuma, Haruo Takemura, Naokazu Yokoya
2000 conf
ISAR
Masayuki Kanbara, Hirofumi Fujii, Haruo Takemura, Naokazu Yokoya
2000 B conf
VRST
Masatoshi Matsumiya, Haruo Takemura, Naokazu Yokoya
2000 conf
Kyoto International Conference on Digital Libraries
Hideki Sunahara, Masakazu Imai, Rei Atarashi, Hisakazu Hada, Toru Nishimura, Naokazu Yokoya, Kunihiro Chihara
2000 B conf
ICPR
J. Shimamura, Haruo Takemura, Naokazu Yokoya, Kazumasa Yamazawa
2000 C conf
IV
Akiko Tohma, Katsunori Shimohara, Yoh'ichi Tohkura, Naokazu Yokoya
2000 B conf
ICPR
Hiroshi Yoshimura, Minoru Etoh, Kenji Kondo, Naokazu Yokoya
2000 B conf
ICIP
Shinya Kadono, Minoru Etoh, Naokazu Yokoya
2000 B conf
ICPR
Takashi Okuma, Katsuhiko Sakaue, Haruo Takemura, Naokazu Yokoya
2000 B conf
ICPR
Koichiro Yamaguchi, Haruo Takemura, Kazumasa Yamazawa, Naokazu Yokoya
2000 J jnl
IEEE Multim.
Kiyoshi Kiyokawa, Haruo Takemura, Naokazu Yokoya
2000 J jnl
Syst. Comput. Jpn.
Kazumasa Yamazawa, Yoshio Onoe, Naokazu Yokoya, Haruo Takemura
1999 Misc conf
ICIAP
Hidenori Yamamoto, Hidehiko Iwasa, Naokazu Yokoya, Haruo Takemura
1999 conf
ICMCS, Vol. 1
Masayuki Kanbara, Takashi Okuma, Haruo Takemura, Naokazu Yokoya
1999 J jnl
Syst. Comput. Jpn.
Shoichi Araki, Naokazu Yokoya, Haruo Takemura
1999 conf
ICMCS, Vol. 2
Kiyoshi Kiyokawa, Haruo Takemura, Naokazu Yokoya
1998 B conf
ICPR
Kuo-Chang Hwang, Naokazu Yokoya, Haruo Takemura, Kazumasa Yamazawa
1998 conf
ACCV (1)
Atsushi Chaen, Kazumasa Yamazawa, Naokazu Yokoya, Haruo Takemura
1998 B conf
ICPR
Takashi Okuma, Kiyoshi Kiyokawa, Haruo Takemura, Naokazu Yokoya
1998 B conf
ICPR
Takahito Kawanishi, Kazumasa Yamazawa, Hidehiko Iwasa, Haruo Takemura, Naokazu Yokoya
1998 B conf
ICPR
Nobuhiro Aihara, Hidehiko Iwasa, Naokazu Yokoya, Haruo Takemura
1998 B conf
ICPR
Shoichi Araki, Takashi Matsuoka, Haruo Takemura, Naokazu Yokoya
1998 J jnl
Comput. Vis. Image Underst.
Yoshio Onoe, Kazumasa Yamazawa, Haruo Takemura, Naokazu Yokoya
1998 B conf
ICPR
Yoshio Onoe, Naokazu Yokoya, Kazumasa Yamazawa, Haruo Takemura
1997 conf
HCI (2)
Kiyoshi Kiyokawa, Haruo Takemura, Naokazu Yokoya
1997 J jnl
Syst. Comput. Jpn.
Shoichi Araki, Naokazu Yokoya, Hidehiko Iwasa, Haruo Takemura
1996 B conf
ICPR
Yumiko Tatsuno, Satoshi Suzuki, Naokazu Yokoya, Hidehiko Iwasa, Haruo Takemura
1996 B conf
ICPR
Takeshi Ogihara, Daisuke Nakamura, Naokazu Yokoya
1996 B conf
ICPR
Ryuji Funayama, Naokazu Yokoya, Hidehiko Iwasa, Haruo Takemura
1996 B conf
ICPR
Takeshi Masuda, Katsuhiko Sakaue, Naokazu Yokoya
1996 B conf
VRST
Kiyoshi Kiyokawa, Haruo Takemura, Yoshiaki Katayama, Hidehiko Iwasa, Naokazu Yokoya
1995 J jnl
Comput. Vis. Image Underst.
Takeshi Masuda, Naokazu Yokoya
1994 conf
ICIP (1)
Naokazu Yokoya
1994 J jnl
Syst. Comput. Jpn.
Kouta Fujimura, Naokazu Yokoya, Kazuhiko Yamamoto
1993 J jnl
J. Vis. Commun. Image Represent.
Kouta Fujimura, Naokazu Yokoya, Kazuhiko Yamamoto
1992 conf
ICPR (1)
Kouta Fujimura, Naokazu Yokoya, Kazuhiko Yamamoto
1992 conf
ICPR (1)
Naokazu Yokoya, Masahisa Kaneta, Kazuhiko Yamamoto
1992 conf
ICPR (1)
Naokazu Yokoya
1992 J jnl
Syst. Comput. Jpn.
Shigeru Muraki, Naokazu Yokoya, Kazuhiko Yamamoto
1990 conf
ICPR (1)
Naokazu Yokoya, Martin D. Levine
1989 J jnl
Comput. Vis. Graph. Image Process.
Naokazu Yokoya, Kazuhiko Yamamoto, Noboru Funakubo
1989 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Naokazu Yokoya, Martin D. Levine
1988 J jnl
Syst. Comput. Jpn.
Naokazu Yokoya, Kazuhiko Yamamoto, Noboru Funakubo
1984 J jnl
Pattern Recognit.
Hideyuki Tamura, Naokazu Yokoya
1983 J jnl
Comput. Vis. Graph. Image Process.
Hideyuki Tamura, Shigeyuki Sakane, Fumiaki Tomita, Naokazu Yokoya, Masahide Kaneko, Katsuhiko Sakaue
1981 J jnl
Pattern Recognit.
Tetsuo Asano, Naokazu Yokoya
redb/ingestor.py
← Index redb/ingestor.py python
"""
REDB Ingestor - Core ingestion orchestration.

This module contains the Ingestor class which orchestrates the entire
sample processing pipeline: querying catalogs, downloading from S3,
dispatching to workers, and collecting results.

The actual implementation is split across focused modules:
- redb.queries: Database query and deduplication functions
- redb.s3_utils: S3/MinIO client and file operations
- redb.workers: File processing and worker functions
- redb.logging_utils: Logging setup and ImportResult enum

For backward compatibility, all public names from these modules are
re-exported here so that `from redb.ingestor import *` continues to work.
"""
import multiprocessing
from multiprocessing import Pool
from datetime import datetime
import os
import sys
import gc
import psutil
import time
import json
import tempfile
import warnings
from urllib3.exceptions import InsecureRequestWarning
from dotenv import load_dotenv

load_dotenv(override=True)

warnings.filterwarnings("ignore", category=InsecureRequestWarning, module="urllib3")
warnings.filterwarnings("ignore", category=UserWarning, module="elasticsearch")

# =============================================================================
# Re-exports for backward compatibility
# =============================================================================
# These imports ensure that `from redb.ingestor import X` and
# `@patch('redb.ingestor.X')` continue to work after the refactor.

from redb.logging_utils import (  # noqa: F401
    ImportResult,
    FileNameFormatter,
    setup_logger,
    logger_thread,
    setup_direct_logger,
)

from redb.queries import (  # noqa: F401
    get_supported_formats,
    get_db_catalog_connection,
    fetch_s3_objects_by_repository,
    fetch_s3_objects_by_date_range,
    fetch_analyzed_samples,
    is_in_db,
    is_in_code_db,
    is_in_db_bulk,
)

from redb.s3_utils import (  # noqa: F401
    get_minio_client,
    generate_s3_key_from_hash,
    download_s3_object,
    extract_fat_slices,
)

from redb.workers import (  # noqa: F401
    process_s3_file,
    process_file,
    _process_file_internal,
    process_zip_file,
    process_7zip_file,
    process_binary_file,
    worker,
    direct_s3_worker,
    is_binary_file,
    check_dotnet,
    check_high_swap,
    get_module_by_name,
    filter_selected_modules,
    _is_packed,
)

# Re-export settings for patches like @patch('redb.ingestor.settings')
from redb import settings  # noqa: F401

# Re-export hashlib and Magika for patches like @patch('redb.ingestor.hashlib')
import hashlib  # noqa: F401
try:
    from magika import Magika  # noqa: F401
except ImportError:
    pass

# Re-export py7zr for patches like @patch('redb.ingestor.py7zr')
try:
    import py7zr  # noqa: F401
except ImportError:
    pass


class Ingestor:
    def __init__(
        self,
        path=None,
        decompile=False,
        yara_scan=False,
        with_yara=False,
        repository="",
        index_prefix="",
        selected_modules=None,
        s3_mode=False,
        s3_notes=None,
        magika_filter=None,
        s3_solo=False,
        s3_solo_hash=None,
        s3_solo_key=None,
        dry_run=False,
        force=False,
        job_id=None,
        start_date=None,
        end_date=None,
        analyzed=False,
        decompile_modules=None,
        rerun=False,
    ):

        # Set multiprocessing start method as early as possible
        try:
            multiprocessing.set_start_method('spawn', force=True)
        except RuntimeError:
            current_method = multiprocessing.get_start_method()
            if current_method != 'spawn':
                print(f"[WARNING] Multiprocessing start method is {current_method}, not 'spawn'. This may cause issues.")

        self.path = path
        self.decompile = decompile
        self.yara_scan = yara_scan
        self.with_yara = with_yara
        self.repository = repository
        self.index_prefix = index_prefix
        self.selected_modules = selected_modules
        self.s3_mode = s3_mode
        self.s3_notes = s3_notes
        self.magika_filter = magika_filter
        self.s3_solo = s3_solo
        self.s3_solo_hash = s3_solo_hash
        self.s3_solo_key = s3_solo_key
        self.dry_run = dry_run
        # --rerun implies force at the worker level: the query already selects
        # only already-disassembled samples, so the per-file is_in_code_db
        # dedup check must be skipped or every sample gets skipped.
        self.force = force or rerun
        self.job_id = job_id
        self.start_date = start_date
        self.end_date = end_date
        self.analyzed = analyzed
        self.decompile_modules = decompile_modules or {"all"}
        self.rerun = rerun

        self.manager = multiprocessing.Manager()
        self.file_type_stats = self.manager.dict()
        self.total_results = self.manager.dict({result: 0 for result in ImportResult})

        self.today = datetime.today().strftime("%Y%m%dT%H%M%S")
        log_base_path = os.getenv("LOG_FILE_PATH", "/app/logs/")
        if not log_base_path.endswith("/"):
            log_base_path += "/"
        index_suffix = self.index_prefix.upper() if self.index_prefix else "DEFAULT"
        self.log_file = log_base_path + f"{self.today}-{self.repository}-{index_suffix}.txt"

        with open(self.log_file, "a") as f:
            f.write(f"CMD: {' '.join(sys.argv)}\n")
            f.write(f"=== Ingestor started at {datetime.now()} ===\n")


    def restart_worker_pool(self):
        """Restart the worker pool to help address memory issues"""
        if hasattr(self, 'pool') and self.pool:
            try:
                print("[INFO] Restarting worker pool to address memory fragmentation")
                self.pool.close()
                self.pool.join()
                self.pool = None
            except:
                pass

        # Force garbage collection
        gc.collect(2)


    def _process_files_streaming(self, s3_files, temp_dir, total_files, parallel_proc, decompile=None):
        """Process files in a streaming fashion using direct process management."""
        import queue

        # Use the instance's decompile flag if not provided
        if decompile is None:
            decompile = self.decompile

        # Use local tracking for statistics
        completed_count = 0
        skipped_count = 0
        failed_count = 0
        correctly_processed = 0
        partially_processed = 0
        filetype_stats = {}

        # Create a result queue for workers to return their results
        result_queue = multiprocessing.Queue()

        # Create a process ID tracking dict
        active_processes = {}  # {proc_id: (process, start_time, s3_key)}

        mode_str = "decompile" if decompile else "analysis"
        print(f"[INFO] Starting streaming processing of {len(s3_files)} files with {parallel_proc} workers ({mode_str} mode)")

        # Process files
        file_index = 0
        # Use different timeouts based on mode
        if decompile:
            worker_timeout = int(os.getenv("DECOMPILE_WORKER_TIMEOUT", "2700"))
        else:
            worker_timeout = int(os.getenv("REDB_TIMEOUT", "1200"))

        # Main processing loop
        while file_index < len(s3_files) or active_processes:
            # Start new processes if we have capacity and files to process
            while len(active_processes) < parallel_proc and file_index < len(s3_files):
                s3_bucket, s3_key, first_seen = s3_files[file_index]
                file_number = file_index + 1

                # Create and start a new process
                p = multiprocessing.Process(
                    target=direct_s3_worker,
                    args=(
                        s3_bucket,
                        s3_key,
                        temp_dir,
                        decompile,  # Pass the actual decompile flag
                        self.index_prefix,
                        self.log_file,
                        file_number,
                        total_files,
                        self.selected_modules,
                        result_queue,
                        self.dry_run,
                        self.yara_scan,
                        self.with_yara,
                        self.force,
                        self.decompile_modules,
                        first_seen,
                    )
                )
                p.start()

                # Track the process
                active_processes[p.pid] = (p, time.time(), s3_key, file_number)
                file_index += 1

                # Small delay to avoid overloading
                time.sleep(0.05)

            # Check for completed processes
            try:
                # Poll the result queue with a timeout
                while True:
                    try:
                        result = result_queue.get(block=True, timeout=1)

                        # Process result
                        s3_key = result.get('s3_key')
                        status = result.get('status', 'FAILED')
                        filetype = result.get('filetype')
                        file_number = result.get('file_number')
                        worker_pid = result.get('worker_pid')

                        # Remove from active processes if present
                        if worker_pid in active_processes:
                            del active_processes[worker_pid]

                        # Update statistics
                        if status == 'CORRECTLY':
                            correctly_processed += 1
                        elif status == 'PARTIALLY':
                            partially_processed += 1
                        elif status == 'SKIPPED':
                            skipped_count += 1
                        else:  # Any other status is treated as failure
                            failed_count += 1

                        if filetype:
                            filetype_stats[filetype] = filetype_stats.get(filetype, 0) + 1

                        # Update progress
                        completed_count += 1
                        if completed_count % 50 == 0 or completed_count == 1:
                            print(f"[INFO] Completed {completed_count}/{total_files} files. Last: {s3_key}")
                            print(f"[INFO] Progress - OK: {correctly_processed}, Partial: {partially_processed}, Failed: {failed_count}, Skipped: {skipped_count}, Active: {len(active_processes)}")

                    except queue.Empty:
                        # No results in the queue, break and check for timeouts
                        break

                # Check for timed-out processes
                current_time = time.time()
                timed_out_pids = []

                for pid, (proc, start_time, s3_key, file_number) in active_processes.items():
                    runtime = current_time - start_time

                    # Check if process has exceeded timeout
                    if runtime > worker_timeout:
                        print(f"[WARNING] Process {pid} processing {s3_key} exceeded timeout ({runtime:.0f}s > {worker_timeout}s)")

                        # Terminate the process
                        try:
                            proc.terminate()
                            time.sleep(0.1)  # Give it a moment to terminate
                            if proc.is_alive():
                                # If still alive, force kill
                                proc.kill()
                        except:
                            pass

                        # Clean up any child processes
                        try:
                            parent = psutil.Process(pid)
                            for child in parent.children(recursive=True):
                                try:
                                    child.kill()
                                except:
                                    pass
                        except:
                            pass

                        # Mark as failed
                        failed_count += 1
                        completed_count += 1
                        timed_out_pids.append(pid)

                    # Check if process has terminated without returning a result
                    elif not proc.is_alive():
                        print(f"[WARNING] Process {pid} processing {s3_key} terminated without result")

                        # Mark as failed
                        failed_count += 1
                        completed_count += 1
                        timed_out_pids.append(pid)

                # Remove timed-out processes from tracking
                for pid in timed_out_pids:
                    if pid in active_processes:
                        del active_processes[pid]

                # Sleep briefly to avoid hogging CPU
                time.sleep(0.1)

            except Exception as e:
                print(f"[ERROR] Exception in main processing loop: {e}")
                time.sleep(1)  # Sleep to avoid tight loop on error

        # Set final results in the shared dictionaries
        self.total_results[ImportResult.CORRECTLY] = correctly_processed
        self.total_results[ImportResult.PARTIALLY] = partially_processed
        self.total_results[ImportResult.FAILED] = failed_count
        self.total_results[ImportResult.SKIPPED] = skipped_count

        for filetype, count in filetype_stats.items():
            self.file_type_stats[filetype] = count

        print(f"[INFO] Streaming processing completed. Processed {completed_count}/{total_files} files.")

        # Final cleanup
        killed = self._kill_all_python_processes()
        if killed > 0:
            print(f"[INFO] Killed {killed} lingering processes during final cleanup")


    def _kill_all_python_processes(self):
        """Kill all python worker processes."""
        killed_count = 0
        for proc in psutil.process_iter(['pid', 'name', 'cmdline']):
            try:
                if proc.info['name'] == 'python' and proc.info['cmdline']:
                    # Check if it's one of our processes
                    is_worker = False
                    for cmd in proc.info['cmdline']:
                        if 'deploy/redb/venv312bin/python' in cmd and 'multiprocessing' in cmd:
                            is_worker = True
                            break

                    if is_worker:
                        try:
                            proc.kill()
                            killed_count += 1
                        except Exception as e:
                            print(f"[ERROR] Failed to kill process {proc.info['pid']}: {e}")
            except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
                pass

        if killed_count > 0:
            print(f"[INFO] Killed {killed_count} python processes during cleanup")

        return killed_count


    def ingest(self):
        general_start_time = time.time()
        BATCH_SIZE = int(os.getenv("BATCH_SIZE", 1000))
        pool = None

        try:
            # Handle S3-solo mode
            if self.s3_solo:
                # Create a temporary directory for S3 downloads
                with tempfile.TemporaryDirectory() as temp_dir:
                    s3_bucket = os.getenv('S3_BUCKET')
                    if not s3_bucket:
                        print("[ERROR] S3_BUCKET environment variable is required for S3-solo mode")
                        return

                    # Use the provided S3 key directly (supports both sharded and private paths)
                    s3_key = self.s3_solo_key
                    print(f"[INFO] S3-solo mode: processing {s3_bucket}/{s3_key}")
                    print(f"[INFO] Extracted hash: {self.s3_solo_hash}")

                    # Fetch first_seen from catalog_samples
                    first_seen = None
                    try:
                        client = get_db_catalog_connection()
                        result = client.query(
                            "SELECT first_seen FROM catalog_samples WHERE sha256 = %(hash)s LIMIT 1",
                            parameters={"hash": self.s3_solo_hash}
                        )
                        if result.result_rows:
                            first_seen = result.result_rows[0][0]
                            print(f"[INFO] first_seen from catalog: {first_seen}")
                        else:
                            print(f"[INFO] No catalog entry found, first_seen will default to epoch zero")
                        client.close()
                    except Exception as e:
                        print(f"[WARNING] Could not fetch first_seen from catalog: {e}")

                    # Process single S3 file directly
                    result = process_s3_file(
                        s3_bucket,
                        s3_key,
                        temp_dir,
                        self.decompile,
                        self.index_prefix,
                        self.log_file,
                        1,  # file_number
                        1,  # total_files
                        selected_modules=self.selected_modules,
                        dry_run=self.dry_run,
                        yara_scan=self.yara_scan,
                        with_yara=self.with_yara,
                        force=self.force,
                        decompile_modules=self.decompile_modules,
                        first_seen=first_seen,
                    )

                    if result:
                        print(f"[INFO] S3-solo processing completed successfully")
                    else:
                        print(f"[ERROR] S3-solo processing failed")

                    return

            # Handle S3 bulk mode
            elif self.s3_mode:
                # Create a temporary directory for S3 downloads
                with tempfile.TemporaryDirectory() as temp_dir:
                    # Query catalog for S3 objects based on mode
                    if self.start_date and self.end_date:
                        # Date-based query: join catalog_samples with repository_upload_sessions
                        print(f"[INFO] Querying samples by date range: {self.start_date} to {self.end_date}")
                        # Pass repository as None if it's a default placeholder (not a real repo name)
                        repo_filter = self.repository if self.repository not in ("date-range", "analyzed") else None
                        catalog_entries = fetch_s3_objects_by_date_range(
                            index_prefix=self.index_prefix,
                            decompile=self.decompile,
                            start_date=self.start_date,
                            end_date=self.end_date,
                            repository=repo_filter,
                            notes=self.s3_notes,
                            magika_filter=self.magika_filter,
                            yara_scan=self.yara_scan,
                            force=self.force,
                            analyzed=self.analyzed
                        )
                        date_info = f" from {self.start_date} to {self.end_date}"
                    elif self.analyzed:
                        # Analyzed mode (standalone, no date filter): query basic_properties for already-analyzed samples
                        print(f"[INFO] Querying already-analyzed samples from {self.index_prefix}_basic_properties")
                        catalog_entries = fetch_analyzed_samples(
                            index_prefix=self.index_prefix,
                            decompile=self.decompile,
                            magika_filter=self.magika_filter,
                            yara_scan=self.yara_scan,
                            force=self.force,
                            rerun=self.rerun
                        )
                        date_info = ""
                    else:
                        # Repository-based query: direct query to repository_upload_sessions
                        catalog_entries = fetch_s3_objects_by_repository(
                            self.repository,
                            self.index_prefix,
                            self.decompile,
                            self.s3_notes,
                            self.magika_filter,
                            self.yara_scan,
                            self.force
                        )
                        date_info = ""

                    if not catalog_entries:
                        print(f"[INFO] No files found for repository: {self.repository}{date_info}" +
                              (f" with notes: {self.s3_notes}" if self.s3_notes else ""))
                        return

                    # Extract S3 bucket, keys, and first_seen
                    s3_files = []
                    for entry in catalog_entries:
                        s3_bucket = entry.get('s3_bucket')
                        s3_key = entry.get('s3_key')
                        first_seen = entry.get('first_seen')
                        if s3_bucket and s3_key:
                            s3_files.append((s3_bucket, s3_key, first_seen))

                    total_files = len(s3_files)
                    num_cores = multiprocessing.cpu_count()
                    parallel_proc = num_cores - 1

                    if self.decompile:
                        if self.magika_filter == 'apk':
                            parallel_proc = num_cores - 1
                            print(f"[INFO] Using decompile mode (APK) with {parallel_proc} parallel processes")
                        else:
                            parallel_proc = max(1, int((num_cores - 1) / 2))
                            print(f"[INFO] Using decompile mode with {parallel_proc} parallel processes")
                    else:
                        print(f"[INFO] Using analysis mode with {parallel_proc} parallel processes")

                    # Use streaming approach for both decompile and non-decompile cases
                    self._process_files_streaming(s3_files, temp_dir, total_files, parallel_proc, self.decompile)
            else:
                # Original file/directory processing logic
                if os.path.isfile(self.path):
                    # Check if it's a text file containing paths
                    if self.path.endswith('.txt'):
                        try:
                            with open(self.path, 'r') as f:
                                files = [line.strip() for line in f
                                    if line.strip() and not os.path.basename(line.strip()).startswith('.')]
                        except Exception as e:
                            print(f"[ERR] Failed to read file list from {self.path}: {str(e)}")
                            return
                    else:
                        files = [self.path]
                elif os.path.isdir(self.path):
                    files = [
                        os.path.join(root, file)
                        for root, dirs, files_list in os.walk(self.path)
                        for file in files_list
                        if not file.startswith('.')
                    ]
                else:
                    print(f"[ERR] Invalid path: {self.path}")
                    return

                total_files = len(files)
                num_cores = multiprocessing.cpu_count()
                parallel_proc = num_cores - 1
                if self.decompile:
                    if self.magika_filter == 'apk':
                        parallel_proc = num_cores - 1
                    else:
                        parallel_proc = int(num_cores/2)
                print(f"Number of CPU cores: {num_cores}")
                print(f"Number of parallel processes: {parallel_proc}")

                # Process files in batches
                for i in range(0, len(files), BATCH_SIZE):
                    batch_files = files[i:i + BATCH_SIZE]
                    batch_start = i
                    print(f"\nProcessing batch {i//BATCH_SIZE + 1}/{(len(files) + BATCH_SIZE - 1)//BATCH_SIZE}")
                    pool = None
                    try:
                        pool = Pool(processes=parallel_proc)
                        batch_results = pool.map(
                            worker,
                            [
                                (
                                    f,
                                    self.decompile,
                                    self.index_prefix,
                                    self.log_file,
                                    batch_start + idx + 1,
                                    total_files,
                                    self.selected_modules,
                                    self.dry_run,
                                    self.yara_scan,
                                    self.with_yara,
                                    self.force,
                                    self.decompile_modules,
                                )
                                for idx, f in enumerate(batch_files)
                            ],
                        )

                        # Update statistics for this batch
                        for result, filetype in batch_results:
                            if result is not None:
                                self.total_results[result] += 1
                            if filetype:
                                self.file_type_stats[filetype] = (
                                    self.file_type_stats.get(filetype, 0) + 1
                                )

                    finally:
                        # Properly close the pool after each batch
                        if pool:
                            try:
                                pool.close()
                                pool.join()
                                pool = None
                                gc.collect()
                            except Exception as e:
                                print(f"[ERROR] Error cleaning up pool: {e}")
                                try:
                                    pool.terminate()
                                    pool.join()
                                except:
                                    pass
                                pool = None
                                gc.collect()

                        if check_high_swap():
                            print("[INFO] High swap detected, restarting pool")
                            self.restart_worker_pool()

                            gc.collect(2)

                            # Create a fresh pool
                            self.pool = Pool(processes=parallel_proc)

                        # Export strings after each batch
            general_end_time = time.time()
            general_elapsed_time = general_end_time - general_start_time
            general_elapsed_time_pretty = time.strftime("%H:%M:%S", time.gmtime(general_elapsed_time))

            summary = (
                f"\n\nIngestion finished for {self.path}."
                f"\nTime required: {general_elapsed_time_pretty}"
                f"\nResults:"
                f"\n- Total analyzed: {sum(self.total_results.values())}"
                f"\n- Correctly imported: {self.total_results[ImportResult.CORRECTLY]}"
                f"\n- Partially imported: {self.total_results[ImportResult.PARTIALLY]}"
                f"\n- Failed: {self.total_results[ImportResult.FAILED]}"
                f"\n- Skipped: {self.total_results[ImportResult.SKIPPED]}"
                f"\n\nFiletype stats:\n{json.dumps(dict(self.file_type_stats))}\n"
            )

            with open(self.log_file, "a") as f:
                f.write(summary)

            print("Ingestion completed. Check the log file for details.")
            print(summary)

        finally:
            try:
                self._kill_all_python_processes()
            except Exception as e:
                print(f"[ERROR] Error in final cleanup: {e}")

            try:
                gc.collect(2)
            except Exception as e:
                print(f"[ERROR] Final garbage collection error: {e}")