<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Computer Vision Archives - Structilmy</title>
	<atom:link href="https://structilmy.com/blog/category/artificial-intelligence/computer-vision/feed/" rel="self" type="application/rss+xml" />
	<link>https://structilmy.com/category/artificial-intelligence/computer-vision/</link>
	<description>Tutorial, Catatan, Dokumentasi</description>
	<lastBuildDate>Wed, 18 Jan 2023 19:30:36 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>https://i0.wp.com/structilmy.com/wp-content/uploads/2019/01/cropped-favs.png?fit=32%2C32&#038;ssl=1</url>
	<title>Computer Vision Archives - Structilmy</title>
	<link>https://structilmy.com/category/artificial-intelligence/computer-vision/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">165056026</site>	<item>
		<title>Belajar Ragam Strategi Deep Learning dengan CIFAR10 Dataset</title>
		<link>https://structilmy.com/blog/2023/01/19/belajar-ragam-strategi-deep-learning-dengan-cifar10-dataset/</link>
					<comments>https://structilmy.com/blog/2023/01/19/belajar-ragam-strategi-deep-learning-dengan-cifar10-dataset/#comments</comments>
		
		<dc:creator><![CDATA[Rian Adam]]></dc:creator>
		<pubDate>Wed, 18 Jan 2023 23:28:00 +0000</pubDate>
				<category><![CDATA[Computer Vision]]></category>
		<category><![CDATA[Deep Learning]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[pytorch]]></category>
		<guid isPermaLink="false">https://structilmy.com/?p=3944</guid>

					<description><![CDATA[Semester lalu di salah satu tugas kuliah Computer Vision, kita diminta untuk membuat model CNN dengan dataset CIFAR10. Awalnya ngira ini kayak MNIST dataset yang satset train nggak sampai 10 epoch dapet akurasi >90%. Ternyata dataset ini lebih kompleks. Menariknya, dari satu tugas sederhana ini, Pak Dosen mengenalkan para mahasiswa tentang beragam strategi di deep [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Semester lalu di salah satu tugas kuliah Computer Vision, kita diminta untuk membuat model CNN dengan dataset CIFAR10. Awalnya ngira ini kayak MNIST dataset yang <em>satset </em>train nggak sampai 10 epoch dapet akurasi >90%. Ternyata dataset ini lebih kompleks. Menariknya, dari satu tugas sederhana ini, Pak Dosen mengenalkan para mahasiswa tentang beragam strategi di deep learning.</p>



<p class="wp-block-paragraph">Di tutorial ini kita akan coba membuat model machine learning untuk dataset CIFAR10. Kita akan buat modelnya dari <em>scratch </em>menggunakan PyTorch dan tidak menggunakan pre-trained model agar kita bisa lebih dalam memahami apa yang terjadi. Kita juga akan menarget (sebagai tantangan) untuk mendapatkan akurasi >85% dalam 40 epoch.</p>



<p class="wp-block-paragraph"><strong>Source code tutorial ini tersedia</strong> dalam <a href="https://colab.research.google.com/drive/1zTeZMv5760tZPAthpXGjsha72g_fzUTx?usp=sharing">bentuk Google Colab di sini</a> (akan terus dilengkapi komentar dan catatan pada notebook tersebut)</p>



<p class="wp-block-paragraph"><strong>Catatan</strong>: Artikel ini <strong>tidak </strong>membahas dasar-dasar deep learning menggunakan PyTorch. Bagi yang ingin tahu dasar deep learning atau dasar PyTorch bisa mengunjungi artikel terkait di blog ini:</p>



<ul class="wp-block-list">
<li><a href="https://structilmy.com/blog/2019/09/02/sekilas-tentang-jaringan-saraf-tiruan-dan-deep-learning/" target="_blank" rel="noreferrer noopener">Jaringan Saraf Tiruan dan Deep Learning</a></li>



<li><a href="https://structilmy.com/blog/2019/07/11/tutorial-dasar-pytorch-tensor-dan-autograd/">Tutorial dasar Pytorch</a></li>



<li><a href="https://structilmy.com/blog/2020/02/04/implementasi-jaringan-saraf-tiruan-menggunakan-pytorch/" target="_blank" rel="noreferrer noopener">Jaringan Saraf Tiruan menggunakan Pytorch</a></li>



<li><a href="https://structilmy.com/blog/2019/07/17/convolutional-neural-network-cnn-menggunakan-pytorch/">CNN menggunakan Pytorch</a></li>
</ul>



<h2 class="wp-block-heading">CIFAR10 Dataset</h2>



<p class="wp-block-paragraph"><a href="https://www.cs.toronto.edu/~kriz/cifar.html" rel="nofollow">Dataset CIFAR10</a> adalah dataset citra berukuran 32&#215;32 pixel berwarna. Sesuai namanya, CIFAR10 terdiri dari 10 kelas (kucing, burung, &#8230;, kapal). Jelas dataset ini berbeda dari MNIST yang hanya hitam putih. Selain itu jika dilihat di paper-paper, rata-rata akurasi yang diperoleh untuk CIFAR10 adalah sekitar 92% (dibanding MNIST yang bisa sampai &gt;98%). Meskipun begitu, dataset ini masih tergolong mudah dan cocok untuk buat latihan klasifikasi citra. Dataset CIFAR10 bisa didownload langsung menggunakan perintah dari PyTorch.</p>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="en" dir="ltr">The &quot;Hello World&quot;s of machine learning:<br><br>2015: RandomForestClassifier on Iris<br>2017: MLP on MNIST<br>2019: AlexNet on Cifar-10<br>2022: DistilBERT on IMDb movie reviews</p>&mdash; Sebastian Raschka (@rasbt) <a href="https://twitter.com/rasbt/status/1607465797240201223?ref_src=twsrc%5Etfw">December 26, 2022</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</div><figcaption class="wp-element-caption">Sebastian Raschka, machine learning researcher yang bukunya cukup populer, juga berpendapat CIFAR10 termasuk salah satu dataset yang cocok untuk latihan.</figcaption></figure>



<span id="more-3944"></span>



<h2 class="wp-block-heading">1. Arsitektur Dasar</h2>



<p class="wp-block-paragraph">Untuk arsitektur dasar, kita akan membuat CNN sederhana yang terdiri dari 3 layer konvolusi dan 2 fully connected layer. Tapi sebelumnya, langkah pertama kita adalah download dan normalisasi dataset terlebih dahulu.</p>



<h3 class="wp-block-heading">Data Preparation</h3>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># dataset transform functions
train_transform = transforms.Compose(
    [transforms.ToTensor(), # convert image to tensor
     transforms.Normalize((0.4914, 0.4822, 0.4465), (0.247, 0.243, 0.261))]) # normalization
    
test_transform = transforms.Compose(
    [transforms.ToTensor(), # convert image to tensor
     transforms.Normalize((0.4914, 0.4822, 0.4465), (0.247, 0.243, 0.261))]) # normalization

# download dataset
train_set = datasets.CIFAR10("cifar10", train=True, download=True, transform=train_transform)
test_set = datasets.CIFAR10("cifar10", train=False, download=True, transform=test_transform)

# create pytorch data loader
# we set 256 images for a single batch
train_loader = torch.utils.data.DataLoader(train_set, batch_size=256, shuffle=True) 
test_loader = torch.utils.data.DataLoader(test_set, batch_size=256, shuffle=True)  </pre>



<p class="wp-block-paragraph">Karena dataset ini berukuran tidak terlalu besar, kita akan menggunakan batch size yang cukup besar, yakni 256 gambar, dalam sekali training, harapannya model bisa lebih cepet optimal. Kita juga normalisasi data CIFAR10 menggunakan <a href="https://github.com/kuangliu/pytorch-cifar/issues/19" target="_blank" rel="noreferrer noopener nofollow">rekomendasi yang ada di sini.</a></p>



<h3 class="wp-block-heading">Arsitektur</h3>



<p class="wp-block-paragraph">Arsitektur dasar yang kita buat kira-kira seperti ini jika dituliskan dalam kode Pytorch:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 128, kernel_size=3, stride=1, padding=1) 
        self.conv2 = nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1)
        self.conv3 = nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1) 
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
        self.do = nn.Dropout() # dropout layer
        self.fc1 = nn.Linear(4096, 1024) 
        self.fco = nn.Linear(1024, 10)  
    
    def forward(self, x): # forward propagation
        batch_size = x.shape[0]
        x = self.pool(torch.relu(self.conv1(x)))
        x = self.pool(torch.relu(self.conv2(x)))
        x = self.pool(torch.relu(self.conv3(x)))
        x = x.reshape(batch_size, -1)       
        x = self.do(torch.relu(self.fc1(x))) # dropout layer
        x = self.fco(x) 
        return x</pre>



<p class="wp-block-paragraph">Atau seperti ini jika <a href="http://alexlenail.me/NN-SVG/AlexNet.html">divisualisasikan</a>:</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img data-recalc-dims="1" fetchpriority="high" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2023/01/image-3.png?resize=552%2C173&#038;ssl=1" alt="" class="wp-image-3972" width="552" height="173" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2023/01/image-3.png?resize=1024%2C323&amp;ssl=1 1024w, https://i0.wp.com/structilmy.com/wp-content/uploads/2023/01/image-3.png?resize=300%2C95&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2023/01/image-3.png?resize=768%2C242&amp;ssl=1 768w, https://i0.wp.com/structilmy.com/wp-content/uploads/2023/01/image-3.png?w=1182&amp;ssl=1 1182w" sizes="(max-width: 552px) 100vw, 552px" /></figure>
</div>


<p class="wp-block-paragraph">Jika diperhatikan, ada beberapa catatan pada arsitektur tersebut:</p>



<ol class="wp-block-list">
<li><strong>Jumlah feature map yang kita gunakan cukup besar</strong>, yakni 128 pada konvolusi pertama dan 256 pada konvolusi kedua dan ketiga. Hal ini mengingat CIFAR10 dataset yang lebih kompleks dibanding MNIST dan kita menarget untuk mendapat akurasi &gt;85% dalam waktu singkat, karenanya walau arsitektur dasar, tapi akan kita buat cukup besar.</li>



<li><strong>Terdapat layer dropout</strong> pada salah satu fully-connected layer, hal ini bertujuan untuk mengurangi overfitting model deep learning.</li>
</ol>



<h3 class="wp-block-heading">Optimizer</h3>



<p class="wp-block-paragraph">Selanjutnya kita train model tersebut selama 40 epoch menggunakan Stochastic Gradient Descent (SGD) dengan learning rate 0.01, lalu kita tambahkan momentum 0.9, weight decay 0.0005 dan juga menggunakan learning rate scheduler, Cosine Annealing. Apa maksud setiap pengaturan itu? kita bahas satu-satu</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">epoch = 40 
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9, weight_decay=0.0005) 
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=epoch)</pre>



<h5 class="wp-block-heading">Momentum</h5>



<p class="wp-block-paragraph">Penggunaan momentum pada SGD seperti memberi &#8220;dorongan&#8221; agar model optimal lebih cepat. <a href="https://pytorch.org/docs/stable/generated/torch.optim.SGD.html" target="_blank" rel="noreferrer noopener nofollow">Pada Pytorch</a>, rumus SGD akan berubah menjadi seperti ini jika menggunakan momentum:</p>



<p class="wp-block-paragraph">$$ \theta_t = \theta_{t-1} &#8211; \alpha (\mu g_{t-1} + g_t) $$</p>



<p class="wp-block-paragraph">$\theta$ adalah parameter (bobot / bias model), $\alpha$ adalah learning rate, $g_t$ adalah nilai turunan eror terhadap parameter, dan $\mu$ adalah nilai momentum. Bayangkan kita sedang menuruni gunung, ketika kemiringan tanahnya curam, maka kita akan turun lebih cepat dibanding di tanah landai, kan? Dengan memperhatikan nilai turunan eror pada iterasi sebelumnya ($g_{t-1}$), optimizer akan memperhatikan kecuraman eror yang bisa mengantarkan kita ke titik optimal lebih cepat.</p>



<h5 class="wp-block-heading">Weight decay</h5>



<p class="wp-block-paragraph">Weight decay bermanfaat sebagai pencegah overfitting. Weight decay menambahkan syarat, selain meminimalkan eror, optimizer juga harus meminimalkan nilai parameter modelnya (nilai bobot/biasnya, $\theta$). Rumus SGD akan menjadi seperti ini, dengan $\lambda$ adalah nilai parameter weight decay:</p>



<p class="wp-block-paragraph">$$ \theta_t = \theta_{t-1} &#8211; \alpha (\mu g_{t-1} + g_t + \lambda \theta_{t-1}) $$</p>



<p class="wp-block-paragraph">Dengan memiliki nilai bobot yang kecil, harapannya model akan menjadi tidak terlalu kompleks.</p>



<h5 class="wp-block-heading">Learning rate scheduler</h5>



<p class="wp-block-paragraph">LR scheduler berfungsi untuk mengubah-ubah nilai learning rate pada saat proses training. Pada tutorial ini kita menggunakan metode Cosine Annealing yang membuat proses pengubahan learning rate layaknya fungsi cosine (bisa naik-turun). Pada kode di atas, untuk menginisiasi scheduler kita perlu menambahkan dua parameter, yakni optimizer mana yang akan diupdate learning ratenya, dan juga T_max, yakni seberapa lama learning rate akan naik/turun sebelum dia akhirnya berubah arahnya (Dari turun jadi naik, dan sebaliknya). Tutorial ini menggunakan T_max=epoch, yakni 40, sehingga learning rate akan terus turun hingga akhir pelatihan. <a href="https://www.kaggle.com/code/isbhargav/guide-to-pytorch-learning-rate-scheduling#6.-CosineAnnealingLR" target="_blank" rel="noreferrer noopener nofollow">Kalian bisa cek bacaan menarik tentang LR Scheduler di sini</a>. </p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img data-recalc-dims="1" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2023/01/image.png?resize=326%2C238&#038;ssl=1" alt="" class="wp-image-3960" width="326" height="238" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2023/01/image.png?w=565&amp;ssl=1 565w, https://i0.wp.com/structilmy.com/wp-content/uploads/2023/01/image.png?resize=300%2C219&amp;ssl=1 300w" sizes="(max-width: 326px) 100vw, 326px" /><figcaption class="wp-element-caption">Perubahan learning rate dari epoch ke 0 hingga 40. Dari nilai awal 0.01 menjadi 0.</figcaption></figure>
</div>


<h3 class="wp-block-heading">Hasil = 80.89%</h3>



<p class="wp-block-paragraph">Setelah kita train selama 40 epoch (source code training standard bisa cek di colab), akurasi 80.89% saya peroleh untuk model basic ini untuk data test. Not bad!</p>



<h2 class="wp-block-heading">2. Batch Normalization</h2>



<p class="wp-block-paragraph">Optimasi yang pertama akan kita lakukan adalah kita akan menambahkan batch normalization pada model. Apa itu batch normalization?</p>



<p class="wp-block-paragraph">Kita mungkin tahu normalization (normalisasi) adalah teknik untuk mengubah nilai atau skala pada data tanpa menghilangkan informasi antardatanya. Normalisasi biasanya kita lakukan di awal, sebelum data masuk ke model machine learning dengan tujuan memudahkan model untuk menemukan pola pada data. Nah, Batch normalization itu konsepnya sama seperti normalisasi biasanya hanya saja kita lakukan pada tengah-tengah layer. Detail penjelasannya bisa agak panjang, <a href="https://towardsdatascience.com/batch-norm-explained-visually-how-it-works-and-why-neural-networks-need-it-b18919692739" target="_blank" rel="noreferrer noopener nofollow">blog menarik untuk dibaca tentang batch norm ada di sini</a>.</p>



<h3 class="wp-block-heading">Penambahan</h3>



<p class="wp-block-paragraph">Penambahan terdapat pada arsitektur model sehingga tertulis seperti di bawah ini. Karena kita menggunakan CNN, kita gunakan BatchNorm2D yang akan menormalisasi pada setiap channel/feature map. Karenanya, untuk setiap inisiasi kita tambahkan parameter jumlah feature map yang diterima batch norm.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 128, kernel_size=3, stride=1, padding=1) 
        self.conv2 = nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1)
        self.conv3 = nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1)
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2) 
        self.do = nn.Dropout() 

        self.conv1_bn = nn.BatchNorm2d(128) # initiating batch norm
        self.conv2_bn = nn.BatchNorm2d(256) # initiating batch norm
        self.conv3_bn = nn.BatchNorm2d(256) # initiating batch norm
        
        self.fc1 = nn.Linear(4096, 1024) 
        self.fco = nn.Linear(1024, 10) 
    
    def forward(self, x): 
        batch_size = x.shape[0]
        x = self.pool(torch.relu(self.conv1_bn(self.conv1(x)))) # batch norm
        x = self.pool(torch.relu(self.conv2_bn(self.conv2(x)))) # batch norm
        x = self.pool(torch.relu(self.conv3_bn(self.conv3(x)))) # batch norm
        x = x.reshape(batch_size, -1)        
        x = self.do(torch.relu(self.fc1(x))) 
        x = self.fco(x) 
        return x</pre>



<p class="wp-block-paragraph">Sama seperti normalisasi yang dilakukan di awal, biasanya kita mengubah rentang nilai data sehingga memiliki rata-rata 0 dan standar deviasi 1. Pada batch norm, setial layer batch norm akan menormalisasi sehingga memiliki rata-rata dan standar deviasi tertentu. Nilai ini ditentukan selama proses training. Karenanya perlu diingat:</p>



<ol class="wp-block-list">
<li>Batch norm tiap layer harus diinisasi sendiri-sendiri</li>



<li>Pastikan gunakan mode <code data-enlighter-language="generic" class="EnlighterJSRAW">.train()</code> dan <code data-enlighter-language="generic" class="EnlighterJSRAW">.eval()</code> agar batch norm tahu kita sedang training atau testing. (cek kode)</li>
</ol>



<h3 class="wp-block-heading">Hasil = 83.63%</h3>



<p class="wp-block-paragraph">Naik 3%! yey!</p>



<h2 class="wp-block-heading">3. Residual Connection</h2>



<p class="wp-block-paragraph">Salah satu pengubahan arsitektur yang cukup sederhana adalah dengan menambahkan residual connection. Residual connection ini diusulkan dan menjadi dasar dari model yang cukup populer yakni ResNet. Idenya dengan &#8220;menghubungkan&#8221; output suatu layer dengan output dari beberapa layer sebelumnya. Proses &#8220;menghubungkan&#8221; ini biasanya dilakukan hanya dengan menggunakan penjumlahan kedua tensor. </p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><a href="https://paperswithcode.com/method/residual-connection" target="_blank" rel="noreferrer noopener"><img data-recalc-dims="1" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2023/01/image-1.png?resize=354%2C195&#038;ssl=1" alt="" class="wp-image-3969" width="354" height="195" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2023/01/image-1.png?resize=1024%2C568&amp;ssl=1 1024w, https://i0.wp.com/structilmy.com/wp-content/uploads/2023/01/image-1.png?resize=768%2C426&amp;ssl=1 768w, https://i0.wp.com/structilmy.com/wp-content/uploads/2023/01/image-1.png?zoom=2&amp;resize=354%2C195&amp;ssl=1 708w" sizes="(max-width: 354px) 100vw, 354px" /></a><figcaption class="wp-element-caption">Ilustrasi residual connection (credits to <a href="https://paperswithcode.com/method/residual-connection" target="_blank" rel="noreferrer noopener nofollow">pwc</a>)</figcaption></figure>
</div>


<p class="wp-block-paragraph">Tujuan dari residual connection adalah untuk memudahkan ketika proses update model / backpropagatoin. Gradient yang dihitung saat backpropagation akan bisa melewati atau menskip beberapa layer. Sehingga bisa terhindar dari vanishing atau exploding gradient.</p>



<h3 class="wp-block-heading">Penambahan</h3>



<p class="wp-block-paragraph">penambahan terdapat pada arsitektur model sehingga tertulis seperti ini:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 128, kernel_size=3, stride=1, padding=1)
        self.conv2 = nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1)
        self.conv3 = nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1)
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2) 
        self.do = nn.Dropout() 

        self.conv1_bn = nn.BatchNorm2d(128) 
        self.conv2_bn = nn.BatchNorm2d(256) 
        self.conv3_bn = nn.BatchNorm2d(256) 
        
        self.fc1 = nn.Linear(4096, 1024) 
        self.fco = nn.Linear(1024, 10)  
    
    def forward(self, x):
        batch_size = x.shape[0]
        x = self.pool(torch.relu(self.conv1_bn(self.conv1(x)))) 
        x = self.pool(torch.relu(self.conv2_bn(self.conv2(x))))
        x = self.pool(x + torch.relu(self.conv3_bn(self.conv3(x)))) # residual connection
        x = x.reshape(batch_size, -1)        
        x = self.do(torch.relu(self.fc1(x)))
        x = self.fco(x)
        return x</pre>



<p class="wp-block-paragraph">residual connection hanya bisa dilakukan (setidaknya dengan mudah) pada layer yang memiliki output ukluran yang sama. Sehingga kita hanya gunakan pada satu layer, yakni pada proses konvolusi pada layer <code data-enlighter-language="generic" class="EnlighterJSRAW">conv3</code> dengan menambahkan input sebelum proses konvolusi sebagai residual.</p>



<h3 class="wp-block-heading">Hasil = 83.38%</h3>



<p class="wp-block-paragraph">Hmm, kok turun sedikit? bisa jadi memang tidak ngefek? tapi kalau kita cek akurasi pada data train, akurasi data train menurut agak banyak jadi sekitar 97% (sebelumnya 99%), kalau ini berarti model kita jadi &#8220;sedikit&#8221; tidak overfitting sepertinya ini pertanda bagus, kita lanjutkan dulu.</p>



<h2 class="wp-block-heading">4. Data Augmentation</h2>



<p class="wp-block-paragraph">Data augmentation adalah trik yang digunakan dengan cara membuat data latih yang lebih variatif. Kita akan memodifikasi data latih CIFAR10 dan harapannya bisa membuat model lebih memahami pola pada gambar. Metode ini sering digunakan khususnya ketika dataset yang kita miliki jumlahnya sedikit atau kurang variatif.</p>



<h3 class="wp-block-heading">Penambahan</h3>



<p class="wp-block-paragraph">penambahan terdapat pada proses transormasi data sehingga tertulis seperti ini:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">train_transform = transforms.Compose(
    [transforms.RandomCrop(32, padding=4), # data augmentation
     transforms.RandomHorizontalFlip(),    # data augmentation
     transforms.ToTensor(),
     transforms.Normalize((0.4914, 0.4822, 0.4465), (0.247, 0.243, 0.261))]) # normalization</pre>



<p class="wp-block-paragraph">Kita hanya menambahkan augmentasi pada saat train, jadi yang kita ubah hanya <code data-enlighter-language="generic" class="EnlighterJSRAW">train_transform</code>. Pada kode di atas kita menambahkan dua metode augmentasi. Yang pertama, adalah random crop dengan padding, ini seperti kita tambahkan bingkai 4 pixel mengelilingi gambar lalu secara acak kita akan buat kotak berukuran 32&#215;32 untuk dicrop. Hasilnya nanti gambar akan seakan tergeser (cek ilustrasi di bawah). Metode augmentasi yang kedua adalah secara acak beberapa gambar akan di flip horizontal.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2023/01/g426-3.png?resize=310%2C76&#038;ssl=1" alt="CIFAR10 random crop" class="wp-image-3965" width="310" height="76" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2023/01/g426-3.png?w=513&amp;ssl=1 513w, https://i0.wp.com/structilmy.com/wp-content/uploads/2023/01/g426-3.png?resize=300%2C74&amp;ssl=1 300w" sizes="auto, (max-width: 310px) 100vw, 310px" /><figcaption class="wp-element-caption">di-<em>padding </em>(biru) lalu di random crop</figcaption></figure>
</div>


<h3 class="wp-block-heading">Hasil = 83.8%</h3>



<p class="wp-block-paragraph">Akurasinya sudah agak naik sedikit, dan akurasi data train turun banyak jadi sekitar 82% ini berarti model kita jadi &#8220;lebih&#8221; tidak overfitting lagi. Ini pertanda bagus <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<h2 class="wp-block-heading">5. Tambah Layer</h2>



<p class="wp-block-paragraph">Terakhir, kita akan coba menambah kedalaman model kita dengan menambah satu layer konvolusi. FYI, model-model besar seperti ResNet, AlexNet, dkk yang paling sederhana biasanya terdiri dari &gt;10 layer (bahkan hingga ratusan layer). Sejauh ini, model kita cuma terdiri dari 5 layer (atau 8 jika menghitung layer pooling), jadi tidak ada salahnya kita coba.</p>



<h3 class="wp-block-heading">Penambahan</h3>



<p class="wp-block-paragraph">Penambahan terdapat pada arsitektur model, sehingga berakhir tertulis seperti di bawah ini. Karena penambahan layer tersebut, kita bisa menambah proses residual connection juga.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 128, kernel_size=3, stride=1, padding=1) 
        self.conv2 = nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1) 
        self.conv3 = nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1)
        self.conv4 = nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1) # added layer
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2) 
        self.do = nn.Dropout() 

        self.conv1_bn = nn.BatchNorm2d(128) 
        self.conv2_bn = nn.BatchNorm2d(256) 
        self.conv3_bn = nn.BatchNorm2d(256) 
        self.conv4_bn = nn.BatchNorm2d(256) 
        
        self.fc1 = nn.Linear(1024, 1024)
        self.fco = nn.Linear(1024, 10) 
    
    def forward(self, x): 
        batch_size = x.shape[0]
        x = self.pool(torch.relu(self.conv1_bn(self.conv1(x)))) 
        x = self.pool(torch.relu(self.conv2_bn(self.conv2(x))))
        x = self.pool(x + torch.relu(self.conv3_bn(self.conv3(x)))) 
        x = self.pool(x + torch.relu(self.conv4_bn(self.conv4(x)))) # new residual connection
        x = x.reshape(batch_size, -1)        
        x = self.do(torch.relu(self.fc1(x))) 
        x = self.fco(x)
        return x</pre>



<h3 class="wp-block-heading">Hasil = 86.48%</h3>



<p class="wp-block-paragraph"><strong>Yeah, mission complete!</strong></p>



<h2 class="wp-block-heading">Rangkuman Hasil Akhir</h2>



<p class="wp-block-paragraph">Dari menggabungkan percobaan-percobaan di atas, kita berhasil memperoleh akurasi &gt;85% dengan kurang dari 40 epoch di CIFAR10. Ini hasil yang cukup bagus dan kita jadi bisa belajar banyak beragam strategi dalam meningkatkan akurasi deep learning pada dataset CIFAR10.</p>



<p class="wp-block-paragraph">By the way, menggunakan bentuk terakhir, jika kita tambahkan waktu train hingga 200 epoch, kita bisa mencapai akurasi pada CIFAR10 hingga &gt;90% loh! Tantangan lain yang kita juga bisa coba adalah menggunakan dataset yang mirip tapi agak lebih besar, yakni CIFAR100. Selamat mencoba!</p>



<p class="wp-block-paragraph"><strong>Source code tutorial ini tersedia</strong> dalam <a href="https://colab.research.google.com/drive/1zTeZMv5760tZPAthpXGjsha72g_fzUTx?usp=sharing">bentuk Google Colab di sini</a> (akan terus dilengkapi komentar dan catatan pada notebook tersebut)</p>
]]></content:encoded>
					
					<wfw:commentRss>https://structilmy.com/blog/2023/01/19/belajar-ragam-strategi-deep-learning-dengan-cifar10-dataset/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3944</post-id>	</item>
		<item>
		<title>Membuat Model Tensorflow Object Detection untuk Android</title>
		<link>https://structilmy.com/blog/2021/08/05/membuat-model-tensorflow-object-detection-untuk-android/</link>
					<comments>https://structilmy.com/blog/2021/08/05/membuat-model-tensorflow-object-detection-untuk-android/#comments</comments>
		
		<dc:creator><![CDATA[Rian Adam]]></dc:creator>
		<pubDate>Thu, 05 Aug 2021 01:35:00 +0000</pubDate>
				<category><![CDATA[Computer Vision]]></category>
		<category><![CDATA[Deep Learning]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Object Detection]]></category>
		<category><![CDATA[Tensorflow]]></category>
		<guid isPermaLink="false">https://structilmy.com/?p=2457</guid>

					<description><![CDATA[Artikel ini adalah kelanjutan dari artikel setahun yang lalu sebelumnya tentang Tensorflow Object Detection. Di artikel sebelumnya kita fokus pada penyiapan data, kali ini kita akan membahas cara melatih dan membuat model deep learning Tensorflow Object Detection menggunakan Google Colab, hingga akhirnya siap digunakan di Android. Pada tutorial ini kita menggunakan Tensorflow versi 2, yang [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Artikel ini adalah kelanjutan dari artikel <s>setahun yang lalu</s> <em>sebelumnya </em>tentang <a href="https://structilmy.com/2020/06/object-detection-dengan-tensorflow-dan-google-colab-1/">Tensorflow Object Detection</a>. Di artikel sebelumnya kita fokus pada penyiapan data, kali ini kita akan membahas cara melatih dan membuat model deep learning Tensorflow Object Detection menggunakan Google Colab, hingga akhirnya siap digunakan di Android.</p>



<p class="wp-block-paragraph">Pada tutorial ini kita menggunakan Tensorflow versi 2, yang sedikit berbeda dengan Tensorflow versi 1. Ini salah satu alasan artikel ini tertunda cukup lama, tahun lalu ketika artikel pertama ditulis, Tensorflow versi 2 masih belum cukup stabil untuk object detection maupun untuk diconvert ke TFLite.</p>



<div class="wp-block-image"><figure class="aligncenter size-full is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/image.png?resize=429%2C281&#038;ssl=1" alt="" class="wp-image-2465" width="429" height="281" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/image.png?w=995&amp;ssl=1 995w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/image.png?resize=300%2C197&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/image.png?resize=768%2C503&amp;ssl=1 768w" sizes="auto, (max-width: 429px) 100vw, 429px" /></figure></div>



<h2 class="wp-block-heading">Overview</h2>



<p class="wp-block-paragraph">Secara umum ada 3 tahapan untuk membuat model tensorflow untuk mendeteksi objek dan menjadikan model tersebut siap digunakan di Android:</p>



<ol class="wp-block-list"><li><strong>Menyiapkan dataset</strong>. Jika objek yang ingin kita bukan <a href="https://cocodataset.org" target="_blank" rel="noreferrer noopener">objek yang umum dideteksi</a>, maka kita perlu menyiapkan dataset terlebih dahulu. <strong>Tahap ini sudah dibahas <a href="https://structilmy.com/2020/06/object-detection-dengan-tensorflow-dan-google-colab-1/">di artikel sebelumnya</a></strong><a href="https://structilmy.com/2020/06/object-detection-dengan-tensorflow-dan-google-colab-1/">.</a></li><li><strong>Melatih pre-trained model</strong>. Kita akan menggunakan <a href="https://structilmy.com/2021/01/transfer-learning-solusi-deep-learning-dengan-data-sedikit/">pre-trained model</a>, karena untuk merangkai dan melatih model dari awal akan memakan waktu dan membutuhkan resource yang besar. Kita cukup melakukan fine-tuning model agar model memiliki performa yang baik, untuk dataset baru, dengan waktu pelatihan yang lebih singkat.</li><li><strong>Mengconvert model menjadi TFLite.</strong> Proses mengubah model yang sudah dilatih ke format yang dapat dipahami oleh mobile Android.</li></ol>



<h2 class="wp-block-heading">Source Code</h2>



<p class="wp-block-paragraph">Tutorial Tensorflow Object Detection ini tersedia di Google Colab berikut: <a href="https://colab.research.google.com/drive/1dNIIcDBMaKieGzSl1BVE5H6wu17n6cO7?usp=sharing" target="_blank" rel="noreferrer noopener">https://colab.research.google.com/drive/1dNIIcDBMaKieGzSl1BVE5H6wu17n6cO7?usp=sharing</a>. Untuk dataset dan script-script lain yang akan digunakan dapat diakses di repository github berikut: <a href="https://github.com/rianrajagede/object-detection.git" target="_blank" rel="noreferrer noopener">https://github.com/rianrajagede/object-detection.git</a>. <strong>Tutorial ini merujuk pada link Google Colab dan repo github di atas</strong>.</p>



<h2 class="wp-block-heading">1. Instalasi Tensorflow Object Detection</h2>



<p class="wp-block-paragraph">Ketika kita menginstall Tensorflow, kita belum menginstall Tensorflow Object Detection API. Hal ini juga berlaku di Google Colab, kita tetap perlu menginstall Tensorflow Object Detection API terlebih dahulu. Langkah instalasi resminya bisa <a href="https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/tf2.md#installation" target="_blank" rel="noreferrer noopener">diakses di sini</a>. Saat artikel ini ditulis instalasi bisa dilakukan dengan:</p>



<p class="wp-block-paragraph"><strong>1.</strong> <strong>Clone github Tensorflow Object Detection API</strong> di Google Colab. Penanda tanda seru (<code>!</code>) di awal baris menunjukkan baris tersebut sedang menjalankan perintah Command Prompt, bukan Python. Perintah ini akan membuat folder <code>models</code> yang berisi file-file dari repository tensorflow object detection.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">!git clone https://github.com/tensorflow/models.git</pre>



<p class="wp-block-paragraph"><strong>2. Lalu install API</strong> menggunakan perintah di bawah. Penanda <code>%%bash</code> fungsinya mirip dengan tanda <code>!</code>, jika perintah <code>%%bash</code> ditulis di awal baris menunjukkan cell Google Colab tersebut sedang menjalankan perintah Command Prompt, bukan Python.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%%bash
cd models/research/
protoc object_detection/protos/*.proto --python_out=.
cp object_detection/packages/tf2/setup.py .
python -m pip install .</pre>



<p class="wp-block-paragraph">3. <strong>Jalankan test</strong> untuk memastikan instalasi berhasil dengan menjalankan perintah berikut. Jika semua tertulis &#8220;OK&#8221; berarti instalasi berhasil.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">!python models/research/object_detection/builders/model_builder_tf2_test.py</pre>



<span id="more-2457"></span>



<h2 class="wp-block-heading">2. Download Dataset</h2>



<p class="wp-block-paragraph">Dataset yang akan kita gunakan ada di repository github yang saya share di bagian Source Code tadi, gunakan perintah di bawah untuk mengkloning repositori ke google colab. <strong>Setelah data didownload, lakukan pemrosesan data seperti yang telah dijelaskan <a href="https://structilmy.com/2020/06/object-detection-dengan-tensorflow-dan-google-colab-1/">di artikel sebelumnya</a></strong> (atau cek link Google Colab di atas di bagian &#8220;Menyiapkan TFrecord file&#8221;.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">!git clone https://github.com/rianrajagede/object-detection.git</pre>



<p class="wp-block-paragraph">Dataset ini berisikan gabungan dari dua public dataset yang terdiri dari objek Rakun dan Kanguru. Setiap citra memiliki file anotasi bertipe XML dengan nama yang sama. Berikut ini contoh citra yang ada di file.</p>



<div class="wp-block-image"><figure class="aligncenter size-full is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/TestImage.png?resize=276%2C209&#038;ssl=1" alt="" class="wp-image-2471" width="276" height="209" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/TestImage.png?w=432&amp;ssl=1 432w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/TestImage.png?resize=300%2C227&amp;ssl=1 300w" sizes="auto, (max-width: 276px) 100vw, 276px" /></figure></div>



<h2 class="wp-block-heading">3. Training Pre-trained Model</h2>



<p class="wp-block-paragraph">Pre-trained model adalah model yang siap pakai dan sudah dilatih dengan dataset yang besar. Penjelasan lebih detail tentang pre-trained model dan penggunananya ada di artikel <a href="https://structilmy.com/2021/01/transfer-learning-solusi-deep-learning-dengan-data-sedikit/">sebelumnya tentang transfer learning.</a></p>



<p class="wp-block-paragraph">1. <strong>Download Pre-trained model</strong> yang akan digunakan. Pre-trained model yang tersedia untuk object detection dapat dilihat daftarnya <a href="https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/tf2_detection_zoo.md" target="_blank" rel="noreferrer noopener nofollow">di halaman ini</a>. Sebagai contoh, kita akan menggunakan salah satu jenis pre-trained model SSD MobileNetv2 (<code>ssd_mobilenet_v2_fpnlite_320x320_coco17_tpu-8.tar.gz</code>).</p>



<p class="wp-block-paragraph">Berikut perintah yang digunakan untuk mendownload dan mengekstrak pre-trained model:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">!wget http://download.tensorflow.org/models/object_detection/tf2/20200710/ssd_mobilenet_v2_fpnlite_320x320_coco17_tpu-8.tar.gz
!tar -zxvf ssd_mobilenet_v2_fpnlite_320x320_coco17_tpu-8.tar.gz</pre>



<p class="wp-block-paragraph">Hasil dari proses ini adalah sebuah directory dengan nama yang sesuai dan berisikan pre-trained model.</p>



<div class="wp-block-image"><figure class="aligncenter size-full is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/image-2.png?resize=276%2C157&#038;ssl=1" alt="" class="wp-image-2469" width="276" height="157" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/image-2.png?w=515&amp;ssl=1 515w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/image-2.png?resize=300%2C171&amp;ssl=1 300w" sizes="auto, (max-width: 276px) 100vw, 276px" /></figure></div>



<p class="wp-block-paragraph"><strong>2. Atur Pipeline.config</strong>. Sebelum proses training, kita perlu mengatur beberapa hal di file pipeline.config yang tersedia di folder pre-trained model. File ini bertanggung jawab mengatur parameter-parameter pelatihan ataupun evaliasi seperti lama pelatihan, arsitektur, dsb.</p>



<p class="wp-block-paragraph">File Pipeline.config bisa dibuka dengan text editor biasa, atau jika menggunakan Google Colab bisa dengan cara <strong>double klik</strong>, nanti akan muncul jendela editor kecil.</p>



<p class="wp-block-paragraph">Apa saja yang perlu diatur dari file tersebut? Sebenarnya banyak yang bisa diatur, tapi pada tutorial ini kita atur beberapa hal saja.</p>



<ul class="wp-block-list"><li>Nilai pada <code>num_class</code> disesuaikan dengan jumlah class yang akan digunakan. Pada tutorial ini <code>num_class: 2</code></li><li>Temukan bagian <code>fine_tune_checkpoint_type</code> lalu ubah dari <code>classification</code> menjadi <code>detection</code></li><li>Nilai <code>batch_size</code> menentukan <a href="https://structilmy.com/2021/07/batch-epoch-step-istilah-istilah-pada-gradient-descent/">ukuran batch</a>. Kita gunakan batch kecil saja ubah <code>batch_size: 32</code></li><li>Untuk dataset yang sederhana ini, kita bisa gunakan jumlah iterasi yang kecil. Atur <code>num_steps: 1000</code></li><li>MobilenetV2 ini secara default dilatih menggunakan learning rate yang dinamis berdasar banyak iterasi (nilai learning rate bisa berubah-ubah). Ini tampak dari bagian di bawah. Karena kita mengubah <code>num_steps</code> lebih kecil, maka kita sesuaikan juga <code>total_steps: 1000</code> dan <code>warmup_steps: 100</code>. </li></ul>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">learning_rate {
        cosine_decay_learning_rate {
          learning_rate_base: 0.07999999821186066
          total_steps: 50000
          warmup_learning_rate: 0.026666000485420227
          warmup_steps: 1000
        }
      }</pre>



<ul class="wp-block-list"><li>Cari pada file pipeline tulisan <code>PATH_TO_BE_CONFIGURED</code>. lalu sesuaikan dengan path yang dituju.<ul><li>Untuk <code>fine_tune_checkpoint</code> arahkan ke checkpoint file dari pretrained model. Berdasarkan tutorial ini, pathnya <code>/content/ssd_mobilenet_v2_fpnlite_320x320_coco17_tpu-8/checkpoint/ckpt-0</code></li><li>Untuk <code>input_path</code> pada <code>train_input_reader</code> arahkan ke tfrecord data train. Berdasarkan tutorial ini, pathnya <code>/content/object-detection/train.record</code></li><li>Untuk <code>input_path</code> pada <code>eval_input_reader</code> arahkan ke tfrecord data test. Berdasarkan tutorial ini, pathnya <code>/content/object-detection/test.record</code></li><li>Untuk <code>label_map_path</code> arahkan ke file <code>label_map.pbtxt</code>. Di tutorial ini pathnya <code>/content/object-detection/label_map.pbtxt</code></li></ul></li></ul>



<p class="wp-block-paragraph"><strong>3. Jalankan perintah berikut untuk mulai pelatihan</strong>. Pada parameter <code>--model_dir</code> kita beritahu di mana model output proses pelatihan ini akan disimpan. Sedangkan parameter <code>--pipeline_config_path</code> berisi path menuju file pipeline.config yang tadi sudah kita edit.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">!python /content/models/research/object_detection/model_main_tf2.py \
                --alsologtostderr \
                --model_dir="/content/output/" \
                --pipeline_config_path="/content/ssd_mobilenet_v2_fpnlite_320x320_coco17_tpu-8/pipeline.config"</pre>



<p class="wp-block-paragraph">Proses training akan berlangsung cukup lama meskipun telah dijalankan di Google Colab dan dengan data yang tidak terlalu banyak. Untuk 1000 steps, kira-kira proses pelatihan akan memakan waktu 10-15 menit. Setelah proses pelatihan di atas selesai, model akan tersimpan di folder <code>/output</code> dalam format <code>SavedModel</code>.</p>



<div class="wp-block-image"><figure class="aligncenter size-full is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/image-4.png?resize=224%2C137&#038;ssl=1" alt="" class="wp-image-2486" width="224" height="137" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/image-4.png?w=411&amp;ssl=1 411w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/image-4.png?resize=300%2C183&amp;ssl=1 300w" sizes="auto, (max-width: 224px) 100vw, 224px" /></figure></div>



<h2 class="wp-block-heading">4. Convert ke TFLite</h2>



<p class="wp-block-paragraph">Model yang dihasilkan sudah bisa digunakan, namun untuk bisa menggunakannya di mobile android, kita perlu mengubah formatnya menjadi bentuk TFLite. Proses pengubahan dari <code>SavedModel</code> ke TFLite dilakukan dalam dua langkah:</p>



<p class="wp-block-paragraph"><strong>1. Buat SavedModel yang &#8220;ramah&#8221; untuk TFLite</strong>. Perintah berikut ini jika dijalankan akan menghasilkan sebuah folder <code>/tflite</code> yang berisi <code>SavedModel</code> juga namun lebih siap untuk dijadikan TFLite (model sementara)</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">!python models/research/object_detection/export_tflite_graph_tf2.py \
    --trained_checkpoint_dir {'/content/output'} \
    --output_directory {'/content/tflite'} \
    --pipeline_config_path {'/content/ssd_mobilenet_v2_fpnlite_320x320_coco17_tpu-8/pipeline.config'}</pre>



<p class="wp-block-paragraph"><strong>2. Convert SavedModel tersebut menjadi TFLite.</strong> Jalan perintah berikut untuk menghasilkan <code>model.tflite </code>di folder <code>/tflite</code>. Jika diperhatikan, kode di bawah ini merupakan perintah python, untuk menjalankan tentu perlu ada package yang diimport. Cek kode di Colab untuk lebih lengkapnya.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">_TFLITE_MODEL_PATH = "/content/tflite/model.tflite"

converter = tf.lite.TFLiteConverter.from_saved_model('/content/tflite/saved_model')
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_model = converter.convert()

with open(_TFLITE_MODEL_PATH, 'wb') as f:
  f.write(tflite_model)</pre>



<p class="wp-block-paragraph">Dan selesai! kalian bisa cek <code>model.tflite</code> di folder tersebut, lalu menggunakannya di android.</p>



<div class="wp-block-image"><figure class="aligncenter size-full is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/image-3.png?resize=255%2C64&#038;ssl=1" alt="" class="wp-image-2485" width="255" height="64" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/image-3.png?w=454&amp;ssl=1 454w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/image-3.png?resize=300%2C75&amp;ssl=1 300w" sizes="auto, (max-width: 255px) 100vw, 255px" /></figure></div>



<h2 class="wp-block-heading">5. Inference Model TFLite</h2>



<p class="wp-block-paragraph">Pada bagian ini kita akan melihat aksi model tflite yang sudah kita buat. Untuk melihat performa model TFLite yang dihasilkan, kita bisa cek menggunakan script yang ada di github repo di atas, yakni <code>TFLite_detection_image.py</code>.</p>



<p class="wp-block-paragraph">Sebelum menjalankan upgrade terlebih dahulu Open CV di Google Colab ke versi terbaru. Saat artikel ini dibuat OpenCV di Google Colab masih versi lama sehingga bisa menyebabkan error ketika inference</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">!pip install -U opencv-python</pre>



<p class="wp-block-paragraph">Lalu jalankan script tersebut dengan format sebagai berikut. Script ini akan menguji model untuk mendeteksi objek Rakun dan Kanguru dari folder <code>/object-detection/test_img_only</code>.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">!python /content/object-detection/scripts/TFLite_detection_image.py --imagedir "/content/object-detection/test_img_only" \
    --modeldir "/content/tflite" \
    --graph "/content/tflite/model.tflite" \
    --labels "/content/object-detection/labelmap.txt" </pre>



<p class="wp-block-paragraph">Pada bagian <code>labels</code> path kita diarahkan ke <code>labelmap.txt</code> bukan <code>label_map.pbtxt</code>. File <code>labelmap.txt</code> sedikit berbeda dengan <code>label_map.pbtxt</code> dan digunakan untuk inference di android. </p>



<p class="wp-block-paragraph">Jika dijalankan, maka script akan menghasilkan gambar yang yang telah dianotasi di home folder.</p>



<div class="wp-block-image"><figure class="aligncenter size-full is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/index.jpg?resize=373%2C239&#038;ssl=1" alt="" class="wp-image-2484" width="373" height="239" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/index.jpg?w=650&amp;ssl=1 650w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/index.jpg?resize=300%2C192&amp;ssl=1 300w" sizes="auto, (max-width: 373px) 100vw, 373px" /></figure></div>



<p class="wp-block-paragraph">Sekian, Selamat mencoba semoga bermanfaat, jika ada yang kurang jelas bisa ditanyakan di kolom komentar <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<hr class="wp-block-separator"/>



<p class="wp-block-paragraph"><sup>Photo by <a href="https://unsplash.com/@lkverwoerd?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Lisette Verwoerd</a> on <a href="https://unsplash.com/s/photos/bird?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></sup></p>
]]></content:encoded>
					
					<wfw:commentRss>https://structilmy.com/blog/2021/08/05/membuat-model-tensorflow-object-detection-untuk-android/feed/</wfw:commentRss>
			<slash:comments>12</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2457</post-id>	</item>
		<item>
		<title>Image Classification dengan CNN dan Tensorflow</title>
		<link>https://structilmy.com/blog/2021/01/18/image-classification-dengan-cnn-dan-tensorflow/</link>
					<comments>https://structilmy.com/blog/2021/01/18/image-classification-dengan-cnn-dan-tensorflow/#comments</comments>
		
		<dc:creator><![CDATA[Rian Adam]]></dc:creator>
		<pubDate>Mon, 18 Jan 2021 14:53:02 +0000</pubDate>
				<category><![CDATA[Computer Vision]]></category>
		<category><![CDATA[Deep Learning]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Tensorflow]]></category>
		<guid isPermaLink="false">http://structilmy.com/?p=2168</guid>

					<description><![CDATA[Pada artikel ini saya akan menjelaskan secara ringkas langkah-langkah penggunaan Tensorflow untuk Image Classification / Klasifikasi Citra. Perlu dicatat, saya menggunakan Tensorflow versi 2 yang mungkin berbeda dengan Tensorflow versi 1. Selain itu, saya garis bawahi lagi artikel ini membahas image classification (menentukan ini gambar apa), bukan detection (menentukan objek apa dan di mana pada [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Pada artikel ini saya akan menjelaskan secara ringkas langkah-langkah penggunaan Tensorflow untuk Image Classification / Klasifikasi Citra. Perlu dicatat, saya menggunakan Tensorflow versi 2 yang mungkin berbeda dengan Tensorflow versi 1. Selain itu, saya garis bawahi lagi artikel ini membahas image classification (menentukan ini gambar apa), bukan <a href="https://structilmy.com/2020/06/object-detection-dengan-tensorflow-dan-google-colab-1/">detection</a> (menentukan objek apa dan di mana pada gambar). Secara alur, pada artikel ini saya mengembangkan dari artikel sebelumnya tentang <a href="https://structilmy.com/2019/07/convolutional-neural-network-cnn-menggunakan-pytorch/">implementasi CNN menggunakan PyTorch</a></p>



<h2 class="wp-block-heading">Dataset</h2>



<p class="wp-block-paragraph">Dataset yang akan kita gunakan adalah citra barang-barang yang ada di sebuah toko (dimodifikasi dari Freiburg Groceries Dataset) yang terdiri dari 5 kelas, yakni citra produk Susu (MILK), Air mineral (WATER), soda (SODA), jus (JUICE), dan cuka (VINEGAR). Total terdapat sekitar 900-an gambar untuk pelatihan dan 120 gambar untuk pengujian. Semua citra berukuran sama, yakni 256&#215;256 pixel. <strong>Dataset dan code bisa di-download di <a rel="noreferrer noopener" href="https://github.com/rianrajagede/groceries_classification" target="_blank">repository berikut</a></strong>.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="256" height="256" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/01/JUICE0178.png?resize=256%2C256&#038;ssl=1" alt="" class="wp-image-2169" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/01/JUICE0178.png?w=256&amp;ssl=1 256w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/01/JUICE0178.png?resize=150%2C150&amp;ssl=1 150w" sizes="auto, (max-width: 256px) 100vw, 256px" /><figcaption>salah satu citra dengan kelas &#8220;Juice&#8221;</figcaption></figure></div>



<p class="wp-block-paragraph">Kita akan menggunakan dataset yang ada pada folder &#8220;train&#8221; untuk pelatihan dan yang ada pada folder &#8220;test&#8221; untuk pengujian. Pada tutorial ini kita masih belum menggunakan teknik validasi seperti menggunakan data validasi atau cross-validation.</p>



<h2 class="wp-block-heading">Pre-Processing</h2>



<p class="wp-block-paragraph">Jika diperhatikan, format folder dataset yang telah di-download adalah seperti berikut.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">dataset/
   train/
      kelas_1/
         citra_103.png
         citra_22.png
         ...
      kelas_2/
         citra_123.png
         citra_324.png
         ...
      ...
   test/
      ...</pre>



<p class="wp-block-paragraph">Format tersebut adalah format standar untuk image classification. Ketika format foldernya sudah seperti itu, beberapa framework seperti Tenorsflow atau PyTorch sudah menyediakan cara mudah untuk meload data. Pada Tensorflow kita bisa menggunakan perintah berikut untuk meload dataset.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">from tensorflow.keras.preprocessing.image import ImageDataGenerator

datagen = ImageDataGenerator(rescale=1/255.) # pre-processor
datatrain = DirectoryIterator('train', datagen) # load trainset dari folder train/
datatest = DirectoryIterator('test', datagen) # load testset dari folder test/</pre>



<span id="more-2168"></span>



<p class="wp-block-paragraph">Objek <code>datagen</code> adalah objek <code>ImageDataGenerator()</code> yang berfungsi untuk memproses data sebelum di load. Ada <a href="https://www.tensorflow.org/api_docs/python/tf/keras/preprocessing/image/ImageDataGenerator#flow_from_directory" target="_blank" rel="noreferrer noopener nofollow">banyak fungsi di dalamnya</a>. Pada artikel ini kita hanya menggunakan fungsi rescale. Fungsi rescale digunakan untuk mengubah skala nilai citra. Jadi ketika citra itu di load, citra direpresentasikan sebagai array 3D (atau kadang disebut Tensor) dengan nilai rentangan antara 0..255. Pada parameter rescale saya beri nilai &#8220;1/255&#8221; yang artinya nanti setiap nilai akan dikali 1/255 sehingga rentangan nilainya akan berubah diantara 0..1. Kenapa perlu diubah rentangan nilai ini? agak panjang detailnya tapi intinya untuk memudahkan neural network belajar.</p>



<p class="wp-block-paragraph">Hasil dari perintah diatas akan menghasilkan object Tensorflow Dataset, sebuah object yang memudahkan proses pengolahan dataset. Sebagai contohnya kita bisa coba jalankan perintah di bawah, maka akan dihasilkan informasi-informasi dari dataset yang kita miliki.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">print(datatrain.class_indices) # menampilkan kelas-kelas pada dataset
print("banyak batch:", len(datatrain)) # menampilkan banyak batch

for imgs, labels in datatrain: # datatrain bukan array, hanya bisa diakses melalui perulangan
    print("apa itu imgs", type(imgs)) # numpy array 4D
    print("dimensi imgs dengan batch:", imgs.shape)  # (n-batch, panjang, lebar, channel)
    print("dimensi gambar:", imgs[0].shape) # ukuran tiap gambar
    print("contoh gambar (hanya channel Red)") # nilai ada antara 0 sampai 1
    print(imgs[0,:,:,0])
    print("contoh label") 
    print(labels[0]) # sudah "one-hot". Bukan tertulis kelas "3" tapi [0, 0, 0, 1, 0]

    print("contoh gambar visualnya")
    plt.imshow( imgs[0] )
    break</pre>



<h2 class="wp-block-heading">Implementasi</h2>



<h4 class="wp-block-heading">Arsitektur CNN</h4>



<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" src="https://i2.wp.com/structilmy.com/wp-content/uploads/2020/03/cnn1.png?fit=1024%2C328&amp;ssl=1" alt="" class="wp-image-1526" width="582" height="185" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2020/03/cnn1.png?w=1103&amp;ssl=1 1103w, https://i0.wp.com/structilmy.com/wp-content/uploads/2020/03/cnn1.png?resize=300%2C96&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2020/03/cnn1.png?resize=1024%2C328&amp;ssl=1 1024w, https://i0.wp.com/structilmy.com/wp-content/uploads/2020/03/cnn1.png?resize=768%2C246&amp;ssl=1 768w" sizes="auto, (max-width: 582px) 100vw, 582px" /><figcaption>Ilustrasi CNN untuk klasifikasi citra ke 3 kelas (hanya contoh, berbeda dengan arsitektur yang akan digunakan pada artikel ini)</figcaption></figure></div>



<p class="wp-block-paragraph">Pada tutorial ini, kita akan menggunakan model CNN sama seperti yang kita gunakan <a href="https://structilmy.com/2019/07/convolutional-neural-network-cnn-menggunakan-pytorch/">pada artikel sebelumnya</a> (<strong>silakan baca pada artikel tersebut untuk detail penjelasan arsitektur yang digunakan</strong>). Model dengan dua convolutional layer dan sebuah fully connected layer. Dengan detail parameter setiap layer sebagai berikut:</p>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="677" height="550" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2020/06/convdiagram-2.png?resize=677%2C550&#038;ssl=1" alt="" class="wp-image-1670" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2020/06/convdiagram-2.png?w=677&amp;ssl=1 677w, https://i0.wp.com/structilmy.com/wp-content/uploads/2020/06/convdiagram-2.png?resize=300%2C244&amp;ssl=1 300w" sizes="auto, (max-width: 677px) 100vw, 677px" /><figcaption><em>W = window size, S = stride, P = padding, FM = feature map, N = jumlah neuron</em></figcaption></figure>



<p class="wp-block-paragraph">Pembuatan model di Tensorflow ada banyak cara, yang paling mudah adalah menggunakan Keras Sequential. Sebelum mendefinsikan model beberapa library perlu yang diimport untuk pembentukan model, yakni:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import tensorflow as tf
from tensorflow.keras import Sequential, layers</pre>



<p class="wp-block-paragraph">Lalu untuk membuat modelnya kita definsikan menggunakan Keras Sequential. Dengan menggunakan Keras Sequential, layer-layer arsitektur jaringan saraf tiruan didefinisikan secara urut dari depan (input layer) sampai belakang (output layer). Untuk model dengan ilustrasi di atas, kita definisikan sebagai berikut:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">model = Sequential([
  layers.Conv2D(16, 3, activation='relu'),
  layers.MaxPooling2D(),
  layers.Conv2D(32, 16, activation='relu'),
  layers.MaxPooling2D(),
  layers.Flatten(),
  layers.Dense(512, activation='relu'),
  layers.Dense(5, activation='softmax')
])</pre>



<h4 class="wp-block-heading">Alur Pelatihan</h4>



<p class="wp-block-paragraph">Setelah model jadi dibuat, kita bisa compile model kita dengan algoritma optimasi apa yang akan kita gunakan untuk pelatihan model kita:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">model.compile(loss='categorical_crossentropy',
     optimizer=tf.keras.optimizers.Adadelta(learning_rate=0.001),
     metrics=['accuracy'])</pre>



<p class="wp-block-paragraph">Lalu jalankan pelatihan dengan perintah berikut:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">model.fit(datatrain, batch_size=16, epochs=20, verbose=1)</pre>



<h4 class="wp-block-heading">Alur Pengujian</h4>



<p class="wp-block-paragraph">Setelah model selesai dilatih, maka kita akan uji dengan data test. Data test yang belum kita gunakan ini saya pilih secara acak dari masing-masing kelas dan tidak ada di data train. Proses pengujian cukup dilakukan dengan perintah berikut:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">test_loss, test_acc = model.evaluate(datatest, verbose=1)</pre>



<p class="wp-block-paragraph">Variabel <code>test_loss</code> akan menyimpan nilai error hasil data test sedangkan <code>test_acc</code> akan menympan nilai akurasi hasil data test.</p>



<h2 class="wp-block-heading">Selesai!</h2>



<p class="wp-block-paragraph">Jika dibandingkan dengan <a href="https://structilmy.com/2019/07/convolutional-neural-network-cnn-menggunakan-pytorch/" target="_blank" rel="noreferrer noopener">proses klasifikasi citra menggunakan PyTorch</a>, dapat dilihat kode Tensorflow seakan lebih ringkas. Fungsi <code>.fit()</code> dari Keras sangat meringkas proses iterasi pelatihan pada PyTorch. </p>



<p class="wp-block-paragraph">Tapi kalau saya pribadi hal tersebut malah menjadi kekurangan dari Tensorflow. Menyembunyikan &#8220;bagian utama&#8221; dari proses pelatihan neural network malah membuat saya tidak nyaman untuk mengajari alur pelatihan yang terjadi, atau berekpserimen lebih dalam. Tapi ya setiap orang punya pendapat masing-masing <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> yang penting &#8220;dicoba dulu saja..&#8221;. Semoga bermanfaat!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://structilmy.com/blog/2021/01/18/image-classification-dengan-cnn-dan-tensorflow/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2168</post-id>	</item>
		<item>
		<title>Object Detection dengan PyTorch Detectron 2 dan Colab</title>
		<link>https://structilmy.com/blog/2020/10/01/object-detection-dengan-pytorch-detectron-2-dan-colab/</link>
					<comments>https://structilmy.com/blog/2020/10/01/object-detection-dengan-pytorch-detectron-2-dan-colab/#comments</comments>
		
		<dc:creator><![CDATA[Rian Adam]]></dc:creator>
		<pubDate>Wed, 30 Sep 2020 17:26:00 +0000</pubDate>
				<category><![CDATA[Computer Vision]]></category>
		<category><![CDATA[Deep Learning]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[Object Detection]]></category>
		<category><![CDATA[pytorch]]></category>
		<guid isPermaLink="false">http://structilmy.com/?p=1700</guid>

					<description><![CDATA[Pada tutorial ini kita akan coba membuat object detection model dengan custom dataset kita sendiri menggunakan PyTorch Detectron 2. Facebook Detectron 2 adalah salah satu python framework yang dapat digunakan untuk kasus object detection. Detectron dikembangkan oleh Facebook dengan menggunakan basis PyTorch sebagai deep learning frameworknya. Bagi yang belum tahu tentang PyTorch, bisa cek website [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Pada tutorial ini kita akan coba membuat object detection model dengan custom dataset kita sendiri menggunakan <a href="https://github.com/facebookresearch/detectron2/" target="_blank" rel="noreferrer noopener">PyTorch Detectron 2</a>.</p>



<p class="wp-block-paragraph"><a href="https://github.com/facebookresearch/detectron2/" target="_blank" rel="noreferrer noopener">Facebook Detectron 2</a> adalah salah satu python framework yang dapat digunakan untuk kasus object detection.  Detectron dikembangkan oleh Facebook dengan menggunakan basis PyTorch sebagai deep learning frameworknya. Bagi yang belum tahu tentang PyTorch, bisa cek <a href="https://pytorch.org/" target="_blank" rel="noreferrer noopener">website resminya</a> atau kunjungi tutorial kami <a href="https://structilmy.com/2019/07/convolutional-neural-network-cnn-menggunakan-pytorch/" target="_blank" rel="noreferrer noopener">sebelumnya di sini</a>.</p>



<p class="wp-block-paragraph">Framework lain untuk deteksi objek yang cukup populer adalah <a href="https://github.com/tensorflow/models/tree/master/research/object_detection" target="_blank" rel="noreferrer noopener">Tensorflow object-detection API</a> (TFOD) yang dikembangkan oleh Google. Keduanya hampir memiliki fitur utama yang sama, salah satunya mereka menyediakan Model Zoo, di mana kita bisa mulai proses training menggunakan model yang sudah ada (pretrained model).</p>



<p class="has-text-align-center wp-block-paragraph"><strong> Artikel telah di update 16 Januari 2020 pada perubahan instalasi Detectron 2 versi 0.3</strong></p>



<h2 class="wp-block-heading">Detectron 2 Tutorial</h2>



<p class="wp-block-paragraph">Pada tutorial ini kita akan menggunakan <a href="https://structilmy.com/2019/05/mengenal-google-colab/">Google Colab</a>. Contoh code yang akan dibahas pada artikel ini <a href="https://colab.research.google.com/drive/1XvYUqBzSxwULia2ecu5FCfIFmtlGPMjD?usp=sharing" target="_blank" rel="noreferrer noopener"><strong>tersedia di sini</strong>.</a></p>



<div class="wp-block-image"><figure class="alignright size-large is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2020/09/Screenshot-from-2020-09-29-10-37-01.png?resize=166%2C125&#038;ssl=1" alt="" class="wp-image-2030" width="166" height="125"/><figcaption>Detectron 2 Logo</figcaption></figure></div>



<ol class="wp-block-list"><li><a href="#dataset">Dataset</a></li><li><a href="#instalasi">Instalasi</a></li><li><a href="#datasetcatalog">Menyiapkan DatasetCatalog</a></li><li><a href="#training">Training Model</a></li><li><a href="#save">Save and Load Model</a></li></ol>



<h3 class="wp-block-heading" id="dataset">1. Dataset</h3>



<p class="wp-block-paragraph">Dataset yang akan kita gunakan sama dengan dataset dari tutorial sebelumnya. Kita akan mendeteksi pada suatu citra apakah ada kangguru atau rakun. Penjelasan detail format data dan bagaimana memprosesnya dapat dilihat pada <a href="https://structilmy.com/2020/06/object-detection-dengan-tensorflow-dan-google-colab-1/">artikel sebelumnya</a>. Tapi, karena artikel sebelumnya digunakan untuk object detection dengan Tensorflow sedangkan kita di sini akan menggunakan PyTorch Detectron, maka kita tidak perlu memproses data sampai membuat file tfrecord, cukup sampai bagian <a href="https://structilmy.com/2020/06/object-detection-dengan-tensorflow-dan-google-colab-1/#membuat-file-csv">membuat file csv.</a></p>



<p class="wp-block-paragraph">Dataset latihan dapat didownload melalui github dengan menuliskan perintah berikut di google colab. Detail dataset dapat dibaca di file Readme:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">! git clone https://github.com/rianrajagede/object-detection.git</pre>



<span id="more-1700"></span>



<h3 class="wp-block-heading" id="instalasi">2. Instalasi Detectron 2</h3>



<p class="wp-block-paragraph">Sebelum menginstall detectron kita perlu menginstall PyTorch, pyyaml, dan pycocotools dengan versi yang sesuai. Di Google Colab PyTorch sudah otomatis terinstall, kita cukup menginstall 2 package sisanya melalui Google Colab:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="powershell" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">! pip install pyyaml==5.1 pycocotools==2.0.1</pre>



<p class="wp-block-paragraph">Kita juga perlu memperhatikan versi PyTorch yang tersedia dan versi Cuda. Hal ini bisa dilakukan dengan menjalankan perintah berikut di Colab:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import torch
print(torch.__version__)</pre>



<p class="wp-block-paragraph">Pada saat tutorial ini ditulis, output dari perintah di atas adalah <code>1.6.0+cu101</code> yang artinya terinstall PyTorch versi 1.6.0 dengan Cuda versi 10.1. Selanjutnya kita cukup install Detectron berdasarkan versi yang sesuai, petunjukknya dapat dibaca di link berikut.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="powershell" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">! python -m pip install detectron2 -f  https://dl.fbaipublicfiles.com/detectron2/wheels/cu101/torch1.7/index.html</pre>



<h3 class="wp-block-heading" id="datasetcatalog">3. Menyiapkan DatasetCatalog</h3>



<p class="wp-block-paragraph">Detectron menyimpan dataset pada sebuah object bernama DatasetCatalog. Sebelum memulai training, kita perlu mengconvert dataset kita yang awalnya berbentuk XML ke DatasetCatalog.</p>



<p class="wp-block-paragraph">DatasetCatalog adalah sebuah list of dictionary dengan setiap elemennya berformat sebagai berikut:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">{'annotations':
    [{'bbox': [LIST KOORDINAT BOUNDING BOX 1],
       'bbox_mode': &lt;FORMAT BOUNDING BOX 1>,
       'category_id': LABEL INDEX OBJECT 1},
     {'bbox': [LIST KOORDINAT BOUNDING BOX 2],
       'bbox_mode': &lt;FORMAT BOUNDING BOX 2>,
       'category_id': LABEL INDEX OBJECT 2},
       .... ],
 'file_name': 'PATH KE FILE JPG',
 'height': TINGGI GAMBAR,
 'width': LEBAR GAMBAR,
 'image_id': ID GAMBAR,
}</pre>



<p class="wp-block-paragraph">Code yang diperlukan untuk mengconvert dari CSV dataset kita sebagai berikut (penjelasan dalam bentuk komentar):</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># Buat dictionary berisikan nama label dan indexnya
labelmap = {
    "kangaroo" : 0,
    "raccoon" : 1
}

# Buat fungsi get_dicts() untuk mengconvert XML ke DatasetCatalog.
# Parameter settype digunakan untuk membedakan file dataset,
# Karena data test dan data train diperlakukan sama, maka saya
# memilih untuk menggunakan satu fungsi untuk memproses dua 
# DatasetCatalog, yaitu untuk train dan untuk test
def get_dicts(settype):
    if settype=="test":
        csvpath = main_path+"/test_labels.csv"
    else:
        csvpath = main_path+"/train_labels.csv"

    df = pd.read_csv(csvpath).values # load dataset

    dataset_dicts = []
    done = []
    for idx in range(len(df)):
        record = {}
        filename = df[idx, 0]
        record["image_id"] = idx
        record["file_name"] =  main_path+"/"+settype+"/"+filename
        record["width"] = df[idx, 1]
        record["height"] = df[idx, 2]

        if filename in done: # untuk menghindari duplikat
            continue
        done.append(filename)

        objs = []
        for row in df[df[:,0]==filename]: # simpan semua objek
            objs.append({
                    "bbox": [ row[4], row[5], row[6], row[7]],
                    "bbox_mode": BoxMode.XYXY_ABS,
                    "category_id": labelmap[row[3]],
            })
        record["annotations"] = objs
        dataset_dicts.append(record)

    return dataset_dicts</pre>



<p class="wp-block-paragraph">Selanjutnya kita cukup menggunanakan perintah berikut untuk membuat DatasetCatalog dengan nama <code>rk_train</code> dan <code>rk_test</code>. Sekaligus kita juga membuat MetadataCatalog untuk menyimpan informasi objeknya.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">DatasetCatalog.register("rk_train", lambda t="train":get_dicts(t))
DatasetCatalog.register("rk_test", lambda t="test":get_dicts(t))
MetadataCatalog.get("rk_train").set(thing_classes=["kangaroo", "raccoon"])
MetadataCatalog.get("rk_test").set(thing_classes=["kangaroo", "raccoon"])</pre>



<h3 class="wp-block-heading" id="training">4. Training Model</h3>



<p class="wp-block-paragraph">Dengan menggunakan pretrained model, yang perlu kita lakukan adalah mendownload model dari Model Zoo lalu melakukan sedikit config atau pengaturan. Detail penjelasan pengaturan ini dapat dilihat di dokumentasi resmi Detectron 2.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">from detectron2.engine import DefaultTrainer
from detectron2.config import get_cfg

cfg = get_cfg()
pre_mod = "COCO-Detection/faster_rcnn_X_101_32x8d_FPN_3x.yaml"

# pilih dan download model
cfg.merge_from_file(model_zoo.get_config_file(pre_mod))
cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url(pre_mod)

# atur data train dan test
cfg.DATASETS.TRAIN = ("rk_train",)
cfg.DATASETS.TEST = ()

# atur pelatihan
cfg.DATALOADER.NUM_WORKERS = 2
cfg.SOLVER.IMS_PER_BATCH = 2
cfg.SOLVER.BASE_LR = 0.005  # learning rate
cfg.SOLVER.MAX_ITER = 100  # banyak iterasi
cfg.MODEL.ROI_HEADS.BATCH_SIZE_PER_IMAGE = 48
cfg.MODEL.ROI_HEADS.NUM_CLASSES = 2</pre>



<p class="wp-block-paragraph">Setelah pengaturan di atas, proses training cukup menjalankan perintah berikut:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># membuat direktori output pelatihan
os.makedirs(cfg.OUTPUT_DIR, exist_ok=True)

trainer = DefaultTrainer(cfg) 
 # resume=False artinya pelatihan baru bukan melanjutkan
trainer.resume_or_load(resume=False)
trainer.train()</pre>



<p class="wp-block-paragraph">Hasil dari proses pelatihan ini akan muncul di folder <code>output</code>. Model akhir bernama <code>model_final.pth</code></p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="990" height="235" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2020/09/Screenshot-from-2020-09-29-14-48-37.png?resize=990%2C235&#038;ssl=1" alt="" class="wp-image-2035" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2020/09/Screenshot-from-2020-09-29-14-48-37.png?w=990&amp;ssl=1 990w, https://i0.wp.com/structilmy.com/wp-content/uploads/2020/09/Screenshot-from-2020-09-29-14-48-37.png?resize=300%2C71&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2020/09/Screenshot-from-2020-09-29-14-48-37.png?resize=768%2C182&amp;ssl=1 768w" sizes="auto, (max-width: 990px) 100vw, 990px" /><figcaption>Tampilan proses pelatihan</figcaption></figure></div>



<h3 class="wp-block-heading" id="save">5. Load Model</h3>



<p class="wp-block-paragraph">Kita bisa gunakan model akhir tersebut untuk mendeteksi citra dengan langkah berikut. Pertama-tama kita load terlebih dahulu model dan beri sedikit pengaturan treshold.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">cfg.MODEL.WEIGHTS = os.path.join("output/", "model_final.pth")
cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.8  
predictor = DefaultPredictor(cfg)</pre>



<p class="wp-block-paragraph"><code>predictor</code> adalah objek model kita. Untuk melakukan deteksi kita cukup menuliskan perintah berikut:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">from detectron2.utils.visualizer import ColorMode

im = cv2.imread("/content/TestImage.png") # load image
outputs = predictor(im) # predict
v = Visualizer(im[:, :, ::-1], metadata=metadata, scale=0.8) # visualisasi
out = v.draw_instance_predictions(outputs["instances"].to("cpu"))
cv2_imshow(out.get_image()[:, :, ::-1])</pre>



<p class="wp-block-paragraph">Variabel <code>outputs</code> yang dihasilkan menyimpan data-data seperti koordinat bounding box, score, dan class object pada gambar sehingga mudah diolah. Untuk visualisasi kita bisa memanfaatkan fungsi <code>Visualizer</code> bawaan Detectron yang dapat langsung menampilkan gambar disertai bounding boxnya seperti di bawah ini:</p>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="345" height="261" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2020/09/index.png?resize=345%2C261&#038;ssl=1" alt="" class="wp-image-2036" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2020/09/index.png?w=345&amp;ssl=1 345w, https://i0.wp.com/structilmy.com/wp-content/uploads/2020/09/index.png?resize=300%2C227&amp;ssl=1 300w" sizes="auto, (max-width: 345px) 100vw, 345px" /></figure>



<p class="wp-block-paragraph">Sekian tutorialnya, semoga bermanfaat! kode yang kami bahas di artikel ini <a href="https://colab.research.google.com/drive/1XvYUqBzSxwULia2ecu5FCfIFmtlGPMjD?usp=sharing" target="_blank" rel="noreferrer noopener"><strong>tersedia di sini</strong>.</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://structilmy.com/blog/2020/10/01/object-detection-dengan-pytorch-detectron-2-dan-colab/feed/</wfw:commentRss>
			<slash:comments>11</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1700</post-id>	</item>
		<item>
		<title>Object Detection dengan Tensorflow dan Google Colab [1]</title>
		<link>https://structilmy.com/blog/2020/06/10/object-detection-dengan-tensorflow-dan-google-colab-1/</link>
					<comments>https://structilmy.com/blog/2020/06/10/object-detection-dengan-tensorflow-dan-google-colab-1/#comments</comments>
		
		<dc:creator><![CDATA[Rian Adam]]></dc:creator>
		<pubDate>Wed, 10 Jun 2020 00:26:26 +0000</pubDate>
				<category><![CDATA[Computer Vision]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Object Detection]]></category>
		<category><![CDATA[Tensorflow]]></category>
		<guid isPermaLink="false">http://structilmy.com/?p=1555</guid>

					<description><![CDATA[Jadi saya baru-baru ini dapat ajakan untuk membuat sebuah aplikasi yang menggunakan metode object detection untuk mengetahui objek apa saja yang ada pada citra dan posisinya di mana melalui tangkapan kamera Handphone. Membuat model object detection bukanlah suatu yang mudah, dan menjadikannya bisa dijalankan di Handphone adalah masalah yang lain lagi. Pada artikel ini saya [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Jadi saya baru-baru ini dapat ajakan untuk membuat sebuah aplikasi yang menggunakan metode object detection untuk mengetahui objek apa saja yang ada pada citra dan posisinya di mana melalui tangkapan kamera Handphone.</p>



<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2020/04/35504975-a5db962c-04f5-11e8-9a9f-1d803f86af7f.png?resize=364%2C273&#038;ssl=1" alt="object detection illustration" class="wp-image-1567" width="364" height="273" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2020/04/35504975-a5db962c-04f5-11e8-9a9f-1d803f86af7f.png?w=500&amp;ssl=1 500w, https://i0.wp.com/structilmy.com/wp-content/uploads/2020/04/35504975-a5db962c-04f5-11e8-9a9f-1d803f86af7f.png?resize=300%2C225&amp;ssl=1 300w" sizes="auto, (max-width: 364px) 100vw, 364px" /><figcaption><sup>Pada permasalahan object detection, sistem tidak hanya mengenali itu objek apa, tetapi juga di mana objek itu berada pada gambar (salah satunya dengan memberi kotak/bounding box)</sup></figcaption></figure></div>



<p class="wp-block-paragraph">Membuat model object detection bukanlah suatu yang mudah, dan menjadikannya bisa dijalankan di Handphone adalah masalah yang lain lagi. Pada artikel ini saya akan coba jelaskan bagaimana membuat sebuah model object detection menggunakan custom dataset buatan sendiri yang nantinya dapat diaplikasikan ke mobile (Android/IOS). <strong>Artikel ini fokus ke tahap pertama, yakni penyiapan data</strong>.</p>



<h2 class="wp-block-heading">Tensorflow Object Detection API</h2>



<p class="wp-block-paragraph">Kami menggunakan framework <a href="https://www.tensorflow.org/">Tensorflow</a> untuk menyelesaikan permasalahan ini. Ada beberapa pertimbangan kenapa framework ini cukup cocok untuk melakukan object detection melalui handphone:</p>



<ol class="wp-block-list"><li>Salah satu keunggulan Tensorflow adalah kemudahannya dalam mengimplementasi model ke Handphone Android, misalnya dengan mengkonversi model menjadi <a href="https://www.tensorflow.org/lite">TFLite model</a>. (Tensorflow dan Android sama-sama dipegang Google)</li><li>Selain itu Tensorflow juga menyediakan beberapa API yang memudahkan kita dalam proses pembuatan model object detection dengan <strong>custom dataset</strong> (dataset buatan kita sendiri).</li></ol>



<p class="wp-block-paragraph">Pada artikel ini Kami akan menggunakan Tensorflow versi 2. Tensorflow dan Tensorflow object detection diinstall secara terpisah. Detailnya bisa dilihat sesuai dokumentasi resminya (bisa update setiap waktu) atau di artikel selanjutnya.</p>



<h2 class="wp-block-heading">Dataset untuk Object Detection</h2>



<p class="wp-block-paragraph">Format dataset untuk Object Detection berbeda dengan dataset yang digunakan pada <a href="https://structilmy.com/2019/07/convolutional-neural-network-cnn-menggunakan-pytorch/">klasifikasi citra biasa</a>. Data yang digunakan untuk kasus deteksi objek biasa memiliki label berupa file terpisah yang mencatat nama objek dan lokasi objek tersebut pada suatu citra. File label ini seringnya disebut file anotasi.</p>



<p class="wp-block-paragraph">Terdapat dua style penulisan file anotasi yang cukup populer, yakni style COCO dataset dan PASCAL-VOC. Pada tutorial ini Kami menggunakan format PASCAL-VOC XML dengan contoh tampilan seperti berikut:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="xml" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;annotation>
	&lt;folder>My Drive&lt;/folder>
	&lt;filename>Image1.jpg&lt;/filename>
	&lt;path>C:\My Drive\Image1.jpg&lt;/path>
	&lt;source>
		&lt;database>Unknown&lt;/database>
	&lt;/source>
	&lt;size>
		&lt;width>1280&lt;/width>
		&lt;height>720&lt;/height>
		&lt;depth>3&lt;/depth>
	&lt;/size>
	&lt;segmented>0&lt;/segmented>
	&lt;object>
		&lt;name>Object 1&lt;/name>
		&lt;pose>Unspecified&lt;/pose>
		&lt;truncated>0&lt;/truncated>
		&lt;difficult>0&lt;/difficult>
		&lt;bndbox>
			&lt;xmin>925&lt;/xmin>
			&lt;ymin>343&lt;/ymin>
			&lt;xmax>1097&lt;/xmax>
			&lt;ymax>464&lt;/ymax>
		&lt;/bndbox>
	&lt;/object>
&lt;/annotation>
</pre>



<p class="wp-block-paragraph">Jadi pada contoh di atas saya punya file citra &#8220;Image1.jpg&#8221; dan file XML &#8220;Image1.xml&#8221;. Isi dari file XML nya adalah data di atas. Berisikan koordinat objek yang ingin dideteksi. Pembuatan file XML ini tidak perlu dibuat manual (diketik satu persatu), kita bisa menggunakan software anotasi. Anotasi citra diatas dibuat menggunakan software <a href="https://github.com/tzutalin/labelImg">labelimg</a>.</p>



<h2 class="wp-block-heading">Penyiapan Dataset</h2>



<p class="wp-block-paragraph">Dataset dengan format di atas belum bisa langsung diproses oleh Tensorflow. Ada beberapa penyesuaian data yang perlu dilakukan sebelum masuk ke proses model training, kira-kira alur pemrosesan datanya akan seperti ini:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1542" height="316" src="https://i2.wp.com/structilmy.com/wp-content/uploads/2020/05/objdet1.png?fit=1024%2C210&amp;ssl=1" alt="" class="wp-image-1632" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2020/05/objdet1.png?w=1542&amp;ssl=1 1542w, https://i0.wp.com/structilmy.com/wp-content/uploads/2020/05/objdet1.png?resize=300%2C61&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2020/05/objdet1.png?resize=1024%2C210&amp;ssl=1 1024w, https://i0.wp.com/structilmy.com/wp-content/uploads/2020/05/objdet1.png?resize=768%2C157&amp;ssl=1 768w, https://i0.wp.com/structilmy.com/wp-content/uploads/2020/05/objdet1.png?resize=1536%2C315&amp;ssl=1 1536w" sizes="auto, (max-width: 1090px) 100vw, 1090px" /></figure>



<ol class="wp-block-list"><li>Jadi setelah punya gambar beserta anotasi XML untuk setiap gambar, langkah pertama adalah kita perlu convert dulu ke CSV. File CSV ini hanya terdiri dari 1 file yang &#8220;merangkum&#8221; semua file xml yang kita punya</li><li>Dari file CSV tersebut lalu kita convert ke <strong>TFRecord </strong>file, suatu objek yang dapat dibaca oleh tensorflow dengan mudah. </li><li>File TFRecord ini yang nantinya akan digunakan untuk proses pelatihan.</li></ol>



<p class="wp-block-paragraph">Perlu diperhatikan, untuk memudahkan <strong>semisal perlu ada pembagian data train, data validation, dan data test, proses pemisahan ini dilakukan sebelum konvert ke CSV</strong> ya, jadi ilustrasi di atas hanya untuk salah satu set, data train misalnya.</p>



<span id="more-1555"></span>



<h2 class="wp-block-heading">1. Struktur Folder Penyimpanan</h2>



<p class="wp-block-paragraph">Sebelum mulai, kita samakan dulu struktur folder penyimpanannya. Berikut struktur folder yang biasa saya gunakan:</p>



<ul class="wp-block-list"><li>DATASET<ul><li>train<ul><li>image1.jpg</li><li>image1.xml</li><li>image2.jpg</li><li>image2.xml</li><li>&#8230;</li></ul></li><li>test<ul><li>image102.jpg</li><li>image102.xml</li><li>&#8230;</li></ul></li></ul><ul><li>validation<ul><li>&#8230;</li></ul></li></ul></li></ul>



<p class="wp-block-paragraph">Jadi kita punya folder &#8220;DATASET&#8221; lalu di dalamnya ada 3 buah subfolder, train, test, dan validation. Masing-masing folder tersebut berisikan image dan file xml nya. Di sini file image bisa jadi terdiri dari beberapa kelas (seperti contoh gambar di atas artikel ini). <strong>Image dengan nama yang berbeda harus merujuk ke citra yang memang berbeda</strong>.</p>



<h2 class="wp-block-heading">Source Code</h2>



<p class="wp-block-paragraph">Pada artikel ini saya menggunakan script-script yang saya modifikasi dari internet. Script-script tersebut dapat diakses di <a rel="noreferrer noopener" href="https://github.com/rianrajagede/object-detection" target="_blank">https://github.com/rianrajagede/object-detection</a>. Ada 2 cara penggunaan script tersebut:</p>



<ol class="wp-block-list"><li>Kita run di komputer kita dengan menjalankan perintah <code>python namascript.py</code> di folder yang sesuai</li><li>Atay jika ingin menggunakan script-script tersebut di Google Colab, silakan upload script tersebut di drive lalu jalankan perintah-perintah di bawah nanti dengan tambahan tanda seru: <code>!python path/ke/file.py ...</code> di notebook Google Colab.</li></ol>



<h2 class="wp-block-heading" id="membuat-file-csv">2. Membuat file CSV</h2>



<p class="wp-block-paragraph">Setelah folder telah siap, proses selanjutnya adalah membuat sebuah <strong>file csv untuk setiap subfolder</strong>. Sebenarnya proses ini tidak wajib, tapi mengulik data dalam format xml yang terpisah-pisah menurut saya jauh lebih sulit.</p>



<p class="wp-block-paragraph">Silakan gunakan script yang telah saya sedikit modifikasi dari internet, <code>xml_to_csv.py</code>. Copy script tersebut ke dalam folder DATASET. Setelah itu jalankan script tersebut 3x dengan perintah berikut:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">python xml_to_csv.py --type train
python xml_to_csv.py --type test
python xml_to_csv.py --type validation</pre>



<p class="wp-block-paragraph">Setelah program tersebut dijalankan nanti akan didapat 3 buah file: <code>train_labels.csv</code>, <code>test_labels.csv</code>,  dan <code>validation_labels.csv</code>. Masing-masing file menyimpan &#8220;ringkasan&#8221; data untuk masing-masing subfolder.</p>



<h2 class="wp-block-heading">2.5 Membuat file Label Map</h2>



<p class="wp-block-paragraph">Sebelum membuat file TFrecord kita perlu membuat dulu file labelmap. File labelmap berisi daftar keseluruhan label yang ada pada dataset. Untuk data dengan jumlah label yang sedikit, membuat labelmap tidak lah sulit secara manual, formatnya kira-kira seperti ini:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">item{
    id: 1
    name: 'KUDA'
}
item{
    id: 2
    name: 'MOBIL'
}
...</pre>



<p class="wp-block-paragraph">Tapi karena di beberapa proyek, label objek pada dataset cukup banyak, maka saya sudah buatkan script yang meng-generate secara otomatis, <code>generate_labelmap.py</code>. Copy script tersebut ke dalam folder DATASET, lalu jalankan <code>generate_labelmap.py</code> dengan perintah di bawah. Perlu diperhatikan, ketika perintah ini dijalankan pastikan sudah tersedia <code>train_labels.csv</code> dan pastikan juga semua label ada di data train.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">python generate_labelmap.py</pre>



<p class="wp-block-paragraph">Setelah dijalankan maka akan diperoleh <code>label_map.pbtxt</code> yang berisikan daftar semua label yang ada di data train.</p>



<h2 class="wp-block-heading">Membuat file tfrecord</h2>



<p class="wp-block-paragraph">Langkah terakhir yang perlu dilakukan adalah membuat file tfrecord. File ini adalah objek penyimpanan data yang didesain oleh tensorflow untuk kemudahan pengaksesan data di tensorflow. Jalankan file <code>generate_tfrecord_v2.py</code> dengan perintah di bawah (maksud dari <code>v2</code> adalah script ini untuk tensorflow versi 2):</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">python generate_tfrecord_v2.py --csv_input train_labels.csv --image_dir train --labelmap_dir label_map.pbtxt --output_path train.record</pre>



<p class="wp-block-paragraph">Perintah di atas akan mengkombinasikan <code>train_labels.csv</code>, <code>label_map.pbtxt</code> dan image pada folder train menjadi sebuah file <code>train.record</code> yang sudah dapat digunakan untuk proses pelaithan dengan tensorflow. Untuk data yang besar, proses ini bisa memakan waktu paling lama komputasinya. </p>



<p class="wp-block-paragraph">Lakukan langkah-langkah di atas ke data test dan validation dengan mengubah beberapa parameter pentingnya (nama file, path, dsb).</p>



<p class="wp-block-paragraph">Setelah mendapatkan ketiga file .record maka langkah selanjutnya adalah proses pelatihan model! InsyaAllah akan kami bahas di artikel selanjutnya. Semoga bermanfaat!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://structilmy.com/blog/2020/06/10/object-detection-dengan-tensorflow-dan-google-colab-1/feed/</wfw:commentRss>
			<slash:comments>16</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1555</post-id>	</item>
		<item>
		<title>Convolutional Neural Network (CNN) menggunakan PyTorch</title>
		<link>https://structilmy.com/blog/2019/07/17/convolutional-neural-network-cnn-menggunakan-pytorch/</link>
					<comments>https://structilmy.com/blog/2019/07/17/convolutional-neural-network-cnn-menggunakan-pytorch/#comments</comments>
		
		<dc:creator><![CDATA[Rian Adam]]></dc:creator>
		<pubDate>Tue, 16 Jul 2019 20:46:25 +0000</pubDate>
				<category><![CDATA[Computer Vision]]></category>
		<category><![CDATA[Deep Learning]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[convolutional-neural-network]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[pytorch]]></category>
		<guid isPermaLink="false">http://structilmy.com/?p=1174</guid>

					<description><![CDATA[Artikel ini akan langsung berfokus pada implementasi Convolutional Neural Network (CNN) menggunakan PyTorch untuk Image Classification. Bagi yang ingin memperdalam teori dibalik CNN terlebih dahulu bisa baca pada link artikel sebelumnya yang berisi kumpulan sumber belajar CNN dan jika ingin memperdalam PyTorch, juga bisa baca artikel sebelumnya tentang PyTorch. Jika teman-teman ada yang ingin mengimplementasi [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Artikel ini akan langsung berfokus pada implementasi Convolutional Neural Network (CNN) menggunakan <a href="http://pytorch.org/" target="_blank" rel="noreferrer noopener">PyTorch</a> untuk Image Classification. Bagi yang ingin memperdalam teori dibalik CNN terlebih dahulu bisa baca pada link artikel <a aria-label="sebelumnya yang berisi kumpulan sumber belajar CNN (opens in a new tab)" href="https://structilmy.com/2018/12/how-do-i-learn-neural-network-and-deep-learning/" target="_blank" rel="noreferrer noopener">sebelumnya yang berisi kumpulan sumber belajar CNN</a> dan jika ingin memperdalam PyTorch, juga bisa <a aria-label="baca artikel sebelumnya tentang PyTorch (opens in a new tab)" href="https://structilmy.com/2019/07/tutorial-dasar-pytorch-tensor-dan-autograd/" target="_blank" rel="noreferrer noopener">baca artikel sebelumnya tentang PyTorch</a>. Jika teman-teman ada yang ingin mengimplementasi menggunakan Tensorflow, silakan <a href="https://structilmy.com/2021/01/image-classification-dengan-cnn-dan-tensorflow/">baca artikel ini</a>.</p>



<h2 class="wp-block-heading">Dataset</h2>



<p class="wp-block-paragraph">Kita akan menggunakan Convolutional Neural Network untuk mengklasifikasi citra barang-barang yang ada di sebuah toko (Freiburg Groceries Dataset). Dataset dan code bisa didownload di <a rel="noreferrer noopener" aria-label="repository berikut (opens in a new tab)" href="https://github.com/rianrajagede/groceries_classification" target="_blank">repository berikut</a>. </p>



<p class="wp-block-paragraph">Dataset yang digunakan jumlahnya akan lebih sedikit dari dataset asli agar mempercepat proses pelatihan. Dataset pada repo yang kita gunakan hanya terdiri dari 5 kelas, yakni citra produk Susu (MILK), Air mineral (WATER), soda (SODA), jus (JUICE), dan cuka (VINEGAR), dengan sekitar 900-an gambar untuk pelatihan dan 120 gambar untuk pengujian. Semua citra berukuran sama, yakni 256&#215;256 pixel.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img data-recalc-dims="1" loading="lazy" decoding="async" width="256" height="256" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2019/07/MILK0152.png?resize=256%2C256&#038;ssl=1" alt="Convolutional Neural Network Data" class="wp-image-1185" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2019/07/MILK0152.png?w=256&amp;ssl=1 256w, https://i0.wp.com/structilmy.com/wp-content/uploads/2019/07/MILK0152.png?resize=150%2C150&amp;ssl=1 150w" sizes="auto, (max-width: 256px) 100vw, 256px" /><figcaption>salah satu citra dengan kelas &#8220;MILK&#8221;</figcaption></figure>
</div>


<p class="wp-block-paragraph">Kita akan menggunakan dataset yang ada pada folder &#8220;train&#8221; untuk pelatihan dan yang ada pada folder &#8220;test&#8221; untuk pengujian. Pada tutorial ini kita masih belum menggunakan teknik validasi seperti menggunakan data validasi atau cross-validation.</p>



<h2 class="wp-block-heading">Pengolahan Dataset di PyTorch</h2>



<p class="wp-block-paragraph">Untuk pengolahan citra ada dua package dari python yang bisa kita gunakan, yakni `torchvision.datasets` dan `torchvision.transforms`</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">from torchvision import transforms, datasets</pre>



<span id="more-1174"></span>



<h4 class="wp-block-heading">Datasets dan Transforms</h4>



<p class="wp-block-paragraph">Kita gunakan `datasets` untuk memudahkan proses pembacaan data. Dengan struktur folder seperti yang ada di repo (terkelompok untuk setiap kelas) maka dengan datasets kita bisa menyimpan data beserta label dengan mudah. Sedangkan `transforms` kita gunakan untuk pengolahan awal dataset. </p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">train_dir = "train/"
test_dir = "test/"

train_transform = transforms.Compose([
    transforms.CenterCrop(150),
    transforms.RandomRotation(5), 
    transforms.RandomHorizontalFlip(),
    transforms.ToTensor(),
    transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
])
test_transform = transforms.Compose([
    transforms.CenterCrop(150),
    transforms.ToTensor(),
    transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
])

train_img = datasets.ImageFolder(train_dir, transform=train_transform)
test_img = datasets.ImageFolder(test_dir, transform=test_transform)</pre>



<p class="wp-block-paragraph">Pada contoh di atas, saya baca dataset pada folder train dan test menggunakan `datasets.ImageFolder()` lalu masing-masingnya kita beri pengolahan yang telah saya definisikan. Misalnya pada data train, pengolahan yang saya lakukan menggunakan `train_transform`:</p>



<ol class="wp-block-list"><li>crop citra menjadi ukuran 150&#215;150</li><li>lalu secara random beberapa data saya rotasi 5 derajat</li><li>beberapa data juga secara random saya cerminkan secara horizontal</li><li>saya ubah citra menjadi tensor 3D (3 x 150 x 150)</li><li>saya normalisasi masing-masing channel sehingga rata-rata dan standar deviasinya bernilai 0.5</li></ol>



<p class="wp-block-paragraph">Setelah terbaca menggunakan `datasets` maka citra-citra kita akan ter-load sebagai objek `torch.datasets` yang mirip dengan list of tuple. Setiap tuple bagian pertama adalah tensor citra, dan bagian kedua adalah label citra tersebut.</p>



<p class="wp-block-paragraph">Kita bisa print informasi dari dataset kita dengan perintah berikut:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">print("train_img type   :",type(train_img)) # objek datasets
print("train_img length :",len(train_img)) # 940 data train
print("test_img length :",len(test_img)) # 120 data test
print("train_img classes:",train_img.classes) # nama kelas
print("train_img[0] type:",type(train_img[0])) # tuple
print("train_img[0][0] s:",train_img[0][0].size()) # tensor citra
print("train_img[0][1]  :",train_img[0][1]) # label</pre>



<p class="wp-block-paragraph">Objek datasets tersebut, kita ubah bentuknya menjadi `DataLoader` yang akan memudahkan proses batch ketika pelatihan nantinya.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">trainloaders = torch.utils.data.DataLoader(train_img, batch_size=64, shuffle=True)
testloaders = torch.utils.data.DataLoader(test_img, batch_size=32, shuffle=True)</pre>



<h2 class="wp-block-heading">Implementasi Convolutional Neural Network</h2>



<p class="wp-block-paragraph">Ada 3 bagian utama dalam implementasi CNN menggunakan PyTorch:</p>



<ol class="wp-block-list"><li>Class Model / Arsitektur CNN</li><li>Alur pelatihan</li><li>Alur pengujian</li></ol>



<h4 class="wp-block-heading">Arsitektur CNN (Teori)</h4>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" src="https://i2.wp.com/structilmy.com/wp-content/uploads/2020/03/cnn1.png?fit=1024%2C328&amp;ssl=1" alt="" class="wp-image-1526" width="582" height="185" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2020/03/cnn1.png?w=1103&amp;ssl=1 1103w, https://i0.wp.com/structilmy.com/wp-content/uploads/2020/03/cnn1.png?resize=300%2C96&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2020/03/cnn1.png?resize=1024%2C328&amp;ssl=1 1024w, https://i0.wp.com/structilmy.com/wp-content/uploads/2020/03/cnn1.png?resize=768%2C246&amp;ssl=1 768w" sizes="auto, (max-width: 582px) 100vw, 582px" /><figcaption>Ilustrasi CNN untuk klasifikasi citra ke 3 kelas (hanya contoh, berbeda dengan arsitektur yang akan digunakan pada artikel ini)</figcaption></figure>
</div>


<p class="wp-block-paragraph">Pada tutorial ini, kita akan menggunakan model CNN dengan dua convolutional layer dan sebuah fully connected layer. Dengan detail parameter setiap layer sebagai berikut:</p>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="677" height="550" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2020/06/convdiagram-2.png?resize=677%2C550&#038;ssl=1" alt="" class="wp-image-1670" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2020/06/convdiagram-2.png?w=677&amp;ssl=1 677w, https://i0.wp.com/structilmy.com/wp-content/uploads/2020/06/convdiagram-2.png?resize=300%2C244&amp;ssl=1 300w" sizes="auto, (max-width: 677px) 100vw, 677px" /><figcaption><em>W = window size, S = stride, P = padding, FM = feature map, N = jumlah neuron</em></figcaption></figure>



<p class="wp-block-paragraph">Pada proses konvolusi atau pooling, parameter window size, pooling size, stride, dan padding akan menentukan perubahan ukuran data setelahnya.  Ukuran data setelah proses konvolusi atau pooling  dapat dihitung dengan menggunakan rumus berikut:</p>



<p class="wp-block-paragraph">$$ UkuranAkhir  =\frac{UkuranAwal &#8211; W + 2P}{S} + 1 $$</p>



<p class="wp-block-paragraph">Rumus tersebut dihitung untuk setiap sisi citra. Sebagai contoh di atas, citra memiliki ukuran panjang x lebar (150 x 150). Pada layer Conv1 ukuran awal sisi panjang citra adalah 150. Dikarenakan nilai sisi panjang W = 3, lalu nilai  P = 0, dan S = 1, diperoleh sisi panjang citra setelah proses adalah 148. Karena citra input memiliki sisi lebar yang sama, yakni 150, maka sisi lebar citra dihitung dengan cara dan diperoleh Conv1 adalah 148. Sehingga diperoleh hasil proses konvolusi berukuran 148 x 148 x 32 (dari 32 feature maps). Proses ini juga dilakukan di layer Pool1, Conv2, dan Pool2 dengan UkuranAwal adalah UkuranAkhir dari layer sebelumnya.</p>



<h4 class="wp-block-heading">Arsitektur CNN (Praktik)</h4>



<p class="wp-block-paragraph">Pembuatan model pada PyTorch dilakukan dengan menyusun urutan layer dan perhitungan yang akan terjadi. Model yang digunakan biasanya dalam bentuk Class dengan sebuah fungsi `forward(x)` untuk menghitung proses forward propagation</p>



<p class="wp-block-paragraph">Sebelum mendefinsikan model beberapa library perlu yang diimport untuk pembentukan model, yakni:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import torch
import torch.nn as nn
import torch.nn.functional as F</pre>



<p class="wp-block-paragraph">Lalu untuk membuat modelnya kita buat dengan mendefinisikan class berikut:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class Net(nn.Module):
   
    def __init__(self):
        super(Net, self).__init__()

        self.conv1 = nn.Conv2d(3, 16, kernel_size=4, stride=1, padding=0)
        self.pool = nn.MaxPool2d(kernel_size=3, stride=2, padding=0)
        self.conv2 = nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=0)
        self.fc1 = nn.Linear(39200, 512)
        self.fc2 = nn.Linear(512, 5)
        self.do = nn.Dropout()
    
    def forward(self, x):
        ## Define forward behavior
        x = self.pool(F.relu(self.conv1(x))) # (A)
        x = self.pool(F.relu(self.conv2(x))) # (B)
        x = x.reshape(x.shape[0], -1) # (C)
        x = self.do(F.relu(self.fc1(x))) # (D)
        x = self.fc2(x) # (E)
        return x</pre>



<p class="wp-block-paragraph">Bisa dilihat pada class tersebut, terdapat dua komponen utama. Pada bagian `__init__` kita mendefinisikan layer-layer yang akan digunakan. Sedangkan pada bagian `forward` kita definisikan bagaimana struktur dan alur forward propagation neural networknya dengan input suatu data `x`.</p>



<p class="wp-block-paragraph">Jadi keliatan, pada bagian (A) awalnya `x` masuk layer `conv1`, lalu kena fungsi aktivasi ReLU, lalu pooling. Lalu dilanjut juga pada bagian (B) juga sama. Pada bagian (C) dilakukan proses flattening atau perataan input yang berbentuk array multi dimensi menjadi satu dimentsi. Pada bagian (D) model masuk ke hidden layer dan bagian (E) adalah output layer</p>



<p class="wp-block-paragraph">Setelah class tersebut jadi, untuk membuat model kita cukup membuat sebuah objek baru dari class tersebut</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">model = Net()</pre>



<h4 class="wp-block-heading">Alur Pelatihan</h4>



<p class="wp-block-paragraph">Kita mulai dengan definisikan terlebih dahulu algoritma dan parameter pelatihan:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">criterion = nn.CrossEntropyLoss() # loss function
optimizer = torch.optim.Adam(model.parameters()) # algoritma backprop
epoch = 20 # iterasi pelatihan</pre>



<p class="wp-block-paragraph">Karena kita akan menggunakan GPU, maka jangan lupa juga pindahkan model kita ke GPU dengan cara berikut:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">model = model.to("cuda")</pre>



<p class="wp-block-paragraph">Mengikuti stylenya Alfredo Canziani, profesor di NYU, untuk implementasi pelatihan di PyTorch ada<a href="https://www.youtube.com/watch?v=OMDn66kM9Qc&amp;t=532s" target="_blank" rel="noreferrer noopener"> 5 langkah besar pada prosesnya</a>:</p>



<ol class="wp-block-list"><li>Forward Propagation</li><li>Hitung error</li><li>Bersihkan gradient</li><li>Backpropagation error / Menghitung gradient</li><li>Update bobot </li></ol>



<p class="wp-block-paragraph">Kelima langkah tersebut diimplemetnasikan menggunakan kode di bawah. Dapat diperhatikan ada dua iterasi besar yang terjadi, iterasi pertama untuk banyak epoch sedangkan iterasi kedua menunjukkan berapa kali terjadinya backpropagation yang dilakukan setiap mini-batch dari data training (`trainloaders`).</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">model.train()
for i in range(epoch):
    total_loss = 0
    total_sample = 0
    total_correct = 0

    for image, label in trainloaders: # data tiap batch (64 citra)
        # image adalah tensor berukuran 64 x 3 x 150 x 150
        # label adalah tensor berukuran 64 x 1

        image = image.to('cuda') # pindahkan image ke GPU
        label = label.to('cuda') # pindahkan label ke GPU

        out = model(image) # LANGKAH 1: forward propagation
        loss = criterion(out, label) # LANGKAH 2: hitung error
        optimizer.zero_grad() # LANGKAH 3: bersihkan nilai gradient sisa komputasi
        loss.backward() # LANGKAH 4: backpropagation
        optimizer.step() # LANGKAH 5: update bobot berdasar algoritma optimizer

        total_loss += loss.item() # untuk merata2 eror
        total_sample += len(label) # untuk merata2 eror dan akurasi
        total_correct += torch.sum(torch.max(out,1)[1]==label).item()*1.0 # untuk merata2 eror akurasi

    print("epoch", i, total_loss/total_sample, total_correct/total_sample) # menampilkan rata2 eror dan akurasi tiap epoch</pre>



<p class="wp-block-paragraph">Jika tidak terjadi masalah maka akan tampak nilai rata-rata eror akan terus menurun dan rata-rata akurasi akan terus meningkat. Saya melakukan pelatihan di laptop saya ASUS A455L dengan GPU Nvidia 920m, lama pelatihan untuk 20 iterasi tidak sampai setengah jam.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">epoch 0 0.03158918555746687 0.30638297872340425
epoch 1 0.021654276264474748 0.39787234042553193
epoch 2 0.01974692699757028 0.46702127659574466
...
epoch 18 0.004239923189929191 0.8978723404255319
epoch 19 0.0036402822967539442 0.9287234042553192</pre>



<h4 class="wp-block-heading">Alur Pengujian</h4>



<p class="wp-block-paragraph">Setelah model selesai dilatih, maka kita akan uji dengan data test. Data test yang belum kita gunakan ini saya pilih secara acak dari masing-masing kelas dan tidak ada di data train.</p>



<p class="wp-block-paragraph">Proses pengujian tidak beda banyak dengan pelatihan, kita cukup memastikan tidak terjadi backpropagation ataupun update bobot pada saat pengujian. Hal ini dilakukan dengan mengubah status model menjadi `eval()` dan menghapus bagian backprop.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">model.eval()
total_loss = 0
total_sample = 0    
total_correct = 0

for image, label in testloaders:
    image = image.to("cuda")
    label = label.to("cuda")
    
    out = model(image)
    loss = criterion(out, label)

    total_loss += loss.item()
    total_sample += len(label)
    total_correct += torch.sum(torch.max(out, 1)[1] == label).item()*1.0

print("test loss", total_loss/total_sample)
print("test accuracy", total_correct/total_sample)</pre>



<p class="wp-block-paragraph">Jika kode di atas dijalankan akan menampilkan akurasi model kita. Di laptop saya akurasi yang muncul adalah sekitar 70%. Akurasi ini sudah lebih &#8220;cerdas&#8221; daripada sekadar menebak kelas secara random. Akurasi ini sudah cukup bagus menurut saya mengingat data yang cukup sulit dan model yang sangat simpel. </p>



<p class="wp-block-paragraph">Apakah akurasi ini masih bisa ditingkatkan? insyaAllah.. silakan coba ganti-ganti arsitektur dan parameter untuk mendapatkan akurasi yang lebih baik (disebut Tuning Parameter). Misalnya dengan mengubah algoritma, jumlah neuron, atau banyak epoch. Beberapa eksperimen harus dilakukan untuk menjadikan akurasi kita benar-benar baik dan valid.</p>



<p class="wp-block-paragraph">Kita akan coba meningkatkan akurasi model kita dengan beberapa teknik di artikel selanjutnya <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p class="wp-block-paragraph"><sub>Featured image: Photo by <a href="https://unsplash.com/@birminghammuseumstrust?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Birmingham Museums Trust</a> on <a href="https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></sub></p>
]]></content:encoded>
					
					<wfw:commentRss>https://structilmy.com/blog/2019/07/17/convolutional-neural-network-cnn-menggunakan-pytorch/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1174</post-id>	</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Object Caching 0/196 objects using Memcache
Page Caching using Disk: Enhanced 
Database Caching using Redis

Served from: structilmy.com @ 2026-10-27 16:33:20 by W3 Total Cache
-->